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