LLVM 21.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"
40#include <optional>
41#include <string>
42#include <utility>
43
44using namespace llvm;
45
46/// Query value using AddLinkageNamesToDeclCallOriginsForTuning.
48 "add-linkage-names-to-declaration-call-origins", cl::Hidden,
49 cl::desc("Add DW_AT_linkage_name to function declaration DIEs "
50 "referenced by DW_AT_call_origin attributes. Enabled by default "
51 "for -gsce debugger tuning."));
52
54 "emit-func-debug-line-table-offsets", cl::Hidden,
55 cl::desc("Include line table offset in function's debug info and emit end "
56 "sequence after each function's line data."),
57 cl::init(false));
58
60 bool EnabledByDefault = DD->tuneForSCE();
61 if (EnabledByDefault)
62 return AddLinkageNamesToDeclCallOrigins != cl::boolOrDefault::BOU_FALSE;
63 return AddLinkageNamesToDeclCallOrigins == cl::boolOrDefault::BOU_TRUE;
64}
65
67
68 // According to DWARF Debugging Information Format Version 5,
69 // 3.1.2 Skeleton Compilation Unit Entries:
70 // "When generating a split DWARF object file (see Section 7.3.2
71 // on page 187), the compilation unit in the .debug_info section
72 // is a "skeleton" compilation unit with the tag DW_TAG_skeleton_unit"
73 if (DW->getDwarfVersion() >= 5 && Kind == UnitKind::Skeleton)
74 return dwarf::DW_TAG_skeleton_unit;
75
76 return dwarf::DW_TAG_compile_unit;
77}
78
79/// Translate NVVM IR address space code to DWARF correspondent value
80static unsigned translateToNVVMDWARFAddrSpace(unsigned AddrSpace) {
81 switch (AddrSpace) {
92 default:
94 "Cannot translate unknown address space to DWARF address space");
95 return AddrSpace;
96 }
97}
98
100 AsmPrinter *A, DwarfDebug *DW,
101 DwarfFile *DWU, UnitKind Kind)
102 : DwarfUnit(GetCompileUnitType(Kind, DW), Node, A, DW, DWU, UID) {
103 insertDIE(Node, &getUnitDie());
104 MacroLabelBegin = Asm->createTempSymbol("cu_macro_begin");
105}
106
107/// addLabelAddress - Add a dwarf label attribute data and value using
108/// DW_FORM_addr or DW_FORM_GNU_addr_index.
110 const MCSymbol *Label) {
111 if ((Skeleton || !DD->useSplitDwarf()) && Label)
112 DD->addArangeLabel(SymbolCU(this, Label));
113
114 // Don't use the address pool in non-fission or in the skeleton unit itself.
115 if ((!DD->useSplitDwarf() || !Skeleton) && DD->getDwarfVersion() < 5)
116 return addLocalLabelAddress(Die, Attribute, Label);
117
118 bool UseAddrOffsetFormOrExpressions =
120
121 const MCSymbol *Base = nullptr;
122 if (Label->isInSection() && UseAddrOffsetFormOrExpressions)
123 Base = DD->getSectionLabel(&Label->getSection());
124
125 if (!Base || Base == Label) {
126 unsigned idx = DD->getAddressPool().getIndex(Label);
128 DD->getDwarfVersion() >= 5 ? dwarf::DW_FORM_addrx
129 : dwarf::DW_FORM_GNU_addr_index,
130 DIEInteger(idx));
131 return;
132 }
133
134 // Could be extended to work with DWARFv4 Split DWARF if that's important for
135 // someone. In that case DW_FORM_data would be used.
136 assert(DD->getDwarfVersion() >= 5 &&
137 "Addr+offset expressions are only valuable when using debug_addr (to "
138 "reduce relocations) available in DWARFv5 or higher");
140 auto *Loc = new (DIEValueAllocator) DIEBlock();
141 addPoolOpAddress(*Loc, Label);
142 addBlock(Die, Attribute, dwarf::DW_FORM_exprloc, Loc);
143 } else
144 addAttribute(Die, Attribute, dwarf::DW_FORM_LLVM_addrx_offset,
146 DD->getAddressPool().getIndex(Base), Label, Base));
147}
148
151 const MCSymbol *Label) {
152 if (Label)
153 addAttribute(Die, Attribute, dwarf::DW_FORM_addr, DIELabel(Label));
154 else
155 addAttribute(Die, Attribute, dwarf::DW_FORM_addr, DIEInteger(0));
156}
157
159 // If we print assembly, we can't separate .file entries according to
160 // compile units. Thus all files will belong to the default compile unit.
161
162 // FIXME: add a better feature test than hasRawTextSupport. Even better,
163 // extend .file to support this.
164 unsigned CUID = Asm->OutStreamer->hasRawTextSupport() ? 0 : getUniqueID();
165 if (!File)
166 return Asm->OutStreamer->emitDwarfFileDirective(0, "", "", std::nullopt,
167 std::nullopt, CUID);
168
169 if (LastFile != File) {
170 LastFile = File;
171 LastFileID = Asm->OutStreamer->emitDwarfFileDirective(
172 0, File->getDirectory(), File->getFilename(), DD->getMD5AsBytes(File),
173 File->getSource(), CUID);
174 }
175 return LastFileID;
176}
177
179 const DIGlobalVariable *GV, ArrayRef<GlobalExpr> GlobalExprs) {
180 // Check for pre-existence.
181 if (DIE *Die = getDIE(GV))
182 return Die;
183
184 assert(GV);
185
186 auto *GVContext = GV->getScope();
187 const DIType *GTy = GV->getType();
188
189 auto *CB = GVContext ? dyn_cast<DICommonBlock>(GVContext) : nullptr;
190 DIE *ContextDIE = CB ? getOrCreateCommonBlock(CB, GlobalExprs)
191 : getOrCreateContextDIE(GVContext);
192
193 // Add to map.
194 DIE *VariableDIE = &createAndAddDIE(GV->getTag(), *ContextDIE, GV);
196 if (auto *SDMDecl = GV->getStaticDataMemberDeclaration()) {
197 DeclContext = SDMDecl->getScope();
198 assert(SDMDecl->isStaticMember() && "Expected static member decl");
199 assert(GV->isDefinition());
200 // We need the declaration DIE that is in the static member's class.
201 DIE *VariableSpecDIE = getOrCreateStaticMemberDIE(SDMDecl);
202 addDIEEntry(*VariableDIE, dwarf::DW_AT_specification, *VariableSpecDIE);
203 // If the global variable's type is different from the one in the class
204 // member type, assume that it's more specific and also emit it.
205 if (GTy != SDMDecl->getBaseType())
206 addType(*VariableDIE, GTy);
207 } else {
208 DeclContext = GV->getScope();
209 // Add name and type.
210 StringRef DisplayName = GV->getDisplayName();
211 if (!DisplayName.empty())
212 addString(*VariableDIE, dwarf::DW_AT_name, GV->getDisplayName());
213 if (GTy)
214 addType(*VariableDIE, GTy);
215
216 // Add scoping info.
217 if (!GV->isLocalToUnit())
218 addFlag(*VariableDIE, dwarf::DW_AT_external);
219
220 // Add line number info.
221 addSourceLine(*VariableDIE, GV);
222 }
223
224 if (!GV->isDefinition())
225 addFlag(*VariableDIE, dwarf::DW_AT_declaration);
226 else
227 addGlobalName(GV->getName(), *VariableDIE, DeclContext);
228
229 addAnnotation(*VariableDIE, GV->getAnnotations());
230
231 if (uint32_t AlignInBytes = GV->getAlignInBytes())
232 addUInt(*VariableDIE, dwarf::DW_AT_alignment, dwarf::DW_FORM_udata,
233 AlignInBytes);
234
235 if (MDTuple *TP = GV->getTemplateParams())
236 addTemplateParams(*VariableDIE, DINodeArray(TP));
237
238 // Add location.
239 addLocationAttribute(VariableDIE, GV, GlobalExprs);
240
241 return VariableDIE;
242}
243
245 DIE *VariableDIE, const DIGlobalVariable *GV, ArrayRef<GlobalExpr> GlobalExprs) {
246 bool addToAccelTable = false;
247 DIELoc *Loc = nullptr;
248 std::optional<unsigned> NVPTXAddressSpace;
249 std::unique_ptr<DIEDwarfExpression> DwarfExpr;
250 for (const auto &GE : GlobalExprs) {
251 const GlobalVariable *Global = GE.Var;
252 const DIExpression *Expr = GE.Expr;
253
254 // For compatibility with DWARF 3 and earlier,
255 // DW_AT_location(DW_OP_constu, X, DW_OP_stack_value) or
256 // DW_AT_location(DW_OP_consts, X, DW_OP_stack_value) becomes
257 // DW_AT_const_value(X).
258 if (GlobalExprs.size() == 1 && Expr && Expr->isConstant()) {
259 addToAccelTable = true;
261 *VariableDIE,
263 *Expr->isConstant(),
264 Expr->getElement(1));
265 break;
266 }
267
268 // We cannot describe the location of dllimport'd variables: the
269 // computation of their address requires loads from the IAT.
270 if (Global && Global->hasDLLImportStorageClass())
271 continue;
272
273 // Nothing to describe without address or constant.
274 if (!Global && (!Expr || !Expr->isConstant()))
275 continue;
276
277 if (Global && Global->isThreadLocal() &&
279 continue;
280
281 if (!Loc) {
282 addToAccelTable = true;
283 Loc = new (DIEValueAllocator) DIELoc;
284 DwarfExpr = std::make_unique<DIEDwarfExpression>(*Asm, *this, *Loc);
285 }
286
287 if (Expr) {
288 // cuda-gdb special requirement. See NVPTXAS::DWARF_AddressSpace
289 // Decode DW_OP_constu <DWARF Address Space> DW_OP_swap DW_OP_xderef
290 // sequence to specify corresponding address space.
291 if (Asm->TM.getTargetTriple().isNVPTX() && DD->tuneForGDB()) {
292 unsigned LocalNVPTXAddressSpace;
293 const DIExpression *NewExpr =
294 DIExpression::extractAddressClass(Expr, LocalNVPTXAddressSpace);
295 if (NewExpr != Expr) {
296 Expr = NewExpr;
297 NVPTXAddressSpace = LocalNVPTXAddressSpace;
298 }
299 }
300 DwarfExpr->addFragmentOffset(Expr);
301 }
302
303 if (Global) {
304 const MCSymbol *Sym = Asm->getSymbol(Global);
305 // 16-bit platforms like MSP430 and AVR take this path, so sink this
306 // assert to platforms that use it.
307 auto GetPointerSizedFormAndOp = [this]() {
308 unsigned PointerSize = Asm->MAI->getCodePointerSize();
309 assert((PointerSize == 4 || PointerSize == 8) &&
310 "Add support for other sizes if necessary");
311 struct FormAndOp {
312 dwarf::Form Form;
314 };
315 return PointerSize == 4
316 ? FormAndOp{dwarf::DW_FORM_data4, dwarf::DW_OP_const4u}
317 : FormAndOp{dwarf::DW_FORM_data8, dwarf::DW_OP_const8u};
318 };
319 if (Global->isThreadLocal()) {
320 if (Asm->TM.getTargetTriple().isWasm()) {
321 // FIXME This is not guaranteed, but in practice, in static linking,
322 // if present, __tls_base's index is 1. This doesn't hold for dynamic
323 // linking, so TLS variables used in dynamic linking won't have
324 // correct debug info for now. See
325 // https://github.com/llvm/llvm-project/blob/19afbfe33156d211fa959dadeea46cd17b9c723c/lld/wasm/Driver.cpp#L786-L823
326 addWasmRelocBaseGlobal(Loc, "__tls_base", 1);
327 addOpAddress(*Loc, Sym);
328 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
329 } else if (Asm->TM.useEmulatedTLS()) {
330 // TODO: add debug info for emulated thread local mode.
331 } else {
332 // FIXME: Make this work with -gsplit-dwarf.
333 // Based on GCC's support for TLS:
334 if (!DD->useSplitDwarf()) {
335 auto FormAndOp = GetPointerSizedFormAndOp();
336 // 1) Start with a constNu of the appropriate pointer size
337 addUInt(*Loc, dwarf::DW_FORM_data1, FormAndOp.Op);
338 // 2) containing the (relocated) offset of the TLS variable
339 // within the module's TLS block.
340 addExpr(*Loc, FormAndOp.Form,
342 } else {
343 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_const_index);
344 addUInt(*Loc, dwarf::DW_FORM_udata,
345 DD->getAddressPool().getIndex(Sym, /* TLS */ true));
346 }
347 // 3) followed by an OP to make the debugger do a TLS lookup.
348 addUInt(*Loc, dwarf::DW_FORM_data1,
349 DD->useGNUTLSOpcode() ? dwarf::DW_OP_GNU_push_tls_address
350 : dwarf::DW_OP_form_tls_address);
351 }
352 } else if (Asm->TM.getTargetTriple().isWasm() &&
354 // FIXME This is not guaranteed, but in practice, if present,
355 // __memory_base's index is 1. See
356 // https://github.com/llvm/llvm-project/blob/19afbfe33156d211fa959dadeea46cd17b9c723c/lld/wasm/Driver.cpp#L786-L823
357 addWasmRelocBaseGlobal(Loc, "__memory_base", 1);
358 addOpAddress(*Loc, Sym);
359 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
360 } else if ((Asm->TM.getRelocationModel() == Reloc::RWPI ||
364 .isReadOnly()) {
365 auto FormAndOp = GetPointerSizedFormAndOp();
366 // Constant
367 addUInt(*Loc, dwarf::DW_FORM_data1, FormAndOp.Op);
368 // Relocation offset
369 addExpr(*Loc, FormAndOp.Form,
371 // Base register
373 unsigned DwarfBaseReg =
374 Asm->TM.getMCRegisterInfo()->getDwarfRegNum(BaseReg, false);
375 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + DwarfBaseReg);
376 // Offset from base register
377 addSInt(*Loc, dwarf::DW_FORM_sdata, 0);
378 // Operation
379 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
380 } else {
381 DD->addArangeLabel(SymbolCU(this, Sym));
382 addOpAddress(*Loc, Sym);
383 }
384 if (Asm->TM.getTargetTriple().isNVPTX() && DD->tuneForGDB() &&
385 !NVPTXAddressSpace)
386 NVPTXAddressSpace =
387 translateToNVVMDWARFAddrSpace(Global->getType()->getAddressSpace());
388 }
389 // Global variables attached to symbols are memory locations.
390 // It would be better if this were unconditional, but malformed input that
391 // mixes non-fragments and fragments for the same variable is too expensive
392 // to detect in the verifier.
393 if (DwarfExpr->isUnknownLocation())
394 DwarfExpr->setMemoryLocationKind();
395 DwarfExpr->addExpression(Expr);
396 }
397 if (Asm->TM.getTargetTriple().isNVPTX() && DD->tuneForGDB()) {
398 // cuda-gdb special requirement. See NVPTXAS::DWARF_AddressSpace
399 addUInt(*VariableDIE, dwarf::DW_AT_address_class, dwarf::DW_FORM_data1,
400 NVPTXAddressSpace.value_or(NVPTXAS::DWARF_ADDR_global_space));
401 }
402 if (Loc)
403 addBlock(*VariableDIE, dwarf::DW_AT_location, DwarfExpr->finalize());
404
405 if (DD->useAllLinkageNames())
406 addLinkageName(*VariableDIE, GV->getLinkageName());
407
408 if (addToAccelTable) {
410 *VariableDIE);
411
412 // If the linkage name is different than the name, go ahead and output
413 // that as well into the name table.
414 if (GV->getLinkageName() != "" && GV->getName() != GV->getLinkageName() &&
417 *VariableDIE);
418 }
419}
420
422 const DICommonBlock *CB, ArrayRef<GlobalExpr> GlobalExprs) {
423 // Check for pre-existence.
424 if (DIE *NDie = getDIE(CB))
425 return NDie;
426 DIE *ContextDIE = getOrCreateContextDIE(CB->getScope());
427 DIE &NDie = createAndAddDIE(dwarf::DW_TAG_common_block, *ContextDIE, CB);
428 StringRef Name = CB->getName().empty() ? "_BLNK_" : CB->getName();
429 addString(NDie, dwarf::DW_AT_name, Name);
430 addGlobalName(Name, NDie, CB->getScope());
431 if (CB->getFile())
432 addSourceLine(NDie, CB->getLineNo(), CB->getFile());
433 if (DIGlobalVariable *V = CB->getDecl())
434 getCU().addLocationAttribute(&NDie, V, GlobalExprs);
435 return &NDie;
436}
437
440
441 auto *PrevCU = DD->getPrevCU();
442 bool SameAsPrevCU = this == PrevCU;
443 DD->setPrevCU(this);
444 // If we have no current ranges just add the range and return, otherwise,
445 // check the current section and CU against the previous section and CU we
446 // emitted into and the subprogram was contained within. If these are the
447 // same then extend our current range, otherwise add this as a new range.
448 if (CURanges.empty() || !SameAsPrevCU ||
449 (&CURanges.back().End->getSection() !=
450 &Range.End->getSection())) {
451 // Before a new range is added, always terminate the prior line table.
452 if (PrevCU)
453 DD->terminateLineTable(PrevCU);
454 CURanges.push_back(Range);
455 return;
456 }
457
458 CURanges.back().End = Range.End;
459}
460
463 return;
464
467 LineTableStartSym = TLOF.getDwarfLineSection()->getBeginSymbol();
468 } else {
469 LineTableStartSym =
470 Asm->OutStreamer->getDwarfLineTableSymbol(getUniqueID());
471 }
472
473 // DW_AT_stmt_list is a offset of line number information for this
474 // compile unit in debug_line section. For split dwarf this is
475 // left in the skeleton CU and so not included.
476 // The line table entries are not always emitted in assembly, so it
477 // is not okay to use line_table_start here.
478 addSectionLabel(getUnitDie(), dwarf::DW_AT_stmt_list, LineTableStartSym,
480}
481
484 addSectionLabel(D, dwarf::DW_AT_stmt_list, LineTableStartSym,
486}
487
489 const MCSymbol *End) {
490 assert(Begin && "Begin label should not be null!");
491 assert(End && "End label should not be null!");
492 assert(Begin->isDefined() && "Invalid starting label");
493 assert(End->isDefined() && "Invalid end label");
494
495 addLabelAddress(D, dwarf::DW_AT_low_pc, Begin);
496 if (DD->getDwarfVersion() < 4)
497 addLabelAddress(D, dwarf::DW_AT_high_pc, End);
498 else
499 addLabelDelta(D, dwarf::DW_AT_high_pc, End, Begin);
500}
501
502// Add info for Wasm-global-based relocation.
503// 'GlobalIndex' is used for split dwarf, which currently relies on a few
504// assumptions that are not guaranteed in a formal way but work in practice.
505void DwarfCompileUnit::addWasmRelocBaseGlobal(DIELoc *Loc, StringRef GlobalName,
506 uint64_t GlobalIndex) {
507 // FIXME: duplicated from Target/WebAssembly/WebAssembly.h
508 // don't want to depend on target specific headers in this code?
509 const unsigned TI_GLOBAL_RELOC = 3;
510 unsigned PointerSize = Asm->getDataLayout().getPointerSize();
511 auto *Sym = cast<MCSymbolWasm>(Asm->GetExternalSymbolSymbol(GlobalName));
512 // FIXME: this repeats what WebAssemblyMCInstLower::
513 // GetExternalSymbolSymbol does, since if there's no code that
514 // refers to this symbol, we have to set it here.
516 Sym->setGlobalType(wasm::WasmGlobalType{
517 static_cast<uint8_t>(PointerSize == 4 ? wasm::WASM_TYPE_I32
519 true});
520 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_WASM_location);
521 addSInt(*Loc, dwarf::DW_FORM_sdata, TI_GLOBAL_RELOC);
522 if (!isDwoUnit()) {
523 addLabel(*Loc, dwarf::DW_FORM_data4, Sym);
524 } else {
525 // FIXME: when writing dwo, we need to avoid relocations. Probably
526 // the "right" solution is to treat globals the way func and data
527 // symbols are (with entries in .debug_addr).
528 // For now we hardcode the indices in the callsites. Global indices are not
529 // fixed, but in practice a few are fixed; for example, __stack_pointer is
530 // always index 0.
531 addUInt(*Loc, dwarf::DW_FORM_data4, GlobalIndex);
532 }
533}
534
535// Find DIE for the given subprogram and attach appropriate DW_AT_low_pc
536// and DW_AT_high_pc attributes. If there are global variables in this
537// scope then create and insert DIEs for these variables.
539 MCSymbol *LineTableSym) {
542 // If basic block sections are on, ranges for each basic block section has
543 // to be emitted separately.
544 for (const auto &R : Asm->MBBSectionRanges)
545 BB_List.push_back({R.second.BeginLabel, R.second.EndLabel});
546
547 attachRangesOrLowHighPC(*SPDie, BB_List);
548
552 addFlag(*SPDie, dwarf::DW_AT_APPLE_omit_frame_ptr);
553
554 if (emitFuncLineTableOffsets() && LineTableSym) {
556 *SPDie, dwarf::DW_AT_LLVM_stmt_sequence, LineTableSym,
558 }
559
560 // Only include DW_AT_frame_base in full debug info
564 TFI->getDwarfFrameBase(*Asm->MF);
565 switch (FrameBase.Kind) {
568 MachineLocation Location(FrameBase.Location.Reg);
569 addAddress(*SPDie, dwarf::DW_AT_frame_base, Location);
570 }
571 break;
572 }
574 DIELoc *Loc = new (DIEValueAllocator) DIELoc;
575 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_call_frame_cfa);
576 if (FrameBase.Location.Offset != 0) {
577 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_consts);
578 addSInt(*Loc, dwarf::DW_FORM_sdata, FrameBase.Location.Offset);
579 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
580 }
581 addBlock(*SPDie, dwarf::DW_AT_frame_base, Loc);
582 break;
583 }
585 // FIXME: duplicated from Target/WebAssembly/WebAssembly.h
586 const unsigned TI_GLOBAL_RELOC = 3;
587 if (FrameBase.Location.WasmLoc.Kind == TI_GLOBAL_RELOC) {
588 // These need to be relocatable.
589 DIELoc *Loc = new (DIEValueAllocator) DIELoc;
590 assert(FrameBase.Location.WasmLoc.Index == 0); // Only SP so far.
591 // For now, since we only ever use index 0, this should work as-is.
592 addWasmRelocBaseGlobal(Loc, "__stack_pointer",
593 FrameBase.Location.WasmLoc.Index);
594 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_stack_value);
595 addBlock(*SPDie, dwarf::DW_AT_frame_base, Loc);
596 } else {
597 DIELoc *Loc = new (DIEValueAllocator) DIELoc;
598 DIEDwarfExpression DwarfExpr(*Asm, *this, *Loc);
599 DIExpressionCursor Cursor({});
600 DwarfExpr.addWasmLocation(FrameBase.Location.WasmLoc.Kind,
601 FrameBase.Location.WasmLoc.Index);
602 DwarfExpr.addExpression(std::move(Cursor));
603 addBlock(*SPDie, dwarf::DW_AT_frame_base, DwarfExpr.finalize());
604 }
605 break;
606 }
607 }
608 }
609
610 // Add name to the name table, we do this here because we're guaranteed
611 // to have concrete versions of our DW_TAG_subprogram nodes.
612 DD->addSubprogramNames(*this, CUNode->getNameTableKind(), SP, *SPDie);
613
614 return *SPDie;
615}
616
617// Construct a DIE for this scope.
619 DIE &ParentScopeDIE) {
620 if (!Scope || !Scope->getScopeNode())
621 return;
622
623 auto *DS = Scope->getScopeNode();
624
625 assert((Scope->getInlinedAt() || !isa<DISubprogram>(DS)) &&
626 "Only handle inlined subprograms here, use "
627 "constructSubprogramScopeDIE for non-inlined "
628 "subprograms");
629
630 // Emit inlined subprograms.
631 if (Scope->getParent() && isa<DISubprogram>(DS)) {
632 DIE *ScopeDIE = constructInlinedScopeDIE(Scope, ParentScopeDIE);
633 assert(ScopeDIE && "Scope DIE should not be null.");
634 createAndAddScopeChildren(Scope, *ScopeDIE);
635 return;
636 }
637
638 // Early exit when we know the scope DIE is going to be null.
639 if (DD->isLexicalScopeDIENull(Scope))
640 return;
641
642 // Emit lexical blocks.
643 DIE *ScopeDIE = constructLexicalScopeDIE(Scope);
644 assert(ScopeDIE && "Scope DIE should not be null.");
645
646 ParentScopeDIE.addChild(ScopeDIE);
647 createAndAddScopeChildren(Scope, *ScopeDIE);
648}
649
652
653 HasRangeLists = true;
654
655 // Add the range list to the set of ranges to be emitted.
656 auto IndexAndList =
657 (DD->getDwarfVersion() < 5 && Skeleton ? Skeleton->DU : DU)
658 ->addRange(*(Skeleton ? Skeleton : this), std::move(Range));
659
660 uint32_t Index = IndexAndList.first;
661 auto &List = *IndexAndList.second;
662
663 // Under fission, ranges are specified by constant offsets relative to the
664 // CU's DW_AT_GNU_ranges_base.
665 // FIXME: For DWARF v5, do not generate the DW_AT_ranges attribute under
666 // fission until we support the forms using the .debug_addr section
667 // (DW_RLE_startx_endx etc.).
668 if (DD->getDwarfVersion() >= 5)
669 addUInt(ScopeDIE, dwarf::DW_AT_ranges, dwarf::DW_FORM_rnglistx, Index);
670 else {
672 const MCSymbol *RangeSectionSym =
674 if (isDwoUnit())
675 addSectionDelta(ScopeDIE, dwarf::DW_AT_ranges, List.Label,
676 RangeSectionSym);
677 else
678 addSectionLabel(ScopeDIE, dwarf::DW_AT_ranges, List.Label,
679 RangeSectionSym);
680 }
681}
682
684 DIE &Die, SmallVector<RangeSpan, 2> Ranges) {
685 assert(!Ranges.empty());
686 if (!DD->useRangesSection() ||
687 (Ranges.size() == 1 &&
688 (!DD->alwaysUseRanges(*this) ||
689 DD->getSectionLabel(&Ranges.front().Begin->getSection()) ==
690 Ranges.front().Begin))) {
691 const RangeSpan &Front = Ranges.front();
692 const RangeSpan &Back = Ranges.back();
693 attachLowHighPC(Die, Front.Begin, Back.End);
694 } else
695 addScopeRangeList(Die, std::move(Ranges));
696}
697
699 DIE &Die, const SmallVectorImpl<InsnRange> &Ranges) {
701 List.reserve(Ranges.size());
702 for (const InsnRange &R : Ranges) {
703 auto *BeginLabel = DD->getLabelBeforeInsn(R.first);
704 auto *EndLabel = DD->getLabelAfterInsn(R.second);
705
706 const auto *BeginMBB = R.first->getParent();
707 const auto *EndMBB = R.second->getParent();
708
709 const auto *MBB = BeginMBB;
710 // Basic block sections allows basic block subsets to be placed in unique
711 // sections. For each section, the begin and end label must be added to the
712 // list. If there is more than one range, debug ranges must be used.
713 // Otherwise, low/high PC can be used.
714 // FIXME: Debug Info Emission depends on block order and this assumes that
715 // the order of blocks will be frozen beyond this point.
716 do {
717 if (MBB->sameSection(EndMBB) || MBB->isEndSection()) {
718 auto MBBSectionRange = Asm->MBBSectionRanges[MBB->getSectionID()];
719 List.push_back(
720 {MBB->sameSection(BeginMBB) ? BeginLabel
721 : MBBSectionRange.BeginLabel,
722 MBB->sameSection(EndMBB) ? EndLabel : MBBSectionRange.EndLabel});
723 }
724 if (MBB->sameSection(EndMBB))
725 break;
726 MBB = MBB->getNextNode();
727 } while (true);
728 }
729 attachRangesOrLowHighPC(Die, std::move(List));
730}
731
733 DIE &ParentScopeDIE) {
734 assert(Scope->getScopeNode());
735 auto *DS = Scope->getScopeNode();
736 auto *InlinedSP = getDISubprogram(DS);
737 // Find the subprogram's DwarfCompileUnit in the SPMap in case the subprogram
738 // was inlined from another compile unit.
739 DIE *OriginDIE = getAbstractScopeDIEs()[InlinedSP];
740 assert(OriginDIE && "Unable to find original DIE for an inlined subprogram.");
741
742 auto ScopeDIE = DIE::get(DIEValueAllocator, dwarf::DW_TAG_inlined_subroutine);
743 ParentScopeDIE.addChild(ScopeDIE);
744 addDIEEntry(*ScopeDIE, dwarf::DW_AT_abstract_origin, *OriginDIE);
745
746 attachRangesOrLowHighPC(*ScopeDIE, Scope->getRanges());
747
748 // Add the call site information to the DIE.
749 const DILocation *IA = Scope->getInlinedAt();
750 addUInt(*ScopeDIE, dwarf::DW_AT_call_file, std::nullopt,
751 getOrCreateSourceID(IA->getFile()));
752 addUInt(*ScopeDIE, dwarf::DW_AT_call_line, std::nullopt, IA->getLine());
753 if (IA->getColumn())
754 addUInt(*ScopeDIE, dwarf::DW_AT_call_column, std::nullopt, IA->getColumn());
755 if (IA->getDiscriminator() && DD->getDwarfVersion() >= 4)
756 addUInt(*ScopeDIE, dwarf::DW_AT_GNU_discriminator, std::nullopt,
757 IA->getDiscriminator());
758
759 // Add name to the name table, we do this here because we're guaranteed
760 // to have concrete versions of our DW_TAG_inlined_subprogram nodes.
761 DD->addSubprogramNames(*this, CUNode->getNameTableKind(), InlinedSP,
762 *ScopeDIE);
763
764 return ScopeDIE;
765}
766
767// Construct new DW_TAG_lexical_block for this scope and attach
768// DW_AT_low_pc/DW_AT_high_pc labels.
770 if (DD->isLexicalScopeDIENull(Scope))
771 return nullptr;
772 const auto *DS = Scope->getScopeNode();
773
774 auto ScopeDIE = DIE::get(DIEValueAllocator, dwarf::DW_TAG_lexical_block);
775 if (Scope->isAbstractScope()) {
776 assert(!getAbstractScopeDIEs().count(DS) &&
777 "Abstract DIE for this scope exists!");
778 getAbstractScopeDIEs()[DS] = ScopeDIE;
779 return ScopeDIE;
780 }
781 if (!Scope->getInlinedAt()) {
782 assert(!LexicalBlockDIEs.count(DS) &&
783 "Concrete out-of-line DIE for this scope exists!");
784 LexicalBlockDIEs[DS] = ScopeDIE;
785 }
786
787 attachRangesOrLowHighPC(*ScopeDIE, Scope->getRanges());
788
789 return ScopeDIE;
790}
791
793 auto *VariableDie = DIE::get(DIEValueAllocator, DV.getTag());
794 insertDIE(DV.getVariable(), VariableDie);
795 DV.setDIE(*VariableDie);
796 // Abstract variables don't get common attributes later, so apply them now.
797 if (Abstract) {
798 applyCommonDbgVariableAttributes(DV, *VariableDie);
799 } else {
800 std::visit(
801 [&](const auto &V) {
802 applyConcreteDbgVariableAttributes(V, DV, *VariableDie);
803 },
804 DV.asVariant());
805 }
806 return VariableDie;
807}
808
809void DwarfCompileUnit::applyConcreteDbgVariableAttributes(
810 const Loc::Single &Single, const DbgVariable &DV, DIE &VariableDie) {
811 const DbgValueLoc *DVal = &Single.getValueLoc();
812 if (Asm->TM.getTargetTriple().isNVPTX() && DD->tuneForGDB() &&
813 !Single.getExpr()) {
814 // cuda-gdb special requirement. See NVPTXAS::DWARF_AddressSpace
815 // Lack of expression means it is a register.
816 addUInt(VariableDie, dwarf::DW_AT_address_class, dwarf::DW_FORM_data1,
818 }
819 if (!DVal->isVariadic()) {
820 const DbgValueLocEntry *Entry = DVal->getLocEntries().begin();
821 if (Entry->isLocation()) {
822 addVariableAddress(DV, VariableDie, Entry->getLoc());
823 } else if (Entry->isInt()) {
824 auto *Expr = Single.getExpr();
825 if (Expr && Expr->getNumElements()) {
826 DIELoc *Loc = new (DIEValueAllocator) DIELoc;
827 DIEDwarfExpression DwarfExpr(*Asm, *this, *Loc);
828 // If there is an expression, emit raw unsigned bytes.
829 DwarfExpr.addFragmentOffset(Expr);
830 DwarfExpr.addUnsignedConstant(Entry->getInt());
831 DwarfExpr.addExpression(Expr);
832 addBlock(VariableDie, dwarf::DW_AT_location, DwarfExpr.finalize());
833 if (DwarfExpr.TagOffset)
834 addUInt(VariableDie, dwarf::DW_AT_LLVM_tag_offset,
835 dwarf::DW_FORM_data1, *DwarfExpr.TagOffset);
836 } else
837 addConstantValue(VariableDie, Entry->getInt(), DV.getType());
838 } else if (Entry->isConstantFP()) {
839 addConstantFPValue(VariableDie, Entry->getConstantFP());
840 } else if (Entry->isConstantInt()) {
841 addConstantValue(VariableDie, Entry->getConstantInt(), DV.getType());
842 } else if (Entry->isTargetIndexLocation()) {
843 DIELoc *Loc = new (DIEValueAllocator) DIELoc;
844 DIEDwarfExpression DwarfExpr(*Asm, *this, *Loc);
845 const DIBasicType *BT = dyn_cast<DIBasicType>(
846 static_cast<const Metadata *>(DV.getVariable()->getType()));
847 DwarfDebug::emitDebugLocValue(*Asm, BT, *DVal, DwarfExpr);
848 addBlock(VariableDie, dwarf::DW_AT_location, DwarfExpr.finalize());
849 }
850 return;
851 }
852 // If any of the location entries are registers with the value 0,
853 // then the location is undefined.
854 if (any_of(DVal->getLocEntries(), [](const DbgValueLocEntry &Entry) {
855 return Entry.isLocation() && !Entry.getLoc().getReg();
856 }))
857 return;
858 const DIExpression *Expr = Single.getExpr();
859 assert(Expr && "Variadic Debug Value must have an Expression.");
860 DIELoc *Loc = new (DIEValueAllocator) DIELoc;
861 DIEDwarfExpression DwarfExpr(*Asm, *this, *Loc);
862 DwarfExpr.addFragmentOffset(Expr);
863 DIExpressionCursor Cursor(Expr);
865
866 auto AddEntry = [&](const DbgValueLocEntry &Entry,
867 DIExpressionCursor &Cursor) {
868 if (Entry.isLocation()) {
869 if (!DwarfExpr.addMachineRegExpression(TRI, Cursor,
870 Entry.getLoc().getReg()))
871 return false;
872 } else if (Entry.isInt()) {
873 // If there is an expression, emit raw unsigned bytes.
874 DwarfExpr.addUnsignedConstant(Entry.getInt());
875 } else if (Entry.isConstantFP()) {
876 // DwarfExpression does not support arguments wider than 64 bits
877 // (see PR52584).
878 // TODO: Consider chunking expressions containing overly wide
879 // arguments into separate pointer-sized fragment expressions.
880 APInt RawBytes = Entry.getConstantFP()->getValueAPF().bitcastToAPInt();
881 if (RawBytes.getBitWidth() > 64)
882 return false;
883 DwarfExpr.addUnsignedConstant(RawBytes.getZExtValue());
884 } else if (Entry.isConstantInt()) {
885 APInt RawBytes = Entry.getConstantInt()->getValue();
886 if (RawBytes.getBitWidth() > 64)
887 return false;
888 DwarfExpr.addUnsignedConstant(RawBytes.getZExtValue());
889 } else if (Entry.isTargetIndexLocation()) {
890 TargetIndexLocation Loc = Entry.getTargetIndexLocation();
891 // TODO TargetIndexLocation is a target-independent. Currently
892 // only the WebAssembly-specific encoding is supported.
894 DwarfExpr.addWasmLocation(Loc.Index, static_cast<uint64_t>(Loc.Offset));
895 } else {
896 llvm_unreachable("Unsupported Entry type.");
897 }
898 return true;
899 };
900
901 if (!DwarfExpr.addExpression(
902 std::move(Cursor),
903 [&](unsigned Idx, DIExpressionCursor &Cursor) -> bool {
904 return AddEntry(DVal->getLocEntries()[Idx], Cursor);
905 }))
906 return;
907
908 // Now attach the location information to the DIE.
909 addBlock(VariableDie, dwarf::DW_AT_location, DwarfExpr.finalize());
910 if (DwarfExpr.TagOffset)
911 addUInt(VariableDie, dwarf::DW_AT_LLVM_tag_offset, dwarf::DW_FORM_data1,
912 *DwarfExpr.TagOffset);
913}
914
915void DwarfCompileUnit::applyConcreteDbgVariableAttributes(
916 const Loc::Multi &Multi, const DbgVariable &DV, DIE &VariableDie) {
917 addLocationList(VariableDie, dwarf::DW_AT_location,
918 Multi.getDebugLocListIndex());
919 auto TagOffset = Multi.getDebugLocListTagOffset();
920 if (TagOffset)
921 addUInt(VariableDie, dwarf::DW_AT_LLVM_tag_offset, dwarf::DW_FORM_data1,
922 *TagOffset);
923}
924
925void DwarfCompileUnit::applyConcreteDbgVariableAttributes(const Loc::MMI &MMI,
926 const DbgVariable &DV,
927 DIE &VariableDie) {
928 std::optional<unsigned> NVPTXAddressSpace;
929 DIELoc *Loc = new (DIEValueAllocator) DIELoc;
930 DIEDwarfExpression DwarfExpr(*Asm, *this, *Loc);
931 for (const auto &Fragment : MMI.getFrameIndexExprs()) {
932 Register FrameReg;
933 const DIExpression *Expr = Fragment.Expr;
936 TFI->getFrameIndexReference(*Asm->MF, Fragment.FI, FrameReg);
937 DwarfExpr.addFragmentOffset(Expr);
938
939 auto *TRI = Asm->MF->getSubtarget().getRegisterInfo();
941 TRI->getOffsetOpcodes(Offset, Ops);
942
943 // cuda-gdb special requirement. See NVPTXAS::DWARF_AddressSpace.
944 // Decode DW_OP_constu <DWARF Address Space> DW_OP_swap
945 // DW_OP_xderef sequence to specify address space.
946 if (Asm->TM.getTargetTriple().isNVPTX() && DD->tuneForGDB()) {
947 unsigned LocalNVPTXAddressSpace;
948 const DIExpression *NewExpr =
949 DIExpression::extractAddressClass(Expr, LocalNVPTXAddressSpace);
950 if (NewExpr != Expr) {
951 Expr = NewExpr;
952 NVPTXAddressSpace = LocalNVPTXAddressSpace;
953 }
954 }
955 if (Expr)
956 Ops.append(Expr->elements_begin(), Expr->elements_end());
957 DIExpressionCursor Cursor(Ops);
958 DwarfExpr.setMemoryLocationKind();
959 if (const MCSymbol *FrameSymbol = Asm->getFunctionFrameSymbol())
960 addOpAddress(*Loc, FrameSymbol);
961 else
962 DwarfExpr.addMachineRegExpression(
963 *Asm->MF->getSubtarget().getRegisterInfo(), Cursor, FrameReg);
964 DwarfExpr.addExpression(std::move(Cursor));
965 }
966 if (Asm->TM.getTargetTriple().isNVPTX() && DD->tuneForGDB()) {
967 // cuda-gdb special requirement. See NVPTXAS::DWARF_AddressSpace.
968 addUInt(VariableDie, dwarf::DW_AT_address_class, dwarf::DW_FORM_data1,
969 NVPTXAddressSpace.value_or(NVPTXAS::DWARF_ADDR_local_space));
970 }
971 addBlock(VariableDie, dwarf::DW_AT_location, DwarfExpr.finalize());
972 if (DwarfExpr.TagOffset)
973 addUInt(VariableDie, dwarf::DW_AT_LLVM_tag_offset, dwarf::DW_FORM_data1,
974 *DwarfExpr.TagOffset);
975}
976
977void DwarfCompileUnit::applyConcreteDbgVariableAttributes(
978 const Loc::EntryValue &EntryValue, const DbgVariable &DV,
979 DIE &VariableDie) {
980 DIELoc *Loc = new (DIEValueAllocator) DIELoc;
981 DIEDwarfExpression DwarfExpr(*Asm, *this, *Loc);
982 // Emit each expression as: EntryValue(Register) <other ops> <Fragment>.
983 for (auto [Register, Expr] : EntryValue.EntryValues) {
984 DwarfExpr.addFragmentOffset(&Expr);
985 DIExpressionCursor Cursor(Expr.getElements());
986 DwarfExpr.beginEntryValueExpression(Cursor);
987 DwarfExpr.addMachineRegExpression(
988 *Asm->MF->getSubtarget().getRegisterInfo(), Cursor, Register);
989 DwarfExpr.addExpression(std::move(Cursor));
990 }
991 addBlock(VariableDie, dwarf::DW_AT_location, DwarfExpr.finalize());
992}
993
994void DwarfCompileUnit::applyConcreteDbgVariableAttributes(
995 const std::monostate &, const DbgVariable &DV, DIE &VariableDie) {}
996
998 const LexicalScope &Scope,
999 DIE *&ObjectPointer) {
1000 auto Var = constructVariableDIE(DV, Scope.isAbstractScope());
1001 if (DV.isObjectPointer())
1002 ObjectPointer = Var;
1003 return Var;
1004}
1005
1007 const LexicalScope &Scope) {
1008 auto LabelDie = DIE::get(DIEValueAllocator, DL.getTag());
1009 insertDIE(DL.getLabel(), LabelDie);
1010 DL.setDIE(*LabelDie);
1011
1012 if (Scope.isAbstractScope())
1013 applyLabelAttributes(DL, *LabelDie);
1014
1015 return LabelDie;
1016}
1017
1018/// Return all DIVariables that appear in count: expressions.
1021 auto *Array = dyn_cast<DICompositeType>(Var->getType());
1022 if (!Array || Array->getTag() != dwarf::DW_TAG_array_type)
1023 return Result;
1024 if (auto *DLVar = Array->getDataLocation())
1025 Result.push_back(DLVar);
1026 if (auto *AsVar = Array->getAssociated())
1027 Result.push_back(AsVar);
1028 if (auto *AlVar = Array->getAllocated())
1029 Result.push_back(AlVar);
1030 for (auto *El : Array->getElements()) {
1031 if (auto *Subrange = dyn_cast<DISubrange>(El)) {
1032 if (auto Count = Subrange->getCount())
1033 if (auto *Dependency = dyn_cast_if_present<DIVariable *>(Count))
1034 Result.push_back(Dependency);
1035 if (auto LB = Subrange->getLowerBound())
1036 if (auto *Dependency = dyn_cast_if_present<DIVariable *>(LB))
1037 Result.push_back(Dependency);
1038 if (auto UB = Subrange->getUpperBound())
1039 if (auto *Dependency = dyn_cast_if_present<DIVariable *>(UB))
1040 Result.push_back(Dependency);
1041 if (auto ST = Subrange->getStride())
1042 if (auto *Dependency = dyn_cast_if_present<DIVariable *>(ST))
1043 Result.push_back(Dependency);
1044 } else if (auto *GenericSubrange = dyn_cast<DIGenericSubrange>(El)) {
1045 if (auto Count = GenericSubrange->getCount())
1046 if (auto *Dependency = dyn_cast_if_present<DIVariable *>(Count))
1047 Result.push_back(Dependency);
1048 if (auto LB = GenericSubrange->getLowerBound())
1049 if (auto *Dependency = dyn_cast_if_present<DIVariable *>(LB))
1050 Result.push_back(Dependency);
1051 if (auto UB = GenericSubrange->getUpperBound())
1052 if (auto *Dependency = dyn_cast_if_present<DIVariable *>(UB))
1053 Result.push_back(Dependency);
1054 if (auto ST = GenericSubrange->getStride())
1055 if (auto *Dependency = dyn_cast_if_present<DIVariable *>(ST))
1056 Result.push_back(Dependency);
1057 }
1058 }
1059 return Result;
1060}
1061
1062/// Sort local variables so that variables appearing inside of helper
1063/// expressions come first.
1068 // Map back from a DIVariable to its containing DbgVariable.
1070 // Set of DbgVariables in Result.
1072 // For cycle detection.
1074
1075 // Initialize the worklist and the DIVariable lookup table.
1076 for (auto *Var : reverse(Input)) {
1077 DbgVar.insert({Var->getVariable(), Var});
1078 WorkList.push_back({Var, 0});
1079 }
1080
1081 // Perform a stable topological sort by doing a DFS.
1082 while (!WorkList.empty()) {
1083 auto Item = WorkList.back();
1084 DbgVariable *Var = Item.getPointer();
1085 bool visitedAllDependencies = Item.getInt();
1086 WorkList.pop_back();
1087
1088 assert(Var);
1089
1090 // Already handled.
1091 if (Visited.count(Var))
1092 continue;
1093
1094 // Add to Result if all dependencies are visited.
1095 if (visitedAllDependencies) {
1096 Visited.insert(Var);
1097 Result.push_back(Var);
1098 continue;
1099 }
1100
1101 // Detect cycles.
1102 auto Res = Visiting.insert(Var);
1103 if (!Res.second) {
1104 assert(false && "dependency cycle in local variables");
1105 return Result;
1106 }
1107
1108 // Push dependencies and this node onto the worklist, so that this node is
1109 // visited again after all of its dependencies are handled.
1110 WorkList.push_back({Var, 1});
1111 for (const auto *Dependency : dependencies(Var)) {
1112 // Don't add dependency if it is in a different lexical scope or a global.
1113 if (const auto *Dep = dyn_cast<const DILocalVariable>(Dependency))
1114 if (DbgVariable *Var = DbgVar.lookup(Dep))
1115 WorkList.push_back({Var, 0});
1116 }
1117 }
1118 return Result;
1119}
1120
1122 LexicalScope *Scope,
1123 MCSymbol *LineTableSym) {
1124 DIE &ScopeDIE = updateSubprogramScopeDIE(Sub, LineTableSym);
1125
1126 if (Scope) {
1127 assert(!Scope->getInlinedAt());
1128 assert(!Scope->isAbstractScope());
1129 // Collect lexical scope children first.
1130 // ObjectPointer might be a local (non-argument) local variable if it's a
1131 // block's synthetic this pointer.
1132 if (DIE *ObjectPointer = createAndAddScopeChildren(Scope, ScopeDIE))
1133 addDIEEntry(ScopeDIE, dwarf::DW_AT_object_pointer, *ObjectPointer);
1134 }
1135
1136 // If this is a variadic function, add an unspecified parameter.
1137 DITypeRefArray FnArgs = Sub->getType()->getTypeArray();
1138
1139 // If we have a single element of null, it is a function that returns void.
1140 // If we have more than one elements and the last one is null, it is a
1141 // variadic function.
1142 if (FnArgs.size() > 1 && !FnArgs[FnArgs.size() - 1] &&
1144 ScopeDIE.addChild(
1145 DIE::get(DIEValueAllocator, dwarf::DW_TAG_unspecified_parameters));
1146
1147 return ScopeDIE;
1148}
1149
1151 DIE &ScopeDIE) {
1152 DIE *ObjectPointer = nullptr;
1153
1154 // Emit function arguments (order is significant).
1155 auto Vars = DU->getScopeVariables().lookup(Scope);
1156 for (auto &DV : Vars.Args)
1157 ScopeDIE.addChild(constructVariableDIE(*DV.second, *Scope, ObjectPointer));
1158
1159 // Emit local variables.
1160 auto Locals = sortLocalVars(Vars.Locals);
1161 for (DbgVariable *DV : Locals)
1162 ScopeDIE.addChild(constructVariableDIE(*DV, *Scope, ObjectPointer));
1163
1164 // Emit labels.
1165 for (DbgLabel *DL : DU->getScopeLabels().lookup(Scope))
1166 ScopeDIE.addChild(constructLabelDIE(*DL, *Scope));
1167
1168 // Track other local entities (skipped in gmlt-like data).
1169 // This creates mapping between CU and a set of local declarations that
1170 // should be emitted for subprograms in this CU.
1171 if (!includeMinimalInlineScopes() && !Scope->getInlinedAt()) {
1172 auto &LocalDecls = DD->getLocalDeclsForScope(Scope->getScopeNode());
1173 DeferredLocalDecls.insert(LocalDecls.begin(), LocalDecls.end());
1174 }
1175
1176 // Emit inner lexical scopes.
1177 auto skipLexicalScope = [this](LexicalScope *S) -> bool {
1178 if (isa<DISubprogram>(S->getScopeNode()))
1179 return false;
1180 auto Vars = DU->getScopeVariables().lookup(S);
1181 if (!Vars.Args.empty() || !Vars.Locals.empty())
1182 return false;
1183 return includeMinimalInlineScopes() ||
1184 DD->getLocalDeclsForScope(S->getScopeNode()).empty();
1185 };
1186 for (LexicalScope *LS : Scope->getChildren()) {
1187 // If the lexical block doesn't have non-scope children, skip
1188 // its emission and put its children directly to the parent scope.
1189 if (skipLexicalScope(LS))
1190 createAndAddScopeChildren(LS, ScopeDIE);
1191 else
1192 constructScopeDIE(LS, ScopeDIE);
1193 }
1194
1195 return ObjectPointer;
1196}
1197
1199 LexicalScope *Scope) {
1200 auto *SP = cast<DISubprogram>(Scope->getScopeNode());
1201 if (getAbstractScopeDIEs().count(SP))
1202 return;
1203
1204 DIE *ContextDIE;
1205 DwarfCompileUnit *ContextCU = this;
1206
1208 ContextDIE = &getUnitDie();
1209 // Some of this is duplicated from DwarfUnit::getOrCreateSubprogramDIE, with
1210 // the important distinction that the debug node is not associated with the
1211 // DIE (since the debug node will be associated with the concrete DIE, if
1212 // any). It could be refactored to some common utility function.
1213 else if (auto *SPDecl = SP->getDeclaration()) {
1214 ContextDIE = &getUnitDie();
1216 } else {
1217 ContextDIE = getOrCreateContextDIE(SP->getScope());
1218 // The scope may be shared with a subprogram that has already been
1219 // constructed in another CU, in which case we need to construct this
1220 // subprogram in the same CU.
1221 ContextCU = DD->lookupCU(ContextDIE->getUnitDie());
1222 }
1223
1224 // Passing null as the associated node because the abstract definition
1225 // shouldn't be found by lookup.
1226 DIE &AbsDef = ContextCU->createAndAddDIE(dwarf::DW_TAG_subprogram,
1227 *ContextDIE, nullptr);
1228
1229 // Store the DIE before creating children.
1230 ContextCU->getAbstractScopeDIEs()[SP] = &AbsDef;
1231
1232 ContextCU->applySubprogramAttributesToDefinition(SP, AbsDef);
1233 ContextCU->addSInt(AbsDef, dwarf::DW_AT_inline,
1234 DD->getDwarfVersion() <= 4 ? std::optional<dwarf::Form>()
1235 : dwarf::DW_FORM_implicit_const,
1237 if (DIE *ObjectPointer = ContextCU->createAndAddScopeChildren(Scope, AbsDef))
1238 ContextCU->addDIEEntry(AbsDef, dwarf::DW_AT_object_pointer, *ObjectPointer);
1239}
1240
1242 return DD->getDwarfVersion() <= 4 && !DD->tuneForLLDB();
1243}
1244
1247 return Tag;
1248 switch (Tag) {
1249 case dwarf::DW_TAG_call_site:
1250 return dwarf::DW_TAG_GNU_call_site;
1251 case dwarf::DW_TAG_call_site_parameter:
1252 return dwarf::DW_TAG_GNU_call_site_parameter;
1253 default:
1254 llvm_unreachable("DWARF5 tag with no GNU analog");
1255 }
1256}
1257
1261 return Attr;
1262 switch (Attr) {
1263 case dwarf::DW_AT_call_all_calls:
1264 return dwarf::DW_AT_GNU_all_call_sites;
1265 case dwarf::DW_AT_call_target:
1266 return dwarf::DW_AT_GNU_call_site_target;
1267 case dwarf::DW_AT_call_origin:
1268 return dwarf::DW_AT_abstract_origin;
1269 case dwarf::DW_AT_call_return_pc:
1270 return dwarf::DW_AT_low_pc;
1271 case dwarf::DW_AT_call_value:
1272 return dwarf::DW_AT_GNU_call_site_value;
1273 case dwarf::DW_AT_call_tail_call:
1274 return dwarf::DW_AT_GNU_tail_call;
1275 default:
1276 llvm_unreachable("DWARF5 attribute with no GNU analog");
1277 }
1278}
1279
1283 return Loc;
1284 switch (Loc) {
1285 case dwarf::DW_OP_entry_value:
1286 return dwarf::DW_OP_GNU_entry_value;
1287 default:
1288 llvm_unreachable("DWARF5 location atom with no GNU analog");
1289 }
1290}
1291
1293 const DISubprogram *CalleeSP,
1294 bool IsTail,
1295 const MCSymbol *PCAddr,
1296 const MCSymbol *CallAddr,
1297 unsigned CallReg) {
1298 // Insert a call site entry DIE within ScopeDIE.
1299 DIE &CallSiteDIE = createAndAddDIE(getDwarf5OrGNUTag(dwarf::DW_TAG_call_site),
1300 ScopeDIE, nullptr);
1301
1302 if (CallReg) {
1303 // Indirect call.
1304 addAddress(CallSiteDIE, getDwarf5OrGNUAttr(dwarf::DW_AT_call_target),
1305 MachineLocation(CallReg));
1306 } else {
1307 DIE *CalleeDIE = getOrCreateSubprogramDIE(CalleeSP);
1308 assert(CalleeDIE && "Could not create DIE for call site entry origin");
1310 !CalleeSP->isDefinition() &&
1311 !CalleeDIE->findAttribute(dwarf::DW_AT_linkage_name)) {
1312 addLinkageName(*CalleeDIE, CalleeSP->getLinkageName());
1313 }
1314
1315 addDIEEntry(CallSiteDIE, getDwarf5OrGNUAttr(dwarf::DW_AT_call_origin),
1316 *CalleeDIE);
1317 }
1318
1319 if (IsTail) {
1320 // Attach DW_AT_call_tail_call to tail calls for standards compliance.
1321 addFlag(CallSiteDIE, getDwarf5OrGNUAttr(dwarf::DW_AT_call_tail_call));
1322
1323 // Attach the address of the branch instruction to allow the debugger to
1324 // show where the tail call occurred. This attribute has no GNU analog.
1325 //
1326 // GDB works backwards from non-standard usage of DW_AT_low_pc (in DWARF4
1327 // mode -- equivalently, in DWARF5 mode, DW_AT_call_return_pc) at tail-call
1328 // site entries to figure out the PC of tail-calling branch instructions.
1329 // This means it doesn't need the compiler to emit DW_AT_call_pc, so we
1330 // don't emit it here.
1331 //
1332 // There's no need to tie non-GDB debuggers to this non-standardness, as it
1333 // adds unnecessary complexity to the debugger. For non-GDB debuggers, emit
1334 // the standard DW_AT_call_pc info.
1336 addLabelAddress(CallSiteDIE, dwarf::DW_AT_call_pc, CallAddr);
1337 }
1338
1339 // Attach the return PC to allow the debugger to disambiguate call paths
1340 // from one function to another.
1341 //
1342 // The return PC is only really needed when the call /isn't/ a tail call, but
1343 // GDB expects it in DWARF4 mode, even for tail calls (see the comment above
1344 // the DW_AT_call_pc emission logic for an explanation).
1345 if (!IsTail || useGNUAnalogForDwarf5Feature()) {
1346 assert(PCAddr && "Missing return PC information for a call");
1347 addLabelAddress(CallSiteDIE,
1348 getDwarf5OrGNUAttr(dwarf::DW_AT_call_return_pc), PCAddr);
1349 }
1350
1351 return CallSiteDIE;
1352}
1353
1355 DIE &CallSiteDIE, SmallVector<DbgCallSiteParam, 4> &Params) {
1356 for (const auto &Param : Params) {
1357 unsigned Register = Param.getRegister();
1358 auto CallSiteDieParam =
1360 getDwarf5OrGNUTag(dwarf::DW_TAG_call_site_parameter));
1361 insertDIE(CallSiteDieParam);
1362 addAddress(*CallSiteDieParam, dwarf::DW_AT_location,
1364
1365 DIELoc *Loc = new (DIEValueAllocator) DIELoc;
1366 DIEDwarfExpression DwarfExpr(*Asm, *this, *Loc);
1367 DwarfExpr.setCallSiteParamValueFlag();
1368
1369 DwarfDebug::emitDebugLocValue(*Asm, nullptr, Param.getValue(), DwarfExpr);
1370
1371 addBlock(*CallSiteDieParam, getDwarf5OrGNUAttr(dwarf::DW_AT_call_value),
1372 DwarfExpr.finalize());
1373
1374 CallSiteDIE.addChild(CallSiteDieParam);
1375 }
1376}
1377
1379 const DIImportedEntity *Module) {
1380 DIE *IMDie = DIE::get(DIEValueAllocator, (dwarf::Tag)Module->getTag());
1381 insertDIE(Module, IMDie);
1382 DIE *EntityDie;
1383 auto *Entity = Module->getEntity();
1384 if (auto *NS = dyn_cast<DINamespace>(Entity))
1385 EntityDie = getOrCreateNameSpace(NS);
1386 else if (auto *M = dyn_cast<DIModule>(Entity))
1387 EntityDie = getOrCreateModule(M);
1388 else if (auto *SP = dyn_cast<DISubprogram>(Entity)) {
1389 // If there is an abstract subprogram, refer to it. Note that this assumes
1390 // that all the abstract subprograms have been already created (which is
1391 // correct until imported entities get emitted in DwarfDebug::endModule()).
1392 if (auto *AbsSPDie = getAbstractScopeDIEs().lookup(SP))
1393 EntityDie = AbsSPDie;
1394 else
1395 EntityDie = getOrCreateSubprogramDIE(SP);
1396 } else if (auto *T = dyn_cast<DIType>(Entity))
1397 EntityDie = getOrCreateTypeDIE(T);
1398 else if (auto *GV = dyn_cast<DIGlobalVariable>(Entity))
1399 EntityDie = getOrCreateGlobalVariableDIE(GV, {});
1400 else if (auto *IE = dyn_cast<DIImportedEntity>(Entity))
1401 EntityDie = getOrCreateImportedEntityDIE(IE);
1402 else
1403 EntityDie = getDIE(Entity);
1404 assert(EntityDie);
1405 addSourceLine(*IMDie, Module->getLine(), Module->getFile());
1406 addDIEEntry(*IMDie, dwarf::DW_AT_import, *EntityDie);
1408 if (!Name.empty()) {
1409 addString(*IMDie, dwarf::DW_AT_name, Name);
1410
1411 // FIXME: if consumers ever start caring about handling
1412 // unnamed import declarations such as `using ::nullptr_t`
1413 // or `using namespace std::ranges`, we could add the
1414 // import declaration into the accelerator table with the
1415 // name being the one of the entity being imported.
1416 DD->addAccelNamespace(*this, CUNode->getNameTableKind(), Name, *IMDie);
1417 }
1418
1419 // This is for imported module with renamed entities (such as variables and
1420 // subprograms).
1421 DINodeArray Elements = Module->getElements();
1422 for (const auto *Element : Elements) {
1423 if (!Element)
1424 continue;
1425 IMDie->addChild(
1426 constructImportedEntityDIE(cast<DIImportedEntity>(Element)));
1427 }
1428
1429 return IMDie;
1430}
1431
1433 const DIImportedEntity *IE) {
1434
1435 // Check for pre-existence.
1436 if (DIE *Die = getDIE(IE))
1437 return Die;
1438
1439 DIE *ContextDIE = getOrCreateContextDIE(IE->getScope());
1440 assert(ContextDIE && "Empty scope for the imported entity!");
1441
1442 DIE *IMDie = constructImportedEntityDIE(IE);
1443 ContextDIE->addChild(IMDie);
1444 return IMDie;
1445}
1446
1448 DIE *D = getDIE(SP);
1449 if (DIE *AbsSPDIE = getAbstractScopeDIEs().lookup(SP)) {
1450 if (D)
1451 // If this subprogram has an abstract definition, reference that
1452 addDIEEntry(*D, dwarf::DW_AT_abstract_origin, *AbsSPDIE);
1453 } else {
1455 if (D)
1456 // And attach the attributes
1458 }
1459}
1460
1462 DbgEntity *AbsEntity = getExistingAbstractEntity(Entity->getEntity());
1463
1464 auto *Die = Entity->getDIE();
1465 /// Label may be used to generate DW_AT_low_pc, so put it outside
1466 /// if/else block.
1467 const DbgLabel *Label = nullptr;
1468 if (AbsEntity && AbsEntity->getDIE()) {
1469 addDIEEntry(*Die, dwarf::DW_AT_abstract_origin, *AbsEntity->getDIE());
1470 Label = dyn_cast<const DbgLabel>(Entity);
1471 } else {
1472 if (const DbgVariable *Var = dyn_cast<const DbgVariable>(Entity))
1474 else if ((Label = dyn_cast<const DbgLabel>(Entity)))
1475 applyLabelAttributes(*Label, *Die);
1476 else
1477 llvm_unreachable("DbgEntity must be DbgVariable or DbgLabel.");
1478 }
1479
1480 if (!Label)
1481 return;
1482
1483 const auto *Sym = Label->getSymbol();
1484 if (!Sym)
1485 return;
1486
1487 addLabelAddress(*Die, dwarf::DW_AT_low_pc, Sym);
1488
1489 // A TAG_label with a name and an AT_low_pc must be placed in debug_names.
1490 if (StringRef Name = Label->getName(); !Name.empty())
1492}
1493
1495 auto &AbstractEntities = getAbstractEntities();
1496 auto I = AbstractEntities.find(Node);
1497 if (I != AbstractEntities.end())
1498 return I->second.get();
1499 return nullptr;
1500}
1501
1503 LexicalScope *Scope) {
1504 assert(Scope && Scope->isAbstractScope());
1505 auto &Entity = getAbstractEntities()[Node];
1506 if (isa<const DILocalVariable>(Node)) {
1507 Entity = std::make_unique<DbgVariable>(cast<const DILocalVariable>(Node),
1508 nullptr /* IA */);
1509 DU->addScopeVariable(Scope, cast<DbgVariable>(Entity.get()));
1510 } else if (isa<const DILabel>(Node)) {
1511 Entity = std::make_unique<DbgLabel>(
1512 cast<const DILabel>(Node), nullptr /* IA */);
1513 DU->addScopeLabel(Scope, cast<DbgLabel>(Entity.get()));
1514 }
1515}
1516
1517void DwarfCompileUnit::emitHeader(bool UseOffsets) {
1518 // Don't bother labeling the .dwo unit, as its offset isn't used.
1519 if (!Skeleton && !DD->useSectionsAsReferences()) {
1520 LabelBegin = Asm->createTempSymbol("cu_begin");
1521 Asm->OutStreamer->emitLabel(LabelBegin);
1522 }
1523
1524 dwarf::UnitType UT = Skeleton ? dwarf::DW_UT_split_compile
1525 : DD->useSplitDwarf() ? dwarf::DW_UT_skeleton
1526 : dwarf::DW_UT_compile;
1527 DwarfUnit::emitCommonHeader(UseOffsets, UT);
1528 if (DD->getDwarfVersion() >= 5 && UT != dwarf::DW_UT_compile)
1530}
1531
1533 switch (CUNode->getNameTableKind()) {
1535 return false;
1536 // Opting in to GNU Pubnames/types overrides the default to ensure these are
1537 // generated for things like Gold's gdb_index generation.
1539 return true;
1541 return false;
1543 return DD->tuneForGDB() && !includeMinimalInlineScopes() &&
1546 DD->getDwarfVersion() < 5;
1547 }
1548 llvm_unreachable("Unhandled DICompileUnit::DebugNameTableKind enum");
1549}
1550
1551/// addGlobalName - Add a new global name to the compile unit.
1553 const DIScope *Context) {
1554 if (!hasDwarfPubSections())
1555 return;
1556 std::string FullName = getParentContextString(Context) + Name.str();
1557 GlobalNames[FullName] = &Die;
1558}
1559
1561 const DIScope *Context) {
1562 if (!hasDwarfPubSections())
1563 return;
1564 std::string FullName = getParentContextString(Context) + Name.str();
1565 // Insert, allowing the entry to remain as-is if it's already present
1566 // This way the CU-level type DIE is preferred over the "can't describe this
1567 // type as a unit offset because it's not really in the CU at all, it's only
1568 // in a type unit"
1569 GlobalNames.insert(std::make_pair(std::move(FullName), &getUnitDie()));
1570}
1571
1572/// Add a new global type to the unit.
1574 const DIScope *Context) {
1575 if (!hasDwarfPubSections())
1576 return;
1577 std::string FullName = getParentContextString(Context) + Ty->getName().str();
1578 GlobalTypes[FullName] = &Die;
1579}
1580
1582 const DIScope *Context) {
1583 if (!hasDwarfPubSections())
1584 return;
1585 std::string FullName = getParentContextString(Context) + Ty->getName().str();
1586 // Insert, allowing the entry to remain as-is if it's already present
1587 // This way the CU-level type DIE is preferred over the "can't describe this
1588 // type as a unit offset because it's not really in the CU at all, it's only
1589 // in a type unit"
1590 GlobalTypes.insert(std::make_pair(std::move(FullName), &getUnitDie()));
1591}
1592
1594 MachineLocation Location) {
1595 auto *Single = std::get_if<Loc::Single>(&DV);
1596 if (Single && Single->getExpr())
1597 addComplexAddress(Single->getExpr(), Die, dwarf::DW_AT_location, Location);
1598 else
1599 addAddress(Die, dwarf::DW_AT_location, Location);
1600}
1601
1602/// Add an address attribute to a die based on the location provided.
1604 const MachineLocation &Location) {
1605 DIELoc *Loc = new (DIEValueAllocator) DIELoc;
1606 DIEDwarfExpression DwarfExpr(*Asm, *this, *Loc);
1607 if (Location.isIndirect())
1608 DwarfExpr.setMemoryLocationKind();
1609
1610 DIExpressionCursor Cursor({});
1612 if (!DwarfExpr.addMachineRegExpression(TRI, Cursor, Location.getReg()))
1613 return;
1614 DwarfExpr.addExpression(std::move(Cursor));
1615
1616 // Now attach the location information to the DIE.
1617 addBlock(Die, Attribute, DwarfExpr.finalize());
1618
1619 if (DwarfExpr.TagOffset)
1620 addUInt(Die, dwarf::DW_AT_LLVM_tag_offset, dwarf::DW_FORM_data1,
1621 *DwarfExpr.TagOffset);
1622}
1623
1624/// Start with the address based on the location provided, and generate the
1625/// DWARF information necessary to find the actual variable given the extra
1626/// address information encoded in the DbgVariable, starting from the starting
1627/// location. Add the DWARF information to the die.
1630 const MachineLocation &Location) {
1631 DIELoc *Loc = new (DIEValueAllocator) DIELoc;
1632 DIEDwarfExpression DwarfExpr(*Asm, *this, *Loc);
1633 DwarfExpr.addFragmentOffset(DIExpr);
1634 DwarfExpr.setLocation(Location, DIExpr);
1635
1636 DIExpressionCursor Cursor(DIExpr);
1637
1638 if (DIExpr->isEntryValue())
1639 DwarfExpr.beginEntryValueExpression(Cursor);
1640
1642 if (!DwarfExpr.addMachineRegExpression(TRI, Cursor, Location.getReg()))
1643 return;
1644 DwarfExpr.addExpression(std::move(Cursor));
1645
1646 // Now attach the location information to the DIE.
1647 addBlock(Die, Attribute, DwarfExpr.finalize());
1648
1649 if (DwarfExpr.TagOffset)
1650 addUInt(Die, dwarf::DW_AT_LLVM_tag_offset, dwarf::DW_FORM_data1,
1651 *DwarfExpr.TagOffset);
1652}
1653
1654/// Add a Dwarf loclistptr attribute data and value.
1656 unsigned Index) {
1657 dwarf::Form Form = (DD->getDwarfVersion() >= 5)
1658 ? dwarf::DW_FORM_loclistx
1660 addAttribute(Die, Attribute, Form, DIELocList(Index));
1661}
1662
1664 DIE &VariableDie) {
1665 StringRef Name = Var.getName();
1666 if (!Name.empty())
1667 addString(VariableDie, dwarf::DW_AT_name, Name);
1668 const auto *DIVar = Var.getVariable();
1669 if (DIVar) {
1670 if (uint32_t AlignInBytes = DIVar->getAlignInBytes())
1671 addUInt(VariableDie, dwarf::DW_AT_alignment, dwarf::DW_FORM_udata,
1672 AlignInBytes);
1673 addAnnotation(VariableDie, DIVar->getAnnotations());
1674 }
1675
1676 addSourceLine(VariableDie, DIVar);
1677 addType(VariableDie, Var.getType());
1678 if (Var.isArtificial())
1679 addFlag(VariableDie, dwarf::DW_AT_artificial);
1680}
1681
1683 DIE &LabelDie) {
1684 StringRef Name = Label.getName();
1685 if (!Name.empty())
1686 addString(LabelDie, dwarf::DW_AT_name, Name);
1687 const auto *DILabel = Label.getLabel();
1688 addSourceLine(LabelDie, DILabel);
1689}
1690
1691/// Add a Dwarf expression attribute data and value.
1693 const MCExpr *Expr) {
1694 addAttribute(Die, (dwarf::Attribute)0, Form, DIEExpr(Expr));
1695}
1696
1698 const DISubprogram *SP, DIE &SPDie) {
1699 auto *SPDecl = SP->getDeclaration();
1700 auto *Context = SPDecl ? SPDecl->getScope() : SP->getScope();
1702 addGlobalName(SP->getName(), SPDie, Context);
1703}
1704
1705bool DwarfCompileUnit::isDwoUnit() const {
1706 return DD->useSplitDwarf() && Skeleton;
1707}
1708
1709void DwarfCompileUnit::finishNonUnitTypeDIE(DIE& D, const DICompositeType *CTy) {
1710 constructTypeDIE(D, CTy);
1711}
1712
1715 (DD->useSplitDwarf() && !Skeleton);
1716}
1717
1720}
1721
1724 MCSymbol *Label = DD->getAddressPool().getLabel();
1726 DD->getDwarfVersion() >= 5 ? dwarf::DW_AT_addr_base
1727 : dwarf::DW_AT_GNU_addr_base,
1728 Label, TLOF.getDwarfAddrSection()->getBeginSymbol());
1729}
1730
1732 addAttribute(Die, (dwarf::Attribute)0, dwarf::DW_FORM_udata,
1733 new (DIEValueAllocator) DIEBaseTypeRef(this, Idx));
1734}
1735
1737 // Insert the base_type DIEs directly after the CU so that their offsets will
1738 // fit in the fixed size ULEB128 used inside the location expressions.
1739 // Maintain order by iterating backwards and inserting to the front of CU
1740 // child list.
1741 for (auto &Btr : reverse(ExprRefedBaseTypes)) {
1742 DIE &Die = getUnitDie().addChildFront(
1743 DIE::get(DIEValueAllocator, dwarf::DW_TAG_base_type));
1744 SmallString<32> Str;
1745 addString(Die, dwarf::DW_AT_name,
1747 "_" + Twine(Btr.BitSize)).toStringRef(Str));
1748 addUInt(Die, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1, Btr.Encoding);
1749 // Round up to smallest number of bytes that contains this number of bits.
1750 addUInt(Die, dwarf::DW_AT_byte_size, std::nullopt,
1751 divideCeil(Btr.BitSize, 8));
1752
1753 Btr.Die = &Die;
1754 }
1755}
1756
1758 // Assume if there is an abstract tree all the DIEs are already emitted.
1759 bool isAbstract = getAbstractScopeDIEs().count(LB->getSubprogram());
1760 if (isAbstract) {
1761 auto &DIEs = getAbstractScopeDIEs();
1762 if (auto It = DIEs.find(LB); It != DIEs.end())
1763 return It->second;
1764 }
1765 assert(!isAbstract && "Missed lexical block DIE in abstract tree!");
1766
1767 // Return a concrete DIE if it exists or nullptr otherwise.
1768 return LexicalBlockDIEs.lookup(LB);
1769}
1770
1772 if (isa_and_nonnull<DILocalScope>(Context)) {
1773 if (auto *LFScope = dyn_cast<DILexicalBlockFile>(Context))
1774 Context = LFScope->getNonLexicalBlockFileScope();
1775 if (auto *LScope = dyn_cast<DILexicalBlock>(Context))
1776 return getLexicalBlockDIE(LScope);
1777
1778 // Otherwise the context must be a DISubprogram.
1779 auto *SPScope = cast<DISubprogram>(Context);
1780 if (getAbstractScopeDIEs().count(SPScope))
1781 return getAbstractScopeDIEs()[SPScope];
1782 }
1783 return DwarfUnit::getOrCreateContextDIE(Context);
1784}
MachineBasicBlock & MBB
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
Returns the sub type a function will return at a given Idx Should correspond to the result type of an ExtractValue instruction executed with just that one unsigned Idx
static SmallVector< DbgVariable *, 8 > sortLocalVars(SmallVectorImpl< DbgVariable * > &Input)
Sort local variables so that variables appearing inside of helper expressions come first.
static unsigned translateToNVVMDWARFAddrSpace(unsigned AddrSpace)
Translate NVVM IR address space code to DWARF correspondent value.
static SmallVector< const DIVariable *, 2 > dependencies(DbgVariable *Var)
Return all DIVariables that appear in count: expressions.
static cl::opt< bool > EmitFuncLineTableOffsetsOption("emit-func-debug-line-table-offsets", cl::Hidden, cl::desc("Include line table offset in function's debug info and emit end " "sequence after each function's line data."), cl::init(false))
static bool AddLinkageNamesToDeclCallOriginsForTuning(const DwarfDebug *DD)
static dwarf::Tag GetCompileUnitType(UnitKind Kind, DwarfDebug *DW)
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.
std::string Name
bool End
Definition: ELF_riscv.cpp:480
Symbol * Sym
Definition: ELF_riscv.cpp:479
static bool lookup(const GsymReader &GR, DataExtractor &Data, uint64_t &Offset, uint64_t BaseAddr, uint64_t Addr, SourceLocations &SrcLocs, llvm::Error &Err)
A Lookup helper functions.
Definition: InlineInfo.cpp:108
#define I(x, y, z)
Definition: MD5.cpp:58
unsigned const TargetRegisterInfo * TRI
NVPTX address space definition.
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
This file contains some templates that are useful if you are working with the STL at all.
This file defines the SmallString class.
Class for arbitrary precision integers.
Definition: APInt.h:78
uint64_t getZExtValue() const
Get zero extended value.
Definition: APInt.h:1520
unsigned getBitWidth() const
Return the number of bits in the APInt.
Definition: APInt.h:1468
unsigned getIndex(const MCSymbol *Sym, bool TLS=false)
Returns the index into the address pool with the given label/symbol.
Definition: AddressPool.cpp:19
MCSymbol * getLabel()
Definition: AddressPool.h:53
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition: ArrayRef.h:41
size_t size() const
size - Get the array size.
Definition: ArrayRef.h:168
This class is intended to be used as a driving class for all asm writers.
Definition: AsmPrinter.h:87
const TargetLoweringObjectFile & getObjFileLowering() const
Return information about object file lowering.
Definition: AsmPrinter.cpp:408
MCSymbol * getSymbol(const GlobalValue *GV) const
Definition: AsmPrinter.cpp:697
MapVector< MBBSectionID, MBBSectionRange > MBBSectionRanges
Definition: AsmPrinter.h:141
TargetMachine & TM
Target machine description.
Definition: AsmPrinter.h:90
const MCAsmInfo * MAI
Target Asm Printer information.
Definition: AsmPrinter.h:93
MachineFunction * MF
The current machine function.
Definition: AsmPrinter.h:105
virtual const MCSymbol * getFunctionFrameSymbol() const
Return symbol for the function pseudo stack if the stack frame is not a register based.
Definition: AsmPrinter.h:267
MCSymbol * createTempSymbol(const Twine &Name) const
MCSymbol * GetExternalSymbolSymbol(Twine Sym) const
Return the MCSymbol for the specified ExternalSymbol.
std::unique_ptr< MCStreamer > OutStreamer
This is the MCStreamer object for the file we are generating.
Definition: AsmPrinter.h:102
const DataLayout & getDataLayout() const
Return information about data layout.
Definition: AsmPrinter.cpp:412
void emitInt64(uint64_t Value) const
Emit a long long directive and value.
Basic type, like 'int' or 'float'.
Debug common block.
DIFile * getFile() const
unsigned getLineNo() const
StringRef getName() const
DIScope * getScope() const
DIGlobalVariable * getDecl() const
bool isDebugDirectivesOnly() const
static std::optional< DebugNameTableKind > getNameTableKind(StringRef Str)
static std::optional< DebugEmissionKind > getEmissionKind(StringRef Str)
A BaseTypeRef DIE.
Definition: DIE.h:355
A BaseTypeRef DIE.
Definition: DIE.h:240
DIEBlock - Represents a block of values.
Definition: DIE.h:1046
DwarfExpression implementation for singular DW_AT_location.
An expression DIE.
Definition: DIE.h:206
An integer value DIE.
Definition: DIE.h:168
A label DIE.
Definition: DIE.h:223
Represents a pointer to a location list in the debug_loc section.
Definition: DIE.h:337
DIELoc - Represents an expression location.
Definition: DIE.h:1010
DIE & getUnitDie()
Definition: DIE.h:999
A list of DIE values.
Definition: DIE.h:689
A structured debug information entry.
Definition: DIE.h:819
DIEValue findAttribute(dwarf::Attribute Attribute) const
Find a value in the DIE with the attribute given.
Definition: DIE.cpp:210
DIE & addChild(DIE *Child)
Add a child to the DIE.
Definition: DIE.h:934
DIE & addChildFront(DIE *Child)
Definition: DIE.h:941
static DIE * get(BumpPtrAllocator &Alloc, dwarf::Tag Tag)
Definition: DIE.h:849
const DIE * getUnitDie() const
Climb up the parent chain to get the compile unit or type unit DIE that this DIE belongs to.
Definition: DIE.cpp:191
Holds a DIExpression and keeps track of how many operands have been consumed so far.
DWARF expression.
element_iterator elements_end() const
bool isEntryValue() const
Check if the expression consists of exactly one entry value operand.
element_iterator elements_begin() const
ArrayRef< uint64_t > getElements() const
uint64_t getElement(unsigned I) const
std::optional< SignedOrUnsignedConstant > isConstant() const
Determine whether this represents a constant value, if so.
static const DIExpression * extractAddressClass(const DIExpression *Expr, unsigned &AddrClass)
Checks if the last 4 elements of the expression are DW_OP_constu <DWARF Address Space> DW_OP_swap DW_...
DIDerivedType * getStaticDataMemberDeclaration() const
MDTuple * getTemplateParams() const
StringRef getLinkageName() const
StringRef getDisplayName() const
DINodeArray getAnnotations() const
An imported module (C++ using directive or similar).
Debug lexical block.
DISubprogram * getSubprogram() const
Get the subprogram for this scope.
Debug location.
Tagged DWARF-like metadata node.
dwarf::Tag getTag() const
Base class for scope-like contexts.
StringRef getName() const
DIScope * getScope() const
Subprogram description.
unsigned size() const
Base class for types.
StringRef getName() const
uint32_t getAlignInBytes() const
DIScope * getScope() const
DIType * getType() const
StringRef getName() const
unsigned getPointerSize(unsigned AS=0) const
Layout pointer size in bytes, rounded up to a whole number of bytes.
Definition: DataLayout.cpp:739
This class is defined as the common parent of DbgVariable and DbgLabel such that it could levarage po...
Definition: DwarfDebug.h:65
const DINode * getEntity() const
Accessors.
Definition: DwarfDebug.h:85
void setDIE(DIE &D)
Definition: DwarfDebug.h:91
DIE * getDIE() const
Definition: DwarfDebug.h:87
This class is used to track label information.
Definition: DwarfDebug.h:289
A single location or constant within a variable location description, with either a single entry (wit...
Definition: DebugLocEntry.h:40
The location of a single variable, composed of an expression and 0 or more DbgValueLocEntries.
ArrayRef< DbgValueLocEntry > getLocEntries() const
bool isVariadic() const
This class is used to track local variable information.
Definition: DwarfDebug.h:214
bool isArtificial() const
Return true if DbgVariable is artificial.
Definition: DwarfDebug.h:262
dwarf::Tag getTag() const
Definition: DwarfDebug.h:253
bool isObjectPointer() const
Definition: DwarfDebug.h:270
const DILocalVariable * getVariable() const
Definition: DwarfDebug.h:246
StringRef getName() const
Definition: DwarfDebug.h:250
const DIType * getType() const
Definition: DwarfDebug.cpp:230
Loc::Variant & asVariant()
To workaround P2162R0 https://github.com/cplusplus/papers/issues/873 the base class subobject needs t...
Definition: DwarfDebug.h:220
MCSymbol * getLabelBeforeInsn(const MachineInstr *MI)
Return Label preceding the instruction.
MCSymbol * getLabelAfterInsn(const MachineInstr *MI)
Return Label immediately following the instruction.
ValueT lookup(const_arg_type_t< KeyT > Val) const
lookup - Return the entry for the specified key, or a default constructed value if no such entry exis...
Definition: DenseMap.h:194
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
Definition: DenseMap.h:211
bool useGNUAnalogForDwarf5Feature() const
Whether to use the GNU analog for a DWARF5 tag, attribute, or location atom.
void constructCallSiteParmEntryDIEs(DIE &CallSiteDIE, SmallVector< DbgCallSiteParam, 4 > &Params)
Construct call site parameter DIEs for the CallSiteDIE.
void attachLowHighPC(DIE &D, const MCSymbol *Begin, const MCSymbol *End)
void emitHeader(bool UseOffsets) override
Emit the header for this unit, not including the initial length field.
dwarf::Tag getDwarf5OrGNUTag(dwarf::Tag Tag) const
This takes a DWARF 5 tag and returns it or a GNU analog.
DIE & updateSubprogramScopeDIE(const DISubprogram *SP, MCSymbol *LineTableSym)
Find DIE for the given subprogram and attach appropriate DW_AT_low_pc, DW_AT_high_pc and DW_AT_LLVM_s...
void constructAbstractSubprogramScopeDIE(LexicalScope *Scope)
bool includeMinimalInlineScopes() const
DIE * getOrCreateImportedEntityDIE(const DIImportedEntity *IE)
Get or create a DIE for an imported entity.
void addBaseTypeRef(DIEValueList &Die, int64_t Idx)
void addGlobalNameForTypeUnit(StringRef Name, const DIScope *Context)
Add a new global name present in a type unit to this compile unit.
void finishEntityDefinition(const DbgEntity *Entity)
void addRange(RangeSpan Range)
addRange - Add an address range to the list of ranges for this unit.
void addAddrTableBase()
Add the DW_AT_addr_base attribute to the unit DIE.
DIE & constructCallSiteEntryDIE(DIE &ScopeDIE, const DISubprogram *CalleeSP, bool IsTail, const MCSymbol *PCAddr, const MCSymbol *CallAddr, unsigned CallReg)
Construct a call site entry DIE describing a call within Scope to a callee described by CalleeSP.
std::vector< BaseTypeRef > ExprRefedBaseTypes
DIE * constructInlinedScopeDIE(LexicalScope *Scope, DIE &ParentScopeDIE)
This scope represents an inlined body of a function.
void addScopeRangeList(DIE &ScopeDIE, SmallVector< RangeSpan, 2 > Range)
A helper function to construct a RangeSpanList for a given lexical scope.
uint64_t getDWOId() const
DIE * getOrCreateCommonBlock(const DICommonBlock *CB, ArrayRef< GlobalExpr > GlobalExprs)
void addVariableAddress(const DbgVariable &DV, DIE &Die, MachineLocation Location)
Add DW_AT_location attribute for a DbgVariable based on provided MachineLocation.
DIE * getLexicalBlockDIE(const DILexicalBlock *LB)
Get a DIE for the given DILexicalBlock.
void addGlobalName(StringRef Name, const DIE &Die, const DIScope *Context) override
Add a new global name to the compile unit.
void createAbstractEntity(const DINode *Node, LexicalScope *Scope)
void applyStmtList(DIE &D)
Apply the DW_AT_stmt_list from this compile unit to the specified DIE.
DIE * getOrCreateContextDIE(const DIScope *Ty) override
Construct a DIE for a given scope.
void applyCommonDbgVariableAttributes(const DbgVariable &Var, DIE &VariableDie)
Add attributes to Var which reflect the common attributes of VariableDie, namely those which are not ...
DIE & constructSubprogramScopeDIE(const DISubprogram *Sub, LexicalScope *Scope, MCSymbol *LineTableSym)
Construct a DIE for this subprogram scope.
DIE * constructVariableDIE(DbgVariable &DV, bool Abstract=false)
Construct a DIE for the given DbgVariable.
dwarf::LocationAtom getDwarf5OrGNULocationAtom(dwarf::LocationAtom Loc) const
This takes a DWARF 5 location atom and either returns it or a GNU analog.
DIE * getOrCreateGlobalVariableDIE(const DIGlobalVariable *GV, ArrayRef< GlobalExpr > GlobalExprs)
Get or create global variable DIE.
void addLocationAttribute(DIE *ToDIE, const DIGlobalVariable *GV, ArrayRef< GlobalExpr > GlobalExprs)
void applySubprogramAttributesToDefinition(const DISubprogram *SP, DIE &SPDie)
DIE * createAndAddScopeChildren(LexicalScope *Scope, DIE &ScopeDIE)
void addExpr(DIELoc &Die, dwarf::Form Form, const MCExpr *Expr)
Add a Dwarf expression attribute data and value.
dwarf::Attribute getDwarf5OrGNUAttr(dwarf::Attribute Attr) const
This takes a DWARF 5 attribute and returns it or a GNU analog.
void addAddress(DIE &Die, dwarf::Attribute Attribute, const MachineLocation &Location)
Add an address attribute to a die based on the location provided.
void applyLabelAttributes(const DbgLabel &Label, DIE &LabelDie)
void addLocalLabelAddress(DIE &Die, dwarf::Attribute Attribute, const MCSymbol *Label)
addLocalLabelAddress - Add a dwarf label attribute data and value using DW_FORM_addr only.
DIE * constructLexicalScopeDIE(LexicalScope *Scope)
Construct new DW_TAG_lexical_block for this scope and attach DW_AT_low_pc/DW_AT_high_pc labels.
void addGlobalTypeImpl(const DIType *Ty, const DIE &Die, const DIScope *Context) override
Add a new global type to the compile unit.
unsigned getOrCreateSourceID(const DIFile *File) override
Look up the source ID for the given file.
void constructScopeDIE(LexicalScope *Scope, DIE &ParentScopeDIE)
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.
bool emitFuncLineTableOffsets() const
void addComplexAddress(const DIExpression *DIExpr, DIE &Die, dwarf::Attribute Attribute, const MachineLocation &Location)
Start with the address based on the location provided, and generate the DWARF information necessary t...
DIE * constructImportedEntityDIE(const DIImportedEntity *IE)
DwarfCompileUnit & getCU() override
void attachRangesOrLowHighPC(DIE &D, SmallVector< RangeSpan, 2 > Ranges)
void finishSubprogramDefinition(const DISubprogram *SP)
Collects and handles dwarf debug information.
Definition: DwarfDebug.h:351
MDNodeSet & getLocalDeclsForScope(const DILocalScope *S)
Definition: DwarfDebug.h:931
std::optional< MD5::MD5Result > getMD5AsBytes(const DIFile *File) const
If the File has an MD5 checksum, return it as an MD5Result allocated in the MCContext.
bool useGNUTLSOpcode() const
Returns whether to use DW_OP_GNU_push_tls_address, instead of the standard DW_OP_form_tls_address opc...
Definition: DwarfDebug.h:765
bool useAddrOffsetForm() const
Definition: DwarfDebug.h:789
const DwarfCompileUnit * getPrevCU() const
Returns the previous CU that was being updated.
Definition: DwarfDebug.h:847
uint16_t getDwarfVersion() const
Returns the Dwarf Version.
void addAccelNamespace(const DwarfUnit &Unit, const DICompileUnit::DebugNameTableKind NameTableKind, StringRef Name, const DIE &Die)
bool alwaysUseRanges(const DwarfCompileUnit &) const
Returns whether range encodings should be used for single entry range lists.
void addSubprogramNames(const DwarfUnit &Unit, const DICompileUnit::DebugNameTableKind NameTableKind, const DISubprogram *SP, DIE &Die)
Definition: DwarfDebug.cpp:477
bool useAllLinkageNames() const
Returns whether we should emit all DW_AT_[MIPS_]linkage_name.
Definition: DwarfDebug.h:761
void insertSectionLabel(const MCSymbol *S)
dwarf::Form getDwarfSectionOffsetForm() const
Returns a suitable DWARF form to represent a section offset, i.e.
bool useAppleExtensionAttributes() const
Definition: DwarfDebug.h:809
void setPrevCU(const DwarfCompileUnit *PrevCU)
Definition: DwarfDebug.h:848
const MachineFunction * getCurrentFunction() const
Definition: DwarfDebug.h:888
void addArangeLabel(SymbolCU SCU)
Add a label so that arange data can be generated for it.
Definition: DwarfDebug.h:751
AddressPool & getAddressPool()
Definition: DwarfDebug.h:870
bool useSectionsAsReferences() const
Returns whether to use sections as labels rather than temp symbols.
Definition: DwarfDebug.h:794
void terminateLineTable(const DwarfCompileUnit *CU)
Terminate the line table by adding the last range label.
DwarfCompileUnit * lookupCU(const DIE *Die)
Find the matching DwarfCompileUnit for the given CU DIE.
Definition: DwarfDebug.h:895
const MCSymbol * getSectionLabel(const MCSection *S)
static void emitDebugLocValue(const AsmPrinter &AP, const DIBasicType *BT, const DbgValueLoc &Value, DwarfExpression &DwarfExpr)
bool useSplitDwarf() const
Returns whether or not to change the current debug info for the split dwarf proposal support.
Definition: DwarfDebug.h:815
bool useAddrOffsetExpressions() const
Definition: DwarfDebug.h:783
bool useRangesSection() const
Returns whether ranges section should be emitted.
Definition: DwarfDebug.h:775
void addAccelName(const DwarfUnit &Unit, const DICompileUnit::DebugNameTableKind NameTableKind, StringRef Name, const DIE &Die)
bool isLexicalScopeDIENull(LexicalScope *Scope)
A helper function to check whether the DIE for a given Scope is going to be null.
Definition: DwarfDebug.cpp:514
AccelTableKind getAccelTableKind() const
Returns what kind (if any) of accelerator tables to emit.
Definition: DwarfDebug.h:804
void setLocation(const MachineLocation &Loc, const DIExpression *DIExpr)
Set the location (Loc) and DIExpression (DIExpr) to describe.
void addFragmentOffset(const DIExpression *Expr)
If applicable, emit an empty DW_OP_piece / DW_OP_bit_piece to advance to the fragment described by Ex...
void setMemoryLocationKind()
Lock this down to become a memory location description.
std::optional< uint8_t > TagOffset
void setCallSiteParamValueFlag()
Lock this down to become a call site parameter location.
bool addMachineRegExpression(const TargetRegisterInfo &TRI, DIExpressionCursor &Expr, llvm::Register MachineReg, unsigned FragmentOffsetInBits=0)
Emit a machine register location.
void addExpression(DIExpressionCursor &&Expr)
Emit all remaining operations in the DIExpressionCursor.
void addWasmLocation(unsigned Index, uint64_t Offset)
Emit location information expressed via WebAssembly location + offset The Index is an identifier for ...
void beginEntryValueExpression(DIExpressionCursor &ExprCursor)
Begin emission of an entry value dwarf operation.
void addScopeLabel(LexicalScope *LS, DbgLabel *Label)
Definition: DwarfFile.cpp:117
DenseMap< LexicalScope *, ScopeVars > & getScopeVariables()
Definition: DwarfFile.h:161
DenseMap< LexicalScope *, LabelList > & getScopeLabels()
Definition: DwarfFile.h:165
void addScopeVariable(LexicalScope *LS, DbgVariable *Var)
Definition: DwarfFile.cpp:105
This dwarf writer support class manages information associated with a source file.
Definition: DwarfUnit.h:35
virtual DIE * getOrCreateTypeDIE(const MDNode *TyNode)
Find existing DIE or create new DIE for the given type.
Definition: DwarfUnit.cpp:630
DwarfDebug & getDwarfDebug() const
Definition: DwarfUnit.h:112
void addAnnotation(DIE &Buffer, DINodeArray Annotations)
Add DW_TAG_LLVM_annotation.
Definition: DwarfUnit.cpp:915
void addBlock(DIE &Die, dwarf::Attribute Attribute, DIELoc *Loc)
Add block data.
Definition: DwarfUnit.cpp:427
void addTemplateParams(DIE &Buffer, DINodeArray TParams)
Add template parameters in buffer.
Definition: DwarfUnit.cpp:534
virtual DIE * getOrCreateContextDIE(const DIScope *Context)
Get context owner's DIE.
Definition: DwarfUnit.cpp:564
void addAttribute(DIEValueList &Die, dwarf::Attribute Attribute, dwarf::Form Form, T &&Value)
Definition: DwarfUnit.h:84
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...
Definition: DwarfUnit.cpp:368
void addUInt(DIEValueList &Die, dwarf::Attribute Attribute, std::optional< dwarf::Form > Form, uint64_t Integer)
Add an unsigned integer attribute data and value.
Definition: DwarfUnit.cpp:221
void addString(DIE &Die, dwarf::Attribute Attribute, StringRef Str)
Add a string attribute data and value.
Definition: DwarfUnit.cpp:283
void addConstantValue(DIE &Die, const ConstantInt *CI, const DIType *Ty)
Add constant value entry in variable DIE.
Definition: DwarfUnit.cpp:495
DIE * getOrCreateNameSpace(const DINamespace *NS)
Definition: DwarfUnit.cpp:1173
void insertDIE(const DINode *Desc, DIE *D)
Insert DIE into the map.
Definition: DwarfUnit.cpp:202
void addSectionDelta(DIE &Die, dwarf::Attribute Attribute, const MCSymbol *Hi, const MCSymbol *Lo)
addSectionDelta - Add a label delta attribute data and value.
Definition: DwarfUnit.cpp:1882
DwarfDebug * DD
Definition: DwarfUnit.h:55
const DICompileUnit * CUNode
MDNode for the compile unit.
Definition: DwarfUnit.h:40
DIE * getDIE(const DINode *D) const
Returns the DIE map slot for the specified debug variable.
Definition: DwarfUnit.cpp:196
MCSymbol * LabelBegin
The start of the unit within its section.
Definition: DwarfUnit.h:49
void addSInt(DIEValueList &Die, dwarf::Attribute Attribute, std::optional< dwarf::Form > Form, int64_t Integer)
Add an signed integer attribute data and value.
Definition: DwarfUnit.cpp:271
void addLabelDelta(DIEValueList &Die, dwarf::Attribute Attribute, const MCSymbol *Hi, const MCSymbol *Lo)
Add a label delta attribute data and value.
Definition: DwarfUnit.cpp:383
void addLinkageName(DIE &Die, StringRef LinkageName)
Add a linkage name, if it isn't empty.
Definition: DwarfUnit.cpp:526
std::string getParentContextString(const DIScope *Context) const
Get string containing language specific context for a global name.
Definition: DwarfUnit.cpp:699
void addSourceLine(DIE &Die, unsigned Line, const DIFile *File)
Add location information to specified debug information entry.
Definition: DwarfUnit.cpp:445
void emitCommonHeader(bool UseOffsets, dwarf::UnitType UT)
Emit the common part of the header for this unit.
Definition: DwarfUnit.cpp:1829
BumpPtrAllocator DIEValueAllocator
Definition: DwarfUnit.h:43
DIE * getOrCreateModule(const DIModule *M)
Definition: DwarfUnit.cpp:1194
const DICompileUnit * getCUNode() const
Definition: DwarfUnit.h:111
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.
Definition: DwarfUnit.cpp:420
DwarfFile * DU
Definition: DwarfUnit.h:56
DIE * getOrCreateStaticMemberDIE(const DIDerivedType *DT)
Create new static data member DIE.
Definition: DwarfUnit.cpp:1786
void addLabel(DIEValueList &Die, dwarf::Attribute Attribute, dwarf::Form Form, const MCSymbol *Label)
Add a Dwarf label attribute data and value.
Definition: DwarfUnit.cpp:316
void addConstantFPValue(DIE &Die, const ConstantFP *CFP)
Add constant value entry in variable DIE.
Definition: DwarfUnit.cpp:490
DIE * getOrCreateSubprogramDIE(const DISubprogram *SP, bool Minimal=false)
Definition: DwarfUnit.cpp:1225
void addSectionLabel(DIE &Die, dwarf::Attribute Attribute, const MCSymbol *Label, const MCSymbol *Sec)
Add a Dwarf section label attribute data and value.
Definition: DwarfUnit.cpp:1888
void addPoolOpAddress(DIEValueList &Die, const MCSymbol *Label)
Definition: DwarfUnit.cpp:343
void constructTypeDIE(DIE &Buffer, const DICompositeType *CTy)
Definition: DwarfUnit.cpp:936
MCSymbol * EndLabel
Emitted at the end of the CU and used to compute the CU Length field.
Definition: DwarfUnit.h:52
void addFlag(DIE &Die, dwarf::Attribute Attribute)
Add a flag that is true to the DIE.
Definition: DwarfUnit.cpp:214
AsmPrinter * Asm
Target of Dwarf emission.
Definition: DwarfUnit.h:46
unsigned getUniqueID() const
Gets Unique ID for this unit.
Definition: DwarfUnit.h:101
void addType(DIE &Entity, const DIType *Ty, dwarf::Attribute Attribute=dwarf::DW_AT_type)
Add a new type attribute to the specified entity.
Definition: DwarfUnit.cpp:693
void applySubprogramAttributes(const DISubprogram *SP, DIE &SPDie, bool SkipSPAttributes=false)
Definition: DwarfUnit.cpp:1310
void addDIEEntry(DIE &Die, dwarf::Attribute Attribute, DIE &Entry)
Add a DIE attribute data and value.
Definition: DwarfUnit.cpp:389
LexicalScope - This class is used to track scope information.
Definition: LexicalScopes.h:44
Multi-value location description.
Definition: DwarfDebug.h:142
unsigned getDebugLocListIndex() const
Definition: DwarfDebug.h:153
std::optional< uint8_t > getDebugLocListTagOffset() const
Definition: DwarfDebug.h:154
Single value location description.
Definition: DwarfDebug.h:131
unsigned getCodePointerSize() const
Get the code pointer size in bytes.
Definition: MCAsmInfo.h:449
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
virtual int64_t getDwarfRegNum(MCRegister RegNum, bool isEH) const
Map a target register to an equivalent dwarf register number.
MCSymbol * getBeginSymbol()
Definition: MCSection.h:135
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
Definition: MCSymbol.h:41
bool isDefined() const
isDefined - Check if this symbol is defined (i.e., it has an address).
Definition: MCSymbol.h:250
Tuple of metadata.
Definition: Metadata.h:1479
bool sameSection(const MachineBasicBlock *MBB) const
Returns true if this and MBB belong to the same section.
MBBSectionID getSectionID() const
Returns the section ID of this basic block.
bool isEndSection() const
Returns true if this block ends any section.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
const TargetMachine & getTarget() const
getTarget - Return the target machine this machine code is compiled with
Root of the metadata hierarchy.
Definition: Metadata.h:62
A Module instance is used to store all the information related to an LLVM module.
Definition: Module.h:65
StringRef getName() const
Get a short "name" for the module.
Definition: Module.h:285
Wrapper class representing virtual and physical registers.
Definition: Register.h:19
static constexpr bool isPhysicalRegister(unsigned Reg)
Return true if the specified register number is in the physical register namespace.
Definition: Register.h:65
bool isReadOnly() const
Definition: SectionKind.h:131
bool empty() const
Determine if the SetVector is empty or not.
Definition: SetVector.h:93
bool insert(const value_type &X)
Insert a new element into the SetVector.
Definition: SetVector.h:162
Implements a dense probed hash-table based set with some number of buckets stored inline.
Definition: DenseSet.h:298
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
Definition: SmallString.h:26
bool empty() const
Definition: SmallVector.h:81
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
Definition: SmallVector.h:573
void append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
Definition: SmallVector.h:683
void push_back(const T &Elt)
Definition: SmallVector.h:413
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Definition: SmallVector.h:1196
StackOffset holds a fixed and a scalable offset in bytes.
Definition: TypeSize.h:33
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:51
std::string str() const
str - Get the contents as an std::string.
Definition: StringRef.h:229
constexpr bool empty() const
empty - Check if the string is empty.
Definition: StringRef.h:147
Information about stack frame layout on the target.
virtual DwarfFrameBase getDwarfFrameBase(const MachineFunction &MF) const
Return the frame base information to be encoded in the DWARF subprogram debug info.
virtual StackOffset getFrameIndexReference(const MachineFunction &MF, int FI, Register &FrameReg) const
getFrameIndexReference - This method should return the base register and offset used to reference a f...
virtual MCRegister getStaticBase() const
Returns the register used as static base in RWPI variants.
static SectionKind getKindForGlobal(const GlobalObject *GO, const TargetMachine &TM)
Classify the specified global variable into a set of target independent categories embodied in Sectio...
bool supportDebugThreadLocalLocation() const
Target supports TLS offset relocation in debug section?
virtual const MCExpr * getIndirectSymViaRWPI(const MCSymbol *Sym) const
Get the target specific RWPI relocation.
virtual const MCExpr * getDebugThreadLocalSymbol(const MCSymbol *Sym) const
Create a symbol reference to describe the given TLS variable when emitting the address in debug info.
const Triple & getTargetTriple() const
bool useEmulatedTLS() const
Returns true if this target uses emulated TLS.
Reloc::Model getRelocationModel() const
Returns the code generation relocation model.
TargetOptions Options
const MCRegisterInfo * getMCRegisterInfo() const
bool DisableFramePointerElim(const MachineFunction &MF) const
DisableFramePointerElim - This returns true if frame pointer elimination optimization should be disab...
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
virtual const TargetRegisterInfo * getRegisterInfo() const
getRegisterInfo - If register information is available, return it.
virtual const TargetFrameLowering * getFrameLowering() const
bool isNVPTX() const
Tests whether the target is NVPTX (32- or 64-bit).
Definition: Triple.h:881
bool isWasm() const
Tests whether the target is wasm (32- and 64-bit).
Definition: Triple.h:1064
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition: Twine.h:81
StringRef toStringRef(SmallVectorImpl< char > &Out) const
This returns the twine as a single StringRef if it can be represented as such.
Definition: Twine.h:492
std::pair< iterator, bool > insert(const ValueT &V)
Definition: DenseSet.h:213
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:95
A DeclContext is a named program scope that is used for ODR uniquing of types.
NodeTy * getNextNode()
Get the next node, or nullptr for the list tail.
Definition: ilist_node.h:353
bool tuneForSCE() const
Definition: DwarfDebug.h:916
bool tuneForGDB() const
Definition: DwarfDebug.h:914
bool tuneForLLDB() const
Definition: DwarfDebug.h:915
StringRef AttributeEncodingString(unsigned Encoding)
Definition: Dwarf.cpp:263
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ Entry
Definition: COFF.h:844
@ ROPI_RWPI
Definition: CodeGen.h:25
initializer< Ty > init(const Ty &Val)
Definition: CommandLine.h:443
@ DW_INL_inlined
Definition: Dwarf.h:763
Attribute
Attributes.
Definition: Dwarf.h:124
UnitType
Constants for unit types in DWARF v5.
Definition: Dwarf.h:882
LocationAtom
Definition: Dwarf.h:137
@ WASM_TYPE_I64
Definition: Wasm.h:55
@ WASM_TYPE_I32
Definition: Wasm.h:54
@ WASM_SYMBOL_TYPE_GLOBAL
Definition: Wasm.h:218
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
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:1746
auto reverse(ContainerTy &&C)
Definition: STLExtras.h:420
@ Apple
.apple_names, .apple_namespaces, .apple_types, .apple_objc.
@ Global
Append to llvm.global_dtors.
constexpr T divideCeil(U Numerator, V Denominator)
Returns the integer ceil(Numerator / Denominator).
Definition: MathExtras.h:404
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:1938
DWARFExpression::Operation Op
std::pair< const MachineInstr *, const MachineInstr * > InsnRange
InsnRange - This is used to track range of instructions with identical lexical scope.
Definition: LexicalScopes.h:39
DISubprogram * getDISubprogram(const MDNode *Scope)
Find subprogram that is enclosing this scope.
Definition: DebugInfo.cpp:169
Single location defined by (potentially multiple) EntryValueInfo.
Definition: DwarfDebug.h:172
std::set< EntryValueInfo > EntryValues
Definition: DwarfDebug.h:173
Single location defined by (potentially multiple) MMI entries.
Definition: DwarfDebug.h:159
const std::set< FrameIndexExpr > & getFrameIndexExprs() const
Get the FI entries, sorted by fragment offset.
Definition: DwarfDebug.cpp:292
const MCSymbol * End
Definition: DwarfFile.h:39
const MCSymbol * Begin
Definition: DwarfFile.h:38
Helper used to pair up a symbol and its DWARF compile unit.
Definition: DwarfDebug.h:335
enum llvm::TargetFrameLowering::DwarfFrameBase::FrameBaseKind Kind
union llvm::TargetFrameLowering::DwarfFrameBase::@249 Location
This struct describes target specific location.
Definition: DebugLocEntry.h:24