LLVM 22.0.0git
DwarfDebug.cpp
Go to the documentation of this file.
1//===- llvm/CodeGen/DwarfDebug.cpp - Dwarf Debug Framework ----------------===//
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 writing dwarf debug info into asm files.
10//
11//===----------------------------------------------------------------------===//
12
13#include "DwarfDebug.h"
14#include "ByteStreamer.h"
15#include "DIEHash.h"
16#include "DwarfCompileUnit.h"
17#include "DwarfExpression.h"
18#include "DwarfUnit.h"
19#include "llvm/ADT/APInt.h"
20#include "llvm/ADT/Statistic.h"
22#include "llvm/ADT/Twine.h"
24#include "llvm/CodeGen/DIE.h"
36#include "llvm/IR/Constants.h"
38#include "llvm/IR/Function.h"
40#include "llvm/IR/Module.h"
41#include "llvm/MC/MCAsmInfo.h"
42#include "llvm/MC/MCContext.h"
43#include "llvm/MC/MCSection.h"
44#include "llvm/MC/MCStreamer.h"
45#include "llvm/MC/MCSymbol.h"
50#include "llvm/Support/Debug.h"
52#include "llvm/Support/MD5.h"
57#include <cstddef>
58#include <iterator>
59#include <optional>
60#include <string>
61
62using namespace llvm;
63
64#define DEBUG_TYPE "dwarfdebug"
65
66STATISTIC(NumCSParams, "Number of dbg call site params created");
67
69 "use-dwarf-ranges-base-address-specifier", cl::Hidden,
70 cl::desc("Use base address specifiers in debug_ranges"), cl::init(false));
71
72static cl::opt<bool> GenerateARangeSection("generate-arange-section",
74 cl::desc("Generate dwarf aranges"),
75 cl::init(false));
76
77static cl::opt<bool>
78 GenerateDwarfTypeUnits("generate-type-units", cl::Hidden,
79 cl::desc("Generate DWARF4 type units."),
80 cl::init(false));
81
83 "split-dwarf-cross-cu-references", cl::Hidden,
84 cl::desc("Enable cross-cu references in DWO files"), cl::init(false));
85
87
89 "use-unknown-locations", cl::Hidden,
90 cl::desc("Make an absence of debug location information explicit."),
91 cl::values(clEnumVal(Default, "At top of block or after label"),
92 clEnumVal(Enable, "In all cases"), clEnumVal(Disable, "Never")),
94
96 "accel-tables", cl::Hidden, cl::desc("Output dwarf accelerator tables."),
98 "Default for platform"),
99 clEnumValN(AccelTableKind::None, "Disable", "Disabled."),
100 clEnumValN(AccelTableKind::Apple, "Apple", "Apple"),
101 clEnumValN(AccelTableKind::Dwarf, "Dwarf", "DWARF")),
103
105DwarfInlinedStrings("dwarf-inlined-strings", cl::Hidden,
106 cl::desc("Use inlined strings rather than string section."),
107 cl::values(clEnumVal(Default, "Default for platform"),
108 clEnumVal(Enable, "Enabled"),
109 clEnumVal(Disable, "Disabled")),
111
112static cl::opt<bool>
113 NoDwarfRangesSection("no-dwarf-ranges-section", cl::Hidden,
114 cl::desc("Disable emission .debug_ranges section."),
115 cl::init(false));
116
118 "dwarf-sections-as-references", cl::Hidden,
119 cl::desc("Use sections+offset as references rather than labels."),
120 cl::values(clEnumVal(Default, "Default for platform"),
121 clEnumVal(Enable, "Enabled"), clEnumVal(Disable, "Disabled")),
123
124static cl::opt<bool>
125 UseGNUDebugMacro("use-gnu-debug-macro", cl::Hidden,
126 cl::desc("Emit the GNU .debug_macro format with DWARF <5"),
127 cl::init(false));
128
130 "dwarf-op-convert", cl::Hidden,
131 cl::desc("Enable use of the DWARFv5 DW_OP_convert operator"),
132 cl::values(clEnumVal(Default, "Default for platform"),
133 clEnumVal(Enable, "Enabled"), clEnumVal(Disable, "Disabled")),
135
141
143 DwarfLinkageNames("dwarf-linkage-names", cl::Hidden,
144 cl::desc("Which DWARF linkage-name attributes to emit."),
146 "Default for platform"),
147 clEnumValN(AllLinkageNames, "All", "All"),
149 "Abstract subprograms")),
151
153 "minimize-addr-in-v5", cl::Hidden,
154 cl::desc("Always use DW_AT_ranges in DWARFv5 whenever it could allow more "
155 "address pool entry sharing to reduce relocations/object size"),
157 "Default address minimization strategy"),
159 "Use rnglists for contiguous ranges if that allows "
160 "using a pre-existing base address"),
162 "Expressions",
163 "Use exprloc addrx+offset expressions for any "
164 "address with a prior base address"),
166 "Use addrx+offset extension form for any address "
167 "with a prior base address"),
169 "Stuff")),
171
172/// Set to false to ignore Key Instructions metadata.
174 "dwarf-use-key-instructions", cl::Hidden, cl::init(true),
175 cl::desc("Set to false to ignore Key Instructions metadata"));
176
177static constexpr unsigned ULEB128PadSize = 4;
178
179void DebugLocDwarfExpression::emitOp(uint8_t Op, const char *Comment) {
180 getActiveStreamer().emitInt8(
181 Op, Comment ? Twine(Comment) + " " + dwarf::OperationEncodingString(Op)
183}
184
185void DebugLocDwarfExpression::emitSigned(int64_t Value) {
186 getActiveStreamer().emitSLEB128(Value, Twine(Value));
187}
188
189void DebugLocDwarfExpression::emitUnsigned(uint64_t Value) {
190 getActiveStreamer().emitULEB128(Value, Twine(Value));
191}
192
193void DebugLocDwarfExpression::emitData1(uint8_t Value) {
194 getActiveStreamer().emitInt8(Value, Twine(Value));
195}
196
197void DebugLocDwarfExpression::emitBaseTypeRef(uint64_t Idx) {
198 assert(Idx < (1ULL << (ULEB128PadSize * 7)) && "Idx wont fit");
199 getActiveStreamer().emitULEB128(Idx, Twine(Idx), ULEB128PadSize);
200}
201
202bool DebugLocDwarfExpression::isFrameRegister(const TargetRegisterInfo &TRI,
203 llvm::Register MachineReg) {
204 // This information is not available while emitting .debug_loc entries.
205 return false;
206}
207
209 assert(!IsBuffering && "Already buffering?");
210 if (!TmpBuf)
211 TmpBuf = std::make_unique<TempBuffer>(OutBS.GenerateComments);
212 IsBuffering = true;
213}
214
215void DebugLocDwarfExpression::disableTemporaryBuffer() { IsBuffering = false; }
216
218 return TmpBuf ? TmpBuf->Bytes.size() : 0;
219}
220
222 if (!TmpBuf)
223 return;
224 for (auto Byte : enumerate(TmpBuf->Bytes)) {
225 const char *Comment = (Byte.index() < TmpBuf->Comments.size())
226 ? TmpBuf->Comments[Byte.index()].c_str()
227 : "";
228 OutBS.emitInt8(Byte.value(), Comment);
229 }
230 TmpBuf->Bytes.clear();
231 TmpBuf->Comments.clear();
232}
233
235 return getVariable()->getType();
236}
237
238/// Get .debug_loc entry for the instruction range starting at MI.
240 const DIExpression *Expr = MI->getDebugExpression();
241 auto SingleLocExprOpt = DIExpression::convertToNonVariadicExpression(Expr);
242 const bool IsVariadic = !SingleLocExprOpt;
243 // If we have a variadic debug value instruction that is equivalent to a
244 // non-variadic instruction, then convert it to non-variadic form here.
245 if (!IsVariadic && !MI->isNonListDebugValue()) {
246 assert(MI->getNumDebugOperands() == 1 &&
247 "Mismatched DIExpression and debug operands for debug instruction.");
248 Expr = *SingleLocExprOpt;
249 }
250 assert(MI->getNumOperands() >= 3);
251 SmallVector<DbgValueLocEntry, 4> DbgValueLocEntries;
252 for (const MachineOperand &Op : MI->debug_operands()) {
253 if (Op.isReg()) {
254 MachineLocation MLoc(Op.getReg(),
255 MI->isNonListDebugValue() && MI->isDebugOffsetImm());
256 DbgValueLocEntries.push_back(DbgValueLocEntry(MLoc));
257 } else if (Op.isTargetIndex()) {
258 DbgValueLocEntries.push_back(
259 DbgValueLocEntry(TargetIndexLocation(Op.getIndex(), Op.getOffset())));
260 } else if (Op.isImm())
261 DbgValueLocEntries.push_back(DbgValueLocEntry(Op.getImm()));
262 else if (Op.isFPImm())
263 DbgValueLocEntries.push_back(DbgValueLocEntry(Op.getFPImm()));
264 else if (Op.isCImm())
265 DbgValueLocEntries.push_back(DbgValueLocEntry(Op.getCImm()));
266 else
267 llvm_unreachable("Unexpected debug operand in DBG_VALUE* instruction!");
268 }
269 return DbgValueLoc(Expr, DbgValueLocEntries, IsVariadic);
270}
271
273 std::optional<DIExpression::FragmentInfo> Fragment = Expr.getFragmentInfo();
274 return Fragment ? Fragment->OffsetInBits : 0;
275}
276
278 return getFragmentOffsetInBits(*LHS.Expr) <
280}
281
284}
285
287 : ValueLoc(std::make_unique<DbgValueLoc>(ValueLoc)),
288 Expr(ValueLoc.getExpression()) {
289 if (!Expr->getNumElements())
290 Expr = nullptr;
291}
292
295
296const std::set<FrameIndexExpr> &Loc::MMI::getFrameIndexExprs() const {
297 return FrameIndexExprs;
298}
299
300void Loc::MMI::addFrameIndexExpr(const DIExpression *Expr, int FI) {
301 FrameIndexExprs.insert({FI, Expr});
302 assert((FrameIndexExprs.size() == 1 ||
304 [](const FrameIndexExpr &FIE) {
305 return FIE.Expr && FIE.Expr->isFragment();
306 })) &&
307 "conflicting locations for variable");
308}
309
310static AccelTableKind computeAccelTableKind(unsigned DwarfVersion,
311 bool GenerateTypeUnits,
312 DebuggerKind Tuning,
313 const Triple &TT) {
314 // Honor an explicit request.
316 return AccelTables;
317
318 // Generating DWARF5 acceleration table.
319 // Currently Split dwarf and non ELF format is not supported.
320 if (GenerateTypeUnits && (DwarfVersion < 5 || !TT.isOSBinFormatELF()))
322
323 // Accelerator tables get emitted if targetting DWARF v5 or LLDB. DWARF v5
324 // always implies debug_names. For lower standard versions we use apple
325 // accelerator tables on apple platforms and debug_names elsewhere.
326 if (DwarfVersion >= 5)
328 if (Tuning == DebuggerKind::LLDB)
329 return TT.isOSBinFormatMachO() ? AccelTableKind::Apple
332}
333
335 : DebugHandlerBase(A), DebugLocs(A->OutStreamer->isVerboseAsm()),
336 InfoHolder(A, "info_string", DIEValueAllocator),
337 SkeletonHolder(A, "skel_string", DIEValueAllocator),
338 IsDarwin(A->TM.getTargetTriple().isOSDarwin()) {
339 const Triple &TT = Asm->TM.getTargetTriple();
340
341 // Make sure we know our "debugger tuning". The target option takes
342 // precedence; fall back to triple-based defaults.
343 if (Asm->TM.Options.DebuggerTuning != DebuggerKind::Default)
344 DebuggerTuning = Asm->TM.Options.DebuggerTuning;
345 else if (IsDarwin)
346 DebuggerTuning = DebuggerKind::LLDB;
347 else if (TT.isPS())
348 DebuggerTuning = DebuggerKind::SCE;
349 else if (TT.isOSAIX())
350 DebuggerTuning = DebuggerKind::DBX;
351 else
352 DebuggerTuning = DebuggerKind::GDB;
353
355 UseInlineStrings = TT.isNVPTX() || tuneForDBX();
356 else
357 UseInlineStrings = DwarfInlinedStrings == Enable;
358
359 // Always emit .debug_aranges for SCE tuning.
360 UseARangesSection = GenerateARangeSection || tuneForSCE();
361
362 HasAppleExtensionAttributes = tuneForLLDB();
363
364 // Handle split DWARF.
365 HasSplitDwarf = !Asm->TM.Options.MCOptions.SplitDwarfFile.empty();
366
367 // SCE defaults to linkage names only for abstract subprograms.
369 UseAllLinkageNames = !tuneForSCE();
370 else
371 UseAllLinkageNames = DwarfLinkageNames == AllLinkageNames;
372
373 unsigned DwarfVersionNumber = Asm->TM.Options.MCOptions.DwarfVersion;
374 unsigned DwarfVersion = DwarfVersionNumber ? DwarfVersionNumber
375 : MMI->getModule()->getDwarfVersion();
376 // Use dwarf 4 by default if nothing is requested. For NVPTX, use dwarf 2.
377 DwarfVersion =
378 TT.isNVPTX() ? 2 : (DwarfVersion ? DwarfVersion : dwarf::DWARF_VERSION);
379
380 bool Dwarf64 = DwarfVersion >= 3 && // DWARF64 was introduced in DWARFv3.
381 TT.isArch64Bit(); // DWARF64 requires 64-bit relocations.
382
383 // Support DWARF64
384 // 1: For ELF when requested.
385 // 2: For XCOFF64: the AIX assembler will fill in debug section lengths
386 // according to the DWARF64 format for 64-bit assembly, so we must use
387 // DWARF64 in the compiler too for 64-bit mode.
388 Dwarf64 &=
389 ((Asm->TM.Options.MCOptions.Dwarf64 || MMI->getModule()->isDwarf64()) &&
390 TT.isOSBinFormatELF()) ||
391 TT.isOSBinFormatXCOFF();
392
393 if (!Dwarf64 && TT.isArch64Bit() && TT.isOSBinFormatXCOFF())
394 report_fatal_error("XCOFF requires DWARF64 for 64-bit mode!");
395
396 UseRangesSection = !NoDwarfRangesSection && !TT.isNVPTX();
397
398 // Use sections as references. Force for NVPTX.
400 UseSectionsAsReferences = TT.isNVPTX();
401 else
402 UseSectionsAsReferences = DwarfSectionsAsReferences == Enable;
403
404 // Don't generate type units for unsupported object file formats.
405 GenerateTypeUnits = (A->TM.getTargetTriple().isOSBinFormatELF() ||
406 A->TM.getTargetTriple().isOSBinFormatWasm()) &&
408
409 TheAccelTableKind = computeAccelTableKind(
410 DwarfVersion, GenerateTypeUnits, DebuggerTuning, A->TM.getTargetTriple());
411
412 // Work around a GDB bug. GDB doesn't support the standard opcode;
413 // SCE doesn't support GNU's; LLDB prefers the standard opcode, which
414 // is defined as of DWARF 3.
415 // See GDB bug 11616 - DW_OP_form_tls_address is unimplemented
416 // https://sourceware.org/bugzilla/show_bug.cgi?id=11616
417 UseGNUTLSOpcode = tuneForGDB() || DwarfVersion < 3;
418
419 UseDWARF2Bitfields = DwarfVersion < 4;
420
421 // The DWARF v5 string offsets table has - possibly shared - contributions
422 // from each compile and type unit each preceded by a header. The string
423 // offsets table used by the pre-DWARF v5 split-DWARF implementation uses
424 // a monolithic string offsets table without any header.
425 UseSegmentedStringOffsetsTable = DwarfVersion >= 5;
426
427 // Emit call-site-param debug info for GDB and LLDB, if the target supports
428 // the debug entry values feature. It can also be enabled explicitly.
429 EmitDebugEntryValues = Asm->TM.Options.ShouldEmitDebugEntryValues();
430
431 // It is unclear if the GCC .debug_macro extension is well-specified
432 // for split DWARF. For now, do not allow LLVM to emit it.
433 UseDebugMacroSection =
434 DwarfVersion >= 5 || (UseGNUDebugMacro && !useSplitDwarf());
435 if (DwarfOpConvert == Default)
436 EnableOpConvert = !((tuneForGDB() && useSplitDwarf()) || (tuneForLLDB() && !TT.isOSBinFormatMachO()));
437 else
438 EnableOpConvert = (DwarfOpConvert == Enable);
439
440 // Split DWARF would benefit object size significantly by trading reductions
441 // in address pool usage for slightly increased range list encodings.
442 if (DwarfVersion >= 5)
443 MinimizeAddr = MinimizeAddrInV5Option;
444
445 Asm->OutStreamer->getContext().setDwarfVersion(DwarfVersion);
446 Asm->OutStreamer->getContext().setDwarfFormat(Dwarf64 ? dwarf::DWARF64
448}
449
450// Define out of line so we don't have to include DwarfUnit.h in DwarfDebug.h.
451DwarfDebug::~DwarfDebug() = default;
452
453static bool isObjCClass(StringRef Name) {
454 return Name.starts_with("+") || Name.starts_with("-");
455}
456
457static bool hasObjCCategory(StringRef Name) {
458 if (!isObjCClass(Name))
459 return false;
460
461 return Name.contains(") ");
462}
463
465 StringRef &Category) {
466 if (!hasObjCCategory(In)) {
467 Class = In.slice(In.find('[') + 1, In.find(' '));
468 Category = "";
469 return;
470 }
471
472 Class = In.slice(In.find('[') + 1, In.find('('));
473 Category = In.slice(In.find('[') + 1, In.find(' '));
474}
475
477 return In.slice(In.find(' ') + 1, In.find(']'));
478}
479
480// Add the various names to the Dwarf accelerator table names.
482 const DwarfUnit &Unit,
483 const DICompileUnit::DebugNameTableKind NameTableKind,
484 const DISubprogram *SP, DIE &Die) {
488 return;
489
490 if (!SP->isDefinition())
491 return;
492
493 if (SP->getName() != "")
494 addAccelName(Unit, NameTableKind, SP->getName(), Die);
495
496 // We drop the mangling escape prefix when emitting the DW_AT_linkage_name. So
497 // ensure we don't include it when inserting into the accelerator tables.
499 GlobalValue::dropLLVMManglingEscape(SP->getLinkageName());
500
501 // If the linkage name is different than the name, go ahead and output that as
502 // well into the name table. Only do that if we are going to actually emit
503 // that name.
504 if (LinkageName != "" && SP->getName() != LinkageName &&
505 (useAllLinkageNames() || InfoHolder.getAbstractScopeDIEs().lookup(SP)))
506 addAccelName(Unit, NameTableKind, LinkageName, Die);
507
508 // If this is an Objective-C selector name add it to the ObjC accelerator
509 // too.
510 if (isObjCClass(SP->getName())) {
511 StringRef Class, Category;
512 getObjCClassCategory(SP->getName(), Class, Category);
513 addAccelObjC(Unit, NameTableKind, Class, Die);
514 if (Category != "")
515 addAccelObjC(Unit, NameTableKind, Category, Die);
516 // Also add the base method name to the name table.
517 addAccelName(Unit, NameTableKind, getObjCMethodName(SP->getName()), Die);
518 }
519}
520
521/// Check whether we should create a DIE for the given Scope, return true
522/// if we don't create a DIE (the corresponding DIE is null).
524 if (Scope->isAbstractScope())
525 return false;
526
527 // We don't create a DIE if there is no Range.
528 const SmallVectorImpl<InsnRange> &Ranges = Scope->getRanges();
529 if (Ranges.empty())
530 return true;
531
532 if (Ranges.size() > 1)
533 return false;
534
535 // We don't create a DIE if we have a single Range and the end label
536 // is null.
537 return !getLabelAfterInsn(Ranges.front().second);
538}
539
540template <typename Func> static void forBothCUs(DwarfCompileUnit &CU, Func F) {
541 F(CU);
542 if (auto *SkelCU = CU.getSkeleton())
543 if (CU.getCUNode()->getSplitDebugInlining())
544 F(*SkelCU);
545}
546
550
553 DwarfCompileUnit &SrcCU) {
554 auto &CU = getOrCreateDwarfCompileUnit(SP->getUnit());
555 if (CU.getSkeleton())
556 return shareAcrossDWOCUs() ? CU : SrcCU;
557
558 return CU;
559}
560
561void DwarfDebug::constructAbstractSubprogramScopeDIE(DwarfCompileUnit &SrcCU,
562 LexicalScope *Scope) {
563 assert(Scope && Scope->getScopeNode());
564 assert(Scope->isAbstractScope());
565 assert(!Scope->getInlinedAt());
566
567 auto *SP = cast<DISubprogram>(Scope->getScopeNode());
568
569 // Find the subprogram's DwarfCompileUnit in the SPMap in case the subprogram
570 // was inlined from another compile unit.
571 auto &CU = getOrCreateDwarfCompileUnit(SP->getUnit());
572 auto &TargetCU = getOrCreateAbstractSubprogramCU(SP, SrcCU);
573 TargetCU.constructAbstractSubprogramScopeDIE(Scope);
574 if (auto *SkelCU = CU.getSkeleton())
575 if (CU.getCUNode()->getSplitDebugInlining())
576 SkelCU->constructAbstractSubprogramScopeDIE(Scope);
577}
578
579/// Represents a parameter whose call site value can be described by applying a
580/// debug expression to a register in the forwarded register worklist.
582 /// The described parameter register.
584
585 /// Debug expression that has been built up when walking through the
586 /// instruction chain that produces the parameter's value.
588};
589
590/// Register worklist for finding call site values.
592/// Container for the set of registers known to be clobbered on the path to a
593/// call site.
595
596/// Append the expression \p Addition to \p Original and return the result.
597static const DIExpression *combineDIExpressions(const DIExpression *Original,
598 const DIExpression *Addition) {
599 std::vector<uint64_t> Elts = Addition->getElements().vec();
600 // Avoid multiple DW_OP_stack_values.
601 if (Original->isImplicit() && Addition->isImplicit())
602 llvm::erase(Elts, dwarf::DW_OP_stack_value);
603 const DIExpression *CombinedExpr =
604 (Elts.size() > 0) ? DIExpression::append(Original, Elts) : Original;
605 return CombinedExpr;
606}
607
608/// Emit call site parameter entries that are described by the given value and
609/// debug expression.
610template <typename ValT>
611static void finishCallSiteParams(ValT Val, const DIExpression *Expr,
612 ArrayRef<FwdRegParamInfo> DescribedParams,
613 ParamSet &Params) {
614 for (auto Param : DescribedParams) {
615 bool ShouldCombineExpressions = Expr && Param.Expr->getNumElements() > 0;
616
617 // TODO: Entry value operations can currently not be combined with any
618 // other expressions, so we can't emit call site entries in those cases.
619 if (ShouldCombineExpressions && Expr->isEntryValue())
620 continue;
621
622 // If a parameter's call site value is produced by a chain of
623 // instructions we may have already created an expression for the
624 // parameter when walking through the instructions. Append that to the
625 // base expression.
626 const DIExpression *CombinedExpr =
627 ShouldCombineExpressions ? combineDIExpressions(Expr, Param.Expr)
628 : Expr;
629 assert((!CombinedExpr || CombinedExpr->isValid()) &&
630 "Combined debug expression is invalid");
631
632 DbgValueLoc DbgLocVal(CombinedExpr, DbgValueLocEntry(Val));
633 DbgCallSiteParam CSParm(Param.ParamReg, DbgLocVal);
634 Params.push_back(CSParm);
635 ++NumCSParams;
636 }
637}
638
639/// Add \p Reg to the worklist, if it's not already present, and mark that the
640/// given parameter registers' values can (potentially) be described using
641/// that register and an debug expression.
642static void addToFwdRegWorklist(FwdRegWorklist &Worklist, unsigned Reg,
643 const DIExpression *Expr,
644 ArrayRef<FwdRegParamInfo> ParamsToAdd) {
645 auto &ParamsForFwdReg = Worklist[Reg];
646 for (auto Param : ParamsToAdd) {
647 assert(none_of(ParamsForFwdReg,
648 [Param](const FwdRegParamInfo &D) {
649 return D.ParamReg == Param.ParamReg;
650 }) &&
651 "Same parameter described twice by forwarding reg");
652
653 // If a parameter's call site value is produced by a chain of
654 // instructions we may have already created an expression for the
655 // parameter when walking through the instructions. Append that to the
656 // new expression.
657 const DIExpression *CombinedExpr = combineDIExpressions(Expr, Param.Expr);
658 ParamsForFwdReg.push_back({Param.ParamReg, CombinedExpr});
659 }
660}
661
662/// Interpret values loaded into registers by \p CurMI.
663static void interpretValues(const MachineInstr *CurMI,
664 FwdRegWorklist &ForwardedRegWorklist,
665 ParamSet &Params,
666 ClobberedRegSet &ClobberedRegUnits) {
667
668 const MachineFunction *MF = CurMI->getMF();
669 const DIExpression *EmptyExpr =
671 const auto &TRI = *MF->getSubtarget().getRegisterInfo();
672 const auto &TII = *MF->getSubtarget().getInstrInfo();
673 const auto &TLI = *MF->getSubtarget().getTargetLowering();
674
675 // If an instruction defines more than one item in the worklist, we may run
676 // into situations where a worklist register's value is (potentially)
677 // described by the previous value of another register that is also defined
678 // by that instruction.
679 //
680 // This can for example occur in cases like this:
681 //
682 // $r1 = mov 123
683 // $r0, $r1 = mvrr $r1, 456
684 // call @foo, $r0, $r1
685 //
686 // When describing $r1's value for the mvrr instruction, we need to make sure
687 // that we don't finalize an entry value for $r0, as that is dependent on the
688 // previous value of $r1 (123 rather than 456).
689 //
690 // In order to not have to distinguish between those cases when finalizing
691 // entry values, we simply postpone adding new parameter registers to the
692 // worklist, by first keeping them in this temporary container until the
693 // instruction has been handled.
694 FwdRegWorklist TmpWorklistItems;
695
696 // If the MI is an instruction defining one or more parameters' forwarding
697 // registers, add those defines.
698 ClobberedRegSet NewClobberedRegUnits;
699 auto getForwardingRegsDefinedByMI = [&](const MachineInstr &MI,
701 if (MI.isDebugInstr())
702 return;
703
704 for (const MachineOperand &MO : MI.all_defs()) {
705 if (MO.getReg().isPhysical()) {
706 for (auto &FwdReg : ForwardedRegWorklist)
707 if (TRI.regsOverlap(FwdReg.first, MO.getReg()))
708 Defs.insert(FwdReg.first);
709 NewClobberedRegUnits.insert_range(TRI.regunits(MO.getReg()));
710 }
711 }
712 };
713
714 // Set of worklist registers that are defined by this instruction.
716
717 getForwardingRegsDefinedByMI(*CurMI, FwdRegDefs);
718 if (FwdRegDefs.empty()) {
719 // Any definitions by this instruction will clobber earlier reg movements.
720 ClobberedRegUnits.insert_range(NewClobberedRegUnits);
721 return;
722 }
723
724 // It's possible that we find a copy from a non-volatile register to the param
725 // register, which is clobbered in the meantime. Test for clobbered reg unit
726 // overlaps before completing.
727 auto IsRegClobberedInMeantime = [&](Register Reg) -> bool {
728 for (auto &RegUnit : ClobberedRegUnits)
729 if (TRI.hasRegUnit(Reg, RegUnit))
730 return true;
731 return false;
732 };
733
734 for (auto ParamFwdReg : FwdRegDefs) {
735 if (auto ParamValue = TII.describeLoadedValue(*CurMI, ParamFwdReg)) {
736 if (ParamValue->first.isImm()) {
737 int64_t Val = ParamValue->first.getImm();
738 finishCallSiteParams(Val, ParamValue->second,
739 ForwardedRegWorklist[ParamFwdReg], Params);
740 } else if (ParamValue->first.isReg()) {
741 Register RegLoc = ParamValue->first.getReg();
742 Register SP = TLI.getStackPointerRegisterToSaveRestore();
743 Register FP = TRI.getFrameRegister(*MF);
744 bool IsSPorFP = (RegLoc == SP) || (RegLoc == FP);
745 if (!IsRegClobberedInMeantime(RegLoc) &&
746 (TRI.isCalleeSavedPhysReg(RegLoc, *MF) || IsSPorFP)) {
747 MachineLocation MLoc(RegLoc, /*Indirect=*/IsSPorFP);
748 finishCallSiteParams(MLoc, ParamValue->second,
749 ForwardedRegWorklist[ParamFwdReg], Params);
750 } else {
751 // ParamFwdReg was described by the non-callee saved register
752 // RegLoc. Mark that the call site values for the parameters are
753 // dependent on that register instead of ParamFwdReg. Since RegLoc
754 // may be a register that will be handled in this iteration, we
755 // postpone adding the items to the worklist, and instead keep them
756 // in a temporary container.
757 addToFwdRegWorklist(TmpWorklistItems, RegLoc, ParamValue->second,
758 ForwardedRegWorklist[ParamFwdReg]);
759 }
760 }
761 }
762 }
763
764 // Remove all registers that this instruction defines from the worklist.
765 for (auto ParamFwdReg : FwdRegDefs)
766 ForwardedRegWorklist.erase(ParamFwdReg);
767
768 // Any definitions by this instruction will clobber earlier reg movements.
769 ClobberedRegUnits.insert_range(NewClobberedRegUnits);
770
771 // Now that we are done handling this instruction, add items from the
772 // temporary worklist to the real one.
773 for (auto &New : TmpWorklistItems)
774 addToFwdRegWorklist(ForwardedRegWorklist, New.first, EmptyExpr, New.second);
775 TmpWorklistItems.clear();
776}
777
778static bool interpretNextInstr(const MachineInstr *CurMI,
779 FwdRegWorklist &ForwardedRegWorklist,
780 ParamSet &Params,
781 ClobberedRegSet &ClobberedRegUnits) {
782 // Skip bundle headers.
783 if (CurMI->isBundle())
784 return true;
785
786 // If the next instruction is a call we can not interpret parameter's
787 // forwarding registers or we finished the interpretation of all
788 // parameters.
789 if (CurMI->isCall())
790 return false;
791
792 if (ForwardedRegWorklist.empty())
793 return false;
794
795 // Avoid NOP description.
796 if (CurMI->getNumOperands() == 0)
797 return true;
798
799 interpretValues(CurMI, ForwardedRegWorklist, Params, ClobberedRegUnits);
800
801 return true;
802}
803
804/// Try to interpret values loaded into registers that forward parameters
805/// for \p CallMI. Store parameters with interpreted value into \p Params.
806static void collectCallSiteParameters(const MachineInstr *CallMI,
807 ParamSet &Params) {
808 const MachineFunction *MF = CallMI->getMF();
809 const auto &CalleesMap = MF->getCallSitesInfo();
810 auto CSInfo = CalleesMap.find(CallMI);
811
812 // There is no information for the call instruction.
813 if (CSInfo == CalleesMap.end())
814 return;
815
816 const MachineBasicBlock *MBB = CallMI->getParent();
817
818 // Skip the call instruction.
819 auto I = std::next(CallMI->getReverseIterator());
820
821 FwdRegWorklist ForwardedRegWorklist;
822
823 const DIExpression *EmptyExpr =
825
826 // Add all the forwarding registers into the ForwardedRegWorklist.
827 for (const auto &ArgReg : CSInfo->second.ArgRegPairs) {
828 bool InsertedReg =
829 ForwardedRegWorklist.insert({ArgReg.Reg, {{ArgReg.Reg, EmptyExpr}}})
830 .second;
831 assert(InsertedReg && "Single register used to forward two arguments?");
832 (void)InsertedReg;
833 }
834
835 // Do not emit CSInfo for undef forwarding registers.
836 for (const auto &MO : CallMI->uses())
837 if (MO.isReg() && MO.isUndef())
838 ForwardedRegWorklist.erase(MO.getReg());
839
840 // We erase, from the ForwardedRegWorklist, those forwarding registers for
841 // which we successfully describe a loaded value (by using
842 // the describeLoadedValue()). For those remaining arguments in the working
843 // list, for which we do not describe a loaded value by
844 // the describeLoadedValue(), we try to generate an entry value expression
845 // for their call site value description, if the call is within the entry MBB.
846 // TODO: Handle situations when call site parameter value can be described
847 // as the entry value within basic blocks other than the first one.
848 bool ShouldTryEmitEntryVals = MBB->getIterator() == MF->begin();
849
850 // Search for a loading value in forwarding registers inside call delay slot.
851 ClobberedRegSet ClobberedRegUnits;
852 if (CallMI->hasDelaySlot()) {
853 auto Suc = std::next(CallMI->getIterator());
854 // Only one-instruction delay slot is supported.
855 auto BundleEnd = llvm::getBundleEnd(CallMI->getIterator());
856 (void)BundleEnd;
857 assert(std::next(Suc) == BundleEnd &&
858 "More than one instruction in call delay slot");
859 // Try to interpret value loaded by instruction.
860 if (!interpretNextInstr(&*Suc, ForwardedRegWorklist, Params, ClobberedRegUnits))
861 return;
862 }
863
864 // Search for a loading value in forwarding registers.
865 for (; I != MBB->rend(); ++I) {
866 // Try to interpret values loaded by instruction.
867 if (!interpretNextInstr(&*I, ForwardedRegWorklist, Params, ClobberedRegUnits))
868 return;
869 }
870
871 // Emit the call site parameter's value as an entry value.
872 if (ShouldTryEmitEntryVals) {
873 // Create an expression where the register's entry value is used.
874 DIExpression *EntryExpr = DIExpression::get(
875 MF->getFunction().getContext(), {dwarf::DW_OP_LLVM_entry_value, 1});
876 for (auto &RegEntry : ForwardedRegWorklist) {
877 MachineLocation MLoc(RegEntry.first);
878 finishCallSiteParams(MLoc, EntryExpr, RegEntry.second, Params);
879 }
880 }
881}
882
883void DwarfDebug::constructCallSiteEntryDIEs(const DISubprogram &SP,
884 DwarfCompileUnit &CU, DIE &ScopeDIE,
885 const MachineFunction &MF) {
886 // Add a call site-related attribute (DWARF5, Sec. 3.3.1.3). Do this only if
887 // the subprogram is required to have one.
888 if (!SP.areAllCallsDescribed() || !SP.isDefinition())
889 return;
890
891 // Use DW_AT_call_all_calls to express that call site entries are present
892 // for both tail and non-tail calls. Don't use DW_AT_call_all_source_calls
893 // because one of its requirements is not met: call site entries for
894 // optimized-out calls are elided.
895 CU.addFlag(ScopeDIE, CU.getDwarf5OrGNUAttr(dwarf::DW_AT_call_all_calls));
896
897 const TargetInstrInfo *TII = MF.getSubtarget().getInstrInfo();
898 assert(TII && "TargetInstrInfo not found: cannot label tail calls");
899
900 // Delay slot support check.
901 auto delaySlotSupported = [&](const MachineInstr &MI) {
902 if (!MI.isBundledWithSucc())
903 return false;
904 auto Suc = std::next(MI.getIterator());
905 auto CallInstrBundle = getBundleStart(MI.getIterator());
906 (void)CallInstrBundle;
907 auto DelaySlotBundle = getBundleStart(Suc);
908 (void)DelaySlotBundle;
909 // Ensure that label after call is following delay slot instruction.
910 // Ex. CALL_INSTRUCTION {
911 // DELAY_SLOT_INSTRUCTION }
912 // LABEL_AFTER_CALL
913 assert(getLabelAfterInsn(&*CallInstrBundle) ==
914 getLabelAfterInsn(&*DelaySlotBundle) &&
915 "Call and its successor instruction don't have same label after.");
916 return true;
917 };
918
919 // Emit call site entries for each call or tail call in the function.
920 for (const MachineBasicBlock &MBB : MF) {
921 for (const MachineInstr &MI : MBB.instrs()) {
922 // Bundles with call in them will pass the isCall() test below but do not
923 // have callee operand information so skip them here. Iterator will
924 // eventually reach the call MI.
925 if (MI.isBundle())
926 continue;
927
928 // Skip instructions which aren't calls. Both calls and tail-calling jump
929 // instructions (e.g TAILJMPd64) are classified correctly here.
930 if (!MI.isCandidateForAdditionalCallInfo())
931 continue;
932
933 // Skip instructions marked as frame setup, as they are not interesting to
934 // the user.
935 if (MI.getFlag(MachineInstr::FrameSetup))
936 continue;
937
938 // Check if delay slot support is enabled.
939 if (MI.hasDelaySlot() && !delaySlotSupported(*&MI))
940 return;
941
942 DIType *AllocSiteTy = dyn_cast_or_null<DIType>(MI.getHeapAllocMarker());
943
944 // If this is a direct call, find the callee's subprogram.
945 // In the case of an indirect call find the register that holds
946 // the callee.
947 const MachineOperand &CalleeOp = TII->getCalleeOperand(MI);
948 bool PhysRegCalleeOperand =
949 CalleeOp.isReg() && CalleeOp.getReg().isPhysical();
950 // Hack: WebAssembly CALL instructions have MCInstrDesc that does not
951 // describe the call target operand.
952 if (CalleeOp.getOperandNo() < MI.getDesc().operands().size()) {
953 const MCOperandInfo &MCOI =
954 MI.getDesc().operands()[CalleeOp.getOperandNo()];
955 PhysRegCalleeOperand =
956 PhysRegCalleeOperand && MCOI.OperandType == MCOI::OPERAND_REGISTER;
957 }
958
959 unsigned CallReg = 0;
960 const DISubprogram *CalleeSP = nullptr;
961 const Function *CalleeDecl = nullptr;
962 if (PhysRegCalleeOperand) {
963 CallReg = CalleeOp.getReg(); // might be zero
964 } else if (CalleeOp.isGlobal()) {
965 CalleeDecl = dyn_cast<Function>(CalleeOp.getGlobal());
966 if (CalleeDecl)
967 CalleeSP = CalleeDecl->getSubprogram(); // might be nullptr
968 }
969
970 // Omit DIE if we can't tell where the call goes *and* we don't want to
971 // add metadata to it.
972 if (CalleeSP == nullptr && CallReg == 0 && AllocSiteTy == nullptr)
973 continue;
974
975 // TODO: Omit call site entries for runtime calls (objc_msgSend, etc).
976
977 bool IsTail = TII->isTailCall(MI);
978
979 // If MI is in a bundle, the label was created after the bundle since
980 // EmitFunctionBody iterates over top-level MIs. Get that top-level MI
981 // to search for that label below.
982 const MachineInstr *TopLevelCallMI =
983 MI.isInsideBundle() ? &*getBundleStart(MI.getIterator()) : &MI;
984
985 // For non-tail calls, the return PC is needed to disambiguate paths in
986 // the call graph which could lead to some target function. For tail
987 // calls, no return PC information is needed, unless tuning for GDB in
988 // DWARF4 mode in which case we fake a return PC for compatibility.
989 const MCSymbol *PCAddr = (!IsTail || CU.useGNUAnalogForDwarf5Feature())
990 ? getLabelAfterInsn(TopLevelCallMI)
991 : nullptr;
992
993 // For tail calls, it's necessary to record the address of the branch
994 // instruction so that the debugger can show where the tail call occurred.
995 const MCSymbol *CallAddr =
996 IsTail ? getLabelBeforeInsn(TopLevelCallMI) : nullptr;
997
998 assert((IsTail || PCAddr) && "Non-tail call without return PC");
999
1000 LLVM_DEBUG(dbgs() << "CallSiteEntry: " << MF.getName() << " -> "
1001 << (CalleeDecl ? CalleeDecl->getName()
1002 : StringRef(MF.getSubtarget()
1003 .getRegisterInfo()
1004 ->getName(CallReg)))
1005 << (IsTail ? " [IsTail]" : "") << "\n");
1006
1007 DIE &CallSiteDIE =
1008 CU.constructCallSiteEntryDIE(ScopeDIE, CalleeSP, CalleeDecl, IsTail,
1009 PCAddr, CallAddr, CallReg, AllocSiteTy);
1010
1011 // Optionally emit call-site-param debug info.
1012 if (emitDebugEntryValues()) {
1013 ParamSet Params;
1014 // Try to interpret values of call site parameters.
1015 collectCallSiteParameters(&MI, Params);
1016 CU.constructCallSiteParmEntryDIEs(CallSiteDIE, Params);
1017 }
1018 }
1019 }
1020}
1021
1022void DwarfDebug::addGnuPubAttributes(DwarfCompileUnit &U, DIE &D) const {
1023 if (!U.hasDwarfPubSections())
1024 return;
1025
1026 U.addFlag(D, dwarf::DW_AT_GNU_pubnames);
1027}
1028
1029void DwarfDebug::finishUnitAttributes(const DICompileUnit *DIUnit,
1030 DwarfCompileUnit &NewCU) {
1031 DIE &Die = NewCU.getUnitDie();
1032 StringRef FN = DIUnit->getFilename();
1033
1034 StringRef Producer = DIUnit->getProducer();
1035 StringRef Flags = DIUnit->getFlags();
1036 if (!Flags.empty() && !useAppleExtensionAttributes()) {
1037 std::string ProducerWithFlags = Producer.str() + " " + Flags.str();
1038 NewCU.addString(Die, dwarf::DW_AT_producer, ProducerWithFlags);
1039 } else
1040 NewCU.addString(Die, dwarf::DW_AT_producer, Producer);
1041
1042 NewCU.addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data2,
1043 DIUnit->getSourceLanguage());
1044 NewCU.addString(Die, dwarf::DW_AT_name, FN);
1045 StringRef SysRoot = DIUnit->getSysRoot();
1046 if (!SysRoot.empty())
1047 NewCU.addString(Die, dwarf::DW_AT_LLVM_sysroot, SysRoot);
1048 StringRef SDK = DIUnit->getSDK();
1049 if (!SDK.empty())
1050 NewCU.addString(Die, dwarf::DW_AT_APPLE_sdk, SDK);
1051
1052 if (!useSplitDwarf()) {
1053 // Add DW_str_offsets_base to the unit DIE, except for split units.
1055 NewCU.addStringOffsetsStart();
1056
1057 NewCU.initStmtList();
1058
1059 // If we're using split dwarf the compilation dir is going to be in the
1060 // skeleton CU and so we don't need to duplicate it here.
1061 if (!CompilationDir.empty())
1062 NewCU.addString(Die, dwarf::DW_AT_comp_dir, CompilationDir);
1063 addGnuPubAttributes(NewCU, Die);
1064 }
1065
1067 if (DIUnit->isOptimized())
1068 NewCU.addFlag(Die, dwarf::DW_AT_APPLE_optimized);
1069
1070 StringRef Flags = DIUnit->getFlags();
1071 if (!Flags.empty())
1072 NewCU.addString(Die, dwarf::DW_AT_APPLE_flags, Flags);
1073
1074 if (unsigned RVer = DIUnit->getRuntimeVersion())
1075 NewCU.addUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers,
1076 dwarf::DW_FORM_data1, RVer);
1077 }
1078
1079 if (DIUnit->getDWOId()) {
1080 // This CU is either a clang module DWO or a skeleton CU.
1081 NewCU.addUInt(Die, dwarf::DW_AT_GNU_dwo_id, dwarf::DW_FORM_data8,
1082 DIUnit->getDWOId());
1083 if (!DIUnit->getSplitDebugFilename().empty()) {
1084 // This is a prefabricated skeleton CU.
1085 dwarf::Attribute attrDWOName = getDwarfVersion() >= 5
1086 ? dwarf::DW_AT_dwo_name
1087 : dwarf::DW_AT_GNU_dwo_name;
1088 NewCU.addString(Die, attrDWOName, DIUnit->getSplitDebugFilename());
1089 }
1090 }
1091}
1092// Create new DwarfCompileUnit for the given metadata node with tag
1093// DW_TAG_compile_unit.
1095DwarfDebug::getOrCreateDwarfCompileUnit(const DICompileUnit *DIUnit) {
1096 if (auto *CU = CUMap.lookup(DIUnit))
1097 return *CU;
1098
1099 if (useSplitDwarf() &&
1100 !shareAcrossDWOCUs() &&
1101 (!DIUnit->getSplitDebugInlining() ||
1103 !CUMap.empty()) {
1104 return *CUMap.begin()->second;
1105 }
1106 CompilationDir = DIUnit->getDirectory();
1107
1108 auto OwnedUnit = std::make_unique<DwarfCompileUnit>(
1109 InfoHolder.getUnits().size(), DIUnit, Asm, this, &InfoHolder);
1110 DwarfCompileUnit &NewCU = *OwnedUnit;
1111 InfoHolder.addUnit(std::move(OwnedUnit));
1112
1113 // LTO with assembly output shares a single line table amongst multiple CUs.
1114 // To avoid the compilation directory being ambiguous, let the line table
1115 // explicitly describe the directory of all files, never relying on the
1116 // compilation directory.
1117 if (!Asm->OutStreamer->hasRawTextSupport() || SingleCU)
1118 Asm->OutStreamer->emitDwarfFile0Directive(
1119 CompilationDir, DIUnit->getFilename(), getMD5AsBytes(DIUnit->getFile()),
1120 DIUnit->getSource(), NewCU.getUniqueID());
1121
1122 if (useSplitDwarf()) {
1123 NewCU.setSkeleton(constructSkeletonCU(NewCU));
1124 NewCU.setSection(Asm->getObjFileLowering().getDwarfInfoDWOSection());
1125 } else {
1126 finishUnitAttributes(DIUnit, NewCU);
1127 NewCU.setSection(Asm->getObjFileLowering().getDwarfInfoSection());
1128 }
1129
1130 CUMap.insert({DIUnit, &NewCU});
1131 CUDieMap.insert({&NewCU.getUnitDie(), &NewCU});
1132 return NewCU;
1133}
1134
1135/// Sort and unique GVEs by comparing their fragment offset.
1138 llvm::sort(
1140 // Sort order: first null exprs, then exprs without fragment
1141 // info, then sort by fragment offset in bits.
1142 // FIXME: Come up with a more comprehensive comparator so
1143 // the sorting isn't non-deterministic, and so the following
1144 // std::unique call works correctly.
1145 if (!A.Expr || !B.Expr)
1146 return !!B.Expr;
1147 auto FragmentA = A.Expr->getFragmentInfo();
1148 auto FragmentB = B.Expr->getFragmentInfo();
1149 if (!FragmentA || !FragmentB)
1150 return !!FragmentB;
1151 return FragmentA->OffsetInBits < FragmentB->OffsetInBits;
1152 });
1153 GVEs.erase(llvm::unique(GVEs,
1156 return A.Expr == B.Expr;
1157 }),
1158 GVEs.end());
1159 return GVEs;
1160}
1161
1162// Emit all Dwarf sections that should come prior to the content. Create
1163// global DIEs and emit initial debug info sections. This is invoked by
1164// the target AsmPrinter.
1167
1168 if (!Asm)
1169 return;
1170
1171 unsigned NumDebugCUs = std::distance(M->debug_compile_units_begin(),
1172 M->debug_compile_units_end());
1173 if (NumDebugCUs == 0)
1174 return;
1175
1176 assert(NumDebugCUs > 0 && "Asm unexpectedly initialized");
1177 SingleCU = NumDebugCUs == 1;
1179 GVMap;
1180 for (const GlobalVariable &Global : M->globals()) {
1182 Global.getDebugInfo(GVs);
1183 for (auto *GVE : GVs)
1184 GVMap[GVE->getVariable()].push_back({&Global, GVE->getExpression()});
1185 }
1186
1187 // Create the symbol that designates the start of the unit's contribution
1188 // to the string offsets table. In a split DWARF scenario, only the skeleton
1189 // unit has the DW_AT_str_offsets_base attribute (and hence needs the symbol).
1191 (useSplitDwarf() ? SkeletonHolder : InfoHolder)
1192 .setStringOffsetsStartSym(Asm->createTempSymbol("str_offsets_base"));
1193
1194
1195 // Create the symbols that designates the start of the DWARF v5 range list
1196 // and locations list tables. They are located past the table headers.
1197 if (getDwarfVersion() >= 5) {
1198 DwarfFile &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
1200 Asm->createTempSymbol("rnglists_table_base"));
1201
1202 if (useSplitDwarf())
1203 InfoHolder.setRnglistsTableBaseSym(
1204 Asm->createTempSymbol("rnglists_dwo_table_base"));
1205 }
1206
1207 // Create the symbol that points to the first entry following the debug
1208 // address table (.debug_addr) header.
1209 AddrPool.setLabel(Asm->createTempSymbol("addr_table_base"));
1210 DebugLocs.setSym(Asm->createTempSymbol("loclists_table_base"));
1211
1212 for (DICompileUnit *CUNode : M->debug_compile_units()) {
1213 if (CUNode->getImportedEntities().empty() &&
1214 CUNode->getEnumTypes().empty() && CUNode->getRetainedTypes().empty() &&
1215 CUNode->getGlobalVariables().empty() && CUNode->getMacros().empty())
1216 continue;
1217
1218 DwarfCompileUnit &CU = getOrCreateDwarfCompileUnit(CUNode);
1219
1220 // Global Variables.
1221 for (auto *GVE : CUNode->getGlobalVariables()) {
1222 // Don't bother adding DIGlobalVariableExpressions listed in the CU if we
1223 // already know about the variable and it isn't adding a constant
1224 // expression.
1225 auto &GVMapEntry = GVMap[GVE->getVariable()];
1226 auto *Expr = GVE->getExpression();
1227 if (!GVMapEntry.size() || (Expr && Expr->isConstant()))
1228 GVMapEntry.push_back({nullptr, Expr});
1229 }
1230
1232 for (auto *GVE : CUNode->getGlobalVariables()) {
1233 DIGlobalVariable *GV = GVE->getVariable();
1234 if (Processed.insert(GV).second)
1235 CU.getOrCreateGlobalVariableDIE(GV, sortGlobalExprs(GVMap[GV]));
1236 }
1237
1238 for (auto *Ty : CUNode->getEnumTypes())
1239 CU.getOrCreateTypeDIE(cast<DIType>(Ty));
1240
1241 for (auto *Ty : CUNode->getRetainedTypes()) {
1242 // The retained types array by design contains pointers to
1243 // MDNodes rather than DIRefs. Unique them here.
1244 if (DIType *RT = dyn_cast<DIType>(Ty))
1245 // There is no point in force-emitting a forward declaration.
1246 CU.getOrCreateTypeDIE(RT);
1247 }
1248 }
1249}
1250
1251void DwarfDebug::finishEntityDefinitions() {
1252 for (const auto &Entity : ConcreteEntities) {
1253 DIE *Die = Entity->getDIE();
1254 assert(Die);
1255 // FIXME: Consider the time-space tradeoff of just storing the unit pointer
1256 // in the ConcreteEntities list, rather than looking it up again here.
1257 // DIE::getUnit isn't simple - it walks parent pointers, etc.
1258 DwarfCompileUnit *Unit = CUDieMap.lookup(Die->getUnitDie());
1259 assert(Unit);
1260 Unit->finishEntityDefinition(Entity.get());
1261 }
1262}
1263
1264void DwarfDebug::finishSubprogramDefinitions() {
1265 for (const DISubprogram *SP : ProcessedSPNodes) {
1266 assert(SP->getUnit()->getEmissionKind() != DICompileUnit::NoDebug);
1267 forBothCUs(
1268 getOrCreateDwarfCompileUnit(SP->getUnit()),
1269 [&](DwarfCompileUnit &CU) { CU.finishSubprogramDefinition(SP); });
1270 }
1271}
1272
1273void DwarfDebug::finalizeModuleInfo() {
1274 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
1275
1276 finishSubprogramDefinitions();
1277
1278 finishEntityDefinitions();
1279
1280 bool HasEmittedSplitCU = false;
1281
1282 // Handle anything that needs to be done on a per-unit basis after
1283 // all other generation.
1284 for (const auto &P : CUMap) {
1285 auto &TheCU = *P.second;
1286 if (TheCU.getCUNode()->isDebugDirectivesOnly())
1287 continue;
1288 TheCU.attachLexicalScopesAbstractOrigins();
1289 // Emit DW_AT_containing_type attribute to connect types with their
1290 // vtable holding type.
1291 TheCU.constructContainingTypeDIEs();
1292
1293 // Add CU specific attributes if we need to add any.
1294 // If we're splitting the dwarf out now that we've got the entire
1295 // CU then add the dwo id to it.
1296 auto *SkCU = TheCU.getSkeleton();
1297
1298 bool HasSplitUnit = SkCU && !TheCU.getUnitDie().children().empty();
1299
1300 if (HasSplitUnit) {
1301 (void)HasEmittedSplitCU;
1302 assert((shareAcrossDWOCUs() || !HasEmittedSplitCU) &&
1303 "Multiple CUs emitted into a single dwo file");
1304 HasEmittedSplitCU = true;
1305 dwarf::Attribute attrDWOName = getDwarfVersion() >= 5
1306 ? dwarf::DW_AT_dwo_name
1307 : dwarf::DW_AT_GNU_dwo_name;
1308 finishUnitAttributes(TheCU.getCUNode(), TheCU);
1309 StringRef DWOName = Asm->TM.Options.MCOptions.SplitDwarfFile;
1310 TheCU.addString(TheCU.getUnitDie(), attrDWOName, DWOName);
1311 SkCU->addString(SkCU->getUnitDie(), attrDWOName, DWOName);
1312 // Emit a unique identifier for this CU. Include the DWO file name in the
1313 // hash to avoid the case where two (almost) empty compile units have the
1314 // same contents. This can happen if link-time optimization removes nearly
1315 // all (unused) code from a CU.
1316 uint64_t ID =
1317 DIEHash(Asm, &TheCU).computeCUSignature(DWOName, TheCU.getUnitDie());
1318 if (getDwarfVersion() >= 5) {
1319 TheCU.setDWOId(ID);
1320 SkCU->setDWOId(ID);
1321 } else {
1322 TheCU.addUInt(TheCU.getUnitDie(), dwarf::DW_AT_GNU_dwo_id,
1323 dwarf::DW_FORM_data8, ID);
1324 SkCU->addUInt(SkCU->getUnitDie(), dwarf::DW_AT_GNU_dwo_id,
1325 dwarf::DW_FORM_data8, ID);
1326 }
1327
1328 if (getDwarfVersion() < 5 && !SkeletonHolder.getRangeLists().empty()) {
1329 const MCSymbol *Sym = TLOF.getDwarfRangesSection()->getBeginSymbol();
1330 SkCU->addSectionLabel(SkCU->getUnitDie(), dwarf::DW_AT_GNU_ranges_base,
1331 Sym, Sym);
1332 }
1333 } else if (SkCU) {
1334 finishUnitAttributes(SkCU->getCUNode(), *SkCU);
1335 }
1336
1337 // If we have code split among multiple sections or non-contiguous
1338 // ranges of code then emit a DW_AT_ranges attribute on the unit that will
1339 // remain in the .o file, otherwise add a DW_AT_low_pc.
1340 // FIXME: We should use ranges allow reordering of code ala
1341 // .subsections_via_symbols in mach-o. This would mean turning on
1342 // ranges for all subprogram DIEs for mach-o.
1343 DwarfCompileUnit &U = SkCU ? *SkCU : TheCU;
1344
1345 if (unsigned NumRanges = TheCU.getRanges().size()) {
1346 // PTX does not support subtracting labels from the code section in the
1347 // debug_loc section. To work around this, the NVPTX backend needs the
1348 // compile unit to have no low_pc in order to have a zero base_address
1349 // when handling debug_loc in cuda-gdb.
1350 if (!(Asm->TM.getTargetTriple().isNVPTX() && tuneForGDB())) {
1351 if (NumRanges > 1 && useRangesSection())
1352 // A DW_AT_low_pc attribute may also be specified in combination with
1353 // DW_AT_ranges to specify the default base address for use in
1354 // location lists (see Section 2.6.2) and range lists (see Section
1355 // 2.17.3).
1356 U.addUInt(U.getUnitDie(), dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
1357 0);
1358 else
1359 U.setBaseAddress(TheCU.getRanges().front().Begin);
1360 U.attachRangesOrLowHighPC(U.getUnitDie(), TheCU.takeRanges());
1361 }
1362 }
1363
1364 // We don't keep track of which addresses are used in which CU so this
1365 // is a bit pessimistic under LTO.
1366 if ((HasSplitUnit || getDwarfVersion() >= 5) && !AddrPool.isEmpty())
1367 U.addAddrTableBase();
1368
1369 if (getDwarfVersion() >= 5) {
1370 if (U.hasRangeLists())
1371 U.addRnglistsBase();
1372
1373 if (!DebugLocs.getLists().empty() && !useSplitDwarf()) {
1374 U.addSectionLabel(U.getUnitDie(), dwarf::DW_AT_loclists_base,
1375 DebugLocs.getSym(),
1377 }
1378 }
1379
1380 auto *CUNode = cast<DICompileUnit>(P.first);
1381 // If compile Unit has macros, emit "DW_AT_macro_info/DW_AT_macros"
1382 // attribute.
1383 if (CUNode->getMacros()) {
1384 if (UseDebugMacroSection) {
1385 if (useSplitDwarf())
1386 TheCU.addSectionDelta(
1387 TheCU.getUnitDie(), dwarf::DW_AT_macros, U.getMacroLabelBegin(),
1389 else {
1390 dwarf::Attribute MacrosAttr = getDwarfVersion() >= 5
1391 ? dwarf::DW_AT_macros
1392 : dwarf::DW_AT_GNU_macros;
1393 U.addSectionLabel(U.getUnitDie(), MacrosAttr, U.getMacroLabelBegin(),
1395 }
1396 } else {
1397 if (useSplitDwarf())
1398 TheCU.addSectionDelta(
1399 TheCU.getUnitDie(), dwarf::DW_AT_macro_info,
1400 U.getMacroLabelBegin(),
1402 else
1403 U.addSectionLabel(U.getUnitDie(), dwarf::DW_AT_macro_info,
1404 U.getMacroLabelBegin(),
1406 }
1407 }
1408 }
1409
1410 // Emit all frontend-produced Skeleton CUs, i.e., Clang modules.
1411 for (auto *CUNode : MMI->getModule()->debug_compile_units())
1412 if (CUNode->getDWOId())
1413 getOrCreateDwarfCompileUnit(CUNode);
1414
1415 // Compute DIE offsets and sizes.
1416 InfoHolder.computeSizeAndOffsets();
1417 if (useSplitDwarf())
1418 SkeletonHolder.computeSizeAndOffsets();
1419
1420 // Now that offsets are computed, can replace DIEs in debug_names Entry with
1421 // an actual offset.
1422 AccelDebugNames.convertDieToOffset();
1423}
1424
1425// Emit all Dwarf sections that should come after the content.
1427 // Terminate the pending line table.
1428 if (PrevCU)
1429 terminateLineTable(PrevCU);
1430 PrevCU = nullptr;
1431 assert(CurFn == nullptr);
1432 assert(CurMI == nullptr);
1433
1434 for (const auto &P : CUMap) {
1435 const auto *CUNode = cast<DICompileUnit>(P.first);
1436 DwarfCompileUnit *CU = &*P.second;
1437
1438 // Emit imported entities.
1439 for (auto *IE : CUNode->getImportedEntities()) {
1440 assert(!isa_and_nonnull<DILocalScope>(IE->getScope()) &&
1441 "Unexpected function-local entity in 'imports' CU field.");
1442 CU->getOrCreateImportedEntityDIE(IE);
1443 }
1444 for (const auto *D : CU->getDeferredLocalDecls()) {
1445 if (auto *IE = dyn_cast<DIImportedEntity>(D))
1446 CU->getOrCreateImportedEntityDIE(IE);
1447 else
1448 llvm_unreachable("Unexpected local retained node!");
1449 }
1450
1451 // Emit base types.
1452 CU->createBaseTypeDIEs();
1453 }
1454
1455 // If we aren't actually generating debug info (check beginModule -
1456 // conditionalized on the presence of the llvm.dbg.cu metadata node)
1457 if (!Asm || !Asm->hasDebugInfo())
1458 return;
1459
1460 // Finalize the debug info for the module.
1461 finalizeModuleInfo();
1462
1463 if (useSplitDwarf())
1464 // Emit debug_loc.dwo/debug_loclists.dwo section.
1465 emitDebugLocDWO();
1466 else
1467 // Emit debug_loc/debug_loclists section.
1468 emitDebugLoc();
1469
1470 // Corresponding abbreviations into a abbrev section.
1471 emitAbbreviations();
1472
1473 // Emit all the DIEs into a debug info section.
1474 emitDebugInfo();
1475
1476 // Emit info into a debug aranges section.
1477 if (UseARangesSection)
1478 emitDebugARanges();
1479
1480 // Emit info into a debug ranges section.
1481 emitDebugRanges();
1482
1483 if (useSplitDwarf())
1484 // Emit info into a debug macinfo.dwo section.
1485 emitDebugMacinfoDWO();
1486 else
1487 // Emit info into a debug macinfo/macro section.
1488 emitDebugMacinfo();
1489
1490 emitDebugStr();
1491
1492 if (useSplitDwarf()) {
1493 emitDebugStrDWO();
1494 emitDebugInfoDWO();
1495 emitDebugAbbrevDWO();
1496 emitDebugLineDWO();
1497 emitDebugRangesDWO();
1498 }
1499
1500 emitDebugAddr();
1501
1502 // Emit info into the dwarf accelerator table sections.
1503 switch (getAccelTableKind()) {
1505 emitAccelNames();
1506 emitAccelObjC();
1507 emitAccelNamespaces();
1508 emitAccelTypes();
1509 break;
1511 emitAccelDebugNames();
1512 break;
1514 break;
1516 llvm_unreachable("Default should have already been resolved.");
1517 }
1518
1519 // Emit the pubnames and pubtypes sections if requested.
1520 emitDebugPubSections();
1521
1522 // clean up.
1523 // FIXME: AbstractVariables.clear();
1524}
1525
1526void DwarfDebug::ensureAbstractEntityIsCreatedIfScoped(DwarfCompileUnit &CU,
1527 const DINode *Node, const MDNode *ScopeNode) {
1528 if (CU.getExistingAbstractEntity(Node))
1529 return;
1530
1531 if (LexicalScope *Scope =
1533 CU.createAbstractEntity(Node, Scope);
1534}
1535
1537 const DIScope *S;
1538 if (const auto *LV = dyn_cast<DILocalVariable>(N))
1539 S = LV->getScope();
1540 else if (const auto *L = dyn_cast<DILabel>(N))
1541 S = L->getScope();
1542 else if (const auto *IE = dyn_cast<DIImportedEntity>(N))
1543 S = IE->getScope();
1544 else
1545 llvm_unreachable("Unexpected retained node!");
1546
1547 // Ensure the scope is not a DILexicalBlockFile.
1548 return cast<DILocalScope>(S)->getNonLexicalBlockFileScope();
1549}
1550
1551// Collect variable information from side table maintained by MF.
1552void DwarfDebug::collectVariableInfoFromMFTable(
1553 DwarfCompileUnit &TheCU, DenseSet<InlinedEntity> &Processed) {
1554 SmallDenseMap<InlinedEntity, DbgVariable *> MFVars;
1555 LLVM_DEBUG(dbgs() << "DwarfDebug: collecting variables from MF side table\n");
1556 for (const auto &VI : Asm->MF->getVariableDbgInfo()) {
1557 if (!VI.Var)
1558 continue;
1559 assert(VI.Var->isValidLocationForIntrinsic(VI.Loc) &&
1560 "Expected inlined-at fields to agree");
1561
1562 InlinedEntity Var(VI.Var, VI.Loc->getInlinedAt());
1563 Processed.insert(Var);
1564 LexicalScope *Scope = LScopes.findLexicalScope(VI.Loc);
1565
1566 // If variable scope is not found then skip this variable.
1567 if (!Scope) {
1568 LLVM_DEBUG(dbgs() << "Dropping debug info for " << VI.Var->getName()
1569 << ", no variable scope found\n");
1570 continue;
1571 }
1572
1573 ensureAbstractEntityIsCreatedIfScoped(TheCU, Var.first, Scope->getScopeNode());
1574
1575 // If we have already seen information for this variable, add to what we
1576 // already know.
1577 if (DbgVariable *PreviousLoc = MFVars.lookup(Var)) {
1578 auto *PreviousMMI = std::get_if<Loc::MMI>(PreviousLoc);
1579 auto *PreviousEntryValue = std::get_if<Loc::EntryValue>(PreviousLoc);
1580 // Previous and new locations are both stack slots (MMI).
1581 if (PreviousMMI && VI.inStackSlot())
1582 PreviousMMI->addFrameIndexExpr(VI.Expr, VI.getStackSlot());
1583 // Previous and new locations are both entry values.
1584 else if (PreviousEntryValue && VI.inEntryValueRegister())
1585 PreviousEntryValue->addExpr(VI.getEntryValueRegister(), *VI.Expr);
1586 else {
1587 // Locations differ, this should (rarely) happen in optimized async
1588 // coroutines.
1589 // Prefer whichever location has an EntryValue.
1590 if (PreviousLoc->holds<Loc::MMI>())
1591 PreviousLoc->emplace<Loc::EntryValue>(VI.getEntryValueRegister(),
1592 *VI.Expr);
1593 LLVM_DEBUG(dbgs() << "Dropping debug info for " << VI.Var->getName()
1594 << ", conflicting fragment location types\n");
1595 }
1596 continue;
1597 }
1598
1599 auto RegVar = std::make_unique<DbgVariable>(
1600 cast<DILocalVariable>(Var.first), Var.second);
1601 if (VI.inStackSlot())
1602 RegVar->emplace<Loc::MMI>(VI.Expr, VI.getStackSlot());
1603 else
1604 RegVar->emplace<Loc::EntryValue>(VI.getEntryValueRegister(), *VI.Expr);
1605 LLVM_DEBUG(dbgs() << "Created DbgVariable for " << VI.Var->getName()
1606 << "\n");
1607 InfoHolder.addScopeVariable(Scope, RegVar.get());
1608 MFVars.insert({Var, RegVar.get()});
1609 ConcreteEntities.push_back(std::move(RegVar));
1610 }
1611}
1612
1613/// Determine whether a *singular* DBG_VALUE is valid for the entirety of its
1614/// enclosing lexical scope. The check ensures there are no other instructions
1615/// in the same lexical scope preceding the DBG_VALUE and that its range is
1616/// either open or otherwise rolls off the end of the scope.
1617static bool validThroughout(LexicalScopes &LScopes,
1618 const MachineInstr *DbgValue,
1619 const MachineInstr *RangeEnd,
1620 const InstructionOrdering &Ordering) {
1621 assert(DbgValue->getDebugLoc() && "DBG_VALUE without a debug location");
1622 auto MBB = DbgValue->getParent();
1623 auto DL = DbgValue->getDebugLoc();
1624 auto *LScope = LScopes.findLexicalScope(DL);
1625 // Scope doesn't exist; this is a dead DBG_VALUE.
1626 if (!LScope)
1627 return false;
1628 auto &LSRange = LScope->getRanges();
1629 if (LSRange.size() == 0)
1630 return false;
1631
1632 const MachineInstr *LScopeBegin = LSRange.front().first;
1633 // If the scope starts before the DBG_VALUE then we may have a negative
1634 // result. Otherwise the location is live coming into the scope and we
1635 // can skip the following checks.
1636 if (!Ordering.isBefore(DbgValue, LScopeBegin)) {
1637 // Exit if the lexical scope begins outside of the current block.
1638 if (LScopeBegin->getParent() != MBB)
1639 return false;
1640
1642 for (++Pred; Pred != MBB->rend(); ++Pred) {
1643 if (Pred->getFlag(MachineInstr::FrameSetup))
1644 break;
1645 auto PredDL = Pred->getDebugLoc();
1646 if (!PredDL || Pred->isMetaInstruction())
1647 continue;
1648 // Check whether the instruction preceding the DBG_VALUE is in the same
1649 // (sub)scope as the DBG_VALUE.
1650 if (DL->getScope() == PredDL->getScope())
1651 return false;
1652 auto *PredScope = LScopes.findLexicalScope(PredDL);
1653 if (!PredScope || LScope->dominates(PredScope))
1654 return false;
1655 }
1656 }
1657
1658 // If the range of the DBG_VALUE is open-ended, report success.
1659 if (!RangeEnd)
1660 return true;
1661
1662 // Single, constant DBG_VALUEs in the prologue are promoted to be live
1663 // throughout the function. This is a hack, presumably for DWARF v2 and not
1664 // necessarily correct. It would be much better to use a dbg.declare instead
1665 // if we know the constant is live throughout the scope.
1666 if (MBB->pred_empty() &&
1667 all_of(DbgValue->debug_operands(),
1668 [](const MachineOperand &Op) { return Op.isImm(); }))
1669 return true;
1670
1671 // Test if the location terminates before the end of the scope.
1672 const MachineInstr *LScopeEnd = LSRange.back().second;
1673 if (Ordering.isBefore(RangeEnd, LScopeEnd))
1674 return false;
1675
1676 // There's a single location which starts at the scope start, and ends at or
1677 // after the scope end.
1678 return true;
1679}
1680
1681/// Build the location list for all DBG_VALUEs in the function that
1682/// describe the same variable. The resulting DebugLocEntries will have
1683/// strict monotonically increasing begin addresses and will never
1684/// overlap. If the resulting list has only one entry that is valid
1685/// throughout variable's scope return true.
1686//
1687// See the definition of DbgValueHistoryMap::Entry for an explanation of the
1688// different kinds of history map entries. One thing to be aware of is that if
1689// a debug value is ended by another entry (rather than being valid until the
1690// end of the function), that entry's instruction may or may not be included in
1691// the range, depending on if the entry is a clobbering entry (it has an
1692// instruction that clobbers one or more preceding locations), or if it is an
1693// (overlapping) debug value entry. This distinction can be seen in the example
1694// below. The first debug value is ended by the clobbering entry 2, and the
1695// second and third debug values are ended by the overlapping debug value entry
1696// 4.
1697//
1698// Input:
1699//
1700// History map entries [type, end index, mi]
1701//
1702// 0 | [DbgValue, 2, DBG_VALUE $reg0, [...] (fragment 0, 32)]
1703// 1 | | [DbgValue, 4, DBG_VALUE $reg1, [...] (fragment 32, 32)]
1704// 2 | | [Clobber, $reg0 = [...], -, -]
1705// 3 | | [DbgValue, 4, DBG_VALUE 123, [...] (fragment 64, 32)]
1706// 4 [DbgValue, ~0, DBG_VALUE @g, [...] (fragment 0, 96)]
1707//
1708// Output [start, end) [Value...]:
1709//
1710// [0-1) [(reg0, fragment 0, 32)]
1711// [1-3) [(reg0, fragment 0, 32), (reg1, fragment 32, 32)]
1712// [3-4) [(reg1, fragment 32, 32), (123, fragment 64, 32)]
1713// [4-) [(@g, fragment 0, 96)]
1714bool DwarfDebug::buildLocationList(SmallVectorImpl<DebugLocEntry> &DebugLoc,
1715 const DbgValueHistoryMap::Entries &Entries) {
1716 using OpenRange =
1717 std::pair<DbgValueHistoryMap::EntryIndex, DbgValueLoc>;
1718 SmallVector<OpenRange, 4> OpenRanges;
1719 bool isSafeForSingleLocation = true;
1720 const MachineInstr *StartDebugMI = nullptr;
1721 const MachineInstr *EndMI = nullptr;
1722
1723 for (auto EB = Entries.begin(), EI = EB, EE = Entries.end(); EI != EE; ++EI) {
1724 const MachineInstr *Instr = EI->getInstr();
1725
1726 // Remove all values that are no longer live.
1727 size_t Index = std::distance(EB, EI);
1728 erase_if(OpenRanges, [&](OpenRange &R) { return R.first <= Index; });
1729
1730 // If we are dealing with a clobbering entry, this iteration will result in
1731 // a location list entry starting after the clobbering instruction.
1732 const MCSymbol *StartLabel =
1733 EI->isClobber() ? getLabelAfterInsn(Instr) : getLabelBeforeInsn(Instr);
1734 assert(StartLabel &&
1735 "Forgot label before/after instruction starting a range!");
1736
1737 const MCSymbol *EndLabel;
1738 if (std::next(EI) == Entries.end()) {
1739 const MachineBasicBlock &EndMBB = Asm->MF->back();
1740 EndLabel = Asm->MBBSectionRanges[EndMBB.getSectionID()].EndLabel;
1741 if (EI->isClobber())
1742 EndMI = EI->getInstr();
1743 }
1744 else if (std::next(EI)->isClobber())
1745 EndLabel = getLabelAfterInsn(std::next(EI)->getInstr());
1746 else
1747 EndLabel = getLabelBeforeInsn(std::next(EI)->getInstr());
1748 assert(EndLabel && "Forgot label after instruction ending a range!");
1749
1750 if (EI->isDbgValue())
1751 LLVM_DEBUG(dbgs() << "DotDebugLoc: " << *Instr << "\n");
1752
1753 // If this history map entry has a debug value, add that to the list of
1754 // open ranges and check if its location is valid for a single value
1755 // location.
1756 if (EI->isDbgValue()) {
1757 // Do not add undef debug values, as they are redundant information in
1758 // the location list entries. An undef debug results in an empty location
1759 // description. If there are any non-undef fragments then padding pieces
1760 // with empty location descriptions will automatically be inserted, and if
1761 // all fragments are undef then the whole location list entry is
1762 // redundant.
1763 if (!Instr->isUndefDebugValue()) {
1764 auto Value = getDebugLocValue(Instr);
1765 OpenRanges.emplace_back(EI->getEndIndex(), Value);
1766
1767 // TODO: Add support for single value fragment locations.
1768 if (Instr->getDebugExpression()->isFragment())
1769 isSafeForSingleLocation = false;
1770
1771 if (!StartDebugMI)
1772 StartDebugMI = Instr;
1773 } else {
1774 isSafeForSingleLocation = false;
1775 }
1776 }
1777
1778 // Location list entries with empty location descriptions are redundant
1779 // information in DWARF, so do not emit those.
1780 if (OpenRanges.empty())
1781 continue;
1782
1783 // Omit entries with empty ranges as they do not have any effect in DWARF.
1784 if (StartLabel == EndLabel) {
1785 LLVM_DEBUG(dbgs() << "Omitting location list entry with empty range.\n");
1786 continue;
1787 }
1788
1790 for (auto &R : OpenRanges)
1791 Values.push_back(R.second);
1792
1793 // With Basic block sections, it is posssible that the StartLabel and the
1794 // Instr are not in the same section. This happens when the StartLabel is
1795 // the function begin label and the dbg value appears in a basic block
1796 // that is not the entry. In this case, the range needs to be split to
1797 // span each individual section in the range from StartLabel to EndLabel.
1798 if (Asm->MF->hasBBSections() && StartLabel == Asm->getFunctionBegin() &&
1799 !Instr->getParent()->sameSection(&Asm->MF->front())) {
1800 for (const auto &[MBBSectionId, MBBSectionRange] :
1801 Asm->MBBSectionRanges) {
1802 if (Instr->getParent()->getSectionID() == MBBSectionId) {
1803 DebugLoc.emplace_back(MBBSectionRange.BeginLabel, EndLabel, Values);
1804 break;
1805 }
1806 DebugLoc.emplace_back(MBBSectionRange.BeginLabel,
1807 MBBSectionRange.EndLabel, Values);
1808 }
1809 } else {
1810 DebugLoc.emplace_back(StartLabel, EndLabel, Values);
1811 }
1812
1813 // Attempt to coalesce the ranges of two otherwise identical
1814 // DebugLocEntries.
1815 auto CurEntry = DebugLoc.rbegin();
1816 LLVM_DEBUG({
1817 dbgs() << CurEntry->getValues().size() << " Values:\n";
1818 for (auto &Value : CurEntry->getValues())
1819 Value.dump();
1820 dbgs() << "-----\n";
1821 });
1822
1823 auto PrevEntry = std::next(CurEntry);
1824 if (PrevEntry != DebugLoc.rend() && PrevEntry->MergeRanges(*CurEntry))
1825 DebugLoc.pop_back();
1826 }
1827
1828 if (!isSafeForSingleLocation ||
1829 !validThroughout(LScopes, StartDebugMI, EndMI, getInstOrdering()))
1830 return false;
1831
1832 if (DebugLoc.size() == 1)
1833 return true;
1834
1835 if (!Asm->MF->hasBBSections())
1836 return false;
1837
1838 // Check here to see if loclist can be merged into a single range. If not,
1839 // we must keep the split loclists per section. This does exactly what
1840 // MergeRanges does without sections. We don't actually merge the ranges
1841 // as the split ranges must be kept intact if this cannot be collapsed
1842 // into a single range.
1843 const MachineBasicBlock *RangeMBB = nullptr;
1844 if (DebugLoc[0].getBeginSym() == Asm->getFunctionBegin())
1845 RangeMBB = &Asm->MF->front();
1846 else
1847 RangeMBB = Entries.begin()->getInstr()->getParent();
1848 auto RangeIt = Asm->MBBSectionRanges.find(RangeMBB->getSectionID());
1849 assert(RangeIt != Asm->MBBSectionRanges.end() &&
1850 "Range MBB not found in MBBSectionRanges!");
1851 auto *CurEntry = DebugLoc.begin();
1852 auto *NextEntry = std::next(CurEntry);
1853 auto NextRangeIt = std::next(RangeIt);
1854 while (NextEntry != DebugLoc.end()) {
1855 if (NextRangeIt == Asm->MBBSectionRanges.end())
1856 return false;
1857 // CurEntry should end the current section and NextEntry should start
1858 // the next section and the Values must match for these two ranges to be
1859 // merged. Do not match the section label end if it is the entry block
1860 // section. This is because the end label for the Debug Loc and the
1861 // Function end label could be different.
1862 if ((RangeIt->second.EndLabel != Asm->getFunctionEnd() &&
1863 CurEntry->getEndSym() != RangeIt->second.EndLabel) ||
1864 NextEntry->getBeginSym() != NextRangeIt->second.BeginLabel ||
1865 CurEntry->getValues() != NextEntry->getValues())
1866 return false;
1867 RangeIt = NextRangeIt;
1868 NextRangeIt = std::next(RangeIt);
1869 CurEntry = NextEntry;
1870 NextEntry = std::next(CurEntry);
1871 }
1872 return true;
1873}
1874
1875DbgEntity *DwarfDebug::createConcreteEntity(DwarfCompileUnit &TheCU,
1876 LexicalScope &Scope,
1877 const DINode *Node,
1878 const DILocation *Location,
1879 const MCSymbol *Sym) {
1880 ensureAbstractEntityIsCreatedIfScoped(TheCU, Node, Scope.getScopeNode());
1881 if (isa<const DILocalVariable>(Node)) {
1882 ConcreteEntities.push_back(
1883 std::make_unique<DbgVariable>(cast<const DILocalVariable>(Node),
1884 Location));
1885 InfoHolder.addScopeVariable(&Scope,
1886 cast<DbgVariable>(ConcreteEntities.back().get()));
1887 } else if (isa<const DILabel>(Node)) {
1888 ConcreteEntities.push_back(
1889 std::make_unique<DbgLabel>(cast<const DILabel>(Node),
1890 Location, Sym));
1891 InfoHolder.addScopeLabel(&Scope,
1892 cast<DbgLabel>(ConcreteEntities.back().get()));
1893 }
1894 return ConcreteEntities.back().get();
1895}
1896
1897// Find variables for each lexical scope.
1898void DwarfDebug::collectEntityInfo(DwarfCompileUnit &TheCU,
1899 const DISubprogram *SP,
1900 DenseSet<InlinedEntity> &Processed) {
1901 // Grab the variable info that was squirreled away in the MMI side-table.
1902 collectVariableInfoFromMFTable(TheCU, Processed);
1903
1904 for (const auto &I : DbgValues) {
1905 InlinedEntity IV = I.first;
1906 if (Processed.count(IV))
1907 continue;
1908
1909 // Instruction ranges, specifying where IV is accessible.
1910 const auto &HistoryMapEntries = I.second;
1911
1912 // Try to find any non-empty variable location. Do not create a concrete
1913 // entity if there are no locations.
1914 if (!DbgValues.hasNonEmptyLocation(HistoryMapEntries))
1915 continue;
1916
1917 LexicalScope *Scope = nullptr;
1918 const DILocalVariable *LocalVar = cast<DILocalVariable>(IV.first);
1919 if (const DILocation *IA = IV.second)
1920 Scope = LScopes.findInlinedScope(LocalVar->getScope(), IA);
1921 else
1922 Scope = LScopes.findLexicalScope(LocalVar->getScope());
1923 // If variable scope is not found then skip this variable.
1924 if (!Scope)
1925 continue;
1926
1927 Processed.insert(IV);
1928 DbgVariable *RegVar = cast<DbgVariable>(createConcreteEntity(TheCU,
1929 *Scope, LocalVar, IV.second));
1930
1931 const MachineInstr *MInsn = HistoryMapEntries.front().getInstr();
1932 assert(MInsn->isDebugValue() && "History must begin with debug value");
1933
1934 // Check if there is a single DBG_VALUE, valid throughout the var's scope.
1935 // If the history map contains a single debug value, there may be an
1936 // additional entry which clobbers the debug value.
1937 size_t HistSize = HistoryMapEntries.size();
1938 bool SingleValueWithClobber =
1939 HistSize == 2 && HistoryMapEntries[1].isClobber();
1940 if (HistSize == 1 || SingleValueWithClobber) {
1941 const auto *End =
1942 SingleValueWithClobber ? HistoryMapEntries[1].getInstr() : nullptr;
1943 if (validThroughout(LScopes, MInsn, End, getInstOrdering())) {
1944 RegVar->emplace<Loc::Single>(MInsn);
1945 continue;
1946 }
1947 }
1948
1949 // Handle multiple DBG_VALUE instructions describing one variable.
1950 DebugLocStream::ListBuilder List(DebugLocs, TheCU, *Asm, *RegVar);
1951
1952 // Build the location list for this variable.
1954 bool isValidSingleLocation = buildLocationList(Entries, HistoryMapEntries);
1955
1956 // Check whether buildLocationList managed to merge all locations to one
1957 // that is valid throughout the variable's scope. If so, produce single
1958 // value location.
1959 if (isValidSingleLocation) {
1960 RegVar->emplace<Loc::Single>(Entries[0].getValues()[0]);
1961 continue;
1962 }
1963
1964 // If the variable has a DIBasicType, extract it. Basic types cannot have
1965 // unique identifiers, so don't bother resolving the type with the
1966 // identifier map.
1967 const DIBasicType *BT = dyn_cast<DIBasicType>(
1968 static_cast<const Metadata *>(LocalVar->getType()));
1969
1970 // Finalize the entry by lowering it into a DWARF bytestream.
1971 for (auto &Entry : Entries)
1972 Entry.finalize(*Asm, List, BT, TheCU);
1973 }
1974
1975 // For each InlinedEntity collected from DBG_LABEL instructions, convert to
1976 // DWARF-related DbgLabel.
1977 for (const auto &I : DbgLabels) {
1978 InlinedEntity IL = I.first;
1979 const MachineInstr *MI = I.second;
1980 if (MI == nullptr)
1981 continue;
1982
1983 LexicalScope *Scope = nullptr;
1984 const DILabel *Label = cast<DILabel>(IL.first);
1985 // The scope could have an extra lexical block file.
1986 const DILocalScope *LocalScope =
1987 Label->getScope()->getNonLexicalBlockFileScope();
1988 // Get inlined DILocation if it is inlined label.
1989 if (const DILocation *IA = IL.second)
1990 Scope = LScopes.findInlinedScope(LocalScope, IA);
1991 else
1992 Scope = LScopes.findLexicalScope(LocalScope);
1993 // If label scope is not found then skip this label.
1994 if (!Scope)
1995 continue;
1996
1997 Processed.insert(IL);
1998 /// At this point, the temporary label is created.
1999 /// Save the temporary label to DbgLabel entity to get the
2000 /// actually address when generating Dwarf DIE.
2002 createConcreteEntity(TheCU, *Scope, Label, IL.second, Sym);
2003 }
2004
2005 // Collect info for retained nodes.
2006 for (const DINode *DN : SP->getRetainedNodes()) {
2007 const auto *LS = getRetainedNodeScope(DN);
2008 if (isa<DILocalVariable>(DN) || isa<DILabel>(DN)) {
2009 if (!Processed.insert(InlinedEntity(DN, nullptr)).second)
2010 continue;
2011 LexicalScope *LexS = LScopes.findLexicalScope(LS);
2012 if (LexS)
2013 createConcreteEntity(TheCU, *LexS, DN, nullptr);
2014 } else {
2015 LocalDeclsPerLS[LS].insert(DN);
2016 }
2017 }
2018}
2019
2020// Process beginning of an instruction.
2022 const MachineFunction &MF = *MI->getMF();
2023 const auto *SP = MF.getFunction().getSubprogram();
2024 bool NoDebug =
2025 !SP || SP->getUnit()->getEmissionKind() == DICompileUnit::NoDebug;
2026
2027 // Delay slot support check.
2028 auto delaySlotSupported = [](const MachineInstr &MI) {
2029 if (!MI.isBundledWithSucc())
2030 return false;
2031 auto Suc = std::next(MI.getIterator());
2032 (void)Suc;
2033 // Ensure that delay slot instruction is successor of the call instruction.
2034 // Ex. CALL_INSTRUCTION {
2035 // DELAY_SLOT_INSTRUCTION }
2036 assert(Suc->isBundledWithPred() &&
2037 "Call bundle instructions are out of order");
2038 return true;
2039 };
2040
2041 // When describing calls, we need a label for the call instruction.
2042 if (!NoDebug && SP->areAllCallsDescribed() &&
2043 MI->isCandidateForAdditionalCallInfo(MachineInstr::AnyInBundle) &&
2044 (!MI->hasDelaySlot() || delaySlotSupported(*MI))) {
2046 bool IsTail = TII->isTailCall(*MI);
2047 // For tail calls, we need the address of the branch instruction for
2048 // DW_AT_call_pc.
2049 if (IsTail)
2051 // For non-tail calls, we need the return address for the call for
2052 // DW_AT_call_return_pc. Under GDB tuning, this information is needed for
2053 // tail calls as well.
2055 }
2056
2058 if (!CurMI)
2059 return;
2060
2061 if (NoDebug)
2062 return;
2063
2064 // Check if source location changes, but ignore DBG_VALUE and CFI locations.
2065 // If the instruction is part of the function frame setup code, do not emit
2066 // any line record, as there is no correspondence with any user code.
2067 if (MI->isMetaInstruction() || MI->getFlag(MachineInstr::FrameSetup))
2068 return;
2069 const DebugLoc &DL = MI->getDebugLoc();
2070 unsigned Flags = 0;
2071
2072 if (MI->getFlag(MachineInstr::FrameDestroy) && DL) {
2073 const MachineBasicBlock *MBB = MI->getParent();
2074 if (MBB && (MBB != EpilogBeginBlock)) {
2075 // First time FrameDestroy has been seen in this basic block
2078 }
2079 }
2080
2081 auto RecordSourceLine = [this](auto &DL, auto Flags) {
2082 SmallString<128> LocationString;
2083 if (Asm->OutStreamer->isVerboseAsm()) {
2084 raw_svector_ostream OS(LocationString);
2085 DL.print(OS);
2086 }
2087 recordSourceLine(DL.getLine(), DL.getCol(), DL.getScope(), Flags,
2088 LocationString);
2089 };
2090
2091 // When we emit a line-0 record, we don't update PrevInstLoc; so look at
2092 // the last line number actually emitted, to see if it was line 0.
2093 unsigned LastAsmLine =
2094 Asm->OutStreamer->getContext().getCurrentDwarfLoc().getLine();
2095
2096 // There may be a mixture of scopes using and not using Key Instructions.
2097 // Not-Key-Instructions functions inlined into Key Instructions functions
2098 // should use not-key is_stmt handling. Key Instructions functions inlined
2099 // into Not-Key-Instructions functions should use Key Instructions is_stmt
2100 // handling.
2101 bool ScopeUsesKeyInstructions =
2103 DL->getScope()->getSubprogram()->getKeyInstructionsEnabled();
2104
2105 bool IsKey = false;
2106 if (ScopeUsesKeyInstructions && DL && DL.getLine())
2107 IsKey = KeyInstructions.contains(MI);
2108
2109 if (!DL && MI == PrologEndLoc) {
2110 // In rare situations, we might want to place the end of the prologue
2111 // somewhere that doesn't have a source location already. It should be in
2112 // the entry block.
2113 assert(MI->getParent() == &*MI->getMF()->begin());
2114 recordSourceLine(SP->getScopeLine(), 0, SP,
2116 return;
2117 }
2118
2119 bool PrevInstInSameSection =
2120 (!PrevInstBB ||
2121 PrevInstBB->getSectionID() == MI->getParent()->getSectionID());
2122 bool ForceIsStmt = ForceIsStmtInstrs.contains(MI);
2123 if (PrevInstInSameSection && !ForceIsStmt && DL.isSameSourceLocation(PrevInstLoc)) {
2124 // If we have an ongoing unspecified location, nothing to do here.
2125 if (!DL)
2126 return;
2127
2128 // Skip this if the instruction is Key, else we might accidentally miss an
2129 // is_stmt.
2130 if (!IsKey) {
2131 // We have an explicit location, same as the previous location.
2132 // But we might be coming back to it after a line 0 record.
2133 if ((LastAsmLine == 0 && DL.getLine() != 0) || Flags) {
2134 // Reinstate the source location but not marked as a statement.
2135 RecordSourceLine(DL, Flags);
2136 }
2137 return;
2138 }
2139 }
2140
2141 if (!DL) {
2142 // FIXME: We could assert that `DL.getKind() != DebugLocKind::Temporary`
2143 // here, or otherwise record any temporary DebugLocs seen to ensure that
2144 // transient compiler-generated instructions aren't leaking their DLs to
2145 // other instructions.
2146 // We have an unspecified location, which might want to be line 0.
2147 // If we have already emitted a line-0 record, don't repeat it.
2148 if (LastAsmLine == 0)
2149 return;
2150 // If user said Don't Do That, don't do that.
2152 return;
2153 // See if we have a reason to emit a line-0 record now.
2154 // Reasons to emit a line-0 record include:
2155 // - User asked for it (UnknownLocations).
2156 // - Instruction has a label, so it's referenced from somewhere else,
2157 // possibly debug information; we want it to have a source location.
2158 // - Instruction is at the top of a block; we don't want to inherit the
2159 // location from the physically previous (maybe unrelated) block.
2160 if (UnknownLocations == Enable || PrevLabel ||
2161 (PrevInstBB && PrevInstBB != MI->getParent())) {
2162 // Preserve the file and column numbers, if we can, to save space in
2163 // the encoded line table.
2164 // Do not update PrevInstLoc, it remembers the last non-0 line.
2165 const MDNode *Scope = nullptr;
2166 unsigned Column = 0;
2167 if (PrevInstLoc) {
2168 Scope = PrevInstLoc.getScope();
2169 Column = PrevInstLoc.getCol();
2170 }
2171 recordSourceLine(/*Line=*/0, Column, Scope, /*Flags=*/0);
2172 }
2173 return;
2174 }
2175
2176 // We have an explicit location, different from the previous location.
2177 // Don't repeat a line-0 record, but otherwise emit the new location.
2178 // (The new location might be an explicit line 0, which we do emit.)
2179 if (DL.getLine() == 0 && LastAsmLine == 0)
2180 return;
2181 if (MI == PrologEndLoc) {
2183 PrologEndLoc = nullptr;
2184 }
2185
2186 if (ScopeUsesKeyInstructions) {
2187 if (IsKey)
2188 Flags |= DWARF2_FLAG_IS_STMT;
2189 } else {
2190 // If the line changed, we call that a new statement; unless we went to
2191 // line 0 and came back, in which case it is not a new statement.
2192 unsigned OldLine = PrevInstLoc ? PrevInstLoc.getLine() : LastAsmLine;
2193 if (DL.getLine() && (DL.getLine() != OldLine || ForceIsStmt))
2194 Flags |= DWARF2_FLAG_IS_STMT;
2195 }
2196
2197 RecordSourceLine(DL, Flags);
2198
2199 // If we're not at line 0, remember this location.
2200 if (DL.getLine())
2201 PrevInstLoc = DL;
2202}
2203
2204static std::pair<const MachineInstr *, bool>
2206 // First known non-DBG_VALUE and non-frame setup location marks
2207 // the beginning of the function body.
2208 const auto &TII = *MF->getSubtarget().getInstrInfo();
2209 const MachineInstr *NonTrivialInst = nullptr;
2210 const Function &F = MF->getFunction();
2211
2212 // Some instructions may be inserted into prologue after this function. Must
2213 // keep prologue for these cases.
2214 bool IsEmptyPrologue =
2215 !(F.hasPrologueData() || F.getMetadata(LLVMContext::MD_func_sanitize));
2216
2217 // Helper lambda to examine each instruction and potentially return it
2218 // as the prologue_end point.
2219 auto ExamineInst = [&](const MachineInstr &MI)
2220 -> std::optional<std::pair<const MachineInstr *, bool>> {
2221 // Is this instruction trivial data shuffling or frame-setup?
2222 bool isCopy = (TII.isCopyInstr(MI) ? true : false);
2223 bool isTrivRemat = TII.isTriviallyReMaterializable(MI);
2224 bool isFrameSetup = MI.getFlag(MachineInstr::FrameSetup);
2225
2226 if (!isFrameSetup && MI.getDebugLoc()) {
2227 // Scan forward to try to find a non-zero line number. The
2228 // prologue_end marks the first breakpoint in the function after the
2229 // frame setup, and a compiler-generated line 0 location is not a
2230 // meaningful breakpoint. If none is found, return the first
2231 // location after the frame setup.
2232 if (MI.getDebugLoc().getLine())
2233 return std::make_pair(&MI, IsEmptyPrologue);
2234 }
2235
2236 // Keep track of the first "non-trivial" instruction seen, i.e. anything
2237 // that doesn't involve shuffling data around or is a frame-setup.
2238 if (!isCopy && !isTrivRemat && !isFrameSetup && !NonTrivialInst)
2239 NonTrivialInst = &MI;
2240
2241 IsEmptyPrologue = false;
2242 return std::nullopt;
2243 };
2244
2245 // Examine all the instructions at the start of the function. This doesn't
2246 // necessarily mean just the entry block: unoptimised code can fall-through
2247 // into an initial loop, and it makes sense to put the initial breakpoint on
2248 // the first instruction of such a loop. However, if we pass branches, we're
2249 // better off synthesising an early prologue_end.
2250 auto CurBlock = MF->begin();
2251 auto CurInst = CurBlock->begin();
2252
2253 // Find the initial instruction, we're guaranteed one by the caller, but not
2254 // which block it's in.
2255 while (CurBlock->empty())
2256 CurInst = (++CurBlock)->begin();
2257 assert(CurInst != CurBlock->end());
2258
2259 // Helper function for stepping through the initial sequence of
2260 // unconditionally executed instructions.
2261 auto getNextInst = [&CurBlock, &CurInst, MF]() -> bool {
2262 // We've reached the end of the block. Did we just look at a terminator?
2263 if (CurInst->isTerminator()) {
2264 // Some kind of "real" control flow is occurring. At the very least
2265 // we would have to start exploring the CFG, a good signal that the
2266 // prologue is over.
2267 return false;
2268 }
2269
2270 // If we've already fallen through into a loop, don't fall through
2271 // further, use a backup-location.
2272 if (CurBlock->pred_size() > 1)
2273 return false;
2274
2275 // Fall-through from entry to the next block. This is common at -O0 when
2276 // there's no initialisation in the function. Bail if we're also at the
2277 // end of the function, or the remaining blocks have no instructions.
2278 // Skip empty blocks, in rare cases the entry can be empty, and
2279 // other optimisations may add empty blocks that the control flow falls
2280 // through.
2281 do {
2282 ++CurBlock;
2283 if (CurBlock == MF->end())
2284 return false;
2285 } while (CurBlock->empty());
2286 CurInst = CurBlock->begin();
2287 return true;
2288 };
2289
2290 while (true) {
2291 // Check whether this non-meta instruction a good position for prologue_end.
2292 if (!CurInst->isMetaInstruction()) {
2293 auto FoundInst = ExamineInst(*CurInst);
2294 if (FoundInst)
2295 return *FoundInst;
2296 }
2297
2298 // Try to continue searching, but use a backup-location if substantive
2299 // computation is happening.
2300 auto NextInst = std::next(CurInst);
2301 if (NextInst != CurInst->getParent()->end()) {
2302 // Continue examining the current block.
2303 CurInst = NextInst;
2304 continue;
2305 }
2306
2307 if (!getNextInst())
2308 break;
2309 }
2310
2311 // We couldn't find any source-location, suggesting all meaningful information
2312 // got optimised away. Set the prologue_end to be the first non-trivial
2313 // instruction, which will get the scope line number. This is better than
2314 // nothing.
2315 // Only do this in the entry block, as we'll be giving it the scope line for
2316 // the function. Return IsEmptyPrologue==true if we've picked the first
2317 // instruction.
2318 if (NonTrivialInst && NonTrivialInst->getParent() == &*MF->begin()) {
2319 IsEmptyPrologue = NonTrivialInst == &*MF->begin()->begin();
2320 return std::make_pair(NonTrivialInst, IsEmptyPrologue);
2321 }
2322
2323 // If the entry path is empty, just don't have a prologue_end at all.
2324 return std::make_pair(nullptr, IsEmptyPrologue);
2325}
2326
2327/// Register a source line with debug info. Returns the unique label that was
2328/// emitted and which provides correspondence to the source line list.
2329static void recordSourceLine(AsmPrinter &Asm, unsigned Line, unsigned Col,
2330 const MDNode *S, unsigned Flags, unsigned CUID,
2331 uint16_t DwarfVersion,
2332 ArrayRef<std::unique_ptr<DwarfCompileUnit>> DCUs,
2333 StringRef Comment = {}) {
2334 StringRef Fn;
2335 unsigned FileNo = 1;
2336 unsigned Discriminator = 0;
2337 if (auto *Scope = cast_or_null<DIScope>(S)) {
2338 Fn = Scope->getFilename();
2339 if (Line != 0 && DwarfVersion >= 4)
2340 if (auto *LBF = dyn_cast<DILexicalBlockFile>(Scope))
2341 Discriminator = LBF->getDiscriminator();
2342
2343 FileNo = static_cast<DwarfCompileUnit &>(*DCUs[CUID])
2344 .getOrCreateSourceID(Scope->getFile());
2345 }
2346 Asm.OutStreamer->emitDwarfLocDirective(FileNo, Line, Col, Flags, 0,
2347 Discriminator, Fn, Comment);
2348}
2349
2350const MachineInstr *
2352 // Don't deal with functions that have no instructions.
2353 if (llvm::all_of(MF, [](const MachineBasicBlock &MBB) { return MBB.empty(); }))
2354 return nullptr;
2355
2356 std::pair<const MachineInstr *, bool> PrologEnd = findPrologueEndLoc(&MF);
2357 const MachineInstr *PrologEndLoc = PrologEnd.first;
2358 bool IsEmptyPrologue = PrologEnd.second;
2359
2360 // If the prolog is empty, no need to generate scope line for the proc.
2361 if (IsEmptyPrologue) {
2362 // If there's nowhere to put a prologue_end flag, emit a scope line in case
2363 // there are simply no source locations anywhere in the function.
2364 if (PrologEndLoc) {
2365 // Avoid trying to assign prologue_end to a line-zero location.
2366 // Instructions with no DebugLoc at all are fine, they'll be given the
2367 // scope line nuumber.
2368 const DebugLoc &DL = PrologEndLoc->getDebugLoc();
2369 if (!DL || DL->getLine() != 0)
2370 return PrologEndLoc;
2371
2372 // Later, don't place the prologue_end flag on this line-zero location.
2373 PrologEndLoc = nullptr;
2374 }
2375 }
2376
2377 // Ensure the compile unit is created if the function is called before
2378 // beginFunction().
2380 (void)getOrCreateDwarfCompileUnit(SP->getUnit());
2381 // We'd like to list the prologue as "not statements" but GDB behaves
2382 // poorly if we do that. Revisit this with caution/GDB (7.5+) testing.
2383 ::recordSourceLine(*Asm, SP->getScopeLine(), 0, SP, DWARF2_FLAG_IS_STMT,
2384 CUID, getDwarfVersion(), getUnits());
2385 return PrologEndLoc;
2386}
2387
2388void DwarfDebug::computeKeyInstructions(const MachineFunction *MF) {
2389 // New function - reset KeyInstructions.
2390 KeyInstructions.clear();
2391
2392 // The current candidate is_stmt instructions for each source atom.
2393 // Map {(InlinedAt, Group): (Rank, Instructions)}.
2394 // NOTE: Anecdotally, for a large C++ blob, 99% of the instruction
2395 // SmallVectors contain 2 or fewer elements; use 2 inline elements.
2397 std::pair<uint8_t, SmallVector<const MachineInstr *, 2>>>
2398 GroupCandidates;
2399
2400 const auto &TII = *MF->getSubtarget().getInstrInfo();
2401
2402 // For each instruction:
2403 // * Skip insts without DebugLoc, AtomGroup or AtomRank, and line zeros.
2404 // * Check if insts in this group have been seen already in GroupCandidates.
2405 // * If this instr rank is equal, add this instruction to GroupCandidates.
2406 // Remove existing instructions from GroupCandidates if they have the
2407 // same parent.
2408 // * If this instr rank is higher (lower precedence), ignore it.
2409 // * If this instr rank is lower (higher precedence), erase existing
2410 // instructions from GroupCandidates and add this one.
2411 //
2412 // Then insert each GroupCandidates instruction into KeyInstructions.
2413
2414 for (auto &MBB : *MF) {
2415 // Rather than apply is_stmt directly to Key Instructions, we "float"
2416 // is_stmt up to the 1st instruction with the same line number in a
2417 // contiguous block. That instruction is called the "buoy". The
2418 // buoy gets reset if we encouner an instruction with an atom
2419 // group.
2420 const MachineInstr *Buoy = nullptr;
2421 // The atom group number associated with Buoy which may be 0 if we haven't
2422 // encountered an atom group yet in this blob of instructions with the same
2423 // line number.
2424 uint64_t BuoyAtom = 0;
2425
2426 for (auto &MI : MBB) {
2427 if (MI.isMetaInstruction())
2428 continue;
2429
2430 const DILocation *Loc = MI.getDebugLoc().get();
2431 if (!Loc || !Loc->getLine())
2432 continue;
2433
2434 // Reset the Buoy to this instruction if it has a different line number.
2435 if (!Buoy || Buoy->getDebugLoc().getLine() != Loc->getLine()) {
2436 Buoy = &MI;
2437 BuoyAtom = 0; // Set later when we know which atom the buoy is used by.
2438 }
2439
2440 // Call instructions are handled specially - we always mark them as key
2441 // regardless of atom info.
2442 bool IsCallLike = MI.isCall() || TII.isTailCall(MI);
2443 if (IsCallLike) {
2444 // Calls are always key. Put the buoy (may not be the call) into
2445 // KeyInstructions directly rather than the candidate map to avoid it
2446 // being erased (and we may not have a group number for the call).
2447 KeyInstructions.insert(Buoy);
2448
2449 // Avoid floating any future is_stmts up to the call.
2450 Buoy = nullptr;
2451 BuoyAtom = 0;
2452
2453 if (!Loc->getAtomGroup() || !Loc->getAtomRank())
2454 continue;
2455 }
2456
2457 auto *InlinedAt = Loc->getInlinedAt();
2458 uint64_t Group = Loc->getAtomGroup();
2459 uint8_t Rank = Loc->getAtomRank();
2460 if (!Group || !Rank)
2461 continue;
2462
2463 // Don't let is_stmts float past instructions from different source atoms.
2464 if (BuoyAtom && BuoyAtom != Group) {
2465 Buoy = &MI;
2466 BuoyAtom = Group;
2467 }
2468
2469 auto &[CandidateRank, CandidateInsts] =
2470 GroupCandidates[{InlinedAt, Group}];
2471
2472 // If CandidateRank is zero then CandidateInsts should be empty: there
2473 // are no other candidates for this group yet. If CandidateRank is nonzero
2474 // then CandidateInsts shouldn't be empty: we've got existing candidate
2475 // instructions.
2476 assert((CandidateRank == 0 && CandidateInsts.empty()) ||
2477 (CandidateRank != 0 && !CandidateInsts.empty()));
2478
2479 assert(Rank && "expected nonzero rank");
2480 // If we've seen other instructions in this group with higher precedence
2481 // (lower nonzero rank), don't add this one as a candidate.
2482 if (CandidateRank && CandidateRank < Rank)
2483 continue;
2484
2485 // If we've seen other instructions in this group of the same rank,
2486 // discard any from this block (keeping the others). Else if we've
2487 // seen other instructions in this group of lower precedence (higher
2488 // rank), discard them all.
2489 if (CandidateRank == Rank)
2490 llvm::remove_if(CandidateInsts, [&MI](const MachineInstr *Candidate) {
2491 return MI.getParent() == Candidate->getParent();
2492 });
2493 else if (CandidateRank > Rank)
2494 CandidateInsts.clear();
2495
2496 if (Buoy) {
2497 // Add this candidate.
2498 CandidateInsts.push_back(Buoy);
2499 CandidateRank = Rank;
2500
2501 assert(!BuoyAtom || BuoyAtom == Loc->getAtomGroup());
2502 BuoyAtom = Loc->getAtomGroup();
2503 } else {
2504 // Don't add calls, because they've been dealt with already. This means
2505 // CandidateInsts might now be empty - handle that.
2506 assert(IsCallLike);
2507 if (CandidateInsts.empty())
2508 CandidateRank = 0;
2509 }
2510 }
2511 }
2512
2513 for (const auto &[_, Insts] : GroupCandidates.values())
2514 for (auto *I : Insts)
2515 KeyInstructions.insert(I);
2516}
2517
2518/// For the function \p MF, finds the set of instructions which may represent a
2519/// change in line number from one or more of the preceding MBBs. Stores the
2520/// resulting set of instructions, which should have is_stmt set, in
2521/// ForceIsStmtInstrs.
2522void DwarfDebug::findForceIsStmtInstrs(const MachineFunction *MF) {
2523 ForceIsStmtInstrs.clear();
2524
2525 // For this function, we try to find MBBs where the last source line in every
2526 // block predecessor matches the first line seen in the block itself; for
2527 // every such MBB, we set is_stmt=false on the first line in the block, and
2528 // for every other block we set is_stmt=true on the first line.
2529 // For example, if we have the block %bb.3, which has 2 predecesors %bb.1 and
2530 // %bb.2:
2531 // bb.1:
2532 // $r3 = MOV64ri 12, debug-location !DILocation(line: 4)
2533 // JMP %bb.3, debug-location !DILocation(line: 5)
2534 // bb.2:
2535 // $r3 = MOV64ri 24, debug-location !DILocation(line: 5)
2536 // JMP %bb.3
2537 // bb.3:
2538 // $r2 = MOV64ri 1
2539 // $r1 = ADD $r2, $r3, debug-location !DILocation(line: 5)
2540 // When we examine %bb.3, we first check to see if it contains any
2541 // instructions with debug locations, and select the first such instruction;
2542 // in this case, the ADD, with line=5. We then examine both of its
2543 // predecessors to see what the last debug-location in them is. For each
2544 // predecessor, if they do not contain any debug-locations, or if the last
2545 // debug-location before jumping to %bb.3 does not have line=5, then the ADD
2546 // in %bb.3 must use IsStmt. In this case, all predecessors have a
2547 // debug-location with line=5 as the last debug-location before jumping to
2548 // %bb.3, so we do not set is_stmt for the ADD instruction - we know that
2549 // whichever MBB we have arrived from, the line has not changed.
2550
2551 const auto *TII = MF->getSubtarget().getInstrInfo();
2552
2553 // We only need to the predecessors of MBBs that could have is_stmt set by
2554 // this logic.
2555 SmallDenseSet<MachineBasicBlock *, 4> PredMBBsToExamine;
2556 SmallDenseMap<MachineBasicBlock *, MachineInstr *> PotentialIsStmtMBBInstrs;
2557 // We use const_cast even though we won't actually modify MF, because some
2558 // methods we need take a non-const MBB.
2559 for (auto &MBB : *const_cast<MachineFunction *>(MF)) {
2560 if (MBB.empty() || MBB.pred_empty())
2561 continue;
2562 for (auto &MI : MBB) {
2563 if (MI.getDebugLoc() && MI.getDebugLoc()->getLine()) {
2564 PredMBBsToExamine.insert_range(MBB.predecessors());
2565 PotentialIsStmtMBBInstrs.insert({&MBB, &MI});
2566 break;
2567 }
2568 }
2569 }
2570
2571 // For each predecessor MBB, we examine the last line seen before each branch
2572 // or logical fallthrough. We use analyzeBranch to handle cases where
2573 // different branches have different outgoing lines (i.e. if there are
2574 // multiple branches that each have their own source location); otherwise we
2575 // just use the last line in the block.
2576 for (auto *MBB : PredMBBsToExamine) {
2577 auto CheckMBBEdge = [&](MachineBasicBlock *Succ, unsigned OutgoingLine) {
2578 auto MBBInstrIt = PotentialIsStmtMBBInstrs.find(Succ);
2579 if (MBBInstrIt == PotentialIsStmtMBBInstrs.end())
2580 return;
2581 MachineInstr *MI = MBBInstrIt->second;
2582 if (MI->getDebugLoc()->getLine() == OutgoingLine)
2583 return;
2584 PotentialIsStmtMBBInstrs.erase(MBBInstrIt);
2585 ForceIsStmtInstrs.insert(MI);
2586 };
2587 // If this block is empty, we conservatively assume that its fallthrough
2588 // successor needs is_stmt; we could check MBB's predecessors to see if it
2589 // has a consistent entry line, but this seems unlikely to be worthwhile.
2590 if (MBB->empty()) {
2591 for (auto *Succ : MBB->successors())
2592 CheckMBBEdge(Succ, 0);
2593 continue;
2594 }
2595 // If MBB has no successors that are in the "potential" set, due to one or
2596 // more of them having confirmed is_stmt, we can skip this check early.
2597 if (none_of(MBB->successors(), [&](auto *SuccMBB) {
2598 return PotentialIsStmtMBBInstrs.contains(SuccMBB);
2599 }))
2600 continue;
2601 // If we can't determine what DLs this branch's successors use, just treat
2602 // all the successors as coming from the last DebugLoc.
2604 auto MIIt = MBB->rbegin();
2605 {
2606 MachineBasicBlock *TBB = nullptr, *FBB = nullptr;
2608 bool AnalyzeFailed = TII->analyzeBranch(*MBB, TBB, FBB, Cond);
2609 // For a conditional branch followed by unconditional branch where the
2610 // unconditional branch has a DebugLoc, that loc is the outgoing loc to
2611 // the the false destination only; otherwise, both destinations share an
2612 // outgoing loc.
2613 if (!AnalyzeFailed && !Cond.empty() && FBB != nullptr &&
2614 MBB->back().getDebugLoc() && MBB->back().getDebugLoc()->getLine()) {
2615 unsigned FBBLine = MBB->back().getDebugLoc()->getLine();
2616 assert(MIIt->isBranch() && "Bad result from analyzeBranch?");
2617 CheckMBBEdge(FBB, FBBLine);
2618 ++MIIt;
2619 SuccessorBBs.push_back(TBB);
2620 } else {
2621 // For all other cases, all successors share the last outgoing DebugLoc.
2622 SuccessorBBs.assign(MBB->succ_begin(), MBB->succ_end());
2623 }
2624 }
2625
2626 // If we don't find an outgoing loc, this block will start with a line 0.
2627 // It is possible that we have a block that has no DebugLoc, but acts as a
2628 // simple passthrough between two blocks that end and start with the same
2629 // line, e.g.:
2630 // bb.1:
2631 // JMP %bb.2, debug-location !10
2632 // bb.2:
2633 // JMP %bb.3
2634 // bb.3:
2635 // $r1 = ADD $r2, $r3, debug-location !10
2636 // If these blocks were merged into a single block, we would not attach
2637 // is_stmt to the ADD, but with this logic that only checks the immediate
2638 // predecessor, we will; we make this tradeoff because doing a full dataflow
2639 // analysis would be expensive, and these situations are probably not common
2640 // enough for this to be worthwhile.
2641 unsigned LastLine = 0;
2642 while (MIIt != MBB->rend()) {
2643 if (auto DL = MIIt->getDebugLoc(); DL && DL->getLine()) {
2644 LastLine = DL->getLine();
2645 break;
2646 }
2647 ++MIIt;
2648 }
2649 for (auto *Succ : SuccessorBBs)
2650 CheckMBBEdge(Succ, LastLine);
2651 }
2652}
2653
2654// Gather pre-function debug information. Assumes being called immediately
2655// after the function entry point has been emitted.
2657 CurFn = MF;
2658
2659 auto *SP = MF->getFunction().getSubprogram();
2660 assert(LScopes.empty() || SP == LScopes.getCurrentFunctionScope()->getScopeNode());
2661 if (SP->getUnit()->getEmissionKind() == DICompileUnit::NoDebug)
2662 return;
2663
2664 DwarfCompileUnit &CU = getOrCreateDwarfCompileUnit(SP->getUnit());
2665 FunctionLineTableLabel = CU.emitFuncLineTableOffsets()
2666 ? Asm->OutStreamer->emitLineTableLabel()
2667 : nullptr;
2668
2669 Asm->OutStreamer->getContext().setDwarfCompileUnitID(
2671
2672 // Record beginning of function.
2674 *MF, Asm->OutStreamer->getContext().getDwarfCompileUnitID());
2675
2676 // Run both `findForceIsStmtInstrs` and `computeKeyInstructions` because
2677 // Not-Key-Instructions functions may be inlined into Key Instructions
2678 // functions and vice versa.
2680 computeKeyInstructions(MF);
2681 findForceIsStmtInstrs(MF);
2682}
2683
2684unsigned
2686 // Set DwarfDwarfCompileUnitID in MCContext to the Compile Unit this function
2687 // belongs to so that we add to the correct per-cu line table in the
2688 // non-asm case.
2689 if (Asm->OutStreamer->hasRawTextSupport())
2690 // Use a single line table if we are generating assembly.
2691 return 0;
2692 else
2693 return CU.getUniqueID();
2694}
2695
2697 const auto &CURanges = CU->getRanges();
2698 auto &LineTable = Asm->OutStreamer->getContext().getMCDwarfLineTable(
2700 // Add the last range label for the given CU.
2701 LineTable.getMCLineSections().addEndEntry(
2702 const_cast<MCSymbol *>(CURanges.back().End));
2703}
2704
2706 // If we don't have a subprogram for this function then there will be a hole
2707 // in the range information. Keep note of this by setting the previously used
2708 // section to nullptr.
2709 // Terminate the pending line table.
2710 if (PrevCU)
2711 terminateLineTable(PrevCU);
2712 PrevCU = nullptr;
2713 CurFn = nullptr;
2714}
2715
2716// Gather and emit post-function debug information.
2718 const Function &F = MF->getFunction();
2719 const DISubprogram *SP = F.getSubprogram();
2720
2721 assert(CurFn == MF &&
2722 "endFunction should be called with the same function as beginFunction");
2723
2724 // Set DwarfDwarfCompileUnitID in MCContext to default value.
2725 Asm->OutStreamer->getContext().setDwarfCompileUnitID(0);
2726
2727 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
2728 assert(!FnScope || SP == FnScope->getScopeNode());
2729 DwarfCompileUnit &TheCU = getOrCreateDwarfCompileUnit(SP->getUnit());
2730 if (TheCU.getCUNode()->isDebugDirectivesOnly()) {
2731 PrevLabel = nullptr;
2732 CurFn = nullptr;
2733 return;
2734 }
2735
2736 DenseSet<InlinedEntity> Processed;
2737 collectEntityInfo(TheCU, SP, Processed);
2738
2739 // Add the range of this function to the list of ranges for the CU.
2740 // With basic block sections, add ranges for all basic block sections.
2741 for (const auto &R : Asm->MBBSectionRanges)
2742 TheCU.addRange({R.second.BeginLabel, R.second.EndLabel});
2743
2744 // Under -gmlt, skip building the subprogram if there are no inlined
2745 // subroutines inside it. But with -fdebug-info-for-profiling, the subprogram
2746 // is still needed as we need its source location.
2747 if (!TheCU.getCUNode()->getDebugInfoForProfiling() &&
2749 LScopes.getAbstractScopesList().empty() && !IsDarwin) {
2750 for (const auto &R : Asm->MBBSectionRanges)
2751 addArangeLabel(SymbolCU(&TheCU, R.second.BeginLabel));
2752
2753 assert(InfoHolder.getScopeVariables().empty());
2754 PrevLabel = nullptr;
2755 CurFn = nullptr;
2756 return;
2757 }
2758
2759#ifndef NDEBUG
2760 size_t NumAbstractSubprograms = LScopes.getAbstractScopesList().size();
2761#endif
2762 for (LexicalScope *AScope : LScopes.getAbstractScopesList()) {
2763 const auto *SP = cast<DISubprogram>(AScope->getScopeNode());
2764 for (const DINode *DN : SP->getRetainedNodes()) {
2765 const auto *LS = getRetainedNodeScope(DN);
2766 // Ensure LexicalScope is created for the scope of this node.
2767 auto *LexS = LScopes.getOrCreateAbstractScope(LS);
2768 assert(LexS && "Expected the LexicalScope to be created.");
2769 if (isa<DILocalVariable>(DN) || isa<DILabel>(DN)) {
2770 // Collect info for variables/labels that were optimized out.
2771 if (!Processed.insert(InlinedEntity(DN, nullptr)).second ||
2772 TheCU.getExistingAbstractEntity(DN))
2773 continue;
2774 TheCU.createAbstractEntity(DN, LexS);
2775 } else {
2776 // Remember the node if this is a local declarations.
2777 LocalDeclsPerLS[LS].insert(DN);
2778 }
2779 assert(
2780 LScopes.getAbstractScopesList().size() == NumAbstractSubprograms &&
2781 "getOrCreateAbstractScope() inserted an abstract subprogram scope");
2782 }
2783 constructAbstractSubprogramScopeDIE(TheCU, AScope);
2784 }
2785
2786 ProcessedSPNodes.insert(SP);
2787 DIE &ScopeDIE =
2788 TheCU.constructSubprogramScopeDIE(SP, F, FnScope, FunctionLineTableLabel);
2789 if (auto *SkelCU = TheCU.getSkeleton())
2790 if (!LScopes.getAbstractScopesList().empty() &&
2792 SkelCU->constructSubprogramScopeDIE(SP, F, FnScope,
2793 FunctionLineTableLabel);
2794
2795 FunctionLineTableLabel = nullptr;
2796
2797 // Construct call site entries.
2798 constructCallSiteEntryDIEs(*SP, TheCU, ScopeDIE, *MF);
2799
2800 // Clear debug info
2801 // Ownership of DbgVariables is a bit subtle - ScopeVariables owns all the
2802 // DbgVariables except those that are also in AbstractVariables (since they
2803 // can be used cross-function)
2804 InfoHolder.getScopeVariables().clear();
2805 InfoHolder.getScopeLabels().clear();
2806 LocalDeclsPerLS.clear();
2807 PrevLabel = nullptr;
2808 CurFn = nullptr;
2809}
2810
2811// Register a source line with debug info. Returns the unique label that was
2812// emitted and which provides correspondence to the source line list.
2813void DwarfDebug::recordSourceLine(unsigned Line, unsigned Col, const MDNode *S,
2814 unsigned Flags, StringRef Location) {
2815 ::recordSourceLine(*Asm, Line, Col, S, Flags,
2816 Asm->OutStreamer->getContext().getDwarfCompileUnitID(),
2817 getDwarfVersion(), getUnits(), Location);
2818}
2819
2820//===----------------------------------------------------------------------===//
2821// Emit Methods
2822//===----------------------------------------------------------------------===//
2823
2824// Emit the debug info section.
2825void DwarfDebug::emitDebugInfo() {
2826 DwarfFile &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
2827 Holder.emitUnits(/* UseOffsets */ false);
2828}
2829
2830// Emit the abbreviation section.
2831void DwarfDebug::emitAbbreviations() {
2832 DwarfFile &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
2833
2834 Holder.emitAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevSection());
2835}
2836
2837void DwarfDebug::emitStringOffsetsTableHeader() {
2838 DwarfFile &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
2840 *Asm, Asm->getObjFileLowering().getDwarfStrOffSection(),
2841 Holder.getStringOffsetsStartSym());
2842}
2843
2844template <typename AccelTableT>
2845void DwarfDebug::emitAccel(AccelTableT &Accel, MCSection *Section,
2846 StringRef TableName) {
2847 Asm->OutStreamer->switchSection(Section);
2848
2849 // Emit the full data.
2850 emitAppleAccelTable(Asm, Accel, TableName, Section->getBeginSymbol());
2851}
2852
2853void DwarfDebug::emitAccelDebugNames() {
2854 // Don't emit anything if we have no compilation units to index.
2855 if (getUnits().empty())
2856 return;
2857
2858 emitDWARF5AccelTable(Asm, AccelDebugNames, *this, getUnits());
2859}
2860
2861// Emit visible names into a hashed accelerator table section.
2862void DwarfDebug::emitAccelNames() {
2863 emitAccel(AccelNames, Asm->getObjFileLowering().getDwarfAccelNamesSection(),
2864 "Names");
2865}
2866
2867// Emit objective C classes and categories into a hashed accelerator table
2868// section.
2869void DwarfDebug::emitAccelObjC() {
2870 emitAccel(AccelObjC, Asm->getObjFileLowering().getDwarfAccelObjCSection(),
2871 "ObjC");
2872}
2873
2874// Emit namespace dies into a hashed accelerator table.
2875void DwarfDebug::emitAccelNamespaces() {
2876 emitAccel(AccelNamespace,
2877 Asm->getObjFileLowering().getDwarfAccelNamespaceSection(),
2878 "namespac");
2879}
2880
2881// Emit type dies into a hashed accelerator table.
2882void DwarfDebug::emitAccelTypes() {
2883 emitAccel(AccelTypes, Asm->getObjFileLowering().getDwarfAccelTypesSection(),
2884 "types");
2885}
2886
2887// Public name handling.
2888// The format for the various pubnames:
2889//
2890// dwarf pubnames - offset/name pairs where the offset is the offset into the CU
2891// for the DIE that is named.
2892//
2893// gnu pubnames - offset/index value/name tuples where the offset is the offset
2894// into the CU and the index value is computed according to the type of value
2895// for the DIE that is named.
2896//
2897// For type units the offset is the offset of the skeleton DIE. For split dwarf
2898// it's the offset within the debug_info/debug_types dwo section, however, the
2899// reference in the pubname header doesn't change.
2900
2901/// computeIndexValue - Compute the gdb index value for the DIE and CU.
2903 const DIE *Die) {
2904 // Entities that ended up only in a Type Unit reference the CU instead (since
2905 // the pub entry has offsets within the CU there's no real offset that can be
2906 // provided anyway). As it happens all such entities (namespaces and types,
2907 // types only in C++ at that) are rendered as TYPE+EXTERNAL. If this turns out
2908 // not to be true it would be necessary to persist this information from the
2909 // point at which the entry is added to the index data structure - since by
2910 // the time the index is built from that, the original type/namespace DIE in a
2911 // type unit has already been destroyed so it can't be queried for properties
2912 // like tag, etc.
2913 if (Die->getTag() == dwarf::DW_TAG_compile_unit)
2917
2918 // We could have a specification DIE that has our most of our knowledge,
2919 // look for that now.
2920 if (DIEValue SpecVal = Die->findAttribute(dwarf::DW_AT_specification)) {
2921 DIE &SpecDIE = SpecVal.getDIEEntry().getEntry();
2922 if (SpecDIE.findAttribute(dwarf::DW_AT_external))
2924 } else if (Die->findAttribute(dwarf::DW_AT_external))
2926
2927 switch (Die->getTag()) {
2928 case dwarf::DW_TAG_class_type:
2929 case dwarf::DW_TAG_structure_type:
2930 case dwarf::DW_TAG_union_type:
2931 case dwarf::DW_TAG_enumeration_type:
2937 case dwarf::DW_TAG_typedef:
2938 case dwarf::DW_TAG_base_type:
2939 case dwarf::DW_TAG_subrange_type:
2940 case dwarf::DW_TAG_template_alias:
2942 case dwarf::DW_TAG_namespace:
2943 return dwarf::GIEK_TYPE;
2944 case dwarf::DW_TAG_subprogram:
2946 case dwarf::DW_TAG_variable:
2948 case dwarf::DW_TAG_enumerator:
2951 default:
2952 return dwarf::GIEK_NONE;
2953 }
2954}
2955
2956/// emitDebugPubSections - Emit visible names and types into debug pubnames and
2957/// pubtypes sections.
2958void DwarfDebug::emitDebugPubSections() {
2959 for (const auto &NU : CUMap) {
2960 DwarfCompileUnit *TheU = NU.second;
2961 if (!TheU->hasDwarfPubSections())
2962 continue;
2963
2964 bool GnuStyle = TheU->getCUNode()->getNameTableKind() ==
2966
2967 Asm->OutStreamer->switchSection(
2968 GnuStyle ? Asm->getObjFileLowering().getDwarfGnuPubNamesSection()
2969 : Asm->getObjFileLowering().getDwarfPubNamesSection());
2970 emitDebugPubSection(GnuStyle, "Names", TheU, TheU->getGlobalNames());
2971
2972 Asm->OutStreamer->switchSection(
2973 GnuStyle ? Asm->getObjFileLowering().getDwarfGnuPubTypesSection()
2974 : Asm->getObjFileLowering().getDwarfPubTypesSection());
2975 emitDebugPubSection(GnuStyle, "Types", TheU, TheU->getGlobalTypes());
2976 }
2977}
2978
2979void DwarfDebug::emitSectionReference(const DwarfCompileUnit &CU) {
2981 Asm->emitDwarfOffset(CU.getSection()->getBeginSymbol(),
2982 CU.getDebugSectionOffset());
2983 else
2984 Asm->emitDwarfSymbolReference(CU.getLabelBegin());
2985}
2986
2987void DwarfDebug::emitDebugPubSection(bool GnuStyle, StringRef Name,
2988 DwarfCompileUnit *TheU,
2989 const StringMap<const DIE *> &Globals) {
2990 if (auto *Skeleton = TheU->getSkeleton())
2991 TheU = Skeleton;
2992
2993 // Emit the header.
2994 MCSymbol *EndLabel = Asm->emitDwarfUnitLength(
2995 "pub" + Name, "Length of Public " + Name + " Info");
2996
2997 Asm->OutStreamer->AddComment("DWARF Version");
2998 Asm->emitInt16(dwarf::DW_PUBNAMES_VERSION);
2999
3000 Asm->OutStreamer->AddComment("Offset of Compilation Unit Info");
3001 emitSectionReference(*TheU);
3002
3003 Asm->OutStreamer->AddComment("Compilation Unit Length");
3004 Asm->emitDwarfLengthOrOffset(TheU->getLength());
3005
3006 // Emit the pubnames for this compilation unit.
3008 for (const auto &GI : Globals)
3009 Vec.emplace_back(GI.first(), GI.second);
3010 llvm::sort(Vec, [](auto &A, auto &B) {
3011 return A.second->getOffset() < B.second->getOffset();
3012 });
3013 for (const auto &[Name, Entity] : Vec) {
3014 Asm->OutStreamer->AddComment("DIE offset");
3015 Asm->emitDwarfLengthOrOffset(Entity->getOffset());
3016
3017 if (GnuStyle) {
3018 dwarf::PubIndexEntryDescriptor Desc = computeIndexValue(TheU, Entity);
3019 Asm->OutStreamer->AddComment(
3020 Twine("Attributes: ") + dwarf::GDBIndexEntryKindString(Desc.Kind) +
3021 ", " + dwarf::GDBIndexEntryLinkageString(Desc.Linkage));
3022 Asm->emitInt8(Desc.toBits());
3023 }
3024
3025 Asm->OutStreamer->AddComment("External Name");
3026 Asm->OutStreamer->emitBytes(StringRef(Name.data(), Name.size() + 1));
3027 }
3028
3029 Asm->OutStreamer->AddComment("End Mark");
3030 Asm->emitDwarfLengthOrOffset(0);
3031 Asm->OutStreamer->emitLabel(EndLabel);
3032}
3033
3034/// Emit null-terminated strings into a debug str section.
3035void DwarfDebug::emitDebugStr() {
3036 MCSection *StringOffsetsSection = nullptr;
3038 emitStringOffsetsTableHeader();
3039 StringOffsetsSection = Asm->getObjFileLowering().getDwarfStrOffSection();
3040 }
3041 DwarfFile &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
3042 Holder.emitStrings(Asm->getObjFileLowering().getDwarfStrSection(),
3043 StringOffsetsSection, /* UseRelativeOffsets = */ true);
3044}
3045
3047 const DebugLocStream::Entry &Entry,
3048 const DwarfCompileUnit *CU) {
3049 auto &&Comments = DebugLocs.getComments(Entry);
3050 auto Comment = Comments.begin();
3051 auto End = Comments.end();
3052
3053 // The expressions are inserted into a byte stream rather early (see
3054 // DwarfExpression::addExpression) so for those ops (e.g. DW_OP_convert) that
3055 // need to reference a base_type DIE the offset of that DIE is not yet known.
3056 // To deal with this we instead insert a placeholder early and then extract
3057 // it here and replace it with the real reference.
3058 unsigned PtrSize = Asm->MAI->getCodePointerSize();
3059 DWARFDataExtractor Data(StringRef(DebugLocs.getBytes(Entry).data(),
3060 DebugLocs.getBytes(Entry).size()),
3061 Asm->getDataLayout().isLittleEndian(), PtrSize);
3062 DWARFExpression Expr(Data, PtrSize, Asm->OutContext.getDwarfFormat());
3063
3064 using Encoding = DWARFExpression::Operation::Encoding;
3065 uint64_t Offset = 0;
3066 for (const auto &Op : Expr) {
3067 assert(Op.getCode() != dwarf::DW_OP_const_type &&
3068 "3 operand ops not yet supported");
3069 assert(!Op.getSubCode() && "SubOps not yet supported");
3070 Streamer.emitInt8(Op.getCode(), Comment != End ? *(Comment++) : "");
3071 Offset++;
3072 for (unsigned I = 0; I < Op.getDescription().Op.size(); ++I) {
3073 if (Op.getDescription().Op[I] == Encoding::BaseTypeRef) {
3074 unsigned Length =
3075 Streamer.emitDIERef(*CU->ExprRefedBaseTypes[Op.getRawOperand(I)].Die);
3076 // Make sure comments stay aligned.
3077 for (unsigned J = 0; J < Length; ++J)
3078 if (Comment != End)
3079 Comment++;
3080 } else {
3081 for (uint64_t J = Offset; J < Op.getOperandEndOffset(I); ++J)
3082 Streamer.emitInt8(Data.getData()[J], Comment != End ? *(Comment++) : "");
3083 }
3084 Offset = Op.getOperandEndOffset(I);
3085 }
3086 assert(Offset == Op.getEndOffset());
3087 }
3088}
3089
3091 const DbgValueLoc &Value,
3092 DwarfExpression &DwarfExpr) {
3093 auto *DIExpr = Value.getExpression();
3094 DIExpressionCursor ExprCursor(DIExpr);
3095 DwarfExpr.addFragmentOffset(DIExpr);
3096
3097 // If the DIExpr is an Entry Value, we want to follow the same code path
3098 // regardless of whether the DBG_VALUE is variadic or not.
3099 if (DIExpr && DIExpr->isEntryValue()) {
3100 // Entry values can only be a single register with no additional DIExpr,
3101 // so just add it directly.
3102 assert(Value.getLocEntries().size() == 1);
3103 assert(Value.getLocEntries()[0].isLocation());
3104 MachineLocation Location = Value.getLocEntries()[0].getLoc();
3105 DwarfExpr.setLocation(Location, DIExpr);
3106
3107 DwarfExpr.beginEntryValueExpression(ExprCursor);
3108
3110 if (!DwarfExpr.addMachineRegExpression(TRI, ExprCursor, Location.getReg()))
3111 return;
3112 return DwarfExpr.addExpression(std::move(ExprCursor));
3113 }
3114
3115 // Regular entry.
3116 auto EmitValueLocEntry = [&DwarfExpr, &BT,
3117 &AP](const DbgValueLocEntry &Entry,
3118 DIExpressionCursor &Cursor) -> bool {
3119 if (Entry.isInt()) {
3120 if (BT && (BT->getEncoding() == dwarf::DW_ATE_boolean))
3121 DwarfExpr.addBooleanConstant(Entry.getInt());
3122 else if (BT && (BT->getEncoding() == dwarf::DW_ATE_signed ||
3123 BT->getEncoding() == dwarf::DW_ATE_signed_char))
3124 DwarfExpr.addSignedConstant(Entry.getInt());
3125 else
3126 DwarfExpr.addUnsignedConstant(Entry.getInt());
3127 } else if (Entry.isLocation()) {
3128 MachineLocation Location = Entry.getLoc();
3129 if (Location.isIndirect())
3130 DwarfExpr.setMemoryLocationKind();
3131
3133 if (!DwarfExpr.addMachineRegExpression(TRI, Cursor, Location.getReg()))
3134 return false;
3135 } else if (Entry.isTargetIndexLocation()) {
3136 TargetIndexLocation Loc = Entry.getTargetIndexLocation();
3137 // TODO TargetIndexLocation is a target-independent. Currently only the
3138 // WebAssembly-specific encoding is supported.
3140 DwarfExpr.addWasmLocation(Loc.Index, static_cast<uint64_t>(Loc.Offset));
3141 } else if (Entry.isConstantFP()) {
3142 if (AP.getDwarfVersion() >= 4 && !AP.getDwarfDebug()->tuneForSCE() &&
3143 !Cursor) {
3144 DwarfExpr.addConstantFP(Entry.getConstantFP()->getValueAPF(), AP);
3145 } else if (Entry.getConstantFP()
3146 ->getValueAPF()
3147 .bitcastToAPInt()
3148 .getBitWidth() <= 64 /*bits*/) {
3149 DwarfExpr.addUnsignedConstant(
3150 Entry.getConstantFP()->getValueAPF().bitcastToAPInt());
3151 } else {
3152 LLVM_DEBUG(
3153 dbgs() << "Skipped DwarfExpression creation for ConstantFP of size"
3154 << Entry.getConstantFP()
3155 ->getValueAPF()
3156 .bitcastToAPInt()
3157 .getBitWidth()
3158 << " bits\n");
3159 return false;
3160 }
3161 }
3162 return true;
3163 };
3164
3165 if (!Value.isVariadic()) {
3166 if (!EmitValueLocEntry(Value.getLocEntries()[0], ExprCursor))
3167 return;
3168 DwarfExpr.addExpression(std::move(ExprCursor));
3169 return;
3170 }
3171
3172 // If any of the location entries are registers with the value 0, then the
3173 // location is undefined.
3174 if (any_of(Value.getLocEntries(), [](const DbgValueLocEntry &Entry) {
3175 return Entry.isLocation() && !Entry.getLoc().getReg();
3176 }))
3177 return;
3178
3179 DwarfExpr.addExpression(
3180 std::move(ExprCursor),
3181 [EmitValueLocEntry, &Value](unsigned Idx,
3182 DIExpressionCursor &Cursor) -> bool {
3183 return EmitValueLocEntry(Value.getLocEntries()[Idx], Cursor);
3184 });
3185}
3186
3189 const DIBasicType *BT,
3190 DwarfCompileUnit &TheCU) {
3191 assert(!Values.empty() &&
3192 "location list entries without values are redundant");
3193 assert(Begin != End && "unexpected location list entry with empty range");
3194 DebugLocStream::EntryBuilder Entry(List, Begin, End);
3195 BufferByteStreamer Streamer = Entry.getStreamer();
3196 DebugLocDwarfExpression DwarfExpr(AP.getDwarfVersion(), Streamer, TheCU);
3197 const DbgValueLoc &Value = Values[0];
3198 if (Value.isFragment()) {
3199 // Emit all fragments that belong to the same variable and range.
3200 assert(llvm::all_of(Values, [](DbgValueLoc P) {
3201 return P.isFragment();
3202 }) && "all values are expected to be fragments");
3203 assert(llvm::is_sorted(Values) && "fragments are expected to be sorted");
3204
3205 for (const auto &Fragment : Values)
3206 DwarfDebug::emitDebugLocValue(AP, BT, Fragment, DwarfExpr);
3207
3208 } else {
3209 assert(Values.size() == 1 && "only fragments may have >1 value");
3210 DwarfDebug::emitDebugLocValue(AP, BT, Value, DwarfExpr);
3211 }
3212 DwarfExpr.finalize();
3213 if (DwarfExpr.TagOffset)
3214 List.setTagOffset(*DwarfExpr.TagOffset);
3215}
3216
3218 const DwarfCompileUnit *CU) {
3219 // Emit the size.
3220 Asm->OutStreamer->AddComment("Loc expr size");
3221 if (getDwarfVersion() >= 5)
3222 Asm->emitULEB128(DebugLocs.getBytes(Entry).size());
3223 else if (DebugLocs.getBytes(Entry).size() <= std::numeric_limits<uint16_t>::max())
3224 Asm->emitInt16(DebugLocs.getBytes(Entry).size());
3225 else {
3226 // The entry is too big to fit into 16 bit, drop it as there is nothing we
3227 // can do.
3228 Asm->emitInt16(0);
3229 return;
3230 }
3231 // Emit the entry.
3232 APByteStreamer Streamer(*Asm);
3233 emitDebugLocEntry(Streamer, Entry, CU);
3234}
3235
3236// Emit the header of a DWARF 5 range list table list table. Returns the symbol
3237// that designates the end of the table for the caller to emit when the table is
3238// complete.
3240 const DwarfFile &Holder) {
3241 MCSymbol *TableEnd = mcdwarf::emitListsTableHeaderStart(*Asm->OutStreamer);
3242
3243 Asm->OutStreamer->AddComment("Offset entry count");
3244 Asm->emitInt32(Holder.getRangeLists().size());
3245 Asm->OutStreamer->emitLabel(Holder.getRnglistsTableBaseSym());
3246
3247 for (const RangeSpanList &List : Holder.getRangeLists())
3248 Asm->emitLabelDifference(List.Label, Holder.getRnglistsTableBaseSym(),
3249 Asm->getDwarfOffsetByteSize());
3250
3251 return TableEnd;
3252}
3253
3254// Emit the header of a DWARF 5 locations list table. Returns the symbol that
3255// designates the end of the table for the caller to emit when the table is
3256// complete.
3258 const DwarfDebug &DD) {
3259 MCSymbol *TableEnd = mcdwarf::emitListsTableHeaderStart(*Asm->OutStreamer);
3260
3261 const auto &DebugLocs = DD.getDebugLocs();
3262
3263 Asm->OutStreamer->AddComment("Offset entry count");
3264 Asm->emitInt32(DebugLocs.getLists().size());
3265 Asm->OutStreamer->emitLabel(DebugLocs.getSym());
3266
3267 for (const auto &List : DebugLocs.getLists())
3268 Asm->emitLabelDifference(List.Label, DebugLocs.getSym(),
3269 Asm->getDwarfOffsetByteSize());
3270
3271 return TableEnd;
3272}
3273
3274template <typename Ranges, typename PayloadEmitter>
3275static void emitRangeList(
3276 DwarfDebug &DD, AsmPrinter *Asm, MCSymbol *Sym, const Ranges &R,
3277 const DwarfCompileUnit &CU, unsigned BaseAddressx, unsigned OffsetPair,
3278 unsigned StartxLength, unsigned EndOfList,
3279 StringRef (*StringifyEnum)(unsigned),
3280 bool ShouldUseBaseAddress,
3281 PayloadEmitter EmitPayload) {
3282
3283 auto Size = Asm->MAI->getCodePointerSize();
3284 bool UseDwarf5 = DD.getDwarfVersion() >= 5;
3285
3286 // Emit our symbol so we can find the beginning of the range.
3287 Asm->OutStreamer->emitLabel(Sym);
3288
3289 // Gather all the ranges that apply to the same section so they can share
3290 // a base address entry.
3291 SmallMapVector<const MCSection *, std::vector<decltype(&*R.begin())>, 16>
3292 SectionRanges;
3293
3294 for (const auto &Range : R)
3295 SectionRanges[&Range.Begin->getSection()].push_back(&Range);
3296
3297 const MCSymbol *CUBase = CU.getBaseAddress();
3298 bool BaseIsSet = false;
3299 for (const auto &P : SectionRanges) {
3300 auto *Base = CUBase;
3301 if ((Asm->TM.getTargetTriple().isNVPTX() && DD.tuneForGDB())) {
3302 // PTX does not support subtracting labels from the code section in the
3303 // debug_loc section. To work around this, the NVPTX backend needs the
3304 // compile unit to have no low_pc in order to have a zero base_address
3305 // when handling debug_loc in cuda-gdb. Additionally, cuda-gdb doesn't
3306 // seem to handle setting a per-variable base to zero. To make cuda-gdb
3307 // happy, just emit labels with no base while having no compile unit
3308 // low_pc.
3309 BaseIsSet = false;
3310 Base = nullptr;
3311 } else if (!Base && ShouldUseBaseAddress) {
3312 const MCSymbol *Begin = P.second.front()->Begin;
3313 const MCSymbol *NewBase = DD.getSectionLabel(&Begin->getSection());
3314 if (!UseDwarf5) {
3315 Base = NewBase;
3316 BaseIsSet = true;
3317 Asm->OutStreamer->emitIntValue(-1, Size);
3318 Asm->OutStreamer->AddComment(" base address");
3319 Asm->OutStreamer->emitSymbolValue(Base, Size);
3320 } else if (NewBase != Begin || P.second.size() > 1) {
3321 // Only use a base address if
3322 // * the existing pool address doesn't match (NewBase != Begin)
3323 // * or, there's more than one entry to share the base address
3324 Base = NewBase;
3325 BaseIsSet = true;
3326 Asm->OutStreamer->AddComment(StringifyEnum(BaseAddressx));
3327 Asm->emitInt8(BaseAddressx);
3328 Asm->OutStreamer->AddComment(" base address index");
3329 Asm->emitULEB128(DD.getAddressPool().getIndex(Base));
3330 }
3331 } else if (BaseIsSet && !UseDwarf5) {
3332 BaseIsSet = false;
3333 assert(!Base);
3334 Asm->OutStreamer->emitIntValue(-1, Size);
3335 Asm->OutStreamer->emitIntValue(0, Size);
3336 }
3337
3338 for (const auto *RS : P.second) {
3339 const MCSymbol *Begin = RS->Begin;
3340 const MCSymbol *End = RS->End;
3341 assert(Begin && "Range without a begin symbol?");
3342 assert(End && "Range without an end symbol?");
3343 if (Base) {
3344 if (UseDwarf5) {
3345 // Emit offset_pair when we have a base.
3346 Asm->OutStreamer->AddComment(StringifyEnum(OffsetPair));
3347 Asm->emitInt8(OffsetPair);
3348 Asm->OutStreamer->AddComment(" starting offset");
3349 Asm->emitLabelDifferenceAsULEB128(Begin, Base);
3350 Asm->OutStreamer->AddComment(" ending offset");
3351 Asm->emitLabelDifferenceAsULEB128(End, Base);
3352 } else {
3353 Asm->emitLabelDifference(Begin, Base, Size);
3354 Asm->emitLabelDifference(End, Base, Size);
3355 }
3356 } else if (UseDwarf5) {
3357 Asm->OutStreamer->AddComment(StringifyEnum(StartxLength));
3358 Asm->emitInt8(StartxLength);
3359 Asm->OutStreamer->AddComment(" start index");
3360 Asm->emitULEB128(DD.getAddressPool().getIndex(Begin));
3361 Asm->OutStreamer->AddComment(" length");
3362 Asm->emitLabelDifferenceAsULEB128(End, Begin);
3363 } else {
3364 Asm->OutStreamer->emitSymbolValue(Begin, Size);
3365 Asm->OutStreamer->emitSymbolValue(End, Size);
3366 }
3367 EmitPayload(*RS);
3368 }
3369 }
3370
3371 if (UseDwarf5) {
3372 Asm->OutStreamer->AddComment(StringifyEnum(EndOfList));
3373 Asm->emitInt8(EndOfList);
3374 } else {
3375 // Terminate the list with two 0 values.
3376 Asm->OutStreamer->emitIntValue(0, Size);
3377 Asm->OutStreamer->emitIntValue(0, Size);
3378 }
3379}
3380
3381// Handles emission of both debug_loclist / debug_loclist.dwo
3382static void emitLocList(DwarfDebug &DD, AsmPrinter *Asm, const DebugLocStream::List &List) {
3383 emitRangeList(DD, Asm, List.Label, DD.getDebugLocs().getEntries(List),
3384 *List.CU, dwarf::DW_LLE_base_addressx,
3385 dwarf::DW_LLE_offset_pair, dwarf::DW_LLE_startx_length,
3386 dwarf::DW_LLE_end_of_list, llvm::dwarf::LocListEncodingString,
3387 /* ShouldUseBaseAddress */ true,
3388 [&](const DebugLocStream::Entry &E) {
3389 DD.emitDebugLocEntryLocation(E, List.CU);
3390 });
3391}
3392
3393void DwarfDebug::emitDebugLocImpl(MCSection *Sec) {
3394 if (DebugLocs.getLists().empty())
3395 return;
3396
3397 Asm->OutStreamer->switchSection(Sec);
3398
3399 MCSymbol *TableEnd = nullptr;
3400 if (getDwarfVersion() >= 5)
3401 TableEnd = emitLoclistsTableHeader(Asm, *this);
3402
3403 for (const auto &List : DebugLocs.getLists())
3404 emitLocList(*this, Asm, List);
3405
3406 if (TableEnd)
3407 Asm->OutStreamer->emitLabel(TableEnd);
3408}
3409
3410// Emit locations into the .debug_loc/.debug_loclists section.
3411void DwarfDebug::emitDebugLoc() {
3412 emitDebugLocImpl(
3413 getDwarfVersion() >= 5
3414 ? Asm->getObjFileLowering().getDwarfLoclistsSection()
3415 : Asm->getObjFileLowering().getDwarfLocSection());
3416}
3417
3418// Emit locations into the .debug_loc.dwo/.debug_loclists.dwo section.
3419void DwarfDebug::emitDebugLocDWO() {
3420 if (getDwarfVersion() >= 5) {
3421 emitDebugLocImpl(
3422 Asm->getObjFileLowering().getDwarfLoclistsDWOSection());
3423
3424 return;
3425 }
3426
3427 for (const auto &List : DebugLocs.getLists()) {
3428 Asm->OutStreamer->switchSection(
3429 Asm->getObjFileLowering().getDwarfLocDWOSection());
3430 Asm->OutStreamer->emitLabel(List.Label);
3431
3432 for (const auto &Entry : DebugLocs.getEntries(List)) {
3433 // GDB only supports startx_length in pre-standard split-DWARF.
3434 // (in v5 standard loclists, it currently* /only/ supports base_address +
3435 // offset_pair, so the implementations can't really share much since they
3436 // need to use different representations)
3437 // * as of October 2018, at least
3438 //
3439 // In v5 (see emitLocList), this uses SectionLabels to reuse existing
3440 // addresses in the address pool to minimize object size/relocations.
3441 Asm->emitInt8(dwarf::DW_LLE_startx_length);
3442 unsigned idx = AddrPool.getIndex(Entry.Begin);
3443 Asm->emitULEB128(idx);
3444 // Also the pre-standard encoding is slightly different, emitting this as
3445 // an address-length entry here, but its a ULEB128 in DWARFv5 loclists.
3446 Asm->emitLabelDifference(Entry.End, Entry.Begin, 4);
3448 }
3449 Asm->emitInt8(dwarf::DW_LLE_end_of_list);
3450 }
3451}
3452
3455};
3456
3457// Emit a debug aranges section, containing a CU lookup for any
3458// address we can tie back to a CU.
3459void DwarfDebug::emitDebugARanges() {
3460 if (ArangeLabels.empty())
3461 return;
3462
3463 // Provides a unique id per text section.
3465
3466 // Filter labels by section.
3467 for (const SymbolCU &SCU : ArangeLabels) {
3468 if (SCU.Sym->isInSection()) {
3469 // Make a note of this symbol and it's section.
3470 MCSection *Section = &SCU.Sym->getSection();
3471 SectionMap[Section].push_back(SCU);
3472 } else {
3473 // Some symbols (e.g. common/bss on mach-o) can have no section but still
3474 // appear in the output. This sucks as we rely on sections to build
3475 // arange spans. We can do it without, but it's icky.
3476 SectionMap[nullptr].push_back(SCU);
3477 }
3478 }
3479
3480 DenseMap<DwarfCompileUnit *, std::vector<ArangeSpan>> Spans;
3481
3482 for (auto &I : SectionMap) {
3483 MCSection *Section = I.first;
3485 assert(!List.empty());
3486
3487 // If we have no section (e.g. common), just write out
3488 // individual spans for each symbol.
3489 if (!Section) {
3490 for (const SymbolCU &Cur : List) {
3491 ArangeSpan Span;
3492 Span.Start = Cur.Sym;
3493 Span.End = nullptr;
3494 assert(Cur.CU);
3495 Spans[Cur.CU].push_back(Span);
3496 }
3497 continue;
3498 }
3499
3500 // Insert a final terminator.
3501 List.push_back(SymbolCU(nullptr, Asm->OutStreamer->endSection(Section)));
3502
3503 // Build spans between each label.
3504 const MCSymbol *StartSym = List[0].Sym;
3505 for (size_t n = 1, e = List.size(); n < e; n++) {
3506 const SymbolCU &Prev = List[n - 1];
3507 const SymbolCU &Cur = List[n];
3508
3509 // Try and build the longest span we can within the same CU.
3510 if (Cur.CU != Prev.CU) {
3511 ArangeSpan Span;
3512 Span.Start = StartSym;
3513 Span.End = Cur.Sym;
3514 assert(Prev.CU);
3515 Spans[Prev.CU].push_back(Span);
3516 StartSym = Cur.Sym;
3517 }
3518 }
3519 }
3520
3521 // Start the dwarf aranges section.
3522 Asm->OutStreamer->switchSection(
3523 Asm->getObjFileLowering().getDwarfARangesSection());
3524
3525 unsigned PtrSize = Asm->MAI->getCodePointerSize();
3526
3527 // Build a list of CUs used.
3528 std::vector<DwarfCompileUnit *> CUs;
3529 for (const auto &it : Spans) {
3530 DwarfCompileUnit *CU = it.first;
3531 CUs.push_back(CU);
3532 }
3533
3534 // Sort the CU list (again, to ensure consistent output order).
3535 llvm::sort(CUs, [](const DwarfCompileUnit *A, const DwarfCompileUnit *B) {
3536 return A->getUniqueID() < B->getUniqueID();
3537 });
3538
3539 // Emit an arange table for each CU we used.
3540 for (DwarfCompileUnit *CU : CUs) {
3541 std::vector<ArangeSpan> &List = Spans[CU];
3542
3543 // Describe the skeleton CU's offset and length, not the dwo file's.
3544 if (auto *Skel = CU->getSkeleton())
3545 CU = Skel;
3546
3547 // Emit size of content not including length itself.
3548 unsigned ContentSize =
3549 sizeof(int16_t) + // DWARF ARange version number
3550 Asm->getDwarfOffsetByteSize() + // Offset of CU in the .debug_info
3551 // section
3552 sizeof(int8_t) + // Pointer Size (in bytes)
3553 sizeof(int8_t); // Segment Size (in bytes)
3554
3555 unsigned TupleSize = PtrSize * 2;
3556
3557 // 7.20 in the Dwarf specs requires the table to be aligned to a tuple.
3558 unsigned Padding = offsetToAlignment(
3559 Asm->getUnitLengthFieldByteSize() + ContentSize, Align(TupleSize));
3560
3561 ContentSize += Padding;
3562 ContentSize += (List.size() + 1) * TupleSize;
3563
3564 // For each compile unit, write the list of spans it covers.
3565 Asm->emitDwarfUnitLength(ContentSize, "Length of ARange Set");
3566 Asm->OutStreamer->AddComment("DWARF Arange version number");
3567 Asm->emitInt16(dwarf::DW_ARANGES_VERSION);
3568 Asm->OutStreamer->AddComment("Offset Into Debug Info Section");
3569 emitSectionReference(*CU);
3570 Asm->OutStreamer->AddComment("Address Size (in bytes)");
3571 Asm->emitInt8(PtrSize);
3572 Asm->OutStreamer->AddComment("Segment Size (in bytes)");
3573 Asm->emitInt8(0);
3574
3575 Asm->OutStreamer->emitFill(Padding, 0xff);
3576
3577 for (const ArangeSpan &Span : List) {
3578 Asm->emitLabelReference(Span.Start, PtrSize);
3579
3580 // Calculate the size as being from the span start to its end.
3581 //
3582 // If the size is zero, then round it up to one byte. The DWARF
3583 // specification requires that entries in this table have nonzero
3584 // lengths.
3585 auto SizeRef = SymSize.find(Span.Start);
3586 if ((SizeRef == SymSize.end() || SizeRef->second != 0) && Span.End) {
3587 Asm->emitLabelDifference(Span.End, Span.Start, PtrSize);
3588 } else {
3589 // For symbols without an end marker (e.g. common), we
3590 // write a single arange entry containing just that one symbol.
3591 uint64_t Size;
3592 if (SizeRef == SymSize.end() || SizeRef->second == 0)
3593 Size = 1;
3594 else
3595 Size = SizeRef->second;
3596
3597 Asm->OutStreamer->emitIntValue(Size, PtrSize);
3598 }
3599 }
3600
3601 Asm->OutStreamer->AddComment("ARange terminator");
3602 Asm->OutStreamer->emitIntValue(0, PtrSize);
3603 Asm->OutStreamer->emitIntValue(0, PtrSize);
3604 }
3605}
3606
3607/// Emit a single range list. We handle both DWARF v5 and earlier.
3609 const RangeSpanList &List) {
3610 emitRangeList(DD, Asm, List.Label, List.Ranges, *List.CU,
3611 dwarf::DW_RLE_base_addressx, dwarf::DW_RLE_offset_pair,
3612 dwarf::DW_RLE_startx_length, dwarf::DW_RLE_end_of_list,
3614 List.CU->getCUNode()->getRangesBaseAddress() ||
3615 DD.getDwarfVersion() >= 5,
3616 [](auto) {});
3617}
3618
3619void DwarfDebug::emitDebugRangesImpl(const DwarfFile &Holder, MCSection *Section) {
3620 if (Holder.getRangeLists().empty())
3621 return;
3622
3624 assert(!CUMap.empty());
3625 assert(llvm::any_of(CUMap, [](const decltype(CUMap)::value_type &Pair) {
3626 return !Pair.second->getCUNode()->isDebugDirectivesOnly();
3627 }));
3628
3629 Asm->OutStreamer->switchSection(Section);
3630
3631 MCSymbol *TableEnd = nullptr;
3632 if (getDwarfVersion() >= 5)
3633 TableEnd = emitRnglistsTableHeader(Asm, Holder);
3634
3635 for (const RangeSpanList &List : Holder.getRangeLists())
3636 emitRangeList(*this, Asm, List);
3637
3638 if (TableEnd)
3639 Asm->OutStreamer->emitLabel(TableEnd);
3640}
3641
3642/// Emit address ranges into the .debug_ranges section or into the DWARF v5
3643/// .debug_rnglists section.
3644void DwarfDebug::emitDebugRanges() {
3645 const auto &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
3646
3647 emitDebugRangesImpl(Holder,
3648 getDwarfVersion() >= 5
3649 ? Asm->getObjFileLowering().getDwarfRnglistsSection()
3650 : Asm->getObjFileLowering().getDwarfRangesSection());
3651}
3652
3653void DwarfDebug::emitDebugRangesDWO() {
3654 emitDebugRangesImpl(InfoHolder,
3655 Asm->getObjFileLowering().getDwarfRnglistsDWOSection());
3656}
3657
3658/// Emit the header of a DWARF 5 macro section, or the GNU extension for
3659/// DWARF 4.
3660static void emitMacroHeader(AsmPrinter *Asm, const DwarfDebug &DD,
3661 const DwarfCompileUnit &CU, uint16_t DwarfVersion) {
3662 enum HeaderFlagMask {
3663#define HANDLE_MACRO_FLAG(ID, NAME) MACRO_FLAG_##NAME = ID,
3664#include "llvm/BinaryFormat/Dwarf.def"
3665 };
3666 Asm->OutStreamer->AddComment("Macro information version");
3667 Asm->emitInt16(DwarfVersion >= 5 ? DwarfVersion : 4);
3668 // We emit the line offset flag unconditionally here, since line offset should
3669 // be mostly present.
3670 if (Asm->isDwarf64()) {
3671 Asm->OutStreamer->AddComment("Flags: 64 bit, debug_line_offset present");
3672 Asm->emitInt8(MACRO_FLAG_OFFSET_SIZE | MACRO_FLAG_DEBUG_LINE_OFFSET);
3673 } else {
3674 Asm->OutStreamer->AddComment("Flags: 32 bit, debug_line_offset present");
3675 Asm->emitInt8(MACRO_FLAG_DEBUG_LINE_OFFSET);
3676 }
3677 Asm->OutStreamer->AddComment("debug_line_offset");
3678 if (DD.useSplitDwarf())
3679 Asm->emitDwarfLengthOrOffset(0);
3680 else
3681 Asm->emitDwarfSymbolReference(CU.getLineTableStartSym());
3682}
3683
3684void DwarfDebug::handleMacroNodes(DIMacroNodeArray Nodes, DwarfCompileUnit &U) {
3685 for (auto *MN : Nodes) {
3686 if (auto *M = dyn_cast<DIMacro>(MN))
3687 emitMacro(*M);
3688 else if (auto *F = dyn_cast<DIMacroFile>(MN))
3689 emitMacroFile(*F, U);
3690 else
3691 llvm_unreachable("Unexpected DI type!");
3692 }
3693}
3694
3695void DwarfDebug::emitMacro(DIMacro &M) {
3696 StringRef Name = M.getName();
3697 StringRef Value = M.getValue();
3698
3699 // There should be one space between the macro name and the macro value in
3700 // define entries. In undef entries, only the macro name is emitted.
3701 std::string Str = Value.empty() ? Name.str() : (Name + " " + Value).str();
3702
3703 if (UseDebugMacroSection) {
3704 if (getDwarfVersion() >= 5) {
3705 unsigned Type = M.getMacinfoType() == dwarf::DW_MACINFO_define
3706 ? dwarf::DW_MACRO_define_strx
3707 : dwarf::DW_MACRO_undef_strx;
3708 Asm->OutStreamer->AddComment(dwarf::MacroString(Type));
3709 Asm->emitULEB128(Type);
3710 Asm->OutStreamer->AddComment("Line Number");
3711 Asm->emitULEB128(M.getLine());
3712 Asm->OutStreamer->AddComment("Macro String");
3713 Asm->emitULEB128(
3714 InfoHolder.getStringPool().getIndexedEntry(*Asm, Str).getIndex());
3715 } else {
3716 unsigned Type = M.getMacinfoType() == dwarf::DW_MACINFO_define
3717 ? dwarf::DW_MACRO_GNU_define_indirect
3718 : dwarf::DW_MACRO_GNU_undef_indirect;
3719 Asm->OutStreamer->AddComment(dwarf::GnuMacroString(Type));
3720 Asm->emitULEB128(Type);
3721 Asm->OutStreamer->AddComment("Line Number");
3722 Asm->emitULEB128(M.getLine());
3723 Asm->OutStreamer->AddComment("Macro String");
3724 Asm->emitDwarfSymbolReference(
3725 InfoHolder.getStringPool().getEntry(*Asm, Str).getSymbol());
3726 }
3727 } else {
3728 Asm->OutStreamer->AddComment(dwarf::MacinfoString(M.getMacinfoType()));
3729 Asm->emitULEB128(M.getMacinfoType());
3730 Asm->OutStreamer->AddComment("Line Number");
3731 Asm->emitULEB128(M.getLine());
3732 Asm->OutStreamer->AddComment("Macro String");
3733 Asm->OutStreamer->emitBytes(Str);
3734 Asm->emitInt8('\0');
3735 }
3736}
3737
3738void DwarfDebug::emitMacroFileImpl(
3739 DIMacroFile &MF, DwarfCompileUnit &U, unsigned StartFile, unsigned EndFile,
3740 StringRef (*MacroFormToString)(unsigned Form)) {
3741
3742 Asm->OutStreamer->AddComment(MacroFormToString(StartFile));
3743 Asm->emitULEB128(StartFile);
3744 Asm->OutStreamer->AddComment("Line Number");
3745 Asm->emitULEB128(MF.getLine());
3746 Asm->OutStreamer->AddComment("File Number");
3747 DIFile &F = *MF.getFile();
3748 if (useSplitDwarf())
3749 Asm->emitULEB128(getDwoLineTable(U)->getFile(
3750 F.getDirectory(), F.getFilename(), getMD5AsBytes(&F),
3751 Asm->OutContext.getDwarfVersion(), F.getSource()));
3752 else
3753 Asm->emitULEB128(U.getOrCreateSourceID(&F));
3754 handleMacroNodes(MF.getElements(), U);
3755 Asm->OutStreamer->AddComment(MacroFormToString(EndFile));
3756 Asm->emitULEB128(EndFile);
3757}
3758
3759void DwarfDebug::emitMacroFile(DIMacroFile &F, DwarfCompileUnit &U) {
3760 // DWARFv5 macro and DWARFv4 macinfo share some common encodings,
3761 // so for readibility/uniformity, We are explicitly emitting those.
3762 assert(F.getMacinfoType() == dwarf::DW_MACINFO_start_file);
3763 if (UseDebugMacroSection)
3764 emitMacroFileImpl(
3765 F, U, dwarf::DW_MACRO_start_file, dwarf::DW_MACRO_end_file,
3767 else
3768 emitMacroFileImpl(F, U, dwarf::DW_MACINFO_start_file,
3770}
3771
3772void DwarfDebug::emitDebugMacinfoImpl(MCSection *Section) {
3773 for (const auto &P : CUMap) {
3774 auto &TheCU = *P.second;
3775 auto *SkCU = TheCU.getSkeleton();
3776 DwarfCompileUnit &U = SkCU ? *SkCU : TheCU;
3777 auto *CUNode = cast<DICompileUnit>(P.first);
3778 DIMacroNodeArray Macros = CUNode->getMacros();
3779 if (Macros.empty())
3780 continue;
3781 Asm->OutStreamer->switchSection(Section);
3782 Asm->OutStreamer->emitLabel(U.getMacroLabelBegin());
3783 if (UseDebugMacroSection)
3784 emitMacroHeader(Asm, *this, U, getDwarfVersion());
3785 handleMacroNodes(Macros, U);
3786 Asm->OutStreamer->AddComment("End Of Macro List Mark");
3787 Asm->emitInt8(0);
3788 }
3789}
3790
3791/// Emit macros into a debug macinfo/macro section.
3792void DwarfDebug::emitDebugMacinfo() {
3793 auto &ObjLower = Asm->getObjFileLowering();
3794 emitDebugMacinfoImpl(UseDebugMacroSection
3795 ? ObjLower.getDwarfMacroSection()
3796 : ObjLower.getDwarfMacinfoSection());
3797}
3798
3799void DwarfDebug::emitDebugMacinfoDWO() {
3800 auto &ObjLower = Asm->getObjFileLowering();
3801 emitDebugMacinfoImpl(UseDebugMacroSection
3802 ? ObjLower.getDwarfMacroDWOSection()
3803 : ObjLower.getDwarfMacinfoDWOSection());
3804}
3805
3806// DWARF5 Experimental Separate Dwarf emitters.
3807
3808void DwarfDebug::initSkeletonUnit(const DwarfUnit &U, DIE &Die,
3809 std::unique_ptr<DwarfCompileUnit> NewU) {
3810
3811 if (!CompilationDir.empty())
3812 NewU->addString(Die, dwarf::DW_AT_comp_dir, CompilationDir);
3813 addGnuPubAttributes(*NewU, Die);
3814
3815 SkeletonHolder.addUnit(std::move(NewU));
3816}
3817
3818DwarfCompileUnit &DwarfDebug::constructSkeletonCU(const DwarfCompileUnit &CU) {
3819
3820 auto OwnedUnit = std::make_unique<DwarfCompileUnit>(
3821 CU.getUniqueID(), CU.getCUNode(), Asm, this, &SkeletonHolder,
3823 DwarfCompileUnit &NewCU = *OwnedUnit;
3824 NewCU.setSection(Asm->getObjFileLowering().getDwarfInfoSection());
3825
3826 NewCU.initStmtList();
3827
3829 NewCU.addStringOffsetsStart();
3830
3831 initSkeletonUnit(CU, NewCU.getUnitDie(), std::move(OwnedUnit));
3832
3833 return NewCU;
3834}
3835
3836// Emit the .debug_info.dwo section for separated dwarf. This contains the
3837// compile units that would normally be in debug_info.
3838void DwarfDebug::emitDebugInfoDWO() {
3839 assert(useSplitDwarf() && "No split dwarf debug info?");
3840 // Don't emit relocations into the dwo file.
3841 InfoHolder.emitUnits(/* UseOffsets */ true);
3842}
3843
3844// Emit the .debug_abbrev.dwo section for separated dwarf. This contains the
3845// abbreviations for the .debug_info.dwo section.
3846void DwarfDebug::emitDebugAbbrevDWO() {
3847 assert(useSplitDwarf() && "No split dwarf?");
3848 InfoHolder.emitAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevDWOSection());
3849}
3850
3851void DwarfDebug::emitDebugLineDWO() {
3852 assert(useSplitDwarf() && "No split dwarf?");
3853 SplitTypeUnitFileTable.Emit(
3854 *Asm->OutStreamer, MCDwarfLineTableParams(),
3855 Asm->getObjFileLowering().getDwarfLineDWOSection());
3856}
3857
3858void DwarfDebug::emitStringOffsetsTableHeaderDWO() {
3859 assert(useSplitDwarf() && "No split dwarf?");
3860 InfoHolder.getStringPool().emitStringOffsetsTableHeader(
3861 *Asm, Asm->getObjFileLowering().getDwarfStrOffDWOSection(),
3862 InfoHolder.getStringOffsetsStartSym());
3863}
3864
3865// Emit the .debug_str.dwo section for separated dwarf. This contains the
3866// string section and is identical in format to traditional .debug_str
3867// sections.
3868void DwarfDebug::emitDebugStrDWO() {
3870 emitStringOffsetsTableHeaderDWO();
3871 assert(useSplitDwarf() && "No split dwarf?");
3872 MCSection *OffSec = Asm->getObjFileLowering().getDwarfStrOffDWOSection();
3873 InfoHolder.emitStrings(Asm->getObjFileLowering().getDwarfStrDWOSection(),
3874 OffSec, /* UseRelativeOffsets = */ false);
3875}
3876
3877// Emit address pool.
3878void DwarfDebug::emitDebugAddr() {
3879 AddrPool.emit(*Asm, Asm->getObjFileLowering().getDwarfAddrSection());
3880}
3881
3882MCDwarfDwoLineTable *DwarfDebug::getDwoLineTable(const DwarfCompileUnit &CU) {
3883 if (!useSplitDwarf())
3884 return nullptr;
3885 const DICompileUnit *DIUnit = CU.getCUNode();
3886 SplitTypeUnitFileTable.maybeSetRootFile(
3887 DIUnit->getDirectory(), DIUnit->getFilename(),
3888 getMD5AsBytes(DIUnit->getFile()), DIUnit->getSource());
3889 return &SplitTypeUnitFileTable;
3890}
3891
3893 MD5 Hash;
3894 Hash.update(Identifier);
3895 // ... take the least significant 8 bytes and return those. Our MD5
3896 // implementation always returns its results in little endian, so we actually
3897 // need the "high" word.
3898 MD5::MD5Result Result;
3899 Hash.final(Result);
3900 return Result.high();
3901}
3902
3904 StringRef Identifier, DIE &RefDie,
3905 const DICompositeType *CTy) {
3906 // Fast path if we're building some type units and one has already used the
3907 // address pool we know we're going to throw away all this work anyway, so
3908 // don't bother building dependent types.
3909 if (!TypeUnitsUnderConstruction.empty() && AddrPool.hasBeenUsed())
3910 return;
3911
3912 auto Ins = TypeSignatures.try_emplace(CTy);
3913 if (!Ins.second) {
3914 CU.addDIETypeSignature(RefDie, Ins.first->second);
3915 return;
3916 }
3917
3919 bool TopLevelType = TypeUnitsUnderConstruction.empty();
3920 AddrPool.resetUsedFlag();
3921
3922 auto OwnedUnit = std::make_unique<DwarfTypeUnit>(
3923 CU, Asm, this, &InfoHolder, NumTypeUnitsCreated++, getDwoLineTable(CU));
3924 DwarfTypeUnit &NewTU = *OwnedUnit;
3925 DIE &UnitDie = NewTU.getUnitDie();
3926 TypeUnitsUnderConstruction.emplace_back(std::move(OwnedUnit), CTy);
3927
3928 NewTU.addUInt(UnitDie, dwarf::DW_AT_language, dwarf::DW_FORM_data2,
3929 CU.getLanguage());
3930
3931 uint64_t Signature = makeTypeSignature(Identifier);
3932 NewTU.setTypeSignature(Signature);
3933 Ins.first->second = Signature;
3934
3935 if (useSplitDwarf()) {
3936 // Although multiple type units can have the same signature, they are not
3937 // guranteed to be bit identical. When LLDB uses .debug_names it needs to
3938 // know from which CU a type unit came from. These two attrbutes help it to
3939 // figure that out.
3940 if (getDwarfVersion() >= 5) {
3941 if (!CompilationDir.empty())
3942 NewTU.addString(UnitDie, dwarf::DW_AT_comp_dir, CompilationDir);
3943 NewTU.addString(UnitDie, dwarf::DW_AT_dwo_name,
3944 Asm->TM.Options.MCOptions.SplitDwarfFile);
3945 }
3946 MCSection *Section =
3947 getDwarfVersion() <= 4
3948 ? Asm->getObjFileLowering().getDwarfTypesDWOSection()
3949 : Asm->getObjFileLowering().getDwarfInfoDWOSection();
3950 NewTU.setSection(Section);
3951 } else {
3952 MCSection *Section =
3953 getDwarfVersion() <= 4
3954 ? Asm->getObjFileLowering().getDwarfTypesSection(Signature)
3955 : Asm->getObjFileLowering().getDwarfInfoSection(Signature);
3956 NewTU.setSection(Section);
3957 // Non-split type units reuse the compile unit's line table.
3958 CU.applyStmtList(UnitDie);
3959 }
3960
3961 // Add DW_AT_str_offsets_base to the type unit DIE, but not for split type
3962 // units.
3964 NewTU.addStringOffsetsStart();
3965
3966 NewTU.setType(NewTU.createTypeDIE(CTy));
3967
3968 if (TopLevelType) {
3969 auto TypeUnitsToAdd = std::move(TypeUnitsUnderConstruction);
3970 TypeUnitsUnderConstruction.clear();
3971
3972 // Types referencing entries in the address table cannot be placed in type
3973 // units.
3974 if (AddrPool.hasBeenUsed()) {
3975 AccelTypeUnitsDebugNames.clear();
3976 // Remove all the types built while building this type.
3977 // This is pessimistic as some of these types might not be dependent on
3978 // the type that used an address.
3979 for (const auto &TU : TypeUnitsToAdd)
3980 TypeSignatures.erase(TU.second);
3981
3982 // Construct this type in the CU directly.
3983 // This is inefficient because all the dependent types will be rebuilt
3984 // from scratch, including building them in type units, discovering that
3985 // they depend on addresses, throwing them out and rebuilding them.
3987 CU.constructTypeDIE(RefDie, cast<DICompositeType>(CTy));
3988 CU.updateAcceleratorTables(CTy->getScope(), CTy, RefDie);
3989 return;
3990 }
3991
3992 // If the type wasn't dependent on fission addresses, finish adding the type
3993 // and all its dependent types.
3994 for (auto &TU : TypeUnitsToAdd) {
3995 InfoHolder.computeSizeAndOffsetsForUnit(TU.first.get());
3996 InfoHolder.emitUnit(TU.first.get(), useSplitDwarf());
3997 if (getDwarfVersion() >= 5 &&
3999 if (useSplitDwarf())
4000 AccelDebugNames.addTypeUnitSignature(*TU.first);
4001 else
4002 AccelDebugNames.addTypeUnitSymbol(*TU.first);
4003 }
4004 }
4005 AccelTypeUnitsDebugNames.convertDieToOffset();
4006 AccelDebugNames.addTypeEntries(AccelTypeUnitsDebugNames);
4007 AccelTypeUnitsDebugNames.clear();
4009 }
4010 CU.addDIETypeSignature(RefDie, Signature);
4011}
4012
4013// Add the Name along with its companion DIE to the appropriate accelerator
4014// table (for AccelTableKind::Dwarf it's always AccelDebugNames, for
4015// AccelTableKind::Apple, we use the table we got as an argument). If
4016// accelerator tables are disabled, this function does nothing.
4017template <typename DataT>
4018void DwarfDebug::addAccelNameImpl(
4019 const DwarfUnit &Unit,
4020 const DICompileUnit::DebugNameTableKind NameTableKind,
4021 AccelTable<DataT> &AppleAccel, StringRef Name, const DIE &Die) {
4023 Unit.getUnitDie().getTag() == dwarf::DW_TAG_skeleton_unit || Name.empty())
4024 return;
4025
4029 return;
4030
4031 DwarfFile &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
4033
4034 switch (getAccelTableKind()) {
4036 AppleAccel.addName(Ref, Die);
4037 break;
4038 case AccelTableKind::Dwarf: {
4040 assert(((&Current == &AccelTypeUnitsDebugNames) ||
4041 ((&Current == &AccelDebugNames) &&
4042 (Unit.getUnitDie().getTag() != dwarf::DW_TAG_type_unit))) &&
4043 "Kind is CU but TU is being processed.");
4044 assert(((&Current == &AccelDebugNames) ||
4045 ((&Current == &AccelTypeUnitsDebugNames) &&
4046 (Unit.getUnitDie().getTag() == dwarf::DW_TAG_type_unit))) &&
4047 "Kind is TU but CU is being processed.");
4048 // The type unit can be discarded, so need to add references to final
4049 // acceleration table once we know it's complete and we emit it.
4050 Current.addName(Ref, Die, Unit.getUniqueID(),
4051 Unit.getUnitDie().getTag() == dwarf::DW_TAG_type_unit);
4052 break;
4053 }
4055 llvm_unreachable("Default should have already been resolved.");
4057 llvm_unreachable("None handled above");
4058 }
4059}
4060
4062 const DwarfUnit &Unit,
4063 const DICompileUnit::DebugNameTableKind NameTableKind, StringRef Name,
4064 const DIE &Die) {
4065 addAccelNameImpl(Unit, NameTableKind, AccelNames, Name, Die);
4066}
4067
4069 const DwarfUnit &Unit,
4070 const DICompileUnit::DebugNameTableKind NameTableKind, StringRef Name,
4071 const DIE &Die) {
4072 // ObjC names go only into the Apple accelerator tables.
4074 addAccelNameImpl(Unit, NameTableKind, AccelObjC, Name, Die);
4075}
4076
4078 const DwarfUnit &Unit,
4079 const DICompileUnit::DebugNameTableKind NameTableKind, StringRef Name,
4080 const DIE &Die) {
4081 addAccelNameImpl(Unit, NameTableKind, AccelNamespace, Name, Die);
4082}
4083
4085 const DwarfUnit &Unit,
4086 const DICompileUnit::DebugNameTableKind NameTableKind, StringRef Name,
4087 const DIE &Die, char Flags) {
4088 addAccelNameImpl(Unit, NameTableKind, AccelTypes, Name, Die);
4089}
4090
4092 return Asm->OutStreamer->getContext().getDwarfVersion();
4093}
4094
4096 if (Asm->getDwarfVersion() >= 4)
4097 return dwarf::Form::DW_FORM_sec_offset;
4098 assert((!Asm->isDwarf64() || (Asm->getDwarfVersion() == 3)) &&
4099 "DWARF64 is not defined prior DWARFv3");
4100 return Asm->isDwarf64() ? dwarf::Form::DW_FORM_data8
4101 : dwarf::Form::DW_FORM_data4;
4102}
4103
4105 return SectionLabels.lookup(S);
4106}
4107
4109 if (SectionLabels.insert(std::make_pair(&S->getSection(), S)).second)
4110 if (useSplitDwarf() || getDwarfVersion() >= 5)
4111 AddrPool.getIndex(S);
4112}
4113
4114std::optional<MD5::MD5Result>
4116 assert(File);
4117 if (getDwarfVersion() < 5)
4118 return std::nullopt;
4119 std::optional<DIFile::ChecksumInfo<StringRef>> Checksum = File->getChecksum();
4120 if (!Checksum || Checksum->Kind != DIFile::CSK_MD5)
4121 return std::nullopt;
4122
4123 // Convert the string checksum to an MD5Result for the streamer.
4124 // The verifier validates the checksum so we assume it's okay.
4125 // An MD5 checksum is 16 bytes.
4126 std::string ChecksumString = fromHex(Checksum->Value);
4127 MD5::MD5Result CKMem;
4128 llvm::copy(ChecksumString, CKMem.data());
4129 return CKMem;
4130}
4131
4133 if (MinimizeAddr == MinimizeAddrInV5::Ranges)
4134 return true;
4135 if (MinimizeAddr != MinimizeAddrInV5::Default)
4136 return false;
4137 if (useSplitDwarf())
4138 return true;
4139 return false;
4140}
4141
4143 if (MBB.getAlignment() == Align(1))
4144 return;
4145
4146 auto *SP = MBB.getParent()->getFunction().getSubprogram();
4147 bool NoDebug =
4148 !SP || SP->getUnit()->getEmissionKind() == DICompileUnit::NoDebug;
4149
4150 if (NoDebug)
4151 return;
4152
4153 auto PrevLoc = Asm->OutStreamer->getContext().getCurrentDwarfLoc();
4154 if (PrevLoc.getLine()) {
4155 Asm->OutStreamer->emitDwarfLocDirective(
4156 PrevLoc.getFileNum(), 0, PrevLoc.getColumn(), 0, 0, 0, StringRef());
4157 MCDwarfLineEntry::make(Asm->OutStreamer.get(),
4158 Asm->OutStreamer->getCurrentSectionOnly());
4159 }
4160}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file implements a class to represent arbitrary precision integral constant values and operations...
MachineBasicBlock & MBB
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
BitTracker BT
static Expected< bool > hasObjCCategory(BitstreamCursor &Stream)
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
#define clEnumValN(ENUMVAL, FLAGNAME, DESC)
#define clEnumVal(ENUMVAL, DESC)
This file contains the declarations for the subclasses of Constant, which represent the different fla...
DXIL Finalize Linkage
dxil translate DXIL Translate Metadata
static bool isObjCClass(StringRef Name)
static cl::opt< bool > NoDwarfRangesSection("no-dwarf-ranges-section", cl::Hidden, cl::desc("Disable emission .debug_ranges section."), cl::init(false))
static void finishCallSiteParams(ValT Val, const DIExpression *Expr, ArrayRef< FwdRegParamInfo > DescribedParams, ParamSet &Params)
Emit call site parameter entries that are described by the given value and debug expression.
static cl::opt< bool > UseGNUDebugMacro("use-gnu-debug-macro", cl::Hidden, cl::desc("Emit the GNU .debug_macro format with DWARF <5"), cl::init(false))
static cl::opt< DefaultOnOff > DwarfInlinedStrings("dwarf-inlined-strings", cl::Hidden, cl::desc("Use inlined strings rather than string section."), cl::values(clEnumVal(Default, "Default for platform"), clEnumVal(Enable, "Enabled"), clEnumVal(Disable, "Disabled")), cl::init(Default))
static bool validThroughout(LexicalScopes &LScopes, const MachineInstr *DbgValue, const MachineInstr *RangeEnd, const InstructionOrdering &Ordering)
Determine whether a singular DBG_VALUE is valid for the entirety of its enclosing lexical scope.
static cl::opt< bool > GenerateARangeSection("generate-arange-section", cl::Hidden, cl::desc("Generate dwarf aranges"), cl::init(false))
static cl::opt< LinkageNameOption > DwarfLinkageNames("dwarf-linkage-names", cl::Hidden, cl::desc("Which DWARF linkage-name attributes to emit."), cl::values(clEnumValN(DefaultLinkageNames, "Default", "Default for platform"), clEnumValN(AllLinkageNames, "All", "All"), clEnumValN(AbstractLinkageNames, "Abstract", "Abstract subprograms")), cl::init(DefaultLinkageNames))
static void addToFwdRegWorklist(FwdRegWorklist &Worklist, unsigned Reg, const DIExpression *Expr, ArrayRef< FwdRegParamInfo > ParamsToAdd)
Add Reg to the worklist, if it's not already present, and mark that the given parameter registers' va...
static cl::opt< bool > GenerateDwarfTypeUnits("generate-type-units", cl::Hidden, cl::desc("Generate DWARF4 type units."), cl::init(false))
static cl::opt< bool > KeyInstructionsAreStmts("dwarf-use-key-instructions", cl::Hidden, cl::init(true), cl::desc("Set to false to ignore Key Instructions metadata"))
Set to false to ignore Key Instructions metadata.
static SmallVectorImpl< DwarfCompileUnit::GlobalExpr > & sortGlobalExprs(SmallVectorImpl< DwarfCompileUnit::GlobalExpr > &GVEs)
Sort and unique GVEs by comparing their fragment offset.
LinkageNameOption
@ DefaultLinkageNames
@ AbstractLinkageNames
@ AllLinkageNames
static dwarf::PubIndexEntryDescriptor computeIndexValue(DwarfUnit *CU, const DIE *Die)
computeIndexValue - Compute the gdb index value for the DIE and CU.
static uint64_t getFragmentOffsetInBits(const DIExpression &Expr)
static cl::opt< DefaultOnOff > DwarfOpConvert("dwarf-op-convert", cl::Hidden, cl::desc("Enable use of the DWARFv5 DW_OP_convert operator"), cl::values(clEnumVal(Default, "Default for platform"), clEnumVal(Enable, "Enabled"), clEnumVal(Disable, "Disabled")), cl::init(Default))
static std::pair< const MachineInstr *, bool > findPrologueEndLoc(const MachineFunction *MF)
static void collectCallSiteParameters(const MachineInstr *CallMI, ParamSet &Params)
Try to interpret values loaded into registers that forward parameters for CallMI.
static MCSymbol * emitRnglistsTableHeader(AsmPrinter *Asm, const DwarfFile &Holder)
static cl::opt< bool > SplitDwarfCrossCuReferences("split-dwarf-cross-cu-references", cl::Hidden, cl::desc("Enable cross-cu references in DWO files"), cl::init(false))
MapVector< uint64_t, SmallVector< FwdRegParamInfo, 2 > > FwdRegWorklist
Register worklist for finding call site values.
static cl::opt< bool > UseDwarfRangesBaseAddressSpecifier("use-dwarf-ranges-base-address-specifier", cl::Hidden, cl::desc("Use base address specifiers in debug_ranges"), cl::init(false))
SmallSet< Register, 16 > ClobberedRegSet
Container for the set of registers known to be clobbered on the path to a call site.
static void interpretValues(const MachineInstr *CurMI, FwdRegWorklist &ForwardedRegWorklist, ParamSet &Params, ClobberedRegSet &ClobberedRegUnits)
Interpret values loaded into registers by CurMI.
static bool interpretNextInstr(const MachineInstr *CurMI, FwdRegWorklist &ForwardedRegWorklist, ParamSet &Params, ClobberedRegSet &ClobberedRegUnits)
static void emitLocList(DwarfDebug &DD, AsmPrinter *Asm, const DebugLocStream::List &List)
static constexpr unsigned ULEB128PadSize
static cl::opt< DefaultOnOff > DwarfSectionsAsReferences("dwarf-sections-as-references", cl::Hidden, cl::desc("Use sections+offset as references rather than labels."), cl::values(clEnumVal(Default, "Default for platform"), clEnumVal(Enable, "Enabled"), clEnumVal(Disable, "Disabled")), cl::init(Default))
DefaultOnOff
@ Default
@ Enable
@ Disable
static AccelTableKind computeAccelTableKind(unsigned DwarfVersion, bool GenerateTypeUnits, DebuggerKind Tuning, const Triple &TT)
static void forBothCUs(DwarfCompileUnit &CU, Func F)
static MCSymbol * emitLoclistsTableHeader(AsmPrinter *Asm, const DwarfDebug &DD)
static const DILocalScope * getRetainedNodeScope(const MDNode *N)
static const DIExpression * combineDIExpressions(const DIExpression *Original, const DIExpression *Addition)
Append the expression Addition to Original and return the result.
static cl::opt< DefaultOnOff > UnknownLocations("use-unknown-locations", cl::Hidden, cl::desc("Make an absence of debug location information explicit."), cl::values(clEnumVal(Default, "At top of block or after label"), clEnumVal(Enable, "In all cases"), clEnumVal(Disable, "Never")), cl::init(Default))
static void recordSourceLine(AsmPrinter &Asm, unsigned Line, unsigned Col, const MDNode *S, unsigned Flags, unsigned CUID, uint16_t DwarfVersion, ArrayRef< std::unique_ptr< DwarfCompileUnit > > DCUs, StringRef Comment={})
Register a source line with debug info.
static void emitMacroHeader(AsmPrinter *Asm, const DwarfDebug &DD, const DwarfCompileUnit &CU, uint16_t DwarfVersion)
Emit the header of a DWARF 5 macro section, or the GNU extension for DWARF 4.
static cl::opt< AccelTableKind > AccelTables("accel-tables", cl::Hidden, cl::desc("Output dwarf accelerator tables."), cl::values(clEnumValN(AccelTableKind::Default, "Default", "Default for platform"), clEnumValN(AccelTableKind::None, "Disable", "Disabled."), clEnumValN(AccelTableKind::Apple, "Apple", "Apple"), clEnumValN(AccelTableKind::Dwarf, "Dwarf", "DWARF")), cl::init(AccelTableKind::Default))
static cl::opt< DwarfDebug::MinimizeAddrInV5 > MinimizeAddrInV5Option("minimize-addr-in-v5", cl::Hidden, cl::desc("Always use DW_AT_ranges in DWARFv5 whenever it could allow more " "address pool entry sharing to reduce relocations/object size"), cl::values(clEnumValN(DwarfDebug::MinimizeAddrInV5::Default, "Default", "Default address minimization strategy"), clEnumValN(DwarfDebug::MinimizeAddrInV5::Ranges, "Ranges", "Use rnglists for contiguous ranges if that allows " "using a pre-existing base address"), clEnumValN(DwarfDebug::MinimizeAddrInV5::Expressions, "Expressions", "Use exprloc addrx+offset expressions for any " "address with a prior base address"), clEnumValN(DwarfDebug::MinimizeAddrInV5::Form, "Form", "Use addrx+offset extension form for any address " "with a prior base address"), clEnumValN(DwarfDebug::MinimizeAddrInV5::Disabled, "Disabled", "Stuff")), cl::init(DwarfDebug::MinimizeAddrInV5::Default))
static StringRef getObjCMethodName(StringRef In)
static void emitRangeList(DwarfDebug &DD, AsmPrinter *Asm, MCSymbol *Sym, const Ranges &R, const DwarfCompileUnit &CU, unsigned BaseAddressx, unsigned OffsetPair, unsigned StartxLength, unsigned EndOfList, StringRef(*StringifyEnum)(unsigned), bool ShouldUseBaseAddress, PayloadEmitter EmitPayload)
static DbgValueLoc getDebugLocValue(const MachineInstr *MI)
Get .debug_loc entry for the instruction range starting at MI.
static void getObjCClassCategory(StringRef In, StringRef &Class, StringRef &Category)
@ EndOfList
const HexagonInstrInfo * TII
#define _
IRTranslator LLVM IR MI
Module.h This file contains the declarations for the Module class.
#define DWARF2_FLAG_IS_STMT
Definition MCDwarf.h:118
#define DWARF2_FLAG_PROLOGUE_END
Definition MCDwarf.h:120
#define DWARF2_FLAG_EPILOGUE_BEGIN
Definition MCDwarf.h:121
#define F(x, y, z)
Definition MD5.cpp:55
#define I(x, y, z)
Definition MD5.cpp:58
Register Reg
Register const TargetRegisterInfo * TRI
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
#define P(N)
if(PassOpts->AAPipeline)
const SmallVectorImpl< MachineOperand > MachineBasicBlock * TBB
const SmallVectorImpl< MachineOperand > & Cond
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
Definition Statistic.h:171
This file contains some functions that are useful when dealing with strings.
#define LLVM_DEBUG(...)
Definition Debug.h:114
This file describes how to lower LLVM code to machine code.
static bool isCopy(MachineInstr *MI)
Value * RHS
Value * LHS
static const uint32_t IV[8]
Definition blake3_impl.h:83
Class recording the (high level) value of a variable.
This class holds an abstract representation of an Accelerator Table, consisting of a sequence of buck...
Definition AccelTable.h:203
void addName(DwarfStringPoolEntryRef Name, Types &&... Args)
Definition AccelTable.h:216
unsigned getIndex(const MCSymbol *Sym, bool TLS=false)
Returns the index into the address pool with the given label/symbol.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:41
std::vector< T > vec() const
Definition ArrayRef.h:276
This class is intended to be used as a driving class for all asm writers.
Definition AsmPrinter.h:91
DwarfDebug * getDwarfDebug()
Definition AsmPrinter.h:288
TargetMachine & TM
Target machine description.
Definition AsmPrinter.h:94
MachineFunction * MF
The current machine function.
Definition AsmPrinter.h:109
std::unique_ptr< MCStreamer > OutStreamer
This is the MCStreamer object for the file we are generating.
Definition AsmPrinter.h:106
uint16_t getDwarfVersion() const
virtual void emitInt8(uint8_t Byte, const Twine &Comment="")=0
virtual unsigned emitDIERef(const DIE &D)=0
Basic type, like 'int' or 'float'.
bool getDebugInfoForProfiling() const
bool isDebugDirectivesOnly() const
StringRef getFlags() const
StringRef getSDK() const
static LLVM_ABI std::optional< DebugNameTableKind > getNameTableKind(StringRef Str)
unsigned getRuntimeVersion() const
bool getSplitDebugInlining() const
StringRef getSysRoot() const
StringRef getProducer() const
unsigned getSourceLanguage() const
uint64_t getDWOId() const
StringRef getSplitDebugFilename() const
static LLVM_ABI std::optional< DebugEmissionKind > getEmissionKind(StringRef Str)
void setSection(MCSection *Section)
Set the section that this DIEUnit will be emitted into.
Definition DIE.h:994
DIE & getUnitDie()
Definition DIE.h:1009
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
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
dwarf::Tag getTag() const
Definition DIE.h:864
Holds a DIExpression and keeps track of how many operands have been consumed so far.
DWARF expression.
LLVM_ABI bool isEntryValue() const
Check if the expression consists of exactly one entry value operand.
static LLVM_ABI DIExpression * append(const DIExpression *Expr, ArrayRef< uint64_t > Ops)
Append the opcodes Ops to DIExpr.
unsigned getNumElements() const
LLVM_ABI bool isImplicit() const
Return whether this is an implicit location description.
static LLVM_ABI std::optional< FragmentInfo > getFragmentInfo(expr_op_iterator Start, expr_op_iterator End)
Retrieve the details of this fragment expression.
static LLVM_ABI std::optional< const DIExpression * > convertToNonVariadicExpression(const DIExpression *Expr)
If Expr is a valid single-location expression, i.e.
ArrayRef< uint64_t > getElements() const
LLVM_ABI bool isValid() const
A scope for locals.
uint64_t getAtomGroup() const
uint8_t getAtomRank() const
DIFile * getFile() const
unsigned getLine() const
DIMacroNodeArray getElements() const
Tagged DWARF-like metadata node.
Base class for scope-like contexts.
StringRef getFilename() const
DIFile * getFile() const
StringRef getDirectory() const
std::optional< StringRef > getSource() const
LLVM_ABI DIScope * getScope() const
Subprogram description. Uses SubclassData1.
Base class for types.
DIScope * getScope() const
DIType * getType() const
A DWARFDataExtractor (typically for an in-memory copy of an object-file section) plus a relocation ma...
Encoding
Size and signedness of expression operations' operands.
Used for tracking debug info about call site parameters.
Definition DwarfDebug.h:316
This class is defined as the common parent of DbgVariable and DbgLabel such that it could levarage po...
Definition DwarfDebug.h:65
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.
const DILocalVariable * getVariable() const
Definition DwarfDebug.h:246
const DIType * getType() const
const MachineInstr * CurMI
If nonnull, stores the current machine instruction we're processing.
AsmPrinter * Asm
Target of debug info emission.
MCSymbol * getLabelBeforeInsn(const MachineInstr *MI)
Return Label preceding the instruction.
MachineModuleInfo * MMI
Collected machine module information.
DebugLoc PrevInstLoc
Previous instruction's location information.
MCSymbol * getLabelAfterInsn(const MachineInstr *MI)
Return Label immediately following the instruction.
void beginInstruction(const MachineInstr *MI) override
Process beginning of an instruction.
const MachineBasicBlock * PrevInstBB
void requestLabelAfterInsn(const MachineInstr *MI)
Ensure that a label will be emitted after MI.
DbgValueHistoryMap DbgValues
History of DBG_VALUE and clobber instructions for each user variable.
DbgLabelInstrMap DbgLabels
Mapping of inlined labels and DBG_LABEL machine instruction.
void beginModule(Module *M) override
const InstructionOrdering & getInstOrdering() const
void requestLabelBeforeInsn(const MachineInstr *MI)
Ensure that a label will be emitted before MI.
const MachineBasicBlock * EpilogBeginBlock
This block includes epilogue instructions.
const MachineInstr * PrologEndLoc
This location indicates end of function prologue and beginning of function body.
DwarfExpression implementation for .debug_loc entries.
void finalize(const AsmPrinter &AP, DebugLocStream::ListBuilder &List, const DIBasicType *BT, DwarfCompileUnit &TheCU)
Lower this entry into a DWARF expression.
Builder for DebugLocStream entries.
Builder for DebugLocStream lists.
ArrayRef< Entry > getEntries(const List &L) const
A debug info location.
Definition DebugLoc.h:124
LLVM_ABI unsigned getLine() const
Definition DebugLoc.cpp:54
ValueT lookup(const_arg_type_t< KeyT > Val) const
lookup - Return the entry for the specified key, or a default constructed value if no such entry exis...
Definition DenseMap.h:194
iterator find(const_arg_type_t< KeyT > Val)
Definition DenseMap.h:167
bool erase(const KeyT &Val)
Definition DenseMap.h:311
iterator end()
Definition DenseMap.h:81
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
Definition DenseMap.h:222
Implements a dense probed hash-table based set.
Definition DenseSet.h:279
void addRange(RangeSpan Range)
addRange - Add an address range to the list of ranges for this unit.
DIE & constructSubprogramScopeDIE(const DISubprogram *Sub, const Function &F, LexicalScope *Scope, MCSymbol *LineTableSym)
Construct a DIE for this subprogram scope.
void createAbstractEntity(const DINode *Node, LexicalScope *Scope)
DwarfCompileUnit * getSkeleton() const
void setSkeleton(DwarfCompileUnit &Skel)
Set the skeleton unit associated with this unit.
const StringMap< const DIE * > & getGlobalNames() const
DbgEntity * getExistingAbstractEntity(const DINode *Node)
const StringMap< const DIE * > & getGlobalTypes() const
Collects and handles dwarf debug information.
Definition DwarfDebug.h:351
bool useSegmentedStringOffsetsTable() const
Returns whether to generate a string offsets table with (possibly shared) contributions from each CU ...
Definition DwarfDebug.h:832
std::optional< MD5::MD5Result > getMD5AsBytes(const DIFile *File) const
If the File has an MD5 checksum, return it as an MD5Result allocated in the MCContext.
bool emitDebugEntryValues() const
Definition DwarfDebug.h:836
uint16_t getDwarfVersion() const
Returns the Dwarf Version.
void emitDebugLocEntry(ByteStreamer &Streamer, const DebugLocStream::Entry &Entry, const DwarfCompileUnit *CU)
Emit an entry for the debug loc section.
void addAccelNamespace(const DwarfUnit &Unit, const DICompileUnit::DebugNameTableKind NameTableKind, StringRef Name, const DIE &Die)
void setCurrentDWARF5AccelTable(const DWARF5AccelTableKind Kind)
Sets the current DWARF5AccelTable to use.
Definition DwarfDebug.h:949
bool alwaysUseRanges(const DwarfCompileUnit &) const
Returns whether range encodings should be used for single entry range lists.
void beginModule(Module *M) override
Emit all Dwarf sections that should come prior to the content.
void addSubprogramNames(const DwarfUnit &Unit, const DICompileUnit::DebugNameTableKind NameTableKind, const DISubprogram *SP, DIE &Die)
bool useAllLinkageNames() const
Returns whether we should emit all DW_AT_[MIPS_]linkage_name.
Definition DwarfDebug.h:770
void insertSectionLabel(const MCSymbol *S)
void addAccelObjC(const DwarfUnit &Unit, const DICompileUnit::DebugNameTableKind NameTableKind, StringRef Name, const DIE &Die)
dwarf::Form getDwarfSectionOffsetForm() const
Returns a suitable DWARF form to represent a section offset, i.e.
bool useAppleExtensionAttributes() const
Definition DwarfDebug.h:818
void skippedNonDebugFunction() override
void addArangeLabel(SymbolCU SCU)
Add a label so that arange data can be generated for it.
Definition DwarfDebug.h:760
void beginInstruction(const MachineInstr *MI) override
Process beginning of an instruction.
AddressPool & getAddressPool()
Definition DwarfDebug.h:879
DWARF5AccelTable & getCurrentDWARF5AccelTable()
Returns either CU or TU DWARF5AccelTable.
Definition DwarfDebug.h:959
bool useSectionsAsReferences() const
Returns whether to use sections as labels rather than temp symbols.
Definition DwarfDebug.h:803
const DebugLocStream & getDebugLocs() const
Returns the entries for the .debug_loc section.
Definition DwarfDebug.h:863
bool shareAcrossDWOCUs() const
void terminateLineTable(const DwarfCompileUnit *CU)
Terminate the line table by adding the last range label.
~DwarfDebug() override
void endFunctionImpl(const MachineFunction *MF) override
Gather and emit post-function debug information.
DwarfCompileUnit & getOrCreateAbstractSubprogramCU(const DISubprogram *SP, DwarfCompileUnit &SrcCU)
Find the matching DwarfCompileUnit for the given SP referenced from SrcCU.
void emitDebugLocEntryLocation(const DebugLocStream::Entry &Entry, const DwarfCompileUnit *CU)
Emit the location for a debug loc entry, including the size header.
const MCSymbol * getSectionLabel(const MCSection *S)
static void emitDebugLocValue(const AsmPrinter &AP, const DIBasicType *BT, const DbgValueLoc &Value, DwarfExpression &DwarfExpr)
bool useSplitDwarf() const
Returns whether or not to change the current debug info for the split dwarf proposal support.
Definition DwarfDebug.h:824
unsigned getDwarfCompileUnitIDForLineTable(const DwarfCompileUnit &CU)
Get Dwarf compile unit ID for line table.
const MachineInstr * emitInitialLocDirective(const MachineFunction &MF, unsigned CUID)
Emits inital debug location directive.
bool useRangesSection() const
Returns whether ranges section should be emitted.
Definition DwarfDebug.h:784
void addAccelName(const DwarfUnit &Unit, const DICompileUnit::DebugNameTableKind NameTableKind, StringRef Name, const DIE &Die)
bool isLexicalScopeDIENull(LexicalScope *Scope)
A helper function to check whether the DIE for a given Scope is going to be null.
void addDwarfTypeUnitType(DwarfCompileUnit &CU, StringRef Identifier, DIE &Die, const DICompositeType *CTy)
Add a DIE to the set of types that we're going to pull into type units.
void endModule() override
Emit all Dwarf sections that should come after the content.
void addAccelType(const DwarfUnit &Unit, const DICompileUnit::DebugNameTableKind NameTableKind, StringRef Name, const DIE &Die, char Flags)
void beginCodeAlignment(const MachineBasicBlock &MBB) override
Process beginning of code alignment.
DwarfDebug(AsmPrinter *A)
void beginFunctionImpl(const MachineFunction *MF) override
Gather pre-function debug information.
AccelTableKind getAccelTableKind() const
Returns what kind (if any) of accelerator tables to emit.
Definition DwarfDebug.h:813
static uint64_t makeTypeSignature(StringRef Identifier)
Perform an MD5 checksum of Identifier and return the lower 64 bits.
Base class containing the logic for constructing DWARF expressions independently of whether they are ...
void setLocation(const MachineLocation &Loc, const DIExpression *DIExpr)
Set the location (Loc) and DIExpression (DIExpr) to describe.
virtual void disableTemporaryBuffer()=0
Disable emission to the temporary buffer.
virtual unsigned getTemporaryBufferSize()=0
Return the emitted size, in number of bytes, for the data stored in the temporary buffer.
void finalize()
This needs to be called last to commit any pending changes.
void addFragmentOffset(const DIExpression *Expr)
If applicable, emit an empty DW_OP_piece / DW_OP_bit_piece to advance to the fragment described by Ex...
void setMemoryLocationKind()
Lock this down to become a memory location description.
std::optional< uint8_t > TagOffset
void addBooleanConstant(int64_t Value)
Emit a boolean constant.
void addConstantFP(const APFloat &Value, const AsmPrinter &AP)
Emit an floating point constant.
bool addMachineRegExpression(const TargetRegisterInfo &TRI, DIExpressionCursor &Expr, llvm::Register MachineReg, unsigned FragmentOffsetInBits=0)
Emit a machine register location.
void addUnsignedConstant(uint64_t Value)
Emit an unsigned constant.
void addExpression(DIExpressionCursor &&Expr)
Emit all remaining operations in the DIExpressionCursor.
void addSignedConstant(int64_t Value)
Emit a signed constant.
virtual void commitTemporaryBuffer()=0
Commit the data stored in the temporary buffer to the main output.
void addWasmLocation(unsigned Index, uint64_t Offset)
Emit location information expressed via WebAssembly location + offset The Index is an identifier for ...
virtual void enableTemporaryBuffer()=0
Start emitting data to the temporary buffer.
void beginEntryValueExpression(DIExpressionCursor &ExprCursor)
Begin emission of an entry value dwarf operation.
void setRnglistsTableBaseSym(MCSymbol *Sym)
Definition DwarfFile.h:160
void emitUnits(bool UseOffsets)
Emit all of the units to the section listed with the given abbreviation section.
Definition DwarfFile.cpp:29
const SmallVectorImpl< RangeSpanList > & getRangeLists() const
getRangeLists - Get the vector of range lists.
Definition DwarfFile.h:119
MCSymbol * getStringOffsetsStartSym() const
Definition DwarfFile.h:156
MCSymbol * getRnglistsTableBaseSym() const
Definition DwarfFile.h:159
DwarfStringPool & getStringPool()
Returns the string pool.
Definition DwarfFile.h:154
void emitAbbrevs(MCSection *)
Emit a set of abbreviations to the specific section.
Definition DwarfFile.cpp:97
void emitStrings(MCSection *StrSection, MCSection *OffsetSection=nullptr, bool UseRelativeOffsets=false)
Emit all of the strings to the section given.
DwarfStringPoolEntryRef: Dwarf string pool entry reference.
LLVM_ABI_FOR_TEST EntryRef getEntry(AsmPrinter &Asm, StringRef Str)
Get a reference to an entry in the string pool.
LLVM_ABI_FOR_TEST void emitStringOffsetsTableHeader(AsmPrinter &Asm, MCSection *OffsetSection, MCSymbol *StartSym)
void setTypeSignature(uint64_t Signature)
Definition DwarfUnit.h:422
void setType(const DIE *Ty)
Definition DwarfUnit.h:425
This dwarf writer support class manages information associated with a source file.
Definition DwarfUnit.h:35
void addStringOffsetsStart()
Add the DW_AT_str_offsets_base attribute to the unit DIE.
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.
DIE * createTypeDIE(const DIScope *Context, DIE &ContextDIE, const DIType *Ty)
Creates type DIE with specific context.
const DICompileUnit * getCUNode() const
Definition DwarfUnit.h:111
void addFlag(DIE &Die, dwarf::Attribute Attribute)
Add a flag that is true to the DIE.
unsigned getUniqueID() const
Gets Unique ID for this unit.
Definition DwarfUnit.h:101
DISubprogram * getSubprogram() const
Get the attached subprogram.
LLVMContext & getContext() const
getContext - Return a reference to the LLVMContext associated with this function.
Definition Function.cpp:359
static StringRef dropLLVMManglingEscape(StringRef Name)
If the given string begins with the GlobalValue name mangling escape character '\1',...
bool analyzeBranch(MachineBasicBlock &MBB, MachineBasicBlock *&TBB, MachineBasicBlock *&FBB, SmallVectorImpl< MachineOperand > &Cond, bool AllowModify) const override
Analyze the branching code at the end of MBB, returning true if it cannot be understood (e....
bool isTailCall(const MachineInstr &MI) const override
Record instruction ordering so we can query their relative positions within a function.
This class is used to track scope information.
SmallVectorImpl< InsnRange > & getRanges()
const DILocalScope * getScopeNode() const
This class provides interface to collect and use lexical scoping information from machine instruction...
LLVM_ABI LexicalScope * findLexicalScope(const DILocation *DL)
Find lexical scope, either regular or inlined, for the given DebugLoc.
LexicalScope * findAbstractScope(const DILocalScope *N)
Find an abstract scope or return null.
Single(DbgValueLoc ValueLoc)
static LLVM_ABI void make(MCStreamer *MCOS, MCSection *Section)
Definition MCDwarf.cpp:91
MCSection * getDwarfLoclistsSection() const
MCSection * getDwarfRangesSection() const
MCSection * getDwarfMacroSection() const
MCSection * getDwarfMacinfoDWOSection() const
MCSection * getDwarfMacinfoSection() const
MCSection * getDwarfMacroDWOSection() const
uint8_t OperandType
Information about the type of the operand.
Instances of this class represent a uniqued identifier for a section in the current translation unit.
Definition MCSection.h:521
MCSymbol * getBeginSymbol()
Definition MCSection.h:593
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
Definition MCSymbol.h:42
uint32_t getIndex() const
Get the (implementation defined) index.
Definition MCSymbol.h:280
MCSection & getSection() const
Get the section associated with a defined, non-absolute symbol.
Definition MCSymbol.h:251
LLVM_ABI void update(ArrayRef< uint8_t > Data)
Updates the hash for the byte stream provided.
Definition MD5.cpp:189
LLVM_ABI void final(MD5Result &Result)
Finishes off the hash and puts the result in result.
Definition MD5.cpp:234
Metadata node.
Definition Metadata.h:1077
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Definition Metadata.h:1561
MBBSectionID getSectionID() const
Returns the section ID of this basic block.
iterator_range< succ_iterator > successors()
reverse_iterator rbegin()
iterator_range< pred_iterator > predecessors()
MachineInstrBundleIterator< const MachineInstr, true > const_reverse_iterator
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
const CallSiteInfoMap & getCallSitesInfo() const
Function & getFunction()
Return the LLVM function that this machine code represents.
Representation of each machine instruction.
const MachineBasicBlock * getParent() const
bool isCall(QueryType Type=AnyInBundle) const
bool isBundle() const
unsigned getNumOperands() const
Retuns the total number of operands.
bool hasDelaySlot(QueryType Type=AnyInBundle) const
Returns true if the specified instruction has a delay slot which must be filled by the code generator...
mop_range uses()
Returns all operands which may be register uses.
LLVM_ABI const MachineFunction * getMF() const
Return the function that contains the basic block that this instruction belongs to.
const DebugLoc & getDebugLoc() const
Returns the debug location id of this MachineInstr.
bool isDebugValue() const
MachineOperand class - Representation of each machine instruction operand.
LLVM_ABI unsigned getOperandNo() const
Returns the index of this operand in the instruction that it belongs to.
const GlobalValue * getGlobal() const
bool isReg() const
isReg - Tests if this is a MO_Register operand.
bool isGlobal() const
isGlobal - Tests if this is a MO_GlobalAddress operand.
Register getReg() const
getReg - Returns the register number.
This class implements a map that also provides access to all stored values in a deterministic order.
Definition MapVector.h:36
VectorType::iterator erase(typename VectorType::iterator Iterator)
Remove the element given by Iterator.
Definition MapVector.h:175
bool empty() const
Definition MapVector.h:77
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
Definition MapVector.h:119
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:67
Wrapper class representing virtual and physical registers.
Definition Register.h:19
constexpr bool isPhysical() const
Return true if the specified register number is in the physical register namespace.
Definition Register.h:78
bool empty() const
Determine if the SetVector is empty or not.
Definition SetVector.h:99
A SetVector that performs no allocations if smaller than a certain size.
Definition SetVector.h:338
SmallSet - This maintains a set of unique values, optimizing for the case when the set is small (less...
Definition SmallSet.h:133
void insert_range(Range &&R)
Definition SmallSet.h:195
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 assign(size_type NumElts, ValueParamT Elt)
reference emplace_back(ArgTypes &&... Args)
iterator erase(const_iterator CI)
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StringMap - This is an unconventional map that is specialized for handling keys that are "strings",...
Definition StringMap.h:133
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:143
TargetInstrInfo - Interface to description of machine instruction set.
const Triple & getTargetTriple() const
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
virtual const TargetInstrInfo * getInstrInfo() const
virtual const TargetRegisterInfo * getRegisterInfo() const =0
Return the target's register information.
virtual const TargetLowering * getTargetLowering() const
Triple - Helper class for working with autoconf configuration names.
Definition Triple.h:47
bool isWasm() const
Tests whether the target is wasm (32- and 64-bit).
Definition Triple.h:1118
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition Twine.h:82
LLVM Value Representation.
Definition Value.h:75
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
Definition Value.cpp:322
std::pair< iterator, bool > insert(const ValueT &V)
Definition DenseSet.h:202
void insert_range(Range &&R)
Definition DenseSet.h:228
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
reverse_self_iterator getReverseIterator()
Definition ilist_node.h:126
self_iterator getIterator()
Definition ilist_node.h:123
A raw_ostream that writes to an SmallVector or SmallString.
bool tuneForSCE() const
Definition DwarfDebug.h:929
bool tuneForDBX() const
Definition DwarfDebug.h:930
bool tuneForGDB() const
Definition DwarfDebug.h:927
bool tuneForLLDB() const
Definition DwarfDebug.h:928
LLVM_ABI StringRef RangeListEncodingString(unsigned Encoding)
Definition Dwarf.cpp:610
LLVM_ABI StringRef GDBIndexEntryLinkageString(GDBIndexEntryLinkage Linkage)
Definition Dwarf.cpp:725
LLVM_ABI StringRef MacroString(unsigned Encoding)
Definition Dwarf.cpp:582
LLVM_ABI StringRef LocListEncodingString(unsigned Encoding)
Definition Dwarf.cpp:621
LLVM_ABI StringRef GnuMacroString(unsigned Encoding)
Definition Dwarf.cpp:593
LLVM_ABI StringRef MacinfoString(unsigned Encoding)
Definition Dwarf.cpp:553
LLVM_ABI StringRef OperationEncodingString(unsigned Encoding)
Definition Dwarf.cpp:138
LLVM_ABI StringRef GDBIndexEntryKindString(GDBIndexEntryKind Kind)
Definition Dwarf.cpp:702
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr char Align[]
Key for Kernel::Arg::Metadata::mAlign.
@ Entry
Definition COFF.h:862
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition CallingConv.h:24
ValuesClass values(OptsTy... Options)
Helper to build a ValuesClass by forwarding a variable number of arguments as an initializer list to ...
initializer< Ty > init(const Ty &Val)
Attribute
Attributes.
Definition Dwarf.h:125
@ DWARF64
Definition Dwarf.h:93
@ DWARF32
Definition Dwarf.h:93
@ DW_MACINFO_start_file
Definition Dwarf.h:812
@ DW_MACINFO_end_file
Definition Dwarf.h:813
@ DW_MACINFO_define
Definition Dwarf.h:810
@ GIEK_NONE
Definition Dwarf.h:965
@ GIEK_TYPE
Definition Dwarf.h:966
@ GIEK_FUNCTION
Definition Dwarf.h:968
@ GIEK_VARIABLE
Definition Dwarf.h:967
bool isCPlusPlus(SourceLanguage S)
Definition Dwarf.h:505
@ DW_ARANGES_VERSION
Section version number for .debug_aranges.
Definition Dwarf.h:66
@ DW_PUBNAMES_VERSION
Section version number for .debug_pubnames.
Definition Dwarf.h:65
@ DWARF_VERSION
Other constants.
Definition Dwarf.h:63
GDBIndexEntryLinkage
Definition Dwarf.h:975
@ GIEL_EXTERNAL
Definition Dwarf.h:975
@ GIEL_STATIC
Definition Dwarf.h:975
LLVM_ABI MCSymbol * emitListsTableHeaderStart(MCStreamer &S)
Definition MCDwarf.cpp:44
NodeAddr< InstrNode * > Instr
Definition RDFGraph.h:389
bool empty() const
Definition BasicBlock.h:101
This is an optimization pass for GlobalISel generic memory operations.
@ Offset
Definition DWP.cpp:477
@ Length
Definition DWP.cpp:477
bool operator<(int64_t V1, const APSInt &V2)
Definition APSInt.h:362
FunctionAddr VTableAddr Value
Definition InstrProf.h:137
MachineBasicBlock::instr_iterator getBundleStart(MachineBasicBlock::instr_iterator I)
Returns an iterator to the first instruction in the bundle containing I.
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1705
std::string fromHex(StringRef Input)
Convert hexadecimal string Input to its binary representation. The return string is half the size of ...
auto enumerate(FirstRange &&First, RestRanges &&...Rest)
Given two or more input ranges, returns a new range whose values are tuples (A, B,...
Definition STLExtras.h:2452
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:644
auto cast_or_null(const Y &Val)
Definition Casting.h:715
auto unique(Range &&R, Predicate P)
Definition STLExtras.h:2056
bool isa_and_nonnull(const Y &Val)
Definition Casting.h:677
Op::Description Desc
SmallVector< DbgCallSiteParam, 4 > ParamSet
Collection used for storing debug call site parameters.
Definition DwarfDebug.h:332
auto dyn_cast_or_null(const Y &Val)
Definition Casting.h:754
void erase(Container &C, ValueType V)
Wrapper function to remove a value from a container:
Definition STLExtras.h:2108
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:1712
void sort(IteratorTy Start, IteratorTy End)
Definition STLExtras.h:1624
AccelTableKind
The kind of accelerator tables we should emit.
Definition DwarfDebug.h:343
@ Default
Platform default.
Definition DwarfDebug.h:344
@ Apple
.apple_names, .apple_namespaces, .apple_types, .apple_objc.
Definition DwarfDebug.h:346
@ Dwarf
DWARF v5 .debug_names.
Definition DwarfDebug.h:347
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:207
bool none_of(R &&Range, UnaryPredicate P)
Provide wrappers to std::none_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1719
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
Definition Error.cpp:167
MachineBasicBlock::instr_iterator getBundleEnd(MachineBasicBlock::instr_iterator I)
Returns an iterator pointing beyond the bundle containing I.
bool is_sorted(R &&Range, Compare C)
Wrapper function around std::is_sorted to check if elements in a range R are sorted with respect to a...
Definition STLExtras.h:1900
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
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:548
uint64_t offsetToAlignment(uint64_t Value, Align Alignment)
Returns the offset to the next integer (mod 2**64) that is greater than or equal to Value and is a mu...
Definition Alignment.h:186
@ Global
Append to llvm.global_dtors.
@ Ref
The access may reference the value stored in memory.
Definition ModRef.h:32
auto remove_if(R &&Range, UnaryPredicate P)
Provide wrappers to std::remove_if which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1750
FunctionAddr VTableAddr uintptr_t uintptr_t Data
Definition InstrProf.h:189
void emitAppleAccelTable(AsmPrinter *Asm, AccelTable< DataT > &Contents, StringRef Prefix, const MCSymbol *SecBegin)
Emit an Apple Accelerator Table consisting of entries in the specified AccelTable.
Definition AccelTable.h:452
DWARFExpression::Operation Op
OutputIt copy(R &&Range, OutputIt Out)
Definition STLExtras.h:1815
LLVM_ABI void emitDWARF5AccelTable(AsmPrinter *Asm, DWARF5AccelTable &Contents, const DwarfDebug &DD, ArrayRef< std::unique_ptr< DwarfCompileUnit > > CUs)
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:560
void erase_if(Container &C, UnaryPredicate P)
Provide a container algorithm similar to C++ Library Fundamentals v2's erase_if which is equivalent t...
Definition STLExtras.h:2100
DebuggerKind
Identify a debugger for "tuning" the debug info.
@ SCE
Tune debug info for SCE targets (e.g. PS4).
@ DBX
Tune debug info for dbx.
@ Default
No specific tuning requested.
@ GDB
Tune debug info for gdb.
@ LLDB
Tune debug info for lldb.
@ Enable
Enable colors.
Definition WithColor.h:47
@ Disable
Disable colors.
Definition WithColor.h:49
Implement std::hash so that hash_code can be used in STL containers.
Definition BitVector.h:870
#define N
const MCSymbol * Start
const MCSymbol * End
Represents a parameter whose call site value can be described by applying a debug expression to a reg...
uint64_t ParamReg
The described parameter register.
const DIExpression * Expr
Debug expression that has been built up when walking through the instruction chain that produces the ...
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
A pair of GlobalVariable and DIExpression.
Represents an entry-value location, or a fragment of one.
Definition DwarfDebug.h:120
Proxy for one MMI entry.
Definition DwarfDebug.h:111
void addFrameIndexExpr(const DIExpression *Expr, int FI)
std::set< FrameIndexExpr > FrameIndexExprs
Definition DwarfDebug.h:160
const std::set< FrameIndexExpr > & getFrameIndexExprs() const
Get the FI entries, sorted by fragment offset.
A MapVector that performs no allocations if smaller than a certain size.
Definition MapVector.h:257
Helper used to pair up a symbol and its DWARF compile unit.
Definition DwarfDebug.h:335
const MCSymbol * Sym
Definition DwarfDebug.h:338
DwarfCompileUnit * CU
Definition DwarfDebug.h:339
This struct describes target specific location.
Describes an entry of the various gnu_pub* debug sections.
Definition Dwarf.h:1173