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