LLVM 24.0.0git
DwarfCompileUnit.cpp
Go to the documentation of this file.
1//===- llvm/CodeGen/DwarfCompileUnit.cpp - Dwarf Compile Units ------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file contains support for constructing a dwarf compile unit.
10//
11//===----------------------------------------------------------------------===//
12
13#include "DwarfCompileUnit.h"
14#include "AddressPool.h"
15#include "DwarfExpression.h"
16#include "llvm/ADT/STLExtras.h"
20#include "llvm/CodeGen/DIE.h"
26#include "llvm/IR/DataLayout.h"
27#include "llvm/IR/DebugInfo.h"
29#include "llvm/MC/MCAsmInfo.h"
30#include "llvm/MC/MCSection.h"
31#include "llvm/MC/MCStreamer.h"
32#include "llvm/MC/MCSymbol.h"
38#include <optional>
39#include <string>
40#include <utility>
41
42using namespace llvm;
43
44/// Query value using AddLinkageNamesToDeclCallOriginsForTuning.
46 "add-linkage-names-to-declaration-call-origins", cl::Hidden,
47 cl::desc("Add DW_AT_linkage_name to function declaration DIEs "
48 "referenced by DW_AT_call_origin attributes. Enabled by default "
49 "for -gsce debugger tuning."));
50
52 "emit-func-debug-line-table-offsets", cl::Hidden,
53 cl::desc("Include line table offset in function's debug info and emit end "
54 "sequence after each function's line data."),
55 cl::init(false));
56
58 bool EnabledByDefault = DD->tuneForSCE();
59 if (EnabledByDefault)
62}
63
65
66 // According to DWARF Debugging Information Format Version 5,
67 // 3.1.2 Skeleton Compilation Unit Entries:
68 // "When generating a split DWARF object file (see Section 7.3.2
69 // on page 187), the compilation unit in the .debug_info section
70 // is a "skeleton" compilation unit with the tag DW_TAG_skeleton_unit"
71 if (DW->getDwarfVersion() >= 5 && Kind == UnitKind::Skeleton)
72 return dwarf::DW_TAG_skeleton_unit;
73
74 return dwarf::DW_TAG_compile_unit;
75}
76
79 DwarfFile *DWU, UnitKind Kind)
80 : DwarfUnit(GetCompileUnitType(Kind, DW), Node, A, DW, DWU, UID) {
82 MacroLabelBegin = Asm->createTempSymbol("cu_macro_begin");
84}
85
86/// addLabelAddress - Add a dwarf label attribute data and value using
87/// DW_FORM_addr or DW_FORM_GNU_addr_index.
89 const MCSymbol *Label) {
90 if ((Skeleton || !DD->useSplitDwarf()) && Label)
91 DD->addArangeLabel(SymbolCU(this, Label));
92
93 // Don't use the address pool in non-fission or in the skeleton unit itself.
94 if ((!DD->useSplitDwarf() || !Skeleton) && DD->getDwarfVersion() < 5)
95 return addLocalLabelAddress(Die, Attribute, Label);
96
97 bool UseAddrOffsetFormOrExpressions =
98 DD->useAddrOffsetForm() || DD->useAddrOffsetExpressions();
99
100 const MCSymbol *Base = nullptr;
101 if (Label->isInSection() && UseAddrOffsetFormOrExpressions)
102 Base = DD->getSectionLabel(&Label->getSection());
103
104 if (!Base || Base == Label) {
105 unsigned idx = DD->getAddressPool().getIndex(Label);
107 DD->getDwarfVersion() >= 5 ? dwarf::DW_FORM_addrx
108 : dwarf::DW_FORM_GNU_addr_index,
109 DIEInteger(idx));
110 return;
111 }
112
113 // Could be extended to work with DWARFv4 Split DWARF if that's important for
114 // someone. In that case DW_FORM_data would be used.
115 assert(DD->getDwarfVersion() >= 5 &&
116 "Addr+offset expressions are only valuable when using debug_addr (to "
117 "reduce relocations) available in DWARFv5 or higher");
118 if (DD->useAddrOffsetExpressions()) {
119 auto *Loc = new (DIEValueAllocator) DIEBlock();
120 addPoolOpAddress(*Loc, Label);
121 addBlock(Die, Attribute, dwarf::DW_FORM_exprloc, Loc);
122 } else
123 addAttribute(Die, Attribute, dwarf::DW_FORM_LLVM_addrx_offset,
125 DD->getAddressPool().getIndex(Base), Label, Base));
126}
127
130 const MCSymbol *Label) {
131 if (Label)
132 addAttribute(Die, Attribute, dwarf::DW_FORM_addr, DIELabel(Label));
133 else
134 addAttribute(Die, Attribute, dwarf::DW_FORM_addr, DIEInteger(0));
135}
136
138 // If we print assembly, we can't separate .file entries according to
139 // compile units. Thus all files will belong to the default compile unit.
140
141 // FIXME: add a better feature test than hasRawTextSupport. Even better,
142 // extend .file to support this.
143 unsigned CUID = Asm->OutStreamer->hasRawTextSupport() ? 0 : getUniqueID();
144 if (!File)
145 return Asm->OutStreamer->emitDwarfFileDirective(0, "", "", std::nullopt,
146 std::nullopt, CUID);
147
148 if (LastFile != File) {
149 LastFile = File;
150 LastFileID = Asm->OutStreamer->emitDwarfFileDirective(
151 0, File->getDirectory(), File->getFilename(), DD->getMD5AsBytes(File),
152 File->getSource(), CUID);
153 }
154 return LastFileID;
155}
156
158 const DIGlobalVariable *GV, ArrayRef<GlobalExpr> GlobalExprs) {
159 // Check for pre-existence.
160 if (DIE *Die = getDIE(GV))
161 return Die;
162
163 assert(GV);
164
165 auto *GVContext = GV->getScope();
166 const DIType *GTy = GV->getType();
167
168 auto *CB = GVContext ? dyn_cast<DICommonBlock>(GVContext) : nullptr;
169 DIE *ContextDIE = CB ? getOrCreateCommonBlock(CB, GlobalExprs)
170 : getOrCreateContextDIE(GVContext);
171
172 // Add to map.
173 DIE *VariableDIE = &createAndAddDIE(GV->getTag(), *ContextDIE, GV);
175 if (auto *SDMDecl = GV->getStaticDataMemberDeclaration()) {
176 DeclContext = SDMDecl->getScope();
177 assert(SDMDecl->isStaticMember() && "Expected static member decl");
178 assert(GV->isDefinition());
179 // We need the declaration DIE that is in the static member's class.
180 DIE *VariableSpecDIE = getOrCreateStaticMemberDIE(SDMDecl);
181 addDIEEntry(*VariableDIE, dwarf::DW_AT_specification, *VariableSpecDIE);
182 // If the global variable's type is different from the one in the class
183 // member type, assume that it's more specific and also emit it.
184 if (GTy != SDMDecl->getBaseType())
185 addType(*VariableDIE, GTy);
186 } else {
187 DeclContext = GV->getScope();
188 // Add name and type.
189 StringRef DisplayName = GV->getDisplayName();
190 if (!DisplayName.empty())
191 addString(*VariableDIE, dwarf::DW_AT_name, GV->getDisplayName());
192 if (GTy)
193 addType(*VariableDIE, GTy);
194
195 // Add scoping info.
196 if (!GV->isLocalToUnit())
197 addFlag(*VariableDIE, dwarf::DW_AT_external);
198
199 // Add line number info.
200 addSourceLine(*VariableDIE, GV);
201 }
202
203 if (!GV->isDefinition())
204 addFlag(*VariableDIE, dwarf::DW_AT_declaration);
205 else
206 addGlobalName(GV->getName(), *VariableDIE, DeclContext);
207
208 addAnnotation(*VariableDIE, GV->getAnnotations());
209
210 if (uint32_t AlignInBytes = GV->getAlignInBytes())
211 addUInt(*VariableDIE, dwarf::DW_AT_alignment, dwarf::DW_FORM_udata,
212 AlignInBytes);
213
214 if (MDTuple *TP = GV->getTemplateParams())
215 addTemplateParams(*VariableDIE, DINodeArray(TP));
216
217 // Add location.
218 addLocationAttribute(VariableDIE, GV, GlobalExprs);
219
220 return VariableDIE;
221}
222
224 DIE *VariableDIE, const DIGlobalVariable *GV, ArrayRef<GlobalExpr> GlobalExprs) {
225 bool addToAccelTable = false;
226 DIELoc *Loc = nullptr;
227 std::optional<unsigned> TargetAddrSpace;
228 std::unique_ptr<DIEDwarfExpression> DwarfExpr;
229 const GlobalVariable *LastGlobal = nullptr;
230 for (const auto &GE : GlobalExprs) {
231 const GlobalVariable *Global = GE.Var;
232 const DIExpression *Expr = GE.Expr;
233
234 // For compatibility with DWARF 3 and earlier,
235 // DW_AT_location(DW_OP_constu, X, DW_OP_stack_value) or
236 // DW_AT_location(DW_OP_consts, X, DW_OP_stack_value) becomes
237 // DW_AT_const_value(X).
238 if (GlobalExprs.size() == 1 && Expr && Expr->isConstant()) {
239 addToAccelTable = true;
241 *VariableDIE,
243 *Expr->isConstant(),
244 Expr->getConstantValue());
245 break;
246 }
247
248 // We cannot describe the location of dllimport'd variables: the
249 // computation of their address requires loads from the IAT.
250 if (Global && Global->hasDLLImportStorageClass())
251 continue;
252
253 // Nothing to describe without address or constant.
254 if (!Global && (!Expr || !Expr->isConstant()))
255 continue;
256
257 if (Global && Global->isThreadLocal() &&
258 !Asm->getObjFileLowering().supportDebugThreadLocalLocation())
259 continue;
260
261 if (!Loc) {
262 addToAccelTable = true;
264 DwarfExpr = std::make_unique<DIEDwarfExpression>(*Asm, *this, *Loc);
265 }
266
267 if (Expr) {
268 Expr = DD->adjustExpressionForTarget(Expr, TargetAddrSpace);
269 DwarfExpr->addFragmentOffset(Expr);
270 }
271
272 if (Global) {
273 const MCSymbol *Sym = Asm->getSymbol(Global);
274 // 16-bit platforms like MSP430 and AVR take this path, so sink this
275 // assert to platforms that use it.
276 auto GetPointerSizedFormAndOp = [this]() {
277 unsigned PointerSize = Asm->MAI.getCodePointerSize();
278 assert((PointerSize == 4 || PointerSize == 8) &&
279 "Add support for other sizes if necessary");
280 struct FormAndOp {
281 dwarf::Form Form;
283 };
284 return PointerSize == 4
285 ? FormAndOp{dwarf::DW_FORM_data4, dwarf::DW_OP_const4u}
286 : FormAndOp{dwarf::DW_FORM_data8, dwarf::DW_OP_const8u};
287 };
288 if (Global->isThreadLocal()) {
289 if (Asm->TM.getTargetTriple().isWasm()) {
290 // FIXME This is not guaranteed, but in practice, in static linking,
291 // if present, __tls_base's index is 1. This doesn't hold for dynamic
292 // linking, so TLS variables used in dynamic linking won't have
293 // correct debug info for now. See
294 // https://github.com/llvm/llvm-project/blob/19afbfe33156d211fa959dadeea46cd17b9c723c/lld/wasm/Driver.cpp#L786-L823
295 addWasmRelocBaseGlobal(Loc, "__tls_base", 1);
296 addOpAddress(*Loc, Sym);
297 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
298 } else if (Asm->TM.useEmulatedTLS()) {
299 // TODO: add debug info for emulated thread local mode.
300 } else {
301 // FIXME: Make this work with -gsplit-dwarf.
302 // Based on GCC's support for TLS:
303 if (!DD->useSplitDwarf()) {
304 auto FormAndOp = GetPointerSizedFormAndOp();
305 // 1) Start with a constNu of the appropriate pointer size
306 addUInt(*Loc, dwarf::DW_FORM_data1, FormAndOp.Op);
307 // 2) containing the (relocated) offset of the TLS variable
308 // within the module's TLS block.
309 addExpr(*Loc, FormAndOp.Form,
310 Asm->getObjFileLowering().getDebugThreadLocalSymbol(Sym));
311 } else {
312 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_const_index);
313 addUInt(*Loc, dwarf::DW_FORM_udata,
314 DD->getAddressPool().getIndex(Sym, /* TLS */ true));
315 }
316 // 3) followed by an OP to make the debugger do a TLS lookup.
317 addUInt(*Loc, dwarf::DW_FORM_data1,
318 DD->useGNUTLSOpcode() ? dwarf::DW_OP_GNU_push_tls_address
319 : dwarf::DW_OP_form_tls_address);
320 }
321 } else if (Asm->TM.getTargetTriple().isWasm() &&
322 Asm->TM.getRelocationModel() == Reloc::PIC_) {
323 // FIXME This is not guaranteed, but in practice, if present,
324 // __memory_base's index is 1. See
325 // https://github.com/llvm/llvm-project/blob/19afbfe33156d211fa959dadeea46cd17b9c723c/lld/wasm/Driver.cpp#L786-L823
326 addWasmRelocBaseGlobal(Loc, "__memory_base", 1);
327 addOpAddress(*Loc, Sym);
328 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
329 } else if ((Asm->TM.getRelocationModel() == Reloc::RWPI ||
330 Asm->TM.getRelocationModel() == Reloc::ROPI_RWPI) &&
331 !Asm->getObjFileLowering()
332 .getKindForGlobal(Global, Asm->TM)
333 .isReadOnly()) {
334 auto FormAndOp = GetPointerSizedFormAndOp();
335 // Constant
336 addUInt(*Loc, dwarf::DW_FORM_data1, FormAndOp.Op);
337 // Relocation offset
338 addExpr(*Loc, FormAndOp.Form,
339 Asm->getObjFileLowering().getIndirectSymViaRWPI(Sym));
340 // Base register
341 Register BaseReg = Asm->getObjFileLowering().getStaticBase();
342 unsigned DwarfBaseReg =
343 Asm->TM.getMCRegisterInfo().getDwarfRegNum(BaseReg, false);
344 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + DwarfBaseReg);
345 // Offset from base register
346 addSInt(*Loc, dwarf::DW_FORM_sdata, 0);
347 // Operation
348 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
349 } else {
350 DD->addArangeLabel(SymbolCU(this, Sym));
351 addOpAddress(*Loc, Sym);
352 }
353 LastGlobal = Global;
354 }
355 // Global variables attached to symbols are memory locations.
356 // It would be better if this were unconditional, but malformed input that
357 // mixes non-fragments and fragments for the same variable is too expensive
358 // to detect in the verifier.
359 if (DwarfExpr->isUnknownLocation())
360 DwarfExpr->setMemoryLocationKind();
361 DwarfExpr->addExpression(Expr);
362 }
363 DD->addTargetVariableAttributes(*this, *VariableDIE, TargetAddrSpace,
365 LastGlobal);
366 if (Loc)
367 addBlock(*VariableDIE, dwarf::DW_AT_location, DwarfExpr->finalize());
368
369 if (DD->useAllLinkageNames())
370 addLinkageName(*VariableDIE, GV->getLinkageName());
371
372 if (addToAccelTable) {
373 DD->addAccelName(*this, CUNode->getNameTableKind(), GV->getName(),
374 *VariableDIE);
375
376 // If the linkage name is different than the name, go ahead and output
377 // that as well into the name table.
378 if (GV->getLinkageName() != "" && GV->getName() != GV->getLinkageName() &&
379 DD->useAllLinkageNames())
380 DD->addAccelName(*this, CUNode->getNameTableKind(), GV->getLinkageName(),
381 *VariableDIE);
382 }
383}
384
386 const DICommonBlock *CB, ArrayRef<GlobalExpr> GlobalExprs) {
387 // Check for pre-existence.
388 if (DIE *NDie = getDIE(CB))
389 return NDie;
390 DIE *ContextDIE = getOrCreateContextDIE(CB->getScope());
391 DIE &NDie = createAndAddDIE(dwarf::DW_TAG_common_block, *ContextDIE, CB);
392 StringRef Name = CB->getName().empty() ? "_BLNK_" : CB->getName();
393 addString(NDie, dwarf::DW_AT_name, Name);
394 addGlobalName(Name, NDie, CB->getScope());
395 if (CB->getFile())
396 addSourceLine(NDie, CB->getLineNo(), /*Column*/ 0, CB->getFile());
397 if (DIGlobalVariable *V = CB->getDecl())
398 getCU().addLocationAttribute(&NDie, V, GlobalExprs);
399 return &NDie;
400}
401
403 DD->insertSectionLabel(Range.Begin);
404
405 auto *PrevCU = DD->getPrevCU();
406 bool SameAsPrevCU = this == PrevCU;
407 DD->setPrevCU(this);
408 // If we have no current ranges just add the range and return, otherwise,
409 // check the current section and CU against the previous section and CU we
410 // emitted into and the subprogram was contained within. If these are the
411 // same then extend our current range, otherwise add this as a new range.
412 if (CURanges.empty() || !SameAsPrevCU ||
413 (&CURanges.back().End->getSection() !=
414 &Range.End->getSection())) {
415 // Before a new range is added, always terminate the prior line table.
416 if (PrevCU)
417 DD->terminateLineTable(PrevCU);
418 CURanges.push_back(Range);
419 return;
420 }
421
422 CURanges.back().End = Range.End;
423}
424
426 if (CUNode->isDebugDirectivesOnly())
427 return;
428
429 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
430 if (DD->useSectionsAsReferences()) {
431 LineTableStartSym = TLOF.getDwarfLineSection()->getBeginSymbol();
432 } else {
433 LineTableStartSym =
434 Asm->OutStreamer->getDwarfLineTableSymbol(getUniqueID());
435 }
436
437 // DW_AT_stmt_list is a offset of line number information for this
438 // compile unit in debug_line section. For split dwarf this is
439 // left in the skeleton CU and so not included.
440 // The line table entries are not always emitted in assembly, so it
441 // is not okay to use line_table_start here.
442 addSectionLabel(getUnitDie(), dwarf::DW_AT_stmt_list, LineTableStartSym,
444}
445
447 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
448 addSectionLabel(D, dwarf::DW_AT_stmt_list, LineTableStartSym,
450}
451
453 const MCSymbol *End) {
454 assert(Begin && "Begin label should not be null!");
455 assert(End && "End label should not be null!");
456 assert(Begin->isDefined() && "Invalid starting label");
457 assert(End->isDefined() && "Invalid end label");
458
459 addLabelAddress(D, dwarf::DW_AT_low_pc, Begin);
460 if (DD->getDwarfVersion() >= 4 &&
461 (!isDwoUnit() || !llvm::isRangeRelaxable(Begin, End))) {
462 addLabelDelta(D, dwarf::DW_AT_high_pc, End, Begin);
463 return;
464 }
465 addLabelAddress(D, dwarf::DW_AT_high_pc, End);
466}
467
468// Add info for Wasm-global-based relocation.
469// 'GlobalIndex' is used for split dwarf, which currently relies on a few
470// assumptions that are not guaranteed in a formal way but work in practice.
471void DwarfCompileUnit::addWasmRelocBaseGlobal(DIELoc *Loc, StringRef GlobalName,
472 uint64_t GlobalIndex) {
473 // FIXME: duplicated from Target/WebAssembly/WebAssembly.h
474 // don't want to depend on target specific headers in this code?
475 const unsigned TI_GLOBAL_RELOC = 3;
476 unsigned PointerSize = Asm->getDataLayout().getPointerSize();
477 auto *Sym =
478 static_cast<MCSymbolWasm *>(Asm->GetExternalSymbolSymbol(GlobalName));
479 // FIXME: this repeats what WebAssemblyMCInstLower::
480 // GetExternalSymbolSymbol does, since if there's no code that
481 // refers to this symbol, we have to set it here.
483 Sym->setGlobalType(wasm::WasmGlobalType{
484 static_cast<uint8_t>(PointerSize == 4 ? wasm::WASM_TYPE_I32
486 true});
487 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_WASM_location);
488 addSInt(*Loc, dwarf::DW_FORM_sdata, TI_GLOBAL_RELOC);
489 if (!isDwoUnit()) {
490 addLabel(*Loc, dwarf::DW_FORM_data4, Sym);
491 } else {
492 // FIXME: when writing dwo, we need to avoid relocations. Probably
493 // the "right" solution is to treat globals the way func and data
494 // symbols are (with entries in .debug_addr).
495 // For now we hardcode the indices in the callsites. Global indices are not
496 // fixed, but in practice a few are fixed; for example, __stack_pointer is
497 // always index 0.
498 addUInt(*Loc, dwarf::DW_FORM_data4, GlobalIndex);
499 }
500}
501
502// Find DIE for the given subprogram and attach appropriate DW_AT_low_pc
503// and DW_AT_high_pc attributes. If there are global variables in this
504// scope then create and insert DIEs for these variables.
506 const Function &F,
507 MCSymbol *LineTableSym) {
510 // If basic block sections are on, ranges for each basic block section has
511 // to be emitted separately.
512 for (const auto &R : Asm->MBBSectionRanges)
513 BB_List.push_back({R.second.BeginLabel, R.second.EndLabel});
514
515 attachRangesOrLowHighPC(*SPDie, BB_List);
516
517 if (DD->useAppleExtensionAttributes() &&
518 !DD->getCurrentFunction()->disableFramePointerElim())
519 addFlag(*SPDie, dwarf::DW_AT_APPLE_omit_frame_ptr);
520
521 if (emitFuncLineTableOffsets() && LineTableSym) {
522 MCSymbol *Symbol =
523 Asm->getObjFileLowering().getDwarfLineSection()->getBeginSymbol();
524 addSectionLabel(*SPDie, dwarf::DW_AT_LLVM_stmt_sequence, LineTableSym,
525 Symbol);
526 }
527
528 // Only include DW_AT_frame_base in full debug info
530 const TargetFrameLowering *TFI = Asm->MF->getSubtarget().getFrameLowering();
532 TFI->getDwarfFrameBase(*Asm->MF);
533 switch (FrameBase.Kind) {
536 MachineLocation Location(FrameBase.Location.Reg);
537 addAddress(*SPDie, dwarf::DW_AT_frame_base, Location);
538 }
539 break;
540 }
543 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_call_frame_cfa);
544 if (FrameBase.Location.Offset != 0) {
545 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_consts);
546 addSInt(*Loc, dwarf::DW_FORM_sdata, FrameBase.Location.Offset);
547 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
548 }
549 addBlock(*SPDie, dwarf::DW_AT_frame_base, Loc);
550 break;
551 }
553 // FIXME: duplicated from Target/WebAssembly/WebAssembly.h
554 const unsigned TI_GLOBAL_RELOC = 3;
555 if (FrameBase.Location.WasmLoc.Kind == TI_GLOBAL_RELOC) {
556 // These need to be relocatable.
558 assert(FrameBase.Location.WasmLoc.Index == 0); // Only SP so far.
559 // For now, since we only ever use index 0, this should work as-is.
560 addWasmRelocBaseGlobal(Loc, "__stack_pointer",
561 FrameBase.Location.WasmLoc.Index);
562 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_stack_value);
563 addBlock(*SPDie, dwarf::DW_AT_frame_base, Loc);
564 } else {
566 DIEDwarfExpression DwarfExpr(*Asm, *this, *Loc);
567 DIExpressionCursor Cursor({});
568 DwarfExpr.addWasmLocation(FrameBase.Location.WasmLoc.Kind,
569 FrameBase.Location.WasmLoc.Index);
570 DwarfExpr.addExpression(std::move(Cursor));
571 addBlock(*SPDie, dwarf::DW_AT_frame_base, DwarfExpr.finalize());
572 }
573 break;
574 }
575 }
576 }
577
578 // Add name to the name table, we do this here because we're guaranteed
579 // to have concrete versions of our DW_TAG_subprogram nodes.
580 DD->addSubprogramNames(*this, CUNode->getNameTableKind(), SP, *SPDie);
581
582 return *SPDie;
583}
584
585// Construct a DIE for this scope.
587 DIE &ParentScopeDIE) {
588 if (!Scope || !Scope->getScopeNode())
589 return;
590
591 auto *DS = Scope->getScopeNode();
592
593 assert((Scope->getInlinedAt() || !isa<DISubprogram>(DS)) &&
594 "Only handle inlined subprograms here, use "
595 "constructSubprogramScopeDIE for non-inlined "
596 "subprograms");
597
598 // Emit inlined subprograms.
599 if (Scope->getParent() && isa<DISubprogram>(DS)) {
600 DIE *ScopeDIE = constructInlinedScopeDIE(Scope, ParentScopeDIE);
601 assert(ScopeDIE && "Scope DIE should not be null.");
602 createAndAddScopeChildren(Scope, *ScopeDIE);
603 return;
604 }
605
606 // Early exit when we know the scope DIE is going to be null.
607 if (DD->isLexicalScopeDIENull(Scope))
608 return;
609
610 // Emit lexical blocks.
611 DIE *ScopeDIE = getOrCreateLexicalBlockDIE(Scope, ParentScopeDIE);
612 assert(ScopeDIE && "Scope DIE should not be null.");
613
614 createAndAddScopeChildren(Scope, *ScopeDIE);
615}
616
619
620 HasRangeLists = true;
621
622 // Add the range list to the set of ranges to be emitted.
623 auto IndexAndList =
624 (DD->getDwarfVersion() < 5 && Skeleton ? Skeleton->DU : DU)
625 ->addRange(*(Skeleton ? Skeleton : this), std::move(Range));
626
627 uint32_t Index = IndexAndList.first;
628 auto &List = *IndexAndList.second;
629
630 // Under fission, ranges are specified by constant offsets relative to the
631 // CU's DW_AT_GNU_ranges_base.
632 // FIXME: For DWARF v5, do not generate the DW_AT_ranges attribute under
633 // fission until we support the forms using the .debug_addr section
634 // (DW_RLE_startx_endx etc.).
635 if (DD->getDwarfVersion() >= 5)
636 addUInt(ScopeDIE, dwarf::DW_AT_ranges, dwarf::DW_FORM_rnglistx, Index);
637 else {
638 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
639 const MCSymbol *RangeSectionSym =
641 addSectionLabel(ScopeDIE, dwarf::DW_AT_ranges, List.Label, RangeSectionSym);
642 }
643}
644
646 DIE &Die, SmallVector<RangeSpan, 2> Ranges) {
647 assert(!Ranges.empty());
648 if (!DD->useRangesSection() ||
649 (Ranges.size() == 1 &&
650 (!DD->alwaysUseRanges(*this) ||
651 DD->getSectionLabel(&Ranges.front().Begin->getSection()) ==
652 Ranges.front().Begin))) {
653 const RangeSpan &Front = Ranges.front();
654 const RangeSpan &Back = Ranges.back();
655 attachLowHighPC(Die, Front.Begin, Back.End);
656 } else
657 addScopeRangeList(Die, std::move(Ranges));
658}
659
661 DIE &Die, const SmallVectorImpl<InsnRange> &Ranges) {
663 List.reserve(Ranges.size());
664 for (const InsnRange &R : Ranges) {
665 auto *BeginLabel = DD->getLabelBeforeInsn(R.first);
666 auto *EndLabel = DD->getLabelAfterInsn(R.second);
667
668 const auto *BeginMBB = R.first->getParent();
669 const auto *EndMBB = R.second->getParent();
670
671 const auto *MBB = BeginMBB;
672 // Basic block sections allows basic block subsets to be placed in unique
673 // sections. For each section, the begin and end label must be added to the
674 // list. If there is more than one range, debug ranges must be used.
675 // Otherwise, low/high PC can be used.
676 // FIXME: Debug Info Emission depends on block order and this assumes that
677 // the order of blocks will be frozen beyond this point.
678 do {
679 if (MBB->sameSection(EndMBB) || MBB->isEndSection()) {
680 auto MBBSectionRange = Asm->MBBSectionRanges[MBB->getSectionID()];
681 List.push_back(
682 {MBB->sameSection(BeginMBB) ? BeginLabel
683 : MBBSectionRange.BeginLabel,
684 MBB->sameSection(EndMBB) ? EndLabel : MBBSectionRange.EndLabel});
685 }
686 if (MBB->sameSection(EndMBB))
687 break;
688 MBB = MBB->getNextNode();
689 } while (true);
690 }
691 attachRangesOrLowHighPC(Die, std::move(List));
692}
693
695 DIE &ParentScopeDIE) {
696 assert(Scope->getScopeNode());
697 auto *DS = Scope->getScopeNode();
698 auto *InlinedSP = getDISubprogram(DS);
699 // Find the subprogram's DwarfCompileUnit in the SPMap in case the subprogram
700 // was inlined from another compile unit.
701 DIE *OriginDIE = getAbstractScopeDIEs()[InlinedSP];
702 assert(OriginDIE && "Unable to find original DIE for an inlined subprogram.");
703
704 auto ScopeDIE = DIE::get(DIEValueAllocator, dwarf::DW_TAG_inlined_subroutine);
705 ParentScopeDIE.addChild(ScopeDIE);
706 addDIEEntry(*ScopeDIE, dwarf::DW_AT_abstract_origin, *OriginDIE);
707
708 attachRangesOrLowHighPC(*ScopeDIE, Scope->getRanges());
709
710 // Add the call site information to the DIE.
711 const DILocation *IA = Scope->getInlinedAt();
712 addUInt(*ScopeDIE, dwarf::DW_AT_call_file, std::nullopt,
713 getOrCreateSourceID(IA->getFile()));
714 addUInt(*ScopeDIE, dwarf::DW_AT_call_line, std::nullopt, IA->getLine());
715 if (IA->getColumn())
716 addUInt(*ScopeDIE, dwarf::DW_AT_call_column, std::nullopt, IA->getColumn());
717 if (IA->getDiscriminator() && DD->getDwarfVersion() >= 4)
718 addUInt(*ScopeDIE, dwarf::DW_AT_GNU_discriminator, std::nullopt,
719 IA->getDiscriminator());
720
721 // Add name to the name table, we do this here because we're guaranteed
722 // to have concrete versions of our DW_TAG_inlined_subprogram nodes.
723 DD->addSubprogramNames(*this, CUNode->getNameTableKind(), InlinedSP,
724 *ScopeDIE);
725
726 return ScopeDIE;
727}
728
730 DIE &ParentScopeDIE) {
731 if (DD->isLexicalScopeDIENull(Scope))
732 return nullptr;
733 const auto *DS = Scope->getScopeNode();
734
735 auto ScopeDIE = DIE::get(DIEValueAllocator, dwarf::DW_TAG_lexical_block);
736 ParentScopeDIE.addChild(ScopeDIE);
737
738 if (Scope->isAbstractScope()) {
739 assert(!getAbstractScopeDIEs().count(DS) &&
740 "Abstract DIE for this scope exists!");
741 getAbstractScopeDIEs()[DS] = ScopeDIE;
742 return ScopeDIE;
743 }
744 if (!Scope->getInlinedAt()) {
745 assert(!LexicalBlockDIEs.count(DS) &&
746 "Concrete out-of-line DIE for this scope exists!");
747 LexicalBlockDIEs[DS] = ScopeDIE;
748 } else {
749 InlinedLocalScopeDIEs[DS].push_back(ScopeDIE);
750 }
751
752 attachRangesOrLowHighPC(*ScopeDIE, Scope->getRanges());
753
754 return ScopeDIE;
755}
756
758 auto *VariableDie = DIE::get(DIEValueAllocator, DV.getTag());
759 insertDIE(DV.getVariable(), VariableDie);
760 DV.setDIE(*VariableDie);
761 // Abstract variables don't get common attributes later, so apply them now.
762 if (Abstract) {
763 applyCommonDbgVariableAttributes(DV, *VariableDie);
764 } else {
765 std::visit(
766 [&](const auto &V) {
767 applyConcreteDbgVariableAttributes(V, DV, *VariableDie);
768 },
769 DV.asVariant());
770 }
771 return VariableDie;
772}
773
774static const DIType *resolveTypeQualifiers(const DIType *Ty) {
775 while (const auto *DT = dyn_cast_or_null<DIDerivedType>(Ty)) {
776 switch (DT->getTag()) {
777 case dwarf::DW_TAG_typedef:
778 case dwarf::DW_TAG_const_type:
779 case dwarf::DW_TAG_volatile_type:
780 case dwarf::DW_TAG_restrict_type:
781 case dwarf::DW_TAG_atomic_type:
782 Ty = DT->getBaseType();
783 continue;
784 default:
785 return Ty;
786 }
787 }
788 return Ty;
789}
790
791bool DwarfCompileUnit::emitImplicitPointerLocation(const Loc::Single &Single,
792 const DbgVariable &DV,
793 DIE &VariableDie) {
794 const DIExpression *Expr = Single.getExpr();
795 if (!Expr)
796 return false;
797
798 // Only handle the simple case where DW_OP_LLVM_implicit_pointer is the
799 // sole operation (or followed only by DW_OP_LLVM_fragment).
800 //
801 // Multi-level implicit pointers (e.g., int **pp where both levels are
802 // optimized away) would require stacking multiple implicit_pointer ops
803 // in one expression and unwinding them into a chain of artificial DIEs.
804 // This is left for future work.
805 //
806 // Location list support (Loc::Multi) is not yet handled.
807 auto ExprOps = Expr->expr_ops();
808 auto FirstOp = ExprOps.begin();
809 if (FirstOp == ExprOps.end() ||
810 FirstOp->getOp() != dwarf::DW_OP_LLVM_implicit_pointer)
811 return false;
812
813 if (DD->getDwarfVersion() < 4)
814 return false;
815
816 const DbgValueLoc &DVal = Single.getValueLoc();
817 if (DVal.isVariadic())
818 return false;
819
820 assert(!DVal.getLocEntries().empty() &&
821 "Non-variadic value must have one entry");
822 const DbgValueLocEntry &Entry = DVal.getLocEntries()[0];
823
824 // Resolve the variable's type, stripping qualifiers and typedefs,
825 // to find the pointer or reference type underneath.
826 // The verifier rejects cyclic type references, so this loop terminates.
827 const DIDerivedType *PtrTy =
829 if (!PtrTy)
830 return false;
831
832 if (PtrTy->getTag() != dwarf::DW_TAG_pointer_type &&
833 PtrTy->getTag() != dwarf::DW_TAG_reference_type &&
834 PtrTy->getTag() != dwarf::DW_TAG_rvalue_reference_type)
835 return false;
836
837 const DIType *PointeeTy = PtrTy->getBaseType();
838
839 // Try to reuse an existing artificial DIE for constant integer values.
840 // This avoids duplicate DIEs when multiple pointer variables reference
841 // the same constant (e.g., after ArgumentPromotion promotes the same
842 // struct member for two different pointer parameters).
843 DIE *ArtificialDIEPtr = nullptr;
844 if (Entry.isInt() && PointeeTy) {
845 auto It = ImplicitPointerDIEs.find({PointeeTy, Entry.getInt()});
846 if (It != ImplicitPointerDIEs.end())
847 ArtificialDIEPtr = It->second;
848 }
849
850 if (!ArtificialDIEPtr) {
851 // Check that the value can be described before creating a DIE for it.
852 if (!Entry.isLocation() && !Entry.isInt() && !Entry.isConstantFP())
853 return false;
854
855 DIE &ProcDIE = createAndAddDIE(dwarf::DW_TAG_dwarf_procedure, getUnitDie());
856
857 if (Entry.isLocation()) {
858 addAddress(ProcDIE, dwarf::DW_AT_location, Entry.getLoc());
859 } else if (Entry.isInt()) {
860 if (PointeeTy)
861 addConstantValue(ProcDIE, Entry.getInt(), PointeeTy);
862 } else {
863 addConstantFPValue(ProcDIE, Entry.getConstantFP());
864 }
865
866 ArtificialDIEPtr = &ProcDIE;
867
868 // Cache constant entries for de-duplication.
869 if (Entry.isInt() && PointeeTy)
870 ImplicitPointerDIEs.insert(
871 {{PointeeTy, Entry.getInt()}, ArtificialDIEPtr});
872 }
873
874 auto *Loc = new (DIEValueAllocator) DIELoc;
875
876 const unsigned ImplicitPtrOp = DD->getDwarfVersion() >= 5
877 ? dwarf::DW_OP_implicit_pointer
878 : dwarf::DW_OP_GNU_implicit_pointer;
879 addUInt(*Loc, dwarf::DW_FORM_data1, ImplicitPtrOp);
880
881 Loc->addValue(DIEValueAllocator, static_cast<dwarf::Attribute>(0),
882 dwarf::DW_FORM_ref_addr, DIEEntry(*ArtificialDIEPtr));
883
884 addSInt(*Loc, dwarf::DW_FORM_sdata, 0);
885
886 addBlock(VariableDie, dwarf::DW_AT_location, Loc);
887 return true;
888}
889
890void DwarfCompileUnit::applyConcreteDbgVariableAttributes(
891 const Loc::Single &Single, const DbgVariable &DV, DIE &VariableDie) {
892 // Handle DW_OP_LLVM_implicit_pointer before normal location emission.
893 if (emitImplicitPointerLocation(Single, DV, VariableDie))
894 return;
895
896 const DbgValueLoc *DVal = &Single.getValueLoc();
897 if (!Single.getExpr())
898 DD->addTargetVariableAttributes(*this, VariableDie, std::nullopt,
900 if (!DVal->isVariadic()) {
901 const DbgValueLocEntry *Entry = DVal->getLocEntries().begin();
902 if (Entry->isLocation()) {
903 addVariableAddress(DV, VariableDie, Entry->getLoc());
904 } else if (Entry->isInt()) {
905 auto *Expr = Single.getExpr();
906 if (Expr && Expr->getNumElements()) {
907 DIELoc *Loc = new (DIEValueAllocator) DIELoc;
908 DIEDwarfExpression DwarfExpr(*Asm, *this, *Loc);
909 // If there is an expression, emit raw unsigned bytes.
910 DwarfExpr.addFragmentOffset(Expr);
911 DwarfExpr.addUnsignedConstant(Entry->getInt());
912 DwarfExpr.addExpression(Expr);
913 addBlock(VariableDie, dwarf::DW_AT_location, DwarfExpr.finalize());
914 if (DwarfExpr.TagOffset)
915 addUInt(VariableDie, dwarf::DW_AT_LLVM_tag_offset,
916 dwarf::DW_FORM_data1, *DwarfExpr.TagOffset);
917 } else
918 addConstantValue(VariableDie, Entry->getInt(), DV.getType());
919 } else if (Entry->isConstantFP()) {
920 addConstantFPValue(VariableDie, Entry->getConstantFP());
921 } else if (Entry->isConstantInt()) {
922 addConstantValue(VariableDie, Entry->getConstantInt(), DV.getType());
923 } else if (Entry->isGlobalAddress()) {
924 auto *Expr = Single.getExpr();
925 DIELoc *Loc = new (DIEValueAllocator) DIELoc;
926 DIEDwarfExpression DwarfExpr(*Asm, *this, *Loc);
927 DwarfExpr.addFragmentOffset(Expr);
928 if (!DwarfExpr.addGlobalAddress(Entry->getGlobalAddress(),
929 Entry->getGlobalOffset()))
930 return;
931 // A rejected operation leaves the expression built so far in Loc, which
932 // describes some other location rather than none. Drop it instead.
933 if (!DwarfExpr.addExpression(Expr))
934 return;
935 addBlock(VariableDie, dwarf::DW_AT_location, DwarfExpr.finalize());
936 if (DwarfExpr.TagOffset)
937 addUInt(VariableDie, dwarf::DW_AT_LLVM_tag_offset, dwarf::DW_FORM_data1,
938 *DwarfExpr.TagOffset);
939 } else if (Entry->isTargetIndexLocation()) {
940 DIELoc *Loc = new (DIEValueAllocator) DIELoc;
941 DIEDwarfExpression DwarfExpr(*Asm, *this, *Loc);
942 const DIBasicType *BT = dyn_cast<DIBasicType>(
943 static_cast<const Metadata *>(DV.getVariable()->getType()));
944 DwarfDebug::emitDebugLocValue(*Asm, BT, *DVal, DwarfExpr);
945 addBlock(VariableDie, dwarf::DW_AT_location, DwarfExpr.finalize());
946 }
947 return;
948 }
949 // If any of the location entries are registers with the value 0,
950 // then the location is undefined.
951 if (any_of(DVal->getLocEntries(), [](const DbgValueLocEntry &Entry) {
952 return Entry.isLocation() && !Entry.getLoc().getReg();
953 }))
954 return;
955 const DIExpression *Expr = Single.getExpr();
956 assert(Expr && "Variadic Debug Value must have an Expression.");
957 DIELoc *Loc = new (DIEValueAllocator) DIELoc;
958 DIEDwarfExpression DwarfExpr(*Asm, *this, *Loc);
959 DwarfExpr.addFragmentOffset(Expr);
960 DIExpressionCursor Cursor(Expr);
961 const TargetRegisterInfo &TRI = *Asm->MF->getSubtarget().getRegisterInfo();
962
963 auto AddEntry = [&](const DbgValueLocEntry &Entry,
964 DIExpressionCursor &Cursor) {
965 if (Entry.isLocation()) {
966 if (!DwarfExpr.addMachineRegExpression(TRI, Cursor,
967 Entry.getLoc().getReg()))
968 return false;
969 } else if (Entry.isInt()) {
970 // If there is an expression, emit raw unsigned bytes.
971 DwarfExpr.addUnsignedConstant(Entry.getInt());
972 } else if (Entry.isConstantFP()) {
973 // DwarfExpression does not support arguments wider than 64 bits
974 // (see PR52584).
975 // TODO: Consider chunking expressions containing overly wide
976 // arguments into separate pointer-sized fragment expressions.
977 APInt RawBytes = Entry.getConstantFP()->getValueAPF().bitcastToAPInt();
978 if (RawBytes.getBitWidth() > 64)
979 return false;
980 DwarfExpr.addUnsignedConstant(RawBytes.getZExtValue());
981 } else if (Entry.isConstantInt()) {
982 APInt RawBytes = Entry.getConstantInt()->getValue();
983 if (RawBytes.getBitWidth() > 64)
984 return false;
985 DwarfExpr.addUnsignedConstant(RawBytes.getZExtValue());
986 } else if (Entry.isTargetIndexLocation()) {
987 TargetIndexLocation Loc = Entry.getTargetIndexLocation();
988 // TODO TargetIndexLocation is a target-independent. Currently
989 // only the WebAssembly-specific encoding is supported.
990 assert(Asm->TM.getTargetTriple().isWasm());
991 DwarfExpr.addWasmLocation(Loc.Index, static_cast<uint64_t>(Loc.Offset));
992 } else if (Entry.isGlobalAddress()) {
993 if (!DwarfExpr.addGlobalAddress(Entry.getGlobalAddress(),
994 Entry.getGlobalOffset()))
995 return false;
996 } else {
997 llvm_unreachable("Unsupported Entry type.");
998 }
999 return true;
1000 };
1001
1002 if (!DwarfExpr.addExpression(
1003 std::move(Cursor),
1004 [&](unsigned Idx, DIExpressionCursor &Cursor) -> bool {
1005 return AddEntry(DVal->getLocEntries()[Idx], Cursor);
1006 }))
1007 return;
1008
1009 // Now attach the location information to the DIE.
1010 addBlock(VariableDie, dwarf::DW_AT_location, DwarfExpr.finalize());
1011 if (DwarfExpr.TagOffset)
1012 addUInt(VariableDie, dwarf::DW_AT_LLVM_tag_offset, dwarf::DW_FORM_data1,
1013 *DwarfExpr.TagOffset);
1014}
1015
1016void DwarfCompileUnit::applyConcreteDbgVariableAttributes(
1017 const Loc::Multi &Multi, const DbgVariable &DV, DIE &VariableDie) {
1018 addLocationList(VariableDie, dwarf::DW_AT_location,
1019 Multi.getDebugLocListIndex());
1020 auto TagOffset = Multi.getDebugLocListTagOffset();
1021 if (TagOffset)
1022 addUInt(VariableDie, dwarf::DW_AT_LLVM_tag_offset, dwarf::DW_FORM_data1,
1023 *TagOffset);
1024}
1025
1026void DwarfCompileUnit::applyConcreteDbgVariableAttributes(const Loc::MMI &MMI,
1027 const DbgVariable &DV,
1028 DIE &VariableDie) {
1029 std::optional<unsigned> TargetAddrSpace;
1030 DIELoc *Loc = new (DIEValueAllocator) DIELoc;
1031 DIEDwarfExpression DwarfExpr(*Asm, *this, *Loc);
1032 for (const auto &Fragment : MMI.getFrameIndexExprs()) {
1033 Register FrameReg;
1034 const DIExpression *Expr = Fragment.Expr;
1035 const TargetFrameLowering *TFI = Asm->MF->getSubtarget().getFrameLowering();
1036 StackOffset Offset =
1037 TFI->getFrameIndexReference(*Asm->MF, Fragment.FI, FrameReg);
1038 DwarfExpr.addFragmentOffset(Expr);
1039
1040 auto *TRI = Asm->MF->getSubtarget().getRegisterInfo();
1041 SmallVector<uint64_t, 8> Ops;
1042 TRI->getOffsetOpcodes(Offset, Ops);
1043
1044 Expr = DD->adjustExpressionForTarget(Expr, TargetAddrSpace);
1045 if (Expr)
1046 Ops.append(Expr->elements_begin(), Expr->elements_end());
1047 DIExpressionCursor Cursor(Ops);
1048 DwarfExpr.setMemoryLocationKind();
1049 if (const MCSymbol *FrameSymbol = Asm->getFunctionFrameSymbol())
1050 addOpAddress(*Loc, FrameSymbol);
1051 else
1052 DwarfExpr.addMachineRegExpression(
1053 *Asm->MF->getSubtarget().getRegisterInfo(), Cursor, FrameReg);
1054 DwarfExpr.addExpression(std::move(Cursor));
1055 }
1056 DD->addTargetVariableAttributes(*this, VariableDie, TargetAddrSpace,
1058 addBlock(VariableDie, dwarf::DW_AT_location, DwarfExpr.finalize());
1059 if (DwarfExpr.TagOffset)
1060 addUInt(VariableDie, dwarf::DW_AT_LLVM_tag_offset, dwarf::DW_FORM_data1,
1061 *DwarfExpr.TagOffset);
1062}
1063
1064void DwarfCompileUnit::applyConcreteDbgVariableAttributes(
1065 const Loc::EntryValue &EntryValue, const DbgVariable &DV,
1066 DIE &VariableDie) {
1067 DIELoc *Loc = new (DIEValueAllocator) DIELoc;
1068 DIEDwarfExpression DwarfExpr(*Asm, *this, *Loc);
1069 // Emit each expression as: EntryValue(Register) <other ops> <Fragment>.
1070 for (auto [Register, Expr] : EntryValue.EntryValues) {
1071 DwarfExpr.addFragmentOffset(&Expr);
1072 DIExpressionCursor Cursor(Expr.getElements());
1073 DwarfExpr.beginEntryValueExpression(Cursor);
1074 DwarfExpr.addMachineRegExpression(
1075 *Asm->MF->getSubtarget().getRegisterInfo(), Cursor, Register);
1076 DwarfExpr.addExpression(std::move(Cursor));
1077 }
1078 addBlock(VariableDie, dwarf::DW_AT_location, DwarfExpr.finalize());
1079}
1080
1081void DwarfCompileUnit::applyConcreteDbgVariableAttributes(
1082 const std::monostate &, const DbgVariable &DV, DIE &VariableDie) {}
1083
1085 const LexicalScope &Scope,
1086 DIE *&ObjectPointer) {
1087 auto Var = constructVariableDIE(DV, Scope.isAbstractScope());
1088 if (DV.isObjectPointer())
1089 ObjectPointer = Var;
1090 return Var;
1091}
1092
1094 const LexicalScope &Scope) {
1095 auto LabelDie = DIE::get(DIEValueAllocator, DL.getTag());
1096 insertDIE(DL.getLabel(), LabelDie);
1097 DL.setDIE(*LabelDie);
1098
1099 if (Scope.isAbstractScope())
1100 applyLabelAttributes(DL, *LabelDie);
1101
1102 return LabelDie;
1103}
1104
1105/// Return all DIVariables that appear in count: expressions.
1108 auto *Array = dyn_cast<DICompositeType>(Var->getType());
1109 if (!Array || Array->getTag() != dwarf::DW_TAG_array_type)
1110 return Result;
1111 if (auto *DLVar = Array->getDataLocation())
1112 Result.push_back(DLVar);
1113 if (auto *AsVar = Array->getAssociated())
1114 Result.push_back(AsVar);
1115 if (auto *AlVar = Array->getAllocated())
1116 Result.push_back(AlVar);
1117 for (auto *El : Array->getElements()) {
1118 if (auto *Subrange = dyn_cast<DISubrange>(El)) {
1119 if (auto Count = Subrange->getCount())
1120 if (auto *Dependency = dyn_cast_if_present<DIVariable *>(Count))
1121 Result.push_back(Dependency);
1122 if (auto LB = Subrange->getLowerBound())
1123 if (auto *Dependency = dyn_cast_if_present<DIVariable *>(LB))
1124 Result.push_back(Dependency);
1125 if (auto UB = Subrange->getUpperBound())
1126 if (auto *Dependency = dyn_cast_if_present<DIVariable *>(UB))
1127 Result.push_back(Dependency);
1128 if (auto ST = Subrange->getStride())
1129 if (auto *Dependency = dyn_cast_if_present<DIVariable *>(ST))
1130 Result.push_back(Dependency);
1131 } else if (auto *GenericSubrange = dyn_cast<DIGenericSubrange>(El)) {
1132 if (auto Count = GenericSubrange->getCount())
1133 if (auto *Dependency = dyn_cast_if_present<DIVariable *>(Count))
1134 Result.push_back(Dependency);
1135 if (auto LB = GenericSubrange->getLowerBound())
1136 if (auto *Dependency = dyn_cast_if_present<DIVariable *>(LB))
1137 Result.push_back(Dependency);
1138 if (auto UB = GenericSubrange->getUpperBound())
1139 if (auto *Dependency = dyn_cast_if_present<DIVariable *>(UB))
1140 Result.push_back(Dependency);
1141 if (auto ST = GenericSubrange->getStride())
1142 if (auto *Dependency = dyn_cast_if_present<DIVariable *>(ST))
1143 Result.push_back(Dependency);
1144 }
1145 }
1146 return Result;
1147}
1148
1149/// Sort local variables so that variables appearing inside of helper
1150/// expressions come first.
1155 // Map back from a DIVariable to its containing DbgVariable.
1157 // Set of DbgVariables in Result.
1159 // For cycle detection.
1161
1162 // Initialize the worklist and the DIVariable lookup table.
1163 for (auto *Var : reverse(Input)) {
1164 DbgVar.insert({Var->getVariable(), Var});
1165 WorkList.push_back({Var, 0});
1166 }
1167
1168 // Perform a stable topological sort by doing a DFS.
1169 while (!WorkList.empty()) {
1170 auto Item = WorkList.back();
1171 DbgVariable *Var = Item.getPointer();
1172 bool visitedAllDependencies = Item.getInt();
1173 WorkList.pop_back();
1174
1175 assert(Var);
1176
1177 // Already handled.
1178 if (Visited.count(Var))
1179 continue;
1180
1181 // Add to Result if all dependencies are visited.
1182 if (visitedAllDependencies) {
1183 Visited.insert(Var);
1184 Result.push_back(Var);
1185 continue;
1186 }
1187
1188 // Detect cycles.
1189 auto Res = Visiting.insert(Var);
1190 if (!Res.second) {
1191 assert(false && "dependency cycle in local variables");
1192 return Result;
1193 }
1194
1195 // Push dependencies and this node onto the worklist, so that this node is
1196 // visited again after all of its dependencies are handled.
1197 WorkList.push_back({Var, 1});
1198 for (const auto *Dependency : dependencies(Var)) {
1199 // Don't add dependency if it is in a different lexical scope or a global.
1200 if (const auto *Dep = dyn_cast<const DILocalVariable>(Dependency))
1201 if (DbgVariable *Var = DbgVar.lookup(Dep))
1202 WorkList.push_back({Var, 0});
1203 }
1204 }
1205 return Result;
1206}
1207
1209 const Function &F,
1210 LexicalScope *Scope,
1211 MCSymbol *LineTableSym) {
1212 DIE &ScopeDIE = updateSubprogramScopeDIE(Sub, F, LineTableSym);
1213
1214 if (Scope) {
1215 assert(!Scope->getInlinedAt());
1216 assert(!Scope->isAbstractScope());
1217 // Collect lexical scope children first.
1218 // ObjectPointer might be a local (non-argument) local variable if it's a
1219 // block's synthetic this pointer.
1220 if (DIE *ObjectPointer = createAndAddScopeChildren(Scope, ScopeDIE))
1221 addDIEEntry(ScopeDIE, dwarf::DW_AT_object_pointer, *ObjectPointer);
1222 }
1223
1224 // If this is a variadic function, add an unspecified parameter.
1225 auto *SPTy = Sub->getType();
1226 if (!SPTy)
1227 return ScopeDIE;
1228
1229 DITypeArray FnArgs = SPTy->getTypeArray();
1230
1231 // If we have a single element of null, it is a function that returns void.
1232 // If we have more than one elements and the last one is null, it is a
1233 // variadic function.
1234 if (FnArgs.size() > 1 && !FnArgs[FnArgs.size() - 1] &&
1236 ScopeDIE.addChild(
1237 DIE::get(DIEValueAllocator, dwarf::DW_TAG_unspecified_parameters));
1238
1239 return ScopeDIE;
1240}
1241
1243 DIE &ScopeDIE) {
1244 DIE *ObjectPointer = nullptr;
1245
1246 // Emit function arguments (order is significant).
1247 auto Vars = DU->getScopeVariables().lookup(Scope);
1248 for (auto &DV : Vars.Args)
1249 ScopeDIE.addChild(constructVariableDIE(*DV.second, *Scope, ObjectPointer));
1250
1251 // Emit local variables.
1252 auto Locals = sortLocalVars(Vars.Locals);
1253 for (DbgVariable *DV : Locals)
1254 ScopeDIE.addChild(constructVariableDIE(*DV, *Scope, ObjectPointer));
1255
1256 // Emit labels.
1257 for (DbgLabel *DL : DU->getScopeLabels().lookup(Scope))
1258 ScopeDIE.addChild(constructLabelDIE(*DL, *Scope));
1259
1260 // Track other local entities (skipped in gmlt-like data).
1261 // This creates mapping between CU and a set of local declarations that
1262 // should be emitted for subprograms in this CU.
1263 if (!includeMinimalInlineScopes() && !Scope->getInlinedAt()) {
1264 auto &LocalDecls = DD->getLocalDeclsForScope(Scope->getScopeNode());
1265 DeferredLocalDecls.insert_range(LocalDecls);
1266 }
1267
1268 // Emit inner lexical scopes.
1269 auto skipLexicalScope = [this](LexicalScope *S) -> bool {
1270 const DILocalScope *DS = S->getScopeNode();
1271 if (isa<DISubprogram>(DS))
1272 return false;
1273 // Create a concrete lexical block for a scope with an abstract lexical
1274 // block to ensure visibility of scope-local types and static variables
1275 // within the scope range.
1276 if (getAbstractScopeDIEs().lookup(DS))
1277 return false;
1278 auto Vars = DU->getScopeVariables().lookup(S);
1279 if (!Vars.Args.empty() || !Vars.Locals.empty())
1280 return false;
1281 return includeMinimalInlineScopes() ||
1282 DD->getLocalDeclsForScope(DS).empty();
1283 };
1284 for (LexicalScope *LS : Scope->getChildren()) {
1285 // If the lexical block doesn't have non-scope children or global
1286 // variables scoped to it, skip its emission and put its children directly
1287 // to the parent scope.
1288 if (skipLexicalScope(LS))
1289 createAndAddScopeChildren(LS, ScopeDIE);
1290 else
1291 constructScopeDIE(LS, ScopeDIE);
1292 }
1293
1294 return ObjectPointer;
1295}
1296
1298 const DISubprogram *SP) {
1299 if (auto *AbsDef = getAbstractScopeDIEs().lookup(SP))
1300 return *AbsDef;
1301
1302 auto [ContextDIE, ContextCU] = getOrCreateAbstractSubprogramContextDIE(SP);
1303 return createAbstractSubprogramDIE(SP, ContextDIE, ContextCU);
1304}
1305
1306DIE &DwarfCompileUnit::createAbstractSubprogramDIE(
1307 const DISubprogram *SP, DIE *ContextDIE, DwarfCompileUnit *ContextCU) {
1308 // Passing null as the associated node because the abstract definition
1309 // shouldn't be found by lookup.
1310 DIE &AbsDef = ContextCU->createAndAddDIE(dwarf::DW_TAG_subprogram,
1311 *ContextDIE, nullptr);
1312
1313 // Store the DIE before creating children.
1314 ContextCU->getAbstractScopeDIEs()[SP] = &AbsDef;
1315
1316 ContextCU->applySubprogramAttributesToDefinition(SP, AbsDef);
1317 ContextCU->addSInt(AbsDef, dwarf::DW_AT_inline,
1318 DD->getDwarfVersion() <= 4 ? std::optional<dwarf::Form>()
1319 : dwarf::DW_FORM_implicit_const,
1321
1322 return AbsDef;
1323}
1324
1325std::pair<DIE *, DwarfCompileUnit *>
1326DwarfCompileUnit::getOrCreateAbstractSubprogramContextDIE(
1327 const DISubprogram *SP) {
1328 bool Minimal = includeMinimalInlineScopes();
1329 bool IgnoreScope = shouldPlaceInUnitDIE(SP, Minimal);
1330 DIE *ContextDIE = getOrCreateSubprogramContextDIE(SP, IgnoreScope);
1331
1332 if (auto *SPDecl = SP->getDeclaration())
1333 if (!Minimal)
1334 getOrCreateSubprogramDIE(SPDecl, nullptr);
1335
1336 // The scope may be shared with a subprogram that has already been
1337 // constructed in another CU, in which case we need to construct this
1338 // subprogram in the same CU.
1339 auto *ContextCU = IgnoreScope ? this : DD->lookupCU(ContextDIE->getUnitDie());
1340
1341 return std::make_pair(ContextDIE, ContextCU);
1342}
1343
1345 LexicalScope *Scope) {
1346 auto *SP = cast<DISubprogram>(Scope->getScopeNode());
1347
1348 // Populate subprogram DIE only once.
1349 if (!getFinalizedAbstractSubprograms().insert(SP).second)
1350 return;
1351
1352 auto [ContextDIE, ContextCU] = getOrCreateAbstractSubprogramContextDIE(SP);
1353 DIE *AbsDef = getAbstractScopeDIEs().lookup(SP);
1354 if (!AbsDef)
1355 AbsDef = &createAbstractSubprogramDIE(SP, ContextDIE, ContextCU);
1356
1357 if (DIE *ObjectPointer = ContextCU->createAndAddScopeChildren(Scope, *AbsDef))
1358 ContextCU->addDIEEntry(*AbsDef, dwarf::DW_AT_object_pointer,
1359 *ObjectPointer);
1360}
1361
1363 return DD->getDwarfVersion() <= 4 && !DD->tuneForLLDB();
1364}
1365
1368 return Tag;
1369 switch (Tag) {
1370 case dwarf::DW_TAG_call_site:
1371 return dwarf::DW_TAG_GNU_call_site;
1372 case dwarf::DW_TAG_call_site_parameter:
1373 return dwarf::DW_TAG_GNU_call_site_parameter;
1374 default:
1375 llvm_unreachable("DWARF5 tag with no GNU analog");
1376 }
1377}
1378
1382 return Attr;
1383 switch (Attr) {
1384 case dwarf::DW_AT_call_all_calls:
1385 return dwarf::DW_AT_GNU_all_call_sites;
1386 case dwarf::DW_AT_call_target:
1387 return dwarf::DW_AT_GNU_call_site_target;
1388 case dwarf::DW_AT_call_target_clobbered:
1389 return dwarf::DW_AT_GNU_call_site_target_clobbered;
1390 case dwarf::DW_AT_call_origin:
1391 return dwarf::DW_AT_abstract_origin;
1392 case dwarf::DW_AT_call_return_pc:
1393 return dwarf::DW_AT_low_pc;
1394 case dwarf::DW_AT_call_value:
1395 return dwarf::DW_AT_GNU_call_site_value;
1396 case dwarf::DW_AT_call_tail_call:
1397 return dwarf::DW_AT_GNU_tail_call;
1398 default:
1399 llvm_unreachable("DWARF5 attribute with no GNU analog");
1400 }
1401}
1402
1406 return Loc;
1407 switch (Loc) {
1408 case dwarf::DW_OP_entry_value:
1409 return dwarf::DW_OP_GNU_entry_value;
1410 default:
1411 llvm_unreachable("DWARF5 location atom with no GNU analog");
1412 }
1413}
1414
1416 DIE &ScopeDIE, const DISubprogram *CalleeSP, const Function *CalleeF,
1417 bool IsTail, const MCSymbol *PCAddr, const MCSymbol *CallAddr,
1418 MachineLocation CallTarget, int64_t Offset, DIType *AllocSiteTy) {
1419 // Insert a call site entry DIE within ScopeDIE.
1420 DIE &CallSiteDIE = createAndAddDIE(getDwarf5OrGNUTag(dwarf::DW_TAG_call_site),
1421 ScopeDIE, nullptr);
1422
1423 // A valid register in CallTarget indicates an indirect call.
1424 if (CallTarget.getReg()) {
1425 // Add a DW_AT_call_target location expression describing the location of
1426 // the address of the target function. If any register in the expression
1427 // (i.e., the single register we currently handle) is volatile we must use
1428 // DW_AT_call_target_clobbered instead.
1429 const TargetRegisterInfo &TRI = *Asm->MF->getSubtarget().getRegisterInfo();
1431 TRI.isCalleeSavedPhysReg(CallTarget.getReg(), *Asm->MF)
1432 ? dwarf::DW_AT_call_target
1433 : dwarf::DW_AT_call_target_clobbered);
1434
1435 // CallTarget is the location of the address of an indirect call. The
1436 // location may be indirect, modified by Offset.
1437 if (CallTarget.isIndirect())
1438 addMemoryLocation(CallSiteDIE, Attribute, CallTarget, Offset);
1439 else
1440 addAddress(CallSiteDIE, Attribute, CallTarget);
1441 } else if (CalleeSP) {
1442 DIE *CalleeDIE = getOrCreateSubprogramDIE(CalleeSP, CalleeF);
1443 assert(CalleeDIE && "Could not create DIE for call site entry origin");
1444 addLinkageNamesToDeclarations(*DD, *CalleeSP, *CalleeDIE);
1445
1446 addDIEEntry(CallSiteDIE, getDwarf5OrGNUAttr(dwarf::DW_AT_call_origin),
1447 *CalleeDIE);
1448 }
1449
1450 if (IsTail) {
1451 // Attach DW_AT_call_tail_call to tail calls for standards compliance.
1452 addFlag(CallSiteDIE, getDwarf5OrGNUAttr(dwarf::DW_AT_call_tail_call));
1453
1454 // Attach the address of the branch instruction to allow the debugger to
1455 // show where the tail call occurred. This attribute has no GNU analog.
1456 //
1457 // GDB works backwards from non-standard usage of DW_AT_low_pc (in DWARF4
1458 // mode -- equivalently, in DWARF5 mode, DW_AT_call_return_pc) at tail-call
1459 // site entries to figure out the PC of tail-calling branch instructions.
1460 // This means it doesn't need the compiler to emit DW_AT_call_pc, so we
1461 // don't emit it here.
1462 //
1463 // There's no need to tie non-GDB debuggers to this non-standardness, as it
1464 // adds unnecessary complexity to the debugger. For non-GDB debuggers, emit
1465 // the standard DW_AT_call_pc info.
1467 addLabelAddress(CallSiteDIE, dwarf::DW_AT_call_pc, CallAddr);
1468 }
1469
1470 // Attach the return PC to allow the debugger to disambiguate call paths
1471 // from one function to another.
1472 //
1473 // The return PC is only really needed when the call /isn't/ a tail call, but
1474 // GDB expects it in DWARF4 mode, even for tail calls (see the comment above
1475 // the DW_AT_call_pc emission logic for an explanation).
1476 if (!IsTail || useGNUAnalogForDwarf5Feature()) {
1477 assert(PCAddr && "Missing return PC information for a call");
1478 addLabelAddress(CallSiteDIE,
1479 getDwarf5OrGNUAttr(dwarf::DW_AT_call_return_pc), PCAddr);
1480 }
1481
1482 if (AllocSiteTy)
1483 addType(CallSiteDIE, AllocSiteTy, dwarf::DW_AT_LLVM_alloc_type);
1484
1485 return CallSiteDIE;
1486}
1487
1489 DIE &CallSiteDIE, SmallVector<DbgCallSiteParam, 4> &Params) {
1490 for (const auto &Param : Params) {
1491 unsigned Register = Param.getRegister();
1492 auto CallSiteDieParam =
1494 getDwarf5OrGNUTag(dwarf::DW_TAG_call_site_parameter));
1495 insertDIE(CallSiteDieParam);
1496 addAddress(*CallSiteDieParam, dwarf::DW_AT_location,
1498
1500 DIEDwarfExpression DwarfExpr(*Asm, *this, *Loc);
1501 DwarfExpr.setCallSiteParamValueFlag();
1502
1503 DwarfDebug::emitDebugLocValue(*Asm, nullptr, Param.getValue(), DwarfExpr);
1504
1505 addBlock(*CallSiteDieParam, getDwarf5OrGNUAttr(dwarf::DW_AT_call_value),
1506 DwarfExpr.finalize());
1507
1508 CallSiteDIE.addChild(CallSiteDieParam);
1509 }
1510}
1511
1513 const DIImportedEntity *Module) {
1514 DIE *IMDie = DIE::get(DIEValueAllocator, Module->getTag());
1515 insertDIE(Module, IMDie);
1516 DIE *EntityDie;
1517 auto *Entity = Module->getEntity();
1518 if (auto *NS = dyn_cast<DINamespace>(Entity))
1519 EntityDie = getOrCreateNameSpace(NS);
1520 else if (auto *M = dyn_cast<DIModule>(Entity))
1521 EntityDie = getOrCreateModule(M);
1522 else if (auto *SP = dyn_cast<DISubprogram>(Entity)) {
1523 // If there is an abstract subprogram, refer to it. Note that this assumes
1524 // that all the abstract subprograms have been already created (which is
1525 // correct until imported entities get emitted in DwarfDebug::endModule()).
1526 if (auto *AbsSPDie = getAbstractScopeDIEs().lookup(SP))
1527 EntityDie = AbsSPDie;
1528 else
1529 EntityDie = getOrCreateSubprogramDIE(SP, nullptr);
1530 } else if (auto *T = dyn_cast<DIType>(Entity))
1531 EntityDie = getOrCreateTypeDIE(T);
1532 else if (auto *GV = dyn_cast<DIGlobalVariable>(Entity))
1533 EntityDie = getOrCreateGlobalVariableDIE(GV, {});
1534 else if (auto *IE = dyn_cast<DIImportedEntity>(Entity))
1535 EntityDie = getOrCreateImportedEntityDIE(IE);
1536 else
1537 EntityDie = getDIE(Entity);
1538 assert(EntityDie);
1539 addSourceLine(*IMDie, Module->getLine(), /*Column*/ 0, Module->getFile());
1540 addDIEEntry(*IMDie, dwarf::DW_AT_import, *EntityDie);
1541 StringRef Name = Module->getName();
1542 if (!Name.empty()) {
1543 addString(*IMDie, dwarf::DW_AT_name, Name);
1544
1545 // FIXME: if consumers ever start caring about handling
1546 // unnamed import declarations such as `using ::nullptr_t`
1547 // or `using namespace std::ranges`, we could add the
1548 // import declaration into the accelerator table with the
1549 // name being the one of the entity being imported.
1550 DD->addAccelNamespace(*this, CUNode->getNameTableKind(), Name, *IMDie);
1551 }
1552
1553 // This is for imported module with renamed entities (such as variables and
1554 // subprograms).
1555 DINodeArray Elements = Module->getElements();
1556 for (const auto *Element : Elements) {
1557 if (!Element)
1558 continue;
1559 IMDie->addChild(
1561 }
1562
1563 return IMDie;
1564}
1565
1567 const DIImportedEntity *IE) {
1568
1569 // Check for pre-existence.
1570 if (DIE *Die = getDIE(IE))
1571 return Die;
1572
1573 DIE *ContextDIE = getOrCreateContextDIE(IE->getScope());
1574 assert(ContextDIE && "Empty scope for the imported entity!");
1575
1576 DIE *IMDie = constructImportedEntityDIE(IE);
1577 ContextDIE->addChild(IMDie);
1578 return IMDie;
1579}
1580
1582 DIE *D = getDIE(SP);
1583 if (DIE *AbsSPDIE = getAbstractScopeDIEs().lookup(SP)) {
1584 if (D)
1585 // If this subprogram has an abstract definition, reference that
1586 addDIEEntry(*D, dwarf::DW_AT_abstract_origin, *AbsSPDIE);
1587 } else {
1589 if (D)
1590 // And attach the attributes
1592 }
1593}
1594
1596 DbgEntity *AbsEntity = getExistingAbstractEntity(Entity->getEntity());
1597
1598 auto *Die = Entity->getDIE();
1599 /// Label may be used to generate DW_AT_low_pc, so put it outside
1600 /// if/else block.
1601 const DbgLabel *Label = nullptr;
1602 if (AbsEntity && AbsEntity->getDIE()) {
1603 addDIEEntry(*Die, dwarf::DW_AT_abstract_origin, *AbsEntity->getDIE());
1604 Label = dyn_cast<const DbgLabel>(Entity);
1605 } else {
1606 if (const DbgVariable *Var = dyn_cast<const DbgVariable>(Entity))
1608 else if ((Label = dyn_cast<const DbgLabel>(Entity)))
1609 applyLabelAttributes(*Label, *Die);
1610 else
1611 llvm_unreachable("DbgEntity must be DbgVariable or DbgLabel.");
1612 }
1613
1614 if (!Label)
1615 return;
1616
1617 const auto *Sym = Label->getSymbol();
1618 if (!Sym)
1619 return;
1620
1621 addLabelAddress(*Die, dwarf::DW_AT_low_pc, Sym);
1622
1623 // A TAG_label with a name and an AT_low_pc must be placed in debug_names.
1624 if (StringRef Name = Label->getName(); !Name.empty())
1625 getDwarfDebug().addAccelName(*this, CUNode->getNameTableKind(), Name, *Die);
1626}
1627
1629 auto AttachAO = [&](const DILocalScope *LS, DIE *ScopeDIE) {
1630 if (auto *AbsLSDie = getAbstractScopeDIEs().lookup(LS))
1631 addDIEEntry(*ScopeDIE, dwarf::DW_AT_abstract_origin, *AbsLSDie);
1632 };
1633
1634 for (auto [LScope, ScopeDIE] : LexicalBlockDIEs)
1635 AttachAO(LScope, ScopeDIE);
1636 for (auto &[LScope, ScopeDIEs] : InlinedLocalScopeDIEs)
1637 for (auto *ScopeDIE : ScopeDIEs)
1638 AttachAO(LScope, ScopeDIE);
1639}
1640
1642 auto &AbstractEntities = getAbstractEntities();
1643 auto I = AbstractEntities.find(Node);
1644 if (I != AbstractEntities.end())
1645 return I->second.get();
1646 return nullptr;
1647}
1648
1650 LexicalScope *Scope) {
1651 assert(Scope && Scope->isAbstractScope());
1652 auto &Entity = getAbstractEntities()[Node];
1654 Entity = std::make_unique<DbgVariable>(cast<const DILocalVariable>(Node),
1655 nullptr /* IA */);
1656 DU->addScopeVariable(Scope, cast<DbgVariable>(Entity.get()));
1657 } else if (isa<const DILabel>(Node)) {
1658 Entity = std::make_unique<DbgLabel>(
1659 cast<const DILabel>(Node), nullptr /* IA */);
1660 DU->addScopeLabel(Scope, cast<DbgLabel>(Entity.get()));
1661 }
1662}
1663
1664void DwarfCompileUnit::emitHeader(bool UseOffsets) {
1665 // Don't bother labeling the .dwo unit, as its offset isn't used.
1666 if (!Skeleton && !DD->useSectionsAsReferences()) {
1667 LabelBegin = Asm->createTempSymbol("cu_begin");
1668 Asm->OutStreamer->emitLabel(LabelBegin);
1669 }
1670
1671 dwarf::UnitType UT = Skeleton ? dwarf::DW_UT_split_compile
1672 : DD->useSplitDwarf() ? dwarf::DW_UT_skeleton
1673 : dwarf::DW_UT_compile;
1674 DwarfUnit::emitCommonHeader(UseOffsets, UT);
1675 if (DD->getDwarfVersion() >= 5 && UT != dwarf::DW_UT_compile)
1676 Asm->emitInt64(getDWOId());
1677}
1678
1680 if (!DD->shouldEmitDwarfPubSections())
1681 return false;
1682
1683 switch (CUNode->getNameTableKind()) {
1685 return false;
1686 // Opting in to GNU Pubnames/types overrides the default to ensure these are
1687 // generated for things like Gold's gdb_index generation.
1689 return true;
1691 return false;
1693 return DD->tuneForGDB() && !includeMinimalInlineScopes() &&
1694 !CUNode->isDebugDirectivesOnly() &&
1695 DD->getAccelTableKind() != AccelTableKind::Apple &&
1696 DD->getDwarfVersion() < 5;
1697 }
1698 llvm_unreachable("Unhandled DICompileUnit::DebugNameTableKind enum");
1699}
1700
1701/// addGlobalName - Add a new global name to the compile unit.
1703 const DIScope *Context) {
1704 if (!hasDwarfPubSections())
1705 return;
1706 std::string FullName = getParentContextString(Context) + Name.str();
1707 GlobalNames[FullName] = &Die;
1708}
1709
1711 const DIScope *Context) {
1712 if (!hasDwarfPubSections())
1713 return;
1714 std::string FullName = getParentContextString(Context) + Name.str();
1715 // Insert, allowing the entry to remain as-is if it's already present
1716 // This way the CU-level type DIE is preferred over the "can't describe this
1717 // type as a unit offset because it's not really in the CU at all, it's only
1718 // in a type unit"
1719 GlobalNames.insert(std::make_pair(std::move(FullName), &getUnitDie()));
1720}
1721
1722/// Add a new global type to the unit.
1724 const DIScope *Context) {
1725 if (!hasDwarfPubSections())
1726 return;
1727 std::string FullName = getParentContextString(Context) + Ty->getName().str();
1728 GlobalTypes[FullName] = &Die;
1729}
1730
1732 const DIScope *Context) {
1733 if (!hasDwarfPubSections())
1734 return;
1735 std::string FullName = getParentContextString(Context) + Ty->getName().str();
1736 // Insert, allowing the entry to remain as-is if it's already present
1737 // This way the CU-level type DIE is preferred over the "can't describe this
1738 // type as a unit offset because it's not really in the CU at all, it's only
1739 // in a type unit"
1740 GlobalTypes.insert(std::make_pair(std::move(FullName), &getUnitDie()));
1741}
1742
1744 MachineLocation Location) {
1745 auto *Single = std::get_if<Loc::Single>(&DV);
1746 if (Single && Single->getExpr())
1747 addComplexAddress(Single->getExpr(), Die, dwarf::DW_AT_location, Location);
1748 else
1749 addAddress(Die, dwarf::DW_AT_location, Location);
1750}
1751
1752void DwarfCompileUnit::addLocationWithExpr(DIE &Die, dwarf::Attribute Attribute,
1753 const MachineLocation &Location,
1754 ArrayRef<uint64_t> Expr) {
1756 DIEDwarfExpression DwarfExpr(*Asm, *this, *Loc);
1757 if (Location.isIndirect())
1758 DwarfExpr.setMemoryLocationKind();
1759
1760 DIExpressionCursor Cursor(Expr);
1762 if (!DwarfExpr.addMachineRegExpression(TRI, Cursor, Location.getReg()))
1763 return;
1764 DwarfExpr.addExpression(std::move(Cursor));
1765
1766 // Now attach the location information to the DIE.
1767 addBlock(Die, Attribute, DwarfExpr.finalize());
1768
1769 if (DwarfExpr.TagOffset)
1770 addUInt(Die, dwarf::DW_AT_LLVM_tag_offset, dwarf::DW_FORM_data1,
1771 *DwarfExpr.TagOffset);
1772}
1773
1774/// Add an address attribute to a die based on the location provided.
1776 const MachineLocation &Location) {
1777 addLocationWithExpr(Die, Attribute, Location, {});
1778}
1779
1780/// Add a memory location exprloc to \p DIE with attribute \p Attribute
1781/// at \p Location + \p Offset.
1783 const MachineLocation &Location,
1784 int64_t Offset) {
1785 assert(Location.isIndirect() && "Memory loc should be indirect");
1788 addLocationWithExpr(Die, Attribute, Location, Ops);
1789}
1790
1791/// Start with the address based on the location provided, and generate the
1792/// DWARF information necessary to find the actual variable given the extra
1793/// address information encoded in the DbgVariable, starting from the starting
1794/// location. Add the DWARF information to the die.
1797 const MachineLocation &Location) {
1799 DIEDwarfExpression DwarfExpr(*Asm, *this, *Loc);
1800 DwarfExpr.addFragmentOffset(DIExpr);
1801 DwarfExpr.setLocation(Location, DIExpr);
1802
1803 DIExpressionCursor Cursor(DIExpr);
1804
1805 if (DIExpr->isEntryValue())
1806 DwarfExpr.beginEntryValueExpression(Cursor);
1807
1808 const TargetRegisterInfo &TRI = *Asm->MF->getSubtarget().getRegisterInfo();
1809 if (!DwarfExpr.addMachineRegExpression(TRI, Cursor, Location.getReg()))
1810 return;
1811 DwarfExpr.addExpression(std::move(Cursor));
1812
1813 // Now attach the location information to the DIE.
1814 addBlock(Die, Attribute, DwarfExpr.finalize());
1815
1816 if (DwarfExpr.TagOffset)
1817 addUInt(Die, dwarf::DW_AT_LLVM_tag_offset, dwarf::DW_FORM_data1,
1818 *DwarfExpr.TagOffset);
1819}
1820
1821/// Add a Dwarf loclistptr attribute data and value.
1823 unsigned Index) {
1824 dwarf::Form Form = (DD->getDwarfVersion() >= 5)
1825 ? dwarf::DW_FORM_loclistx
1826 : DD->getDwarfSectionOffsetForm();
1827 addAttribute(Die, Attribute, Form, DIELocList(Index));
1828}
1829
1831 DIE &VariableDie) {
1832 StringRef Name = Var.getName();
1833 if (!Name.empty())
1834 addString(VariableDie, dwarf::DW_AT_name, Name);
1835 const auto *DIVar = Var.getVariable();
1836 if (DIVar) {
1837 if (uint32_t AlignInBytes = DIVar->getAlignInBytes())
1838 addUInt(VariableDie, dwarf::DW_AT_alignment, dwarf::DW_FORM_udata,
1839 AlignInBytes);
1840 addAnnotation(VariableDie, DIVar->getAnnotations());
1841 }
1842
1843 addSourceLine(VariableDie, DIVar);
1844 addType(VariableDie, Var.getType());
1845 if (Var.isArtificial())
1846 addFlag(VariableDie, dwarf::DW_AT_artificial);
1847}
1848
1850 DIE &LabelDie) {
1851 StringRef Name = Label.getName();
1852 if (!Name.empty())
1853 addString(LabelDie, dwarf::DW_AT_name, Name);
1854 const auto *DILabel = Label.getLabel();
1855 addSourceLine(LabelDie, DILabel);
1856 if (DILabel->isArtificial())
1857 addFlag(LabelDie, dwarf::DW_AT_artificial);
1859 addUInt(LabelDie, dwarf::DW_AT_LLVM_coro_suspend_idx, std::nullopt,
1861}
1862
1863/// Add a Dwarf expression attribute data and value.
1865 const MCExpr *Expr) {
1866 addAttribute(Die, (dwarf::Attribute)0, Form, DIEExpr(Expr));
1867}
1868
1870 const DISubprogram *SP, DIE &SPDie) {
1871 auto *SPDecl = SP->getDeclaration();
1872 auto *Context = SPDecl ? SPDecl->getScope() : SP->getScope();
1874 addGlobalName(SP->getName(), SPDie, Context);
1875}
1876
1877bool DwarfCompileUnit::isDwoUnit() const {
1878 return DD->useSplitDwarf() && Skeleton;
1879}
1880
1881void DwarfCompileUnit::finishNonUnitTypeDIE(DIE& D, const DICompositeType *CTy) {
1882 constructTypeDIE(D, CTy);
1883}
1884
1887 (DD->useSplitDwarf() && !Skeleton);
1888}
1889
1893
1895 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
1896 MCSymbol *Label = DD->getAddressPool().getLabel();
1898 DD->getDwarfVersion() >= 5 ? dwarf::DW_AT_addr_base
1899 : dwarf::DW_AT_GNU_addr_base,
1900 Label, TLOF.getDwarfAddrSection()->getBeginSymbol());
1901}
1902
1904 addAttribute(Die, (dwarf::Attribute)0, dwarf::DW_FORM_udata,
1905 new (DIEValueAllocator) DIEBaseTypeRef(this, Idx));
1906}
1907
1909 // Insert the base_type DIEs directly after the CU so that their offsets will
1910 // fit in the fixed size ULEB128 used inside the location expressions.
1911 // Maintain order by iterating backwards and inserting to the front of CU
1912 // child list.
1913 for (auto &Btr : reverse(ExprRefedBaseTypes)) {
1914 DIE &Die = getUnitDie().addChildFront(
1915 DIE::get(DIEValueAllocator, dwarf::DW_TAG_base_type));
1916 SmallString<32> Str;
1917 addString(Die, dwarf::DW_AT_name,
1919 "_" + Twine(Btr.BitSize)).toStringRef(Str));
1920 addUInt(Die, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1, Btr.Encoding);
1921 // Round up to smallest number of bytes that contains this number of bits.
1922 // ExprRefedBaseTypes is populated with types referenced by
1923 // DW_OP_LLVM_convert operations in location expressions. These are often
1924 // byte-sized, but one common counter-example is 1-bit sized conversions
1925 // from `i1` types. TODO: Should these use DW_AT_bit_size? See
1926 // DwarfUnit::constructTypeDIE.
1927 addUInt(Die, dwarf::DW_AT_byte_size, std::nullopt,
1928 divideCeil(Btr.BitSize, 8));
1929 Btr.Die = &Die;
1930 }
1931}
1932
1934 return LB->getScope()->getNonLexicalBlockFileScope();
1935}
1936
1937DIE *DwarfCompileUnit::getOrCreateLocalScopeDIE(const DILocalScope *Scope) {
1938 const DISubprogram *SP = Scope->getSubprogram();
1939 if (!SP->isDefinition())
1941
1942 // Local scope DIEs are looked up in the unit where abstract and concrete
1943 // DIEs of SP are created.
1944 DwarfCompileUnit &ScopeCU = DD->getOrCreateAbstractSubprogramCU(SP, *this);
1945 if (&ScopeCU != this)
1946 return ScopeCU.getOrCreateLocalScopeDIE(Scope);
1947
1948 // Once an abstract tree is created for SP, all its local entities belong to
1949 // the abstract tree. Use the closest scope that is present in it.
1950 auto &AbstractDIEs = getAbstractScopeDIEs();
1951 if (AbstractDIEs.contains(SP)) {
1952 const DILocalScope *S = Scope;
1953 auto I = AbstractDIEs.find(S);
1954 while (I == AbstractDIEs.end()) {
1956 I = AbstractDIEs.find(S);
1957 }
1958 return I->second;
1959 }
1960
1961 // Until all functions are processed, it is not known whether SP gets an
1962 // abstract DIE, so local entities are collected in a pending DIE and moved
1963 // to the right place later by resolvePendingLocalScopeDIEs().
1964 if (!DD->allFunctionsProcessed())
1965 return &getOrCreatePendingLocalScopeDIE(Scope);
1966
1967 // SP has no abstract tree, so use the concrete one.
1968 if (auto *LB = dyn_cast<DILexicalBlock>(Scope)) {
1969 if (DIE *ScopeDIE = LexicalBlockDIEs.lookup(LB))
1970 return ScopeDIE;
1971 // If the concrete tree has no DIE for this lexical block, use the closest
1972 // enclosing scope DIE.
1973 return getOrCreateLocalScopeDIE(getParentLocalScope(LB));
1974 }
1975 return getOrCreateSubprogramDIE(cast<DISubprogram>(Scope), nullptr);
1976}
1977
1978DIE &DwarfCompileUnit::getOrCreatePendingLocalScopeDIE(
1979 const DILocalScope *Scope) {
1980 DIE *&PendingDIE = PendingLocalScopeDIEs[Scope];
1981 if (PendingDIE)
1982 return *PendingDIE;
1983
1984 // Keep the pending DIEs in the unit DIE, so that the DIEs added to them know
1985 // which unit they belong to. The tags don't matter, as these DIEs are
1986 // removed before emission.
1987 if (!PendingLocalScopesDIE)
1988 PendingLocalScopesDIE =
1990 PendingDIE = &PendingLocalScopesDIE->addChild(
1991 DIE::get(DIEValueAllocator, dwarf::DW_TAG_lexical_block));
1992 return *PendingDIE;
1993}
1994
1996 assert(DD->allFunctionsProcessed() &&
1997 "Local scope DIEs can be resolved only after all functions");
1998 for (auto [Scope, PendingDIE] : PendingLocalScopeDIEs) {
1999 DIE *ScopeDIE = getOrCreateLocalScopeDIE(Scope);
2000 // Put local declarations before other children of the scope, as they
2001 // would be placed if the scope DIE existed when they were created.
2002 ScopeDIE->takeChildren(*PendingDIE, /*AtFront=*/true);
2003 }
2004 PendingLocalScopeDIEs.clear();
2005
2006 if (PendingLocalScopesDIE) {
2007 getUnitDie().removeChild(*PendingLocalScopesDIE);
2008 PendingLocalScopesDIE = nullptr;
2009 }
2010}
2011
2013 if (auto *LScope = dyn_cast_or_null<DILocalScope>(Context))
2014 return getOrCreateLocalScopeDIE(LScope->getNonLexicalBlockFileScope());
2015 return DwarfUnit::getOrCreateContextDIE(Context);
2016}
2017
2019 const Function *F,
2020 bool Minimal) {
2021 if (!F && SP->isDefinition()) {
2022 // SP may belong to another CU. Determine the CU similarly
2023 // to DwarfDebug::constructAbstractSubprogramScopeDIE.
2024 DwarfCompileUnit &AbstractCU =
2025 DD->getOrCreateAbstractSubprogramCU(SP, *this);
2026 if (DIE *AbstractDIE = AbstractCU.getAbstractScopeDIEs().lookup(SP))
2027 return AbstractDIE;
2028
2029 // A subprogram that is neither emitted nor inlined in emitted code can
2030 // only be represented by an abstract DIE.
2031 // Abstract DIE may be necessary for the subprogram when an IR function
2032 // and all its inlined instances are optimized away, yet its local type
2033 // leaks outside the subprogram's scope (e.g., when used as a template type
2034 // parameter).
2035 if (DD->allFunctionsProcessed() && !DD->isProcessedSubprogram(SP))
2036 return &AbstractCU.getOrCreateAbstractSubprogramDIE(SP);
2037 }
2038
2039 return DwarfUnit::getOrCreateSubprogramDIE(SP, F, Minimal);
2040}
2041
2043 const DwarfDebug &DD, const DISubprogram &CalleeSP, DIE &CalleeDIE) {
2045 !CalleeSP.isDefinition() &&
2046 !CalleeDIE.findAttribute(dwarf::DW_AT_linkage_name)) {
2047 addLinkageName(CalleeDIE, CalleeSP.getLinkageName());
2048 }
2049}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
uint64_t uint64_t
MachineBasicBlock & MBB
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
BitTracker BT
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
dxil translate DXIL Translate Metadata
static const DILocalScope * getParentLocalScope(const DILexicalBlockBase *LB)
static SmallVector< DbgVariable *, 8 > sortLocalVars(SmallVectorImpl< DbgVariable * > &Input)
Sort local variables so that variables appearing inside of helper expressions come first.
static const DIType * resolveTypeQualifiers(const DIType *Ty)
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, GsymDataExtractor &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[]
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
Register const TargetRegisterInfo * TRI
Promote Memory to Register
Definition Mem2Reg.cpp:110
#define T
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
This file contains some templates that are useful if you are working with the STL at all.
This file defines the SmallString class.
The Input class is used to parse a yaml document into in-memory structs and vectors.
uint64_t getZExtValue() const
Get zero extended value.
Definition APInt.h:1560
unsigned getBitWidth() const
Return the number of bits in the APInt.
Definition APInt.h:1508
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
size_t size() const
Get the array size.
Definition ArrayRef.h:141
This class is intended to be used as a driving class for all asm writers.
Definition AsmPrinter.h:95
MachineFunction * MF
The current machine function.
Definition AsmPrinter.h:113
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...
Definition Attributes.h:106
Debug common block.
DIFile * getFile() const
unsigned getLineNo() const
StringRef getName() const
DIScope * getScope() const
DIGlobalVariable * getDecl() const
static LLVM_ABI std::optional< DebugEmissionKind > getEmissionKind(StringRef Str)
A BaseTypeRef DIE.
Definition DIE.h:356
A BaseTypeRef DIE.
Definition DIE.h:237
DIEBlock - Represents a block of values.
Definition DIE.h:1081
DwarfExpression implementation for singular DW_AT_location.
An expression DIE.
Definition DIE.h:207
An integer value DIE.
Definition DIE.h:169
A label DIE.
Definition DIE.h:222
Represents a pointer to a location list in the debug_loc section.
Definition DIE.h:337
DIELoc - Represents an expression location.
Definition DIE.h:1045
DIE & getUnitDie()
Definition DIE.h:1034
A list of DIE values.
Definition DIE.h:705
value_iterator addValue(BumpPtrAllocator &Alloc, const DIEValue &V)
Definition DIE.h:756
A structured debug information entry.
Definition DIE.h:835
LLVM_ABI DIEValue findAttribute(dwarf::Attribute Attribute) const
Find a value in the DIE with the attribute given.
Definition DIE.cpp:235
LLVM_ABI void takeChildren(DIE &Other, bool AtFront=false)
Move all children of Other to this DIE, preserving their order.
Definition DIE.cpp:190
DIE & addChild(DIE *Child)
Add a child to the DIE.
Definition DIE.h:960
static DIE * getPlaceholder(BumpPtrAllocator &Alloc)
Create a temporary placeholder DIE.
Definition DIE.h:874
DIE & addChildFront(DIE *Child)
Definition DIE.h:967
static DIE * get(BumpPtrAllocator &Alloc, dwarf::Tag Tag)
Definition DIE.h:869
LLVM_ABI void removeChild(DIE &Child)
Remove Child from the children of this DIE.
Definition DIE.cpp:183
LLVM_ABI const DIE * getUnitDie() const
Climb up the parent chain to get the unit DIE that this DIE belongs to.
Definition DIE.cpp:230
Holds a DIExpression and keeps track of how many operands have been consumed so far.
DWARF expression.
element_iterator elements_end() const
LLVM_ABI bool isEntryValue() const
Check if the expression consists of exactly one entry value operand.
iterator_range< expr_op_iterator > expr_ops() const
unsigned getNumElements() const
static LLVM_ABI void appendOffset(SmallVectorImpl< uint64_t > &Ops, int64_t Offset)
Append Ops with operations to apply the Offset.
element_iterator elements_begin() const
LLVM_ABI uint64_t getConstantValue() const
Return the value of a constant expression, as recognized by isConstant().
ArrayRef< uint64_t > getElements() const
LLVM_ABI std::optional< SignedOrUnsignedConstant > isConstant() const
Determine whether this represents a constant value, if so.
DIDerivedType * getStaticDataMemberDeclaration() const
MDTuple * getTemplateParams() const
StringRef getLinkageName() const
StringRef getDisplayName() const
DINodeArray getAnnotations() const
An imported module (C++ using directive or similar).
bool isArtificial() const
std::optional< unsigned > getCoroSuspendIdx() const
DILocalScope * getScope() const
A scope for locals.
LLVM_ABI DILocalScope * getNonLexicalBlockFileScope() const
Get the first non DILexicalBlockFile scope of this scope.
Tagged DWARF-like metadata node.
LLVM_ABI dwarf::Tag getTag() const
Base class for scope-like contexts.
Subprogram description. Uses SubclassData1.
Base class for types.
uint32_t getAlignInBytes() const
DIScope * getScope() const
DIType * getType() 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...
Definition DwarfDebug.h:66
const DINode * getEntity() const
Accessors.
Definition DwarfDebug.h:86
void setDIE(DIE &D)
Definition DwarfDebug.h:92
DIE * getDIE() const
Definition DwarfDebug.h:88
This class is used to track label information.
Definition DwarfDebug.h:290
ArrayRef< DbgValueLocEntry > getLocEntries() const
bool isVariadic() const
This class is used to track local variable information.
Definition DwarfDebug.h:215
bool isArtificial() const
Return true if DbgVariable is artificial.
Definition DwarfDebug.h:263
dwarf::Tag getTag() const
Definition DwarfDebug.h:254
bool isObjectPointer() const
Definition DwarfDebug.h:271
const DILocalVariable * getVariable() const
Definition DwarfDebug.h:247
StringRef getName() const
Definition DwarfDebug.h:251
const DIType * getType() const
Loc::Variant & asVariant()
To workaround P2162R0 https://github.com/cplusplus/papers/issues/873 the base class subobject needs t...
Definition DwarfDebug.h:221
ValueT lookup(const_arg_type_t< KeyT > Val) const
Return the entry for the specified key, or a default constructed value if no such entry exists.
Definition DenseMap.h:793
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
Definition DenseMap.h:827
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 addLinkageNamesToDeclarations(const DwarfDebug &DD, const DISubprogram &CalleeSP, DIE &CalleeDIE)
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 addMemoryLocation(DIE &Die, dwarf::Attribute Attribute, const MachineLocation &Location, int64_t Offset)
Add a memory location exprloc to DIE with attribute Attribute at Location + Offset.
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 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 & constructCallSiteEntryDIE(DIE &ScopeDIE, const DISubprogram *CalleeSP, const Function *CalleeF, bool IsTail, const MCSymbol *PCAddr, const MCSymbol *CallAddr, MachineLocation CallTarget, int64_t Offset, DIType *AllocSiteTy)
Construct a call site entry DIE describing a call within Scope to a callee described by CalleeSP and ...
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.
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 * 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.
DIE * getOrCreateLexicalBlockDIE(LexicalScope *Scope, DIE &ParentDIE)
Get if available or create a new DW_TAG_lexical_block for the given LexicalScope and attach DW_AT_low...
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.
void addGlobalTypeImpl(const DIType *Ty, const DIE &Die, const DIScope *Context) override
Add a new global type to the compile unit.
void resolvePendingLocalScopeDIEs()
Move DIEs of function-local entities from pending DIEs to the DIEs of their scopes in abstract or con...
unsigned getOrCreateSourceID(const DIFile *File) override
Look up the source ID for the given file.
void constructScopeDIE(LexicalScope *Scope, DIE &ParentScopeDIE)
DwarfCompileUnit(unsigned UID, const DICompileUnit *Node, AsmPrinter *A, DwarfDebug *DW, DwarfFile *DWU, UnitKind Kind=UnitKind::Full)
DIE * constructLabelDIE(DbgLabel &DL, const LexicalScope &Scope)
Construct a DIE for the given DbgLabel.
void addGlobalTypeUnitType(const DIType *Ty, const DIScope *Context)
Add a new global type present in a type unit to this compile unit.
DbgEntity * getExistingAbstractEntity(const DINode *Node)
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.
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.
Definition DwarfDebug.h:352
uint16_t getDwarfVersion() const
Returns the Dwarf Version.
DwarfCompileUnit * lookupCU(const DIE *Die)
Find the matching DwarfCompileUnit for the given CU DIE.
Definition DwarfDebug.h:956
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 split DWARF.
Definition DwarfDebug.h:876
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...
bool addExpression(DIExpressionCursor &&Expr)
Emit all remaining operations in the DIExpressionCursor.
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 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
Definition DwarfUnit.h:114
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)
Definition DwarfUnit.h:86
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.
bool shouldPlaceInUnitDIE(const DISubprogram *SP, bool Minimal)
Definition DwarfUnit.h:350
DwarfDebug * DD
Definition DwarfUnit.h:56
const DICompileUnit * CUNode
MDNode for the compile unit.
Definition DwarfUnit.h:41
virtual DIE * getOrCreateSubprogramDIE(const DISubprogram *SP, const Function *FnHint, bool Minimal=false)
DIE * getOrCreateSubprogramContextDIE(const DISubprogram *SP, bool IgnoreScope)
Definition DwarfUnit.h:355
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.
Definition DwarfUnit.h:50
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)
Definition DwarfUnit.cpp:87
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
Definition DwarfUnit.h:44
DIE * getOrCreateModule(const DIModule *M)
const DICompileUnit * getCUNode() const
Definition DwarfUnit.h:113
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.
DwarfFile * DU
Definition DwarfUnit.h:57
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.
Definition DwarfUnit.h:53
void addFlag(DIE &Die, dwarf::Attribute Attribute)
Add a flag that is true to the DIE.
AsmPrinter * Asm
Target of Dwarf emission.
Definition DwarfUnit.h:47
unsigned getUniqueID() const
Gets Unique ID for this unit.
Definition DwarfUnit.h:103
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.
Definition DwarfDebug.h:143
unsigned getDebugLocListIndex() const
Definition DwarfDebug.h:154
std::optional< uint8_t > getDebugLocListTagOffset() const
Definition DwarfDebug.h:155
Single value location description.
Definition DwarfDebug.h:132
Base class for the full range of assembler expressions which are needed for parsing.
Definition MCExpr.h:34
MCSection * getDwarfRangesSection() const
MCSection * getDwarfAddrSection() const
MCSection * getDwarfLineSection() const
MCSymbol * getBeginSymbol()
Definition MCSection.h:653
void setType(wasm::WasmSymbolType type)
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
Definition MCSymbol.h:42
bool isDefined() const
isDefined - Check if this symbol is defined (i.e., it has an address).
Definition MCSymbol.h:233
Tuple of metadata.
Definition Metadata.h:1496
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
unsigned getReg() const
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:68
StringRef getName() const
Get a short "name" for the module.
Definition Module.h:316
Wrapper class representing virtual and physical registers.
Definition Register.h:20
static constexpr bool isPhysicalRegister(unsigned Reg)
Return true if the specified register number is in the physical register namespace.
Definition Register.h:60
Implements a dense probed hash-table based set with some number of buckets stored inline.
Definition DenseSet.h:295
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
Definition SmallString.h:28
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.
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
constexpr bool empty() const
Check if the string is empty.
Definition StringRef.h:141
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...
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
virtual const TargetRegisterInfo * getRegisterInfo() const =0
Return the target's register information.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition Twine.h:82
StringRef toStringRef(SmallVectorImpl< char > &Out) const
This returns the twine as a single StringRef if it can be represented as such.
Definition Twine.h:461
std::pair< iterator, bool > insert(const ValueT &V)
Definition DenseSet.h:210
size_type count(const_arg_type_t< ValueT > V) const
Return 1 if the specified key is in the set, 0 otherwise.
Definition DenseSet.h:188
A DeclContext is a named program scope that is used for ODR uniquing of types.
bool tuneForSCE() const
Definition DwarfDebug.h:980
LLVM_ABI StringRef AttributeEncodingString(unsigned Encoding)
Definition Dwarf.cpp:264
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ Entry
Definition COFF.h:862
constexpr MCPhysReg SP
initializer< Ty > init(const Ty &Val)
@ DW_INL_inlined
Definition Dwarf.h:880
Attribute
Attributes.
Definition Dwarf.h:125
UnitType
Constants for unit types in DWARF v5.
Definition Dwarf.h:999
@ DW_OP_LLVM_implicit_pointer
Only used in LLVM metadata.
Definition Dwarf.h:148
@ WASM_TYPE_I64
Definition Wasm.h:57
@ WASM_TYPE_I32
Definition Wasm.h:56
@ WASM_SYMBOL_TYPE_GLOBAL
Definition Wasm.h:233
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.
Definition Casting.h:643
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 ...
Definition Casting.h:732
LLVM_ABI bool isRangeRelaxable(const MCSymbol *Begin, const MCSymbol *End)
Definition MCSymbol.cpp:95
std::pair< const MachineInstr *, const MachineInstr * > InsnRange
This is used to track range of instructions with identical lexical scope.
auto dyn_cast_or_null(const Y &Val)
Definition Casting.h:753
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1762
auto reverse(ContainerTy &&C)
Definition STLExtras.h:408
@ Apple
.apple_names, .apple_namespaces, .apple_types, .apple_objc.
Definition DwarfDebug.h:347
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...
Definition Casting.h:547
@ Global
Append to llvm.global_dtors.
constexpr T divideCeil(U Numerator, V Denominator)
Returns the integer ceil(Numerator / Denominator).
Definition MathExtras.h:389
@ Sub
Subtraction of integers.
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Count
Definition InstrProf.h:145
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...
Definition STLExtras.h:2028
DWARFExpression::Operation Op
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
@ End
Run the machine verifier once, at the end of the pipeline.
Definition CodeGen.h:320
LLVM_ABI DISubprogram * getDISubprogram(const MDNode *Scope)
Find subprogram that is enclosing this scope.
Single location defined by (potentially multiple) EntryValueInfo.
Definition DwarfDebug.h:173
std::set< EntryValueInfo > EntryValues
Definition DwarfDebug.h:174
Single location defined by (potentially multiple) MMI entries.
Definition DwarfDebug.h:160
const std::set< FrameIndexExpr > & getFrameIndexExprs() const
Get the FI entries, sorted by fragment offset.
const MCSymbol * End
Definition DwarfFile.h:41
const MCSymbol * Begin
Definition DwarfFile.h:40
Helper used to pair up a symbol and its DWARF compile unit.
Definition DwarfDebug.h:336
union llvm::TargetFrameLowering::DwarfFrameBase::@004076321055032247336074224075335064105264310375 Location
enum llvm::TargetFrameLowering::DwarfFrameBase::FrameBaseKind Kind