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