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