52 return dwarf::DW_TAG_skeleton_unit;
54 return dwarf::DW_TAG_compile_unit;
76 bool UseAddrOffsetFormOrExpressions =
80 if (Label->isInSection() && UseAddrOffsetFormOrExpressions)
87 : dwarf::DW_FORM_GNU_addr_index,
95 "Addr+offset expressions are only valuable when using debug_addr (to "
96 "reduce relocations) available in DWARFv5 or higher");
124 return Asm->
OutStreamer->emitDwarfFileDirective(0,
"",
"", std::nullopt,
127 if (LastFile != File) {
131 File->getSource(), CUID);
147 auto *CB = GVContext ? dyn_cast<DICommonBlock>(GVContext) :
nullptr;
156 assert(SDMDecl->isStaticMember() &&
"Expected static member decl");
160 addDIEEntry(*VariableDIE, dwarf::DW_AT_specification, *VariableSpecDIE);
163 if (GTy != SDMDecl->getBaseType())
169 if (!DisplayName.
empty())
176 addFlag(*VariableDIE, dwarf::DW_AT_external);
183 addFlag(*VariableDIE, dwarf::DW_AT_declaration);
190 addUInt(*VariableDIE, dwarf::DW_AT_alignment, dwarf::DW_FORM_udata,
204 bool addToAccelTable =
false;
206 std::optional<unsigned> NVPTXAddressSpace;
207 std::unique_ptr<DIEDwarfExpression> DwarfExpr;
208 for (
const auto &GE : GlobalExprs) {
217 addToAccelTable =
true;
240 addToAccelTable =
true;
242 DwarfExpr = std::make_unique<DIEDwarfExpression>(*
Asm, *
this, *Loc);
252 unsigned LocalNVPTXAddressSpace;
258 NVPTXAddressSpace = LocalNVPTXAddressSpace;
261 DwarfExpr->addFragmentOffset(Expr);
268 auto GetPointerSizedFormAndOp = [
this]() {
270 assert((PointerSize == 4 || PointerSize == 8) &&
271 "Add support for other sizes if necessary");
276 return PointerSize == 4
277 ? FormAndOp{dwarf::DW_FORM_data4, dwarf::DW_OP_const4u}
278 : FormAndOp{dwarf::DW_FORM_data8, dwarf::DW_OP_const8u};
280 if (
Global->isThreadLocal()) {
287 addWasmRelocBaseGlobal(Loc,
"__tls_base", 1);
289 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
296 auto FormAndOp = GetPointerSizedFormAndOp();
298 addUInt(*Loc, dwarf::DW_FORM_data1, FormAndOp.Op);
304 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_const_index);
305 addUInt(*Loc, dwarf::DW_FORM_udata,
309 addUInt(*Loc, dwarf::DW_FORM_data1,
311 : dwarf::DW_OP_form_tls_address);
318 addWasmRelocBaseGlobal(Loc,
"__memory_base", 1);
320 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
326 auto FormAndOp = GetPointerSizedFormAndOp();
328 addUInt(*Loc, dwarf::DW_FORM_data1, FormAndOp.Op);
335 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + BaseReg);
337 addSInt(*Loc, dwarf::DW_FORM_sdata, 0);
339 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
349 if (DwarfExpr->isUnknownLocation())
350 DwarfExpr->setMemoryLocationKind();
351 DwarfExpr->addExpression(Expr);
358 const unsigned NVPTX_ADDR_global_space = 5;
359 addUInt(*VariableDIE, dwarf::DW_AT_address_class, dwarf::DW_FORM_data1,
360 NVPTXAddressSpace.value_or(NVPTX_ADDR_global_space));
363 addBlock(*VariableDIE, dwarf::DW_AT_location, DwarfExpr->finalize());
368 if (addToAccelTable) {
400 bool SameAsPrevCU =
this == PrevCU;
406 if (CURanges.empty() || !SameAsPrevCU ||
407 (&CURanges.back().End->getSection() !=
408 &Range.End->getSection())) {
412 CURanges.push_back(Range);
416 CURanges.back().End = Range.End;
448 assert(Begin &&
"Begin label should not be null!");
449 assert(End &&
"End label should not be null!");
451 assert(End->isDefined() &&
"Invalid end label");
472void DwarfCompileUnit::addWasmRelocBaseGlobal(
DIELoc *Loc,
StringRef GlobalName,
476 const unsigned TI_GLOBAL_RELOC = 3;
487 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_WASM_location);
488 addSInt(*Loc, dwarf::DW_FORM_sdata, TI_GLOBAL_RELOC);
490 addLabel(*Loc, dwarf::DW_FORM_data4, Sym);
498 addUInt(*Loc, dwarf::DW_FORM_data4, GlobalIndex);
508 BB_List.
push_back({R.second.BeginLabel, R.second.EndLabel});
515 addFlag(*SPDie, dwarf::DW_AT_APPLE_omit_frame_ptr);
522 switch (FrameBase.
Kind) {
526 addAddress(*SPDie, dwarf::DW_AT_frame_base, Location);
532 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_call_frame_cfa);
533 addBlock(*SPDie, dwarf::DW_AT_frame_base, Loc);
538 const unsigned TI_GLOBAL_RELOC = 3;
544 addWasmRelocBaseGlobal(Loc,
"__stack_pointer",
546 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_stack_value);
547 addBlock(*SPDie, dwarf::DW_AT_frame_base, Loc);
571 DIE &ParentScopeDIE) {
572 if (!Scope || !Scope->getScopeNode())
575 auto *DS = Scope->getScopeNode();
577 assert((Scope->getInlinedAt() || !isa<DISubprogram>(DS)) &&
578 "Only handle inlined subprograms here, use "
579 "constructSubprogramScopeDIE for non-inlined "
583 if (Scope->getParent() && isa<DISubprogram>(DS)) {
585 assert(ScopeDIE &&
"Scope DIE should not be null.");
596 assert(ScopeDIE &&
"Scope DIE should not be null.");
605 HasRangeLists =
true;
610 ->
addRange(*(Skeleton ? Skeleton :
this), std::move(Range));
613 auto &
List = *IndexAndList.second;
621 addUInt(ScopeDIE, dwarf::DW_AT_ranges, dwarf::DW_FORM_rnglistx,
Index);
639 (Ranges.size() == 1 &&
642 Ranges.front().Begin))) {
653 List.reserve(Ranges.size());
658 const auto *BeginMBB = R.first->getParent();
659 const auto *EndMBB = R.second->getParent();
661 const auto *
MBB = BeginMBB;
673 : MBBSectionRange.BeginLabel,
685 DIE &ParentScopeDIE) {
686 assert(Scope->getScopeNode());
687 auto *DS = Scope->getScopeNode();
691 DIE *OriginDIE = getAbstractSPDies()[InlinedSP];
692 assert(OriginDIE &&
"Unable to find original DIE for an inlined subprogram.");
696 addDIEEntry(*ScopeDIE, dwarf::DW_AT_abstract_origin, *OriginDIE);
702 addUInt(*ScopeDIE, dwarf::DW_AT_call_file, std::nullopt,
704 addUInt(*ScopeDIE, dwarf::DW_AT_call_line, std::nullopt, IA->getLine());
706 addUInt(*ScopeDIE, dwarf::DW_AT_call_column, std::nullopt, IA->getColumn());
708 addUInt(*ScopeDIE, dwarf::DW_AT_GNU_discriminator, std::nullopt,
709 IA->getDiscriminator());
725 if (Scope->isAbstractScope())
735 auto D = constructVariableDIEImpl(DV, Abstract);
744 DL.setDIE(*LabelDie);
746 if (Scope.isAbstractScope())
752DIE *DwarfCompileUnit::constructVariableDIEImpl(
const DbgVariable &DV,
770 addUInt(*VariableDie, dwarf::DW_AT_LLVM_tag_offset, dwarf::DW_FORM_data1,
777 if (!DVal->isVariadic()) {
779 if (Entry->isLocation()) {
781 }
else if (Entry->isInt()) {
783 if (Expr && Expr->getNumElements()) {
787 DwarfExpr.addFragmentOffset(Expr);
788 DwarfExpr.addUnsignedConstant(Entry->getInt());
789 DwarfExpr.addExpression(Expr);
790 addBlock(*VariableDie, dwarf::DW_AT_location, DwarfExpr.finalize());
791 if (DwarfExpr.TagOffset)
792 addUInt(*VariableDie, dwarf::DW_AT_LLVM_tag_offset,
793 dwarf::DW_FORM_data1, *DwarfExpr.TagOffset);
796 }
else if (Entry->isConstantFP()) {
798 }
else if (Entry->isConstantInt()) {
800 }
else if (Entry->isTargetIndexLocation()) {
806 addBlock(*VariableDie, dwarf::DW_AT_location, DwarfExpr.finalize());
813 return Entry.isLocation() && !Entry.getLoc().getReg();
817 assert(Expr &&
"Variadic Debug Value must have an Expression.");
820 DwarfExpr.addFragmentOffset(Expr);
826 if (Entry.isLocation()) {
827 if (!DwarfExpr.addMachineRegExpression(
TRI, Cursor,
828 Entry.getLoc().getReg()))
830 }
else if (Entry.isInt()) {
832 DwarfExpr.addUnsignedConstant(Entry.getInt());
833 }
else if (Entry.isConstantFP()) {
838 APInt RawBytes = Entry.getConstantFP()->getValueAPF().bitcastToAPInt();
842 }
else if (Entry.isConstantInt()) {
843 APInt RawBytes = Entry.getConstantInt()->getValue();
847 }
else if (Entry.isTargetIndexLocation()) {
859 if (!DwarfExpr.addExpression(
862 return AddEntry(DVal->getLocEntries()[Idx], Cursor);
867 addBlock(*VariableDie, dwarf::DW_AT_location, DwarfExpr.finalize());
868 if (DwarfExpr.TagOffset)
869 addUInt(*VariableDie, dwarf::DW_AT_LLVM_tag_offset, dwarf::DW_FORM_data1,
870 *DwarfExpr.TagOffset);
879 std::optional<unsigned> NVPTXAddressSpace;
888 DwarfExpr.addFragmentOffset(Expr);
892 TRI->getOffsetOpcodes(Offset, Ops);
900 unsigned LocalNVPTXAddressSpace;
906 NVPTXAddressSpace = LocalNVPTXAddressSpace;
912 DwarfExpr.setMemoryLocationKind();
916 DwarfExpr.addMachineRegExpression(
918 DwarfExpr.addExpression(std::move(Cursor));
925 const unsigned NVPTX_ADDR_local_space = 6;
926 addUInt(*VariableDie, dwarf::DW_AT_address_class, dwarf::DW_FORM_data1,
927 NVPTXAddressSpace.value_or(NVPTX_ADDR_local_space));
929 addBlock(*VariableDie, dwarf::DW_AT_location, DwarfExpr.finalize());
930 if (DwarfExpr.TagOffset)
931 addUInt(*VariableDie, dwarf::DW_AT_LLVM_tag_offset, dwarf::DW_FORM_data1,
932 *DwarfExpr.TagOffset);
939 DIE *&ObjectPointer) {
949 auto *Array = dyn_cast<DICompositeType>(Var->
getType());
950 if (!Array || Array->getTag() != dwarf::DW_TAG_array_type)
952 if (
auto *DLVar = Array->getDataLocation())
953 Result.push_back(DLVar);
954 if (
auto *AsVar = Array->getAssociated())
955 Result.push_back(AsVar);
956 if (
auto *AlVar = Array->getAllocated())
957 Result.push_back(AlVar);
958 for (
auto *El : Array->getElements()) {
959 if (
auto *Subrange = dyn_cast<DISubrange>(El)) {
960 if (
auto Count = Subrange->getCount())
961 if (
auto *Dependency = Count.dyn_cast<
DIVariable *>())
962 Result.push_back(Dependency);
963 if (
auto LB = Subrange->getLowerBound())
964 if (
auto *Dependency = LB.dyn_cast<
DIVariable *>())
965 Result.push_back(Dependency);
966 if (
auto UB = Subrange->getUpperBound())
967 if (
auto *Dependency = UB.dyn_cast<
DIVariable *>())
968 Result.push_back(Dependency);
969 if (
auto ST = Subrange->getStride())
970 if (
auto *Dependency = ST.dyn_cast<
DIVariable *>())
971 Result.push_back(Dependency);
972 }
else if (
auto *GenericSubrange = dyn_cast<DIGenericSubrange>(El)) {
973 if (
auto Count = GenericSubrange->getCount())
974 if (
auto *Dependency = Count.dyn_cast<
DIVariable *>())
975 Result.push_back(Dependency);
976 if (
auto LB = GenericSubrange->getLowerBound())
977 if (
auto *Dependency = LB.dyn_cast<
DIVariable *>())
978 Result.push_back(Dependency);
979 if (
auto UB = GenericSubrange->getUpperBound())
980 if (
auto *Dependency = UB.dyn_cast<
DIVariable *>())
981 Result.push_back(Dependency);
982 if (
auto ST = GenericSubrange->getStride())
983 if (
auto *Dependency = ST.dyn_cast<
DIVariable *>())
984 Result.push_back(Dependency);
1004 for (
auto *Var :
reverse(Input)) {
1005 DbgVar.
insert({Var->getVariable(), Var});
1010 while (!WorkList.
empty()) {
1011 auto Item = WorkList.
back();
1013 bool visitedAllDependencies = Item.getInt();
1019 if (Visited.
count(Var))
1023 if (visitedAllDependencies) {
1025 Result.push_back(Var);
1030 auto Res = Visiting.
insert(Var);
1032 assert(
false &&
"dependency cycle in local variables");
1041 if (
const auto *Dep = dyn_cast<const DILocalVariable>(Dependency))
1055 assert(!Scope->getInlinedAt());
1056 assert(!Scope->isAbstractScope());
1060 if (
DIE *ObjectPointer =
1061 ContextCU->createAndAddScopeChildren(Scope, ScopeDIE))
1062 ContextCU->addDIEEntry(ScopeDIE, dwarf::DW_AT_object_pointer,
1072 if (FnArgs.
size() > 1 && !FnArgs[FnArgs.
size() - 1] &&
1082 DIE *ObjectPointer =
nullptr;
1086 for (
auto &DV : Vars.Args)
1096 for (
const auto *IE : ImportedEntities[Scope->getScopeNode()])
1105 auto needToEmitLexicalScope = [
this](
LexicalScope *LS) {
1106 if (isa<DISubprogram>(LS->getScopeNode()))
1109 if (!Vars.Args.empty() || !Vars.Locals.empty())
1112 !ImportedEntities[LS->getScopeNode()].
empty())
1119 if (needToEmitLexicalScope(LS))
1125 return ObjectPointer;
1130 DIE *&AbsDef = getAbstractSPDies()[Scope->getScopeNode()];
1134 auto *SP = cast<DISubprogram>(Scope->getScopeNode());
1145 else if (
auto *SPDecl = SP->getDeclaration()) {
1158 AbsDef = &ContextCU->
createAndAddDIE(dwarf::DW_TAG_subprogram, *ContextDIE,
nullptr);
1160 ContextCU->
addSInt(*AbsDef, dwarf::DW_AT_inline,
1162 : dwarf::DW_FORM_implicit_const,
1165 ContextCU->
addDIEEntry(*AbsDef, dwarf::DW_AT_object_pointer, *ObjectPointer);
1176 case dwarf::DW_TAG_call_site:
1177 return dwarf::DW_TAG_GNU_call_site;
1178 case dwarf::DW_TAG_call_site_parameter:
1179 return dwarf::DW_TAG_GNU_call_site_parameter;
1190 case dwarf::DW_AT_call_all_calls:
1191 return dwarf::DW_AT_GNU_all_call_sites;
1192 case dwarf::DW_AT_call_target:
1193 return dwarf::DW_AT_GNU_call_site_target;
1194 case dwarf::DW_AT_call_origin:
1195 return dwarf::DW_AT_abstract_origin;
1196 case dwarf::DW_AT_call_return_pc:
1197 return dwarf::DW_AT_low_pc;
1198 case dwarf::DW_AT_call_value:
1199 return dwarf::DW_AT_GNU_call_site_value;
1200 case dwarf::DW_AT_call_tail_call:
1201 return dwarf::DW_AT_GNU_tail_call;
1212 case dwarf::DW_OP_entry_value:
1213 return dwarf::DW_OP_GNU_entry_value;
1235 assert(CalleeDIE &&
"Could not create DIE for call site entry origin");
1267 assert(PCAddr &&
"Missing return PC information for a call");
1277 for (
const auto &Param : Params) {
1278 unsigned Register = Param.getRegister();
1279 auto CallSiteDieParam =
1283 addAddress(*CallSiteDieParam, dwarf::DW_AT_location,
1295 CallSiteDIE.
addChild(CallSiteDieParam);
1304 auto *Entity =
Module->getEntity();
1305 if (
auto *NS = dyn_cast<DINamespace>(Entity))
1307 else if (
auto *M = dyn_cast<DIModule>(Entity))
1309 else if (
auto *SP = dyn_cast<DISubprogram>(Entity))
1311 else if (
auto *
T = dyn_cast<DIType>(Entity))
1313 else if (
auto *GV = dyn_cast<DIGlobalVariable>(Entity))
1316 EntityDie =
getDIE(Entity);
1319 addDIEEntry(*IMDie, dwarf::DW_AT_import, *EntityDie);
1321 if (!
Name.empty()) {
1334 DINodeArray Elements =
Module->getElements();
1335 for (
const auto *Element : Elements) {
1347 if (
DIE *AbsSPDIE = getAbstractSPDies().
lookup(SP)) {
1350 addDIEEntry(*
D, dwarf::DW_AT_abstract_origin, *AbsSPDIE);
1362 auto *Die = Entity->
getDIE();
1366 if (AbsEntity && AbsEntity->
getDIE()) {
1368 Label = dyn_cast<const DbgLabel>(Entity);
1370 if (
const DbgVariable *Var = dyn_cast<const DbgVariable>(Entity))
1372 else if ((Label = dyn_cast<const DbgLabel>(Entity)))
1379 if (
const auto *Sym = Label->getSymbol())
1384 auto &AbstractEntities = getAbstractEntities();
1385 auto I = AbstractEntities.find(Node);
1386 if (
I != AbstractEntities.end())
1387 return I->second.get();
1393 assert(Scope && Scope->isAbstractScope());
1394 auto &Entity = getAbstractEntities()[Node];
1395 if (isa<const DILocalVariable>(Node)) {
1396 Entity = std::make_unique<DbgVariable>(
1397 cast<const DILocalVariable>(Node),
nullptr );;
1399 }
else if (isa<const DILabel>(Node)) {
1400 Entity = std::make_unique<DbgLabel>(
1401 cast<const DILabel>(Node),
nullptr );
1415 : dwarf::DW_UT_compile;
1444 GlobalNames[FullName] = &Die;
1456 GlobalNames.insert(std::make_pair(std::move(FullName), &
getUnitDie()));
1465 GlobalTypes[FullName] = &Die;
1477 GlobalTypes.insert(std::make_pair(std::move(FullName), &
getUnitDie()));
1485 addAddress(Die, dwarf::DW_AT_location, Location);
1493 if (Location.isIndirect())
1506 addUInt(Die, dwarf::DW_AT_LLVM_tag_offset, dwarf::DW_FORM_data1,
1537 addUInt(Die, dwarf::DW_AT_LLVM_tag_offset, dwarf::DW_FORM_data1,
1545 ? dwarf::DW_FORM_loclistx
1557 if (
uint32_t AlignInBytes = DIVar->getAlignInBytes())
1558 addUInt(VariableDie, dwarf::DW_AT_alignment, dwarf::DW_FORM_udata,
1566 addFlag(VariableDie, dwarf::DW_AT_artificial);
1574 const auto *
DILabel = Label.getLabel();
1586 auto *SPDecl = SP->getDeclaration();
1592bool DwarfCompileUnit::isDwoUnit()
const {
1610 : dwarf::DW_AT_GNU_addr_base,
1631 addUInt(Die, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1, Btr.Encoding);
1633 addUInt(Die, dwarf::DW_AT_byte_size, std::nullopt,
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
Returns the sub type a function will return at a given Idx Should correspond to the result type of an ExtractValue instruction executed with just that one unsigned Idx
static SmallVector< DbgVariable *, 8 > sortLocalVars(SmallVectorImpl< DbgVariable * > &Input)
Sort local variables so that variables appearing inside of helper expressions come first.
static SmallVector< const DIVariable *, 2 > dependencies(DbgVariable *Var)
Return all DIVariables that appear in count: expressions.
static dwarf::Tag GetCompileUnitType(UnitKind Kind, DwarfDebug *DW)
This file contains constants used for implementing Dwarf debug support.
static bool lookup(const GsymReader &GR, DataExtractor &Data, uint64_t &Offset, uint64_t BaseAddr, uint64_t Addr, SourceLocations &SrcLocs, llvm::Error &Err)
A Lookup helper functions.
unsigned const TargetRegisterInfo * TRI
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
This file defines the SmallString class.
Class for arbitrary precision integers.
uint64_t getZExtValue() const
Get zero extended value.
unsigned getBitWidth() const
Return the number of bits in the APInt.
unsigned getIndex(const MCSymbol *Sym, bool TLS=false)
Returns the index into the address pool with the given label/symbol.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
size_t size() const
size - Get the array size.
This class is intended to be used as a driving class for all asm writers.
const TargetLoweringObjectFile & getObjFileLowering() const
Return information about object file lowering.
MCSymbol * getSymbol(const GlobalValue *GV) const
TargetMachine & TM
Target machine description.
MachineFunction * MF
The current machine function.
MapVector< unsigned, MBBSectionRange > MBBSectionRanges
virtual const MCSymbol * getFunctionFrameSymbol() const
Return symbol for the function pseudo stack if the stack frame is not a register based.
MCSymbol * createTempSymbol(const Twine &Name) const
MCSymbol * GetExternalSymbolSymbol(StringRef Sym) const
Return the MCSymbol for the specified ExternalSymbol.
std::unique_ptr< MCStreamer > OutStreamer
This is the MCStreamer object for the file we are generating.
const DataLayout & getDataLayout() const
Return information about data layout.
void emitInt64(uint64_t Value) const
Emit a long long directive and value.
Basic type, like 'int' or 'float'.
unsigned getLineNo() const
StringRef getName() const
DIScope * getScope() const
DIGlobalVariable * getDecl() const
bool isDebugDirectivesOnly() const
static std::optional< DebugNameTableKind > getNameTableKind(StringRef Str)
static std::optional< DebugEmissionKind > getEmissionKind(StringRef Str)
DIEBlock - Represents a block of values.
DwarfExpression implementation for singular DW_AT_location.
Represents a pointer to a location list in the debug_loc section.
DIELoc - Represents an expression location.
A structured debug information entry.
DIE & addChild(DIE *Child)
Add a child to the DIE.
DIE & addChildFront(DIE *Child)
static DIE * get(BumpPtrAllocator &Alloc, dwarf::Tag Tag)
DIEUnit * getUnit() const
Climb up the parent chain to get the compile unit or type unit that this DIE belongs to.
const DIE * getUnitDie() const
Climb up the parent chain to get the compile unit or type unit DIE that this DIE belongs to.
Holds a DIExpression and keeps track of how many operands have been consumed so far.
element_iterator elements_end() const
bool isEntryValue() const
Check if the expression consists of exactly one entry value operand.
element_iterator elements_begin() const
uint64_t getElement(unsigned I) const
std::optional< SignedOrUnsignedConstant > isConstant() const
Determine whether this represents a constant value, if so.
static const DIExpression * extractAddressClass(const DIExpression *Expr, unsigned &AddrClass)
Checks if the last 4 elements of the expression are DW_OP_constu <DWARF Address Space> DW_OP_swap DW_...
DIDerivedType * getStaticDataMemberDeclaration() const
MDTuple * getTemplateParams() const
bool isLocalToUnit() const
StringRef getLinkageName() const
StringRef getDisplayName() const
bool isDefinition() const
DINodeArray getAnnotations() const
An imported module (C++ using directive or similar).
Tagged DWARF-like metadata node.
dwarf::Tag getTag() const
Base class for scope-like contexts.
StringRef getName() const
DIScope * getScope() const
StringRef getName() const
Base class for variables.
uint32_t getAlignInBytes() const
DIScope * getScope() const
StringRef getName() const
unsigned getPointerSize(unsigned AS=0) const
Layout pointer size in bytes, rounded up to a whole number of bytes.
This class is defined as the common parent of DbgVariable and DbgLabel such that it could levarage po...
const DINode * getEntity() const
Accessors.
This class is used to track label information.
A single location or constant within a variable location description, with either a single entry (wit...
This class is used to track local variable information.
bool hasComplexAddress() const
bool isArtificial() const
Return true if DbgVariable is artificial.
dwarf::Tag getTag() const
bool isObjectPointer() const
const DILocalVariable * getVariable() const
std::optional< uint8_t > getDebugLocListTagOffset() const
unsigned getDebugLocListIndex() const
StringRef getName() const
const DIType * getType() const
bool hasFrameIndexExprs() const
const DbgValueLoc * getValueLoc() const
const DIExpression * getSingleExpression() const
ArrayRef< FrameIndexExpr > getFrameIndexExprs() const
Get the FI entries, sorted by fragment offset.
MCSymbol * getLabelBeforeInsn(const MachineInstr *MI)
Return Label preceding the instruction.
MCSymbol * getLabelAfterInsn(const MachineInstr *MI)
Return Label immediately following the instruction.
A DeclContext is a named program scope that is used for ODR uniquing of types.
ValueT lookup(const_arg_type_t< KeyT > Val) const
lookup - Return the entry for the specified key, or a default constructed value if no such entry exis...
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
bool useGNUAnalogForDwarf5Feature() const
Whether to use the GNU analog for a DWARF5 tag, attribute, or location atom.
void constructCallSiteParmEntryDIEs(DIE &CallSiteDIE, SmallVector< DbgCallSiteParam, 4 > &Params)
Construct call site parameter DIEs for the CallSiteDIE.
void attachLowHighPC(DIE &D, const MCSymbol *Begin, const MCSymbol *End)
void emitHeader(bool UseOffsets) override
Emit the header for this unit, not including the initial length field.
dwarf::Tag getDwarf5OrGNUTag(dwarf::Tag Tag) const
This takes a DWARF 5 tag and returns it or a GNU analog.
DIE & updateSubprogramScopeDIE(const DISubprogram *SP)
Find DIE for the given subprogram and attach appropriate DW_AT_low_pc and DW_AT_high_pc attributes.
void constructAbstractSubprogramScopeDIE(LexicalScope *Scope)
bool includeMinimalInlineScopes() const
void addBaseTypeRef(DIEValueList &Die, int64_t Idx)
void addGlobalNameForTypeUnit(StringRef Name, const DIScope *Context)
Add a new global name present in a type unit to this compile unit.
void finishEntityDefinition(const DbgEntity *Entity)
DIE * constructImportedEntityDIE(const DIImportedEntity *Module)
Construct import_module DIE.
void addRange(RangeSpan Range)
addRange - Add an address range to the list of ranges for this unit.
void addAddrTableBase()
Add the DW_AT_addr_base attribute to the unit DIE.
DIE & constructCallSiteEntryDIE(DIE &ScopeDIE, const DISubprogram *CalleeSP, bool IsTail, const MCSymbol *PCAddr, const MCSymbol *CallAddr, unsigned CallReg)
Construct a call site entry DIE describing a call within Scope to a callee described by CalleeSP.
std::vector< BaseTypeRef > ExprRefedBaseTypes
DIE * constructInlinedScopeDIE(LexicalScope *Scope, DIE &ParentScopeDIE)
This scope represents an inlined body of a function.
void addComplexAddress(const DbgVariable &DV, DIE &Die, dwarf::Attribute Attribute, const MachineLocation &Location)
Start with the address based on the location provided, and generate the DWARF information necessary t...
void createBaseTypeDIEs()
void addGlobalType(const DIType *Ty, const DIE &Die, const DIScope *Context) override
Add a new global type to the compile unit.
void addScopeRangeList(DIE &ScopeDIE, SmallVector< RangeSpan, 2 > Range)
A helper function to construct a RangeSpanList for a given lexical scope.
uint64_t getDWOId() const
DIE * getOrCreateCommonBlock(const DICommonBlock *CB, ArrayRef< GlobalExpr > GlobalExprs)
void addVariableAddress(const DbgVariable &DV, DIE &Die, MachineLocation Location)
Add DW_AT_location attribute for a DbgVariable based on provided MachineLocation.
void addGlobalName(StringRef Name, const DIE &Die, const DIScope *Context) override
Add a new global name to the compile unit.
void createAbstractEntity(const DINode *Node, LexicalScope *Scope)
void applyStmtList(DIE &D)
Apply the DW_AT_stmt_list from this compile unit to the specified DIE.
DIE * constructVariableDIE(DbgVariable &DV, bool Abstract=false)
constructVariableDIE - Construct a DIE for the given DbgVariable.
void applyVariableAttributes(const DbgVariable &Var, DIE &VariableDie)
dwarf::LocationAtom getDwarf5OrGNULocationAtom(dwarf::LocationAtom Loc) const
This takes a DWARF 5 location atom and either returns it or a GNU analog.
DIE & constructSubprogramScopeDIE(const DISubprogram *Sub, LexicalScope *Scope)
Construct a DIE for this subprogram scope.
DIE * getOrCreateGlobalVariableDIE(const DIGlobalVariable *GV, ArrayRef< GlobalExpr > GlobalExprs)
Get or create global variable DIE.
void addLocationAttribute(DIE *ToDIE, const DIGlobalVariable *GV, ArrayRef< GlobalExpr > GlobalExprs)
void applySubprogramAttributesToDefinition(const DISubprogram *SP, DIE &SPDie)
DIE * createAndAddScopeChildren(LexicalScope *Scope, DIE &ScopeDIE)
DIE & updateSubprogramScopeDIEImpl(const DISubprogram *SP, DIE *SPDie)
void addExpr(DIELoc &Die, dwarf::Form Form, const MCExpr *Expr)
Add a Dwarf expression attribute data and value.
dwarf::Attribute getDwarf5OrGNUAttr(dwarf::Attribute Attr) const
This takes a DWARF 5 attribute and returns it or a GNU analog.
unsigned getUniqueID() const
void addAddress(DIE &Die, dwarf::Attribute Attribute, const MachineLocation &Location)
Add an address attribute to a die based on the location provided.
void applyLabelAttributes(const DbgLabel &Label, DIE &LabelDie)
void addLocalLabelAddress(DIE &Die, dwarf::Attribute Attribute, const MCSymbol *Label)
addLocalLabelAddress - Add a dwarf label attribute data and value using DW_FORM_addr only.
DIE * constructLexicalScopeDIE(LexicalScope *Scope)
Construct new DW_TAG_lexical_block for this scope and attach DW_AT_low_pc/DW_AT_high_pc labels.
unsigned getOrCreateSourceID(const DIFile *File) override
Look up the source ID for the given file.
void constructScopeDIE(LexicalScope *Scope, DIE &ParentScopeDIE)
DwarfCompileUnit(unsigned UID, const DICompileUnit *Node, AsmPrinter *A, DwarfDebug *DW, DwarfFile *DWU, UnitKind Kind=UnitKind::Full)
DIE * constructLabelDIE(DbgLabel &DL, const LexicalScope &Scope)
Construct a DIE for the given DbgLabel.
void addGlobalTypeUnitType(const DIType *Ty, const DIScope *Context)
Add a new global type present in a type unit to this compile unit.
DbgEntity * getExistingAbstractEntity(const DINode *Node)
bool hasDwarfPubSections() const
void addLabelAddress(DIE &Die, dwarf::Attribute Attribute, const MCSymbol *Label)
addLabelAddress - Add a dwarf label attribute data and value using either DW_FORM_addr or DW_FORM_GNU...
void addLocationList(DIE &Die, dwarf::Attribute Attribute, unsigned Index)
Add a Dwarf loclistptr attribute data and value.
DwarfCompileUnit & getCU() override
void attachRangesOrLowHighPC(DIE &D, SmallVector< RangeSpan, 2 > Ranges)
void finishSubprogramDefinition(const DISubprogram *SP)
Collects and handles dwarf debug information.
std::optional< MD5::MD5Result > getMD5AsBytes(const DIFile *File) const
If the File has an MD5 checksum, return it as an MD5Result allocated in the MCContext.
bool alwaysUseRanges() const
Returns whether range encodings should be used for single entry range lists.
bool useGNUTLSOpcode() const
Returns whether to use DW_OP_GNU_push_tls_address, instead of the standard DW_OP_form_tls_address opc...
bool useAddrOffsetForm() const
const DwarfCompileUnit * getPrevCU() const
Returns the previous CU that was being updated.
uint16_t getDwarfVersion() const
Returns the Dwarf Version.
bool useAllLinkageNames() const
Returns whether we should emit all DW_AT_[MIPS_]linkage_name.
void insertSectionLabel(const MCSymbol *S)
void addSubprogramNames(const DICompileUnit &CU, const DISubprogram *SP, DIE &Die)
dwarf::Form getDwarfSectionOffsetForm() const
Returns a suitable DWARF form to represent a section offset, i.e.
bool useAppleExtensionAttributes() const
void setPrevCU(const DwarfCompileUnit *PrevCU)
const MachineFunction * getCurrentFunction() const
void addArangeLabel(SymbolCU SCU)
Add a label so that arange data can be generated for it.
AddressPool & getAddressPool()
void addAccelNamespace(const DICompileUnit &CU, StringRef Name, const DIE &Die)
bool useSectionsAsReferences() const
Returns whether to use sections as labels rather than temp symbols.
void terminateLineTable(const DwarfCompileUnit *CU)
Terminate the line table by adding the last range label.
void addAccelName(const DICompileUnit &CU, StringRef Name, const DIE &Die)
DwarfCompileUnit * lookupCU(const DIE *Die)
Find the matching DwarfCompileUnit for the given CU DIE.
const MCSymbol * getSectionLabel(const MCSection *S)
static void emitDebugLocValue(const AsmPrinter &AP, const DIBasicType *BT, const DbgValueLoc &Value, DwarfExpression &DwarfExpr)
bool useSplitDwarf() const
Returns whether or not to change the current debug info for the split dwarf proposal support.
bool useAddrOffsetExpressions() const
bool useRangesSection() const
Returns whether ranges section should be emitted.
bool isLexicalScopeDIENull(LexicalScope *Scope)
A helper function to check whether the DIE for a given Scope is going to be null.
AccelTableKind getAccelTableKind() const
Returns what kind (if any) of accelerator tables to emit.
void setLocation(const MachineLocation &Loc, const DIExpression *DIExpr)
Set the location (Loc) and DIExpression (DIExpr) to describe.
void addFragmentOffset(const DIExpression *Expr)
If applicable, emit an empty DW_OP_piece / DW_OP_bit_piece to advance to the fragment described by Ex...
void setMemoryLocationKind()
Lock this down to become a memory location description.
std::optional< uint8_t > TagOffset
void setCallSiteParamValueFlag()
Lock this down to become a call site parameter location.
bool addMachineRegExpression(const TargetRegisterInfo &TRI, DIExpressionCursor &Expr, llvm::Register MachineReg, unsigned FragmentOffsetInBits=0)
Emit a machine register location.
void addExpression(DIExpressionCursor &&Expr)
Emit all remaining operations in the DIExpressionCursor.
void addWasmLocation(unsigned Index, uint64_t Offset)
Emit location information expressed via WebAssembly location + offset The Index is an identifier for ...
void beginEntryValueExpression(DIExpressionCursor &ExprCursor)
Begin emission of an entry value dwarf operation.
void addScopeLabel(LexicalScope *LS, DbgLabel *Label)
DenseMap< LexicalScope *, ScopeVars > & getScopeVariables()
DenseMap< LexicalScope *, LabelList > & getScopeLabels()
bool addScopeVariable(LexicalScope *LS, DbgVariable *Var)
This dwarf writer support class manages information associated with a source file.
DIE * getOrCreateTypeDIE(const MDNode *TyNode)
Find existing DIE or create new DIE for the given type.
void addAnnotation(DIE &Buffer, DINodeArray Annotations)
Add DW_TAG_LLVM_annotation.
void addBlock(DIE &Die, dwarf::Attribute Attribute, DIELoc *Loc)
Add block data.
void addTemplateParams(DIE &Buffer, DINodeArray TParams)
Add template parameters in buffer.
DIE * getOrCreateContextDIE(const DIScope *Context)
Get context owner's DIE.
void addAttribute(DIEValueList &Die, dwarf::Attribute Attribute, dwarf::Form Form, T &&Value)
void addOpAddress(DIELoc &Die, const MCSymbol *Sym)
Add a dwarf op address data and value using the form given and an op of either DW_FORM_addr or DW_FOR...
void addUInt(DIEValueList &Die, dwarf::Attribute Attribute, std::optional< dwarf::Form > Form, uint64_t Integer)
Add an unsigned integer attribute data and value.
void addString(DIE &Die, dwarf::Attribute Attribute, StringRef Str)
Add a string attribute data and value.
void addConstantValue(DIE &Die, const ConstantInt *CI, const DIType *Ty)
Add constant value entry in variable DIE.
DIE * getOrCreateNameSpace(const DINamespace *NS)
void insertDIE(const DINode *Desc, DIE *D)
Insert DIE into the map.
void addSectionDelta(DIE &Die, dwarf::Attribute Attribute, const MCSymbol *Hi, const MCSymbol *Lo)
addSectionDelta - Add a label delta attribute data and value.
const DICompileUnit * CUNode
MDNode for the compile unit.
DIE * getDIE(const DINode *D) const
Returns the DIE map slot for the specified debug variable.
void addSInt(DIEValueList &Die, dwarf::Attribute Attribute, std::optional< dwarf::Form > Form, int64_t Integer)
Add an signed integer attribute data and value.
void addLabelDelta(DIEValueList &Die, dwarf::Attribute Attribute, const MCSymbol *Hi, const MCSymbol *Lo)
Add a label delta attribute data and value.
void addLinkageName(DIE &Die, StringRef LinkageName)
Add a linkage name, if it isn't empty.
std::string getParentContextString(const DIScope *Context) const
Get string containing language specific context for a global name.
void addSourceLine(DIE &Die, unsigned Line, const DIFile *File)
Add location information to specified debug information entry.
void emitCommonHeader(bool UseOffsets, dwarf::UnitType UT)
Emit the common part of the header for this unit.
BumpPtrAllocator DIEValueAllocator
DIE * getOrCreateModule(const DIModule *M)
const DICompileUnit * getCUNode() const
DIE & createAndAddDIE(dwarf::Tag Tag, DIE &Parent, const DINode *N=nullptr)
Create a DIE with the given Tag, add the DIE to its parent, and call insertDIE if MD is not null.
DIE * getOrCreateStaticMemberDIE(const DIDerivedType *DT)
Create new static data member DIE.
void addLabel(DIEValueList &Die, dwarf::Attribute Attribute, dwarf::Form Form, const MCSymbol *Label)
Add a Dwarf label attribute data and value.
void addConstantFPValue(DIE &Die, const ConstantFP *CFP)
Add constant value entry in variable DIE.
DIE * getOrCreateSubprogramDIE(const DISubprogram *SP, bool Minimal=false)
void addSectionLabel(DIE &Die, dwarf::Attribute Attribute, const MCSymbol *Label, const MCSymbol *Sec)
Add a Dwarf section label attribute data and value.
void addPoolOpAddress(DIEValueList &Die, const MCSymbol *Label)
void constructTypeDIE(DIE &Buffer, const DICompositeType *CTy)
MCSymbol * EndLabel
Emitted at the end of the CU and used to compute the CU Length field.
void addFlag(DIE &Die, dwarf::Attribute Attribute)
Add a flag that is true to the DIE.
AsmPrinter * Asm
Target of Dwarf emission.
void addType(DIE &Entity, const DIType *Ty, dwarf::Attribute Attribute=dwarf::DW_AT_type)
Add a new type attribute to the specified entity.
void applySubprogramAttributes(const DISubprogram *SP, DIE &SPDie, bool SkipSPAttributes=false)
void addDIEEntry(DIE &Die, dwarf::Attribute Attribute, DIE &Entry)
Add a DIE attribute data and value.
LexicalScope - This class is used to track scope information.
Base class for the full range of assembler expressions which are needed for parsing.
MCSection * getDwarfRangesSection() const
MCSection * getDwarfAddrSection() const
MCSection * getDwarfLineSection() const
int getDwarfRegNum(MCRegister RegNum, bool isEH) const
Map a target register to an equivalent dwarf register number.
MCSymbol * getBeginSymbol()
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
bool isDefined() const
isDefined - Check if this symbol is defined (i.e., it has an address).
bool sameSection(const MachineBasicBlock *MBB) const
Returns true if this and MBB belong to the same section.
unsigned getSectionIDNum() const
Returns the unique section ID number of this basic block.
bool isEndSection() const
Returns true if this block ends any section.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
const LLVMTargetMachine & getTarget() const
getTarget - Return the target machine this machine code is compiled with
A Module instance is used to store all the information related to an LLVM module.
StringRef getName() const
Get a short "name" for the module.
Wrapper class representing virtual and physical registers.
static bool isPhysicalRegister(unsigned Reg)
Return true if the specified register number is in the physical register namespace.
Implements a dense probed hash-table based set with some number of buckets stored inline.
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StackOffset holds a fixed and a scalable offset in bytes.
StringRef - Represent a constant reference to a string, i.e.
std::string str() const
str - Get the contents as an std::string.
constexpr bool empty() const
empty - Check if the string is empty.
Information about stack frame layout on the target.
virtual DwarfFrameBase getDwarfFrameBase(const MachineFunction &MF) const
Return the frame base information to be encoded in the DWARF subprogram debug info.
virtual StackOffset getFrameIndexReference(const MachineFunction &MF, int FI, Register &FrameReg) const
getFrameIndexReference - This method should return the base register and offset used to reference a f...
virtual MCRegister getStaticBase() const
Returns the register used as static base in RWPI variants.
static SectionKind getKindForGlobal(const GlobalObject *GO, const TargetMachine &TM)
Classify the specified global variable into a set of target independent categories embodied in Sectio...
bool supportDebugThreadLocalLocation() const
Target supports TLS offset relocation in debug section?
virtual const MCExpr * getIndirectSymViaRWPI(const MCSymbol *Sym) const
Get the target specific RWPI relocation.
virtual const MCExpr * getDebugThreadLocalSymbol(const MCSymbol *Sym) const
Create a symbol reference to describe the given TLS variable when emitting the address in debug info.
const Triple & getTargetTriple() const
bool useEmulatedTLS() const
Returns true if this target uses emulated TLS.
Reloc::Model getRelocationModel() const
Returns the code generation relocation model.
const MCRegisterInfo * getMCRegisterInfo() const
bool DisableFramePointerElim(const MachineFunction &MF) const
DisableFramePointerElim - This returns true if frame pointer elimination optimization should be disab...
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
virtual const TargetRegisterInfo * getRegisterInfo() const
getRegisterInfo - If register information is available, return it.
virtual const TargetFrameLowering * getFrameLowering() const
bool isNVPTX() const
Tests whether the target is NVPTX (32- or 64-bit).
bool isWasm() const
Tests whether the target is wasm (32- and 64-bit).
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
StringRef toStringRef(SmallVectorImpl< char > &Out) const
This returns the twine as a single StringRef if it can be represented as such.
std::pair< iterator, bool > insert(const ValueT &V)
size_type count(const_arg_type_t< ValueT > V) const
Return 1 if the specified key is in the set, 0 otherwise.
NodeTy * getNextNode()
Get the next node, or nullptr for the list tail.
StringRef AttributeEncodingString(unsigned Encoding)
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
UnitType
Constants for unit types in DWARF v5.
@ WASM_SYMBOL_TYPE_GLOBAL
This is an optimization pass for GlobalISel generic memory operations.
uint64_t divideCeil(uint64_t Numerator, uint64_t Denominator)
Returns the integer ceil(Numerator / Denominator).
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
auto reverse(ContainerTy &&C)
@ Apple
.apple_names, .apple_namespaces, .apple_types, .apple_objc.
@ Global
Append to llvm.global_dtors.
std::pair< const MachineInstr *, const MachineInstr * > InsnRange
InsnRange - This is used to track range of instructions with identical lexical scope.
DISubprogram * getDISubprogram(const MDNode *Scope)
Find subprogram that is enclosing this scope.
Helper used to pair up a symbol and its DWARF compile unit.
union llvm::TargetFrameLowering::DwarfFrameBase::@233 Location
enum llvm::TargetFrameLowering::DwarfFrameBase::FrameBaseKind Kind
struct WasmFrameBase WasmLoc
This struct describes target specific location.