48 "add-linkage-names-to-declaration-call-origins",
cl::Hidden,
49 cl::desc(
"Add DW_AT_linkage_name to function declaration DIEs "
50 "referenced by DW_AT_call_origin attributes. Enabled by default "
51 "for -gsce debugger tuning."));
54 "emit-func-debug-line-table-offsets",
cl::Hidden,
55 cl::desc(
"Include line table offset in function's debug info and emit end "
56 "sequence after each function's line data."),
74 return dwarf::DW_TAG_skeleton_unit;
76 return dwarf::DW_TAG_compile_unit;
94 "Cannot translate unknown address space to DWARF address space");
118 bool UseAddrOffsetFormOrExpressions =
122 if (Label->isInSection() && UseAddrOffsetFormOrExpressions)
129 : dwarf::DW_FORM_GNU_addr_index,
137 "Addr+offset expressions are only valuable when using debug_addr (to "
138 "reduce relocations) available in DWARFv5 or higher");
166 return Asm->
OutStreamer->emitDwarfFileDirective(0,
"",
"", std::nullopt,
169 if (LastFile != File) {
173 File->getSource(), CUID);
189 auto *CB = GVContext ? dyn_cast<DICommonBlock>(GVContext) :
nullptr;
198 assert(SDMDecl->isStaticMember() &&
"Expected static member decl");
202 addDIEEntry(*VariableDIE, dwarf::DW_AT_specification, *VariableSpecDIE);
205 if (GTy != SDMDecl->getBaseType())
211 if (!DisplayName.
empty())
218 addFlag(*VariableDIE, dwarf::DW_AT_external);
225 addFlag(*VariableDIE, dwarf::DW_AT_declaration);
232 addUInt(*VariableDIE, dwarf::DW_AT_alignment, dwarf::DW_FORM_udata,
246 bool addToAccelTable =
false;
248 std::optional<unsigned> NVPTXAddressSpace;
249 std::unique_ptr<DIEDwarfExpression> DwarfExpr;
250 for (
const auto &GE : GlobalExprs) {
259 addToAccelTable =
true;
282 addToAccelTable =
true;
284 DwarfExpr = std::make_unique<DIEDwarfExpression>(*
Asm, *
this, *Loc);
292 unsigned LocalNVPTXAddressSpace;
297 NVPTXAddressSpace = LocalNVPTXAddressSpace;
300 DwarfExpr->addFragmentOffset(Expr);
307 auto GetPointerSizedFormAndOp = [
this]() {
309 assert((PointerSize == 4 || PointerSize == 8) &&
310 "Add support for other sizes if necessary");
315 return PointerSize == 4
316 ? FormAndOp{dwarf::DW_FORM_data4, dwarf::DW_OP_const4u}
317 : FormAndOp{dwarf::DW_FORM_data8, dwarf::DW_OP_const8u};
319 if (
Global->isThreadLocal()) {
326 addWasmRelocBaseGlobal(Loc,
"__tls_base", 1);
328 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
335 auto FormAndOp = GetPointerSizedFormAndOp();
337 addUInt(*Loc, dwarf::DW_FORM_data1, FormAndOp.Op);
343 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_const_index);
344 addUInt(*Loc, dwarf::DW_FORM_udata,
348 addUInt(*Loc, dwarf::DW_FORM_data1,
350 : dwarf::DW_OP_form_tls_address);
357 addWasmRelocBaseGlobal(Loc,
"__memory_base", 1);
359 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
365 auto FormAndOp = GetPointerSizedFormAndOp();
367 addUInt(*Loc, dwarf::DW_FORM_data1, FormAndOp.Op);
373 unsigned DwarfBaseReg =
375 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + DwarfBaseReg);
377 addSInt(*Loc, dwarf::DW_FORM_sdata, 0);
379 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
393 if (DwarfExpr->isUnknownLocation())
394 DwarfExpr->setMemoryLocationKind();
395 DwarfExpr->addExpression(Expr);
399 addUInt(*VariableDIE, dwarf::DW_AT_address_class, dwarf::DW_FORM_data1,
403 addBlock(*VariableDIE, dwarf::DW_AT_location, DwarfExpr->finalize());
408 if (addToAccelTable) {
442 bool SameAsPrevCU =
this == PrevCU;
448 if (CURanges.empty() || !SameAsPrevCU ||
449 (&CURanges.back().End->getSection() !=
450 &
Range.End->getSection())) {
454 CURanges.push_back(
Range);
458 CURanges.back().End =
Range.End;
490 assert(Begin &&
"Begin label should not be null!");
491 assert(
End &&
"End label should not be null!");
493 assert(
End->isDefined() &&
"Invalid end label");
505void DwarfCompileUnit::addWasmRelocBaseGlobal(
DIELoc *Loc,
StringRef GlobalName,
509 const unsigned TI_GLOBAL_RELOC = 3;
521 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_WASM_location);
522 addSInt(*Loc, dwarf::DW_FORM_sdata, TI_GLOBAL_RELOC);
532 addUInt(*Loc, dwarf::DW_FORM_data4, GlobalIndex);
546 BB_List.
push_back({R.second.BeginLabel, R.second.EndLabel});
553 addFlag(*SPDie, dwarf::DW_AT_APPLE_omit_frame_ptr);
557 *SPDie, dwarf::DW_AT_LLVM_stmt_sequence, LineTableSym,
566 switch (FrameBase.
Kind) {
570 addAddress(*SPDie, dwarf::DW_AT_frame_base, Location);
576 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_call_frame_cfa);
578 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_consts);
580 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
582 addBlock(*SPDie, dwarf::DW_AT_frame_base, Loc);
587 const unsigned TI_GLOBAL_RELOC = 3;
593 addWasmRelocBaseGlobal(Loc,
"__stack_pointer",
595 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_stack_value);
596 addBlock(*SPDie, dwarf::DW_AT_frame_base, Loc);
620 DIE &ParentScopeDIE) {
621 if (!Scope || !Scope->getScopeNode())
624 auto *DS = Scope->getScopeNode();
626 assert((Scope->getInlinedAt() || !isa<DISubprogram>(DS)) &&
627 "Only handle inlined subprograms here, use "
628 "constructSubprogramScopeDIE for non-inlined "
632 if (Scope->getParent() && isa<DISubprogram>(DS)) {
634 assert(ScopeDIE &&
"Scope DIE should not be null.");
645 assert(ScopeDIE &&
"Scope DIE should not be null.");
654 HasRangeLists =
true;
661 uint32_t Index = IndexAndList.first;
662 auto &
List = *IndexAndList.second;
670 addUInt(ScopeDIE, dwarf::DW_AT_ranges, dwarf::DW_FORM_rnglistx, Index);
688 (Ranges.size() == 1 &&
691 Ranges.front().Begin))) {
702 List.reserve(Ranges.size());
707 const auto *BeginMBB = R.first->getParent();
708 const auto *EndMBB = R.second->getParent();
710 const auto *
MBB = BeginMBB;
722 : MBBSectionRange.BeginLabel,
734 DIE &ParentScopeDIE) {
735 assert(Scope->getScopeNode());
736 auto *DS = Scope->getScopeNode();
740 DIE *OriginDIE = getAbstractScopeDIEs()[InlinedSP];
741 assert(OriginDIE &&
"Unable to find original DIE for an inlined subprogram.");
745 addDIEEntry(*ScopeDIE, dwarf::DW_AT_abstract_origin, *OriginDIE);
751 addUInt(*ScopeDIE, dwarf::DW_AT_call_file, std::nullopt,
753 addUInt(*ScopeDIE, dwarf::DW_AT_call_line, std::nullopt, IA->getLine());
755 addUInt(*ScopeDIE, dwarf::DW_AT_call_column, std::nullopt, IA->getColumn());
757 addUInt(*ScopeDIE, dwarf::DW_AT_GNU_discriminator, std::nullopt,
758 IA->getDiscriminator());
773 const auto *DS = Scope->getScopeNode();
776 if (Scope->isAbstractScope()) {
778 "Abstract DIE for this scope exists!");
779 getAbstractScopeDIEs()[DS] = ScopeDIE;
782 if (!Scope->getInlinedAt()) {
783 assert(!LexicalBlockDIEs.count(DS) &&
784 "Concrete out-of-line DIE for this scope exists!");
785 LexicalBlockDIEs[DS] = ScopeDIE;
787 InlinedLocalScopeDIEs[DS].push_back(ScopeDIE);
805 applyConcreteDbgVariableAttributes(V, DV, *VariableDie);
812void DwarfCompileUnit::applyConcreteDbgVariableAttributes(
819 addUInt(VariableDie, dwarf::DW_AT_address_class, dwarf::DW_FORM_data1,
824 if (Entry->isLocation()) {
826 }
else if (
Entry->isInt()) {
827 auto *Expr =
Single.getExpr();
828 if (Expr && Expr->getNumElements()) {
832 DwarfExpr.addFragmentOffset(Expr);
833 DwarfExpr.addUnsignedConstant(
Entry->getInt());
834 DwarfExpr.addExpression(Expr);
835 addBlock(VariableDie, dwarf::DW_AT_location, DwarfExpr.finalize());
836 if (DwarfExpr.TagOffset)
837 addUInt(VariableDie, dwarf::DW_AT_LLVM_tag_offset,
838 dwarf::DW_FORM_data1, *DwarfExpr.TagOffset);
841 }
else if (
Entry->isConstantFP()) {
843 }
else if (
Entry->isConstantInt()) {
845 }
else if (
Entry->isTargetIndexLocation()) {
851 addBlock(VariableDie, dwarf::DW_AT_location, DwarfExpr.finalize());
858 return Entry.isLocation() && !Entry.getLoc().getReg();
862 assert(Expr &&
"Variadic Debug Value must have an Expression.");
865 DwarfExpr.addFragmentOffset(Expr);
871 if (
Entry.isLocation()) {
872 if (!DwarfExpr.addMachineRegExpression(
TRI, Cursor,
873 Entry.getLoc().getReg()))
875 }
else if (
Entry.isInt()) {
877 DwarfExpr.addUnsignedConstant(
Entry.getInt());
878 }
else if (
Entry.isConstantFP()) {
883 APInt RawBytes =
Entry.getConstantFP()->getValueAPF().bitcastToAPInt();
887 }
else if (
Entry.isConstantInt()) {
888 APInt RawBytes =
Entry.getConstantInt()->getValue();
892 }
else if (
Entry.isTargetIndexLocation()) {
904 if (!DwarfExpr.addExpression(
907 return AddEntry(DVal->getLocEntries()[Idx], Cursor);
912 addBlock(VariableDie, dwarf::DW_AT_location, DwarfExpr.finalize());
913 if (DwarfExpr.TagOffset)
914 addUInt(VariableDie, dwarf::DW_AT_LLVM_tag_offset, dwarf::DW_FORM_data1,
915 *DwarfExpr.TagOffset);
918void DwarfCompileUnit::applyConcreteDbgVariableAttributes(
924 addUInt(VariableDie, dwarf::DW_AT_LLVM_tag_offset, dwarf::DW_FORM_data1,
928void DwarfCompileUnit::applyConcreteDbgVariableAttributes(
const Loc::MMI &MMI,
931 std::optional<unsigned> NVPTXAddressSpace;
940 DwarfExpr.addFragmentOffset(Expr);
944 TRI->getOffsetOpcodes(Offset, Ops);
950 unsigned LocalNVPTXAddressSpace;
955 NVPTXAddressSpace = LocalNVPTXAddressSpace;
961 DwarfExpr.setMemoryLocationKind();
965 DwarfExpr.addMachineRegExpression(
967 DwarfExpr.addExpression(std::move(Cursor));
971 addUInt(VariableDie, dwarf::DW_AT_address_class, dwarf::DW_FORM_data1,
974 addBlock(VariableDie, dwarf::DW_AT_location, DwarfExpr.finalize());
975 if (DwarfExpr.TagOffset)
976 addUInt(VariableDie, dwarf::DW_AT_LLVM_tag_offset, dwarf::DW_FORM_data1,
977 *DwarfExpr.TagOffset);
980void DwarfCompileUnit::applyConcreteDbgVariableAttributes(
987 DwarfExpr.addFragmentOffset(&Expr);
989 DwarfExpr.beginEntryValueExpression(Cursor);
990 DwarfExpr.addMachineRegExpression(
992 DwarfExpr.addExpression(std::move(Cursor));
994 addBlock(VariableDie, dwarf::DW_AT_location, DwarfExpr.finalize());
997void DwarfCompileUnit::applyConcreteDbgVariableAttributes(
998 const std::monostate &,
const DbgVariable &DV,
DIE &VariableDie) {}
1002 DIE *&ObjectPointer) {
1005 ObjectPointer = Var;
1013 DL.setDIE(*LabelDie);
1015 if (Scope.isAbstractScope())
1024 auto *Array = dyn_cast<DICompositeType>(Var->
getType());
1025 if (!Array || Array->getTag() != dwarf::DW_TAG_array_type)
1027 if (
auto *DLVar = Array->getDataLocation())
1028 Result.push_back(DLVar);
1029 if (
auto *AsVar = Array->getAssociated())
1030 Result.push_back(AsVar);
1031 if (
auto *AlVar = Array->getAllocated())
1032 Result.push_back(AlVar);
1033 for (
auto *El : Array->getElements()) {
1034 if (
auto *Subrange = dyn_cast<DISubrange>(El)) {
1035 if (
auto Count = Subrange->getCount())
1036 if (
auto *Dependency = dyn_cast_if_present<DIVariable *>(Count))
1037 Result.push_back(Dependency);
1038 if (
auto LB = Subrange->getLowerBound())
1039 if (
auto *Dependency = dyn_cast_if_present<DIVariable *>(LB))
1040 Result.push_back(Dependency);
1041 if (
auto UB = Subrange->getUpperBound())
1042 if (
auto *Dependency = dyn_cast_if_present<DIVariable *>(UB))
1043 Result.push_back(Dependency);
1044 if (
auto ST = Subrange->getStride())
1045 if (
auto *Dependency = dyn_cast_if_present<DIVariable *>(ST))
1046 Result.push_back(Dependency);
1047 }
else if (
auto *GenericSubrange = dyn_cast<DIGenericSubrange>(El)) {
1048 if (
auto Count = GenericSubrange->getCount())
1049 if (
auto *Dependency = dyn_cast_if_present<DIVariable *>(Count))
1050 Result.push_back(Dependency);
1051 if (
auto LB = GenericSubrange->getLowerBound())
1052 if (
auto *Dependency = dyn_cast_if_present<DIVariable *>(LB))
1053 Result.push_back(Dependency);
1054 if (
auto UB = GenericSubrange->getUpperBound())
1055 if (
auto *Dependency = dyn_cast_if_present<DIVariable *>(UB))
1056 Result.push_back(Dependency);
1057 if (
auto ST = GenericSubrange->getStride())
1058 if (
auto *Dependency = dyn_cast_if_present<DIVariable *>(ST))
1059 Result.push_back(Dependency);
1079 for (
auto *Var :
reverse(Input)) {
1080 DbgVar.
insert({Var->getVariable(), Var});
1085 while (!WorkList.
empty()) {
1086 auto Item = WorkList.
back();
1088 bool visitedAllDependencies = Item.getInt();
1094 if (Visited.
count(Var))
1098 if (visitedAllDependencies) {
1100 Result.push_back(Var);
1105 auto Res = Visiting.
insert(Var);
1107 assert(
false &&
"dependency cycle in local variables");
1116 if (
const auto *Dep = dyn_cast<const DILocalVariable>(Dependency))
1130 assert(!Scope->getInlinedAt());
1131 assert(!Scope->isAbstractScope());
1136 addDIEEntry(ScopeDIE, dwarf::DW_AT_object_pointer, *ObjectPointer);
1145 if (FnArgs.
size() > 1 && !FnArgs[FnArgs.
size() - 1] &&
1155 DIE *ObjectPointer =
nullptr;
1159 for (
auto &DV : Vars.Args)
1180 auto skipLexicalScope = [
this](
LexicalScope *S) ->
bool {
1181 if (isa<DISubprogram>(S->getScopeNode()))
1184 if (!Vars.Args.empty() || !Vars.Locals.empty())
1192 if (skipLexicalScope(LS))
1198 return ObjectPointer;
1203 auto *SP = cast<DISubprogram>(Scope->getScopeNode());
1204 if (getAbstractScopeDIEs().
count(SP))
1216 else if (
auto *SPDecl = SP->getDeclaration()) {
1230 *ContextDIE,
nullptr);
1233 ContextCU->getAbstractScopeDIEs()[SP] = &AbsDef;
1236 ContextCU->
addSInt(AbsDef, dwarf::DW_AT_inline,
1238 : dwarf::DW_FORM_implicit_const,
1241 ContextCU->
addDIEEntry(AbsDef, dwarf::DW_AT_object_pointer, *ObjectPointer);
1252 case dwarf::DW_TAG_call_site:
1253 return dwarf::DW_TAG_GNU_call_site;
1254 case dwarf::DW_TAG_call_site_parameter:
1255 return dwarf::DW_TAG_GNU_call_site_parameter;
1266 case dwarf::DW_AT_call_all_calls:
1267 return dwarf::DW_AT_GNU_all_call_sites;
1268 case dwarf::DW_AT_call_target:
1269 return dwarf::DW_AT_GNU_call_site_target;
1270 case dwarf::DW_AT_call_origin:
1271 return dwarf::DW_AT_abstract_origin;
1272 case dwarf::DW_AT_call_return_pc:
1273 return dwarf::DW_AT_low_pc;
1274 case dwarf::DW_AT_call_value:
1275 return dwarf::DW_AT_GNU_call_site_value;
1276 case dwarf::DW_AT_call_tail_call:
1277 return dwarf::DW_AT_GNU_tail_call;
1288 case dwarf::DW_OP_entry_value:
1289 return dwarf::DW_OP_GNU_entry_value;
1307 }
else if (CalleeSP) {
1309 assert(CalleeDIE &&
"Could not create DIE for call site entry origin");
1311 !CalleeSP->isDefinition() &&
1347 assert(PCAddr &&
"Missing return PC information for a call");
1353 addType(CallSiteDIE, AllocSiteTy, dwarf::DW_AT_LLVM_alloc_type);
1360 for (
const auto &Param : Params) {
1361 unsigned Register = Param.getRegister();
1362 auto CallSiteDieParam =
1366 addAddress(*CallSiteDieParam, dwarf::DW_AT_location,
1378 CallSiteDIE.
addChild(CallSiteDieParam);
1387 auto *Entity =
Module->getEntity();
1388 if (
auto *NS = dyn_cast<DINamespace>(Entity))
1390 else if (
auto *M = dyn_cast<DIModule>(Entity))
1392 else if (
auto *SP = dyn_cast<DISubprogram>(Entity)) {
1396 if (
auto *AbsSPDie = getAbstractScopeDIEs().
lookup(SP))
1397 EntityDie = AbsSPDie;
1400 }
else if (
auto *
T = dyn_cast<DIType>(Entity))
1402 else if (
auto *GV = dyn_cast<DIGlobalVariable>(Entity))
1404 else if (
auto *IE = dyn_cast<DIImportedEntity>(Entity))
1407 EntityDie =
getDIE(Entity);
1410 addDIEEntry(*IMDie, dwarf::DW_AT_import, *EntityDie);
1412 if (!
Name.empty()) {
1425 DINodeArray Elements =
Module->getElements();
1426 for (
const auto *Element : Elements) {
1444 assert(ContextDIE &&
"Empty scope for the imported entity!");
1453 if (
DIE *AbsSPDIE = getAbstractScopeDIEs().
lookup(SP)) {
1456 addDIEEntry(*
D, dwarf::DW_AT_abstract_origin, *AbsSPDIE);
1468 auto *Die = Entity->
getDIE();
1472 if (AbsEntity && AbsEntity->
getDIE()) {
1474 Label = dyn_cast<const DbgLabel>(Entity);
1476 if (
const DbgVariable *Var = dyn_cast<const DbgVariable>(Entity))
1478 else if ((Label = dyn_cast<const DbgLabel>(Entity)))
1487 const auto *
Sym = Label->getSymbol();
1500 if (
auto *AbsLSDie = getAbstractScopeDIEs().lookup(LS))
1501 addDIEEntry(*ScopeDIE, dwarf::DW_AT_abstract_origin, *AbsLSDie);
1504 for (
auto [LScope, ScopeDIE] : LexicalBlockDIEs)
1505 AttachAO(LScope, ScopeDIE);
1506 for (
auto &[LScope, ScopeDIEs] : InlinedLocalScopeDIEs)
1507 for (
auto *ScopeDIE : ScopeDIEs)
1508 AttachAO(LScope, ScopeDIE);
1512 auto &AbstractEntities = getAbstractEntities();
1513 auto I = AbstractEntities.find(Node);
1514 if (
I != AbstractEntities.end())
1515 return I->second.get();
1521 assert(Scope && Scope->isAbstractScope());
1522 auto &Entity = getAbstractEntities()[Node];
1523 if (isa<const DILocalVariable>(Node)) {
1524 Entity = std::make_unique<DbgVariable>(cast<const DILocalVariable>(Node),
1527 }
else if (isa<const DILabel>(Node)) {
1528 Entity = std::make_unique<DbgLabel>(
1529 cast<const DILabel>(Node),
nullptr );
1543 : dwarf::DW_UT_compile;
1574 GlobalNames[FullName] = &Die;
1586 GlobalNames.insert(std::make_pair(std::move(FullName), &
getUnitDie()));
1595 GlobalTypes[FullName] = &Die;
1607 GlobalTypes.insert(std::make_pair(std::move(FullName), &
getUnitDie()));
1612 auto *Single = std::get_if<Loc::Single>(&DV);
1613 if (Single && Single->getExpr())
1616 addAddress(Die, dwarf::DW_AT_location, Location);
1624 if (Location.isIndirect())
1637 addUInt(Die, dwarf::DW_AT_LLVM_tag_offset, dwarf::DW_FORM_data1,
1667 addUInt(Die, dwarf::DW_AT_LLVM_tag_offset, dwarf::DW_FORM_data1,
1675 ? dwarf::DW_FORM_loclistx
1687 if (
uint32_t AlignInBytes = DIVar->getAlignInBytes())
1688 addUInt(VariableDie, dwarf::DW_AT_alignment, dwarf::DW_FORM_udata,
1696 addFlag(VariableDie, dwarf::DW_AT_artificial);
1704 const auto *
DILabel = Label.getLabel();
1707 addFlag(LabelDie, dwarf::DW_AT_artificial);
1709 addUInt(LabelDie, dwarf::DW_AT_LLVM_coro_suspend_idx, std::nullopt,
1721 auto *SPDecl = SP->getDeclaration();
1722 auto *
Context = SPDecl ? SPDecl->getScope() : SP->getScope();
1727bool DwarfCompileUnit::isDwoUnit()
const {
1749 : dwarf::DW_AT_GNU_addr_base,
1770 addUInt(Die, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1, Btr.Encoding);
1772 addUInt(Die, dwarf::DW_AT_byte_size, std::nullopt,
1781 bool isAbstract = getAbstractScopeDIEs().count(LB->
getSubprogram());
1783 auto &DIEs = getAbstractScopeDIEs();
1784 if (
auto It = DIEs.find(LB); It != DIEs.end())
1787 assert(!isAbstract &&
"Missed lexical block DIE in abstract tree!");
1790 return LexicalBlockDIEs.lookup(LB);
1794 if (isa_and_nonnull<DILocalScope>(
Context)) {
1795 if (
auto *LFScope = dyn_cast<DILexicalBlockFile>(
Context))
1796 Context = LFScope->getNonLexicalBlockFileScope();
1797 if (
auto *LScope = dyn_cast<DILexicalBlock>(
Context))
1801 auto *SPScope = cast<DISubprogram>(
Context);
1802 const auto &DIEs = getAbstractScopeDIEs();
1803 if (
auto It = DIEs.find(SPScope); It != DIEs.end())
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
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 unsigned translateToNVVMDWARFAddrSpace(unsigned AddrSpace)
Translate NVVM IR address space code to DWARF correspondent value.
static SmallVector< const DIVariable *, 2 > dependencies(DbgVariable *Var)
Return all DIVariables that appear in count: expressions.
static cl::opt< bool > EmitFuncLineTableOffsetsOption("emit-func-debug-line-table-offsets", cl::Hidden, cl::desc("Include line table offset in function's debug info and emit end " "sequence after each function's line data."), cl::init(false))
static bool AddLinkageNamesToDeclCallOriginsForTuning(const DwarfDebug *DD)
static dwarf::Tag GetCompileUnitType(UnitKind Kind, DwarfDebug *DW)
static cl::opt< cl::boolOrDefault > AddLinkageNamesToDeclCallOrigins("add-linkage-names-to-declaration-call-origins", cl::Hidden, cl::desc("Add DW_AT_linkage_name to function declaration DIEs " "referenced by DW_AT_call_origin attributes. Enabled by default " "for -gsce debugger tuning."))
Query value using AddLinkageNamesToDeclCallOriginsForTuning.
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.
Register const TargetRegisterInfo * TRI
NVPTX address space definition.
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
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
MapVector< MBBSectionID, MBBSectionRange > MBBSectionRanges
TargetMachine & TM
Target machine description.
const MCAsmInfo * MAI
Target Asm Printer information.
MachineFunction * MF
The current machine function.
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
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.
MCSymbol * GetExternalSymbolSymbol(const Twine &Sym) const
Return the MCSymbol for the specified ExternalSymbol.
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 LLVM_ABI std::optional< DebugNameTableKind > getNameTableKind(StringRef Str)
static LLVM_ABI 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.
LLVM_ABI DIEValue findAttribute(dwarf::Attribute Attribute) const
Find a value in the DIE with the attribute given.
DIE & addChild(DIE *Child)
Add a child to the DIE.
DIE & addChildFront(DIE *Child)
static DIE * get(BumpPtrAllocator &Alloc, dwarf::Tag Tag)
LLVM_ABI 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
LLVM_ABI bool isEntryValue() const
Check if the expression consists of exactly one entry value operand.
element_iterator elements_begin() const
ArrayRef< uint64_t > getElements() const
uint64_t getElement(unsigned I) const
LLVM_ABI std::optional< SignedOrUnsignedConstant > isConstant() const
Determine whether this represents a constant value, if so.
static LLVM_ABI 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).
bool isArtificial() const
std::optional< unsigned > getCoroSuspendIdx() const
LLVM_ABI DISubprogram * getSubprogram() const
Get the subprogram for this scope.
Tagged DWARF-like metadata node.
LLVM_ABI dwarf::Tag getTag() const
Base class for scope-like contexts.
Subprogram description. Uses SubclassData1.
StringRef getName() const
uint32_t getAlignInBytes() const
DIScope * getScope() const
StringRef getName() const
LLVM_ABI unsigned getPointerSize(unsigned AS=0) const
The pointer representation 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...
The location of a single variable, composed of an expression and 0 or more DbgValueLocEntries.
ArrayRef< DbgValueLocEntry > getLocEntries() const
This class is used to track local variable information.
bool isArtificial() const
Return true if DbgVariable is artificial.
dwarf::Tag getTag() const
bool isObjectPointer() const
const DILocalVariable * getVariable() const
StringRef getName() const
const DIType * getType() const
Loc::Variant & asVariant()
To workaround P2162R0 https://github.com/cplusplus/papers/issues/873 the base class subobject needs t...
MCSymbol * getLabelBeforeInsn(const MachineInstr *MI)
Return Label preceding the instruction.
MCSymbol * getLabelAfterInsn(const MachineInstr *MI)
Return Label immediately following the instruction.
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, MCSymbol *LineTableSym)
Find DIE for the given subprogram and attach appropriate DW_AT_low_pc, DW_AT_high_pc and DW_AT_LLVM_s...
void constructAbstractSubprogramScopeDIE(LexicalScope *Scope)
bool includeMinimalInlineScopes() const
DIE * getOrCreateImportedEntityDIE(const DIImportedEntity *IE)
Get or create a DIE for an imported entity.
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)
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.
std::vector< BaseTypeRef > ExprRefedBaseTypes
DIE * constructInlinedScopeDIE(LexicalScope *Scope, DIE &ParentScopeDIE)
This scope represents an inlined body of a function.
void createBaseTypeDIEs()
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.
DIE * getLexicalBlockDIE(const DILexicalBlock *LB)
Get a DIE for the given DILexicalBlock.
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 * getOrCreateContextDIE(const DIScope *Ty) override
Construct a DIE for a given scope.
void applyCommonDbgVariableAttributes(const DbgVariable &Var, DIE &VariableDie)
Add attributes to Var which reflect the common attributes of VariableDie, namely those which are not ...
DIE & constructCallSiteEntryDIE(DIE &ScopeDIE, const DISubprogram *CalleeSP, bool IsTail, const MCSymbol *PCAddr, const MCSymbol *CallAddr, unsigned CallReg, DIType *AllocSiteTy)
Construct a call site entry DIE describing a call within Scope to a callee described by CalleeSP.
DIE & constructSubprogramScopeDIE(const DISubprogram *Sub, LexicalScope *Scope, MCSymbol *LineTableSym)
Construct a DIE for this subprogram scope.
DIE * constructVariableDIE(DbgVariable &DV, bool Abstract=false)
Construct a DIE for the given DbgVariable.
dwarf::LocationAtom getDwarf5OrGNULocationAtom(dwarf::LocationAtom Loc) const
This takes a DWARF 5 location atom and either returns it or a GNU analog.
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)
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.
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.
void addGlobalTypeImpl(const DIType *Ty, const DIE &Die, const DIScope *Context) override
Add a new global type to the compile unit.
unsigned getOrCreateSourceID(const DIFile *File) override
Look up the source ID for the given file.
void constructScopeDIE(LexicalScope *Scope, DIE &ParentScopeDIE)
void attachLexicalScopesAbstractOrigins()
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.
bool emitFuncLineTableOffsets() const
void addComplexAddress(const DIExpression *DIExpr, DIE &Die, dwarf::Attribute Attribute, const MachineLocation &Location)
Start with the address based on the location provided, and generate the DWARF information necessary t...
DIE * constructImportedEntityDIE(const DIImportedEntity *IE)
DwarfCompileUnit & getCU() override
void attachRangesOrLowHighPC(DIE &D, SmallVector< RangeSpan, 2 > Ranges)
void finishSubprogramDefinition(const DISubprogram *SP)
Collects and handles dwarf debug information.
MDNodeSet & getLocalDeclsForScope(const DILocalScope *S)
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 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.
void addAccelNamespace(const DwarfUnit &Unit, const DICompileUnit::DebugNameTableKind NameTableKind, StringRef Name, const DIE &Die)
bool alwaysUseRanges(const DwarfCompileUnit &) const
Returns whether range encodings should be used for single entry range lists.
void addSubprogramNames(const DwarfUnit &Unit, const DICompileUnit::DebugNameTableKind NameTableKind, const DISubprogram *SP, DIE &Die)
bool useAllLinkageNames() const
Returns whether we should emit all DW_AT_[MIPS_]linkage_name.
void insertSectionLabel(const MCSymbol *S)
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()
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.
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.
void addAccelName(const DwarfUnit &Unit, const DICompileUnit::DebugNameTableKind NameTableKind, StringRef Name, const DIE &Die)
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()
void addScopeVariable(LexicalScope *LS, DbgVariable *Var)
This dwarf writer support class manages information associated with a source file.
virtual DIE * getOrCreateTypeDIE(const MDNode *TyNode)
Find existing DIE or create new DIE for the given type.
DwarfDebug & getDwarfDebug() const
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.
virtual 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.
MCSymbol * LabelBegin
The start of the unit within its section.
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, unsigned Column, 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.
unsigned getUniqueID() const
Gets Unique ID for this unit.
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.
Multi-value location description.
unsigned getDebugLocListIndex() const
std::optional< uint8_t > getDebugLocListTagOffset() const
Single value location description.
unsigned getCodePointerSize() const
Get the code pointer size in bytes.
Base class for the full range of assembler expressions which are needed for parsing.
MCSection * getDwarfRangesSection() const
MCSection * getDwarfAddrSection() const
MCSection * getDwarfLineSection() const
virtual int64_t 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.
MBBSectionID getSectionID() const
Returns the section ID 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 TargetMachine & 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 constexpr bool isPhysicalRegister(unsigned Reg)
Return true if the specified register number is in the physical register namespace.
void insert_range(Range &&R)
bool empty() const
Determine if the SetVector is empty or not.
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
LLVM_ABI 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 TargetFrameLowering * getFrameLowering() const
virtual const TargetRegisterInfo * getRegisterInfo() const =0
Return the target's register information.
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.
A DeclContext is a named program scope that is used for ODR uniquing of types.
NodeTy * getNextNode()
Get the next node, or nullptr for the list tail.
LLVM_ABI StringRef AttributeEncodingString(unsigned Encoding)
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ DWARF_ADDR_shared_space
@ DWARF_ADDR_global_space
@ DWARF_ADDR_generic_space
initializer< Ty > init(const Ty &Val)
UnitType
Constants for unit types in DWARF v5.
@ WASM_SYMBOL_TYPE_GLOBAL
This is an optimization pass for GlobalISel generic memory operations.
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.
constexpr T divideCeil(U Numerator, V Denominator)
Returns the integer ceil(Numerator / Denominator).
@ Sub
Subtraction of integers.
auto count(R &&Range, const E &Element)
Wrapper function around std::count to count the number of times an element Element occurs in the give...
DWARFExpression::Operation Op
std::pair< const MachineInstr *, const MachineInstr * > InsnRange
InsnRange - This is used to track range of instructions with identical lexical scope.
LLVM_ABI DISubprogram * getDISubprogram(const MDNode *Scope)
Find subprogram that is enclosing this scope.
Single location defined by (potentially multiple) EntryValueInfo.
std::set< EntryValueInfo > EntryValues
Single location defined by (potentially multiple) MMI entries.
const std::set< FrameIndexExpr > & getFrameIndexExprs() const
Get the FI entries, sorted by fragment offset.
Helper used to pair up a symbol and its DWARF compile unit.
enum llvm::TargetFrameLowering::DwarfFrameBase::FrameBaseKind Kind
struct WasmFrameBase WasmLoc
union llvm::TargetFrameLowering::DwarfFrameBase::@249 Location
This struct describes target specific location.