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