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