]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - opencl/llvm.git/blob - lib/CodeGen/AsmPrinter/DwarfDebug.cpp
DebugInfo: Attach DW_AT_inline to inlined subprograms at DIE-construction time rather...
[opencl/llvm.git] / lib / CodeGen / AsmPrinter / DwarfDebug.cpp
1 //===-- llvm/CodeGen/DwarfDebug.cpp - Dwarf Debug Framework ---------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file contains support for writing dwarf debug info into asm files.
11 //
12 //===----------------------------------------------------------------------===//
14 #include "ByteStreamer.h"
15 #include "DwarfDebug.h"
16 #include "DIE.h"
17 #include "DIEHash.h"
18 #include "DwarfUnit.h"
19 #include "llvm/ADT/STLExtras.h"
20 #include "llvm/ADT/Statistic.h"
21 #include "llvm/ADT/StringExtras.h"
22 #include "llvm/ADT/Triple.h"
23 #include "llvm/CodeGen/MachineFunction.h"
24 #include "llvm/CodeGen/MachineModuleInfo.h"
25 #include "llvm/IR/Constants.h"
26 #include "llvm/IR/DIBuilder.h"
27 #include "llvm/IR/DataLayout.h"
28 #include "llvm/IR/DebugInfo.h"
29 #include "llvm/IR/Instructions.h"
30 #include "llvm/IR/Module.h"
31 #include "llvm/IR/ValueHandle.h"
32 #include "llvm/MC/MCAsmInfo.h"
33 #include "llvm/MC/MCSection.h"
34 #include "llvm/MC/MCStreamer.h"
35 #include "llvm/MC/MCSymbol.h"
36 #include "llvm/Support/CommandLine.h"
37 #include "llvm/Support/Debug.h"
38 #include "llvm/Support/Dwarf.h"
39 #include "llvm/Support/ErrorHandling.h"
40 #include "llvm/Support/FormattedStream.h"
41 #include "llvm/Support/LEB128.h"
42 #include "llvm/Support/MD5.h"
43 #include "llvm/Support/Path.h"
44 #include "llvm/Support/Timer.h"
45 #include "llvm/Target/TargetFrameLowering.h"
46 #include "llvm/Target/TargetLoweringObjectFile.h"
47 #include "llvm/Target/TargetMachine.h"
48 #include "llvm/Target/TargetOptions.h"
49 #include "llvm/Target/TargetRegisterInfo.h"
50 using namespace llvm;
52 #define DEBUG_TYPE "dwarfdebug"
54 static cl::opt<bool>
55 DisableDebugInfoPrinting("disable-debug-info-print", cl::Hidden,
56                          cl::desc("Disable debug info printing"));
58 static cl::opt<bool> UnknownLocations(
59     "use-unknown-locations", cl::Hidden,
60     cl::desc("Make an absence of debug location information explicit."),
61     cl::init(false));
63 static cl::opt<bool>
64 GenerateGnuPubSections("generate-gnu-dwarf-pub-sections", cl::Hidden,
65                        cl::desc("Generate GNU-style pubnames and pubtypes"),
66                        cl::init(false));
68 static cl::opt<bool> GenerateARangeSection("generate-arange-section",
69                                            cl::Hidden,
70                                            cl::desc("Generate dwarf aranges"),
71                                            cl::init(false));
73 namespace {
74 enum DefaultOnOff { Default, Enable, Disable };
75 }
77 static cl::opt<DefaultOnOff>
78 DwarfAccelTables("dwarf-accel-tables", cl::Hidden,
79                  cl::desc("Output prototype dwarf accelerator tables."),
80                  cl::values(clEnumVal(Default, "Default for platform"),
81                             clEnumVal(Enable, "Enabled"),
82                             clEnumVal(Disable, "Disabled"), clEnumValEnd),
83                  cl::init(Default));
85 static cl::opt<DefaultOnOff>
86 SplitDwarf("split-dwarf", cl::Hidden,
87            cl::desc("Output DWARF5 split debug info."),
88            cl::values(clEnumVal(Default, "Default for platform"),
89                       clEnumVal(Enable, "Enabled"),
90                       clEnumVal(Disable, "Disabled"), clEnumValEnd),
91            cl::init(Default));
93 static cl::opt<DefaultOnOff>
94 DwarfPubSections("generate-dwarf-pub-sections", cl::Hidden,
95                  cl::desc("Generate DWARF pubnames and pubtypes sections"),
96                  cl::values(clEnumVal(Default, "Default for platform"),
97                             clEnumVal(Enable, "Enabled"),
98                             clEnumVal(Disable, "Disabled"), clEnumValEnd),
99                  cl::init(Default));
101 static cl::opt<unsigned>
102 DwarfVersionNumber("dwarf-version", cl::Hidden,
103                    cl::desc("Generate DWARF for dwarf version."), cl::init(0));
105 static const char *const DWARFGroupName = "DWARF Emission";
106 static const char *const DbgTimerName = "DWARF Debug Writer";
108 //===----------------------------------------------------------------------===//
110 /// resolve - Look in the DwarfDebug map for the MDNode that
111 /// corresponds to the reference.
112 template <typename T> T DbgVariable::resolve(DIRef<T> Ref) const {
113   return DD->resolve(Ref);
116 bool DbgVariable::isBlockByrefVariable() const {
117   assert(Var.isVariable() && "Invalid complex DbgVariable!");
118   return Var.isBlockByrefVariable(DD->getTypeIdentifierMap());
121 DIType DbgVariable::getType() const {
122   DIType Ty = Var.getType().resolve(DD->getTypeIdentifierMap());
123   // FIXME: isBlockByrefVariable should be reformulated in terms of complex
124   // addresses instead.
125   if (Var.isBlockByrefVariable(DD->getTypeIdentifierMap())) {
126     /* Byref variables, in Blocks, are declared by the programmer as
127        "SomeType VarName;", but the compiler creates a
128        __Block_byref_x_VarName struct, and gives the variable VarName
129        either the struct, or a pointer to the struct, as its type.  This
130        is necessary for various behind-the-scenes things the compiler
131        needs to do with by-reference variables in blocks.
133        However, as far as the original *programmer* is concerned, the
134        variable should still have type 'SomeType', as originally declared.
136        The following function dives into the __Block_byref_x_VarName
137        struct to find the original type of the variable.  This will be
138        passed back to the code generating the type for the Debug
139        Information Entry for the variable 'VarName'.  'VarName' will then
140        have the original type 'SomeType' in its debug information.
142        The original type 'SomeType' will be the type of the field named
143        'VarName' inside the __Block_byref_x_VarName struct.
145        NOTE: In order for this to not completely fail on the debugger
146        side, the Debug Information Entry for the variable VarName needs to
147        have a DW_AT_location that tells the debugger how to unwind through
148        the pointers and __Block_byref_x_VarName struct to find the actual
149        value of the variable.  The function addBlockByrefType does this.  */
150     DIType subType = Ty;
151     uint16_t tag = Ty.getTag();
153     if (tag == dwarf::DW_TAG_pointer_type)
154       subType = resolve(DIDerivedType(Ty).getTypeDerivedFrom());
156     DIArray Elements = DICompositeType(subType).getTypeArray();
157     for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
158       DIDerivedType DT(Elements.getElement(i));
159       if (getName() == DT.getName())
160         return (resolve(DT.getTypeDerivedFrom()));
161     }
162   }
163   return Ty;
166 static LLVM_CONSTEXPR DwarfAccelTable::Atom TypeAtoms[] = {
167     DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset, dwarf::DW_FORM_data4),
168     DwarfAccelTable::Atom(dwarf::DW_ATOM_die_tag, dwarf::DW_FORM_data2),
169     DwarfAccelTable::Atom(dwarf::DW_ATOM_type_flags, dwarf::DW_FORM_data1)};
171 DwarfDebug::DwarfDebug(AsmPrinter *A, Module *M)
172     : Asm(A), MMI(Asm->MMI), FirstCU(nullptr), PrevLabel(nullptr),
173       GlobalRangeCount(0), InfoHolder(A, "info_string", DIEValueAllocator),
174       UsedNonDefaultText(false),
175       SkeletonHolder(A, "skel_string", DIEValueAllocator),
176       AccelNames(DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset,
177                                        dwarf::DW_FORM_data4)),
178       AccelObjC(DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset,
179                                       dwarf::DW_FORM_data4)),
180       AccelNamespace(DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset,
181                                            dwarf::DW_FORM_data4)),
182       AccelTypes(TypeAtoms) {
184   DwarfInfoSectionSym = DwarfAbbrevSectionSym = DwarfStrSectionSym = nullptr;
185   DwarfDebugRangeSectionSym = DwarfDebugLocSectionSym = nullptr;
186   DwarfLineSectionSym = nullptr;
187   DwarfAddrSectionSym = nullptr;
188   DwarfAbbrevDWOSectionSym = DwarfStrDWOSectionSym = nullptr;
189   FunctionBeginSym = FunctionEndSym = nullptr;
190   CurFn = nullptr;
191   CurMI = nullptr;
193   // Turn on accelerator tables for Darwin by default, pubnames by
194   // default for non-Darwin, and handle split dwarf.
195   bool IsDarwin = Triple(A->getTargetTriple()).isOSDarwin();
197   if (DwarfAccelTables == Default)
198     HasDwarfAccelTables = IsDarwin;
199   else
200     HasDwarfAccelTables = DwarfAccelTables == Enable;
202   if (SplitDwarf == Default)
203     HasSplitDwarf = false;
204   else
205     HasSplitDwarf = SplitDwarf == Enable;
207   if (DwarfPubSections == Default)
208     HasDwarfPubSections = !IsDarwin;
209   else
210     HasDwarfPubSections = DwarfPubSections == Enable;
212   DwarfVersion = DwarfVersionNumber ? DwarfVersionNumber
213                                     : MMI->getModule()->getDwarfVersion();
215   {
216     NamedRegionTimer T(DbgTimerName, DWARFGroupName, TimePassesIsEnabled);
217     beginModule();
218   }
221 // Define out of line so we don't have to include DwarfUnit.h in DwarfDebug.h.
222 DwarfDebug::~DwarfDebug() { }
224 // Switch to the specified MCSection and emit an assembler
225 // temporary label to it if SymbolStem is specified.
226 static MCSymbol *emitSectionSym(AsmPrinter *Asm, const MCSection *Section,
227                                 const char *SymbolStem = nullptr) {
228   Asm->OutStreamer.SwitchSection(Section);
229   if (!SymbolStem)
230     return nullptr;
232   MCSymbol *TmpSym = Asm->GetTempSymbol(SymbolStem);
233   Asm->OutStreamer.EmitLabel(TmpSym);
234   return TmpSym;
237 static bool isObjCClass(StringRef Name) {
238   return Name.startswith("+") || Name.startswith("-");
241 static bool hasObjCCategory(StringRef Name) {
242   if (!isObjCClass(Name))
243     return false;
245   return Name.find(") ") != StringRef::npos;
248 static void getObjCClassCategory(StringRef In, StringRef &Class,
249                                  StringRef &Category) {
250   if (!hasObjCCategory(In)) {
251     Class = In.slice(In.find('[') + 1, In.find(' '));
252     Category = "";
253     return;
254   }
256   Class = In.slice(In.find('[') + 1, In.find('('));
257   Category = In.slice(In.find('[') + 1, In.find(' '));
258   return;
261 static StringRef getObjCMethodName(StringRef In) {
262   return In.slice(In.find(' ') + 1, In.find(']'));
265 // Helper for sorting sections into a stable output order.
266 static bool SectionSort(const MCSection *A, const MCSection *B) {
267   std::string LA = (A ? A->getLabelBeginName() : "");
268   std::string LB = (B ? B->getLabelBeginName() : "");
269   return LA < LB;
272 // Add the various names to the Dwarf accelerator table names.
273 // TODO: Determine whether or not we should add names for programs
274 // that do not have a DW_AT_name or DW_AT_linkage_name field - this
275 // is only slightly different than the lookup of non-standard ObjC names.
276 void DwarfDebug::addSubprogramNames(DISubprogram SP, DIE &Die) {
277   if (!SP.isDefinition())
278     return;
279   addAccelName(SP.getName(), Die);
281   // If the linkage name is different than the name, go ahead and output
282   // that as well into the name table.
283   if (SP.getLinkageName() != "" && SP.getName() != SP.getLinkageName())
284     addAccelName(SP.getLinkageName(), Die);
286   // If this is an Objective-C selector name add it to the ObjC accelerator
287   // too.
288   if (isObjCClass(SP.getName())) {
289     StringRef Class, Category;
290     getObjCClassCategory(SP.getName(), Class, Category);
291     addAccelObjC(Class, Die);
292     if (Category != "")
293       addAccelObjC(Category, Die);
294     // Also add the base method name to the name table.
295     addAccelName(getObjCMethodName(SP.getName()), Die);
296   }
299 /// isSubprogramContext - Return true if Context is either a subprogram
300 /// or another context nested inside a subprogram.
301 bool DwarfDebug::isSubprogramContext(const MDNode *Context) {
302   if (!Context)
303     return false;
304   DIDescriptor D(Context);
305   if (D.isSubprogram())
306     return true;
307   if (D.isType())
308     return isSubprogramContext(resolve(DIType(Context).getContext()));
309   return false;
312 // Find DIE for the given subprogram and attach appropriate DW_AT_low_pc
313 // and DW_AT_high_pc attributes. If there are global variables in this
314 // scope then create and insert DIEs for these variables.
315 DIE &DwarfDebug::updateSubprogramScopeDIE(DwarfCompileUnit &SPCU,
316                                           DISubprogram SP) {
317   DIE *SPDie = SPCU.getDIE(SP);
319   assert(SPDie && "Unable to find subprogram DIE!");
321   // If we're updating an abstract DIE, then we will be adding the children and
322   // object pointer later on. But what we don't want to do is process the
323   // concrete DIE twice.
324   if (DIE *AbsSPDIE = AbstractSPDies.lookup(SP)) {
325     // Pick up abstract subprogram DIE.
326     SPDie = &SPCU.createAndAddDIE(dwarf::DW_TAG_subprogram, SPCU.getUnitDie());
327     SPCU.addDIEEntry(*SPDie, dwarf::DW_AT_abstract_origin, *AbsSPDIE);
328   } else {
329     DISubprogram SPDecl = SP.getFunctionDeclaration();
330     if (!SPDecl.isSubprogram()) {
331       // There is not any need to generate specification DIE for a function
332       // defined at compile unit level. If a function is defined inside another
333       // function then gdb prefers the definition at top level and but does not
334       // expect specification DIE in parent function. So avoid creating
335       // specification DIE for a function defined inside a function.
336       DIScope SPContext = resolve(SP.getContext());
337       if (SP.isDefinition() && !SPContext.isCompileUnit() &&
338           !SPContext.isFile() && !isSubprogramContext(SPContext)) {
339         SPCU.addFlag(*SPDie, dwarf::DW_AT_declaration);
341         // Add arguments.
342         DICompositeType SPTy = SP.getType();
343         DIArray Args = SPTy.getTypeArray();
344         uint16_t SPTag = SPTy.getTag();
345         if (SPTag == dwarf::DW_TAG_subroutine_type)
346           SPCU.constructSubprogramArguments(*SPDie, Args);
347         DIE *SPDeclDie = SPDie;
348         SPDie =
349             &SPCU.createAndAddDIE(dwarf::DW_TAG_subprogram, SPCU.getUnitDie());
350         SPCU.addDIEEntry(*SPDie, dwarf::DW_AT_specification, *SPDeclDie);
351       }
352     }
353   }
355   attachLowHighPC(SPCU, *SPDie, FunctionBeginSym, FunctionEndSym);
357   const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
358   MachineLocation Location(RI->getFrameRegister(*Asm->MF));
359   SPCU.addAddress(*SPDie, dwarf::DW_AT_frame_base, Location);
361   // Add name to the name table, we do this here because we're guaranteed
362   // to have concrete versions of our DW_TAG_subprogram nodes.
363   addSubprogramNames(SP, *SPDie);
365   return *SPDie;
368 /// Check whether we should create a DIE for the given Scope, return true
369 /// if we don't create a DIE (the corresponding DIE is null).
370 bool DwarfDebug::isLexicalScopeDIENull(LexicalScope *Scope) {
371   if (Scope->isAbstractScope())
372     return false;
374   // We don't create a DIE if there is no Range.
375   const SmallVectorImpl<InsnRange> &Ranges = Scope->getRanges();
376   if (Ranges.empty())
377     return true;
379   if (Ranges.size() > 1)
380     return false;
382   // We don't create a DIE if we have a single Range and the end label
383   // is null.
384   SmallVectorImpl<InsnRange>::const_iterator RI = Ranges.begin();
385   MCSymbol *End = getLabelAfterInsn(RI->second);
386   return !End;
389 static void addSectionLabel(AsmPrinter &Asm, DwarfUnit &U, DIE &D,
390                             dwarf::Attribute A, const MCSymbol *L,
391                             const MCSymbol *Sec) {
392   if (Asm.MAI->doesDwarfUseRelocationsAcrossSections())
393     U.addSectionLabel(D, A, L);
394   else
395     U.addSectionDelta(D, A, L, Sec);
398 void DwarfDebug::addScopeRangeList(DwarfCompileUnit &TheCU, DIE &ScopeDIE,
399                                    const SmallVectorImpl<InsnRange> &Range) {
400   // Emit offset in .debug_range as a relocatable label. emitDIE will handle
401   // emitting it appropriately.
402   MCSymbol *RangeSym = Asm->GetTempSymbol("debug_ranges", GlobalRangeCount++);
404   // Under fission, ranges are specified by constant offsets relative to the
405   // CU's DW_AT_GNU_ranges_base.
406   if (useSplitDwarf())
407     TheCU.addSectionDelta(ScopeDIE, dwarf::DW_AT_ranges, RangeSym,
408                           DwarfDebugRangeSectionSym);
409   else
410     addSectionLabel(*Asm, TheCU, ScopeDIE, dwarf::DW_AT_ranges, RangeSym,
411                     DwarfDebugRangeSectionSym);
413   RangeSpanList List(RangeSym);
414   for (const InsnRange &R : Range) {
415     RangeSpan Span(getLabelBeforeInsn(R.first), getLabelAfterInsn(R.second));
416     List.addRange(std::move(Span));
417   }
419   // Add the range list to the set of ranges to be emitted.
420   TheCU.addRangeList(std::move(List));
423 // Construct new DW_TAG_lexical_block for this scope and attach
424 // DW_AT_low_pc/DW_AT_high_pc labels.
425 std::unique_ptr<DIE>
426 DwarfDebug::constructLexicalScopeDIE(DwarfCompileUnit &TheCU,
427                                      LexicalScope *Scope) {
428   if (isLexicalScopeDIENull(Scope))
429     return nullptr;
431   auto ScopeDIE = make_unique<DIE>(dwarf::DW_TAG_lexical_block);
432   if (Scope->isAbstractScope())
433     return ScopeDIE;
435   const SmallVectorImpl<InsnRange> &ScopeRanges = Scope->getRanges();
437   // If we have multiple ranges, emit them into the range section.
438   if (ScopeRanges.size() > 1) {
439     addScopeRangeList(TheCU, *ScopeDIE, ScopeRanges);
440     return ScopeDIE;
441   }
443   // Construct the address range for this DIE.
444   SmallVectorImpl<InsnRange>::const_iterator RI = ScopeRanges.begin();
445   MCSymbol *Start = getLabelBeforeInsn(RI->first);
446   MCSymbol *End = getLabelAfterInsn(RI->second);
447   assert(End && "End label should not be null!");
449   assert(Start->isDefined() && "Invalid starting label for an inlined scope!");
450   assert(End->isDefined() && "Invalid end label for an inlined scope!");
452   attachLowHighPC(TheCU, *ScopeDIE, Start, End);
454   return ScopeDIE;
457 // This scope represents inlined body of a function. Construct DIE to
458 // represent this concrete inlined copy of the function.
459 std::unique_ptr<DIE>
460 DwarfDebug::constructInlinedScopeDIE(DwarfCompileUnit &TheCU,
461                                      LexicalScope *Scope) {
462   const SmallVectorImpl<InsnRange> &ScopeRanges = Scope->getRanges();
463   assert(!ScopeRanges.empty() &&
464          "LexicalScope does not have instruction markers!");
466   if (!Scope->getScopeNode())
467     return nullptr;
468   DIScope DS(Scope->getScopeNode());
469   DISubprogram InlinedSP = getDISubprogram(DS);
470   DIE *OriginDIE = TheCU.getDIE(InlinedSP);
471   if (!OriginDIE) {
472     DEBUG(dbgs() << "Unable to find original DIE for an inlined subprogram.");
473     return nullptr;
474   }
476   auto ScopeDIE = make_unique<DIE>(dwarf::DW_TAG_inlined_subroutine);
477   TheCU.addDIEEntry(*ScopeDIE, dwarf::DW_AT_abstract_origin, *OriginDIE);
479   // If we have multiple ranges, emit them into the range section.
480   if (ScopeRanges.size() > 1)
481     addScopeRangeList(TheCU, *ScopeDIE, ScopeRanges);
482   else {
483     SmallVectorImpl<InsnRange>::const_iterator RI = ScopeRanges.begin();
484     MCSymbol *StartLabel = getLabelBeforeInsn(RI->first);
485     MCSymbol *EndLabel = getLabelAfterInsn(RI->second);
487     if (!StartLabel || !EndLabel)
488       llvm_unreachable("Unexpected Start and End labels for an inlined scope!");
490     assert(StartLabel->isDefined() &&
491            "Invalid starting label for an inlined scope!");
492     assert(EndLabel->isDefined() && "Invalid end label for an inlined scope!");
494     attachLowHighPC(TheCU, *ScopeDIE, StartLabel, EndLabel);
495   }
497   InlinedSubprogramDIEs.insert(OriginDIE);
498   TheCU.addUInt(*OriginDIE, dwarf::DW_AT_inline, None, dwarf::DW_INL_inlined);
500   // Add the call site information to the DIE.
501   DILocation DL(Scope->getInlinedAt());
502   TheCU.addUInt(*ScopeDIE, dwarf::DW_AT_call_file, None,
503                 TheCU.getOrCreateSourceID(DL.getFilename(), DL.getDirectory()));
504   TheCU.addUInt(*ScopeDIE, dwarf::DW_AT_call_line, None, DL.getLineNumber());
506   // Add name to the name table, we do this here because we're guaranteed
507   // to have concrete versions of our DW_TAG_inlined_subprogram nodes.
508   addSubprogramNames(InlinedSP, *ScopeDIE);
510   return ScopeDIE;
513 static std::unique_ptr<DIE> constructVariableDIE(DwarfCompileUnit &TheCU,
514                                                  DbgVariable &DV,
515                                                  const LexicalScope &Scope,
516                                                  DIE *&ObjectPointer) {
517   AbstractOrInlined AOI = AOI_None;
518   if (Scope.isAbstractScope())
519     AOI = AOI_Abstract;
520   else if (Scope.getInlinedAt())
521     AOI = AOI_Inlined;
522   auto Var = TheCU.constructVariableDIE(DV, AOI);
523   if (DV.isObjectPointer())
524     ObjectPointer = Var.get();
525   return Var;
528 DIE *DwarfDebug::createScopeChildrenDIE(
529     DwarfCompileUnit &TheCU, LexicalScope *Scope,
530     SmallVectorImpl<std::unique_ptr<DIE>> &Children) {
531   DIE *ObjectPointer = nullptr;
533   // Collect arguments for current function.
534   if (LScopes.isCurrentFunctionScope(Scope)) {
535     for (DbgVariable *ArgDV : CurrentFnArguments)
536       if (ArgDV)
537         Children.push_back(
538             constructVariableDIE(TheCU, *ArgDV, *Scope, ObjectPointer));
540     // If this is a variadic function, add an unspecified parameter.
541     DISubprogram SP(Scope->getScopeNode());
542     DIArray FnArgs = SP.getType().getTypeArray();
543     if (FnArgs.getElement(FnArgs.getNumElements() - 1)
544             .isUnspecifiedParameter()) {
545       Children.push_back(
546           make_unique<DIE>(dwarf::DW_TAG_unspecified_parameters));
547     }
548   }
550   // Collect lexical scope children first.
551   for (DbgVariable *DV : ScopeVariables.lookup(Scope))
552     Children.push_back(constructVariableDIE(TheCU, *DV, *Scope, ObjectPointer));
554   for (LexicalScope *LS : Scope->getChildren())
555     if (std::unique_ptr<DIE> Nested = constructScopeDIE(TheCU, LS))
556       Children.push_back(std::move(Nested));
557   return ObjectPointer;
560 void DwarfDebug::createAndAddScopeChildren(DwarfCompileUnit &TheCU,
561                                            LexicalScope *Scope, DIE &ScopeDIE) {
562   // We create children when the scope DIE is not null.
563   SmallVector<std::unique_ptr<DIE>, 8> Children;
564   if (DIE *ObjectPointer = createScopeChildrenDIE(TheCU, Scope, Children))
565     TheCU.addDIEEntry(ScopeDIE, dwarf::DW_AT_object_pointer, *ObjectPointer);
567   // Add children
568   for (auto &I : Children)
569     ScopeDIE.addChild(std::move(I));
572 void DwarfDebug::constructAbstractSubprogramScopeDIE(DwarfCompileUnit &TheCU,
573                                                      LexicalScope *Scope) {
574   assert(Scope && Scope->getScopeNode());
575   assert(Scope->isAbstractScope());
576   assert(!Scope->getInlinedAt());
578   DISubprogram Sub(Scope->getScopeNode());
580   if (!ProcessedSPNodes.insert(Sub))
581     return;
583   if (DIE *ScopeDIE = TheCU.getDIE(Sub)) {
584     AbstractSPDies.insert(std::make_pair(Sub, ScopeDIE));
585     createAndAddScopeChildren(TheCU, Scope, *ScopeDIE);
586   }
589 DIE &DwarfDebug::constructSubprogramScopeDIE(DwarfCompileUnit &TheCU,
590                                              LexicalScope *Scope) {
591   assert(Scope && Scope->getScopeNode());
592   assert(!Scope->getInlinedAt());
593   assert(!Scope->isAbstractScope());
594   assert(DIScope(Scope->getScopeNode()).isSubprogram());
596   DISubprogram Sub(Scope->getScopeNode());
598   ProcessedSPNodes.insert(Sub);
600   DIE &ScopeDIE = updateSubprogramScopeDIE(TheCU, Sub);
602   createAndAddScopeChildren(TheCU, Scope, ScopeDIE);
604   return ScopeDIE;
607 // Construct a DIE for this scope.
608 std::unique_ptr<DIE> DwarfDebug::constructScopeDIE(DwarfCompileUnit &TheCU,
609                                                    LexicalScope *Scope) {
610   if (!Scope || !Scope->getScopeNode())
611     return nullptr;
613   DIScope DS(Scope->getScopeNode());
615   assert((Scope->getInlinedAt() || !DS.isSubprogram()) &&
616          "Only handle inlined subprograms here, use "
617          "constructSubprogramScopeDIE for non-inlined "
618          "subprograms");
620   SmallVector<std::unique_ptr<DIE>, 8> Children;
622   // We try to create the scope DIE first, then the children DIEs. This will
623   // avoid creating un-used children then removing them later when we find out
624   // the scope DIE is null.
625   std::unique_ptr<DIE> ScopeDIE;
626   if (DS.getContext() && DS.isSubprogram()) {
627     ScopeDIE = constructInlinedScopeDIE(TheCU, Scope);
628     if (!ScopeDIE)
629       return nullptr;
630     // We create children when the scope DIE is not null.
631     createScopeChildrenDIE(TheCU, Scope, Children);
632   } else {
633     // Early exit when we know the scope DIE is going to be null.
634     if (isLexicalScopeDIENull(Scope))
635       return nullptr;
637     // We create children here when we know the scope DIE is not going to be
638     // null and the children will be added to the scope DIE.
639     createScopeChildrenDIE(TheCU, Scope, Children);
641     // There is no need to emit empty lexical block DIE.
642     std::pair<ImportedEntityMap::const_iterator,
643               ImportedEntityMap::const_iterator> Range =
644         std::equal_range(ScopesWithImportedEntities.begin(),
645                          ScopesWithImportedEntities.end(),
646                          std::pair<const MDNode *, const MDNode *>(DS, nullptr),
647                          less_first());
648     if (Children.empty() && Range.first == Range.second)
649       return nullptr;
650     ScopeDIE = constructLexicalScopeDIE(TheCU, Scope);
651     assert(ScopeDIE && "Scope DIE should not be null.");
652     for (ImportedEntityMap::const_iterator i = Range.first; i != Range.second;
653          ++i)
654       constructImportedEntityDIE(TheCU, i->second, *ScopeDIE);
655   }
657   // Add children
658   for (auto &I : Children)
659     ScopeDIE->addChild(std::move(I));
661   return ScopeDIE;
664 void DwarfDebug::addGnuPubAttributes(DwarfUnit &U, DIE &D) const {
665   if (!GenerateGnuPubSections)
666     return;
668   U.addFlag(D, dwarf::DW_AT_GNU_pubnames);
671 // Create new DwarfCompileUnit for the given metadata node with tag
672 // DW_TAG_compile_unit.
673 DwarfCompileUnit &DwarfDebug::constructDwarfCompileUnit(DICompileUnit DIUnit) {
674   StringRef FN = DIUnit.getFilename();
675   CompilationDir = DIUnit.getDirectory();
677   auto OwnedUnit = make_unique<DwarfCompileUnit>(
678       InfoHolder.getUnits().size(), DIUnit, Asm, this, &InfoHolder);
679   DwarfCompileUnit &NewCU = *OwnedUnit;
680   DIE &Die = NewCU.getUnitDie();
681   InfoHolder.addUnit(std::move(OwnedUnit));
683   // LTO with assembly output shares a single line table amongst multiple CUs.
684   // To avoid the compilation directory being ambiguous, let the line table
685   // explicitly describe the directory of all files, never relying on the
686   // compilation directory.
687   if (!Asm->OutStreamer.hasRawTextSupport() || SingleCU)
688     Asm->OutStreamer.getContext().setMCLineTableCompilationDir(
689         NewCU.getUniqueID(), CompilationDir);
691   NewCU.addString(Die, dwarf::DW_AT_producer, DIUnit.getProducer());
692   NewCU.addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data2,
693                 DIUnit.getLanguage());
694   NewCU.addString(Die, dwarf::DW_AT_name, FN);
696   if (!useSplitDwarf()) {
697     NewCU.initStmtList(DwarfLineSectionSym);
699     // If we're using split dwarf the compilation dir is going to be in the
700     // skeleton CU and so we don't need to duplicate it here.
701     if (!CompilationDir.empty())
702       NewCU.addString(Die, dwarf::DW_AT_comp_dir, CompilationDir);
704     addGnuPubAttributes(NewCU, Die);
705   }
707   if (DIUnit.isOptimized())
708     NewCU.addFlag(Die, dwarf::DW_AT_APPLE_optimized);
710   StringRef Flags = DIUnit.getFlags();
711   if (!Flags.empty())
712     NewCU.addString(Die, dwarf::DW_AT_APPLE_flags, Flags);
714   if (unsigned RVer = DIUnit.getRunTimeVersion())
715     NewCU.addUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers,
716                   dwarf::DW_FORM_data1, RVer);
718   if (!FirstCU)
719     FirstCU = &NewCU;
721   if (useSplitDwarf()) {
722     NewCU.initSection(Asm->getObjFileLowering().getDwarfInfoDWOSection(),
723                       DwarfInfoDWOSectionSym);
724     NewCU.setSkeleton(constructSkeletonCU(NewCU));
725   } else
726     NewCU.initSection(Asm->getObjFileLowering().getDwarfInfoSection(),
727                       DwarfInfoSectionSym);
729   CUMap.insert(std::make_pair(DIUnit, &NewCU));
730   CUDieMap.insert(std::make_pair(&Die, &NewCU));
731   return NewCU;
734 // Construct subprogram DIE.
735 void DwarfDebug::constructSubprogramDIE(DwarfCompileUnit &TheCU,
736                                         const MDNode *N) {
737   // FIXME: We should only call this routine once, however, during LTO if a
738   // program is defined in multiple CUs we could end up calling it out of
739   // beginModule as we walk the CUs.
741   DwarfCompileUnit *&CURef = SPMap[N];
742   if (CURef)
743     return;
744   CURef = &TheCU;
746   DISubprogram SP(N);
747   if (!SP.isDefinition())
748     // This is a method declaration which will be handled while constructing
749     // class type.
750     return;
752   DIE &SubprogramDie = *TheCU.getOrCreateSubprogramDIE(SP);
754   // Expose as a global name.
755   TheCU.addGlobalName(SP.getName(), SubprogramDie, resolve(SP.getContext()));
758 void DwarfDebug::constructImportedEntityDIE(DwarfCompileUnit &TheCU,
759                                             const MDNode *N) {
760   DIImportedEntity Module(N);
761   assert(Module.Verify());
762   if (DIE *D = TheCU.getOrCreateContextDIE(Module.getContext()))
763     constructImportedEntityDIE(TheCU, Module, *D);
766 void DwarfDebug::constructImportedEntityDIE(DwarfCompileUnit &TheCU,
767                                             const MDNode *N, DIE &Context) {
768   DIImportedEntity Module(N);
769   assert(Module.Verify());
770   return constructImportedEntityDIE(TheCU, Module, Context);
773 void DwarfDebug::constructImportedEntityDIE(DwarfCompileUnit &TheCU,
774                                             const DIImportedEntity &Module,
775                                             DIE &Context) {
776   assert(Module.Verify() &&
777          "Use one of the MDNode * overloads to handle invalid metadata");
778   DIE &IMDie = TheCU.createAndAddDIE(Module.getTag(), Context, Module);
779   DIE *EntityDie;
780   DIDescriptor Entity = resolve(Module.getEntity());
781   if (Entity.isNameSpace())
782     EntityDie = TheCU.getOrCreateNameSpace(DINameSpace(Entity));
783   else if (Entity.isSubprogram())
784     EntityDie = TheCU.getOrCreateSubprogramDIE(DISubprogram(Entity));
785   else if (Entity.isType())
786     EntityDie = TheCU.getOrCreateTypeDIE(DIType(Entity));
787   else
788     EntityDie = TheCU.getDIE(Entity);
789   TheCU.addSourceLine(IMDie, Module.getLineNumber(),
790                       Module.getContext().getFilename(),
791                       Module.getContext().getDirectory());
792   TheCU.addDIEEntry(IMDie, dwarf::DW_AT_import, *EntityDie);
793   StringRef Name = Module.getName();
794   if (!Name.empty())
795     TheCU.addString(IMDie, dwarf::DW_AT_name, Name);
798 // Emit all Dwarf sections that should come prior to the content. Create
799 // global DIEs and emit initial debug info sections. This is invoked by
800 // the target AsmPrinter.
801 void DwarfDebug::beginModule() {
802   if (DisableDebugInfoPrinting)
803     return;
805   const Module *M = MMI->getModule();
807   // If module has named metadata anchors then use them, otherwise scan the
808   // module using debug info finder to collect debug info.
809   NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu");
810   if (!CU_Nodes)
811     return;
812   TypeIdentifierMap = generateDITypeIdentifierMap(CU_Nodes);
814   // Emit initial sections so we can reference labels later.
815   emitSectionLabels();
817   SingleCU = CU_Nodes->getNumOperands() == 1;
819   for (MDNode *N : CU_Nodes->operands()) {
820     DICompileUnit CUNode(N);
821     DwarfCompileUnit &CU = constructDwarfCompileUnit(CUNode);
822     DIArray ImportedEntities = CUNode.getImportedEntities();
823     for (unsigned i = 0, e = ImportedEntities.getNumElements(); i != e; ++i)
824       ScopesWithImportedEntities.push_back(std::make_pair(
825           DIImportedEntity(ImportedEntities.getElement(i)).getContext(),
826           ImportedEntities.getElement(i)));
827     std::sort(ScopesWithImportedEntities.begin(),
828               ScopesWithImportedEntities.end(), less_first());
829     DIArray GVs = CUNode.getGlobalVariables();
830     for (unsigned i = 0, e = GVs.getNumElements(); i != e; ++i)
831       CU.createGlobalVariableDIE(DIGlobalVariable(GVs.getElement(i)));
832     DIArray SPs = CUNode.getSubprograms();
833     for (unsigned i = 0, e = SPs.getNumElements(); i != e; ++i)
834       constructSubprogramDIE(CU, SPs.getElement(i));
835     DIArray EnumTypes = CUNode.getEnumTypes();
836     for (unsigned i = 0, e = EnumTypes.getNumElements(); i != e; ++i)
837       CU.getOrCreateTypeDIE(EnumTypes.getElement(i));
838     DIArray RetainedTypes = CUNode.getRetainedTypes();
839     for (unsigned i = 0, e = RetainedTypes.getNumElements(); i != e; ++i) {
840       DIType Ty(RetainedTypes.getElement(i));
841       // The retained types array by design contains pointers to
842       // MDNodes rather than DIRefs. Unique them here.
843       DIType UniqueTy(resolve(Ty.getRef()));
844       CU.getOrCreateTypeDIE(UniqueTy);
845     }
846     // Emit imported_modules last so that the relevant context is already
847     // available.
848     for (unsigned i = 0, e = ImportedEntities.getNumElements(); i != e; ++i)
849       constructImportedEntityDIE(CU, ImportedEntities.getElement(i));
850   }
852   // Tell MMI that we have debug info.
853   MMI->setDebugInfoAvailability(true);
855   // Prime section data.
856   SectionMap[Asm->getObjFileLowering().getTextSection()];
859 // Attach DW_AT_inline attribute with inlined subprogram DIEs.
860 void DwarfDebug::computeInlinedDIEs() {
861   for (const auto &AI : AbstractSPDies) {
862     DIE &ISP = *AI.second;
863     if (InlinedSubprogramDIEs.count(&ISP))
864       continue;
865     FirstCU->addUInt(ISP, dwarf::DW_AT_inline, None, dwarf::DW_INL_inlined);
866   }
869 // Collect info for variables that were optimized out.
870 void DwarfDebug::collectDeadVariables() {
871   const Module *M = MMI->getModule();
873   if (NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu")) {
874     for (MDNode *N : CU_Nodes->operands()) {
875       DICompileUnit TheCU(N);
876       DIArray Subprograms = TheCU.getSubprograms();
877       for (unsigned i = 0, e = Subprograms.getNumElements(); i != e; ++i) {
878         DISubprogram SP(Subprograms.getElement(i));
879         if (ProcessedSPNodes.count(SP) != 0)
880           continue;
881         if (!SP.isSubprogram())
882           continue;
883         if (!SP.isDefinition())
884           continue;
885         DIArray Variables = SP.getVariables();
886         if (Variables.getNumElements() == 0)
887           continue;
889         // Construct subprogram DIE and add variables DIEs.
890         DwarfCompileUnit *SPCU =
891             static_cast<DwarfCompileUnit *>(CUMap.lookup(TheCU));
892         assert(SPCU && "Unable to find Compile Unit!");
893         // FIXME: See the comment in constructSubprogramDIE about duplicate
894         // subprogram DIEs.
895         constructSubprogramDIE(*SPCU, SP);
896         DIE *SPDIE = SPCU->getDIE(SP);
897         for (unsigned vi = 0, ve = Variables.getNumElements(); vi != ve; ++vi) {
898           DIVariable DV(Variables.getElement(vi));
899           if (!DV.isVariable())
900             continue;
901           DbgVariable NewVar(DV, nullptr, this);
902           SPDIE->addChild(SPCU->constructVariableDIE(NewVar));
903         }
904       }
905     }
906   }
909 void DwarfDebug::finalizeModuleInfo() {
910   // Collect info for variables that were optimized out.
911   collectDeadVariables();
913   // Attach DW_AT_inline attribute with inlined subprogram DIEs.
914   computeInlinedDIEs();
916   // Handle anything that needs to be done on a per-unit basis after
917   // all other generation.
918   for (const auto &TheU : getUnits()) {
919     // Emit DW_AT_containing_type attribute to connect types with their
920     // vtable holding type.
921     TheU->constructContainingTypeDIEs();
923     // Add CU specific attributes if we need to add any.
924     if (TheU->getUnitDie().getTag() == dwarf::DW_TAG_compile_unit) {
925       // If we're splitting the dwarf out now that we've got the entire
926       // CU then add the dwo id to it.
927       DwarfCompileUnit *SkCU =
928           static_cast<DwarfCompileUnit *>(TheU->getSkeleton());
929       if (useSplitDwarf()) {
930         // Emit a unique identifier for this CU.
931         uint64_t ID = DIEHash(Asm).computeCUSignature(TheU->getUnitDie());
932         TheU->addUInt(TheU->getUnitDie(), dwarf::DW_AT_GNU_dwo_id,
933                       dwarf::DW_FORM_data8, ID);
934         SkCU->addUInt(SkCU->getUnitDie(), dwarf::DW_AT_GNU_dwo_id,
935                       dwarf::DW_FORM_data8, ID);
937         // We don't keep track of which addresses are used in which CU so this
938         // is a bit pessimistic under LTO.
939         if (!AddrPool.isEmpty())
940           addSectionLabel(*Asm, *SkCU, SkCU->getUnitDie(),
941                           dwarf::DW_AT_GNU_addr_base, DwarfAddrSectionSym,
942                           DwarfAddrSectionSym);
943         if (!TheU->getRangeLists().empty())
944           addSectionLabel(*Asm, *SkCU, SkCU->getUnitDie(),
945                           dwarf::DW_AT_GNU_ranges_base,
946                           DwarfDebugRangeSectionSym, DwarfDebugRangeSectionSym);
947       }
949       // If we have code split among multiple sections or non-contiguous
950       // ranges of code then emit a DW_AT_ranges attribute on the unit that will
951       // remain in the .o file, otherwise add a DW_AT_low_pc.
952       // FIXME: We should use ranges allow reordering of code ala
953       // .subsections_via_symbols in mach-o. This would mean turning on
954       // ranges for all subprogram DIEs for mach-o.
955       DwarfCompileUnit &U =
956           SkCU ? *SkCU : static_cast<DwarfCompileUnit &>(*TheU);
957       unsigned NumRanges = TheU->getRanges().size();
958       if (NumRanges) {
959         if (NumRanges > 1) {
960           addSectionLabel(*Asm, U, U.getUnitDie(), dwarf::DW_AT_ranges,
961                           Asm->GetTempSymbol("cu_ranges", U.getUniqueID()),
962                           DwarfDebugRangeSectionSym);
964           // A DW_AT_low_pc attribute may also be specified in combination with
965           // DW_AT_ranges to specify the default base address for use in
966           // location lists (see Section 2.6.2) and range lists (see Section
967           // 2.17.3).
968           U.addUInt(U.getUnitDie(), dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
969                     0);
970         } else {
971           RangeSpan &Range = TheU->getRanges().back();
972           U.addLocalLabelAddress(U.getUnitDie(), dwarf::DW_AT_low_pc,
973                                  Range.getStart());
974           U.addLabelDelta(U.getUnitDie(), dwarf::DW_AT_high_pc, Range.getEnd(),
975                           Range.getStart());
976         }
977       }
978     }
979   }
981   // Compute DIE offsets and sizes.
982   InfoHolder.computeSizeAndOffsets();
983   if (useSplitDwarf())
984     SkeletonHolder.computeSizeAndOffsets();
987 void DwarfDebug::endSections() {
988   // Filter labels by section.
989   for (const SymbolCU &SCU : ArangeLabels) {
990     if (SCU.Sym->isInSection()) {
991       // Make a note of this symbol and it's section.
992       const MCSection *Section = &SCU.Sym->getSection();
993       if (!Section->getKind().isMetadata())
994         SectionMap[Section].push_back(SCU);
995     } else {
996       // Some symbols (e.g. common/bss on mach-o) can have no section but still
997       // appear in the output. This sucks as we rely on sections to build
998       // arange spans. We can do it without, but it's icky.
999       SectionMap[nullptr].push_back(SCU);
1000     }
1001   }
1003   // Build a list of sections used.
1004   std::vector<const MCSection *> Sections;
1005   for (const auto &it : SectionMap) {
1006     const MCSection *Section = it.first;
1007     Sections.push_back(Section);
1008   }
1010   // Sort the sections into order.
1011   // This is only done to ensure consistent output order across different runs.
1012   std::sort(Sections.begin(), Sections.end(), SectionSort);
1014   // Add terminating symbols for each section.
1015   for (unsigned ID = 0, E = Sections.size(); ID != E; ID++) {
1016     const MCSection *Section = Sections[ID];
1017     MCSymbol *Sym = nullptr;
1019     if (Section) {
1020       // We can't call MCSection::getLabelEndName, as it's only safe to do so
1021       // if we know the section name up-front. For user-created sections, the
1022       // resulting label may not be valid to use as a label. (section names can
1023       // use a greater set of characters on some systems)
1024       Sym = Asm->GetTempSymbol("debug_end", ID);
1025       Asm->OutStreamer.SwitchSection(Section);
1026       Asm->OutStreamer.EmitLabel(Sym);
1027     }
1029     // Insert a final terminator.
1030     SectionMap[Section].push_back(SymbolCU(nullptr, Sym));
1031   }
1034 // Emit all Dwarf sections that should come after the content.
1035 void DwarfDebug::endModule() {
1036   assert(CurFn == nullptr);
1037   assert(CurMI == nullptr);
1039   if (!FirstCU)
1040     return;
1042   // End any existing sections.
1043   // TODO: Does this need to happen?
1044   endSections();
1046   // Finalize the debug info for the module.
1047   finalizeModuleInfo();
1049   emitDebugStr();
1051   // Emit all the DIEs into a debug info section.
1052   emitDebugInfo();
1054   // Corresponding abbreviations into a abbrev section.
1055   emitAbbreviations();
1057   // Emit info into a debug aranges section.
1058   if (GenerateARangeSection)
1059     emitDebugARanges();
1061   // Emit info into a debug ranges section.
1062   emitDebugRanges();
1064   if (useSplitDwarf()) {
1065     emitDebugStrDWO();
1066     emitDebugInfoDWO();
1067     emitDebugAbbrevDWO();
1068     emitDebugLineDWO();
1069     // Emit DWO addresses.
1070     AddrPool.emit(*Asm, Asm->getObjFileLowering().getDwarfAddrSection());
1071     emitDebugLocDWO();
1072   } else
1073     // Emit info into a debug loc section.
1074     emitDebugLoc();
1076   // Emit info into the dwarf accelerator table sections.
1077   if (useDwarfAccelTables()) {
1078     emitAccelNames();
1079     emitAccelObjC();
1080     emitAccelNamespaces();
1081     emitAccelTypes();
1082   }
1084   // Emit the pubnames and pubtypes sections if requested.
1085   if (HasDwarfPubSections) {
1086     emitDebugPubNames(GenerateGnuPubSections);
1087     emitDebugPubTypes(GenerateGnuPubSections);
1088   }
1090   // clean up.
1091   SPMap.clear();
1093   // Reset these for the next Module if we have one.
1094   FirstCU = nullptr;
1097 // Find abstract variable, if any, associated with Var.
1098 DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &DV,
1099                                               DebugLoc ScopeLoc) {
1100   LLVMContext &Ctx = DV->getContext();
1101   // More then one inlined variable corresponds to one abstract variable.
1102   DIVariable Var = cleanseInlinedVariable(DV, Ctx);
1103   DbgVariable *AbsDbgVariable = AbstractVariables.lookup(Var);
1104   if (AbsDbgVariable)
1105     return AbsDbgVariable;
1107   LexicalScope *Scope = LScopes.findAbstractScope(ScopeLoc.getScope(Ctx));
1108   if (!Scope)
1109     return nullptr;
1111   AbsDbgVariable = new DbgVariable(Var, nullptr, this);
1112   addScopeVariable(Scope, AbsDbgVariable);
1113   AbstractVariables[Var] = AbsDbgVariable;
1114   return AbsDbgVariable;
1117 // If Var is a current function argument then add it to CurrentFnArguments list.
1118 bool DwarfDebug::addCurrentFnArgument(DbgVariable *Var, LexicalScope *Scope) {
1119   if (!LScopes.isCurrentFunctionScope(Scope))
1120     return false;
1121   DIVariable DV = Var->getVariable();
1122   if (DV.getTag() != dwarf::DW_TAG_arg_variable)
1123     return false;
1124   unsigned ArgNo = DV.getArgNumber();
1125   if (ArgNo == 0)
1126     return false;
1128   size_t Size = CurrentFnArguments.size();
1129   if (Size == 0)
1130     CurrentFnArguments.resize(CurFn->getFunction()->arg_size());
1131   // llvm::Function argument size is not good indicator of how many
1132   // arguments does the function have at source level.
1133   if (ArgNo > Size)
1134     CurrentFnArguments.resize(ArgNo * 2);
1135   CurrentFnArguments[ArgNo - 1] = Var;
1136   return true;
1139 // Collect variable information from side table maintained by MMI.
1140 void DwarfDebug::collectVariableInfoFromMMITable(
1141     SmallPtrSet<const MDNode *, 16> &Processed) {
1142   for (const auto &VI : MMI->getVariableDbgInfo()) {
1143     if (!VI.Var)
1144       continue;
1145     Processed.insert(VI.Var);
1146     DIVariable DV(VI.Var);
1147     LexicalScope *Scope = LScopes.findLexicalScope(VI.Loc);
1149     // If variable scope is not found then skip this variable.
1150     if (!Scope)
1151       continue;
1153     DbgVariable *AbsDbgVariable = findAbstractVariable(DV, VI.Loc);
1154     DbgVariable *RegVar = new DbgVariable(DV, AbsDbgVariable, this);
1155     RegVar->setFrameIndex(VI.Slot);
1156     if (!addCurrentFnArgument(RegVar, Scope))
1157       addScopeVariable(Scope, RegVar);
1158     if (AbsDbgVariable)
1159       AbsDbgVariable->setFrameIndex(VI.Slot);
1160   }
1163 // Get .debug_loc entry for the instruction range starting at MI.
1164 static DebugLocEntry::Value getDebugLocValue(const MachineInstr *MI) {
1165   const MDNode *Var = MI->getDebugVariable();
1167   assert(MI->getNumOperands() == 3);
1168   if (MI->getOperand(0).isReg()) {
1169     MachineLocation MLoc;
1170     // If the second operand is an immediate, this is a
1171     // register-indirect address.
1172     if (!MI->getOperand(1).isImm())
1173       MLoc.set(MI->getOperand(0).getReg());
1174     else
1175       MLoc.set(MI->getOperand(0).getReg(), MI->getOperand(1).getImm());
1176     return DebugLocEntry::Value(Var, MLoc);
1177   }
1178   if (MI->getOperand(0).isImm())
1179     return DebugLocEntry::Value(Var, MI->getOperand(0).getImm());
1180   if (MI->getOperand(0).isFPImm())
1181     return DebugLocEntry::Value(Var, MI->getOperand(0).getFPImm());
1182   if (MI->getOperand(0).isCImm())
1183     return DebugLocEntry::Value(Var, MI->getOperand(0).getCImm());
1185   llvm_unreachable("Unexpected 3 operand DBG_VALUE instruction!");
1188 // Find variables for each lexical scope.
1189 void
1190 DwarfDebug::collectVariableInfo(SmallPtrSet<const MDNode *, 16> &Processed) {
1191   LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
1192   DwarfCompileUnit *TheCU = SPMap.lookup(FnScope->getScopeNode());
1194   // Grab the variable info that was squirreled away in the MMI side-table.
1195   collectVariableInfoFromMMITable(Processed);
1197   for (const auto &I : DbgValues) {
1198     DIVariable DV(I.first);
1199     if (Processed.count(DV))
1200       continue;
1202     // History contains relevant DBG_VALUE instructions for DV and instructions
1203     // clobbering it.
1204     const SmallVectorImpl<const MachineInstr *> &History = I.second;
1205     if (History.empty())
1206       continue;
1207     const MachineInstr *MInsn = History.front();
1209     LexicalScope *Scope = nullptr;
1210     if (DV.getTag() == dwarf::DW_TAG_arg_variable &&
1211         DISubprogram(DV.getContext()).describes(CurFn->getFunction()))
1212       Scope = LScopes.getCurrentFunctionScope();
1213     else if (MDNode *IA = DV.getInlinedAt()) {
1214       DebugLoc DL = DebugLoc::getFromDILocation(IA);
1215       Scope = LScopes.findInlinedScope(DebugLoc::get(
1216           DL.getLine(), DL.getCol(), DV.getContext(), IA));
1217     } else
1218       Scope = LScopes.findLexicalScope(DV.getContext());
1219     // If variable scope is not found then skip this variable.
1220     if (!Scope)
1221       continue;
1223     Processed.insert(DV);
1224     assert(MInsn->isDebugValue() && "History must begin with debug value");
1225     DbgVariable *AbsVar = findAbstractVariable(DV, MInsn->getDebugLoc());
1226     DbgVariable *RegVar = new DbgVariable(DV, AbsVar, this);
1227     if (!addCurrentFnArgument(RegVar, Scope))
1228       addScopeVariable(Scope, RegVar);
1229     if (AbsVar)
1230       AbsVar->setMInsn(MInsn);
1232     // Simplify ranges that are fully coalesced.
1233     if (History.size() <= 1 ||
1234         (History.size() == 2 && MInsn->isIdenticalTo(History.back()))) {
1235       RegVar->setMInsn(MInsn);
1236       continue;
1237     }
1239     // Handle multiple DBG_VALUE instructions describing one variable.
1240     RegVar->setDotDebugLocOffset(DotDebugLocEntries.size());
1242     DotDebugLocEntries.resize(DotDebugLocEntries.size() + 1);
1243     DebugLocList &LocList = DotDebugLocEntries.back();
1244     LocList.Label =
1245         Asm->GetTempSymbol("debug_loc", DotDebugLocEntries.size() - 1);
1246     SmallVector<DebugLocEntry, 4> &DebugLoc = LocList.List;
1247     for (SmallVectorImpl<const MachineInstr *>::const_iterator
1248              HI = History.begin(),
1249              HE = History.end();
1250          HI != HE; ++HI) {
1251       const MachineInstr *Begin = *HI;
1252       assert(Begin->isDebugValue() && "Invalid History entry");
1254       // Check if DBG_VALUE is truncating a range.
1255       if (Begin->getNumOperands() > 1 && Begin->getOperand(0).isReg() &&
1256           !Begin->getOperand(0).getReg())
1257         continue;
1259       // Compute the range for a register location.
1260       const MCSymbol *FLabel = getLabelBeforeInsn(Begin);
1261       const MCSymbol *SLabel = nullptr;
1263       if (HI + 1 == HE)
1264         // If Begin is the last instruction in History then its value is valid
1265         // until the end of the function.
1266         SLabel = FunctionEndSym;
1267       else {
1268         const MachineInstr *End = HI[1];
1269         DEBUG(dbgs() << "DotDebugLoc Pair:\n"
1270                      << "\t" << *Begin << "\t" << *End << "\n");
1271         if (End->isDebugValue())
1272           SLabel = getLabelBeforeInsn(End);
1273         else {
1274           // End is a normal instruction clobbering the range.
1275           SLabel = getLabelAfterInsn(End);
1276           assert(SLabel && "Forgot label after clobber instruction");
1277           ++HI;
1278         }
1279       }
1281       // The value is valid until the next DBG_VALUE or clobber.
1282       DebugLocEntry Loc(FLabel, SLabel, getDebugLocValue(Begin), TheCU);
1283       if (DebugLoc.empty() || !DebugLoc.back().Merge(Loc))
1284         DebugLoc.push_back(std::move(Loc));
1285     }
1286   }
1288   // Collect info for variables that were optimized out.
1289   DIArray Variables = DISubprogram(FnScope->getScopeNode()).getVariables();
1290   for (unsigned i = 0, e = Variables.getNumElements(); i != e; ++i) {
1291     DIVariable DV(Variables.getElement(i));
1292     if (!DV || !DV.isVariable() || !Processed.insert(DV))
1293       continue;
1294     if (LexicalScope *Scope = LScopes.findLexicalScope(DV.getContext()))
1295       addScopeVariable(Scope, new DbgVariable(DV, nullptr, this));
1296   }
1299 // Return Label preceding the instruction.
1300 MCSymbol *DwarfDebug::getLabelBeforeInsn(const MachineInstr *MI) {
1301   MCSymbol *Label = LabelsBeforeInsn.lookup(MI);
1302   assert(Label && "Didn't insert label before instruction");
1303   return Label;
1306 // Return Label immediately following the instruction.
1307 MCSymbol *DwarfDebug::getLabelAfterInsn(const MachineInstr *MI) {
1308   return LabelsAfterInsn.lookup(MI);
1311 // Process beginning of an instruction.
1312 void DwarfDebug::beginInstruction(const MachineInstr *MI) {
1313   assert(CurMI == nullptr);
1314   CurMI = MI;
1315   // Check if source location changes, but ignore DBG_VALUE locations.
1316   if (!MI->isDebugValue()) {
1317     DebugLoc DL = MI->getDebugLoc();
1318     if (DL != PrevInstLoc && (!DL.isUnknown() || UnknownLocations)) {
1319       unsigned Flags = 0;
1320       PrevInstLoc = DL;
1321       if (DL == PrologEndLoc) {
1322         Flags |= DWARF2_FLAG_PROLOGUE_END;
1323         PrologEndLoc = DebugLoc();
1324       }
1325       if (PrologEndLoc.isUnknown())
1326         Flags |= DWARF2_FLAG_IS_STMT;
1328       if (!DL.isUnknown()) {
1329         const MDNode *Scope = DL.getScope(Asm->MF->getFunction()->getContext());
1330         recordSourceLine(DL.getLine(), DL.getCol(), Scope, Flags);
1331       } else
1332         recordSourceLine(0, 0, nullptr, 0);
1333     }
1334   }
1336   // Insert labels where requested.
1337   DenseMap<const MachineInstr *, MCSymbol *>::iterator I =
1338       LabelsBeforeInsn.find(MI);
1340   // No label needed.
1341   if (I == LabelsBeforeInsn.end())
1342     return;
1344   // Label already assigned.
1345   if (I->second)
1346     return;
1348   if (!PrevLabel) {
1349     PrevLabel = MMI->getContext().CreateTempSymbol();
1350     Asm->OutStreamer.EmitLabel(PrevLabel);
1351   }
1352   I->second = PrevLabel;
1355 // Process end of an instruction.
1356 void DwarfDebug::endInstruction() {
1357   assert(CurMI != nullptr);
1358   // Don't create a new label after DBG_VALUE instructions.
1359   // They don't generate code.
1360   if (!CurMI->isDebugValue())
1361     PrevLabel = nullptr;
1363   DenseMap<const MachineInstr *, MCSymbol *>::iterator I =
1364       LabelsAfterInsn.find(CurMI);
1365   CurMI = nullptr;
1367   // No label needed.
1368   if (I == LabelsAfterInsn.end())
1369     return;
1371   // Label already assigned.
1372   if (I->second)
1373     return;
1375   // We need a label after this instruction.
1376   if (!PrevLabel) {
1377     PrevLabel = MMI->getContext().CreateTempSymbol();
1378     Asm->OutStreamer.EmitLabel(PrevLabel);
1379   }
1380   I->second = PrevLabel;
1383 // Each LexicalScope has first instruction and last instruction to mark
1384 // beginning and end of a scope respectively. Create an inverse map that list
1385 // scopes starts (and ends) with an instruction. One instruction may start (or
1386 // end) multiple scopes. Ignore scopes that are not reachable.
1387 void DwarfDebug::identifyScopeMarkers() {
1388   SmallVector<LexicalScope *, 4> WorkList;
1389   WorkList.push_back(LScopes.getCurrentFunctionScope());
1390   while (!WorkList.empty()) {
1391     LexicalScope *S = WorkList.pop_back_val();
1393     const SmallVectorImpl<LexicalScope *> &Children = S->getChildren();
1394     if (!Children.empty())
1395       WorkList.append(Children.begin(), Children.end());
1397     if (S->isAbstractScope())
1398       continue;
1400     for (const InsnRange &R : S->getRanges()) {
1401       assert(R.first && "InsnRange does not have first instruction!");
1402       assert(R.second && "InsnRange does not have second instruction!");
1403       requestLabelBeforeInsn(R.first);
1404       requestLabelAfterInsn(R.second);
1405     }
1406   }
1409 // Gather pre-function debug information.  Assumes being called immediately
1410 // after the function entry point has been emitted.
1411 void DwarfDebug::beginFunction(const MachineFunction *MF) {
1412   CurFn = MF;
1414   // If there's no debug info for the function we're not going to do anything.
1415   if (!MMI->hasDebugInfo())
1416     return;
1418   // Grab the lexical scopes for the function, if we don't have any of those
1419   // then we're not going to be able to do anything.
1420   LScopes.initialize(*MF);
1421   if (LScopes.empty())
1422     return;
1424   assert(DbgValues.empty() && "DbgValues map wasn't cleaned!");
1426   // Make sure that each lexical scope will have a begin/end label.
1427   identifyScopeMarkers();
1429   // Set DwarfDwarfCompileUnitID in MCContext to the Compile Unit this function
1430   // belongs to so that we add to the correct per-cu line table in the
1431   // non-asm case.
1432   LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
1433   DwarfCompileUnit *TheCU = SPMap.lookup(FnScope->getScopeNode());
1434   assert(TheCU && "Unable to find compile unit!");
1435   if (Asm->OutStreamer.hasRawTextSupport())
1436     // Use a single line table if we are generating assembly.
1437     Asm->OutStreamer.getContext().setDwarfCompileUnitID(0);
1438   else
1439     Asm->OutStreamer.getContext().setDwarfCompileUnitID(TheCU->getUniqueID());
1441   // Emit a label for the function so that we have a beginning address.
1442   FunctionBeginSym = Asm->GetTempSymbol("func_begin", Asm->getFunctionNumber());
1443   // Assumes in correct section after the entry point.
1444   Asm->OutStreamer.EmitLabel(FunctionBeginSym);
1446   // Collect user variables, find the end of the prologue.
1447   for (const auto &MBB : *MF) {
1448     for (const auto &MI : MBB) {
1449       if (MI.isDebugValue()) {
1450         assert(MI.getNumOperands() > 1 && "Invalid machine instruction!");
1451         // Keep track of user variables in order of appearance. Create the
1452         // empty history for each variable so that the order of keys in
1453         // DbgValues is correct. Actual history will be populated in
1454         // calculateDbgValueHistory() function.
1455         const MDNode *Var = MI.getDebugVariable();
1456         DbgValues.insert(
1457             std::make_pair(Var, SmallVector<const MachineInstr *, 4>()));
1458       } else if (!MI.getFlag(MachineInstr::FrameSetup) &&
1459                  PrologEndLoc.isUnknown() && !MI.getDebugLoc().isUnknown()) {
1460         // First known non-DBG_VALUE and non-frame setup location marks
1461         // the beginning of the function body.
1462         PrologEndLoc = MI.getDebugLoc();
1463       }
1464     }
1465   }
1467   // Calculate history for local variables.
1468   calculateDbgValueHistory(MF, Asm->TM.getRegisterInfo(), DbgValues);
1470   // Request labels for the full history.
1471   for (auto &I : DbgValues) {
1472     const SmallVectorImpl<const MachineInstr *> &History = I.second;
1473     if (History.empty())
1474       continue;
1476     // The first mention of a function argument gets the FunctionBeginSym
1477     // label, so arguments are visible when breaking at function entry.
1478     DIVariable DV(I.first);
1479     if (DV.isVariable() && DV.getTag() == dwarf::DW_TAG_arg_variable &&
1480         getDISubprogram(DV.getContext()).describes(MF->getFunction()))
1481       LabelsBeforeInsn[History.front()] = FunctionBeginSym;
1483     for (const MachineInstr *MI : History) {
1484       if (MI->isDebugValue())
1485         requestLabelBeforeInsn(MI);
1486       else
1487         requestLabelAfterInsn(MI);
1488     }
1489   }
1491   PrevInstLoc = DebugLoc();
1492   PrevLabel = FunctionBeginSym;
1494   // Record beginning of function.
1495   if (!PrologEndLoc.isUnknown()) {
1496     DebugLoc FnStartDL =
1497         PrologEndLoc.getFnDebugLoc(MF->getFunction()->getContext());
1498     recordSourceLine(
1499         FnStartDL.getLine(), FnStartDL.getCol(),
1500         FnStartDL.getScope(MF->getFunction()->getContext()),
1501         // We'd like to list the prologue as "not statements" but GDB behaves
1502         // poorly if we do that. Revisit this with caution/GDB (7.5+) testing.
1503         DWARF2_FLAG_IS_STMT);
1504   }
1507 void DwarfDebug::addScopeVariable(LexicalScope *LS, DbgVariable *Var) {
1508   SmallVectorImpl<DbgVariable *> &Vars = ScopeVariables[LS];
1509   DIVariable DV = Var->getVariable();
1510   // Variables with positive arg numbers are parameters.
1511   if (unsigned ArgNum = DV.getArgNumber()) {
1512     // Keep all parameters in order at the start of the variable list to ensure
1513     // function types are correct (no out-of-order parameters)
1514     //
1515     // This could be improved by only doing it for optimized builds (unoptimized
1516     // builds have the right order to begin with), searching from the back (this
1517     // would catch the unoptimized case quickly), or doing a binary search
1518     // rather than linear search.
1519     SmallVectorImpl<DbgVariable *>::iterator I = Vars.begin();
1520     while (I != Vars.end()) {
1521       unsigned CurNum = (*I)->getVariable().getArgNumber();
1522       // A local (non-parameter) variable has been found, insert immediately
1523       // before it.
1524       if (CurNum == 0)
1525         break;
1526       // A later indexed parameter has been found, insert immediately before it.
1527       if (CurNum > ArgNum)
1528         break;
1529       ++I;
1530     }
1531     Vars.insert(I, Var);
1532     return;
1533   }
1535   Vars.push_back(Var);
1538 // Gather and emit post-function debug information.
1539 void DwarfDebug::endFunction(const MachineFunction *MF) {
1540   // Every beginFunction(MF) call should be followed by an endFunction(MF) call,
1541   // though the beginFunction may not be called at all.
1542   // We should handle both cases.
1543   if (!CurFn)
1544     CurFn = MF;
1545   else
1546     assert(CurFn == MF);
1547   assert(CurFn != nullptr);
1549   if (!MMI->hasDebugInfo() || LScopes.empty()) {
1550     // If we don't have a lexical scope for this function then there will
1551     // be a hole in the range information. Keep note of this by setting the
1552     // previously used section to nullptr.
1553     PrevSection = nullptr;
1554     PrevCU = nullptr;
1555     CurFn = nullptr;
1556     return;
1557   }
1559   // Define end label for subprogram.
1560   FunctionEndSym = Asm->GetTempSymbol("func_end", Asm->getFunctionNumber());
1561   // Assumes in correct section after the entry point.
1562   Asm->OutStreamer.EmitLabel(FunctionEndSym);
1564   // Set DwarfDwarfCompileUnitID in MCContext to default value.
1565   Asm->OutStreamer.getContext().setDwarfCompileUnitID(0);
1567   SmallPtrSet<const MDNode *, 16> ProcessedVars;
1568   collectVariableInfo(ProcessedVars);
1570   LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
1571   DwarfCompileUnit &TheCU = *SPMap.lookup(FnScope->getScopeNode());
1573   // Construct abstract scopes.
1574   for (LexicalScope *AScope : LScopes.getAbstractScopesList()) {
1575     DISubprogram SP(AScope->getScopeNode());
1576     if (!SP.isSubprogram())
1577       continue;
1578     // Collect info for variables that were optimized out.
1579     DIArray Variables = SP.getVariables();
1580     for (unsigned i = 0, e = Variables.getNumElements(); i != e; ++i) {
1581       DIVariable DV(Variables.getElement(i));
1582       assert(DV && DV.isVariable());
1583       if (!ProcessedVars.insert(DV))
1584         continue;
1585       // Check that DbgVariable for DV wasn't created earlier, when
1586       // findAbstractVariable() was called for inlined instance of DV.
1587       LLVMContext &Ctx = DV->getContext();
1588       DIVariable CleanDV = cleanseInlinedVariable(DV, Ctx);
1589       if (AbstractVariables.lookup(CleanDV))
1590         continue;
1591       if (LexicalScope *Scope = LScopes.findAbstractScope(DV.getContext()))
1592         addScopeVariable(Scope, new DbgVariable(DV, nullptr, this));
1593     }
1594     constructAbstractSubprogramScopeDIE(TheCU, AScope);
1595   }
1597   DIE &CurFnDIE = constructSubprogramScopeDIE(TheCU, FnScope);
1598   if (!CurFn->getTarget().Options.DisableFramePointerElim(*CurFn))
1599     TheCU.addFlag(CurFnDIE, dwarf::DW_AT_APPLE_omit_frame_ptr);
1601   // Add the range of this function to the list of ranges for the CU.
1602   RangeSpan Span(FunctionBeginSym, FunctionEndSym);
1603   TheCU.addRange(std::move(Span));
1604   PrevSection = Asm->getCurrentSection();
1605   PrevCU = &TheCU;
1607   // Clear debug info
1608   for (auto &I : ScopeVariables)
1609     DeleteContainerPointers(I.second);
1610   ScopeVariables.clear();
1611   DeleteContainerPointers(CurrentFnArguments);
1612   DbgValues.clear();
1613   AbstractVariables.clear();
1614   LabelsBeforeInsn.clear();
1615   LabelsAfterInsn.clear();
1616   PrevLabel = nullptr;
1617   CurFn = nullptr;
1620 // Register a source line with debug info. Returns the  unique label that was
1621 // emitted and which provides correspondence to the source line list.
1622 void DwarfDebug::recordSourceLine(unsigned Line, unsigned Col, const MDNode *S,
1623                                   unsigned Flags) {
1624   StringRef Fn;
1625   StringRef Dir;
1626   unsigned Src = 1;
1627   unsigned Discriminator = 0;
1628   if (S) {
1629     DIDescriptor Scope(S);
1631     if (Scope.isCompileUnit()) {
1632       DICompileUnit CU(S);
1633       Fn = CU.getFilename();
1634       Dir = CU.getDirectory();
1635     } else if (Scope.isFile()) {
1636       DIFile F(S);
1637       Fn = F.getFilename();
1638       Dir = F.getDirectory();
1639     } else if (Scope.isSubprogram()) {
1640       DISubprogram SP(S);
1641       Fn = SP.getFilename();
1642       Dir = SP.getDirectory();
1643     } else if (Scope.isLexicalBlockFile()) {
1644       DILexicalBlockFile DBF(S);
1645       Fn = DBF.getFilename();
1646       Dir = DBF.getDirectory();
1647     } else if (Scope.isLexicalBlock()) {
1648       DILexicalBlock DB(S);
1649       Fn = DB.getFilename();
1650       Dir = DB.getDirectory();
1651       Discriminator = DB.getDiscriminator();
1652     } else
1653       llvm_unreachable("Unexpected scope info");
1655     unsigned CUID = Asm->OutStreamer.getContext().getDwarfCompileUnitID();
1656     Src = static_cast<DwarfCompileUnit &>(*InfoHolder.getUnits()[CUID])
1657               .getOrCreateSourceID(Fn, Dir);
1658   }
1659   Asm->OutStreamer.EmitDwarfLocDirective(Src, Line, Col, Flags, 0,
1660                                          Discriminator, Fn);
1663 //===----------------------------------------------------------------------===//
1664 // Emit Methods
1665 //===----------------------------------------------------------------------===//
1667 // Emit initial Dwarf sections with a label at the start of each one.
1668 void DwarfDebug::emitSectionLabels() {
1669   const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
1671   // Dwarf sections base addresses.
1672   DwarfInfoSectionSym =
1673       emitSectionSym(Asm, TLOF.getDwarfInfoSection(), "section_info");
1674   if (useSplitDwarf())
1675     DwarfInfoDWOSectionSym =
1676         emitSectionSym(Asm, TLOF.getDwarfInfoDWOSection(), "section_info_dwo");
1677   DwarfAbbrevSectionSym =
1678       emitSectionSym(Asm, TLOF.getDwarfAbbrevSection(), "section_abbrev");
1679   if (useSplitDwarf())
1680     DwarfAbbrevDWOSectionSym = emitSectionSym(
1681         Asm, TLOF.getDwarfAbbrevDWOSection(), "section_abbrev_dwo");
1682   if (GenerateARangeSection)
1683     emitSectionSym(Asm, TLOF.getDwarfARangesSection());
1685   DwarfLineSectionSym =
1686       emitSectionSym(Asm, TLOF.getDwarfLineSection(), "section_line");
1687   if (GenerateGnuPubSections) {
1688     DwarfGnuPubNamesSectionSym =
1689         emitSectionSym(Asm, TLOF.getDwarfGnuPubNamesSection());
1690     DwarfGnuPubTypesSectionSym =
1691         emitSectionSym(Asm, TLOF.getDwarfGnuPubTypesSection());
1692   } else if (HasDwarfPubSections) {
1693     emitSectionSym(Asm, TLOF.getDwarfPubNamesSection());
1694     emitSectionSym(Asm, TLOF.getDwarfPubTypesSection());
1695   }
1697   DwarfStrSectionSym =
1698       emitSectionSym(Asm, TLOF.getDwarfStrSection(), "info_string");
1699   if (useSplitDwarf()) {
1700     DwarfStrDWOSectionSym =
1701         emitSectionSym(Asm, TLOF.getDwarfStrDWOSection(), "skel_string");
1702     DwarfAddrSectionSym =
1703         emitSectionSym(Asm, TLOF.getDwarfAddrSection(), "addr_sec");
1704     DwarfDebugLocSectionSym =
1705         emitSectionSym(Asm, TLOF.getDwarfLocDWOSection(), "skel_loc");
1706   } else
1707     DwarfDebugLocSectionSym =
1708         emitSectionSym(Asm, TLOF.getDwarfLocSection(), "section_debug_loc");
1709   DwarfDebugRangeSectionSym =
1710       emitSectionSym(Asm, TLOF.getDwarfRangesSection(), "debug_range");
1713 // Recursively emits a debug information entry.
1714 void DwarfDebug::emitDIE(DIE &Die) {
1715   // Get the abbreviation for this DIE.
1716   const DIEAbbrev &Abbrev = Die.getAbbrev();
1718   // Emit the code (index) for the abbreviation.
1719   if (Asm->isVerbose())
1720     Asm->OutStreamer.AddComment("Abbrev [" + Twine(Abbrev.getNumber()) +
1721                                 "] 0x" + Twine::utohexstr(Die.getOffset()) +
1722                                 ":0x" + Twine::utohexstr(Die.getSize()) + " " +
1723                                 dwarf::TagString(Abbrev.getTag()));
1724   Asm->EmitULEB128(Abbrev.getNumber());
1726   const SmallVectorImpl<DIEValue *> &Values = Die.getValues();
1727   const SmallVectorImpl<DIEAbbrevData> &AbbrevData = Abbrev.getData();
1729   // Emit the DIE attribute values.
1730   for (unsigned i = 0, N = Values.size(); i < N; ++i) {
1731     dwarf::Attribute Attr = AbbrevData[i].getAttribute();
1732     dwarf::Form Form = AbbrevData[i].getForm();
1733     assert(Form && "Too many attributes for DIE (check abbreviation)");
1735     if (Asm->isVerbose()) {
1736       Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr));
1737       if (Attr == dwarf::DW_AT_accessibility)
1738         Asm->OutStreamer.AddComment(dwarf::AccessibilityString(
1739             cast<DIEInteger>(Values[i])->getValue()));
1740     }
1742     // Emit an attribute using the defined form.
1743     Values[i]->EmitValue(Asm, Form);
1744   }
1746   // Emit the DIE children if any.
1747   if (Abbrev.hasChildren()) {
1748     for (auto &Child : Die.getChildren())
1749       emitDIE(*Child);
1751     Asm->OutStreamer.AddComment("End Of Children Mark");
1752     Asm->EmitInt8(0);
1753   }
1756 // Emit the debug info section.
1757 void DwarfDebug::emitDebugInfo() {
1758   DwarfFile &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
1760   Holder.emitUnits(this, DwarfAbbrevSectionSym);
1763 // Emit the abbreviation section.
1764 void DwarfDebug::emitAbbreviations() {
1765   DwarfFile &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
1767   Holder.emitAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevSection());
1770 // Emit the last address of the section and the end of the line matrix.
1771 void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) {
1772   // Define last address of section.
1773   Asm->OutStreamer.AddComment("Extended Op");
1774   Asm->EmitInt8(0);
1776   Asm->OutStreamer.AddComment("Op size");
1777   Asm->EmitInt8(Asm->getDataLayout().getPointerSize() + 1);
1778   Asm->OutStreamer.AddComment("DW_LNE_set_address");
1779   Asm->EmitInt8(dwarf::DW_LNE_set_address);
1781   Asm->OutStreamer.AddComment("Section end label");
1783   Asm->OutStreamer.EmitSymbolValue(
1784       Asm->GetTempSymbol("section_end", SectionEnd),
1785       Asm->getDataLayout().getPointerSize());
1787   // Mark end of matrix.
1788   Asm->OutStreamer.AddComment("DW_LNE_end_sequence");
1789   Asm->EmitInt8(0);
1790   Asm->EmitInt8(1);
1791   Asm->EmitInt8(1);
1794 // Emit visible names into a hashed accelerator table section.
1795 void DwarfDebug::emitAccelNames() {
1796   AccelNames.FinalizeTable(Asm, "Names");
1797   Asm->OutStreamer.SwitchSection(
1798       Asm->getObjFileLowering().getDwarfAccelNamesSection());
1799   MCSymbol *SectionBegin = Asm->GetTempSymbol("names_begin");
1800   Asm->OutStreamer.EmitLabel(SectionBegin);
1802   // Emit the full data.
1803   AccelNames.Emit(Asm, SectionBegin, &InfoHolder);
1806 // Emit objective C classes and categories into a hashed accelerator table
1807 // section.
1808 void DwarfDebug::emitAccelObjC() {
1809   AccelObjC.FinalizeTable(Asm, "ObjC");
1810   Asm->OutStreamer.SwitchSection(
1811       Asm->getObjFileLowering().getDwarfAccelObjCSection());
1812   MCSymbol *SectionBegin = Asm->GetTempSymbol("objc_begin");
1813   Asm->OutStreamer.EmitLabel(SectionBegin);
1815   // Emit the full data.
1816   AccelObjC.Emit(Asm, SectionBegin, &InfoHolder);
1819 // Emit namespace dies into a hashed accelerator table.
1820 void DwarfDebug::emitAccelNamespaces() {
1821   AccelNamespace.FinalizeTable(Asm, "namespac");
1822   Asm->OutStreamer.SwitchSection(
1823       Asm->getObjFileLowering().getDwarfAccelNamespaceSection());
1824   MCSymbol *SectionBegin = Asm->GetTempSymbol("namespac_begin");
1825   Asm->OutStreamer.EmitLabel(SectionBegin);
1827   // Emit the full data.
1828   AccelNamespace.Emit(Asm, SectionBegin, &InfoHolder);
1831 // Emit type dies into a hashed accelerator table.
1832 void DwarfDebug::emitAccelTypes() {
1834   AccelTypes.FinalizeTable(Asm, "types");
1835   Asm->OutStreamer.SwitchSection(
1836       Asm->getObjFileLowering().getDwarfAccelTypesSection());
1837   MCSymbol *SectionBegin = Asm->GetTempSymbol("types_begin");
1838   Asm->OutStreamer.EmitLabel(SectionBegin);
1840   // Emit the full data.
1841   AccelTypes.Emit(Asm, SectionBegin, &InfoHolder);
1844 // Public name handling.
1845 // The format for the various pubnames:
1846 //
1847 // dwarf pubnames - offset/name pairs where the offset is the offset into the CU
1848 // for the DIE that is named.
1849 //
1850 // gnu pubnames - offset/index value/name tuples where the offset is the offset
1851 // into the CU and the index value is computed according to the type of value
1852 // for the DIE that is named.
1853 //
1854 // For type units the offset is the offset of the skeleton DIE. For split dwarf
1855 // it's the offset within the debug_info/debug_types dwo section, however, the
1856 // reference in the pubname header doesn't change.
1858 /// computeIndexValue - Compute the gdb index value for the DIE and CU.
1859 static dwarf::PubIndexEntryDescriptor computeIndexValue(DwarfUnit *CU,
1860                                                         const DIE *Die) {
1861   dwarf::GDBIndexEntryLinkage Linkage = dwarf::GIEL_STATIC;
1863   // We could have a specification DIE that has our most of our knowledge,
1864   // look for that now.
1865   DIEValue *SpecVal = Die->findAttribute(dwarf::DW_AT_specification);
1866   if (SpecVal) {
1867     DIE &SpecDIE = cast<DIEEntry>(SpecVal)->getEntry();
1868     if (SpecDIE.findAttribute(dwarf::DW_AT_external))
1869       Linkage = dwarf::GIEL_EXTERNAL;
1870   } else if (Die->findAttribute(dwarf::DW_AT_external))
1871     Linkage = dwarf::GIEL_EXTERNAL;
1873   switch (Die->getTag()) {
1874   case dwarf::DW_TAG_class_type:
1875   case dwarf::DW_TAG_structure_type:
1876   case dwarf::DW_TAG_union_type:
1877   case dwarf::DW_TAG_enumeration_type:
1878     return dwarf::PubIndexEntryDescriptor(
1879         dwarf::GIEK_TYPE, CU->getLanguage() != dwarf::DW_LANG_C_plus_plus
1880                               ? dwarf::GIEL_STATIC
1881                               : dwarf::GIEL_EXTERNAL);
1882   case dwarf::DW_TAG_typedef:
1883   case dwarf::DW_TAG_base_type:
1884   case dwarf::DW_TAG_subrange_type:
1885     return dwarf::PubIndexEntryDescriptor(dwarf::GIEK_TYPE, dwarf::GIEL_STATIC);
1886   case dwarf::DW_TAG_namespace:
1887     return dwarf::GIEK_TYPE;
1888   case dwarf::DW_TAG_subprogram:
1889     return dwarf::PubIndexEntryDescriptor(dwarf::GIEK_FUNCTION, Linkage);
1890   case dwarf::DW_TAG_constant:
1891   case dwarf::DW_TAG_variable:
1892     return dwarf::PubIndexEntryDescriptor(dwarf::GIEK_VARIABLE, Linkage);
1893   case dwarf::DW_TAG_enumerator:
1894     return dwarf::PubIndexEntryDescriptor(dwarf::GIEK_VARIABLE,
1895                                           dwarf::GIEL_STATIC);
1896   default:
1897     return dwarf::GIEK_NONE;
1898   }
1901 /// emitDebugPubNames - Emit visible names into a debug pubnames section.
1902 ///
1903 void DwarfDebug::emitDebugPubNames(bool GnuStyle) {
1904   const MCSection *PSec =
1905       GnuStyle ? Asm->getObjFileLowering().getDwarfGnuPubNamesSection()
1906                : Asm->getObjFileLowering().getDwarfPubNamesSection();
1908   emitDebugPubSection(GnuStyle, PSec, "Names", &DwarfUnit::getGlobalNames);
1911 void DwarfDebug::emitDebugPubSection(
1912     bool GnuStyle, const MCSection *PSec, StringRef Name,
1913     const StringMap<const DIE *> &(DwarfUnit::*Accessor)() const) {
1914   for (const auto &NU : CUMap) {
1915     DwarfCompileUnit *TheU = NU.second;
1917     const auto &Globals = (TheU->*Accessor)();
1919     if (Globals.empty())
1920       continue;
1922     if (auto Skeleton = static_cast<DwarfCompileUnit *>(TheU->getSkeleton()))
1923       TheU = Skeleton;
1924     unsigned ID = TheU->getUniqueID();
1926     // Start the dwarf pubnames section.
1927     Asm->OutStreamer.SwitchSection(PSec);
1929     // Emit the header.
1930     Asm->OutStreamer.AddComment("Length of Public " + Name + " Info");
1931     MCSymbol *BeginLabel = Asm->GetTempSymbol("pub" + Name + "_begin", ID);
1932     MCSymbol *EndLabel = Asm->GetTempSymbol("pub" + Name + "_end", ID);
1933     Asm->EmitLabelDifference(EndLabel, BeginLabel, 4);
1935     Asm->OutStreamer.EmitLabel(BeginLabel);
1937     Asm->OutStreamer.AddComment("DWARF Version");
1938     Asm->EmitInt16(dwarf::DW_PUBNAMES_VERSION);
1940     Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
1941     Asm->EmitSectionOffset(TheU->getLabelBegin(), TheU->getSectionSym());
1943     Asm->OutStreamer.AddComment("Compilation Unit Length");
1944     Asm->EmitLabelDifference(TheU->getLabelEnd(), TheU->getLabelBegin(), 4);
1946     // Emit the pubnames for this compilation unit.
1947     for (const auto &GI : Globals) {
1948       const char *Name = GI.getKeyData();
1949       const DIE *Entity = GI.second;
1951       Asm->OutStreamer.AddComment("DIE offset");
1952       Asm->EmitInt32(Entity->getOffset());
1954       if (GnuStyle) {
1955         dwarf::PubIndexEntryDescriptor Desc = computeIndexValue(TheU, Entity);
1956         Asm->OutStreamer.AddComment(
1957             Twine("Kind: ") + dwarf::GDBIndexEntryKindString(Desc.Kind) + ", " +
1958             dwarf::GDBIndexEntryLinkageString(Desc.Linkage));
1959         Asm->EmitInt8(Desc.toBits());
1960       }
1962       Asm->OutStreamer.AddComment("External Name");
1963       Asm->OutStreamer.EmitBytes(StringRef(Name, GI.getKeyLength() + 1));
1964     }
1966     Asm->OutStreamer.AddComment("End Mark");
1967     Asm->EmitInt32(0);
1968     Asm->OutStreamer.EmitLabel(EndLabel);
1969   }
1972 void DwarfDebug::emitDebugPubTypes(bool GnuStyle) {
1973   const MCSection *PSec =
1974       GnuStyle ? Asm->getObjFileLowering().getDwarfGnuPubTypesSection()
1975                : Asm->getObjFileLowering().getDwarfPubTypesSection();
1977   emitDebugPubSection(GnuStyle, PSec, "Types", &DwarfUnit::getGlobalTypes);
1980 // Emit visible names into a debug str section.
1981 void DwarfDebug::emitDebugStr() {
1982   DwarfFile &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
1983   Holder.emitStrings(Asm->getObjFileLowering().getDwarfStrSection());
1986 void DwarfDebug::emitDebugLocEntry(ByteStreamer &Streamer,
1987                                    const DebugLocEntry &Entry) {
1988   assert(Entry.getValues().size() == 1 &&
1989          "multi-value entries are not supported yet.");
1990   const DebugLocEntry::Value Value = Entry.getValues()[0];
1991   DIVariable DV(Value.getVariable());
1992   if (Value.isInt()) {
1993     DIBasicType BTy(resolve(DV.getType()));
1994     if (BTy.Verify() && (BTy.getEncoding() == dwarf::DW_ATE_signed ||
1995                          BTy.getEncoding() == dwarf::DW_ATE_signed_char)) {
1996       Streamer.EmitInt8(dwarf::DW_OP_consts, "DW_OP_consts");
1997       Streamer.EmitSLEB128(Value.getInt());
1998     } else {
1999       Streamer.EmitInt8(dwarf::DW_OP_constu, "DW_OP_constu");
2000       Streamer.EmitULEB128(Value.getInt());
2001     }
2002   } else if (Value.isLocation()) {
2003     MachineLocation Loc = Value.getLoc();
2004     if (!DV.hasComplexAddress())
2005       // Regular entry.
2006       Asm->EmitDwarfRegOp(Streamer, Loc, DV.isIndirect());
2007     else {
2008       // Complex address entry.
2009       unsigned N = DV.getNumAddrElements();
2010       unsigned i = 0;
2011       if (N >= 2 && DV.getAddrElement(0) == DIBuilder::OpPlus) {
2012         if (Loc.getOffset()) {
2013           i = 2;
2014           Asm->EmitDwarfRegOp(Streamer, Loc, DV.isIndirect());
2015           Streamer.EmitInt8(dwarf::DW_OP_deref, "DW_OP_deref");
2016           Streamer.EmitInt8(dwarf::DW_OP_plus_uconst, "DW_OP_plus_uconst");
2017           Streamer.EmitSLEB128(DV.getAddrElement(1));
2018         } else {
2019           // If first address element is OpPlus then emit
2020           // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
2021           MachineLocation TLoc(Loc.getReg(), DV.getAddrElement(1));
2022           Asm->EmitDwarfRegOp(Streamer, TLoc, DV.isIndirect());
2023           i = 2;
2024         }
2025       } else {
2026         Asm->EmitDwarfRegOp(Streamer, Loc, DV.isIndirect());
2027       }
2029       // Emit remaining complex address elements.
2030       for (; i < N; ++i) {
2031         uint64_t Element = DV.getAddrElement(i);
2032         if (Element == DIBuilder::OpPlus) {
2033           Streamer.EmitInt8(dwarf::DW_OP_plus_uconst, "DW_OP_plus_uconst");
2034           Streamer.EmitULEB128(DV.getAddrElement(++i));
2035         } else if (Element == DIBuilder::OpDeref) {
2036           if (!Loc.isReg())
2037             Streamer.EmitInt8(dwarf::DW_OP_deref, "DW_OP_deref");
2038         } else
2039           llvm_unreachable("unknown Opcode found in complex address");
2040       }
2041     }
2042   }
2043   // else ... ignore constant fp. There is not any good way to
2044   // to represent them here in dwarf.
2045   // FIXME: ^
2048 void DwarfDebug::emitDebugLocEntryLocation(const DebugLocEntry &Entry) {
2049   Asm->OutStreamer.AddComment("Loc expr size");
2050   MCSymbol *begin = Asm->OutStreamer.getContext().CreateTempSymbol();
2051   MCSymbol *end = Asm->OutStreamer.getContext().CreateTempSymbol();
2052   Asm->EmitLabelDifference(end, begin, 2);
2053   Asm->OutStreamer.EmitLabel(begin);
2054   // Emit the entry.
2055   APByteStreamer Streamer(*Asm);
2056   emitDebugLocEntry(Streamer, Entry);
2057   // Close the range.
2058   Asm->OutStreamer.EmitLabel(end);
2061 // Emit locations into the debug loc section.
2062 void DwarfDebug::emitDebugLoc() {
2063   // Start the dwarf loc section.
2064   Asm->OutStreamer.SwitchSection(
2065       Asm->getObjFileLowering().getDwarfLocSection());
2066   unsigned char Size = Asm->getDataLayout().getPointerSize();
2067   for (const auto &DebugLoc : DotDebugLocEntries) {
2068     Asm->OutStreamer.EmitLabel(DebugLoc.Label);
2069     for (const auto &Entry : DebugLoc.List) {
2070       // Set up the range. This range is relative to the entry point of the
2071       // compile unit. This is a hard coded 0 for low_pc when we're emitting
2072       // ranges, or the DW_AT_low_pc on the compile unit otherwise.
2073       const DwarfCompileUnit *CU = Entry.getCU();
2074       if (CU->getRanges().size() == 1) {
2075         // Grab the begin symbol from the first range as our base.
2076         const MCSymbol *Base = CU->getRanges()[0].getStart();
2077         Asm->EmitLabelDifference(Entry.getBeginSym(), Base, Size);
2078         Asm->EmitLabelDifference(Entry.getEndSym(), Base, Size);
2079       } else {
2080         Asm->OutStreamer.EmitSymbolValue(Entry.getBeginSym(), Size);
2081         Asm->OutStreamer.EmitSymbolValue(Entry.getEndSym(), Size);
2082       }
2084       emitDebugLocEntryLocation(Entry);
2085     }
2086     Asm->OutStreamer.EmitIntValue(0, Size);
2087     Asm->OutStreamer.EmitIntValue(0, Size);
2088   }
2091 void DwarfDebug::emitDebugLocDWO() {
2092   Asm->OutStreamer.SwitchSection(
2093       Asm->getObjFileLowering().getDwarfLocDWOSection());
2094   for (const auto &DebugLoc : DotDebugLocEntries) {
2095     Asm->OutStreamer.EmitLabel(DebugLoc.Label);
2096     for (const auto &Entry : DebugLoc.List) {
2097       // Just always use start_length for now - at least that's one address
2098       // rather than two. We could get fancier and try to, say, reuse an
2099       // address we know we've emitted elsewhere (the start of the function?
2100       // The start of the CU or CU subrange that encloses this range?)
2101       Asm->EmitInt8(dwarf::DW_LLE_start_length_entry);
2102       unsigned idx = AddrPool.getIndex(Entry.getBeginSym());
2103       Asm->EmitULEB128(idx);
2104       Asm->EmitLabelDifference(Entry.getEndSym(), Entry.getBeginSym(), 4);
2106       emitDebugLocEntryLocation(Entry);
2107     }
2108     Asm->EmitInt8(dwarf::DW_LLE_end_of_list_entry);
2109   }
2112 struct ArangeSpan {
2113   const MCSymbol *Start, *End;
2114 };
2116 // Emit a debug aranges section, containing a CU lookup for any
2117 // address we can tie back to a CU.
2118 void DwarfDebug::emitDebugARanges() {
2119   // Start the dwarf aranges section.
2120   Asm->OutStreamer.SwitchSection(
2121       Asm->getObjFileLowering().getDwarfARangesSection());
2123   typedef DenseMap<DwarfCompileUnit *, std::vector<ArangeSpan>> SpansType;
2125   SpansType Spans;
2127   // Build a list of sections used.
2128   std::vector<const MCSection *> Sections;
2129   for (const auto &it : SectionMap) {
2130     const MCSection *Section = it.first;
2131     Sections.push_back(Section);
2132   }
2134   // Sort the sections into order.
2135   // This is only done to ensure consistent output order across different runs.
2136   std::sort(Sections.begin(), Sections.end(), SectionSort);
2138   // Build a set of address spans, sorted by CU.
2139   for (const MCSection *Section : Sections) {
2140     SmallVector<SymbolCU, 8> &List = SectionMap[Section];
2141     if (List.size() < 2)
2142       continue;
2144     // Sort the symbols by offset within the section.
2145     std::sort(List.begin(), List.end(),
2146               [&](const SymbolCU &A, const SymbolCU &B) {
2147       unsigned IA = A.Sym ? Asm->OutStreamer.GetSymbolOrder(A.Sym) : 0;
2148       unsigned IB = B.Sym ? Asm->OutStreamer.GetSymbolOrder(B.Sym) : 0;
2150       // Symbols with no order assigned should be placed at the end.
2151       // (e.g. section end labels)
2152       if (IA == 0)
2153         return false;
2154       if (IB == 0)
2155         return true;
2156       return IA < IB;
2157     });
2159     // If we have no section (e.g. common), just write out
2160     // individual spans for each symbol.
2161     if (!Section) {
2162       for (const SymbolCU &Cur : List) {
2163         ArangeSpan Span;
2164         Span.Start = Cur.Sym;
2165         Span.End = nullptr;
2166         if (Cur.CU)
2167           Spans[Cur.CU].push_back(Span);
2168       }
2169     } else {
2170       // Build spans between each label.
2171       const MCSymbol *StartSym = List[0].Sym;
2172       for (size_t n = 1, e = List.size(); n < e; n++) {
2173         const SymbolCU &Prev = List[n - 1];
2174         const SymbolCU &Cur = List[n];
2176         // Try and build the longest span we can within the same CU.
2177         if (Cur.CU != Prev.CU) {
2178           ArangeSpan Span;
2179           Span.Start = StartSym;
2180           Span.End = Cur.Sym;
2181           Spans[Prev.CU].push_back(Span);
2182           StartSym = Cur.Sym;
2183         }
2184       }
2185     }
2186   }
2188   unsigned PtrSize = Asm->getDataLayout().getPointerSize();
2190   // Build a list of CUs used.
2191   std::vector<DwarfCompileUnit *> CUs;
2192   for (const auto &it : Spans) {
2193     DwarfCompileUnit *CU = it.first;
2194     CUs.push_back(CU);
2195   }
2197   // Sort the CU list (again, to ensure consistent output order).
2198   std::sort(CUs.begin(), CUs.end(), [](const DwarfUnit *A, const DwarfUnit *B) {
2199     return A->getUniqueID() < B->getUniqueID();
2200   });
2202   // Emit an arange table for each CU we used.
2203   for (DwarfCompileUnit *CU : CUs) {
2204     std::vector<ArangeSpan> &List = Spans[CU];
2206     // Emit size of content not including length itself.
2207     unsigned ContentSize =
2208         sizeof(int16_t) + // DWARF ARange version number
2209         sizeof(int32_t) + // Offset of CU in the .debug_info section
2210         sizeof(int8_t) +  // Pointer Size (in bytes)
2211         sizeof(int8_t);   // Segment Size (in bytes)
2213     unsigned TupleSize = PtrSize * 2;
2215     // 7.20 in the Dwarf specs requires the table to be aligned to a tuple.
2216     unsigned Padding =
2217         OffsetToAlignment(sizeof(int32_t) + ContentSize, TupleSize);
2219     ContentSize += Padding;
2220     ContentSize += (List.size() + 1) * TupleSize;
2222     // For each compile unit, write the list of spans it covers.
2223     Asm->OutStreamer.AddComment("Length of ARange Set");
2224     Asm->EmitInt32(ContentSize);
2225     Asm->OutStreamer.AddComment("DWARF Arange version number");
2226     Asm->EmitInt16(dwarf::DW_ARANGES_VERSION);
2227     Asm->OutStreamer.AddComment("Offset Into Debug Info Section");
2228     Asm->EmitSectionOffset(CU->getLocalLabelBegin(), CU->getLocalSectionSym());
2229     Asm->OutStreamer.AddComment("Address Size (in bytes)");
2230     Asm->EmitInt8(PtrSize);
2231     Asm->OutStreamer.AddComment("Segment Size (in bytes)");
2232     Asm->EmitInt8(0);
2234     Asm->OutStreamer.EmitFill(Padding, 0xff);
2236     for (const ArangeSpan &Span : List) {
2237       Asm->EmitLabelReference(Span.Start, PtrSize);
2239       // Calculate the size as being from the span start to it's end.
2240       if (Span.End) {
2241         Asm->EmitLabelDifference(Span.End, Span.Start, PtrSize);
2242       } else {
2243         // For symbols without an end marker (e.g. common), we
2244         // write a single arange entry containing just that one symbol.
2245         uint64_t Size = SymSize[Span.Start];
2246         if (Size == 0)
2247           Size = 1;
2249         Asm->OutStreamer.EmitIntValue(Size, PtrSize);
2250       }
2251     }
2253     Asm->OutStreamer.AddComment("ARange terminator");
2254     Asm->OutStreamer.EmitIntValue(0, PtrSize);
2255     Asm->OutStreamer.EmitIntValue(0, PtrSize);
2256   }
2259 // Emit visible names into a debug ranges section.
2260 void DwarfDebug::emitDebugRanges() {
2261   // Start the dwarf ranges section.
2262   Asm->OutStreamer.SwitchSection(
2263       Asm->getObjFileLowering().getDwarfRangesSection());
2265   // Size for our labels.
2266   unsigned char Size = Asm->getDataLayout().getPointerSize();
2268   // Grab the specific ranges for the compile units in the module.
2269   for (const auto &I : CUMap) {
2270     DwarfCompileUnit *TheCU = I.second;
2272     // Iterate over the misc ranges for the compile units in the module.
2273     for (const RangeSpanList &List : TheCU->getRangeLists()) {
2274       // Emit our symbol so we can find the beginning of the range.
2275       Asm->OutStreamer.EmitLabel(List.getSym());
2277       for (const RangeSpan &Range : List.getRanges()) {
2278         const MCSymbol *Begin = Range.getStart();
2279         const MCSymbol *End = Range.getEnd();
2280         assert(Begin && "Range without a begin symbol?");
2281         assert(End && "Range without an end symbol?");
2282         if (TheCU->getRanges().size() == 1) {
2283           // Grab the begin symbol from the first range as our base.
2284           const MCSymbol *Base = TheCU->getRanges()[0].getStart();
2285           Asm->EmitLabelDifference(Begin, Base, Size);
2286           Asm->EmitLabelDifference(End, Base, Size);
2287         } else {
2288           Asm->OutStreamer.EmitSymbolValue(Begin, Size);
2289           Asm->OutStreamer.EmitSymbolValue(End, Size);
2290         }
2291       }
2293       // And terminate the list with two 0 values.
2294       Asm->OutStreamer.EmitIntValue(0, Size);
2295       Asm->OutStreamer.EmitIntValue(0, Size);
2296     }
2298     // Now emit a range for the CU itself.
2299     if (TheCU->getRanges().size() > 1) {
2300       Asm->OutStreamer.EmitLabel(
2301           Asm->GetTempSymbol("cu_ranges", TheCU->getUniqueID()));
2302       for (const RangeSpan &Range : TheCU->getRanges()) {
2303         const MCSymbol *Begin = Range.getStart();
2304         const MCSymbol *End = Range.getEnd();
2305         assert(Begin && "Range without a begin symbol?");
2306         assert(End && "Range without an end symbol?");
2307         Asm->OutStreamer.EmitSymbolValue(Begin, Size);
2308         Asm->OutStreamer.EmitSymbolValue(End, Size);
2309       }
2310       // And terminate the list with two 0 values.
2311       Asm->OutStreamer.EmitIntValue(0, Size);
2312       Asm->OutStreamer.EmitIntValue(0, Size);
2313     }
2314   }
2317 // DWARF5 Experimental Separate Dwarf emitters.
2319 void DwarfDebug::initSkeletonUnit(const DwarfUnit &U, DIE &Die,
2320                                   std::unique_ptr<DwarfUnit> NewU) {
2321   NewU->addLocalString(Die, dwarf::DW_AT_GNU_dwo_name,
2322                        U.getCUNode().getSplitDebugFilename());
2324   if (!CompilationDir.empty())
2325     NewU->addLocalString(Die, dwarf::DW_AT_comp_dir, CompilationDir);
2327   addGnuPubAttributes(*NewU, Die);
2329   SkeletonHolder.addUnit(std::move(NewU));
2332 // This DIE has the following attributes: DW_AT_comp_dir, DW_AT_stmt_list,
2333 // DW_AT_low_pc, DW_AT_high_pc, DW_AT_ranges, DW_AT_dwo_name, DW_AT_dwo_id,
2334 // DW_AT_addr_base, DW_AT_ranges_base.
2335 DwarfCompileUnit &DwarfDebug::constructSkeletonCU(const DwarfCompileUnit &CU) {
2337   auto OwnedUnit = make_unique<DwarfCompileUnit>(
2338       CU.getUniqueID(), CU.getCUNode(), Asm, this, &SkeletonHolder);
2339   DwarfCompileUnit &NewCU = *OwnedUnit;
2340   NewCU.initSection(Asm->getObjFileLowering().getDwarfInfoSection(),
2341                     DwarfInfoSectionSym);
2343   NewCU.initStmtList(DwarfLineSectionSym);
2345   initSkeletonUnit(CU, NewCU.getUnitDie(), std::move(OwnedUnit));
2347   return NewCU;
2350 // This DIE has the following attributes: DW_AT_comp_dir, DW_AT_dwo_name,
2351 // DW_AT_addr_base.
2352 DwarfTypeUnit &DwarfDebug::constructSkeletonTU(DwarfTypeUnit &TU) {
2353   DwarfCompileUnit &CU = static_cast<DwarfCompileUnit &>(
2354       *SkeletonHolder.getUnits()[TU.getCU().getUniqueID()]);
2356   auto OwnedUnit = make_unique<DwarfTypeUnit>(TU.getUniqueID(), CU, Asm, this,
2357                                               &SkeletonHolder);
2358   DwarfTypeUnit &NewTU = *OwnedUnit;
2359   NewTU.setTypeSignature(TU.getTypeSignature());
2360   NewTU.setType(nullptr);
2361   NewTU.initSection(
2362       Asm->getObjFileLowering().getDwarfTypesSection(TU.getTypeSignature()));
2364   initSkeletonUnit(TU, NewTU.getUnitDie(), std::move(OwnedUnit));
2365   return NewTU;
2368 // Emit the .debug_info.dwo section for separated dwarf. This contains the
2369 // compile units that would normally be in debug_info.
2370 void DwarfDebug::emitDebugInfoDWO() {
2371   assert(useSplitDwarf() && "No split dwarf debug info?");
2372   // Don't pass an abbrev symbol, using a constant zero instead so as not to
2373   // emit relocations into the dwo file.
2374   InfoHolder.emitUnits(this, /* AbbrevSymbol */ nullptr);
2377 // Emit the .debug_abbrev.dwo section for separated dwarf. This contains the
2378 // abbreviations for the .debug_info.dwo section.
2379 void DwarfDebug::emitDebugAbbrevDWO() {
2380   assert(useSplitDwarf() && "No split dwarf?");
2381   InfoHolder.emitAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevDWOSection());
2384 void DwarfDebug::emitDebugLineDWO() {
2385   assert(useSplitDwarf() && "No split dwarf?");
2386   Asm->OutStreamer.SwitchSection(
2387       Asm->getObjFileLowering().getDwarfLineDWOSection());
2388   SplitTypeUnitFileTable.Emit(Asm->OutStreamer);
2391 // Emit the .debug_str.dwo section for separated dwarf. This contains the
2392 // string section and is identical in format to traditional .debug_str
2393 // sections.
2394 void DwarfDebug::emitDebugStrDWO() {
2395   assert(useSplitDwarf() && "No split dwarf?");
2396   const MCSection *OffSec =
2397       Asm->getObjFileLowering().getDwarfStrOffDWOSection();
2398   const MCSymbol *StrSym = DwarfStrSectionSym;
2399   InfoHolder.emitStrings(Asm->getObjFileLowering().getDwarfStrDWOSection(),
2400                          OffSec, StrSym);
2403 MCDwarfDwoLineTable *DwarfDebug::getDwoLineTable(const DwarfCompileUnit &CU) {
2404   if (!useSplitDwarf())
2405     return nullptr;
2406   if (SingleCU)
2407     SplitTypeUnitFileTable.setCompilationDir(CU.getCUNode().getDirectory());
2408   return &SplitTypeUnitFileTable;
2411 static uint64_t makeTypeSignature(StringRef Identifier) {
2412   MD5 Hash;
2413   Hash.update(Identifier);
2414   // ... take the least significant 8 bytes and return those. Our MD5
2415   // implementation always returns its results in little endian, swap bytes
2416   // appropriately.
2417   MD5::MD5Result Result;
2418   Hash.final(Result);
2419   return *reinterpret_cast<support::ulittle64_t *>(Result + 8);
2422 void DwarfDebug::addDwarfTypeUnitType(DwarfCompileUnit &CU,
2423                                       StringRef Identifier, DIE &RefDie,
2424                                       DICompositeType CTy) {
2425   // Fast path if we're building some type units and one has already used the
2426   // address pool we know we're going to throw away all this work anyway, so
2427   // don't bother building dependent types.
2428   if (!TypeUnitsUnderConstruction.empty() && AddrPool.hasBeenUsed())
2429     return;
2431   const DwarfTypeUnit *&TU = DwarfTypeUnits[CTy];
2432   if (TU) {
2433     CU.addDIETypeSignature(RefDie, *TU);
2434     return;
2435   }
2437   bool TopLevelType = TypeUnitsUnderConstruction.empty();
2438   AddrPool.resetUsedFlag();
2440   auto OwnedUnit =
2441       make_unique<DwarfTypeUnit>(InfoHolder.getUnits().size(), CU, Asm, this,
2442                                  &InfoHolder, getDwoLineTable(CU));
2443   DwarfTypeUnit &NewTU = *OwnedUnit;
2444   DIE &UnitDie = NewTU.getUnitDie();
2445   TU = &NewTU;
2446   TypeUnitsUnderConstruction.push_back(
2447       std::make_pair(std::move(OwnedUnit), CTy));
2449   NewTU.addUInt(UnitDie, dwarf::DW_AT_language, dwarf::DW_FORM_data2,
2450                 CU.getLanguage());
2452   uint64_t Signature = makeTypeSignature(Identifier);
2453   NewTU.setTypeSignature(Signature);
2455   if (!useSplitDwarf())
2456     CU.applyStmtList(UnitDie);
2458   NewTU.initSection(
2459       useSplitDwarf()
2460           ? Asm->getObjFileLowering().getDwarfTypesDWOSection(Signature)
2461           : Asm->getObjFileLowering().getDwarfTypesSection(Signature));
2463   NewTU.setType(NewTU.createTypeDIE(CTy));
2465   if (TopLevelType) {
2466     auto TypeUnitsToAdd = std::move(TypeUnitsUnderConstruction);
2467     TypeUnitsUnderConstruction.clear();
2469     // Types referencing entries in the address table cannot be placed in type
2470     // units.
2471     if (AddrPool.hasBeenUsed()) {
2473       // Remove all the types built while building this type.
2474       // This is pessimistic as some of these types might not be dependent on
2475       // the type that used an address.
2476       for (const auto &TU : TypeUnitsToAdd)
2477         DwarfTypeUnits.erase(TU.second);
2479       // Construct this type in the CU directly.
2480       // This is inefficient because all the dependent types will be rebuilt
2481       // from scratch, including building them in type units, discovering that
2482       // they depend on addresses, throwing them out and rebuilding them.
2483       CU.constructTypeDIE(RefDie, CTy);
2484       return;
2485     }
2487     // If the type wasn't dependent on fission addresses, finish adding the type
2488     // and all its dependent types.
2489     for (auto &TU : TypeUnitsToAdd) {
2490       if (useSplitDwarf())
2491         TU.first->setSkeleton(constructSkeletonTU(*TU.first));
2492       InfoHolder.addUnit(std::move(TU.first));
2493     }
2494   }
2495   CU.addDIETypeSignature(RefDie, NewTU);
2498 void DwarfDebug::attachLowHighPC(DwarfCompileUnit &Unit, DIE &D,
2499                                  MCSymbol *Begin, MCSymbol *End) {
2500   Unit.addLabelAddress(D, dwarf::DW_AT_low_pc, Begin);
2501   if (DwarfVersion < 4)
2502     Unit.addLabelAddress(D, dwarf::DW_AT_high_pc, End);
2503   else
2504     Unit.addLabelDelta(D, dwarf::DW_AT_high_pc, End, Begin);
2507 // Accelerator table mutators - add each name along with its companion
2508 // DIE to the proper table while ensuring that the name that we're going
2509 // to reference is in the string table. We do this since the names we
2510 // add may not only be identical to the names in the DIE.
2511 void DwarfDebug::addAccelName(StringRef Name, const DIE &Die) {
2512   if (!useDwarfAccelTables())
2513     return;
2514   AccelNames.AddName(Name, InfoHolder.getStringPool().getSymbol(*Asm, Name),
2515                      &Die);
2518 void DwarfDebug::addAccelObjC(StringRef Name, const DIE &Die) {
2519   if (!useDwarfAccelTables())
2520     return;
2521   AccelObjC.AddName(Name, InfoHolder.getStringPool().getSymbol(*Asm, Name),
2522                     &Die);
2525 void DwarfDebug::addAccelNamespace(StringRef Name, const DIE &Die) {
2526   if (!useDwarfAccelTables())
2527     return;
2528   AccelNamespace.AddName(Name, InfoHolder.getStringPool().getSymbol(*Asm, Name),
2529                          &Die);
2532 void DwarfDebug::addAccelType(StringRef Name, const DIE &Die, char Flags) {
2533   if (!useDwarfAccelTables())
2534     return;
2535   AccelTypes.AddName(Name, InfoHolder.getStringPool().getSymbol(*Asm, Name),
2536                      &Die);