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");
104 MacroLabelBegin =
Asm->createTempSymbol(
"cu_macro_begin");
111 if ((Skeleton || !
DD->useSplitDwarf()) && Label)
115 if ((!
DD->useSplitDwarf() || !Skeleton) &&
DD->getDwarfVersion() < 5)
118 bool UseAddrOffsetFormOrExpressions =
119 DD->useAddrOffsetForm() ||
DD->useAddrOffsetExpressions();
122 if (Label->isInSection() && UseAddrOffsetFormOrExpressions)
123 Base =
DD->getSectionLabel(&Label->getSection());
126 unsigned idx =
DD->getAddressPool().getIndex(Label);
128 DD->getDwarfVersion() >= 5 ? dwarf::DW_FORM_addrx
129 : dwarf::DW_FORM_GNU_addr_index,
136 assert(
DD->getDwarfVersion() >= 5 &&
137 "Addr+offset expressions are only valuable when using debug_addr (to "
138 "reduce relocations) available in DWARFv5 or higher");
139 if (
DD->useAddrOffsetExpressions()) {
146 DD->getAddressPool().getIndex(
Base), Label,
Base));
164 unsigned CUID =
Asm->OutStreamer->hasRawTextSupport() ? 0 :
getUniqueID();
166 return Asm->OutStreamer->emitDwarfFileDirective(0,
"",
"", std::nullopt,
169 if (LastFile != File) {
171 LastFileID =
Asm->OutStreamer->emitDwarfFileDirective(
172 0, File->getDirectory(), File->getFilename(),
DD->getMD5AsBytes(File),
173 File->getSource(), CUID);
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;
278 !
Asm->getObjFileLowering().supportDebugThreadLocalLocation())
282 addToAccelTable =
true;
284 DwarfExpr = std::make_unique<DIEDwarfExpression>(*
Asm, *
this, *
Loc);
291 if (
Asm->TM.getTargetTriple().isNVPTX() &&
DD->tuneForGDB()) {
292 unsigned LocalNVPTXAddressSpace;
297 NVPTXAddressSpace = LocalNVPTXAddressSpace;
300 DwarfExpr->addFragmentOffset(Expr);
307 auto GetPointerSizedFormAndOp = [
this]() {
308 unsigned PointerSize =
Asm->MAI->getCodePointerSize();
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()) {
320 if (
Asm->TM.getTargetTriple().isWasm()) {
326 addWasmRelocBaseGlobal(
Loc,
"__tls_base", 1);
328 addUInt(*
Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
329 }
else if (
Asm->TM.useEmulatedTLS()) {
334 if (!
DD->useSplitDwarf()) {
335 auto FormAndOp = GetPointerSizedFormAndOp();
337 addUInt(*
Loc, dwarf::DW_FORM_data1, FormAndOp.Op);
341 Asm->getObjFileLowering().getDebugThreadLocalSymbol(Sym));
343 addUInt(*
Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_const_index);
345 DD->getAddressPool().getIndex(Sym,
true));
349 DD->useGNUTLSOpcode() ? dwarf::DW_OP_GNU_push_tls_address
350 : dwarf::DW_OP_form_tls_address);
352 }
else if (
Asm->TM.getTargetTriple().isWasm() &&
357 addWasmRelocBaseGlobal(
Loc,
"__memory_base", 1);
359 addUInt(*
Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
362 !
Asm->getObjFileLowering()
365 auto FormAndOp = GetPointerSizedFormAndOp();
367 addUInt(*
Loc, dwarf::DW_FORM_data1, FormAndOp.Op);
370 Asm->getObjFileLowering().getIndirectSymViaRWPI(Sym));
372 Register BaseReg =
Asm->getObjFileLowering().getStaticBase();
373 unsigned DwarfBaseReg =
374 Asm->TM.getMCRegisterInfo()->getDwarfRegNum(BaseReg,
false);
375 addUInt(*
Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + DwarfBaseReg);
379 addUInt(*
Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
384 if (
Asm->TM.getTargetTriple().isNVPTX() &&
DD->tuneForGDB() &&
393 if (DwarfExpr->isUnknownLocation())
394 DwarfExpr->setMemoryLocationKind();
395 DwarfExpr->addExpression(Expr);
397 if (
Asm->TM.getTargetTriple().isNVPTX() &&
DD->tuneForGDB()) {
399 addUInt(*VariableDIE, dwarf::DW_AT_address_class, dwarf::DW_FORM_data1,
403 addBlock(*VariableDIE, dwarf::DW_AT_location, DwarfExpr->finalize());
405 if (
DD->useAllLinkageNames())
408 if (addToAccelTable) {
415 DD->useAllLinkageNames())
429 addString(NDie, dwarf::DW_AT_name, Name);
439 DD->insertSectionLabel(
Range.Begin);
441 auto *PrevCU =
DD->getPrevCU();
442 bool SameAsPrevCU =
this == PrevCU;
448 if (CURanges.empty() || !SameAsPrevCU ||
449 (&CURanges.back().End->getSection() !=
450 &
Range.End->getSection())) {
453 DD->terminateLineTable(PrevCU);
454 CURanges.push_back(
Range);
458 CURanges.back().End =
Range.End;
462 if (
CUNode->isDebugDirectivesOnly())
466 if (
DD->useSectionsAsReferences()) {
490 assert(Begin &&
"Begin label should not be null!");
491 assert(End &&
"End label should not be null!");
496 if (
DD->getDwarfVersion() >= 4 &&
511 const unsigned TI_GLOBAL_RELOC = 3;
523 addUInt(*
Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_WASM_location);
524 addSInt(*
Loc, dwarf::DW_FORM_sdata, TI_GLOBAL_RELOC);
534 addUInt(*Loc, dwarf::DW_FORM_data4, GlobalIndex);
548 for (
const auto &R :
Asm->MBBSectionRanges)
549 BB_List.
push_back({R.second.BeginLabel, R.second.EndLabel});
553 if (
DD->useAppleExtensionAttributes() &&
554 !
DD->getCurrentFunction()->getTarget().Options.DisableFramePointerElim(
555 *
DD->getCurrentFunction()))
556 addFlag(*SPDie, dwarf::DW_AT_APPLE_omit_frame_ptr);
560 *SPDie, dwarf::DW_AT_LLVM_stmt_sequence, LineTableSym,
561 Asm->getObjFileLowering().getDwarfLineSection()->getBeginSymbol());
569 switch (FrameBase.
Kind) {
573 addAddress(*SPDie, dwarf::DW_AT_frame_base, Location);
579 addUInt(*
Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_call_frame_cfa);
581 addUInt(*
Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_consts);
583 addUInt(*
Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
590 const unsigned TI_GLOBAL_RELOC = 3;
596 addWasmRelocBaseGlobal(
Loc,
"__stack_pointer",
598 addUInt(*
Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_stack_value);
616 DD->addSubprogramNames(*
this,
CUNode->getNameTableKind(), SP, *SPDie);
623 DIE &ParentScopeDIE) {
624 if (!Scope || !Scope->getScopeNode())
627 auto *DS = Scope->getScopeNode();
630 "Only handle inlined subprograms here, use "
631 "constructSubprogramScopeDIE for non-inlined "
637 assert(ScopeDIE &&
"Scope DIE should not be null.");
643 if (
DD->isLexicalScopeDIENull(Scope))
648 assert(ScopeDIE &&
"Scope DIE should not be null.");
657 HasRangeLists =
true;
661 (
DD->getDwarfVersion() < 5 && Skeleton ? Skeleton->DU :
DU)
662 ->addRange(*(Skeleton ? Skeleton :
this), std::move(
Range));
664 uint32_t Index = IndexAndList.first;
665 auto &
List = *IndexAndList.second;
672 if (
DD->getDwarfVersion() >= 5)
673 addUInt(ScopeDIE, dwarf::DW_AT_ranges, dwarf::DW_FORM_rnglistx, Index);
690 if (!
DD->useRangesSection() ||
691 (Ranges.size() == 1 &&
692 (!
DD->alwaysUseRanges(*
this) ||
693 DD->getSectionLabel(&Ranges.front().Begin->getSection()) ==
694 Ranges.front().Begin))) {
705 List.reserve(Ranges.size());
707 auto *BeginLabel =
DD->getLabelBeforeInsn(R.first);
708 auto *
EndLabel =
DD->getLabelAfterInsn(R.second);
710 const auto *BeginMBB = R.first->getParent();
711 const auto *EndMBB = R.second->getParent();
713 const auto *
MBB = BeginMBB;
721 if (
MBB->sameSection(EndMBB) ||
MBB->isEndSection()) {
722 auto MBBSectionRange =
Asm->MBBSectionRanges[
MBB->getSectionID()];
724 {
MBB->sameSection(BeginMBB) ? BeginLabel
725 : MBBSectionRange.BeginLabel,
726 MBB->sameSection(EndMBB) ?
EndLabel : MBBSectionRange.EndLabel});
728 if (
MBB->sameSection(EndMBB))
737 DIE &ParentScopeDIE) {
738 assert(Scope->getScopeNode());
739 auto *DS = Scope->getScopeNode();
743 DIE *OriginDIE = getAbstractScopeDIEs()[InlinedSP];
744 assert(OriginDIE &&
"Unable to find original DIE for an inlined subprogram.");
748 addDIEEntry(*ScopeDIE, dwarf::DW_AT_abstract_origin, *OriginDIE);
754 addUInt(*ScopeDIE, dwarf::DW_AT_call_file, std::nullopt,
756 addUInt(*ScopeDIE, dwarf::DW_AT_call_line, std::nullopt, IA->getLine());
758 addUInt(*ScopeDIE, dwarf::DW_AT_call_column, std::nullopt, IA->getColumn());
759 if (IA->getDiscriminator() &&
DD->getDwarfVersion() >= 4)
760 addUInt(*ScopeDIE, dwarf::DW_AT_GNU_discriminator, std::nullopt,
761 IA->getDiscriminator());
765 DD->addSubprogramNames(*
this,
CUNode->getNameTableKind(), InlinedSP,
774 if (
DD->isLexicalScopeDIENull(Scope))
776 const auto *DS = Scope->getScopeNode();
779 if (Scope->isAbstractScope()) {
781 "Abstract DIE for this scope exists!");
782 getAbstractScopeDIEs()[DS] = ScopeDIE;
785 if (!Scope->getInlinedAt()) {
786 assert(!LexicalBlockDIEs.count(DS) &&
787 "Concrete out-of-line DIE for this scope exists!");
788 LexicalBlockDIEs[DS] = ScopeDIE;
790 InlinedLocalScopeDIEs[DS].push_back(ScopeDIE);
808 applyConcreteDbgVariableAttributes(V, DV, *VariableDie);
815void DwarfCompileUnit::applyConcreteDbgVariableAttributes(
822 addUInt(VariableDie, dwarf::DW_AT_address_class, dwarf::DW_FORM_data1,
827 if (Entry->isLocation()) {
829 }
else if (
Entry->isInt()) {
830 auto *Expr =
Single.getExpr();
831 if (Expr && Expr->getNumElements()) {
833 DIEDwarfExpression DwarfExpr(*
Asm, *
this, *Loc);
835 DwarfExpr.addFragmentOffset(Expr);
836 DwarfExpr.addUnsignedConstant(
Entry->getInt());
837 DwarfExpr.addExpression(Expr);
838 addBlock(VariableDie, dwarf::DW_AT_location, DwarfExpr.finalize());
839 if (DwarfExpr.TagOffset)
840 addUInt(VariableDie, dwarf::DW_AT_LLVM_tag_offset,
841 dwarf::DW_FORM_data1, *DwarfExpr.TagOffset);
844 }
else if (
Entry->isConstantFP()) {
846 }
else if (
Entry->isConstantInt()) {
848 }
else if (
Entry->isTargetIndexLocation()) {
850 DIEDwarfExpression DwarfExpr(*
Asm, *
this, *Loc);
854 addBlock(VariableDie, dwarf::DW_AT_location, DwarfExpr.finalize());
861 return Entry.isLocation() && !Entry.getLoc().getReg();
864 const DIExpression *Expr =
Single.getExpr();
865 assert(Expr &&
"Variadic Debug Value must have an Expression.");
867 DIEDwarfExpression DwarfExpr(*
Asm, *
this, *Loc);
868 DwarfExpr.addFragmentOffset(Expr);
869 DIExpressionCursor Cursor(Expr);
870 const TargetRegisterInfo &
TRI = *
Asm->MF->getSubtarget().getRegisterInfo();
872 auto AddEntry = [&](
const DbgValueLocEntry &
Entry,
873 DIExpressionCursor &Cursor) {
874 if (
Entry.isLocation()) {
875 if (!DwarfExpr.addMachineRegExpression(
TRI, Cursor,
876 Entry.getLoc().getReg()))
878 }
else if (
Entry.isInt()) {
880 DwarfExpr.addUnsignedConstant(
Entry.getInt());
881 }
else if (
Entry.isConstantFP()) {
886 APInt RawBytes =
Entry.getConstantFP()->getValueAPF().bitcastToAPInt();
890 }
else if (
Entry.isConstantInt()) {
891 APInt RawBytes =
Entry.getConstantInt()->getValue();
895 }
else if (
Entry.isTargetIndexLocation()) {
896 TargetIndexLocation Loc =
Entry.getTargetIndexLocation();
899 assert(
Asm->TM.getTargetTriple().isWasm());
900 DwarfExpr.addWasmLocation(Loc.
Index,
static_cast<uint64_t
>(Loc.
Offset));
907 if (!DwarfExpr.addExpression(
909 [&](
unsigned Idx, DIExpressionCursor &Cursor) ->
bool {
910 return AddEntry(DVal->getLocEntries()[Idx], Cursor);
915 addBlock(VariableDie, dwarf::DW_AT_location, DwarfExpr.finalize());
916 if (DwarfExpr.TagOffset)
917 addUInt(VariableDie, dwarf::DW_AT_LLVM_tag_offset, dwarf::DW_FORM_data1,
918 *DwarfExpr.TagOffset);
921void DwarfCompileUnit::applyConcreteDbgVariableAttributes(
927 addUInt(VariableDie, dwarf::DW_AT_LLVM_tag_offset, dwarf::DW_FORM_data1,
931void DwarfCompileUnit::applyConcreteDbgVariableAttributes(
const Loc::MMI &MMI,
934 std::optional<unsigned> NVPTXAddressSpace;
936 DIEDwarfExpression DwarfExpr(*
Asm, *
this, *Loc);
939 const DIExpression *Expr = Fragment.Expr;
940 const TargetFrameLowering *TFI =
Asm->MF->getSubtarget().getFrameLowering();
943 DwarfExpr.addFragmentOffset(Expr);
945 auto *
TRI =
Asm->MF->getSubtarget().getRegisterInfo();
946 SmallVector<uint64_t, 8>
Ops;
947 TRI->getOffsetOpcodes(Offset,
Ops);
952 if (
Asm->TM.getTargetTriple().isNVPTX() &&
DD->tuneForGDB()) {
953 unsigned LocalNVPTXAddressSpace;
954 const DIExpression *NewExpr =
956 if (NewExpr != Expr) {
958 NVPTXAddressSpace = LocalNVPTXAddressSpace;
963 DIExpressionCursor Cursor(
Ops);
964 DwarfExpr.setMemoryLocationKind();
965 if (
const MCSymbol *FrameSymbol =
Asm->getFunctionFrameSymbol())
968 DwarfExpr.addMachineRegExpression(
969 *
Asm->MF->getSubtarget().getRegisterInfo(), Cursor, FrameReg);
970 DwarfExpr.addExpression(std::move(Cursor));
972 if (
Asm->TM.getTargetTriple().isNVPTX() &&
DD->tuneForGDB()) {
974 addUInt(VariableDie, dwarf::DW_AT_address_class, dwarf::DW_FORM_data1,
977 addBlock(VariableDie, dwarf::DW_AT_location, DwarfExpr.finalize());
978 if (DwarfExpr.TagOffset)
979 addUInt(VariableDie, dwarf::DW_AT_LLVM_tag_offset, dwarf::DW_FORM_data1,
980 *DwarfExpr.TagOffset);
983void DwarfCompileUnit::applyConcreteDbgVariableAttributes(
987 DIEDwarfExpression DwarfExpr(*
Asm, *
this, *Loc);
990 DwarfExpr.addFragmentOffset(&Expr);
992 DwarfExpr.beginEntryValueExpression(Cursor);
993 DwarfExpr.addMachineRegExpression(
994 *
Asm->MF->getSubtarget().getRegisterInfo(), Cursor,
Register);
995 DwarfExpr.addExpression(std::move(Cursor));
997 addBlock(VariableDie, dwarf::DW_AT_location, DwarfExpr.finalize());
1000void DwarfCompileUnit::applyConcreteDbgVariableAttributes(
1001 const std::monostate &,
const DbgVariable &DV,
DIE &VariableDie) {}
1005 DIE *&ObjectPointer) {
1008 ObjectPointer = Var;
1016 DL.setDIE(*LabelDie);
1018 if (Scope.isAbstractScope())
1028 if (!Array || Array->getTag() != dwarf::DW_TAG_array_type)
1030 if (
auto *DLVar = Array->getDataLocation())
1031 Result.push_back(DLVar);
1032 if (
auto *AsVar = Array->getAssociated())
1033 Result.push_back(AsVar);
1034 if (
auto *AlVar = Array->getAllocated())
1035 Result.push_back(AlVar);
1036 for (
auto *El : Array->getElements()) {
1038 if (
auto Count = Subrange->getCount())
1040 Result.push_back(Dependency);
1041 if (
auto LB = Subrange->getLowerBound())
1043 Result.push_back(Dependency);
1044 if (
auto UB = Subrange->getUpperBound())
1046 Result.push_back(Dependency);
1047 if (
auto ST = Subrange->getStride())
1049 Result.push_back(Dependency);
1051 if (
auto Count = GenericSubrange->getCount())
1053 Result.push_back(Dependency);
1054 if (
auto LB = GenericSubrange->getLowerBound())
1056 Result.push_back(Dependency);
1057 if (
auto UB = GenericSubrange->getUpperBound())
1059 Result.push_back(Dependency);
1060 if (
auto ST = GenericSubrange->getStride())
1062 Result.push_back(Dependency);
1083 DbgVar.
insert({Var->getVariable(), Var});
1088 while (!WorkList.
empty()) {
1089 auto Item = WorkList.
back();
1091 bool visitedAllDependencies = Item.getInt();
1097 if (Visited.
count(Var))
1101 if (visitedAllDependencies) {
1103 Result.push_back(Var);
1108 auto Res = Visiting.
insert(Var);
1110 assert(
false &&
"dependency cycle in local variables");
1134 assert(!Scope->getInlinedAt());
1135 assert(!Scope->isAbstractScope());
1140 addDIEEntry(ScopeDIE, dwarf::DW_AT_object_pointer, *ObjectPointer);
1149 if (FnArgs.
size() > 1 && !FnArgs[FnArgs.
size() - 1] &&
1159 DIE *ObjectPointer =
nullptr;
1162 auto Vars =
DU->getScopeVariables().lookup(Scope);
1163 for (
auto &DV : Vars.Args)
1172 for (
DbgLabel *
DL :
DU->getScopeLabels().lookup(Scope))
1179 auto &LocalDecls =
DD->getLocalDeclsForScope(Scope->getScopeNode());
1180 DeferredLocalDecls.insert_range(LocalDecls);
1184 auto skipLexicalScope = [
this](
LexicalScope *S) ->
bool {
1187 auto Vars =
DU->getScopeVariables().lookup(S);
1188 if (!Vars.Args.empty() || !Vars.Locals.empty())
1191 DD->getLocalDeclsForScope(S->getScopeNode()).empty();
1196 if (skipLexicalScope(LS))
1202 return ObjectPointer;
1207 if (
auto *AbsDef = getAbstractScopeDIEs().
lookup(SP))
1210 auto [ContextDIE, ContextCU] = getOrCreateAbstractSubprogramContextDIE(SP);
1211 return createAbstractSubprogramDIE(SP, ContextDIE, ContextCU);
1214DIE &DwarfCompileUnit::createAbstractSubprogramDIE(
1219 *ContextDIE,
nullptr);
1222 ContextCU->getAbstractScopeDIEs()[SP] = &AbsDef;
1225 ContextCU->
addSInt(AbsDef, dwarf::DW_AT_inline,
1227 : dwarf::DW_FORM_implicit_const,
1233std::pair<DIE *, DwarfCompileUnit *>
1234DwarfCompileUnit::getOrCreateAbstractSubprogramContextDIE(
1240 if (
auto *SPDecl = SP->getDeclaration())
1249 return std::make_pair(ContextDIE, ContextCU);
1257 if (!getFinalizedAbstractSubprograms().insert(SP).second)
1260 auto [ContextDIE, ContextCU] = getOrCreateAbstractSubprogramContextDIE(SP);
1261 DIE *AbsDef = getAbstractScopeDIEs().lookup(SP);
1263 AbsDef = &createAbstractSubprogramDIE(SP, ContextDIE, ContextCU);
1266 ContextCU->
addDIEEntry(*AbsDef, dwarf::DW_AT_object_pointer,
1271 return DD->getDwarfVersion() <= 4 && !
DD->tuneForLLDB();
1278 case dwarf::DW_TAG_call_site:
1279 return dwarf::DW_TAG_GNU_call_site;
1280 case dwarf::DW_TAG_call_site_parameter:
1281 return dwarf::DW_TAG_GNU_call_site_parameter;
1292 case dwarf::DW_AT_call_all_calls:
1293 return dwarf::DW_AT_GNU_all_call_sites;
1294 case dwarf::DW_AT_call_target:
1295 return dwarf::DW_AT_GNU_call_site_target;
1296 case dwarf::DW_AT_call_origin:
1297 return dwarf::DW_AT_abstract_origin;
1298 case dwarf::DW_AT_call_return_pc:
1299 return dwarf::DW_AT_low_pc;
1300 case dwarf::DW_AT_call_value:
1301 return dwarf::DW_AT_GNU_call_site_value;
1302 case dwarf::DW_AT_call_tail_call:
1303 return dwarf::DW_AT_GNU_tail_call;
1314 case dwarf::DW_OP_entry_value:
1315 return dwarf::DW_OP_GNU_entry_value;
1324 unsigned CallReg,
DIType *AllocSiteTy) {
1333 }
else if (CalleeSP) {
1335 assert(CalleeDIE &&
"Could not create DIE for call site entry origin");
1337 !CalleeSP->isDefinition() &&
1373 assert(PCAddr &&
"Missing return PC information for a call");
1379 addType(CallSiteDIE, AllocSiteTy, dwarf::DW_AT_LLVM_alloc_type);
1386 for (
const auto &Param : Params) {
1387 unsigned Register = Param.getRegister();
1388 auto CallSiteDieParam =
1392 addAddress(*CallSiteDieParam, dwarf::DW_AT_location,
1404 CallSiteDIE.
addChild(CallSiteDieParam);
1413 auto *Entity =
Module->getEntity();
1422 if (
auto *AbsSPDie = getAbstractScopeDIEs().
lookup(SP))
1423 EntityDie = AbsSPDie;
1433 EntityDie =
getDIE(Entity);
1436 addDIEEntry(*IMDie, dwarf::DW_AT_import, *EntityDie);
1438 if (!Name.empty()) {
1439 addString(*IMDie, dwarf::DW_AT_name, Name);
1446 DD->addAccelNamespace(*
this,
CUNode->getNameTableKind(), Name, *IMDie);
1451 DINodeArray Elements =
Module->getElements();
1452 for (
const auto *Element : Elements) {
1470 assert(ContextDIE &&
"Empty scope for the imported entity!");
1479 if (
DIE *AbsSPDIE = getAbstractScopeDIEs().
lookup(SP)) {
1482 addDIEEntry(*
D, dwarf::DW_AT_abstract_origin, *AbsSPDIE);
1494 auto *Die = Entity->
getDIE();
1498 if (AbsEntity && AbsEntity->
getDIE()) {
1513 const auto *Sym = Label->getSymbol();
1520 if (
StringRef Name = Label->getName(); !Name.empty())
1526 if (
auto *AbsLSDie = getAbstractScopeDIEs().
lookup(LS))
1527 addDIEEntry(*ScopeDIE, dwarf::DW_AT_abstract_origin, *AbsLSDie);
1530 for (
auto [LScope, ScopeDIE] : LexicalBlockDIEs)
1531 AttachAO(LScope, ScopeDIE);
1532 for (
auto &[LScope, ScopeDIEs] : InlinedLocalScopeDIEs)
1533 for (
auto *ScopeDIE : ScopeDIEs)
1534 AttachAO(LScope, ScopeDIE);
1538 auto &AbstractEntities = getAbstractEntities();
1539 auto I = AbstractEntities.find(
Node);
1540 if (
I != AbstractEntities.end())
1541 return I->second.get();
1547 assert(Scope && Scope->isAbstractScope());
1548 auto &Entity = getAbstractEntities()[
Node];
1554 Entity = std::make_unique<DbgLabel>(
1562 if (!Skeleton && !
DD->useSectionsAsReferences()) {
1568 :
DD->useSplitDwarf() ? dwarf::DW_UT_skeleton
1569 : dwarf::DW_UT_compile;
1571 if (
DD->getDwarfVersion() >= 5 && UT != dwarf::DW_UT_compile)
1576 switch (
CUNode->getNameTableKind()) {
1587 !
CUNode->isDebugDirectivesOnly() &&
1589 DD->getDwarfVersion() < 5;
1600 GlobalNames[FullName] = &Die;
1612 GlobalNames.insert(std::make_pair(std::move(FullName), &
getUnitDie()));
1621 GlobalTypes[FullName] = &Die;
1633 GlobalTypes.insert(std::make_pair(std::move(FullName), &
getUnitDie()));
1638 auto *Single = std::get_if<Loc::Single>(&DV);
1639 if (Single && Single->getExpr())
1642 addAddress(Die, dwarf::DW_AT_location, Location);
1650 if (Location.isIndirect())
1663 addUInt(Die, dwarf::DW_AT_LLVM_tag_offset, dwarf::DW_FORM_data1,
1693 addUInt(Die, dwarf::DW_AT_LLVM_tag_offset, dwarf::DW_FORM_data1,
1701 ? dwarf::DW_FORM_loclistx
1702 :
DD->getDwarfSectionOffsetForm();
1710 addString(VariableDie, dwarf::DW_AT_name, Name);
1713 if (
uint32_t AlignInBytes = DIVar->getAlignInBytes())
1714 addUInt(VariableDie, dwarf::DW_AT_alignment, dwarf::DW_FORM_udata,
1722 addFlag(VariableDie, dwarf::DW_AT_artificial);
1729 addString(LabelDie, dwarf::DW_AT_name, Name);
1730 const auto *
DILabel = Label.getLabel();
1733 addFlag(LabelDie, dwarf::DW_AT_artificial);
1735 addUInt(LabelDie, dwarf::DW_AT_LLVM_coro_suspend_idx, std::nullopt,
1747 auto *SPDecl = SP->getDeclaration();
1748 auto *Context = SPDecl ? SPDecl->getScope() : SP->getScope();
1753bool DwarfCompileUnit::isDwoUnit()
const {
1763 (
DD->useSplitDwarf() && !Skeleton);
1772 MCSymbol *Label =
DD->getAddressPool().getLabel();
1774 DD->getDwarfVersion() >= 5 ? dwarf::DW_AT_addr_base
1775 : dwarf::DW_AT_GNU_addr_base,
1796 addUInt(Die, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1, Btr.Encoding);
1803 addUInt(Die, dwarf::DW_AT_byte_size, std::nullopt,
1811 bool isAbstract = getAbstractScopeDIEs().count(LB->
getSubprogram());
1813 auto &DIEs = getAbstractScopeDIEs();
1814 if (
auto It = DIEs.find(LB); It != DIEs.end())
1817 assert(!isAbstract &&
"Missed lexical block DIE in abstract tree!");
1820 return LexicalBlockDIEs.lookup(LB);
1826 Context = LFScope->getNonLexicalBlockFileScope();
1832 const auto &DIEs = getAbstractScopeDIEs();
1833 if (
auto It = DIEs.find(SPScope); It != DIEs.end())
1842 if (!
F && SP->isDefinition()) {
1843 F =
DD->getLexicalScopes().getFunction(SP);
1848 return &
DD->getOrCreateAbstractSubprogramCU(SP, *
this)
1849 .getOrCreateAbstractSubprogramDIE(SP);
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")
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.
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
Register const TargetRegisterInfo * TRI
Promote Memory to Register
NVPTX address space definition.
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
This file defines the SmallString class.
uint64_t getZExtValue() const
Get zero extended value.
unsigned getBitWidth() const
Return the number of bits in the APInt.
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.
TargetMachine & TM
Target machine description.
const DataLayout & getDataLayout() const
Return information about data layout.
MCSymbol * GetExternalSymbolSymbol(const Twine &Sym) const
Return the MCSymbol for the specified ExternalSymbol.
Functions, function parameters, and return types can have attributes to indicate how they should be t...
unsigned getLineNo() const
StringRef getName() const
DIScope * getScope() const
DIGlobalVariable * getDecl() const
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 <DWARFAddress Space> DW_OP_swap DW_O...
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.
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...
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.
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 & getOrCreateAbstractSubprogramDIE(const DISubprogram *SP)
Create an abstract subprogram DIE, that should later be populated by constructAbstractSubprogramScope...
DIE & constructSubprogramScopeDIE(const DISubprogram *Sub, const Function &F, LexicalScope *Scope, MCSymbol *LineTableSym)
Construct a DIE for this subprogram scope.
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.
DIE & updateSubprogramScopeDIE(const DISubprogram *SP, const Function &F, 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 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 * getOrCreateSubprogramDIE(const DISubprogram *SP, const Function *F, bool Minimal=false) override
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, const Function *CalleeF, 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 and ...
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.
uint16_t getDwarfVersion() const
Returns the Dwarf Version.
DwarfCompileUnit * lookupCU(const DIE *Die)
Find the matching DwarfCompileUnit for the given CU DIE.
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.
void addAccelName(const DwarfUnit &Unit, const DICompileUnit::DebugNameTableKind NameTableKind, StringRef Name, const DIE &Die)
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.
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.
bool shouldPlaceInUnitDIE(const DISubprogram *SP, bool Minimal)
const DICompileUnit * CUNode
MDNode for the compile unit.
virtual DIE * getOrCreateSubprogramDIE(const DISubprogram *SP, const Function *FnHint, bool Minimal=false)
DIE * getOrCreateSubprogramContextDIE(const DISubprogram *SP, bool IgnoreScope)
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.
DwarfUnit(dwarf::Tag, const DICompileUnit *Node, AsmPrinter *A, DwarfDebug *DW, DwarfFile *DWU, unsigned UniqueID=0)
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.
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.
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.
Base class for the full range of assembler expressions which are needed for parsing.
MCSection * getDwarfRangesSection() const
MCSection * getDwarfAddrSection() const
MCSection * getDwarfLineSection() const
MCSymbol * getBeginSymbol()
void setType(wasm::WasmSymbolType type)
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).
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.
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 push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StringRef - Represent a constant reference to a string, i.e.
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...
const Triple & getTargetTriple() const
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
bool isNVPTX() const
Tests whether the target is NVPTX (32- or 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.
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.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
auto dyn_cast_if_present(const Y &Val)
dyn_cast_if_present<X> - Functionally identical to dyn_cast, except that a null (or none in the case ...
bool isRangeRelaxable(const MCSymbol *Begin, const MCSymbol *End)
bool isa_and_nonnull(const Y &Val)
std::pair< const MachineInstr *, const MachineInstr * > InsnRange
This is used to track range of instructions with identical lexical scope.
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.
FunctionAddr VTableAddr Count
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
@ 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
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
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.
union llvm::TargetFrameLowering::DwarfFrameBase::@004076321055032247336074224075335064105264310375 Location
enum llvm::TargetFrameLowering::DwarfFrameBase::FrameBaseKind Kind
struct WasmFrameBase WasmLoc