LLVM 23.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)
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) {
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 =
119 DD->useAddrOffsetForm() || DD->useAddrOffsetExpressions();
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");
139 if (DD->useAddrOffsetExpressions()) {
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() &&
278 !Asm->getObjFileLowering().supportDebugThreadLocalLocation())
279 continue;
280
281 if (!Loc) {
282 addToAccelTable = true;
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,
341 Asm->getObjFileLowering().getDebugThreadLocalSymbol(Sym));
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() &&
353 Asm->TM.getRelocationModel() == Reloc::PIC_) {
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 ||
361 Asm->TM.getRelocationModel() == Reloc::ROPI_RWPI) &&
362 !Asm->getObjFileLowering()
363 .getKindForGlobal(Global, Asm->TM)
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,
370 Asm->getObjFileLowering().getIndirectSymViaRWPI(Sym));
371 // Base register
372 Register BaseReg = Asm->getObjFileLowering().getStaticBase();
373 unsigned DwarfBaseReg =
374 Asm->TM.getMCRegisterInfo()->getDwarfRegNum(BaseReg, false);
375 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + DwarfBaseReg);
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) {
409 DD->addAccelName(*this, CUNode->getNameTableKind(), GV->getName(),
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() &&
415 DD->useAllLinkageNames())
416 DD->addAccelName(*this, CUNode->getNameTableKind(), 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(), /*Column*/ 0, CB->getFile());
433 if (DIGlobalVariable *V = CB->getDecl())
434 getCU().addLocationAttribute(&NDie, V, GlobalExprs);
435 return &NDie;
436}
437
439 DD->insertSectionLabel(Range.Begin);
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
462 if (CUNode->isDebugDirectivesOnly())
463 return;
464
465 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
466 if (DD->useSectionsAsReferences()) {
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
483 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
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 (!isDwoUnit() || !llvm::isRangeRelaxable(Begin, End))) {
498 addLabelDelta(D, dwarf::DW_AT_high_pc, End, Begin);
499 return;
500 }
501 addLabelAddress(D, dwarf::DW_AT_high_pc, End);
502}
503
504// Add info for Wasm-global-based relocation.
505// 'GlobalIndex' is used for split dwarf, which currently relies on a few
506// assumptions that are not guaranteed in a formal way but work in practice.
507void DwarfCompileUnit::addWasmRelocBaseGlobal(DIELoc *Loc, StringRef GlobalName,
508 uint64_t GlobalIndex) {
509 // FIXME: duplicated from Target/WebAssembly/WebAssembly.h
510 // don't want to depend on target specific headers in this code?
511 const unsigned TI_GLOBAL_RELOC = 3;
512 unsigned PointerSize = Asm->getDataLayout().getPointerSize();
513 auto *Sym =
514 static_cast<MCSymbolWasm *>(Asm->GetExternalSymbolSymbol(GlobalName));
515 // FIXME: this repeats what WebAssemblyMCInstLower::
516 // GetExternalSymbolSymbol does, since if there's no code that
517 // refers to this symbol, we have to set it here.
519 Sym->setGlobalType(wasm::WasmGlobalType{
520 static_cast<uint8_t>(PointerSize == 4 ? wasm::WASM_TYPE_I32
522 true});
523 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_WASM_location);
524 addSInt(*Loc, dwarf::DW_FORM_sdata, TI_GLOBAL_RELOC);
525 if (!isDwoUnit()) {
526 addLabel(*Loc, dwarf::DW_FORM_data4, Sym);
527 } else {
528 // FIXME: when writing dwo, we need to avoid relocations. Probably
529 // the "right" solution is to treat globals the way func and data
530 // symbols are (with entries in .debug_addr).
531 // For now we hardcode the indices in the callsites. Global indices are not
532 // fixed, but in practice a few are fixed; for example, __stack_pointer is
533 // always index 0.
534 addUInt(*Loc, dwarf::DW_FORM_data4, GlobalIndex);
535 }
536}
537
538// Find DIE for the given subprogram and attach appropriate DW_AT_low_pc
539// and DW_AT_high_pc attributes. If there are global variables in this
540// scope then create and insert DIEs for these variables.
542 const Function &F,
543 MCSymbol *LineTableSym) {
546 // If basic block sections are on, ranges for each basic block section has
547 // to be emitted separately.
548 for (const auto &R : Asm->MBBSectionRanges)
549 BB_List.push_back({R.second.BeginLabel, R.second.EndLabel});
550
551 attachRangesOrLowHighPC(*SPDie, BB_List);
552
553 if (DD->useAppleExtensionAttributes() &&
554 !DD->getCurrentFunction()->getTarget().Options.DisableFramePointerElim(
555 *DD->getCurrentFunction()))
556 addFlag(*SPDie, dwarf::DW_AT_APPLE_omit_frame_ptr);
557
558 if (emitFuncLineTableOffsets() && LineTableSym) {
560 *SPDie, dwarf::DW_AT_LLVM_stmt_sequence, LineTableSym,
561 Asm->getObjFileLowering().getDwarfLineSection()->getBeginSymbol());
562 }
563
564 // Only include DW_AT_frame_base in full debug info
566 const TargetFrameLowering *TFI = Asm->MF->getSubtarget().getFrameLowering();
568 TFI->getDwarfFrameBase(*Asm->MF);
569 switch (FrameBase.Kind) {
572 MachineLocation Location(FrameBase.Location.Reg);
573 addAddress(*SPDie, dwarf::DW_AT_frame_base, Location);
574 }
575 break;
576 }
579 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_call_frame_cfa);
580 if (FrameBase.Location.Offset != 0) {
581 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_consts);
582 addSInt(*Loc, dwarf::DW_FORM_sdata, FrameBase.Location.Offset);
583 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
584 }
585 addBlock(*SPDie, dwarf::DW_AT_frame_base, Loc);
586 break;
587 }
589 // FIXME: duplicated from Target/WebAssembly/WebAssembly.h
590 const unsigned TI_GLOBAL_RELOC = 3;
591 if (FrameBase.Location.WasmLoc.Kind == TI_GLOBAL_RELOC) {
592 // These need to be relocatable.
594 assert(FrameBase.Location.WasmLoc.Index == 0); // Only SP so far.
595 // For now, since we only ever use index 0, this should work as-is.
596 addWasmRelocBaseGlobal(Loc, "__stack_pointer",
597 FrameBase.Location.WasmLoc.Index);
598 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_stack_value);
599 addBlock(*SPDie, dwarf::DW_AT_frame_base, Loc);
600 } else {
602 DIEDwarfExpression DwarfExpr(*Asm, *this, *Loc);
603 DIExpressionCursor Cursor({});
604 DwarfExpr.addWasmLocation(FrameBase.Location.WasmLoc.Kind,
605 FrameBase.Location.WasmLoc.Index);
606 DwarfExpr.addExpression(std::move(Cursor));
607 addBlock(*SPDie, dwarf::DW_AT_frame_base, DwarfExpr.finalize());
608 }
609 break;
610 }
611 }
612 }
613
614 // Add name to the name table, we do this here because we're guaranteed
615 // to have concrete versions of our DW_TAG_subprogram nodes.
616 DD->addSubprogramNames(*this, CUNode->getNameTableKind(), SP, *SPDie);
617
618 return *SPDie;
619}
620
621// Construct a DIE for this scope.
623 DIE &ParentScopeDIE) {
624 if (!Scope || !Scope->getScopeNode())
625 return;
626
627 auto *DS = Scope->getScopeNode();
628
629 assert((Scope->getInlinedAt() || !isa<DISubprogram>(DS)) &&
630 "Only handle inlined subprograms here, use "
631 "constructSubprogramScopeDIE for non-inlined "
632 "subprograms");
633
634 // Emit inlined subprograms.
635 if (Scope->getParent() && isa<DISubprogram>(DS)) {
636 DIE *ScopeDIE = constructInlinedScopeDIE(Scope, ParentScopeDIE);
637 assert(ScopeDIE && "Scope DIE should not be null.");
638 createAndAddScopeChildren(Scope, *ScopeDIE);
639 return;
640 }
641
642 // Early exit when we know the scope DIE is going to be null.
643 if (DD->isLexicalScopeDIENull(Scope))
644 return;
645
646 // Emit lexical blocks.
647 DIE *ScopeDIE = getOrCreateLexicalBlockDIE(Scope, ParentScopeDIE);
648 assert(ScopeDIE && "Scope DIE should not be null.");
649
650 createAndAddScopeChildren(Scope, *ScopeDIE);
651}
652
655
656 HasRangeLists = true;
657
658 // Add the range list to the set of ranges to be emitted.
659 auto IndexAndList =
660 (DD->getDwarfVersion() < 5 && Skeleton ? Skeleton->DU : DU)
661 ->addRange(*(Skeleton ? Skeleton : this), std::move(Range));
662
663 uint32_t Index = IndexAndList.first;
664 auto &List = *IndexAndList.second;
665
666 // Under fission, ranges are specified by constant offsets relative to the
667 // CU's DW_AT_GNU_ranges_base.
668 // FIXME: For DWARF v5, do not generate the DW_AT_ranges attribute under
669 // fission until we support the forms using the .debug_addr section
670 // (DW_RLE_startx_endx etc.).
671 if (DD->getDwarfVersion() >= 5)
672 addUInt(ScopeDIE, dwarf::DW_AT_ranges, dwarf::DW_FORM_rnglistx, Index);
673 else {
674 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
675 const MCSymbol *RangeSectionSym =
677 if (isDwoUnit())
678 addSectionDelta(ScopeDIE, dwarf::DW_AT_ranges, List.Label,
679 RangeSectionSym);
680 else
681 addSectionLabel(ScopeDIE, dwarf::DW_AT_ranges, List.Label,
682 RangeSectionSym);
683 }
684}
685
687 DIE &Die, SmallVector<RangeSpan, 2> Ranges) {
688 assert(!Ranges.empty());
689 if (!DD->useRangesSection() ||
690 (Ranges.size() == 1 &&
691 (!DD->alwaysUseRanges(*this) ||
692 DD->getSectionLabel(&Ranges.front().Begin->getSection()) ==
693 Ranges.front().Begin))) {
694 const RangeSpan &Front = Ranges.front();
695 const RangeSpan &Back = Ranges.back();
696 attachLowHighPC(Die, Front.Begin, Back.End);
697 } else
698 addScopeRangeList(Die, std::move(Ranges));
699}
700
702 DIE &Die, const SmallVectorImpl<InsnRange> &Ranges) {
704 List.reserve(Ranges.size());
705 for (const InsnRange &R : Ranges) {
706 auto *BeginLabel = DD->getLabelBeforeInsn(R.first);
707 auto *EndLabel = DD->getLabelAfterInsn(R.second);
708
709 const auto *BeginMBB = R.first->getParent();
710 const auto *EndMBB = R.second->getParent();
711
712 const auto *MBB = BeginMBB;
713 // Basic block sections allows basic block subsets to be placed in unique
714 // sections. For each section, the begin and end label must be added to the
715 // list. If there is more than one range, debug ranges must be used.
716 // Otherwise, low/high PC can be used.
717 // FIXME: Debug Info Emission depends on block order and this assumes that
718 // the order of blocks will be frozen beyond this point.
719 do {
720 if (MBB->sameSection(EndMBB) || MBB->isEndSection()) {
721 auto MBBSectionRange = Asm->MBBSectionRanges[MBB->getSectionID()];
722 List.push_back(
723 {MBB->sameSection(BeginMBB) ? BeginLabel
724 : MBBSectionRange.BeginLabel,
725 MBB->sameSection(EndMBB) ? EndLabel : MBBSectionRange.EndLabel});
726 }
727 if (MBB->sameSection(EndMBB))
728 break;
729 MBB = MBB->getNextNode();
730 } while (true);
731 }
732 attachRangesOrLowHighPC(Die, std::move(List));
733}
734
736 DIE &ParentScopeDIE) {
737 assert(Scope->getScopeNode());
738 auto *DS = Scope->getScopeNode();
739 auto *InlinedSP = getDISubprogram(DS);
740 // Find the subprogram's DwarfCompileUnit in the SPMap in case the subprogram
741 // was inlined from another compile unit.
742 DIE *OriginDIE = getAbstractScopeDIEs()[InlinedSP];
743 assert(OriginDIE && "Unable to find original DIE for an inlined subprogram.");
744
745 auto ScopeDIE = DIE::get(DIEValueAllocator, dwarf::DW_TAG_inlined_subroutine);
746 ParentScopeDIE.addChild(ScopeDIE);
747 addDIEEntry(*ScopeDIE, dwarf::DW_AT_abstract_origin, *OriginDIE);
748
749 attachRangesOrLowHighPC(*ScopeDIE, Scope->getRanges());
750
751 // Add the call site information to the DIE.
752 const DILocation *IA = Scope->getInlinedAt();
753 addUInt(*ScopeDIE, dwarf::DW_AT_call_file, std::nullopt,
754 getOrCreateSourceID(IA->getFile()));
755 addUInt(*ScopeDIE, dwarf::DW_AT_call_line, std::nullopt, IA->getLine());
756 if (IA->getColumn())
757 addUInt(*ScopeDIE, dwarf::DW_AT_call_column, std::nullopt, IA->getColumn());
758 if (IA->getDiscriminator() && DD->getDwarfVersion() >= 4)
759 addUInt(*ScopeDIE, dwarf::DW_AT_GNU_discriminator, std::nullopt,
760 IA->getDiscriminator());
761
762 // Add name to the name table, we do this here because we're guaranteed
763 // to have concrete versions of our DW_TAG_inlined_subprogram nodes.
764 DD->addSubprogramNames(*this, CUNode->getNameTableKind(), InlinedSP,
765 *ScopeDIE);
766
767 return ScopeDIE;
768}
769
771 DIE &ParentScopeDIE) {
772 if (DD->isLexicalScopeDIENull(Scope))
773 return nullptr;
774 const auto *DS = Scope->getScopeNode();
775
776 auto ScopeDIE = DIE::get(DIEValueAllocator, dwarf::DW_TAG_lexical_block);
777 ParentScopeDIE.addChild(ScopeDIE);
778
779 if (Scope->isAbstractScope()) {
780 assert(!getAbstractScopeDIEs().count(DS) &&
781 "Abstract DIE for this scope exists!");
782 getAbstractScopeDIEs()[DS] = ScopeDIE;
783 return ScopeDIE;
784 }
785 if (!Scope->getInlinedAt()) {
786 assert(!LexicalBlockDIEs.count(DS) &&
787 "Concrete out-of-line DIE for this scope exists!");
788 LexicalBlockDIEs[DS] = ScopeDIE;
789 } else {
790 InlinedLocalScopeDIEs[DS].push_back(ScopeDIE);
791 }
792
793 attachRangesOrLowHighPC(*ScopeDIE, Scope->getRanges());
794
795 return ScopeDIE;
796}
797
799 auto *VariableDie = DIE::get(DIEValueAllocator, DV.getTag());
800 insertDIE(DV.getVariable(), VariableDie);
801 DV.setDIE(*VariableDie);
802 // Abstract variables don't get common attributes later, so apply them now.
803 if (Abstract) {
804 applyCommonDbgVariableAttributes(DV, *VariableDie);
805 } else {
806 std::visit(
807 [&](const auto &V) {
808 applyConcreteDbgVariableAttributes(V, DV, *VariableDie);
809 },
810 DV.asVariant());
811 }
812 return VariableDie;
813}
814
815void DwarfCompileUnit::applyConcreteDbgVariableAttributes(
816 const Loc::Single &Single, const DbgVariable &DV, DIE &VariableDie) {
817 const DbgValueLoc *DVal = &Single.getValueLoc();
818 if (Asm->TM.getTargetTriple().isNVPTX() && DD->tuneForGDB() &&
819 !Single.getExpr()) {
820 // cuda-gdb special requirement. See NVPTXAS::DWARF_AddressSpace
821 // Lack of expression means it is a register.
822 addUInt(VariableDie, dwarf::DW_AT_address_class, dwarf::DW_FORM_data1,
824 }
825 if (!DVal->isVariadic()) {
826 const DbgValueLocEntry *Entry = DVal->getLocEntries().begin();
827 if (Entry->isLocation()) {
828 addVariableAddress(DV, VariableDie, Entry->getLoc());
829 } else if (Entry->isInt()) {
830 auto *Expr = Single.getExpr();
831 if (Expr && Expr->getNumElements()) {
832 DIELoc *Loc = new (DIEValueAllocator) DIELoc;
833 DIEDwarfExpression DwarfExpr(*Asm, *this, *Loc);
834 // If there is an expression, emit raw unsigned bytes.
835 DwarfExpr.addFragmentOffset(Expr);
836 DwarfExpr.addUnsignedConstant(Entry->getInt());
837 DwarfExpr.addExpression(Expr);
838 addBlock(VariableDie, dwarf::DW_AT_location, DwarfExpr.finalize());
839 if (DwarfExpr.TagOffset)
840 addUInt(VariableDie, dwarf::DW_AT_LLVM_tag_offset,
841 dwarf::DW_FORM_data1, *DwarfExpr.TagOffset);
842 } else
843 addConstantValue(VariableDie, Entry->getInt(), DV.getType());
844 } else if (Entry->isConstantFP()) {
845 addConstantFPValue(VariableDie, Entry->getConstantFP());
846 } else if (Entry->isConstantInt()) {
847 addConstantValue(VariableDie, Entry->getConstantInt(), DV.getType());
848 } else if (Entry->isTargetIndexLocation()) {
849 DIELoc *Loc = new (DIEValueAllocator) DIELoc;
850 DIEDwarfExpression DwarfExpr(*Asm, *this, *Loc);
851 const DIBasicType *BT = dyn_cast<DIBasicType>(
852 static_cast<const Metadata *>(DV.getVariable()->getType()));
853 DwarfDebug::emitDebugLocValue(*Asm, BT, *DVal, DwarfExpr);
854 addBlock(VariableDie, dwarf::DW_AT_location, DwarfExpr.finalize());
855 }
856 return;
857 }
858 // If any of the location entries are registers with the value 0,
859 // then the location is undefined.
860 if (any_of(DVal->getLocEntries(), [](const DbgValueLocEntry &Entry) {
861 return Entry.isLocation() && !Entry.getLoc().getReg();
862 }))
863 return;
864 const DIExpression *Expr = Single.getExpr();
865 assert(Expr && "Variadic Debug Value must have an Expression.");
866 DIELoc *Loc = new (DIEValueAllocator) DIELoc;
867 DIEDwarfExpression DwarfExpr(*Asm, *this, *Loc);
868 DwarfExpr.addFragmentOffset(Expr);
869 DIExpressionCursor Cursor(Expr);
870 const TargetRegisterInfo &TRI = *Asm->MF->getSubtarget().getRegisterInfo();
871
872 auto AddEntry = [&](const DbgValueLocEntry &Entry,
873 DIExpressionCursor &Cursor) {
874 if (Entry.isLocation()) {
875 if (!DwarfExpr.addMachineRegExpression(TRI, Cursor,
876 Entry.getLoc().getReg()))
877 return false;
878 } else if (Entry.isInt()) {
879 // If there is an expression, emit raw unsigned bytes.
880 DwarfExpr.addUnsignedConstant(Entry.getInt());
881 } else if (Entry.isConstantFP()) {
882 // DwarfExpression does not support arguments wider than 64 bits
883 // (see PR52584).
884 // TODO: Consider chunking expressions containing overly wide
885 // arguments into separate pointer-sized fragment expressions.
886 APInt RawBytes = Entry.getConstantFP()->getValueAPF().bitcastToAPInt();
887 if (RawBytes.getBitWidth() > 64)
888 return false;
889 DwarfExpr.addUnsignedConstant(RawBytes.getZExtValue());
890 } else if (Entry.isConstantInt()) {
891 APInt RawBytes = Entry.getConstantInt()->getValue();
892 if (RawBytes.getBitWidth() > 64)
893 return false;
894 DwarfExpr.addUnsignedConstant(RawBytes.getZExtValue());
895 } else if (Entry.isTargetIndexLocation()) {
896 TargetIndexLocation Loc = Entry.getTargetIndexLocation();
897 // TODO TargetIndexLocation is a target-independent. Currently
898 // only the WebAssembly-specific encoding is supported.
899 assert(Asm->TM.getTargetTriple().isWasm());
900 DwarfExpr.addWasmLocation(Loc.Index, static_cast<uint64_t>(Loc.Offset));
901 } else {
902 llvm_unreachable("Unsupported Entry type.");
903 }
904 return true;
905 };
906
907 if (!DwarfExpr.addExpression(
908 std::move(Cursor),
909 [&](unsigned Idx, DIExpressionCursor &Cursor) -> bool {
910 return AddEntry(DVal->getLocEntries()[Idx], Cursor);
911 }))
912 return;
913
914 // Now attach the location information to the DIE.
915 addBlock(VariableDie, dwarf::DW_AT_location, DwarfExpr.finalize());
916 if (DwarfExpr.TagOffset)
917 addUInt(VariableDie, dwarf::DW_AT_LLVM_tag_offset, dwarf::DW_FORM_data1,
918 *DwarfExpr.TagOffset);
919}
920
921void DwarfCompileUnit::applyConcreteDbgVariableAttributes(
922 const Loc::Multi &Multi, const DbgVariable &DV, DIE &VariableDie) {
923 addLocationList(VariableDie, dwarf::DW_AT_location,
924 Multi.getDebugLocListIndex());
925 auto TagOffset = Multi.getDebugLocListTagOffset();
926 if (TagOffset)
927 addUInt(VariableDie, dwarf::DW_AT_LLVM_tag_offset, dwarf::DW_FORM_data1,
928 *TagOffset);
929}
930
931void DwarfCompileUnit::applyConcreteDbgVariableAttributes(const Loc::MMI &MMI,
932 const DbgVariable &DV,
933 DIE &VariableDie) {
934 std::optional<unsigned> NVPTXAddressSpace;
935 DIELoc *Loc = new (DIEValueAllocator) DIELoc;
936 DIEDwarfExpression DwarfExpr(*Asm, *this, *Loc);
937 for (const auto &Fragment : MMI.getFrameIndexExprs()) {
938 Register FrameReg;
939 const DIExpression *Expr = Fragment.Expr;
940 const TargetFrameLowering *TFI = Asm->MF->getSubtarget().getFrameLowering();
941 StackOffset Offset =
942 TFI->getFrameIndexReference(*Asm->MF, Fragment.FI, FrameReg);
943 DwarfExpr.addFragmentOffset(Expr);
944
945 auto *TRI = Asm->MF->getSubtarget().getRegisterInfo();
946 SmallVector<uint64_t, 8> Ops;
947 TRI->getOffsetOpcodes(Offset, Ops);
948
949 // cuda-gdb special requirement. See NVPTXAS::DWARF_AddressSpace.
950 // Decode DW_OP_constu <DWARF Address Space> DW_OP_swap
951 // DW_OP_xderef sequence to specify address space.
952 if (Asm->TM.getTargetTriple().isNVPTX() && DD->tuneForGDB()) {
953 unsigned LocalNVPTXAddressSpace;
954 const DIExpression *NewExpr =
955 DIExpression::extractAddressClass(Expr, LocalNVPTXAddressSpace);
956 if (NewExpr != Expr) {
957 Expr = NewExpr;
958 NVPTXAddressSpace = LocalNVPTXAddressSpace;
959 }
960 }
961 if (Expr)
962 Ops.append(Expr->elements_begin(), Expr->elements_end());
963 DIExpressionCursor Cursor(Ops);
964 DwarfExpr.setMemoryLocationKind();
965 if (const MCSymbol *FrameSymbol = Asm->getFunctionFrameSymbol())
966 addOpAddress(*Loc, FrameSymbol);
967 else
968 DwarfExpr.addMachineRegExpression(
969 *Asm->MF->getSubtarget().getRegisterInfo(), Cursor, FrameReg);
970 DwarfExpr.addExpression(std::move(Cursor));
971 }
972 if (Asm->TM.getTargetTriple().isNVPTX() && DD->tuneForGDB()) {
973 // cuda-gdb special requirement. See NVPTXAS::DWARF_AddressSpace.
974 addUInt(VariableDie, dwarf::DW_AT_address_class, dwarf::DW_FORM_data1,
975 NVPTXAddressSpace.value_or(NVPTXAS::DWARF_ADDR_local_space));
976 }
977 addBlock(VariableDie, dwarf::DW_AT_location, DwarfExpr.finalize());
978 if (DwarfExpr.TagOffset)
979 addUInt(VariableDie, dwarf::DW_AT_LLVM_tag_offset, dwarf::DW_FORM_data1,
980 *DwarfExpr.TagOffset);
981}
982
983void DwarfCompileUnit::applyConcreteDbgVariableAttributes(
984 const Loc::EntryValue &EntryValue, const DbgVariable &DV,
985 DIE &VariableDie) {
986 DIELoc *Loc = new (DIEValueAllocator) DIELoc;
987 DIEDwarfExpression DwarfExpr(*Asm, *this, *Loc);
988 // Emit each expression as: EntryValue(Register) <other ops> <Fragment>.
989 for (auto [Register, Expr] : EntryValue.EntryValues) {
990 DwarfExpr.addFragmentOffset(&Expr);
991 DIExpressionCursor Cursor(Expr.getElements());
992 DwarfExpr.beginEntryValueExpression(Cursor);
993 DwarfExpr.addMachineRegExpression(
994 *Asm->MF->getSubtarget().getRegisterInfo(), Cursor, Register);
995 DwarfExpr.addExpression(std::move(Cursor));
996 }
997 addBlock(VariableDie, dwarf::DW_AT_location, DwarfExpr.finalize());
998}
999
1000void DwarfCompileUnit::applyConcreteDbgVariableAttributes(
1001 const std::monostate &, const DbgVariable &DV, DIE &VariableDie) {}
1002
1004 const LexicalScope &Scope,
1005 DIE *&ObjectPointer) {
1006 auto Var = constructVariableDIE(DV, Scope.isAbstractScope());
1007 if (DV.isObjectPointer())
1008 ObjectPointer = Var;
1009 return Var;
1010}
1011
1013 const LexicalScope &Scope) {
1014 auto LabelDie = DIE::get(DIEValueAllocator, DL.getTag());
1015 insertDIE(DL.getLabel(), LabelDie);
1016 DL.setDIE(*LabelDie);
1017
1018 if (Scope.isAbstractScope())
1019 applyLabelAttributes(DL, *LabelDie);
1020
1021 return LabelDie;
1022}
1023
1024/// Return all DIVariables that appear in count: expressions.
1027 auto *Array = dyn_cast<DICompositeType>(Var->getType());
1028 if (!Array || Array->getTag() != dwarf::DW_TAG_array_type)
1029 return Result;
1030 if (auto *DLVar = Array->getDataLocation())
1031 Result.push_back(DLVar);
1032 if (auto *AsVar = Array->getAssociated())
1033 Result.push_back(AsVar);
1034 if (auto *AlVar = Array->getAllocated())
1035 Result.push_back(AlVar);
1036 for (auto *El : Array->getElements()) {
1037 if (auto *Subrange = dyn_cast<DISubrange>(El)) {
1038 if (auto Count = Subrange->getCount())
1039 if (auto *Dependency = dyn_cast_if_present<DIVariable *>(Count))
1040 Result.push_back(Dependency);
1041 if (auto LB = Subrange->getLowerBound())
1042 if (auto *Dependency = dyn_cast_if_present<DIVariable *>(LB))
1043 Result.push_back(Dependency);
1044 if (auto UB = Subrange->getUpperBound())
1045 if (auto *Dependency = dyn_cast_if_present<DIVariable *>(UB))
1046 Result.push_back(Dependency);
1047 if (auto ST = Subrange->getStride())
1048 if (auto *Dependency = dyn_cast_if_present<DIVariable *>(ST))
1049 Result.push_back(Dependency);
1050 } else if (auto *GenericSubrange = dyn_cast<DIGenericSubrange>(El)) {
1051 if (auto Count = GenericSubrange->getCount())
1052 if (auto *Dependency = dyn_cast_if_present<DIVariable *>(Count))
1053 Result.push_back(Dependency);
1054 if (auto LB = GenericSubrange->getLowerBound())
1055 if (auto *Dependency = dyn_cast_if_present<DIVariable *>(LB))
1056 Result.push_back(Dependency);
1057 if (auto UB = GenericSubrange->getUpperBound())
1058 if (auto *Dependency = dyn_cast_if_present<DIVariable *>(UB))
1059 Result.push_back(Dependency);
1060 if (auto ST = GenericSubrange->getStride())
1061 if (auto *Dependency = dyn_cast_if_present<DIVariable *>(ST))
1062 Result.push_back(Dependency);
1063 }
1064 }
1065 return Result;
1066}
1067
1068/// Sort local variables so that variables appearing inside of helper
1069/// expressions come first.
1074 // Map back from a DIVariable to its containing DbgVariable.
1076 // Set of DbgVariables in Result.
1078 // For cycle detection.
1080
1081 // Initialize the worklist and the DIVariable lookup table.
1082 for (auto *Var : reverse(Input)) {
1083 DbgVar.insert({Var->getVariable(), Var});
1084 WorkList.push_back({Var, 0});
1085 }
1086
1087 // Perform a stable topological sort by doing a DFS.
1088 while (!WorkList.empty()) {
1089 auto Item = WorkList.back();
1090 DbgVariable *Var = Item.getPointer();
1091 bool visitedAllDependencies = Item.getInt();
1092 WorkList.pop_back();
1093
1094 assert(Var);
1095
1096 // Already handled.
1097 if (Visited.count(Var))
1098 continue;
1099
1100 // Add to Result if all dependencies are visited.
1101 if (visitedAllDependencies) {
1102 Visited.insert(Var);
1103 Result.push_back(Var);
1104 continue;
1105 }
1106
1107 // Detect cycles.
1108 auto Res = Visiting.insert(Var);
1109 if (!Res.second) {
1110 assert(false && "dependency cycle in local variables");
1111 return Result;
1112 }
1113
1114 // Push dependencies and this node onto the worklist, so that this node is
1115 // visited again after all of its dependencies are handled.
1116 WorkList.push_back({Var, 1});
1117 for (const auto *Dependency : dependencies(Var)) {
1118 // Don't add dependency if it is in a different lexical scope or a global.
1119 if (const auto *Dep = dyn_cast<const DILocalVariable>(Dependency))
1120 if (DbgVariable *Var = DbgVar.lookup(Dep))
1121 WorkList.push_back({Var, 0});
1122 }
1123 }
1124 return Result;
1125}
1126
1128 const Function &F,
1129 LexicalScope *Scope,
1130 MCSymbol *LineTableSym) {
1131 DIE &ScopeDIE = updateSubprogramScopeDIE(Sub, F, LineTableSym);
1132
1133 if (Scope) {
1134 assert(!Scope->getInlinedAt());
1135 assert(!Scope->isAbstractScope());
1136 // Collect lexical scope children first.
1137 // ObjectPointer might be a local (non-argument) local variable if it's a
1138 // block's synthetic this pointer.
1139 if (DIE *ObjectPointer = createAndAddScopeChildren(Scope, ScopeDIE))
1140 addDIEEntry(ScopeDIE, dwarf::DW_AT_object_pointer, *ObjectPointer);
1141 }
1142
1143 // If this is a variadic function, add an unspecified parameter.
1144 DITypeArray FnArgs = Sub->getType()->getTypeArray();
1145
1146 // If we have a single element of null, it is a function that returns void.
1147 // If we have more than one elements and the last one is null, it is a
1148 // variadic function.
1149 if (FnArgs.size() > 1 && !FnArgs[FnArgs.size() - 1] &&
1151 ScopeDIE.addChild(
1152 DIE::get(DIEValueAllocator, dwarf::DW_TAG_unspecified_parameters));
1153
1154 return ScopeDIE;
1155}
1156
1158 DIE &ScopeDIE) {
1159 DIE *ObjectPointer = nullptr;
1160
1161 // Emit function arguments (order is significant).
1162 auto Vars = DU->getScopeVariables().lookup(Scope);
1163 for (auto &DV : Vars.Args)
1164 ScopeDIE.addChild(constructVariableDIE(*DV.second, *Scope, ObjectPointer));
1165
1166 // Emit local variables.
1167 auto Locals = sortLocalVars(Vars.Locals);
1168 for (DbgVariable *DV : Locals)
1169 ScopeDIE.addChild(constructVariableDIE(*DV, *Scope, ObjectPointer));
1170
1171 // Emit labels.
1172 for (DbgLabel *DL : DU->getScopeLabels().lookup(Scope))
1173 ScopeDIE.addChild(constructLabelDIE(*DL, *Scope));
1174
1175 // Track other local entities (skipped in gmlt-like data).
1176 // This creates mapping between CU and a set of local declarations that
1177 // should be emitted for subprograms in this CU.
1178 if (!includeMinimalInlineScopes() && !Scope->getInlinedAt()) {
1179 auto &LocalDecls = DD->getLocalDeclsForScope(Scope->getScopeNode());
1180 DeferredLocalDecls.insert_range(LocalDecls);
1181 }
1182
1183 // Emit inner lexical scopes.
1184 auto skipLexicalScope = [this](LexicalScope *S) -> bool {
1185 if (isa<DISubprogram>(S->getScopeNode()))
1186 return false;
1187 auto Vars = DU->getScopeVariables().lookup(S);
1188 if (!Vars.Args.empty() || !Vars.Locals.empty())
1189 return false;
1190 return includeMinimalInlineScopes() ||
1191 DD->getLocalDeclsForScope(S->getScopeNode()).empty();
1192 };
1193 for (LexicalScope *LS : Scope->getChildren()) {
1194 // If the lexical block doesn't have non-scope children, skip
1195 // its emission and put its children directly to the parent scope.
1196 if (skipLexicalScope(LS))
1197 createAndAddScopeChildren(LS, ScopeDIE);
1198 else
1199 constructScopeDIE(LS, ScopeDIE);
1200 }
1201
1202 return ObjectPointer;
1203}
1204
1206 const DISubprogram *SP) {
1207 if (auto *AbsDef = getAbstractScopeDIEs().lookup(SP))
1208 return *AbsDef;
1209
1210 auto [ContextDIE, ContextCU] = getOrCreateAbstractSubprogramContextDIE(SP);
1211 return createAbstractSubprogramDIE(SP, ContextDIE, ContextCU);
1212}
1213
1214DIE &DwarfCompileUnit::createAbstractSubprogramDIE(
1215 const DISubprogram *SP, DIE *ContextDIE, DwarfCompileUnit *ContextCU) {
1216 // Passing null as the associated node because the abstract definition
1217 // shouldn't be found by lookup.
1218 DIE &AbsDef = ContextCU->createAndAddDIE(dwarf::DW_TAG_subprogram,
1219 *ContextDIE, nullptr);
1220
1221 // Store the DIE before creating children.
1222 ContextCU->getAbstractScopeDIEs()[SP] = &AbsDef;
1223
1224 ContextCU->applySubprogramAttributesToDefinition(SP, AbsDef);
1225 ContextCU->addSInt(AbsDef, dwarf::DW_AT_inline,
1226 DD->getDwarfVersion() <= 4 ? std::optional<dwarf::Form>()
1227 : dwarf::DW_FORM_implicit_const,
1229
1230 return AbsDef;
1231}
1232
1233std::pair<DIE *, DwarfCompileUnit *>
1234DwarfCompileUnit::getOrCreateAbstractSubprogramContextDIE(
1235 const DISubprogram *SP) {
1236 bool Minimal = includeMinimalInlineScopes();
1237 bool IgnoreScope = shouldPlaceInUnitDIE(SP, Minimal);
1238 DIE *ContextDIE = getOrCreateSubprogramContextDIE(SP, IgnoreScope);
1239
1240 if (auto *SPDecl = SP->getDeclaration())
1241 if (!Minimal)
1242 getOrCreateSubprogramDIE(SPDecl, nullptr);
1243
1244 // The scope may be shared with a subprogram that has already been
1245 // constructed in another CU, in which case we need to construct this
1246 // subprogram in the same CU.
1247 auto *ContextCU = IgnoreScope ? this : DD->lookupCU(ContextDIE->getUnitDie());
1248
1249 return std::make_pair(ContextDIE, ContextCU);
1250}
1251
1253 LexicalScope *Scope) {
1254 auto *SP = cast<DISubprogram>(Scope->getScopeNode());
1255
1256 // Populate subprogram DIE only once.
1257 if (!getFinalizedAbstractSubprograms().insert(SP).second)
1258 return;
1259
1260 auto [ContextDIE, ContextCU] = getOrCreateAbstractSubprogramContextDIE(SP);
1261 DIE *AbsDef = getAbstractScopeDIEs().lookup(SP);
1262 if (!AbsDef)
1263 AbsDef = &createAbstractSubprogramDIE(SP, ContextDIE, ContextCU);
1264
1265 if (DIE *ObjectPointer = ContextCU->createAndAddScopeChildren(Scope, *AbsDef))
1266 ContextCU->addDIEEntry(*AbsDef, dwarf::DW_AT_object_pointer,
1267 *ObjectPointer);
1268}
1269
1271 return DD->getDwarfVersion() <= 4 && !DD->tuneForLLDB();
1272}
1273
1276 return Tag;
1277 switch (Tag) {
1278 case dwarf::DW_TAG_call_site:
1279 return dwarf::DW_TAG_GNU_call_site;
1280 case dwarf::DW_TAG_call_site_parameter:
1281 return dwarf::DW_TAG_GNU_call_site_parameter;
1282 default:
1283 llvm_unreachable("DWARF5 tag with no GNU analog");
1284 }
1285}
1286
1290 return Attr;
1291 switch (Attr) {
1292 case dwarf::DW_AT_call_all_calls:
1293 return dwarf::DW_AT_GNU_all_call_sites;
1294 case dwarf::DW_AT_call_target:
1295 return dwarf::DW_AT_GNU_call_site_target;
1296 case dwarf::DW_AT_call_target_clobbered:
1297 return dwarf::DW_AT_GNU_call_site_target_clobbered;
1298 case dwarf::DW_AT_call_origin:
1299 return dwarf::DW_AT_abstract_origin;
1300 case dwarf::DW_AT_call_return_pc:
1301 return dwarf::DW_AT_low_pc;
1302 case dwarf::DW_AT_call_value:
1303 return dwarf::DW_AT_GNU_call_site_value;
1304 case dwarf::DW_AT_call_tail_call:
1305 return dwarf::DW_AT_GNU_tail_call;
1306 default:
1307 llvm_unreachable("DWARF5 attribute with no GNU analog");
1308 }
1309}
1310
1314 return Loc;
1315 switch (Loc) {
1316 case dwarf::DW_OP_entry_value:
1317 return dwarf::DW_OP_GNU_entry_value;
1318 default:
1319 llvm_unreachable("DWARF5 location atom with no GNU analog");
1320 }
1321}
1322
1324 DIE &ScopeDIE, const DISubprogram *CalleeSP, const Function *CalleeF,
1325 bool IsTail, const MCSymbol *PCAddr, const MCSymbol *CallAddr,
1326 MachineLocation CallTarget, int64_t Offset, DIType *AllocSiteTy) {
1327 // Insert a call site entry DIE within ScopeDIE.
1328 DIE &CallSiteDIE = createAndAddDIE(getDwarf5OrGNUTag(dwarf::DW_TAG_call_site),
1329 ScopeDIE, nullptr);
1330
1331 // A valid register in CallTarget indicates an indirect call.
1332 if (CallTarget.getReg()) {
1333 // Add a DW_AT_call_target location expression describing the location of
1334 // the address of the target function. If any register in the expression
1335 // (i.e., the single register we currently handle) is volatile we must use
1336 // DW_AT_call_target_clobbered instead.
1337 const TargetRegisterInfo &TRI = *Asm->MF->getSubtarget().getRegisterInfo();
1339 TRI.isCalleeSavedPhysReg(CallTarget.getReg(), *Asm->MF)
1340 ? dwarf::DW_AT_call_target
1341 : dwarf::DW_AT_call_target_clobbered);
1342
1343 // CallTarget is the location of the address of an indirect call. The
1344 // location may be indirect, modified by Offset.
1345 if (CallTarget.isIndirect())
1346 addMemoryLocation(CallSiteDIE, Attribute, CallTarget, Offset);
1347 else
1348 addAddress(CallSiteDIE, Attribute, CallTarget);
1349 } else if (CalleeSP) {
1350 DIE *CalleeDIE = getOrCreateSubprogramDIE(CalleeSP, CalleeF);
1351 assert(CalleeDIE && "Could not create DIE for call site entry origin");
1352 addLinkageNamesToDeclarations(*DD, *CalleeSP, *CalleeDIE);
1353
1354 addDIEEntry(CallSiteDIE, getDwarf5OrGNUAttr(dwarf::DW_AT_call_origin),
1355 *CalleeDIE);
1356 }
1357
1358 if (IsTail) {
1359 // Attach DW_AT_call_tail_call to tail calls for standards compliance.
1360 addFlag(CallSiteDIE, getDwarf5OrGNUAttr(dwarf::DW_AT_call_tail_call));
1361
1362 // Attach the address of the branch instruction to allow the debugger to
1363 // show where the tail call occurred. This attribute has no GNU analog.
1364 //
1365 // GDB works backwards from non-standard usage of DW_AT_low_pc (in DWARF4
1366 // mode -- equivalently, in DWARF5 mode, DW_AT_call_return_pc) at tail-call
1367 // site entries to figure out the PC of tail-calling branch instructions.
1368 // This means it doesn't need the compiler to emit DW_AT_call_pc, so we
1369 // don't emit it here.
1370 //
1371 // There's no need to tie non-GDB debuggers to this non-standardness, as it
1372 // adds unnecessary complexity to the debugger. For non-GDB debuggers, emit
1373 // the standard DW_AT_call_pc info.
1375 addLabelAddress(CallSiteDIE, dwarf::DW_AT_call_pc, CallAddr);
1376 }
1377
1378 // Attach the return PC to allow the debugger to disambiguate call paths
1379 // from one function to another.
1380 //
1381 // The return PC is only really needed when the call /isn't/ a tail call, but
1382 // GDB expects it in DWARF4 mode, even for tail calls (see the comment above
1383 // the DW_AT_call_pc emission logic for an explanation).
1384 if (!IsTail || useGNUAnalogForDwarf5Feature()) {
1385 assert(PCAddr && "Missing return PC information for a call");
1386 addLabelAddress(CallSiteDIE,
1387 getDwarf5OrGNUAttr(dwarf::DW_AT_call_return_pc), PCAddr);
1388 }
1389
1390 if (AllocSiteTy)
1391 addType(CallSiteDIE, AllocSiteTy, dwarf::DW_AT_LLVM_alloc_type);
1392
1393 return CallSiteDIE;
1394}
1395
1397 DIE &CallSiteDIE, SmallVector<DbgCallSiteParam, 4> &Params) {
1398 for (const auto &Param : Params) {
1399 unsigned Register = Param.getRegister();
1400 auto CallSiteDieParam =
1402 getDwarf5OrGNUTag(dwarf::DW_TAG_call_site_parameter));
1403 insertDIE(CallSiteDieParam);
1404 addAddress(*CallSiteDieParam, dwarf::DW_AT_location,
1406
1408 DIEDwarfExpression DwarfExpr(*Asm, *this, *Loc);
1409 DwarfExpr.setCallSiteParamValueFlag();
1410
1411 DwarfDebug::emitDebugLocValue(*Asm, nullptr, Param.getValue(), DwarfExpr);
1412
1413 addBlock(*CallSiteDieParam, getDwarf5OrGNUAttr(dwarf::DW_AT_call_value),
1414 DwarfExpr.finalize());
1415
1416 CallSiteDIE.addChild(CallSiteDieParam);
1417 }
1418}
1419
1421 const DIImportedEntity *Module) {
1422 DIE *IMDie = DIE::get(DIEValueAllocator, Module->getTag());
1423 insertDIE(Module, IMDie);
1424 DIE *EntityDie;
1425 auto *Entity = Module->getEntity();
1426 if (auto *NS = dyn_cast<DINamespace>(Entity))
1427 EntityDie = getOrCreateNameSpace(NS);
1428 else if (auto *M = dyn_cast<DIModule>(Entity))
1429 EntityDie = getOrCreateModule(M);
1430 else if (auto *SP = dyn_cast<DISubprogram>(Entity)) {
1431 // If there is an abstract subprogram, refer to it. Note that this assumes
1432 // that all the abstract subprograms have been already created (which is
1433 // correct until imported entities get emitted in DwarfDebug::endModule()).
1434 if (auto *AbsSPDie = getAbstractScopeDIEs().lookup(SP))
1435 EntityDie = AbsSPDie;
1436 else
1437 EntityDie = getOrCreateSubprogramDIE(SP, nullptr);
1438 } else if (auto *T = dyn_cast<DIType>(Entity))
1439 EntityDie = getOrCreateTypeDIE(T);
1440 else if (auto *GV = dyn_cast<DIGlobalVariable>(Entity))
1441 EntityDie = getOrCreateGlobalVariableDIE(GV, {});
1442 else if (auto *IE = dyn_cast<DIImportedEntity>(Entity))
1443 EntityDie = getOrCreateImportedEntityDIE(IE);
1444 else
1445 EntityDie = getDIE(Entity);
1446 assert(EntityDie);
1447 addSourceLine(*IMDie, Module->getLine(), /*Column*/ 0, Module->getFile());
1448 addDIEEntry(*IMDie, dwarf::DW_AT_import, *EntityDie);
1449 StringRef Name = Module->getName();
1450 if (!Name.empty()) {
1451 addString(*IMDie, dwarf::DW_AT_name, Name);
1452
1453 // FIXME: if consumers ever start caring about handling
1454 // unnamed import declarations such as `using ::nullptr_t`
1455 // or `using namespace std::ranges`, we could add the
1456 // import declaration into the accelerator table with the
1457 // name being the one of the entity being imported.
1458 DD->addAccelNamespace(*this, CUNode->getNameTableKind(), Name, *IMDie);
1459 }
1460
1461 // This is for imported module with renamed entities (such as variables and
1462 // subprograms).
1463 DINodeArray Elements = Module->getElements();
1464 for (const auto *Element : Elements) {
1465 if (!Element)
1466 continue;
1467 IMDie->addChild(
1469 }
1470
1471 return IMDie;
1472}
1473
1475 const DIImportedEntity *IE) {
1476
1477 // Check for pre-existence.
1478 if (DIE *Die = getDIE(IE))
1479 return Die;
1480
1481 DIE *ContextDIE = getOrCreateContextDIE(IE->getScope());
1482 assert(ContextDIE && "Empty scope for the imported entity!");
1483
1484 DIE *IMDie = constructImportedEntityDIE(IE);
1485 ContextDIE->addChild(IMDie);
1486 return IMDie;
1487}
1488
1490 DIE *D = getDIE(SP);
1491 if (DIE *AbsSPDIE = getAbstractScopeDIEs().lookup(SP)) {
1492 if (D)
1493 // If this subprogram has an abstract definition, reference that
1494 addDIEEntry(*D, dwarf::DW_AT_abstract_origin, *AbsSPDIE);
1495 } else {
1497 if (D)
1498 // And attach the attributes
1500 }
1501}
1502
1504 DbgEntity *AbsEntity = getExistingAbstractEntity(Entity->getEntity());
1505
1506 auto *Die = Entity->getDIE();
1507 /// Label may be used to generate DW_AT_low_pc, so put it outside
1508 /// if/else block.
1509 const DbgLabel *Label = nullptr;
1510 if (AbsEntity && AbsEntity->getDIE()) {
1511 addDIEEntry(*Die, dwarf::DW_AT_abstract_origin, *AbsEntity->getDIE());
1512 Label = dyn_cast<const DbgLabel>(Entity);
1513 } else {
1514 if (const DbgVariable *Var = dyn_cast<const DbgVariable>(Entity))
1516 else if ((Label = dyn_cast<const DbgLabel>(Entity)))
1517 applyLabelAttributes(*Label, *Die);
1518 else
1519 llvm_unreachable("DbgEntity must be DbgVariable or DbgLabel.");
1520 }
1521
1522 if (!Label)
1523 return;
1524
1525 const auto *Sym = Label->getSymbol();
1526 if (!Sym)
1527 return;
1528
1529 addLabelAddress(*Die, dwarf::DW_AT_low_pc, Sym);
1530
1531 // A TAG_label with a name and an AT_low_pc must be placed in debug_names.
1532 if (StringRef Name = Label->getName(); !Name.empty())
1533 getDwarfDebug().addAccelName(*this, CUNode->getNameTableKind(), Name, *Die);
1534}
1535
1537 auto AttachAO = [&](const DILocalScope *LS, DIE *ScopeDIE) {
1538 if (auto *AbsLSDie = getAbstractScopeDIEs().lookup(LS))
1539 addDIEEntry(*ScopeDIE, dwarf::DW_AT_abstract_origin, *AbsLSDie);
1540 };
1541
1542 for (auto [LScope, ScopeDIE] : LexicalBlockDIEs)
1543 AttachAO(LScope, ScopeDIE);
1544 for (auto &[LScope, ScopeDIEs] : InlinedLocalScopeDIEs)
1545 for (auto *ScopeDIE : ScopeDIEs)
1546 AttachAO(LScope, ScopeDIE);
1547}
1548
1550 auto &AbstractEntities = getAbstractEntities();
1551 auto I = AbstractEntities.find(Node);
1552 if (I != AbstractEntities.end())
1553 return I->second.get();
1554 return nullptr;
1555}
1556
1558 LexicalScope *Scope) {
1559 assert(Scope && Scope->isAbstractScope());
1560 auto &Entity = getAbstractEntities()[Node];
1562 Entity = std::make_unique<DbgVariable>(cast<const DILocalVariable>(Node),
1563 nullptr /* IA */);
1564 DU->addScopeVariable(Scope, cast<DbgVariable>(Entity.get()));
1565 } else if (isa<const DILabel>(Node)) {
1566 Entity = std::make_unique<DbgLabel>(
1567 cast<const DILabel>(Node), nullptr /* IA */);
1568 DU->addScopeLabel(Scope, cast<DbgLabel>(Entity.get()));
1569 }
1570}
1571
1572void DwarfCompileUnit::emitHeader(bool UseOffsets) {
1573 // Don't bother labeling the .dwo unit, as its offset isn't used.
1574 if (!Skeleton && !DD->useSectionsAsReferences()) {
1575 LabelBegin = Asm->createTempSymbol("cu_begin");
1576 Asm->OutStreamer->emitLabel(LabelBegin);
1577 }
1578
1579 dwarf::UnitType UT = Skeleton ? dwarf::DW_UT_split_compile
1580 : DD->useSplitDwarf() ? dwarf::DW_UT_skeleton
1581 : dwarf::DW_UT_compile;
1582 DwarfUnit::emitCommonHeader(UseOffsets, UT);
1583 if (DD->getDwarfVersion() >= 5 && UT != dwarf::DW_UT_compile)
1584 Asm->emitInt64(getDWOId());
1585}
1586
1588 switch (CUNode->getNameTableKind()) {
1590 return false;
1591 // Opting in to GNU Pubnames/types overrides the default to ensure these are
1592 // generated for things like Gold's gdb_index generation.
1594 return true;
1596 return false;
1598 return DD->tuneForGDB() && !includeMinimalInlineScopes() &&
1599 !CUNode->isDebugDirectivesOnly() &&
1600 DD->getAccelTableKind() != AccelTableKind::Apple &&
1601 DD->getDwarfVersion() < 5;
1602 }
1603 llvm_unreachable("Unhandled DICompileUnit::DebugNameTableKind enum");
1604}
1605
1606/// addGlobalName - Add a new global name to the compile unit.
1608 const DIScope *Context) {
1609 if (!hasDwarfPubSections())
1610 return;
1611 std::string FullName = getParentContextString(Context) + Name.str();
1612 GlobalNames[FullName] = &Die;
1613}
1614
1616 const DIScope *Context) {
1617 if (!hasDwarfPubSections())
1618 return;
1619 std::string FullName = getParentContextString(Context) + Name.str();
1620 // Insert, allowing the entry to remain as-is if it's already present
1621 // This way the CU-level type DIE is preferred over the "can't describe this
1622 // type as a unit offset because it's not really in the CU at all, it's only
1623 // in a type unit"
1624 GlobalNames.insert(std::make_pair(std::move(FullName), &getUnitDie()));
1625}
1626
1627/// Add a new global type to the unit.
1629 const DIScope *Context) {
1630 if (!hasDwarfPubSections())
1631 return;
1632 std::string FullName = getParentContextString(Context) + Ty->getName().str();
1633 GlobalTypes[FullName] = &Die;
1634}
1635
1637 const DIScope *Context) {
1638 if (!hasDwarfPubSections())
1639 return;
1640 std::string FullName = getParentContextString(Context) + Ty->getName().str();
1641 // Insert, allowing the entry to remain as-is if it's already present
1642 // This way the CU-level type DIE is preferred over the "can't describe this
1643 // type as a unit offset because it's not really in the CU at all, it's only
1644 // in a type unit"
1645 GlobalTypes.insert(std::make_pair(std::move(FullName), &getUnitDie()));
1646}
1647
1649 MachineLocation Location) {
1650 auto *Single = std::get_if<Loc::Single>(&DV);
1651 if (Single && Single->getExpr())
1652 addComplexAddress(Single->getExpr(), Die, dwarf::DW_AT_location, Location);
1653 else
1654 addAddress(Die, dwarf::DW_AT_location, Location);
1655}
1656
1657void DwarfCompileUnit::addLocationWithExpr(DIE &Die, dwarf::Attribute Attribute,
1658 const MachineLocation &Location,
1659 ArrayRef<uint64_t> Expr) {
1661 DIEDwarfExpression DwarfExpr(*Asm, *this, *Loc);
1662 if (Location.isIndirect())
1663 DwarfExpr.setMemoryLocationKind();
1664
1665 DIExpressionCursor Cursor(Expr);
1667 if (!DwarfExpr.addMachineRegExpression(TRI, Cursor, Location.getReg()))
1668 return;
1669 DwarfExpr.addExpression(std::move(Cursor));
1670
1671 // Now attach the location information to the DIE.
1672 addBlock(Die, Attribute, DwarfExpr.finalize());
1673
1674 if (DwarfExpr.TagOffset)
1675 addUInt(Die, dwarf::DW_AT_LLVM_tag_offset, dwarf::DW_FORM_data1,
1676 *DwarfExpr.TagOffset);
1677}
1678
1679/// Add an address attribute to a die based on the location provided.
1681 const MachineLocation &Location) {
1682 addLocationWithExpr(Die, Attribute, Location, {});
1683}
1684
1685/// Add a memory location exprloc to \p DIE with attribute \p Attribute
1686/// at \p Location + \p Offset.
1688 const MachineLocation &Location,
1689 int64_t Offset) {
1690 assert(Location.isIndirect() && "Memory loc should be indirect");
1693 addLocationWithExpr(Die, Attribute, Location, Ops);
1694}
1695
1696/// Start with the address based on the location provided, and generate the
1697/// DWARF information necessary to find the actual variable given the extra
1698/// address information encoded in the DbgVariable, starting from the starting
1699/// location. Add the DWARF information to the die.
1702 const MachineLocation &Location) {
1704 DIEDwarfExpression DwarfExpr(*Asm, *this, *Loc);
1705 DwarfExpr.addFragmentOffset(DIExpr);
1706 DwarfExpr.setLocation(Location, DIExpr);
1707
1708 DIExpressionCursor Cursor(DIExpr);
1709
1710 if (DIExpr->isEntryValue())
1711 DwarfExpr.beginEntryValueExpression(Cursor);
1712
1713 const TargetRegisterInfo &TRI = *Asm->MF->getSubtarget().getRegisterInfo();
1714 if (!DwarfExpr.addMachineRegExpression(TRI, Cursor, Location.getReg()))
1715 return;
1716 DwarfExpr.addExpression(std::move(Cursor));
1717
1718 // Now attach the location information to the DIE.
1719 addBlock(Die, Attribute, DwarfExpr.finalize());
1720
1721 if (DwarfExpr.TagOffset)
1722 addUInt(Die, dwarf::DW_AT_LLVM_tag_offset, dwarf::DW_FORM_data1,
1723 *DwarfExpr.TagOffset);
1724}
1725
1726/// Add a Dwarf loclistptr attribute data and value.
1728 unsigned Index) {
1729 dwarf::Form Form = (DD->getDwarfVersion() >= 5)
1730 ? dwarf::DW_FORM_loclistx
1731 : DD->getDwarfSectionOffsetForm();
1732 addAttribute(Die, Attribute, Form, DIELocList(Index));
1733}
1734
1736 DIE &VariableDie) {
1737 StringRef Name = Var.getName();
1738 if (!Name.empty())
1739 addString(VariableDie, dwarf::DW_AT_name, Name);
1740 const auto *DIVar = Var.getVariable();
1741 if (DIVar) {
1742 if (uint32_t AlignInBytes = DIVar->getAlignInBytes())
1743 addUInt(VariableDie, dwarf::DW_AT_alignment, dwarf::DW_FORM_udata,
1744 AlignInBytes);
1745 addAnnotation(VariableDie, DIVar->getAnnotations());
1746 }
1747
1748 addSourceLine(VariableDie, DIVar);
1749 addType(VariableDie, Var.getType());
1750 if (Var.isArtificial())
1751 addFlag(VariableDie, dwarf::DW_AT_artificial);
1752}
1753
1755 DIE &LabelDie) {
1756 StringRef Name = Label.getName();
1757 if (!Name.empty())
1758 addString(LabelDie, dwarf::DW_AT_name, Name);
1759 const auto *DILabel = Label.getLabel();
1760 addSourceLine(LabelDie, DILabel);
1761 if (DILabel->isArtificial())
1762 addFlag(LabelDie, dwarf::DW_AT_artificial);
1764 addUInt(LabelDie, dwarf::DW_AT_LLVM_coro_suspend_idx, std::nullopt,
1766}
1767
1768/// Add a Dwarf expression attribute data and value.
1770 const MCExpr *Expr) {
1771 addAttribute(Die, (dwarf::Attribute)0, Form, DIEExpr(Expr));
1772}
1773
1775 const DISubprogram *SP, DIE &SPDie) {
1776 auto *SPDecl = SP->getDeclaration();
1777 auto *Context = SPDecl ? SPDecl->getScope() : SP->getScope();
1779 addGlobalName(SP->getName(), SPDie, Context);
1780}
1781
1782bool DwarfCompileUnit::isDwoUnit() const {
1783 return DD->useSplitDwarf() && Skeleton;
1784}
1785
1786void DwarfCompileUnit::finishNonUnitTypeDIE(DIE& D, const DICompositeType *CTy) {
1787 constructTypeDIE(D, CTy);
1788}
1789
1792 (DD->useSplitDwarf() && !Skeleton);
1793}
1794
1798
1800 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
1801 MCSymbol *Label = DD->getAddressPool().getLabel();
1803 DD->getDwarfVersion() >= 5 ? dwarf::DW_AT_addr_base
1804 : dwarf::DW_AT_GNU_addr_base,
1805 Label, TLOF.getDwarfAddrSection()->getBeginSymbol());
1806}
1807
1809 addAttribute(Die, (dwarf::Attribute)0, dwarf::DW_FORM_udata,
1810 new (DIEValueAllocator) DIEBaseTypeRef(this, Idx));
1811}
1812
1814 // Insert the base_type DIEs directly after the CU so that their offsets will
1815 // fit in the fixed size ULEB128 used inside the location expressions.
1816 // Maintain order by iterating backwards and inserting to the front of CU
1817 // child list.
1818 for (auto &Btr : reverse(ExprRefedBaseTypes)) {
1819 DIE &Die = getUnitDie().addChildFront(
1820 DIE::get(DIEValueAllocator, dwarf::DW_TAG_base_type));
1821 SmallString<32> Str;
1822 addString(Die, dwarf::DW_AT_name,
1824 "_" + Twine(Btr.BitSize)).toStringRef(Str));
1825 addUInt(Die, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1, Btr.Encoding);
1826 // Round up to smallest number of bytes that contains this number of bits.
1827 // ExprRefedBaseTypes is populated with types referenced by
1828 // DW_OP_LLVM_convert operations in location expressions. These are often
1829 // byte-sized, but one common counter-example is 1-bit sized conversions
1830 // from `i1` types. TODO: Should these use DW_AT_bit_size? See
1831 // DwarfUnit::constructTypeDIE.
1832 addUInt(Die, dwarf::DW_AT_byte_size, std::nullopt,
1833 divideCeil(Btr.BitSize, 8));
1834 Btr.Die = &Die;
1835 }
1836}
1837
1839 // Assume if there is an abstract tree all the DIEs are already emitted.
1840 bool isAbstract = getAbstractScopeDIEs().count(LB->getSubprogram());
1841 if (isAbstract) {
1842 auto &DIEs = getAbstractScopeDIEs();
1843 if (auto It = DIEs.find(LB); It != DIEs.end())
1844 return It->second;
1845 }
1846 assert(!isAbstract && "Missed lexical block DIE in abstract tree!");
1847
1848 // Check if we have a concrete DIE.
1849 if (auto It = LexicalBlockDIEs.find(LB); It != LexicalBlockDIEs.end())
1850 return It->second;
1851
1852 // If nothing available found, we cannot just create a new lexical block,
1853 // because it isn't known where to put it into the DIE tree.
1854 // So, we may only try to find the most close avaiable parent DIE.
1856}
1857
1859 if (isa_and_nonnull<DILocalScope>(Context)) {
1860 if (auto *LFScope = dyn_cast<DILexicalBlockFile>(Context))
1861 Context = LFScope->getNonLexicalBlockFileScope();
1862 if (auto *LScope = dyn_cast<DILexicalBlock>(Context))
1863 return getLocalContextDIE(LScope);
1864
1865 // Otherwise the context must be a DISubprogram.
1866 auto *SPScope = cast<DISubprogram>(Context);
1867 const auto &DIEs = getAbstractScopeDIEs();
1868 if (auto It = DIEs.find(SPScope); It != DIEs.end())
1869 return It->second;
1870 }
1871 return DwarfUnit::getOrCreateContextDIE(Context);
1872}
1873
1875 const Function *F,
1876 bool Minimal) {
1877 if (!F && SP->isDefinition()) {
1878 F = DD->getLexicalScopes().getFunction(SP);
1879
1880 if (!F) {
1881 // SP may belong to another CU. Determine the CU similarly
1882 // to DwarfDebug::constructAbstractSubprogramScopeDIE.
1883 return &DD->getOrCreateAbstractSubprogramCU(SP, *this)
1884 .getOrCreateAbstractSubprogramDIE(SP);
1885 }
1886 }
1887
1888 return DwarfUnit::getOrCreateSubprogramDIE(SP, F, Minimal);
1889}
1890
1892 const DwarfDebug &DD, const DISubprogram &CalleeSP, DIE &CalleeDIE) {
1894 !CalleeSP.isDefinition() &&
1895 !CalleeDIE.findAttribute(dwarf::DW_AT_linkage_name)) {
1896 addLinkageName(CalleeDIE, CalleeSP.getLinkageName());
1897 }
1898}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock & MBB
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
BitTracker BT
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
dxil translate DXIL Translate Metadata
static SmallVector< DbgVariable *, 8 > sortLocalVars(SmallVectorImpl< DbgVariable * > &Input)
Sort local variables so that variables appearing inside of helper expressions come first.
static unsigned translateToNVVMDWARFAddrSpace(unsigned AddrSpace)
Translate NVVM IR address space code to DWARF correspondent value.
static SmallVector< const DIVariable *, 2 > dependencies(DbgVariable *Var)
Return all DIVariables that appear in count: expressions.
static cl::opt< bool > EmitFuncLineTableOffsetsOption("emit-func-debug-line-table-offsets", cl::Hidden, cl::desc("Include line table offset in function's debug info and emit end " "sequence after each function's line data."), cl::init(false))
static bool AddLinkageNamesToDeclCallOriginsForTuning(const DwarfDebug *DD)
static dwarf::Tag GetCompileUnitType(UnitKind Kind, DwarfDebug *DW)
static cl::opt< cl::boolOrDefault > AddLinkageNamesToDeclCallOrigins("add-linkage-names-to-declaration-call-origins", cl::Hidden, cl::desc("Add DW_AT_linkage_name to function declaration DIEs " "referenced by DW_AT_call_origin attributes. Enabled by default " "for -gsce debugger tuning."))
Query value using AddLinkageNamesToDeclCallOriginsForTuning.
This file contains constants used for implementing Dwarf debug support.
static bool lookup(const GsymReader &GR, DataExtractor &Data, uint64_t &Offset, uint64_t BaseAddr, uint64_t Addr, SourceLocations &SrcLocs, llvm::Error &Err)
A Lookup helper functions.
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
Register const TargetRegisterInfo * TRI
Promote Memory to Register
Definition Mem2Reg.cpp:110
#define T
NVPTX address space definition.
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
This file contains some templates that are useful if you are working with the STL at all.
This file defines the SmallString class.
The Input class is used to parse a yaml document into in-memory structs and vectors.
uint64_t getZExtValue() const
Get zero extended value.
Definition APInt.h:1555
unsigned getBitWidth() const
Return the number of bits in the APInt.
Definition APInt.h:1503
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
size_t size() const
size - Get the array size.
Definition ArrayRef.h:142
This class is intended to be used as a driving class for all asm writers.
Definition AsmPrinter.h:91
TargetMachine & TM
Target machine description.
Definition AsmPrinter.h:94
MachineFunction * MF
The current machine function.
Definition AsmPrinter.h:109
const DataLayout & getDataLayout() const
Return information about data layout.
MCSymbol * GetExternalSymbolSymbol(const Twine &Sym) const
Return the MCSymbol for the specified ExternalSymbol.
Functions, function parameters, and return types can have attributes to indicate how they should be t...
Definition Attributes.h:105
Debug common block.
DIFile * getFile() const
unsigned getLineNo() const
StringRef getName() const
DIScope * getScope() const
DIGlobalVariable * getDecl() const
static LLVM_ABI std::optional< DebugEmissionKind > getEmissionKind(StringRef Str)
A BaseTypeRef DIE.
Definition DIE.h:363
A BaseTypeRef DIE.
Definition DIE.h:244
DIEBlock - Represents a block of values.
Definition DIE.h:1056
DwarfExpression implementation for singular DW_AT_location.
An expression DIE.
Definition DIE.h:208
An integer value DIE.
Definition DIE.h:169
A label DIE.
Definition DIE.h:226
Represents a pointer to a location list in the debug_loc section.
Definition DIE.h:344
DIELoc - Represents an expression location.
Definition DIE.h:1020
DIE & getUnitDie()
Definition DIE.h:1009
A list of DIE values.
Definition DIE.h:698
A structured debug information entry.
Definition DIE.h:828
LLVM_ABI 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:944
DIE & addChildFront(DIE *Child)
Definition DIE.h:951
static DIE * get(BumpPtrAllocator &Alloc, dwarf::Tag Tag)
Definition DIE.h:858
LLVM_ABI const DIE * getUnitDie() const
Climb up the parent chain to get the compile unit or type unit DIE that this DIE belongs to.
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
LLVM_ABI bool isEntryValue() const
Check if the expression consists of exactly one entry value operand.
static LLVM_ABI void appendOffset(SmallVectorImpl< uint64_t > &Ops, int64_t Offset)
Append Ops with operations to apply the Offset.
element_iterator elements_begin() const
ArrayRef< uint64_t > getElements() const
uint64_t getElement(unsigned I) const
LLVM_ABI std::optional< SignedOrUnsignedConstant > isConstant() const
Determine whether this represents a constant value, if so.
static LLVM_ABI const DIExpression * extractAddressClass(const DIExpression *Expr, unsigned &AddrClass)
Checks if the last 4 elements of the expression are DW_OP_constu <DWARFAddress Space> DW_OP_swap DW_O...
DIDerivedType * getStaticDataMemberDeclaration() const
MDTuple * getTemplateParams() const
StringRef getLinkageName() const
StringRef getDisplayName() const
DINodeArray getAnnotations() const
An imported module (C++ using directive or similar).
bool isArtificial() const
std::optional< unsigned > getCoroSuspendIdx() const
DILocalScope * getScope() const
Debug lexical block.
A scope for locals.
LLVM_ABI DISubprogram * getSubprogram() const
Get the subprogram for this scope.
LLVM_ABI DILocalScope * getNonLexicalBlockFileScope() const
Get the first non DILexicalBlockFile scope of this scope.
Tagged DWARF-like metadata node.
LLVM_ABI dwarf::Tag getTag() const
Base class for scope-like contexts.
Subprogram description. Uses SubclassData1.
Base class for types.
uint32_t getAlignInBytes() const
DIScope * getScope() const
DIType * getType() const
StringRef getName() const
LLVM_ABI unsigned getPointerSize(unsigned AS=0) const
The pointer representation size in bytes, rounded up to a whole number of bytes.
This class is defined as the common parent of DbgVariable and DbgLabel such that it could levarage po...
Definition DwarfDebug.h: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...
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
Loc::Variant & asVariant()
To workaround P2162R0 https://github.com/cplusplus/papers/issues/873 the base class subobject needs t...
Definition DwarfDebug.h:220
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:205
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
Definition DenseMap.h:241
bool useGNUAnalogForDwarf5Feature() const
Whether to use the GNU analog for a DWARF5 tag, attribute, or location atom.
void constructCallSiteParmEntryDIEs(DIE &CallSiteDIE, SmallVector< DbgCallSiteParam, 4 > &Params)
Construct call site parameter DIEs for the CallSiteDIE.
void addLinkageNamesToDeclarations(const DwarfDebug &DD, const DISubprogram &CalleeSP, DIE &CalleeDIE)
void attachLowHighPC(DIE &D, const MCSymbol *Begin, const MCSymbol *End)
void emitHeader(bool UseOffsets) override
Emit the header for this unit, not including the initial length field.
dwarf::Tag getDwarf5OrGNUTag(dwarf::Tag Tag) const
This takes a DWARF 5 tag and returns it or a GNU analog.
void constructAbstractSubprogramScopeDIE(LexicalScope *Scope)
bool includeMinimalInlineScopes() const
DIE * getOrCreateImportedEntityDIE(const DIImportedEntity *IE)
Get or create a DIE for an imported entity.
void addBaseTypeRef(DIEValueList &Die, int64_t Idx)
void addGlobalNameForTypeUnit(StringRef Name, const DIScope *Context)
Add a new global name present in a type unit to this compile unit.
void finishEntityDefinition(const DbgEntity *Entity)
void addMemoryLocation(DIE &Die, dwarf::Attribute Attribute, const MachineLocation &Location, int64_t Offset)
Add a memory location exprloc to DIE with attribute Attribute at Location + Offset.
void addRange(RangeSpan Range)
addRange - Add an address range to the list of ranges for this unit.
void addAddrTableBase()
Add the DW_AT_addr_base attribute to the unit DIE.
std::vector< BaseTypeRef > ExprRefedBaseTypes
DIE * constructInlinedScopeDIE(LexicalScope *Scope, DIE &ParentScopeDIE)
This scope represents an inlined body of a function.
void addScopeRangeList(DIE &ScopeDIE, SmallVector< RangeSpan, 2 > Range)
A helper function to construct a RangeSpanList for a given lexical scope.
uint64_t getDWOId() const
DIE * getOrCreateCommonBlock(const DICommonBlock *CB, ArrayRef< GlobalExpr > GlobalExprs)
void addVariableAddress(const DbgVariable &DV, DIE &Die, MachineLocation Location)
Add DW_AT_location attribute for a DbgVariable based on provided MachineLocation.
DIE & constructCallSiteEntryDIE(DIE &ScopeDIE, const DISubprogram *CalleeSP, const Function *CalleeF, bool IsTail, const MCSymbol *PCAddr, const MCSymbol *CallAddr, MachineLocation CallTarget, int64_t Offset, DIType *AllocSiteTy)
Construct a call site entry DIE describing a call within Scope to a callee described by CalleeSP and ...
DIE & getOrCreateAbstractSubprogramDIE(const DISubprogram *SP)
Create an abstract subprogram DIE, that should later be populated by constructAbstractSubprogramScope...
DIE & constructSubprogramScopeDIE(const DISubprogram *Sub, const Function &F, LexicalScope *Scope, MCSymbol *LineTableSym)
Construct a DIE for this subprogram scope.
void addGlobalName(StringRef Name, const DIE &Die, const DIScope *Context) override
Add a new global name to the compile unit.
DIE & updateSubprogramScopeDIE(const DISubprogram *SP, const Function &F, MCSymbol *LineTableSym)
Find DIE for the given subprogram and attach appropriate DW_AT_low_pc, DW_AT_high_pc and DW_AT_LLVM_s...
void createAbstractEntity(const DINode *Node, LexicalScope *Scope)
void applyStmtList(DIE &D)
Apply the DW_AT_stmt_list from this compile unit to the specified DIE.
DIE * getOrCreateSubprogramDIE(const DISubprogram *SP, const Function *F, bool Minimal=false) override
DIE * getOrCreateContextDIE(const DIScope *Ty) override
Construct a DIE for a given scope.
void applyCommonDbgVariableAttributes(const DbgVariable &Var, DIE &VariableDie)
Add attributes to Var which reflect the common attributes of VariableDie, namely those which are not ...
DIE * constructVariableDIE(DbgVariable &DV, bool Abstract=false)
Construct a DIE for the given DbgVariable.
dwarf::LocationAtom getDwarf5OrGNULocationAtom(dwarf::LocationAtom Loc) const
This takes a DWARF 5 location atom and either returns it or a GNU analog.
DIE * getLocalContextDIE(const DILexicalBlock *LB)
Get DW_TAG_lexical_block for the given DILexicalBlock if available, or the most close parent DIE,...
DIE * getOrCreateGlobalVariableDIE(const DIGlobalVariable *GV, ArrayRef< GlobalExpr > GlobalExprs)
Get or create global variable DIE.
void addLocationAttribute(DIE *ToDIE, const DIGlobalVariable *GV, ArrayRef< GlobalExpr > GlobalExprs)
void applySubprogramAttributesToDefinition(const DISubprogram *SP, DIE &SPDie)
DIE * createAndAddScopeChildren(LexicalScope *Scope, DIE &ScopeDIE)
void addExpr(DIELoc &Die, dwarf::Form Form, const MCExpr *Expr)
Add a Dwarf expression attribute data and value.
DIE * getOrCreateLexicalBlockDIE(LexicalScope *Scope, DIE &ParentDIE)
Get if available or create a new DW_TAG_lexical_block for the given LexicalScope and attach DW_AT_low...
dwarf::Attribute getDwarf5OrGNUAttr(dwarf::Attribute Attr) const
This takes a DWARF 5 attribute and returns it or a GNU analog.
void addAddress(DIE &Die, dwarf::Attribute Attribute, const MachineLocation &Location)
Add an address attribute to a die based on the location provided.
void applyLabelAttributes(const DbgLabel &Label, DIE &LabelDie)
void addLocalLabelAddress(DIE &Die, dwarf::Attribute Attribute, const MCSymbol *Label)
addLocalLabelAddress - Add a dwarf label attribute data and value using DW_FORM_addr only.
void addGlobalTypeImpl(const DIType *Ty, const DIE &Die, const DIScope *Context) override
Add a new global type to the compile unit.
unsigned getOrCreateSourceID(const DIFile *File) override
Look up the source ID for the given file.
void constructScopeDIE(LexicalScope *Scope, DIE &ParentScopeDIE)
DwarfCompileUnit(unsigned UID, const DICompileUnit *Node, AsmPrinter *A, DwarfDebug *DW, DwarfFile *DWU, UnitKind Kind=UnitKind::Full)
DIE * constructLabelDIE(DbgLabel &DL, const LexicalScope &Scope)
Construct a DIE for the given DbgLabel.
void addGlobalTypeUnitType(const DIType *Ty, const DIScope *Context)
Add a new global type present in a type unit to this compile unit.
DbgEntity * getExistingAbstractEntity(const DINode *Node)
void addLabelAddress(DIE &Die, dwarf::Attribute Attribute, const MCSymbol *Label)
addLabelAddress - Add a dwarf label attribute data and value using either DW_FORM_addr or DW_FORM_GNU...
void addLocationList(DIE &Die, dwarf::Attribute Attribute, unsigned Index)
Add a Dwarf loclistptr attribute data and value.
void addComplexAddress(const DIExpression *DIExpr, DIE &Die, dwarf::Attribute Attribute, const MachineLocation &Location)
Start with the address based on the location provided, and generate the DWARF information necessary t...
DIE * constructImportedEntityDIE(const DIImportedEntity *IE)
DwarfCompileUnit & getCU() override
void attachRangesOrLowHighPC(DIE &D, SmallVector< RangeSpan, 2 > Ranges)
void finishSubprogramDefinition(const DISubprogram *SP)
Collects and handles dwarf debug information.
Definition DwarfDebug.h:351
uint16_t getDwarfVersion() const
Returns the Dwarf Version.
DwarfCompileUnit * lookupCU(const DIE *Die)
Find the matching DwarfCompileUnit for the given CU DIE.
Definition DwarfDebug.h:910
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:830
void addAccelName(const DwarfUnit &Unit, const DICompileUnit::DebugNameTableKind NameTableKind, StringRef Name, const DIE &Die)
void setLocation(const MachineLocation &Loc, const DIExpression *DIExpr)
Set the location (Loc) and DIExpression (DIExpr) to describe.
void addFragmentOffset(const DIExpression *Expr)
If applicable, emit an empty DW_OP_piece / DW_OP_bit_piece to advance to the fragment described by Ex...
std::optional< uint8_t > TagOffset
void setCallSiteParamValueFlag()
Lock this down to become a call site parameter location.
bool addMachineRegExpression(const TargetRegisterInfo &TRI, DIExpressionCursor &Expr, llvm::Register MachineReg, unsigned FragmentOffsetInBits=0)
Emit a machine register location.
void addExpression(DIExpressionCursor &&Expr)
Emit all remaining operations in the DIExpressionCursor.
void addWasmLocation(unsigned Index, uint64_t Offset)
Emit location information expressed via WebAssembly location + offset The Index is an identifier for ...
void beginEntryValueExpression(DIExpressionCursor &ExprCursor)
Begin emission of an entry value dwarf operation.
virtual DIE * getOrCreateTypeDIE(const MDNode *TyNode)
Find existing DIE or create new DIE for the given type.
DwarfDebug & getDwarfDebug() const
Definition DwarfUnit.h:113
void addAnnotation(DIE &Buffer, DINodeArray Annotations)
Add DW_TAG_LLVM_annotation.
void addBlock(DIE &Die, dwarf::Attribute Attribute, DIELoc *Loc)
Add block data.
void addTemplateParams(DIE &Buffer, DINodeArray TParams)
Add template parameters in buffer.
virtual DIE * getOrCreateContextDIE(const DIScope *Context)
Get context owner's DIE.
void addAttribute(DIEValueList &Die, dwarf::Attribute Attribute, dwarf::Form Form, T &&Value)
Definition DwarfUnit.h:85
void addOpAddress(DIELoc &Die, const MCSymbol *Sym)
Add a dwarf op address data and value using the form given and an op of either DW_FORM_addr or DW_FOR...
void addUInt(DIEValueList &Die, dwarf::Attribute Attribute, std::optional< dwarf::Form > Form, uint64_t Integer)
Add an unsigned integer attribute data and value.
void addString(DIE &Die, dwarf::Attribute Attribute, StringRef Str)
Add a string attribute data and value.
void addConstantValue(DIE &Die, const ConstantInt *CI, const DIType *Ty)
Add constant value entry in variable DIE.
DIE * getOrCreateNameSpace(const DINamespace *NS)
void insertDIE(const DINode *Desc, DIE *D)
Insert DIE into the map.
void addSectionDelta(DIE &Die, dwarf::Attribute Attribute, const MCSymbol *Hi, const MCSymbol *Lo)
addSectionDelta - Add a label delta attribute data and value.
bool shouldPlaceInUnitDIE(const DISubprogram *SP, bool Minimal)
Definition DwarfUnit.h:352
DwarfDebug * DD
Definition DwarfUnit.h:56
const DICompileUnit * CUNode
MDNode for the compile unit.
Definition DwarfUnit.h:41
virtual DIE * getOrCreateSubprogramDIE(const DISubprogram *SP, const Function *FnHint, bool Minimal=false)
DIE * getOrCreateSubprogramContextDIE(const DISubprogram *SP, bool IgnoreScope)
Definition DwarfUnit.h:357
DIE * getDIE(const DINode *D) const
Returns the DIE map slot for the specified debug variable.
MCSymbol * LabelBegin
The start of the unit within its section.
Definition DwarfUnit.h:50
void addSInt(DIEValueList &Die, dwarf::Attribute Attribute, std::optional< dwarf::Form > Form, int64_t Integer)
Add an signed integer attribute data and value.
DwarfUnit(dwarf::Tag, const DICompileUnit *Node, AsmPrinter *A, DwarfDebug *DW, DwarfFile *DWU, unsigned UniqueID=0)
Definition DwarfUnit.cpp:82
void addLabelDelta(DIEValueList &Die, dwarf::Attribute Attribute, const MCSymbol *Hi, const MCSymbol *Lo)
Add a label delta attribute data and value.
void addLinkageName(DIE &Die, StringRef LinkageName)
Add a linkage name, if it isn't empty.
std::string getParentContextString(const DIScope *Context) const
Get string containing language specific context for a global name.
void addSourceLine(DIE &Die, unsigned Line, unsigned Column, const DIFile *File)
Add location information to specified debug information entry.
void emitCommonHeader(bool UseOffsets, dwarf::UnitType UT)
Emit the common part of the header for this unit.
BumpPtrAllocator DIEValueAllocator
Definition DwarfUnit.h:44
DIE * getOrCreateModule(const DIModule *M)
const DICompileUnit * getCUNode() const
Definition DwarfUnit.h:112
DIE & createAndAddDIE(dwarf::Tag Tag, DIE &Parent, const DINode *N=nullptr)
Create a DIE with the given Tag, add the DIE to its parent, and call insertDIE if MD is not null.
DwarfFile * DU
Definition DwarfUnit.h:57
DIE * getOrCreateStaticMemberDIE(const DIDerivedType *DT)
Create new static data member DIE.
void addLabel(DIEValueList &Die, dwarf::Attribute Attribute, dwarf::Form Form, const MCSymbol *Label)
Add a Dwarf label attribute data and value.
void addConstantFPValue(DIE &Die, const ConstantFP *CFP)
Add constant value entry in variable DIE.
void addSectionLabel(DIE &Die, dwarf::Attribute Attribute, const MCSymbol *Label, const MCSymbol *Sec)
Add a Dwarf section label attribute data and value.
void addPoolOpAddress(DIEValueList &Die, const MCSymbol *Label)
void constructTypeDIE(DIE &Buffer, const DICompositeType *CTy)
MCSymbol * EndLabel
Emitted at the end of the CU and used to compute the CU Length field.
Definition DwarfUnit.h:53
void addFlag(DIE &Die, dwarf::Attribute Attribute)
Add a flag that is true to the DIE.
AsmPrinter * Asm
Target of Dwarf emission.
Definition DwarfUnit.h:47
unsigned getUniqueID() const
Gets Unique ID for this unit.
Definition DwarfUnit.h:102
void addType(DIE &Entity, const DIType *Ty, dwarf::Attribute Attribute=dwarf::DW_AT_type)
Add a new type attribute to the specified entity.
void applySubprogramAttributes(const DISubprogram *SP, DIE &SPDie, bool SkipSPAttributes=false)
void addDIEEntry(DIE &Die, dwarf::Attribute Attribute, DIE &Entry)
Add a DIE attribute data and value.
This class is used to track scope information.
Multi-value location description.
Definition DwarfDebug.h: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
Base class for the full range of assembler expressions which are needed for parsing.
Definition MCExpr.h:34
MCSection * getDwarfRangesSection() const
MCSection * getDwarfAddrSection() const
MCSection * getDwarfLineSection() const
MCSymbol * getBeginSymbol()
Definition MCSection.h:589
void setType(wasm::WasmSymbolType type)
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
Definition MCSymbol.h:42
bool isDefined() const
isDefined - Check if this symbol is defined (i.e., it has an address).
Definition MCSymbol.h:233
Tuple of metadata.
Definition Metadata.h:1500
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
unsigned getReg() const
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:67
StringRef getName() const
Get a short "name" for the module.
Definition Module.h:269
Wrapper class representing virtual and physical registers.
Definition Register.h:20
static constexpr bool isPhysicalRegister(unsigned Reg)
Return true if the specified register number is in the physical register namespace.
Definition Register.h:60
Implements a dense probed hash-table based set with some number of buckets stored inline.
Definition DenseSet.h:291
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
Definition SmallString.h:26
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StringRef - Represent a constant reference to a string, i.e.
Definition StringRef.h:55
constexpr bool empty() const
empty - Check if the string is empty.
Definition StringRef.h:140
Information about stack frame layout on the target.
virtual DwarfFrameBase getDwarfFrameBase(const MachineFunction &MF) const
Return the frame base information to be encoded in the DWARF subprogram debug info.
virtual StackOffset getFrameIndexReference(const MachineFunction &MF, int FI, Register &FrameReg) const
getFrameIndexReference - This method should return the base register and offset used to reference a f...
const Triple & getTargetTriple() const
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
virtual const TargetRegisterInfo * getRegisterInfo() const =0
Return the target's register information.
bool isNVPTX() const
Tests whether the target is NVPTX (32- or 64-bit).
Definition Triple.h:942
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition Twine.h:82
StringRef toStringRef(SmallVectorImpl< char > &Out) const
This returns the twine as a single StringRef if it can be represented as such.
Definition Twine.h:461
std::pair< iterator, bool > insert(const ValueT &V)
Definition DenseSet.h:202
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:180
A DeclContext is a named program scope that is used for ODR uniquing of types.
bool tuneForSCE() const
Definition DwarfDebug.h:935
bool tuneForGDB() const
Definition DwarfDebug.h:933
LLVM_ABI 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:862
initializer< Ty > init(const Ty &Val)
@ DW_INL_inlined
Definition Dwarf.h:777
Attribute
Attributes.
Definition Dwarf.h:125
UnitType
Constants for unit types in DWARF v5.
Definition Dwarf.h:896
@ WASM_TYPE_I64
Definition Wasm.h:57
@ WASM_TYPE_I32
Definition Wasm.h:56
@ WASM_SYMBOL_TYPE_GLOBAL
Definition Wasm.h:222
This is an optimization pass for GlobalISel generic memory operations.
Definition Types.h:26
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
auto dyn_cast_if_present(const Y &Val)
dyn_cast_if_present<X> - Functionally identical to dyn_cast, except that a null (or none in the case ...
Definition Casting.h:732
bool isRangeRelaxable(const MCSymbol *Begin, const MCSymbol *End)
Definition MCSymbol.cpp:94
bool isa_and_nonnull(const Y &Val)
Definition Casting.h:676
std::pair< const MachineInstr *, const MachineInstr * > InsnRange
This is used to track range of instructions with identical lexical scope.
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1746
auto reverse(ContainerTy &&C)
Definition STLExtras.h:408
@ Apple
.apple_names, .apple_namespaces, .apple_types, .apple_objc.
Definition DwarfDebug.h:346
FunctionAddr VTableAddr Count
Definition InstrProf.h:139
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:547
@ Global
Append to llvm.global_dtors.
constexpr T divideCeil(U Numerator, V Denominator)
Returns the integer ceil(Numerator / Denominator).
Definition MathExtras.h:394
@ Sub
Subtraction of integers.
auto count(R &&Range, const E &Element)
Wrapper function around std::count to count the number of times an element Element occurs in the give...
Definition STLExtras.h:2012
DWARFExpression::Operation Op
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
LLVM_ABI DISubprogram * getDISubprogram(const MDNode *Scope)
Find subprogram that is enclosing this scope.
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.
const MCSymbol * End
Definition DwarfFile.h:41
const MCSymbol * Begin
Definition DwarfFile.h:40
Helper used to pair up a symbol and its DWARF compile unit.
Definition DwarfDebug.h:335
union llvm::TargetFrameLowering::DwarfFrameBase::@004076321055032247336074224075335064105264310375 Location
enum llvm::TargetFrameLowering::DwarfFrameBase::FrameBaseKind Kind