xref: /aosp_15_r20/external/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker //===-- llvm/CodeGen/DwarfDebug.cpp - Dwarf Debug Framework ---------------===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker //                     The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker //
10*9880d681SAndroid Build Coastguard Worker // This file contains support for writing dwarf debug info into asm files.
11*9880d681SAndroid Build Coastguard Worker //
12*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
13*9880d681SAndroid Build Coastguard Worker 
14*9880d681SAndroid Build Coastguard Worker #include "DwarfDebug.h"
15*9880d681SAndroid Build Coastguard Worker #include "ByteStreamer.h"
16*9880d681SAndroid Build Coastguard Worker #include "DIEHash.h"
17*9880d681SAndroid Build Coastguard Worker #include "DebugLocEntry.h"
18*9880d681SAndroid Build Coastguard Worker #include "DwarfCompileUnit.h"
19*9880d681SAndroid Build Coastguard Worker #include "DwarfExpression.h"
20*9880d681SAndroid Build Coastguard Worker #include "DwarfUnit.h"
21*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/STLExtras.h"
22*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/Statistic.h"
23*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/StringExtras.h"
24*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/Triple.h"
25*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/DIE.h"
26*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/MachineFunction.h"
27*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/MachineModuleInfo.h"
28*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Constants.h"
29*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/DataLayout.h"
30*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/DebugInfo.h"
31*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Instructions.h"
32*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Module.h"
33*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/ValueHandle.h"
34*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCAsmInfo.h"
35*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCDwarf.h"
36*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCSection.h"
37*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCStreamer.h"
38*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCSymbol.h"
39*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/CommandLine.h"
40*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/Debug.h"
41*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/Dwarf.h"
42*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/Endian.h"
43*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/ErrorHandling.h"
44*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/FormattedStream.h"
45*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/LEB128.h"
46*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/MD5.h"
47*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/Path.h"
48*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/Timer.h"
49*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/raw_ostream.h"
50*9880d681SAndroid Build Coastguard Worker #include "llvm/Target/TargetFrameLowering.h"
51*9880d681SAndroid Build Coastguard Worker #include "llvm/Target/TargetLoweringObjectFile.h"
52*9880d681SAndroid Build Coastguard Worker #include "llvm/Target/TargetMachine.h"
53*9880d681SAndroid Build Coastguard Worker #include "llvm/Target/TargetOptions.h"
54*9880d681SAndroid Build Coastguard Worker #include "llvm/Target/TargetRegisterInfo.h"
55*9880d681SAndroid Build Coastguard Worker #include "llvm/Target/TargetSubtargetInfo.h"
56*9880d681SAndroid Build Coastguard Worker 
57*9880d681SAndroid Build Coastguard Worker using namespace llvm;
58*9880d681SAndroid Build Coastguard Worker 
59*9880d681SAndroid Build Coastguard Worker #define DEBUG_TYPE "dwarfdebug"
60*9880d681SAndroid Build Coastguard Worker 
61*9880d681SAndroid Build Coastguard Worker static cl::opt<bool>
62*9880d681SAndroid Build Coastguard Worker DisableDebugInfoPrinting("disable-debug-info-print", cl::Hidden,
63*9880d681SAndroid Build Coastguard Worker                          cl::desc("Disable debug info printing"));
64*9880d681SAndroid Build Coastguard Worker 
65*9880d681SAndroid Build Coastguard Worker static cl::opt<bool> UnknownLocations(
66*9880d681SAndroid Build Coastguard Worker     "use-unknown-locations", cl::Hidden,
67*9880d681SAndroid Build Coastguard Worker     cl::desc("Make an absence of debug location information explicit."),
68*9880d681SAndroid Build Coastguard Worker     cl::init(false));
69*9880d681SAndroid Build Coastguard Worker 
70*9880d681SAndroid Build Coastguard Worker static cl::opt<bool>
71*9880d681SAndroid Build Coastguard Worker GenerateGnuPubSections("generate-gnu-dwarf-pub-sections", cl::Hidden,
72*9880d681SAndroid Build Coastguard Worker                        cl::desc("Generate GNU-style pubnames and pubtypes"),
73*9880d681SAndroid Build Coastguard Worker                        cl::init(false));
74*9880d681SAndroid Build Coastguard Worker 
75*9880d681SAndroid Build Coastguard Worker static cl::opt<bool> GenerateARangeSection("generate-arange-section",
76*9880d681SAndroid Build Coastguard Worker                                            cl::Hidden,
77*9880d681SAndroid Build Coastguard Worker                                            cl::desc("Generate dwarf aranges"),
78*9880d681SAndroid Build Coastguard Worker                                            cl::init(false));
79*9880d681SAndroid Build Coastguard Worker 
80*9880d681SAndroid Build Coastguard Worker namespace {
81*9880d681SAndroid Build Coastguard Worker enum DefaultOnOff { Default, Enable, Disable };
82*9880d681SAndroid Build Coastguard Worker }
83*9880d681SAndroid Build Coastguard Worker 
84*9880d681SAndroid Build Coastguard Worker static cl::opt<DefaultOnOff>
85*9880d681SAndroid Build Coastguard Worker DwarfAccelTables("dwarf-accel-tables", cl::Hidden,
86*9880d681SAndroid Build Coastguard Worker                  cl::desc("Output prototype dwarf accelerator tables."),
87*9880d681SAndroid Build Coastguard Worker                  cl::values(clEnumVal(Default, "Default for platform"),
88*9880d681SAndroid Build Coastguard Worker                             clEnumVal(Enable, "Enabled"),
89*9880d681SAndroid Build Coastguard Worker                             clEnumVal(Disable, "Disabled"), clEnumValEnd),
90*9880d681SAndroid Build Coastguard Worker                  cl::init(Default));
91*9880d681SAndroid Build Coastguard Worker 
92*9880d681SAndroid Build Coastguard Worker static cl::opt<DefaultOnOff>
93*9880d681SAndroid Build Coastguard Worker SplitDwarf("split-dwarf", cl::Hidden,
94*9880d681SAndroid Build Coastguard Worker            cl::desc("Output DWARF5 split debug info."),
95*9880d681SAndroid Build Coastguard Worker            cl::values(clEnumVal(Default, "Default for platform"),
96*9880d681SAndroid Build Coastguard Worker                       clEnumVal(Enable, "Enabled"),
97*9880d681SAndroid Build Coastguard Worker                       clEnumVal(Disable, "Disabled"), clEnumValEnd),
98*9880d681SAndroid Build Coastguard Worker            cl::init(Default));
99*9880d681SAndroid Build Coastguard Worker 
100*9880d681SAndroid Build Coastguard Worker static cl::opt<DefaultOnOff>
101*9880d681SAndroid Build Coastguard Worker DwarfPubSections("generate-dwarf-pub-sections", cl::Hidden,
102*9880d681SAndroid Build Coastguard Worker                  cl::desc("Generate DWARF pubnames and pubtypes sections"),
103*9880d681SAndroid Build Coastguard Worker                  cl::values(clEnumVal(Default, "Default for platform"),
104*9880d681SAndroid Build Coastguard Worker                             clEnumVal(Enable, "Enabled"),
105*9880d681SAndroid Build Coastguard Worker                             clEnumVal(Disable, "Disabled"), clEnumValEnd),
106*9880d681SAndroid Build Coastguard Worker                  cl::init(Default));
107*9880d681SAndroid Build Coastguard Worker 
108*9880d681SAndroid Build Coastguard Worker enum LinkageNameOption {
109*9880d681SAndroid Build Coastguard Worker   DefaultLinkageNames,
110*9880d681SAndroid Build Coastguard Worker   AllLinkageNames,
111*9880d681SAndroid Build Coastguard Worker   AbstractLinkageNames
112*9880d681SAndroid Build Coastguard Worker };
113*9880d681SAndroid Build Coastguard Worker static cl::opt<LinkageNameOption>
114*9880d681SAndroid Build Coastguard Worker     DwarfLinkageNames("dwarf-linkage-names", cl::Hidden,
115*9880d681SAndroid Build Coastguard Worker                       cl::desc("Which DWARF linkage-name attributes to emit."),
116*9880d681SAndroid Build Coastguard Worker                       cl::values(clEnumValN(DefaultLinkageNames, "Default",
117*9880d681SAndroid Build Coastguard Worker                                             "Default for platform"),
118*9880d681SAndroid Build Coastguard Worker                                  clEnumValN(AllLinkageNames, "All", "All"),
119*9880d681SAndroid Build Coastguard Worker                                  clEnumValN(AbstractLinkageNames, "Abstract",
120*9880d681SAndroid Build Coastguard Worker                                             "Abstract subprograms"),
121*9880d681SAndroid Build Coastguard Worker                                  clEnumValEnd),
122*9880d681SAndroid Build Coastguard Worker                       cl::init(DefaultLinkageNames));
123*9880d681SAndroid Build Coastguard Worker 
124*9880d681SAndroid Build Coastguard Worker static const char *const DWARFGroupName = "DWARF Emission";
125*9880d681SAndroid Build Coastguard Worker static const char *const DbgTimerName = "DWARF Debug Writer";
126*9880d681SAndroid Build Coastguard Worker 
EmitOp(uint8_t Op,const char * Comment)127*9880d681SAndroid Build Coastguard Worker void DebugLocDwarfExpression::EmitOp(uint8_t Op, const char *Comment) {
128*9880d681SAndroid Build Coastguard Worker   BS.EmitInt8(
129*9880d681SAndroid Build Coastguard Worker       Op, Comment ? Twine(Comment) + " " + dwarf::OperationEncodingString(Op)
130*9880d681SAndroid Build Coastguard Worker                   : dwarf::OperationEncodingString(Op));
131*9880d681SAndroid Build Coastguard Worker }
132*9880d681SAndroid Build Coastguard Worker 
EmitSigned(int64_t Value)133*9880d681SAndroid Build Coastguard Worker void DebugLocDwarfExpression::EmitSigned(int64_t Value) {
134*9880d681SAndroid Build Coastguard Worker   BS.EmitSLEB128(Value, Twine(Value));
135*9880d681SAndroid Build Coastguard Worker }
136*9880d681SAndroid Build Coastguard Worker 
EmitUnsigned(uint64_t Value)137*9880d681SAndroid Build Coastguard Worker void DebugLocDwarfExpression::EmitUnsigned(uint64_t Value) {
138*9880d681SAndroid Build Coastguard Worker   BS.EmitULEB128(Value, Twine(Value));
139*9880d681SAndroid Build Coastguard Worker }
140*9880d681SAndroid Build Coastguard Worker 
isFrameRegister(const TargetRegisterInfo & TRI,unsigned MachineReg)141*9880d681SAndroid Build Coastguard Worker bool DebugLocDwarfExpression::isFrameRegister(const TargetRegisterInfo &TRI,
142*9880d681SAndroid Build Coastguard Worker                                               unsigned MachineReg) {
143*9880d681SAndroid Build Coastguard Worker   // This information is not available while emitting .debug_loc entries.
144*9880d681SAndroid Build Coastguard Worker   return false;
145*9880d681SAndroid Build Coastguard Worker }
146*9880d681SAndroid Build Coastguard Worker 
147*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
148*9880d681SAndroid Build Coastguard Worker 
isBlockByrefVariable() const149*9880d681SAndroid Build Coastguard Worker bool DbgVariable::isBlockByrefVariable() const {
150*9880d681SAndroid Build Coastguard Worker   assert(Var && "Invalid complex DbgVariable!");
151*9880d681SAndroid Build Coastguard Worker   return Var->getType().resolve()->isBlockByrefStruct();
152*9880d681SAndroid Build Coastguard Worker }
153*9880d681SAndroid Build Coastguard Worker 
getType() const154*9880d681SAndroid Build Coastguard Worker const DIType *DbgVariable::getType() const {
155*9880d681SAndroid Build Coastguard Worker   DIType *Ty = Var->getType().resolve();
156*9880d681SAndroid Build Coastguard Worker   // FIXME: isBlockByrefVariable should be reformulated in terms of complex
157*9880d681SAndroid Build Coastguard Worker   // addresses instead.
158*9880d681SAndroid Build Coastguard Worker   if (Ty->isBlockByrefStruct()) {
159*9880d681SAndroid Build Coastguard Worker     /* Byref variables, in Blocks, are declared by the programmer as
160*9880d681SAndroid Build Coastguard Worker        "SomeType VarName;", but the compiler creates a
161*9880d681SAndroid Build Coastguard Worker        __Block_byref_x_VarName struct, and gives the variable VarName
162*9880d681SAndroid Build Coastguard Worker        either the struct, or a pointer to the struct, as its type.  This
163*9880d681SAndroid Build Coastguard Worker        is necessary for various behind-the-scenes things the compiler
164*9880d681SAndroid Build Coastguard Worker        needs to do with by-reference variables in blocks.
165*9880d681SAndroid Build Coastguard Worker 
166*9880d681SAndroid Build Coastguard Worker        However, as far as the original *programmer* is concerned, the
167*9880d681SAndroid Build Coastguard Worker        variable should still have type 'SomeType', as originally declared.
168*9880d681SAndroid Build Coastguard Worker 
169*9880d681SAndroid Build Coastguard Worker        The following function dives into the __Block_byref_x_VarName
170*9880d681SAndroid Build Coastguard Worker        struct to find the original type of the variable.  This will be
171*9880d681SAndroid Build Coastguard Worker        passed back to the code generating the type for the Debug
172*9880d681SAndroid Build Coastguard Worker        Information Entry for the variable 'VarName'.  'VarName' will then
173*9880d681SAndroid Build Coastguard Worker        have the original type 'SomeType' in its debug information.
174*9880d681SAndroid Build Coastguard Worker 
175*9880d681SAndroid Build Coastguard Worker        The original type 'SomeType' will be the type of the field named
176*9880d681SAndroid Build Coastguard Worker        'VarName' inside the __Block_byref_x_VarName struct.
177*9880d681SAndroid Build Coastguard Worker 
178*9880d681SAndroid Build Coastguard Worker        NOTE: In order for this to not completely fail on the debugger
179*9880d681SAndroid Build Coastguard Worker        side, the Debug Information Entry for the variable VarName needs to
180*9880d681SAndroid Build Coastguard Worker        have a DW_AT_location that tells the debugger how to unwind through
181*9880d681SAndroid Build Coastguard Worker        the pointers and __Block_byref_x_VarName struct to find the actual
182*9880d681SAndroid Build Coastguard Worker        value of the variable.  The function addBlockByrefType does this.  */
183*9880d681SAndroid Build Coastguard Worker     DIType *subType = Ty;
184*9880d681SAndroid Build Coastguard Worker     uint16_t tag = Ty->getTag();
185*9880d681SAndroid Build Coastguard Worker 
186*9880d681SAndroid Build Coastguard Worker     if (tag == dwarf::DW_TAG_pointer_type)
187*9880d681SAndroid Build Coastguard Worker       subType = resolve(cast<DIDerivedType>(Ty)->getBaseType());
188*9880d681SAndroid Build Coastguard Worker 
189*9880d681SAndroid Build Coastguard Worker     auto Elements = cast<DICompositeType>(subType)->getElements();
190*9880d681SAndroid Build Coastguard Worker     for (unsigned i = 0, N = Elements.size(); i < N; ++i) {
191*9880d681SAndroid Build Coastguard Worker       auto *DT = cast<DIDerivedType>(Elements[i]);
192*9880d681SAndroid Build Coastguard Worker       if (getName() == DT->getName())
193*9880d681SAndroid Build Coastguard Worker         return resolve(DT->getBaseType());
194*9880d681SAndroid Build Coastguard Worker     }
195*9880d681SAndroid Build Coastguard Worker   }
196*9880d681SAndroid Build Coastguard Worker   return Ty;
197*9880d681SAndroid Build Coastguard Worker }
198*9880d681SAndroid Build Coastguard Worker 
199*9880d681SAndroid Build Coastguard Worker static LLVM_CONSTEXPR DwarfAccelTable::Atom TypeAtoms[] = {
200*9880d681SAndroid Build Coastguard Worker     DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset, dwarf::DW_FORM_data4),
201*9880d681SAndroid Build Coastguard Worker     DwarfAccelTable::Atom(dwarf::DW_ATOM_die_tag, dwarf::DW_FORM_data2),
202*9880d681SAndroid Build Coastguard Worker     DwarfAccelTable::Atom(dwarf::DW_ATOM_type_flags, dwarf::DW_FORM_data1)};
203*9880d681SAndroid Build Coastguard Worker 
DwarfDebug(AsmPrinter * A,Module * M)204*9880d681SAndroid Build Coastguard Worker DwarfDebug::DwarfDebug(AsmPrinter *A, Module *M)
205*9880d681SAndroid Build Coastguard Worker     : DebugHandlerBase(A), DebugLocs(A->OutStreamer->isVerboseAsm()),
206*9880d681SAndroid Build Coastguard Worker       InfoHolder(A, "info_string", DIEValueAllocator),
207*9880d681SAndroid Build Coastguard Worker       SkeletonHolder(A, "skel_string", DIEValueAllocator),
208*9880d681SAndroid Build Coastguard Worker       IsDarwin(Triple(A->getTargetTriple()).isOSDarwin()),
209*9880d681SAndroid Build Coastguard Worker       AccelNames(DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset,
210*9880d681SAndroid Build Coastguard Worker                                        dwarf::DW_FORM_data4)),
211*9880d681SAndroid Build Coastguard Worker       AccelObjC(DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset,
212*9880d681SAndroid Build Coastguard Worker                                       dwarf::DW_FORM_data4)),
213*9880d681SAndroid Build Coastguard Worker       AccelNamespace(DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset,
214*9880d681SAndroid Build Coastguard Worker                                            dwarf::DW_FORM_data4)),
215*9880d681SAndroid Build Coastguard Worker       AccelTypes(TypeAtoms), DebuggerTuning(DebuggerKind::Default) {
216*9880d681SAndroid Build Coastguard Worker 
217*9880d681SAndroid Build Coastguard Worker   CurFn = nullptr;
218*9880d681SAndroid Build Coastguard Worker   Triple TT(Asm->getTargetTriple());
219*9880d681SAndroid Build Coastguard Worker 
220*9880d681SAndroid Build Coastguard Worker   // Make sure we know our "debugger tuning."  The target option takes
221*9880d681SAndroid Build Coastguard Worker   // precedence; fall back to triple-based defaults.
222*9880d681SAndroid Build Coastguard Worker   if (Asm->TM.Options.DebuggerTuning != DebuggerKind::Default)
223*9880d681SAndroid Build Coastguard Worker     DebuggerTuning = Asm->TM.Options.DebuggerTuning;
224*9880d681SAndroid Build Coastguard Worker   else if (IsDarwin)
225*9880d681SAndroid Build Coastguard Worker     DebuggerTuning = DebuggerKind::LLDB;
226*9880d681SAndroid Build Coastguard Worker   else if (TT.isPS4CPU())
227*9880d681SAndroid Build Coastguard Worker     DebuggerTuning = DebuggerKind::SCE;
228*9880d681SAndroid Build Coastguard Worker   else
229*9880d681SAndroid Build Coastguard Worker     DebuggerTuning = DebuggerKind::GDB;
230*9880d681SAndroid Build Coastguard Worker 
231*9880d681SAndroid Build Coastguard Worker   // Turn on accelerator tables for LLDB by default.
232*9880d681SAndroid Build Coastguard Worker   if (DwarfAccelTables == Default)
233*9880d681SAndroid Build Coastguard Worker     HasDwarfAccelTables = tuneForLLDB();
234*9880d681SAndroid Build Coastguard Worker   else
235*9880d681SAndroid Build Coastguard Worker     HasDwarfAccelTables = DwarfAccelTables == Enable;
236*9880d681SAndroid Build Coastguard Worker 
237*9880d681SAndroid Build Coastguard Worker   HasAppleExtensionAttributes = tuneForLLDB();
238*9880d681SAndroid Build Coastguard Worker 
239*9880d681SAndroid Build Coastguard Worker   // Handle split DWARF. Off by default for now.
240*9880d681SAndroid Build Coastguard Worker   if (SplitDwarf == Default)
241*9880d681SAndroid Build Coastguard Worker     HasSplitDwarf = false;
242*9880d681SAndroid Build Coastguard Worker   else
243*9880d681SAndroid Build Coastguard Worker     HasSplitDwarf = SplitDwarf == Enable;
244*9880d681SAndroid Build Coastguard Worker 
245*9880d681SAndroid Build Coastguard Worker   // Pubnames/pubtypes on by default for GDB.
246*9880d681SAndroid Build Coastguard Worker   if (DwarfPubSections == Default)
247*9880d681SAndroid Build Coastguard Worker     HasDwarfPubSections = tuneForGDB();
248*9880d681SAndroid Build Coastguard Worker   else
249*9880d681SAndroid Build Coastguard Worker     HasDwarfPubSections = DwarfPubSections == Enable;
250*9880d681SAndroid Build Coastguard Worker 
251*9880d681SAndroid Build Coastguard Worker   // SCE defaults to linkage names only for abstract subprograms.
252*9880d681SAndroid Build Coastguard Worker   if (DwarfLinkageNames == DefaultLinkageNames)
253*9880d681SAndroid Build Coastguard Worker     UseAllLinkageNames = !tuneForSCE();
254*9880d681SAndroid Build Coastguard Worker   else
255*9880d681SAndroid Build Coastguard Worker     UseAllLinkageNames = DwarfLinkageNames == AllLinkageNames;
256*9880d681SAndroid Build Coastguard Worker 
257*9880d681SAndroid Build Coastguard Worker   unsigned DwarfVersionNumber = Asm->TM.Options.MCOptions.DwarfVersion;
258*9880d681SAndroid Build Coastguard Worker   DwarfVersion = DwarfVersionNumber ? DwarfVersionNumber
259*9880d681SAndroid Build Coastguard Worker                                     : MMI->getModule()->getDwarfVersion();
260*9880d681SAndroid Build Coastguard Worker   // Use dwarf 4 by default if nothing is requested.
261*9880d681SAndroid Build Coastguard Worker   DwarfVersion = DwarfVersion ? DwarfVersion : dwarf::DWARF_VERSION;
262*9880d681SAndroid Build Coastguard Worker 
263*9880d681SAndroid Build Coastguard Worker   // Work around a GDB bug. GDB doesn't support the standard opcode;
264*9880d681SAndroid Build Coastguard Worker   // SCE doesn't support GNU's; LLDB prefers the standard opcode, which
265*9880d681SAndroid Build Coastguard Worker   // is defined as of DWARF 3.
266*9880d681SAndroid Build Coastguard Worker   // See GDB bug 11616 - DW_OP_form_tls_address is unimplemented
267*9880d681SAndroid Build Coastguard Worker   // https://sourceware.org/bugzilla/show_bug.cgi?id=11616
268*9880d681SAndroid Build Coastguard Worker   UseGNUTLSOpcode = tuneForGDB() || DwarfVersion < 3;
269*9880d681SAndroid Build Coastguard Worker 
270*9880d681SAndroid Build Coastguard Worker   // GDB does not fully support the DWARF 4 representation for bitfields.
271*9880d681SAndroid Build Coastguard Worker   UseDWARF2Bitfields = (DwarfVersion < 4) || tuneForGDB();
272*9880d681SAndroid Build Coastguard Worker 
273*9880d681SAndroid Build Coastguard Worker   Asm->OutStreamer->getContext().setDwarfVersion(DwarfVersion);
274*9880d681SAndroid Build Coastguard Worker }
275*9880d681SAndroid Build Coastguard Worker 
276*9880d681SAndroid Build Coastguard Worker // Define out of line so we don't have to include DwarfUnit.h in DwarfDebug.h.
~DwarfDebug()277*9880d681SAndroid Build Coastguard Worker DwarfDebug::~DwarfDebug() { }
278*9880d681SAndroid Build Coastguard Worker 
isObjCClass(StringRef Name)279*9880d681SAndroid Build Coastguard Worker static bool isObjCClass(StringRef Name) {
280*9880d681SAndroid Build Coastguard Worker   return Name.startswith("+") || Name.startswith("-");
281*9880d681SAndroid Build Coastguard Worker }
282*9880d681SAndroid Build Coastguard Worker 
hasObjCCategory(StringRef Name)283*9880d681SAndroid Build Coastguard Worker static bool hasObjCCategory(StringRef Name) {
284*9880d681SAndroid Build Coastguard Worker   if (!isObjCClass(Name))
285*9880d681SAndroid Build Coastguard Worker     return false;
286*9880d681SAndroid Build Coastguard Worker 
287*9880d681SAndroid Build Coastguard Worker   return Name.find(") ") != StringRef::npos;
288*9880d681SAndroid Build Coastguard Worker }
289*9880d681SAndroid Build Coastguard Worker 
getObjCClassCategory(StringRef In,StringRef & Class,StringRef & Category)290*9880d681SAndroid Build Coastguard Worker static void getObjCClassCategory(StringRef In, StringRef &Class,
291*9880d681SAndroid Build Coastguard Worker                                  StringRef &Category) {
292*9880d681SAndroid Build Coastguard Worker   if (!hasObjCCategory(In)) {
293*9880d681SAndroid Build Coastguard Worker     Class = In.slice(In.find('[') + 1, In.find(' '));
294*9880d681SAndroid Build Coastguard Worker     Category = "";
295*9880d681SAndroid Build Coastguard Worker     return;
296*9880d681SAndroid Build Coastguard Worker   }
297*9880d681SAndroid Build Coastguard Worker 
298*9880d681SAndroid Build Coastguard Worker   Class = In.slice(In.find('[') + 1, In.find('('));
299*9880d681SAndroid Build Coastguard Worker   Category = In.slice(In.find('[') + 1, In.find(' '));
300*9880d681SAndroid Build Coastguard Worker }
301*9880d681SAndroid Build Coastguard Worker 
getObjCMethodName(StringRef In)302*9880d681SAndroid Build Coastguard Worker static StringRef getObjCMethodName(StringRef In) {
303*9880d681SAndroid Build Coastguard Worker   return In.slice(In.find(' ') + 1, In.find(']'));
304*9880d681SAndroid Build Coastguard Worker }
305*9880d681SAndroid Build Coastguard Worker 
306*9880d681SAndroid Build Coastguard Worker // Add the various names to the Dwarf accelerator table names.
307*9880d681SAndroid Build Coastguard Worker // TODO: Determine whether or not we should add names for programs
308*9880d681SAndroid Build Coastguard Worker // that do not have a DW_AT_name or DW_AT_linkage_name field - this
309*9880d681SAndroid Build Coastguard Worker // is only slightly different than the lookup of non-standard ObjC names.
addSubprogramNames(const DISubprogram * SP,DIE & Die)310*9880d681SAndroid Build Coastguard Worker void DwarfDebug::addSubprogramNames(const DISubprogram *SP, DIE &Die) {
311*9880d681SAndroid Build Coastguard Worker   if (!SP->isDefinition())
312*9880d681SAndroid Build Coastguard Worker     return;
313*9880d681SAndroid Build Coastguard Worker   addAccelName(SP->getName(), Die);
314*9880d681SAndroid Build Coastguard Worker 
315*9880d681SAndroid Build Coastguard Worker   // If the linkage name is different than the name, go ahead and output
316*9880d681SAndroid Build Coastguard Worker   // that as well into the name table.
317*9880d681SAndroid Build Coastguard Worker   if (SP->getLinkageName() != "" && SP->getName() != SP->getLinkageName())
318*9880d681SAndroid Build Coastguard Worker     addAccelName(SP->getLinkageName(), Die);
319*9880d681SAndroid Build Coastguard Worker 
320*9880d681SAndroid Build Coastguard Worker   // If this is an Objective-C selector name add it to the ObjC accelerator
321*9880d681SAndroid Build Coastguard Worker   // too.
322*9880d681SAndroid Build Coastguard Worker   if (isObjCClass(SP->getName())) {
323*9880d681SAndroid Build Coastguard Worker     StringRef Class, Category;
324*9880d681SAndroid Build Coastguard Worker     getObjCClassCategory(SP->getName(), Class, Category);
325*9880d681SAndroid Build Coastguard Worker     addAccelObjC(Class, Die);
326*9880d681SAndroid Build Coastguard Worker     if (Category != "")
327*9880d681SAndroid Build Coastguard Worker       addAccelObjC(Category, Die);
328*9880d681SAndroid Build Coastguard Worker     // Also add the base method name to the name table.
329*9880d681SAndroid Build Coastguard Worker     addAccelName(getObjCMethodName(SP->getName()), Die);
330*9880d681SAndroid Build Coastguard Worker   }
331*9880d681SAndroid Build Coastguard Worker }
332*9880d681SAndroid Build Coastguard Worker 
333*9880d681SAndroid Build Coastguard Worker /// Check whether we should create a DIE for the given Scope, return true
334*9880d681SAndroid Build Coastguard Worker /// if we don't create a DIE (the corresponding DIE is null).
isLexicalScopeDIENull(LexicalScope * Scope)335*9880d681SAndroid Build Coastguard Worker bool DwarfDebug::isLexicalScopeDIENull(LexicalScope *Scope) {
336*9880d681SAndroid Build Coastguard Worker   if (Scope->isAbstractScope())
337*9880d681SAndroid Build Coastguard Worker     return false;
338*9880d681SAndroid Build Coastguard Worker 
339*9880d681SAndroid Build Coastguard Worker   // We don't create a DIE if there is no Range.
340*9880d681SAndroid Build Coastguard Worker   const SmallVectorImpl<InsnRange> &Ranges = Scope->getRanges();
341*9880d681SAndroid Build Coastguard Worker   if (Ranges.empty())
342*9880d681SAndroid Build Coastguard Worker     return true;
343*9880d681SAndroid Build Coastguard Worker 
344*9880d681SAndroid Build Coastguard Worker   if (Ranges.size() > 1)
345*9880d681SAndroid Build Coastguard Worker     return false;
346*9880d681SAndroid Build Coastguard Worker 
347*9880d681SAndroid Build Coastguard Worker   // We don't create a DIE if we have a single Range and the end label
348*9880d681SAndroid Build Coastguard Worker   // is null.
349*9880d681SAndroid Build Coastguard Worker   return !getLabelAfterInsn(Ranges.front().second);
350*9880d681SAndroid Build Coastguard Worker }
351*9880d681SAndroid Build Coastguard Worker 
forBothCUs(DwarfCompileUnit & CU,Func F)352*9880d681SAndroid Build Coastguard Worker template <typename Func> void forBothCUs(DwarfCompileUnit &CU, Func F) {
353*9880d681SAndroid Build Coastguard Worker   F(CU);
354*9880d681SAndroid Build Coastguard Worker   if (auto *SkelCU = CU.getSkeleton())
355*9880d681SAndroid Build Coastguard Worker     F(*SkelCU);
356*9880d681SAndroid Build Coastguard Worker }
357*9880d681SAndroid Build Coastguard Worker 
constructAbstractSubprogramScopeDIE(LexicalScope * Scope)358*9880d681SAndroid Build Coastguard Worker void DwarfDebug::constructAbstractSubprogramScopeDIE(LexicalScope *Scope) {
359*9880d681SAndroid Build Coastguard Worker   assert(Scope && Scope->getScopeNode());
360*9880d681SAndroid Build Coastguard Worker   assert(Scope->isAbstractScope());
361*9880d681SAndroid Build Coastguard Worker   assert(!Scope->getInlinedAt());
362*9880d681SAndroid Build Coastguard Worker 
363*9880d681SAndroid Build Coastguard Worker   const MDNode *SP = Scope->getScopeNode();
364*9880d681SAndroid Build Coastguard Worker 
365*9880d681SAndroid Build Coastguard Worker   ProcessedSPNodes.insert(SP);
366*9880d681SAndroid Build Coastguard Worker 
367*9880d681SAndroid Build Coastguard Worker   // Find the subprogram's DwarfCompileUnit in the SPMap in case the subprogram
368*9880d681SAndroid Build Coastguard Worker   // was inlined from another compile unit.
369*9880d681SAndroid Build Coastguard Worker   auto &CU = *CUMap.lookup(cast<DISubprogram>(SP)->getUnit());
370*9880d681SAndroid Build Coastguard Worker   forBothCUs(CU, [&](DwarfCompileUnit &CU) {
371*9880d681SAndroid Build Coastguard Worker     CU.constructAbstractSubprogramScopeDIE(Scope);
372*9880d681SAndroid Build Coastguard Worker   });
373*9880d681SAndroid Build Coastguard Worker }
374*9880d681SAndroid Build Coastguard Worker 
addGnuPubAttributes(DwarfUnit & U,DIE & D) const375*9880d681SAndroid Build Coastguard Worker void DwarfDebug::addGnuPubAttributes(DwarfUnit &U, DIE &D) const {
376*9880d681SAndroid Build Coastguard Worker   if (!GenerateGnuPubSections)
377*9880d681SAndroid Build Coastguard Worker     return;
378*9880d681SAndroid Build Coastguard Worker 
379*9880d681SAndroid Build Coastguard Worker   U.addFlag(D, dwarf::DW_AT_GNU_pubnames);
380*9880d681SAndroid Build Coastguard Worker }
381*9880d681SAndroid Build Coastguard Worker 
382*9880d681SAndroid Build Coastguard Worker // Create new DwarfCompileUnit for the given metadata node with tag
383*9880d681SAndroid Build Coastguard Worker // DW_TAG_compile_unit.
384*9880d681SAndroid Build Coastguard Worker DwarfCompileUnit &
constructDwarfCompileUnit(const DICompileUnit * DIUnit)385*9880d681SAndroid Build Coastguard Worker DwarfDebug::constructDwarfCompileUnit(const DICompileUnit *DIUnit) {
386*9880d681SAndroid Build Coastguard Worker   StringRef FN = DIUnit->getFilename();
387*9880d681SAndroid Build Coastguard Worker   CompilationDir = DIUnit->getDirectory();
388*9880d681SAndroid Build Coastguard Worker 
389*9880d681SAndroid Build Coastguard Worker   auto OwnedUnit = make_unique<DwarfCompileUnit>(
390*9880d681SAndroid Build Coastguard Worker       InfoHolder.getUnits().size(), DIUnit, Asm, this, &InfoHolder);
391*9880d681SAndroid Build Coastguard Worker   DwarfCompileUnit &NewCU = *OwnedUnit;
392*9880d681SAndroid Build Coastguard Worker   DIE &Die = NewCU.getUnitDie();
393*9880d681SAndroid Build Coastguard Worker   InfoHolder.addUnit(std::move(OwnedUnit));
394*9880d681SAndroid Build Coastguard Worker   if (useSplitDwarf()) {
395*9880d681SAndroid Build Coastguard Worker     NewCU.setSkeleton(constructSkeletonCU(NewCU));
396*9880d681SAndroid Build Coastguard Worker     NewCU.addString(Die, dwarf::DW_AT_GNU_dwo_name,
397*9880d681SAndroid Build Coastguard Worker                     DIUnit->getSplitDebugFilename());
398*9880d681SAndroid Build Coastguard Worker   }
399*9880d681SAndroid Build Coastguard Worker 
400*9880d681SAndroid Build Coastguard Worker   // LTO with assembly output shares a single line table amongst multiple CUs.
401*9880d681SAndroid Build Coastguard Worker   // To avoid the compilation directory being ambiguous, let the line table
402*9880d681SAndroid Build Coastguard Worker   // explicitly describe the directory of all files, never relying on the
403*9880d681SAndroid Build Coastguard Worker   // compilation directory.
404*9880d681SAndroid Build Coastguard Worker   if (!Asm->OutStreamer->hasRawTextSupport() || SingleCU)
405*9880d681SAndroid Build Coastguard Worker     Asm->OutStreamer->getContext().setMCLineTableCompilationDir(
406*9880d681SAndroid Build Coastguard Worker         NewCU.getUniqueID(), CompilationDir);
407*9880d681SAndroid Build Coastguard Worker 
408*9880d681SAndroid Build Coastguard Worker   NewCU.addString(Die, dwarf::DW_AT_producer, DIUnit->getProducer());
409*9880d681SAndroid Build Coastguard Worker   NewCU.addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data2,
410*9880d681SAndroid Build Coastguard Worker                 DIUnit->getSourceLanguage());
411*9880d681SAndroid Build Coastguard Worker   NewCU.addString(Die, dwarf::DW_AT_name, FN);
412*9880d681SAndroid Build Coastguard Worker 
413*9880d681SAndroid Build Coastguard Worker   if (!useSplitDwarf()) {
414*9880d681SAndroid Build Coastguard Worker     NewCU.initStmtList();
415*9880d681SAndroid Build Coastguard Worker 
416*9880d681SAndroid Build Coastguard Worker     // If we're using split dwarf the compilation dir is going to be in the
417*9880d681SAndroid Build Coastguard Worker     // skeleton CU and so we don't need to duplicate it here.
418*9880d681SAndroid Build Coastguard Worker     if (!CompilationDir.empty())
419*9880d681SAndroid Build Coastguard Worker       NewCU.addString(Die, dwarf::DW_AT_comp_dir, CompilationDir);
420*9880d681SAndroid Build Coastguard Worker 
421*9880d681SAndroid Build Coastguard Worker     addGnuPubAttributes(NewCU, Die);
422*9880d681SAndroid Build Coastguard Worker   }
423*9880d681SAndroid Build Coastguard Worker 
424*9880d681SAndroid Build Coastguard Worker   if (useAppleExtensionAttributes()) {
425*9880d681SAndroid Build Coastguard Worker     if (DIUnit->isOptimized())
426*9880d681SAndroid Build Coastguard Worker       NewCU.addFlag(Die, dwarf::DW_AT_APPLE_optimized);
427*9880d681SAndroid Build Coastguard Worker 
428*9880d681SAndroid Build Coastguard Worker     StringRef Flags = DIUnit->getFlags();
429*9880d681SAndroid Build Coastguard Worker     if (!Flags.empty())
430*9880d681SAndroid Build Coastguard Worker       NewCU.addString(Die, dwarf::DW_AT_APPLE_flags, Flags);
431*9880d681SAndroid Build Coastguard Worker 
432*9880d681SAndroid Build Coastguard Worker     if (unsigned RVer = DIUnit->getRuntimeVersion())
433*9880d681SAndroid Build Coastguard Worker       NewCU.addUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers,
434*9880d681SAndroid Build Coastguard Worker                     dwarf::DW_FORM_data1, RVer);
435*9880d681SAndroid Build Coastguard Worker   }
436*9880d681SAndroid Build Coastguard Worker 
437*9880d681SAndroid Build Coastguard Worker   if (useSplitDwarf())
438*9880d681SAndroid Build Coastguard Worker     NewCU.initSection(Asm->getObjFileLowering().getDwarfInfoDWOSection());
439*9880d681SAndroid Build Coastguard Worker   else
440*9880d681SAndroid Build Coastguard Worker     NewCU.initSection(Asm->getObjFileLowering().getDwarfInfoSection());
441*9880d681SAndroid Build Coastguard Worker 
442*9880d681SAndroid Build Coastguard Worker   if (DIUnit->getDWOId()) {
443*9880d681SAndroid Build Coastguard Worker     // This CU is either a clang module DWO or a skeleton CU.
444*9880d681SAndroid Build Coastguard Worker     NewCU.addUInt(Die, dwarf::DW_AT_GNU_dwo_id, dwarf::DW_FORM_data8,
445*9880d681SAndroid Build Coastguard Worker                   DIUnit->getDWOId());
446*9880d681SAndroid Build Coastguard Worker     if (!DIUnit->getSplitDebugFilename().empty())
447*9880d681SAndroid Build Coastguard Worker       // This is a prefabricated skeleton CU.
448*9880d681SAndroid Build Coastguard Worker       NewCU.addString(Die, dwarf::DW_AT_GNU_dwo_name,
449*9880d681SAndroid Build Coastguard Worker                       DIUnit->getSplitDebugFilename());
450*9880d681SAndroid Build Coastguard Worker   }
451*9880d681SAndroid Build Coastguard Worker 
452*9880d681SAndroid Build Coastguard Worker   CUMap.insert(std::make_pair(DIUnit, &NewCU));
453*9880d681SAndroid Build Coastguard Worker   CUDieMap.insert(std::make_pair(&Die, &NewCU));
454*9880d681SAndroid Build Coastguard Worker   return NewCU;
455*9880d681SAndroid Build Coastguard Worker }
456*9880d681SAndroid Build Coastguard Worker 
constructAndAddImportedEntityDIE(DwarfCompileUnit & TheCU,const DIImportedEntity * N)457*9880d681SAndroid Build Coastguard Worker void DwarfDebug::constructAndAddImportedEntityDIE(DwarfCompileUnit &TheCU,
458*9880d681SAndroid Build Coastguard Worker                                                   const DIImportedEntity *N) {
459*9880d681SAndroid Build Coastguard Worker   if (DIE *D = TheCU.getOrCreateContextDIE(N->getScope()))
460*9880d681SAndroid Build Coastguard Worker     D->addChild(TheCU.constructImportedEntityDIE(N));
461*9880d681SAndroid Build Coastguard Worker }
462*9880d681SAndroid Build Coastguard Worker 
463*9880d681SAndroid Build Coastguard Worker // Emit all Dwarf sections that should come prior to the content. Create
464*9880d681SAndroid Build Coastguard Worker // global DIEs and emit initial debug info sections. This is invoked by
465*9880d681SAndroid Build Coastguard Worker // the target AsmPrinter.
beginModule()466*9880d681SAndroid Build Coastguard Worker void DwarfDebug::beginModule() {
467*9880d681SAndroid Build Coastguard Worker   NamedRegionTimer T(DbgTimerName, DWARFGroupName, TimePassesIsEnabled);
468*9880d681SAndroid Build Coastguard Worker   if (DisableDebugInfoPrinting)
469*9880d681SAndroid Build Coastguard Worker     return;
470*9880d681SAndroid Build Coastguard Worker 
471*9880d681SAndroid Build Coastguard Worker   const Module *M = MMI->getModule();
472*9880d681SAndroid Build Coastguard Worker 
473*9880d681SAndroid Build Coastguard Worker   unsigned NumDebugCUs = std::distance(M->debug_compile_units_begin(),
474*9880d681SAndroid Build Coastguard Worker                                        M->debug_compile_units_end());
475*9880d681SAndroid Build Coastguard Worker   // Tell MMI whether we have debug info.
476*9880d681SAndroid Build Coastguard Worker   MMI->setDebugInfoAvailability(NumDebugCUs > 0);
477*9880d681SAndroid Build Coastguard Worker   SingleCU = NumDebugCUs == 1;
478*9880d681SAndroid Build Coastguard Worker 
479*9880d681SAndroid Build Coastguard Worker   for (DICompileUnit *CUNode : M->debug_compile_units()) {
480*9880d681SAndroid Build Coastguard Worker     DwarfCompileUnit &CU = constructDwarfCompileUnit(CUNode);
481*9880d681SAndroid Build Coastguard Worker     for (auto *IE : CUNode->getImportedEntities())
482*9880d681SAndroid Build Coastguard Worker       CU.addImportedEntity(IE);
483*9880d681SAndroid Build Coastguard Worker     for (auto *GV : CUNode->getGlobalVariables())
484*9880d681SAndroid Build Coastguard Worker       CU.getOrCreateGlobalVariableDIE(GV);
485*9880d681SAndroid Build Coastguard Worker     for (auto *Ty : CUNode->getEnumTypes()) {
486*9880d681SAndroid Build Coastguard Worker       // The enum types array by design contains pointers to
487*9880d681SAndroid Build Coastguard Worker       // MDNodes rather than DIRefs. Unique them here.
488*9880d681SAndroid Build Coastguard Worker       CU.getOrCreateTypeDIE(cast<DIType>(Ty));
489*9880d681SAndroid Build Coastguard Worker     }
490*9880d681SAndroid Build Coastguard Worker     for (auto *Ty : CUNode->getRetainedTypes()) {
491*9880d681SAndroid Build Coastguard Worker       // The retained types array by design contains pointers to
492*9880d681SAndroid Build Coastguard Worker       // MDNodes rather than DIRefs. Unique them here.
493*9880d681SAndroid Build Coastguard Worker       if (DIType *RT = dyn_cast<DIType>(Ty))
494*9880d681SAndroid Build Coastguard Worker         if (!RT->isExternalTypeRef())
495*9880d681SAndroid Build Coastguard Worker           // There is no point in force-emitting a forward declaration.
496*9880d681SAndroid Build Coastguard Worker           CU.getOrCreateTypeDIE(RT);
497*9880d681SAndroid Build Coastguard Worker     }
498*9880d681SAndroid Build Coastguard Worker     // Emit imported_modules last so that the relevant context is already
499*9880d681SAndroid Build Coastguard Worker     // available.
500*9880d681SAndroid Build Coastguard Worker     for (auto *IE : CUNode->getImportedEntities())
501*9880d681SAndroid Build Coastguard Worker       constructAndAddImportedEntityDIE(CU, IE);
502*9880d681SAndroid Build Coastguard Worker   }
503*9880d681SAndroid Build Coastguard Worker }
504*9880d681SAndroid Build Coastguard Worker 
finishVariableDefinitions()505*9880d681SAndroid Build Coastguard Worker void DwarfDebug::finishVariableDefinitions() {
506*9880d681SAndroid Build Coastguard Worker   for (const auto &Var : ConcreteVariables) {
507*9880d681SAndroid Build Coastguard Worker     DIE *VariableDie = Var->getDIE();
508*9880d681SAndroid Build Coastguard Worker     assert(VariableDie);
509*9880d681SAndroid Build Coastguard Worker     // FIXME: Consider the time-space tradeoff of just storing the unit pointer
510*9880d681SAndroid Build Coastguard Worker     // in the ConcreteVariables list, rather than looking it up again here.
511*9880d681SAndroid Build Coastguard Worker     // DIE::getUnit isn't simple - it walks parent pointers, etc.
512*9880d681SAndroid Build Coastguard Worker     DwarfCompileUnit *Unit = lookupUnit(VariableDie->getUnit());
513*9880d681SAndroid Build Coastguard Worker     assert(Unit);
514*9880d681SAndroid Build Coastguard Worker     DbgVariable *AbsVar = getExistingAbstractVariable(
515*9880d681SAndroid Build Coastguard Worker         InlinedVariable(Var->getVariable(), Var->getInlinedAt()));
516*9880d681SAndroid Build Coastguard Worker     if (AbsVar && AbsVar->getDIE()) {
517*9880d681SAndroid Build Coastguard Worker       Unit->addDIEEntry(*VariableDie, dwarf::DW_AT_abstract_origin,
518*9880d681SAndroid Build Coastguard Worker                         *AbsVar->getDIE());
519*9880d681SAndroid Build Coastguard Worker     } else
520*9880d681SAndroid Build Coastguard Worker       Unit->applyVariableAttributes(*Var, *VariableDie);
521*9880d681SAndroid Build Coastguard Worker   }
522*9880d681SAndroid Build Coastguard Worker }
523*9880d681SAndroid Build Coastguard Worker 
finishSubprogramDefinitions()524*9880d681SAndroid Build Coastguard Worker void DwarfDebug::finishSubprogramDefinitions() {
525*9880d681SAndroid Build Coastguard Worker   for (auto &F : MMI->getModule()->functions())
526*9880d681SAndroid Build Coastguard Worker     if (auto *SP = F.getSubprogram())
527*9880d681SAndroid Build Coastguard Worker       if (ProcessedSPNodes.count(SP) &&
528*9880d681SAndroid Build Coastguard Worker           SP->getUnit()->getEmissionKind() != DICompileUnit::NoDebug)
529*9880d681SAndroid Build Coastguard Worker         forBothCUs(*CUMap.lookup(SP->getUnit()), [&](DwarfCompileUnit &CU) {
530*9880d681SAndroid Build Coastguard Worker           CU.finishSubprogramDefinition(SP);
531*9880d681SAndroid Build Coastguard Worker         });
532*9880d681SAndroid Build Coastguard Worker }
533*9880d681SAndroid Build Coastguard Worker 
finalizeModuleInfo()534*9880d681SAndroid Build Coastguard Worker void DwarfDebug::finalizeModuleInfo() {
535*9880d681SAndroid Build Coastguard Worker   const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
536*9880d681SAndroid Build Coastguard Worker 
537*9880d681SAndroid Build Coastguard Worker   finishSubprogramDefinitions();
538*9880d681SAndroid Build Coastguard Worker 
539*9880d681SAndroid Build Coastguard Worker   finishVariableDefinitions();
540*9880d681SAndroid Build Coastguard Worker 
541*9880d681SAndroid Build Coastguard Worker   // Handle anything that needs to be done on a per-unit basis after
542*9880d681SAndroid Build Coastguard Worker   // all other generation.
543*9880d681SAndroid Build Coastguard Worker   for (const auto &P : CUMap) {
544*9880d681SAndroid Build Coastguard Worker     auto &TheCU = *P.second;
545*9880d681SAndroid Build Coastguard Worker     // Emit DW_AT_containing_type attribute to connect types with their
546*9880d681SAndroid Build Coastguard Worker     // vtable holding type.
547*9880d681SAndroid Build Coastguard Worker     TheCU.constructContainingTypeDIEs();
548*9880d681SAndroid Build Coastguard Worker 
549*9880d681SAndroid Build Coastguard Worker     // Add CU specific attributes if we need to add any.
550*9880d681SAndroid Build Coastguard Worker     // If we're splitting the dwarf out now that we've got the entire
551*9880d681SAndroid Build Coastguard Worker     // CU then add the dwo id to it.
552*9880d681SAndroid Build Coastguard Worker     auto *SkCU = TheCU.getSkeleton();
553*9880d681SAndroid Build Coastguard Worker     if (useSplitDwarf()) {
554*9880d681SAndroid Build Coastguard Worker       // Emit a unique identifier for this CU.
555*9880d681SAndroid Build Coastguard Worker       uint64_t ID = DIEHash(Asm).computeCUSignature(TheCU.getUnitDie());
556*9880d681SAndroid Build Coastguard Worker       TheCU.addUInt(TheCU.getUnitDie(), dwarf::DW_AT_GNU_dwo_id,
557*9880d681SAndroid Build Coastguard Worker                     dwarf::DW_FORM_data8, ID);
558*9880d681SAndroid Build Coastguard Worker       SkCU->addUInt(SkCU->getUnitDie(), dwarf::DW_AT_GNU_dwo_id,
559*9880d681SAndroid Build Coastguard Worker                     dwarf::DW_FORM_data8, ID);
560*9880d681SAndroid Build Coastguard Worker 
561*9880d681SAndroid Build Coastguard Worker       // We don't keep track of which addresses are used in which CU so this
562*9880d681SAndroid Build Coastguard Worker       // is a bit pessimistic under LTO.
563*9880d681SAndroid Build Coastguard Worker       if (!AddrPool.isEmpty()) {
564*9880d681SAndroid Build Coastguard Worker         const MCSymbol *Sym = TLOF.getDwarfAddrSection()->getBeginSymbol();
565*9880d681SAndroid Build Coastguard Worker         SkCU->addSectionLabel(SkCU->getUnitDie(), dwarf::DW_AT_GNU_addr_base,
566*9880d681SAndroid Build Coastguard Worker                               Sym, Sym);
567*9880d681SAndroid Build Coastguard Worker       }
568*9880d681SAndroid Build Coastguard Worker       if (!SkCU->getRangeLists().empty()) {
569*9880d681SAndroid Build Coastguard Worker         const MCSymbol *Sym = TLOF.getDwarfRangesSection()->getBeginSymbol();
570*9880d681SAndroid Build Coastguard Worker         SkCU->addSectionLabel(SkCU->getUnitDie(), dwarf::DW_AT_GNU_ranges_base,
571*9880d681SAndroid Build Coastguard Worker                               Sym, Sym);
572*9880d681SAndroid Build Coastguard Worker       }
573*9880d681SAndroid Build Coastguard Worker     }
574*9880d681SAndroid Build Coastguard Worker 
575*9880d681SAndroid Build Coastguard Worker     // If we have code split among multiple sections or non-contiguous
576*9880d681SAndroid Build Coastguard Worker     // ranges of code then emit a DW_AT_ranges attribute on the unit that will
577*9880d681SAndroid Build Coastguard Worker     // remain in the .o file, otherwise add a DW_AT_low_pc.
578*9880d681SAndroid Build Coastguard Worker     // FIXME: We should use ranges allow reordering of code ala
579*9880d681SAndroid Build Coastguard Worker     // .subsections_via_symbols in mach-o. This would mean turning on
580*9880d681SAndroid Build Coastguard Worker     // ranges for all subprogram DIEs for mach-o.
581*9880d681SAndroid Build Coastguard Worker     DwarfCompileUnit &U = SkCU ? *SkCU : TheCU;
582*9880d681SAndroid Build Coastguard Worker     if (unsigned NumRanges = TheCU.getRanges().size()) {
583*9880d681SAndroid Build Coastguard Worker       if (NumRanges > 1)
584*9880d681SAndroid Build Coastguard Worker         // A DW_AT_low_pc attribute may also be specified in combination with
585*9880d681SAndroid Build Coastguard Worker         // DW_AT_ranges to specify the default base address for use in
586*9880d681SAndroid Build Coastguard Worker         // location lists (see Section 2.6.2) and range lists (see Section
587*9880d681SAndroid Build Coastguard Worker         // 2.17.3).
588*9880d681SAndroid Build Coastguard Worker         U.addUInt(U.getUnitDie(), dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, 0);
589*9880d681SAndroid Build Coastguard Worker       else
590*9880d681SAndroid Build Coastguard Worker         U.setBaseAddress(TheCU.getRanges().front().getStart());
591*9880d681SAndroid Build Coastguard Worker       U.attachRangesOrLowHighPC(U.getUnitDie(), TheCU.takeRanges());
592*9880d681SAndroid Build Coastguard Worker     }
593*9880d681SAndroid Build Coastguard Worker 
594*9880d681SAndroid Build Coastguard Worker     auto *CUNode = cast<DICompileUnit>(P.first);
595*9880d681SAndroid Build Coastguard Worker     // If compile Unit has macros, emit "DW_AT_macro_info" attribute.
596*9880d681SAndroid Build Coastguard Worker     if (CUNode->getMacros())
597*9880d681SAndroid Build Coastguard Worker       U.addSectionLabel(U.getUnitDie(), dwarf::DW_AT_macro_info,
598*9880d681SAndroid Build Coastguard Worker                         U.getMacroLabelBegin(),
599*9880d681SAndroid Build Coastguard Worker                         TLOF.getDwarfMacinfoSection()->getBeginSymbol());
600*9880d681SAndroid Build Coastguard Worker   }
601*9880d681SAndroid Build Coastguard Worker 
602*9880d681SAndroid Build Coastguard Worker   // Compute DIE offsets and sizes.
603*9880d681SAndroid Build Coastguard Worker   InfoHolder.computeSizeAndOffsets();
604*9880d681SAndroid Build Coastguard Worker   if (useSplitDwarf())
605*9880d681SAndroid Build Coastguard Worker     SkeletonHolder.computeSizeAndOffsets();
606*9880d681SAndroid Build Coastguard Worker }
607*9880d681SAndroid Build Coastguard Worker 
608*9880d681SAndroid Build Coastguard Worker // Emit all Dwarf sections that should come after the content.
endModule()609*9880d681SAndroid Build Coastguard Worker void DwarfDebug::endModule() {
610*9880d681SAndroid Build Coastguard Worker   assert(CurFn == nullptr);
611*9880d681SAndroid Build Coastguard Worker   assert(CurMI == nullptr);
612*9880d681SAndroid Build Coastguard Worker 
613*9880d681SAndroid Build Coastguard Worker   // If we aren't actually generating debug info (check beginModule -
614*9880d681SAndroid Build Coastguard Worker   // conditionalized on !DisableDebugInfoPrinting and the presence of the
615*9880d681SAndroid Build Coastguard Worker   // llvm.dbg.cu metadata node)
616*9880d681SAndroid Build Coastguard Worker   if (!MMI->hasDebugInfo())
617*9880d681SAndroid Build Coastguard Worker     return;
618*9880d681SAndroid Build Coastguard Worker 
619*9880d681SAndroid Build Coastguard Worker   // Finalize the debug info for the module.
620*9880d681SAndroid Build Coastguard Worker   finalizeModuleInfo();
621*9880d681SAndroid Build Coastguard Worker 
622*9880d681SAndroid Build Coastguard Worker   emitDebugStr();
623*9880d681SAndroid Build Coastguard Worker 
624*9880d681SAndroid Build Coastguard Worker   if (useSplitDwarf())
625*9880d681SAndroid Build Coastguard Worker     emitDebugLocDWO();
626*9880d681SAndroid Build Coastguard Worker   else
627*9880d681SAndroid Build Coastguard Worker     // Emit info into a debug loc section.
628*9880d681SAndroid Build Coastguard Worker     emitDebugLoc();
629*9880d681SAndroid Build Coastguard Worker 
630*9880d681SAndroid Build Coastguard Worker   // Corresponding abbreviations into a abbrev section.
631*9880d681SAndroid Build Coastguard Worker   emitAbbreviations();
632*9880d681SAndroid Build Coastguard Worker 
633*9880d681SAndroid Build Coastguard Worker   // Emit all the DIEs into a debug info section.
634*9880d681SAndroid Build Coastguard Worker   emitDebugInfo();
635*9880d681SAndroid Build Coastguard Worker 
636*9880d681SAndroid Build Coastguard Worker   // Emit info into a debug aranges section.
637*9880d681SAndroid Build Coastguard Worker   if (GenerateARangeSection)
638*9880d681SAndroid Build Coastguard Worker     emitDebugARanges();
639*9880d681SAndroid Build Coastguard Worker 
640*9880d681SAndroid Build Coastguard Worker   // Emit info into a debug ranges section.
641*9880d681SAndroid Build Coastguard Worker   emitDebugRanges();
642*9880d681SAndroid Build Coastguard Worker 
643*9880d681SAndroid Build Coastguard Worker   // Emit info into a debug macinfo section.
644*9880d681SAndroid Build Coastguard Worker   emitDebugMacinfo();
645*9880d681SAndroid Build Coastguard Worker 
646*9880d681SAndroid Build Coastguard Worker   if (useSplitDwarf()) {
647*9880d681SAndroid Build Coastguard Worker     emitDebugStrDWO();
648*9880d681SAndroid Build Coastguard Worker     emitDebugInfoDWO();
649*9880d681SAndroid Build Coastguard Worker     emitDebugAbbrevDWO();
650*9880d681SAndroid Build Coastguard Worker     emitDebugLineDWO();
651*9880d681SAndroid Build Coastguard Worker     // Emit DWO addresses.
652*9880d681SAndroid Build Coastguard Worker     AddrPool.emit(*Asm, Asm->getObjFileLowering().getDwarfAddrSection());
653*9880d681SAndroid Build Coastguard Worker   }
654*9880d681SAndroid Build Coastguard Worker 
655*9880d681SAndroid Build Coastguard Worker   // Emit info into the dwarf accelerator table sections.
656*9880d681SAndroid Build Coastguard Worker   if (useDwarfAccelTables()) {
657*9880d681SAndroid Build Coastguard Worker     emitAccelNames();
658*9880d681SAndroid Build Coastguard Worker     emitAccelObjC();
659*9880d681SAndroid Build Coastguard Worker     emitAccelNamespaces();
660*9880d681SAndroid Build Coastguard Worker     emitAccelTypes();
661*9880d681SAndroid Build Coastguard Worker   }
662*9880d681SAndroid Build Coastguard Worker 
663*9880d681SAndroid Build Coastguard Worker   // Emit the pubnames and pubtypes sections if requested.
664*9880d681SAndroid Build Coastguard Worker   if (HasDwarfPubSections) {
665*9880d681SAndroid Build Coastguard Worker     emitDebugPubNames(GenerateGnuPubSections);
666*9880d681SAndroid Build Coastguard Worker     emitDebugPubTypes(GenerateGnuPubSections);
667*9880d681SAndroid Build Coastguard Worker   }
668*9880d681SAndroid Build Coastguard Worker 
669*9880d681SAndroid Build Coastguard Worker   // clean up.
670*9880d681SAndroid Build Coastguard Worker   AbstractVariables.clear();
671*9880d681SAndroid Build Coastguard Worker }
672*9880d681SAndroid Build Coastguard Worker 
673*9880d681SAndroid Build Coastguard Worker // Find abstract variable, if any, associated with Var.
674*9880d681SAndroid Build Coastguard Worker DbgVariable *
getExistingAbstractVariable(InlinedVariable IV,const DILocalVariable * & Cleansed)675*9880d681SAndroid Build Coastguard Worker DwarfDebug::getExistingAbstractVariable(InlinedVariable IV,
676*9880d681SAndroid Build Coastguard Worker                                         const DILocalVariable *&Cleansed) {
677*9880d681SAndroid Build Coastguard Worker   // More then one inlined variable corresponds to one abstract variable.
678*9880d681SAndroid Build Coastguard Worker   Cleansed = IV.first;
679*9880d681SAndroid Build Coastguard Worker   auto I = AbstractVariables.find(Cleansed);
680*9880d681SAndroid Build Coastguard Worker   if (I != AbstractVariables.end())
681*9880d681SAndroid Build Coastguard Worker     return I->second.get();
682*9880d681SAndroid Build Coastguard Worker   return nullptr;
683*9880d681SAndroid Build Coastguard Worker }
684*9880d681SAndroid Build Coastguard Worker 
getExistingAbstractVariable(InlinedVariable IV)685*9880d681SAndroid Build Coastguard Worker DbgVariable *DwarfDebug::getExistingAbstractVariable(InlinedVariable IV) {
686*9880d681SAndroid Build Coastguard Worker   const DILocalVariable *Cleansed;
687*9880d681SAndroid Build Coastguard Worker   return getExistingAbstractVariable(IV, Cleansed);
688*9880d681SAndroid Build Coastguard Worker }
689*9880d681SAndroid Build Coastguard Worker 
createAbstractVariable(const DILocalVariable * Var,LexicalScope * Scope)690*9880d681SAndroid Build Coastguard Worker void DwarfDebug::createAbstractVariable(const DILocalVariable *Var,
691*9880d681SAndroid Build Coastguard Worker                                         LexicalScope *Scope) {
692*9880d681SAndroid Build Coastguard Worker   auto AbsDbgVariable = make_unique<DbgVariable>(Var, /* IA */ nullptr);
693*9880d681SAndroid Build Coastguard Worker   InfoHolder.addScopeVariable(Scope, AbsDbgVariable.get());
694*9880d681SAndroid Build Coastguard Worker   AbstractVariables[Var] = std::move(AbsDbgVariable);
695*9880d681SAndroid Build Coastguard Worker }
696*9880d681SAndroid Build Coastguard Worker 
ensureAbstractVariableIsCreated(InlinedVariable IV,const MDNode * ScopeNode)697*9880d681SAndroid Build Coastguard Worker void DwarfDebug::ensureAbstractVariableIsCreated(InlinedVariable IV,
698*9880d681SAndroid Build Coastguard Worker                                                  const MDNode *ScopeNode) {
699*9880d681SAndroid Build Coastguard Worker   const DILocalVariable *Cleansed = nullptr;
700*9880d681SAndroid Build Coastguard Worker   if (getExistingAbstractVariable(IV, Cleansed))
701*9880d681SAndroid Build Coastguard Worker     return;
702*9880d681SAndroid Build Coastguard Worker 
703*9880d681SAndroid Build Coastguard Worker   createAbstractVariable(Cleansed, LScopes.getOrCreateAbstractScope(
704*9880d681SAndroid Build Coastguard Worker                                        cast<DILocalScope>(ScopeNode)));
705*9880d681SAndroid Build Coastguard Worker }
706*9880d681SAndroid Build Coastguard Worker 
ensureAbstractVariableIsCreatedIfScoped(InlinedVariable IV,const MDNode * ScopeNode)707*9880d681SAndroid Build Coastguard Worker void DwarfDebug::ensureAbstractVariableIsCreatedIfScoped(
708*9880d681SAndroid Build Coastguard Worker     InlinedVariable IV, const MDNode *ScopeNode) {
709*9880d681SAndroid Build Coastguard Worker   const DILocalVariable *Cleansed = nullptr;
710*9880d681SAndroid Build Coastguard Worker   if (getExistingAbstractVariable(IV, Cleansed))
711*9880d681SAndroid Build Coastguard Worker     return;
712*9880d681SAndroid Build Coastguard Worker 
713*9880d681SAndroid Build Coastguard Worker   if (LexicalScope *Scope =
714*9880d681SAndroid Build Coastguard Worker           LScopes.findAbstractScope(cast_or_null<DILocalScope>(ScopeNode)))
715*9880d681SAndroid Build Coastguard Worker     createAbstractVariable(Cleansed, Scope);
716*9880d681SAndroid Build Coastguard Worker }
717*9880d681SAndroid Build Coastguard Worker 
718*9880d681SAndroid Build Coastguard Worker // Collect variable information from side table maintained by MMI.
collectVariableInfoFromMMITable(DenseSet<InlinedVariable> & Processed)719*9880d681SAndroid Build Coastguard Worker void DwarfDebug::collectVariableInfoFromMMITable(
720*9880d681SAndroid Build Coastguard Worker     DenseSet<InlinedVariable> &Processed) {
721*9880d681SAndroid Build Coastguard Worker   for (const auto &VI : MMI->getVariableDbgInfo()) {
722*9880d681SAndroid Build Coastguard Worker     if (!VI.Var)
723*9880d681SAndroid Build Coastguard Worker       continue;
724*9880d681SAndroid Build Coastguard Worker     assert(VI.Var->isValidLocationForIntrinsic(VI.Loc) &&
725*9880d681SAndroid Build Coastguard Worker            "Expected inlined-at fields to agree");
726*9880d681SAndroid Build Coastguard Worker 
727*9880d681SAndroid Build Coastguard Worker     InlinedVariable Var(VI.Var, VI.Loc->getInlinedAt());
728*9880d681SAndroid Build Coastguard Worker     Processed.insert(Var);
729*9880d681SAndroid Build Coastguard Worker     LexicalScope *Scope = LScopes.findLexicalScope(VI.Loc);
730*9880d681SAndroid Build Coastguard Worker 
731*9880d681SAndroid Build Coastguard Worker     // If variable scope is not found then skip this variable.
732*9880d681SAndroid Build Coastguard Worker     if (!Scope)
733*9880d681SAndroid Build Coastguard Worker       continue;
734*9880d681SAndroid Build Coastguard Worker 
735*9880d681SAndroid Build Coastguard Worker     ensureAbstractVariableIsCreatedIfScoped(Var, Scope->getScopeNode());
736*9880d681SAndroid Build Coastguard Worker     auto RegVar = make_unique<DbgVariable>(Var.first, Var.second);
737*9880d681SAndroid Build Coastguard Worker     RegVar->initializeMMI(VI.Expr, VI.Slot);
738*9880d681SAndroid Build Coastguard Worker     if (InfoHolder.addScopeVariable(Scope, RegVar.get()))
739*9880d681SAndroid Build Coastguard Worker       ConcreteVariables.push_back(std::move(RegVar));
740*9880d681SAndroid Build Coastguard Worker   }
741*9880d681SAndroid Build Coastguard Worker }
742*9880d681SAndroid Build Coastguard Worker 
743*9880d681SAndroid Build Coastguard Worker // Get .debug_loc entry for the instruction range starting at MI.
getDebugLocValue(const MachineInstr * MI)744*9880d681SAndroid Build Coastguard Worker static DebugLocEntry::Value getDebugLocValue(const MachineInstr *MI) {
745*9880d681SAndroid Build Coastguard Worker   const DIExpression *Expr = MI->getDebugExpression();
746*9880d681SAndroid Build Coastguard Worker 
747*9880d681SAndroid Build Coastguard Worker   assert(MI->getNumOperands() == 4);
748*9880d681SAndroid Build Coastguard Worker   if (MI->getOperand(0).isReg()) {
749*9880d681SAndroid Build Coastguard Worker     MachineLocation MLoc;
750*9880d681SAndroid Build Coastguard Worker     // If the second operand is an immediate, this is a
751*9880d681SAndroid Build Coastguard Worker     // register-indirect address.
752*9880d681SAndroid Build Coastguard Worker     if (!MI->getOperand(1).isImm())
753*9880d681SAndroid Build Coastguard Worker       MLoc.set(MI->getOperand(0).getReg());
754*9880d681SAndroid Build Coastguard Worker     else
755*9880d681SAndroid Build Coastguard Worker       MLoc.set(MI->getOperand(0).getReg(), MI->getOperand(1).getImm());
756*9880d681SAndroid Build Coastguard Worker     return DebugLocEntry::Value(Expr, MLoc);
757*9880d681SAndroid Build Coastguard Worker   }
758*9880d681SAndroid Build Coastguard Worker   if (MI->getOperand(0).isImm())
759*9880d681SAndroid Build Coastguard Worker     return DebugLocEntry::Value(Expr, MI->getOperand(0).getImm());
760*9880d681SAndroid Build Coastguard Worker   if (MI->getOperand(0).isFPImm())
761*9880d681SAndroid Build Coastguard Worker     return DebugLocEntry::Value(Expr, MI->getOperand(0).getFPImm());
762*9880d681SAndroid Build Coastguard Worker   if (MI->getOperand(0).isCImm())
763*9880d681SAndroid Build Coastguard Worker     return DebugLocEntry::Value(Expr, MI->getOperand(0).getCImm());
764*9880d681SAndroid Build Coastguard Worker 
765*9880d681SAndroid Build Coastguard Worker   llvm_unreachable("Unexpected 4-operand DBG_VALUE instruction!");
766*9880d681SAndroid Build Coastguard Worker }
767*9880d681SAndroid Build Coastguard Worker 
768*9880d681SAndroid Build Coastguard Worker /// \brief If this and Next are describing different pieces of the same
769*9880d681SAndroid Build Coastguard Worker /// variable, merge them by appending Next's values to the current
770*9880d681SAndroid Build Coastguard Worker /// list of values.
771*9880d681SAndroid Build Coastguard Worker /// Return true if the merge was successful.
MergeValues(const DebugLocEntry & Next)772*9880d681SAndroid Build Coastguard Worker bool DebugLocEntry::MergeValues(const DebugLocEntry &Next) {
773*9880d681SAndroid Build Coastguard Worker   if (Begin == Next.Begin) {
774*9880d681SAndroid Build Coastguard Worker     auto *FirstExpr = cast<DIExpression>(Values[0].Expression);
775*9880d681SAndroid Build Coastguard Worker     auto *FirstNextExpr = cast<DIExpression>(Next.Values[0].Expression);
776*9880d681SAndroid Build Coastguard Worker     if (!FirstExpr->isBitPiece() || !FirstNextExpr->isBitPiece())
777*9880d681SAndroid Build Coastguard Worker       return false;
778*9880d681SAndroid Build Coastguard Worker 
779*9880d681SAndroid Build Coastguard Worker     // We can only merge entries if none of the pieces overlap any others.
780*9880d681SAndroid Build Coastguard Worker     // In doing so, we can take advantage of the fact that both lists are
781*9880d681SAndroid Build Coastguard Worker     // sorted.
782*9880d681SAndroid Build Coastguard Worker     for (unsigned i = 0, j = 0; i < Values.size(); ++i) {
783*9880d681SAndroid Build Coastguard Worker       for (; j < Next.Values.size(); ++j) {
784*9880d681SAndroid Build Coastguard Worker         int res = DebugHandlerBase::pieceCmp(
785*9880d681SAndroid Build Coastguard Worker             cast<DIExpression>(Values[i].Expression),
786*9880d681SAndroid Build Coastguard Worker             cast<DIExpression>(Next.Values[j].Expression));
787*9880d681SAndroid Build Coastguard Worker         if (res == 0) // The two expressions overlap, we can't merge.
788*9880d681SAndroid Build Coastguard Worker           return false;
789*9880d681SAndroid Build Coastguard Worker         // Values[i] is entirely before Next.Values[j],
790*9880d681SAndroid Build Coastguard Worker         // so go back to the next entry of Values.
791*9880d681SAndroid Build Coastguard Worker         else if (res == -1)
792*9880d681SAndroid Build Coastguard Worker           break;
793*9880d681SAndroid Build Coastguard Worker         // Next.Values[j] is entirely before Values[i], so go on to the
794*9880d681SAndroid Build Coastguard Worker         // next entry of Next.Values.
795*9880d681SAndroid Build Coastguard Worker       }
796*9880d681SAndroid Build Coastguard Worker     }
797*9880d681SAndroid Build Coastguard Worker 
798*9880d681SAndroid Build Coastguard Worker     addValues(Next.Values);
799*9880d681SAndroid Build Coastguard Worker     End = Next.End;
800*9880d681SAndroid Build Coastguard Worker     return true;
801*9880d681SAndroid Build Coastguard Worker   }
802*9880d681SAndroid Build Coastguard Worker   return false;
803*9880d681SAndroid Build Coastguard Worker }
804*9880d681SAndroid Build Coastguard Worker 
805*9880d681SAndroid Build Coastguard Worker /// Build the location list for all DBG_VALUEs in the function that
806*9880d681SAndroid Build Coastguard Worker /// describe the same variable.  If the ranges of several independent
807*9880d681SAndroid Build Coastguard Worker /// pieces of the same variable overlap partially, split them up and
808*9880d681SAndroid Build Coastguard Worker /// combine the ranges. The resulting DebugLocEntries are will have
809*9880d681SAndroid Build Coastguard Worker /// strict monotonically increasing begin addresses and will never
810*9880d681SAndroid Build Coastguard Worker /// overlap.
811*9880d681SAndroid Build Coastguard Worker //
812*9880d681SAndroid Build Coastguard Worker // Input:
813*9880d681SAndroid Build Coastguard Worker //
814*9880d681SAndroid Build Coastguard Worker //   Ranges History [var, loc, piece ofs size]
815*9880d681SAndroid Build Coastguard Worker // 0 |      [x, (reg0, piece 0, 32)]
816*9880d681SAndroid Build Coastguard Worker // 1 | |    [x, (reg1, piece 32, 32)] <- IsPieceOfPrevEntry
817*9880d681SAndroid Build Coastguard Worker // 2 | |    ...
818*9880d681SAndroid Build Coastguard Worker // 3   |    [clobber reg0]
819*9880d681SAndroid Build Coastguard Worker // 4        [x, (mem, piece 0, 64)] <- overlapping with both previous pieces of
820*9880d681SAndroid Build Coastguard Worker //                                     x.
821*9880d681SAndroid Build Coastguard Worker //
822*9880d681SAndroid Build Coastguard Worker // Output:
823*9880d681SAndroid Build Coastguard Worker //
824*9880d681SAndroid Build Coastguard Worker // [0-1]    [x, (reg0, piece  0, 32)]
825*9880d681SAndroid Build Coastguard Worker // [1-3]    [x, (reg0, piece  0, 32), (reg1, piece 32, 32)]
826*9880d681SAndroid Build Coastguard Worker // [3-4]    [x, (reg1, piece 32, 32)]
827*9880d681SAndroid Build Coastguard Worker // [4- ]    [x, (mem,  piece  0, 64)]
828*9880d681SAndroid Build Coastguard Worker void
buildLocationList(SmallVectorImpl<DebugLocEntry> & DebugLoc,const DbgValueHistoryMap::InstrRanges & Ranges)829*9880d681SAndroid Build Coastguard Worker DwarfDebug::buildLocationList(SmallVectorImpl<DebugLocEntry> &DebugLoc,
830*9880d681SAndroid Build Coastguard Worker                               const DbgValueHistoryMap::InstrRanges &Ranges) {
831*9880d681SAndroid Build Coastguard Worker   SmallVector<DebugLocEntry::Value, 4> OpenRanges;
832*9880d681SAndroid Build Coastguard Worker 
833*9880d681SAndroid Build Coastguard Worker   for (auto I = Ranges.begin(), E = Ranges.end(); I != E; ++I) {
834*9880d681SAndroid Build Coastguard Worker     const MachineInstr *Begin = I->first;
835*9880d681SAndroid Build Coastguard Worker     const MachineInstr *End = I->second;
836*9880d681SAndroid Build Coastguard Worker     assert(Begin->isDebugValue() && "Invalid History entry");
837*9880d681SAndroid Build Coastguard Worker 
838*9880d681SAndroid Build Coastguard Worker     // Check if a variable is inaccessible in this range.
839*9880d681SAndroid Build Coastguard Worker     if (Begin->getNumOperands() > 1 &&
840*9880d681SAndroid Build Coastguard Worker         Begin->getOperand(0).isReg() && !Begin->getOperand(0).getReg()) {
841*9880d681SAndroid Build Coastguard Worker       OpenRanges.clear();
842*9880d681SAndroid Build Coastguard Worker       continue;
843*9880d681SAndroid Build Coastguard Worker     }
844*9880d681SAndroid Build Coastguard Worker 
845*9880d681SAndroid Build Coastguard Worker     // If this piece overlaps with any open ranges, truncate them.
846*9880d681SAndroid Build Coastguard Worker     const DIExpression *DIExpr = Begin->getDebugExpression();
847*9880d681SAndroid Build Coastguard Worker     auto Last = std::remove_if(OpenRanges.begin(), OpenRanges.end(),
848*9880d681SAndroid Build Coastguard Worker                                [&](DebugLocEntry::Value R) {
849*9880d681SAndroid Build Coastguard Worker       return piecesOverlap(DIExpr, R.getExpression());
850*9880d681SAndroid Build Coastguard Worker     });
851*9880d681SAndroid Build Coastguard Worker     OpenRanges.erase(Last, OpenRanges.end());
852*9880d681SAndroid Build Coastguard Worker 
853*9880d681SAndroid Build Coastguard Worker     const MCSymbol *StartLabel = getLabelBeforeInsn(Begin);
854*9880d681SAndroid Build Coastguard Worker     assert(StartLabel && "Forgot label before DBG_VALUE starting a range!");
855*9880d681SAndroid Build Coastguard Worker 
856*9880d681SAndroid Build Coastguard Worker     const MCSymbol *EndLabel;
857*9880d681SAndroid Build Coastguard Worker     if (End != nullptr)
858*9880d681SAndroid Build Coastguard Worker       EndLabel = getLabelAfterInsn(End);
859*9880d681SAndroid Build Coastguard Worker     else if (std::next(I) == Ranges.end())
860*9880d681SAndroid Build Coastguard Worker       EndLabel = Asm->getFunctionEnd();
861*9880d681SAndroid Build Coastguard Worker     else
862*9880d681SAndroid Build Coastguard Worker       EndLabel = getLabelBeforeInsn(std::next(I)->first);
863*9880d681SAndroid Build Coastguard Worker     assert(EndLabel && "Forgot label after instruction ending a range!");
864*9880d681SAndroid Build Coastguard Worker 
865*9880d681SAndroid Build Coastguard Worker     DEBUG(dbgs() << "DotDebugLoc: " << *Begin << "\n");
866*9880d681SAndroid Build Coastguard Worker 
867*9880d681SAndroid Build Coastguard Worker     auto Value = getDebugLocValue(Begin);
868*9880d681SAndroid Build Coastguard Worker     DebugLocEntry Loc(StartLabel, EndLabel, Value);
869*9880d681SAndroid Build Coastguard Worker     bool couldMerge = false;
870*9880d681SAndroid Build Coastguard Worker 
871*9880d681SAndroid Build Coastguard Worker     // If this is a piece, it may belong to the current DebugLocEntry.
872*9880d681SAndroid Build Coastguard Worker     if (DIExpr->isBitPiece()) {
873*9880d681SAndroid Build Coastguard Worker       // Add this value to the list of open ranges.
874*9880d681SAndroid Build Coastguard Worker       OpenRanges.push_back(Value);
875*9880d681SAndroid Build Coastguard Worker 
876*9880d681SAndroid Build Coastguard Worker       // Attempt to add the piece to the last entry.
877*9880d681SAndroid Build Coastguard Worker       if (!DebugLoc.empty())
878*9880d681SAndroid Build Coastguard Worker         if (DebugLoc.back().MergeValues(Loc))
879*9880d681SAndroid Build Coastguard Worker           couldMerge = true;
880*9880d681SAndroid Build Coastguard Worker     }
881*9880d681SAndroid Build Coastguard Worker 
882*9880d681SAndroid Build Coastguard Worker     if (!couldMerge) {
883*9880d681SAndroid Build Coastguard Worker       // Need to add a new DebugLocEntry. Add all values from still
884*9880d681SAndroid Build Coastguard Worker       // valid non-overlapping pieces.
885*9880d681SAndroid Build Coastguard Worker       if (OpenRanges.size())
886*9880d681SAndroid Build Coastguard Worker         Loc.addValues(OpenRanges);
887*9880d681SAndroid Build Coastguard Worker 
888*9880d681SAndroid Build Coastguard Worker       DebugLoc.push_back(std::move(Loc));
889*9880d681SAndroid Build Coastguard Worker     }
890*9880d681SAndroid Build Coastguard Worker 
891*9880d681SAndroid Build Coastguard Worker     // Attempt to coalesce the ranges of two otherwise identical
892*9880d681SAndroid Build Coastguard Worker     // DebugLocEntries.
893*9880d681SAndroid Build Coastguard Worker     auto CurEntry = DebugLoc.rbegin();
894*9880d681SAndroid Build Coastguard Worker     DEBUG({
895*9880d681SAndroid Build Coastguard Worker       dbgs() << CurEntry->getValues().size() << " Values:\n";
896*9880d681SAndroid Build Coastguard Worker       for (auto &Value : CurEntry->getValues())
897*9880d681SAndroid Build Coastguard Worker         Value.dump();
898*9880d681SAndroid Build Coastguard Worker       dbgs() << "-----\n";
899*9880d681SAndroid Build Coastguard Worker     });
900*9880d681SAndroid Build Coastguard Worker 
901*9880d681SAndroid Build Coastguard Worker     auto PrevEntry = std::next(CurEntry);
902*9880d681SAndroid Build Coastguard Worker     if (PrevEntry != DebugLoc.rend() && PrevEntry->MergeRanges(*CurEntry))
903*9880d681SAndroid Build Coastguard Worker       DebugLoc.pop_back();
904*9880d681SAndroid Build Coastguard Worker   }
905*9880d681SAndroid Build Coastguard Worker }
906*9880d681SAndroid Build Coastguard Worker 
createConcreteVariable(LexicalScope & Scope,InlinedVariable IV)907*9880d681SAndroid Build Coastguard Worker DbgVariable *DwarfDebug::createConcreteVariable(LexicalScope &Scope,
908*9880d681SAndroid Build Coastguard Worker                                                 InlinedVariable IV) {
909*9880d681SAndroid Build Coastguard Worker   ensureAbstractVariableIsCreatedIfScoped(IV, Scope.getScopeNode());
910*9880d681SAndroid Build Coastguard Worker   ConcreteVariables.push_back(make_unique<DbgVariable>(IV.first, IV.second));
911*9880d681SAndroid Build Coastguard Worker   InfoHolder.addScopeVariable(&Scope, ConcreteVariables.back().get());
912*9880d681SAndroid Build Coastguard Worker   return ConcreteVariables.back().get();
913*9880d681SAndroid Build Coastguard Worker }
914*9880d681SAndroid Build Coastguard Worker 
915*9880d681SAndroid Build Coastguard Worker // Determine whether this DBG_VALUE is valid at the beginning of the function.
validAtEntry(const MachineInstr * MInsn)916*9880d681SAndroid Build Coastguard Worker static bool validAtEntry(const MachineInstr *MInsn) {
917*9880d681SAndroid Build Coastguard Worker   auto MBB = MInsn->getParent();
918*9880d681SAndroid Build Coastguard Worker   // Is it in the entry basic block?
919*9880d681SAndroid Build Coastguard Worker   if (!MBB->pred_empty())
920*9880d681SAndroid Build Coastguard Worker     return false;
921*9880d681SAndroid Build Coastguard Worker   for (MachineBasicBlock::const_reverse_iterator I(MInsn); I != MBB->rend(); ++I)
922*9880d681SAndroid Build Coastguard Worker     if (!(I->isDebugValue() || I->getFlag(MachineInstr::FrameSetup)))
923*9880d681SAndroid Build Coastguard Worker       return false;
924*9880d681SAndroid Build Coastguard Worker   return true;
925*9880d681SAndroid Build Coastguard Worker }
926*9880d681SAndroid Build Coastguard Worker 
927*9880d681SAndroid Build Coastguard Worker // Find variables for each lexical scope.
collectVariableInfo(DwarfCompileUnit & TheCU,const DISubprogram * SP,DenseSet<InlinedVariable> & Processed)928*9880d681SAndroid Build Coastguard Worker void DwarfDebug::collectVariableInfo(DwarfCompileUnit &TheCU,
929*9880d681SAndroid Build Coastguard Worker                                      const DISubprogram *SP,
930*9880d681SAndroid Build Coastguard Worker                                      DenseSet<InlinedVariable> &Processed) {
931*9880d681SAndroid Build Coastguard Worker   // Grab the variable info that was squirreled away in the MMI side-table.
932*9880d681SAndroid Build Coastguard Worker   collectVariableInfoFromMMITable(Processed);
933*9880d681SAndroid Build Coastguard Worker 
934*9880d681SAndroid Build Coastguard Worker   for (const auto &I : DbgValues) {
935*9880d681SAndroid Build Coastguard Worker     InlinedVariable IV = I.first;
936*9880d681SAndroid Build Coastguard Worker     if (Processed.count(IV))
937*9880d681SAndroid Build Coastguard Worker       continue;
938*9880d681SAndroid Build Coastguard Worker 
939*9880d681SAndroid Build Coastguard Worker     // Instruction ranges, specifying where IV is accessible.
940*9880d681SAndroid Build Coastguard Worker     const auto &Ranges = I.second;
941*9880d681SAndroid Build Coastguard Worker     if (Ranges.empty())
942*9880d681SAndroid Build Coastguard Worker       continue;
943*9880d681SAndroid Build Coastguard Worker 
944*9880d681SAndroid Build Coastguard Worker     LexicalScope *Scope = nullptr;
945*9880d681SAndroid Build Coastguard Worker     if (const DILocation *IA = IV.second)
946*9880d681SAndroid Build Coastguard Worker       Scope = LScopes.findInlinedScope(IV.first->getScope(), IA);
947*9880d681SAndroid Build Coastguard Worker     else
948*9880d681SAndroid Build Coastguard Worker       Scope = LScopes.findLexicalScope(IV.first->getScope());
949*9880d681SAndroid Build Coastguard Worker     // If variable scope is not found then skip this variable.
950*9880d681SAndroid Build Coastguard Worker     if (!Scope)
951*9880d681SAndroid Build Coastguard Worker       continue;
952*9880d681SAndroid Build Coastguard Worker 
953*9880d681SAndroid Build Coastguard Worker     Processed.insert(IV);
954*9880d681SAndroid Build Coastguard Worker     DbgVariable *RegVar = createConcreteVariable(*Scope, IV);
955*9880d681SAndroid Build Coastguard Worker 
956*9880d681SAndroid Build Coastguard Worker     const MachineInstr *MInsn = Ranges.front().first;
957*9880d681SAndroid Build Coastguard Worker     assert(MInsn->isDebugValue() && "History must begin with debug value");
958*9880d681SAndroid Build Coastguard Worker 
959*9880d681SAndroid Build Coastguard Worker     // Check if there is a single DBG_VALUE, valid throughout the function.
960*9880d681SAndroid Build Coastguard Worker     // A single constant is also considered valid for the entire function.
961*9880d681SAndroid Build Coastguard Worker     if (Ranges.size() == 1 &&
962*9880d681SAndroid Build Coastguard Worker         (MInsn->getOperand(0).isImm() ||
963*9880d681SAndroid Build Coastguard Worker          (validAtEntry(MInsn) && Ranges.front().second == nullptr))) {
964*9880d681SAndroid Build Coastguard Worker       RegVar->initializeDbgValue(MInsn);
965*9880d681SAndroid Build Coastguard Worker       continue;
966*9880d681SAndroid Build Coastguard Worker     }
967*9880d681SAndroid Build Coastguard Worker 
968*9880d681SAndroid Build Coastguard Worker     // Handle multiple DBG_VALUE instructions describing one variable.
969*9880d681SAndroid Build Coastguard Worker     DebugLocStream::ListBuilder List(DebugLocs, TheCU, *Asm, *RegVar, *MInsn);
970*9880d681SAndroid Build Coastguard Worker 
971*9880d681SAndroid Build Coastguard Worker     // Build the location list for this variable.
972*9880d681SAndroid Build Coastguard Worker     SmallVector<DebugLocEntry, 8> Entries;
973*9880d681SAndroid Build Coastguard Worker     buildLocationList(Entries, Ranges);
974*9880d681SAndroid Build Coastguard Worker 
975*9880d681SAndroid Build Coastguard Worker     // If the variable has a DIBasicType, extract it.  Basic types cannot have
976*9880d681SAndroid Build Coastguard Worker     // unique identifiers, so don't bother resolving the type with the
977*9880d681SAndroid Build Coastguard Worker     // identifier map.
978*9880d681SAndroid Build Coastguard Worker     const DIBasicType *BT = dyn_cast<DIBasicType>(
979*9880d681SAndroid Build Coastguard Worker         static_cast<const Metadata *>(IV.first->getType()));
980*9880d681SAndroid Build Coastguard Worker 
981*9880d681SAndroid Build Coastguard Worker     // Finalize the entry by lowering it into a DWARF bytestream.
982*9880d681SAndroid Build Coastguard Worker     for (auto &Entry : Entries)
983*9880d681SAndroid Build Coastguard Worker       Entry.finalize(*Asm, List, BT);
984*9880d681SAndroid Build Coastguard Worker   }
985*9880d681SAndroid Build Coastguard Worker 
986*9880d681SAndroid Build Coastguard Worker   // Collect info for variables that were optimized out.
987*9880d681SAndroid Build Coastguard Worker   for (const DILocalVariable *DV : SP->getVariables()) {
988*9880d681SAndroid Build Coastguard Worker     if (Processed.insert(InlinedVariable(DV, nullptr)).second)
989*9880d681SAndroid Build Coastguard Worker       if (LexicalScope *Scope = LScopes.findLexicalScope(DV->getScope()))
990*9880d681SAndroid Build Coastguard Worker         createConcreteVariable(*Scope, InlinedVariable(DV, nullptr));
991*9880d681SAndroid Build Coastguard Worker   }
992*9880d681SAndroid Build Coastguard Worker }
993*9880d681SAndroid Build Coastguard Worker 
994*9880d681SAndroid Build Coastguard Worker // Process beginning of an instruction.
beginInstruction(const MachineInstr * MI)995*9880d681SAndroid Build Coastguard Worker void DwarfDebug::beginInstruction(const MachineInstr *MI) {
996*9880d681SAndroid Build Coastguard Worker   DebugHandlerBase::beginInstruction(MI);
997*9880d681SAndroid Build Coastguard Worker   assert(CurMI);
998*9880d681SAndroid Build Coastguard Worker 
999*9880d681SAndroid Build Coastguard Worker   // Check if source location changes, but ignore DBG_VALUE locations.
1000*9880d681SAndroid Build Coastguard Worker   if (!MI->isDebugValue()) {
1001*9880d681SAndroid Build Coastguard Worker     const DebugLoc &DL = MI->getDebugLoc();
1002*9880d681SAndroid Build Coastguard Worker     if (DL != PrevInstLoc) {
1003*9880d681SAndroid Build Coastguard Worker       if (DL) {
1004*9880d681SAndroid Build Coastguard Worker         unsigned Flags = 0;
1005*9880d681SAndroid Build Coastguard Worker         PrevInstLoc = DL;
1006*9880d681SAndroid Build Coastguard Worker         if (DL == PrologEndLoc) {
1007*9880d681SAndroid Build Coastguard Worker           Flags |= DWARF2_FLAG_PROLOGUE_END;
1008*9880d681SAndroid Build Coastguard Worker           PrologEndLoc = DebugLoc();
1009*9880d681SAndroid Build Coastguard Worker           Flags |= DWARF2_FLAG_IS_STMT;
1010*9880d681SAndroid Build Coastguard Worker         }
1011*9880d681SAndroid Build Coastguard Worker         if (DL.getLine() !=
1012*9880d681SAndroid Build Coastguard Worker             Asm->OutStreamer->getContext().getCurrentDwarfLoc().getLine())
1013*9880d681SAndroid Build Coastguard Worker           Flags |= DWARF2_FLAG_IS_STMT;
1014*9880d681SAndroid Build Coastguard Worker 
1015*9880d681SAndroid Build Coastguard Worker         const MDNode *Scope = DL.getScope();
1016*9880d681SAndroid Build Coastguard Worker         recordSourceLine(DL.getLine(), DL.getCol(), Scope, Flags);
1017*9880d681SAndroid Build Coastguard Worker       } else if (UnknownLocations) {
1018*9880d681SAndroid Build Coastguard Worker         PrevInstLoc = DL;
1019*9880d681SAndroid Build Coastguard Worker         recordSourceLine(0, 0, nullptr, 0);
1020*9880d681SAndroid Build Coastguard Worker       }
1021*9880d681SAndroid Build Coastguard Worker     }
1022*9880d681SAndroid Build Coastguard Worker   }
1023*9880d681SAndroid Build Coastguard Worker }
1024*9880d681SAndroid Build Coastguard Worker 
findPrologueEndLoc(const MachineFunction * MF)1025*9880d681SAndroid Build Coastguard Worker static DebugLoc findPrologueEndLoc(const MachineFunction *MF) {
1026*9880d681SAndroid Build Coastguard Worker   // First known non-DBG_VALUE and non-frame setup location marks
1027*9880d681SAndroid Build Coastguard Worker   // the beginning of the function body.
1028*9880d681SAndroid Build Coastguard Worker   for (const auto &MBB : *MF)
1029*9880d681SAndroid Build Coastguard Worker     for (const auto &MI : MBB)
1030*9880d681SAndroid Build Coastguard Worker       if (!MI.isDebugValue() && !MI.getFlag(MachineInstr::FrameSetup) &&
1031*9880d681SAndroid Build Coastguard Worker           MI.getDebugLoc())
1032*9880d681SAndroid Build Coastguard Worker         return MI.getDebugLoc();
1033*9880d681SAndroid Build Coastguard Worker   return DebugLoc();
1034*9880d681SAndroid Build Coastguard Worker }
1035*9880d681SAndroid Build Coastguard Worker 
1036*9880d681SAndroid Build Coastguard Worker // Gather pre-function debug information.  Assumes being called immediately
1037*9880d681SAndroid Build Coastguard Worker // after the function entry point has been emitted.
beginFunction(const MachineFunction * MF)1038*9880d681SAndroid Build Coastguard Worker void DwarfDebug::beginFunction(const MachineFunction *MF) {
1039*9880d681SAndroid Build Coastguard Worker   CurFn = MF;
1040*9880d681SAndroid Build Coastguard Worker 
1041*9880d681SAndroid Build Coastguard Worker   // If there's no debug info for the function we're not going to do anything.
1042*9880d681SAndroid Build Coastguard Worker   if (!MMI->hasDebugInfo())
1043*9880d681SAndroid Build Coastguard Worker     return;
1044*9880d681SAndroid Build Coastguard Worker 
1045*9880d681SAndroid Build Coastguard Worker   auto DI = MF->getFunction()->getSubprogram();
1046*9880d681SAndroid Build Coastguard Worker   if (!DI)
1047*9880d681SAndroid Build Coastguard Worker     return;
1048*9880d681SAndroid Build Coastguard Worker 
1049*9880d681SAndroid Build Coastguard Worker   // Grab the lexical scopes for the function, if we don't have any of those
1050*9880d681SAndroid Build Coastguard Worker   // then we're not going to be able to do anything.
1051*9880d681SAndroid Build Coastguard Worker   DebugHandlerBase::beginFunction(MF);
1052*9880d681SAndroid Build Coastguard Worker   if (LScopes.empty())
1053*9880d681SAndroid Build Coastguard Worker     return;
1054*9880d681SAndroid Build Coastguard Worker 
1055*9880d681SAndroid Build Coastguard Worker   // Set DwarfDwarfCompileUnitID in MCContext to the Compile Unit this function
1056*9880d681SAndroid Build Coastguard Worker   // belongs to so that we add to the correct per-cu line table in the
1057*9880d681SAndroid Build Coastguard Worker   // non-asm case.
1058*9880d681SAndroid Build Coastguard Worker   LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
1059*9880d681SAndroid Build Coastguard Worker   // FnScope->getScopeNode() and DI->second should represent the same function,
1060*9880d681SAndroid Build Coastguard Worker   // though they may not be the same MDNode due to inline functions merged in
1061*9880d681SAndroid Build Coastguard Worker   // LTO where the debug info metadata still differs (either due to distinct
1062*9880d681SAndroid Build Coastguard Worker   // written differences - two versions of a linkonce_odr function
1063*9880d681SAndroid Build Coastguard Worker   // written/copied into two separate files, or some sub-optimal metadata that
1064*9880d681SAndroid Build Coastguard Worker   // isn't structurally identical (see: file path/name info from clang, which
1065*9880d681SAndroid Build Coastguard Worker   // includes the directory of the cpp file being built, even when the file name
1066*9880d681SAndroid Build Coastguard Worker   // is absolute (such as an <> lookup header)))
1067*9880d681SAndroid Build Coastguard Worker   auto *SP = cast<DISubprogram>(FnScope->getScopeNode());
1068*9880d681SAndroid Build Coastguard Worker   DwarfCompileUnit *TheCU = CUMap.lookup(SP->getUnit());
1069*9880d681SAndroid Build Coastguard Worker   if (!TheCU) {
1070*9880d681SAndroid Build Coastguard Worker     assert(SP->getUnit()->getEmissionKind() == DICompileUnit::NoDebug &&
1071*9880d681SAndroid Build Coastguard Worker            "DICompileUnit missing from llvm.dbg.cu?");
1072*9880d681SAndroid Build Coastguard Worker     return;
1073*9880d681SAndroid Build Coastguard Worker   }
1074*9880d681SAndroid Build Coastguard Worker   if (Asm->OutStreamer->hasRawTextSupport())
1075*9880d681SAndroid Build Coastguard Worker     // Use a single line table if we are generating assembly.
1076*9880d681SAndroid Build Coastguard Worker     Asm->OutStreamer->getContext().setDwarfCompileUnitID(0);
1077*9880d681SAndroid Build Coastguard Worker   else
1078*9880d681SAndroid Build Coastguard Worker     Asm->OutStreamer->getContext().setDwarfCompileUnitID(TheCU->getUniqueID());
1079*9880d681SAndroid Build Coastguard Worker 
1080*9880d681SAndroid Build Coastguard Worker   // Record beginning of function.
1081*9880d681SAndroid Build Coastguard Worker   PrologEndLoc = findPrologueEndLoc(MF);
1082*9880d681SAndroid Build Coastguard Worker   if (DILocation *L = PrologEndLoc) {
1083*9880d681SAndroid Build Coastguard Worker     // We'd like to list the prologue as "not statements" but GDB behaves
1084*9880d681SAndroid Build Coastguard Worker     // poorly if we do that. Revisit this with caution/GDB (7.5+) testing.
1085*9880d681SAndroid Build Coastguard Worker     auto *SP = L->getInlinedAtScope()->getSubprogram();
1086*9880d681SAndroid Build Coastguard Worker     recordSourceLine(SP->getScopeLine(), 0, SP, DWARF2_FLAG_IS_STMT);
1087*9880d681SAndroid Build Coastguard Worker   }
1088*9880d681SAndroid Build Coastguard Worker }
1089*9880d681SAndroid Build Coastguard Worker 
1090*9880d681SAndroid Build Coastguard Worker // Gather and emit post-function debug information.
endFunction(const MachineFunction * MF)1091*9880d681SAndroid Build Coastguard Worker void DwarfDebug::endFunction(const MachineFunction *MF) {
1092*9880d681SAndroid Build Coastguard Worker   assert(CurFn == MF &&
1093*9880d681SAndroid Build Coastguard Worker       "endFunction should be called with the same function as beginFunction");
1094*9880d681SAndroid Build Coastguard Worker 
1095*9880d681SAndroid Build Coastguard Worker   const DISubprogram *SP = MF->getFunction()->getSubprogram();
1096*9880d681SAndroid Build Coastguard Worker   if (!MMI->hasDebugInfo() || LScopes.empty() || !SP ||
1097*9880d681SAndroid Build Coastguard Worker       SP->getUnit()->getEmissionKind() == DICompileUnit::NoDebug) {
1098*9880d681SAndroid Build Coastguard Worker     // If we don't have a lexical scope for this function then there will
1099*9880d681SAndroid Build Coastguard Worker     // be a hole in the range information. Keep note of this by setting the
1100*9880d681SAndroid Build Coastguard Worker     // previously used section to nullptr.
1101*9880d681SAndroid Build Coastguard Worker     PrevCU = nullptr;
1102*9880d681SAndroid Build Coastguard Worker     CurFn = nullptr;
1103*9880d681SAndroid Build Coastguard Worker     DebugHandlerBase::endFunction(MF);
1104*9880d681SAndroid Build Coastguard Worker     // Mark functions with no debug info on any instructions, but a
1105*9880d681SAndroid Build Coastguard Worker     // valid DISubprogram as processed.
1106*9880d681SAndroid Build Coastguard Worker     if (SP)
1107*9880d681SAndroid Build Coastguard Worker       ProcessedSPNodes.insert(SP);
1108*9880d681SAndroid Build Coastguard Worker     return;
1109*9880d681SAndroid Build Coastguard Worker   }
1110*9880d681SAndroid Build Coastguard Worker 
1111*9880d681SAndroid Build Coastguard Worker   // Set DwarfDwarfCompileUnitID in MCContext to default value.
1112*9880d681SAndroid Build Coastguard Worker   Asm->OutStreamer->getContext().setDwarfCompileUnitID(0);
1113*9880d681SAndroid Build Coastguard Worker 
1114*9880d681SAndroid Build Coastguard Worker   LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
1115*9880d681SAndroid Build Coastguard Worker   SP = cast<DISubprogram>(FnScope->getScopeNode());
1116*9880d681SAndroid Build Coastguard Worker   DwarfCompileUnit &TheCU = *CUMap.lookup(SP->getUnit());
1117*9880d681SAndroid Build Coastguard Worker 
1118*9880d681SAndroid Build Coastguard Worker   DenseSet<InlinedVariable> ProcessedVars;
1119*9880d681SAndroid Build Coastguard Worker   collectVariableInfo(TheCU, SP, ProcessedVars);
1120*9880d681SAndroid Build Coastguard Worker 
1121*9880d681SAndroid Build Coastguard Worker   // Add the range of this function to the list of ranges for the CU.
1122*9880d681SAndroid Build Coastguard Worker   TheCU.addRange(RangeSpan(Asm->getFunctionBegin(), Asm->getFunctionEnd()));
1123*9880d681SAndroid Build Coastguard Worker 
1124*9880d681SAndroid Build Coastguard Worker   // Under -gmlt, skip building the subprogram if there are no inlined
1125*9880d681SAndroid Build Coastguard Worker   // subroutines inside it.
1126*9880d681SAndroid Build Coastguard Worker   if (TheCU.getCUNode()->getEmissionKind() == DICompileUnit::LineTablesOnly &&
1127*9880d681SAndroid Build Coastguard Worker       LScopes.getAbstractScopesList().empty() && !IsDarwin) {
1128*9880d681SAndroid Build Coastguard Worker     assert(InfoHolder.getScopeVariables().empty());
1129*9880d681SAndroid Build Coastguard Worker     assert(DbgValues.empty());
1130*9880d681SAndroid Build Coastguard Worker     // FIXME: This wouldn't be true in LTO with a -g (with inlining) CU followed
1131*9880d681SAndroid Build Coastguard Worker     // by a -gmlt CU. Add a test and remove this assertion.
1132*9880d681SAndroid Build Coastguard Worker     assert(AbstractVariables.empty());
1133*9880d681SAndroid Build Coastguard Worker     PrevLabel = nullptr;
1134*9880d681SAndroid Build Coastguard Worker     CurFn = nullptr;
1135*9880d681SAndroid Build Coastguard Worker     DebugHandlerBase::endFunction(MF);
1136*9880d681SAndroid Build Coastguard Worker     return;
1137*9880d681SAndroid Build Coastguard Worker   }
1138*9880d681SAndroid Build Coastguard Worker 
1139*9880d681SAndroid Build Coastguard Worker #ifndef NDEBUG
1140*9880d681SAndroid Build Coastguard Worker   size_t NumAbstractScopes = LScopes.getAbstractScopesList().size();
1141*9880d681SAndroid Build Coastguard Worker #endif
1142*9880d681SAndroid Build Coastguard Worker   // Construct abstract scopes.
1143*9880d681SAndroid Build Coastguard Worker   for (LexicalScope *AScope : LScopes.getAbstractScopesList()) {
1144*9880d681SAndroid Build Coastguard Worker     auto *SP = cast<DISubprogram>(AScope->getScopeNode());
1145*9880d681SAndroid Build Coastguard Worker     // Collect info for variables that were optimized out.
1146*9880d681SAndroid Build Coastguard Worker     for (const DILocalVariable *DV : SP->getVariables()) {
1147*9880d681SAndroid Build Coastguard Worker       if (!ProcessedVars.insert(InlinedVariable(DV, nullptr)).second)
1148*9880d681SAndroid Build Coastguard Worker         continue;
1149*9880d681SAndroid Build Coastguard Worker       ensureAbstractVariableIsCreated(InlinedVariable(DV, nullptr),
1150*9880d681SAndroid Build Coastguard Worker                                       DV->getScope());
1151*9880d681SAndroid Build Coastguard Worker       assert(LScopes.getAbstractScopesList().size() == NumAbstractScopes
1152*9880d681SAndroid Build Coastguard Worker              && "ensureAbstractVariableIsCreated inserted abstract scopes");
1153*9880d681SAndroid Build Coastguard Worker     }
1154*9880d681SAndroid Build Coastguard Worker     constructAbstractSubprogramScopeDIE(AScope);
1155*9880d681SAndroid Build Coastguard Worker   }
1156*9880d681SAndroid Build Coastguard Worker 
1157*9880d681SAndroid Build Coastguard Worker   TheCU.constructSubprogramScopeDIE(FnScope);
1158*9880d681SAndroid Build Coastguard Worker   if (auto *SkelCU = TheCU.getSkeleton())
1159*9880d681SAndroid Build Coastguard Worker     if (!LScopes.getAbstractScopesList().empty())
1160*9880d681SAndroid Build Coastguard Worker       SkelCU->constructSubprogramScopeDIE(FnScope);
1161*9880d681SAndroid Build Coastguard Worker 
1162*9880d681SAndroid Build Coastguard Worker   // Clear debug info
1163*9880d681SAndroid Build Coastguard Worker   // Ownership of DbgVariables is a bit subtle - ScopeVariables owns all the
1164*9880d681SAndroid Build Coastguard Worker   // DbgVariables except those that are also in AbstractVariables (since they
1165*9880d681SAndroid Build Coastguard Worker   // can be used cross-function)
1166*9880d681SAndroid Build Coastguard Worker   InfoHolder.getScopeVariables().clear();
1167*9880d681SAndroid Build Coastguard Worker   PrevLabel = nullptr;
1168*9880d681SAndroid Build Coastguard Worker   CurFn = nullptr;
1169*9880d681SAndroid Build Coastguard Worker   DebugHandlerBase::endFunction(MF);
1170*9880d681SAndroid Build Coastguard Worker }
1171*9880d681SAndroid Build Coastguard Worker 
1172*9880d681SAndroid Build Coastguard Worker // Register a source line with debug info. Returns the  unique label that was
1173*9880d681SAndroid Build Coastguard Worker // emitted and which provides correspondence to the source line list.
recordSourceLine(unsigned Line,unsigned Col,const MDNode * S,unsigned Flags)1174*9880d681SAndroid Build Coastguard Worker void DwarfDebug::recordSourceLine(unsigned Line, unsigned Col, const MDNode *S,
1175*9880d681SAndroid Build Coastguard Worker                                   unsigned Flags) {
1176*9880d681SAndroid Build Coastguard Worker   StringRef Fn;
1177*9880d681SAndroid Build Coastguard Worker   StringRef Dir;
1178*9880d681SAndroid Build Coastguard Worker   unsigned Src = 1;
1179*9880d681SAndroid Build Coastguard Worker   unsigned Discriminator = 0;
1180*9880d681SAndroid Build Coastguard Worker   if (auto *Scope = cast_or_null<DIScope>(S)) {
1181*9880d681SAndroid Build Coastguard Worker     Fn = Scope->getFilename();
1182*9880d681SAndroid Build Coastguard Worker     Dir = Scope->getDirectory();
1183*9880d681SAndroid Build Coastguard Worker     if (auto *LBF = dyn_cast<DILexicalBlockFile>(Scope))
1184*9880d681SAndroid Build Coastguard Worker       Discriminator = LBF->getDiscriminator();
1185*9880d681SAndroid Build Coastguard Worker 
1186*9880d681SAndroid Build Coastguard Worker     unsigned CUID = Asm->OutStreamer->getContext().getDwarfCompileUnitID();
1187*9880d681SAndroid Build Coastguard Worker     Src = static_cast<DwarfCompileUnit &>(*InfoHolder.getUnits()[CUID])
1188*9880d681SAndroid Build Coastguard Worker               .getOrCreateSourceID(Fn, Dir);
1189*9880d681SAndroid Build Coastguard Worker   }
1190*9880d681SAndroid Build Coastguard Worker   Asm->OutStreamer->EmitDwarfLocDirective(Src, Line, Col, Flags, 0,
1191*9880d681SAndroid Build Coastguard Worker                                           Discriminator, Fn);
1192*9880d681SAndroid Build Coastguard Worker }
1193*9880d681SAndroid Build Coastguard Worker 
1194*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
1195*9880d681SAndroid Build Coastguard Worker // Emit Methods
1196*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
1197*9880d681SAndroid Build Coastguard Worker 
1198*9880d681SAndroid Build Coastguard Worker // Emit the debug info section.
emitDebugInfo()1199*9880d681SAndroid Build Coastguard Worker void DwarfDebug::emitDebugInfo() {
1200*9880d681SAndroid Build Coastguard Worker   DwarfFile &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
1201*9880d681SAndroid Build Coastguard Worker   Holder.emitUnits(/* UseOffsets */ false);
1202*9880d681SAndroid Build Coastguard Worker }
1203*9880d681SAndroid Build Coastguard Worker 
1204*9880d681SAndroid Build Coastguard Worker // Emit the abbreviation section.
emitAbbreviations()1205*9880d681SAndroid Build Coastguard Worker void DwarfDebug::emitAbbreviations() {
1206*9880d681SAndroid Build Coastguard Worker   DwarfFile &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
1207*9880d681SAndroid Build Coastguard Worker 
1208*9880d681SAndroid Build Coastguard Worker   Holder.emitAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevSection());
1209*9880d681SAndroid Build Coastguard Worker }
1210*9880d681SAndroid Build Coastguard Worker 
emitAccel(DwarfAccelTable & Accel,MCSection * Section,StringRef TableName)1211*9880d681SAndroid Build Coastguard Worker void DwarfDebug::emitAccel(DwarfAccelTable &Accel, MCSection *Section,
1212*9880d681SAndroid Build Coastguard Worker                            StringRef TableName) {
1213*9880d681SAndroid Build Coastguard Worker   Accel.FinalizeTable(Asm, TableName);
1214*9880d681SAndroid Build Coastguard Worker   Asm->OutStreamer->SwitchSection(Section);
1215*9880d681SAndroid Build Coastguard Worker 
1216*9880d681SAndroid Build Coastguard Worker   // Emit the full data.
1217*9880d681SAndroid Build Coastguard Worker   Accel.emit(Asm, Section->getBeginSymbol(), this);
1218*9880d681SAndroid Build Coastguard Worker }
1219*9880d681SAndroid Build Coastguard Worker 
1220*9880d681SAndroid Build Coastguard Worker // Emit visible names into a hashed accelerator table section.
emitAccelNames()1221*9880d681SAndroid Build Coastguard Worker void DwarfDebug::emitAccelNames() {
1222*9880d681SAndroid Build Coastguard Worker   emitAccel(AccelNames, Asm->getObjFileLowering().getDwarfAccelNamesSection(),
1223*9880d681SAndroid Build Coastguard Worker             "Names");
1224*9880d681SAndroid Build Coastguard Worker }
1225*9880d681SAndroid Build Coastguard Worker 
1226*9880d681SAndroid Build Coastguard Worker // Emit objective C classes and categories into a hashed accelerator table
1227*9880d681SAndroid Build Coastguard Worker // section.
emitAccelObjC()1228*9880d681SAndroid Build Coastguard Worker void DwarfDebug::emitAccelObjC() {
1229*9880d681SAndroid Build Coastguard Worker   emitAccel(AccelObjC, Asm->getObjFileLowering().getDwarfAccelObjCSection(),
1230*9880d681SAndroid Build Coastguard Worker             "ObjC");
1231*9880d681SAndroid Build Coastguard Worker }
1232*9880d681SAndroid Build Coastguard Worker 
1233*9880d681SAndroid Build Coastguard Worker // Emit namespace dies into a hashed accelerator table.
emitAccelNamespaces()1234*9880d681SAndroid Build Coastguard Worker void DwarfDebug::emitAccelNamespaces() {
1235*9880d681SAndroid Build Coastguard Worker   emitAccel(AccelNamespace,
1236*9880d681SAndroid Build Coastguard Worker             Asm->getObjFileLowering().getDwarfAccelNamespaceSection(),
1237*9880d681SAndroid Build Coastguard Worker             "namespac");
1238*9880d681SAndroid Build Coastguard Worker }
1239*9880d681SAndroid Build Coastguard Worker 
1240*9880d681SAndroid Build Coastguard Worker // Emit type dies into a hashed accelerator table.
emitAccelTypes()1241*9880d681SAndroid Build Coastguard Worker void DwarfDebug::emitAccelTypes() {
1242*9880d681SAndroid Build Coastguard Worker   emitAccel(AccelTypes, Asm->getObjFileLowering().getDwarfAccelTypesSection(),
1243*9880d681SAndroid Build Coastguard Worker             "types");
1244*9880d681SAndroid Build Coastguard Worker }
1245*9880d681SAndroid Build Coastguard Worker 
1246*9880d681SAndroid Build Coastguard Worker // Public name handling.
1247*9880d681SAndroid Build Coastguard Worker // The format for the various pubnames:
1248*9880d681SAndroid Build Coastguard Worker //
1249*9880d681SAndroid Build Coastguard Worker // dwarf pubnames - offset/name pairs where the offset is the offset into the CU
1250*9880d681SAndroid Build Coastguard Worker // for the DIE that is named.
1251*9880d681SAndroid Build Coastguard Worker //
1252*9880d681SAndroid Build Coastguard Worker // gnu pubnames - offset/index value/name tuples where the offset is the offset
1253*9880d681SAndroid Build Coastguard Worker // into the CU and the index value is computed according to the type of value
1254*9880d681SAndroid Build Coastguard Worker // for the DIE that is named.
1255*9880d681SAndroid Build Coastguard Worker //
1256*9880d681SAndroid Build Coastguard Worker // For type units the offset is the offset of the skeleton DIE. For split dwarf
1257*9880d681SAndroid Build Coastguard Worker // it's the offset within the debug_info/debug_types dwo section, however, the
1258*9880d681SAndroid Build Coastguard Worker // reference in the pubname header doesn't change.
1259*9880d681SAndroid Build Coastguard Worker 
1260*9880d681SAndroid Build Coastguard Worker /// computeIndexValue - Compute the gdb index value for the DIE and CU.
computeIndexValue(DwarfUnit * CU,const DIE * Die)1261*9880d681SAndroid Build Coastguard Worker static dwarf::PubIndexEntryDescriptor computeIndexValue(DwarfUnit *CU,
1262*9880d681SAndroid Build Coastguard Worker                                                         const DIE *Die) {
1263*9880d681SAndroid Build Coastguard Worker   dwarf::GDBIndexEntryLinkage Linkage = dwarf::GIEL_STATIC;
1264*9880d681SAndroid Build Coastguard Worker 
1265*9880d681SAndroid Build Coastguard Worker   // We could have a specification DIE that has our most of our knowledge,
1266*9880d681SAndroid Build Coastguard Worker   // look for that now.
1267*9880d681SAndroid Build Coastguard Worker   if (DIEValue SpecVal = Die->findAttribute(dwarf::DW_AT_specification)) {
1268*9880d681SAndroid Build Coastguard Worker     DIE &SpecDIE = SpecVal.getDIEEntry().getEntry();
1269*9880d681SAndroid Build Coastguard Worker     if (SpecDIE.findAttribute(dwarf::DW_AT_external))
1270*9880d681SAndroid Build Coastguard Worker       Linkage = dwarf::GIEL_EXTERNAL;
1271*9880d681SAndroid Build Coastguard Worker   } else if (Die->findAttribute(dwarf::DW_AT_external))
1272*9880d681SAndroid Build Coastguard Worker     Linkage = dwarf::GIEL_EXTERNAL;
1273*9880d681SAndroid Build Coastguard Worker 
1274*9880d681SAndroid Build Coastguard Worker   switch (Die->getTag()) {
1275*9880d681SAndroid Build Coastguard Worker   case dwarf::DW_TAG_class_type:
1276*9880d681SAndroid Build Coastguard Worker   case dwarf::DW_TAG_structure_type:
1277*9880d681SAndroid Build Coastguard Worker   case dwarf::DW_TAG_union_type:
1278*9880d681SAndroid Build Coastguard Worker   case dwarf::DW_TAG_enumeration_type:
1279*9880d681SAndroid Build Coastguard Worker     return dwarf::PubIndexEntryDescriptor(
1280*9880d681SAndroid Build Coastguard Worker         dwarf::GIEK_TYPE, CU->getLanguage() != dwarf::DW_LANG_C_plus_plus
1281*9880d681SAndroid Build Coastguard Worker                               ? dwarf::GIEL_STATIC
1282*9880d681SAndroid Build Coastguard Worker                               : dwarf::GIEL_EXTERNAL);
1283*9880d681SAndroid Build Coastguard Worker   case dwarf::DW_TAG_typedef:
1284*9880d681SAndroid Build Coastguard Worker   case dwarf::DW_TAG_base_type:
1285*9880d681SAndroid Build Coastguard Worker   case dwarf::DW_TAG_subrange_type:
1286*9880d681SAndroid Build Coastguard Worker     return dwarf::PubIndexEntryDescriptor(dwarf::GIEK_TYPE, dwarf::GIEL_STATIC);
1287*9880d681SAndroid Build Coastguard Worker   case dwarf::DW_TAG_namespace:
1288*9880d681SAndroid Build Coastguard Worker     return dwarf::GIEK_TYPE;
1289*9880d681SAndroid Build Coastguard Worker   case dwarf::DW_TAG_subprogram:
1290*9880d681SAndroid Build Coastguard Worker     return dwarf::PubIndexEntryDescriptor(dwarf::GIEK_FUNCTION, Linkage);
1291*9880d681SAndroid Build Coastguard Worker   case dwarf::DW_TAG_variable:
1292*9880d681SAndroid Build Coastguard Worker     return dwarf::PubIndexEntryDescriptor(dwarf::GIEK_VARIABLE, Linkage);
1293*9880d681SAndroid Build Coastguard Worker   case dwarf::DW_TAG_enumerator:
1294*9880d681SAndroid Build Coastguard Worker     return dwarf::PubIndexEntryDescriptor(dwarf::GIEK_VARIABLE,
1295*9880d681SAndroid Build Coastguard Worker                                           dwarf::GIEL_STATIC);
1296*9880d681SAndroid Build Coastguard Worker   default:
1297*9880d681SAndroid Build Coastguard Worker     return dwarf::GIEK_NONE;
1298*9880d681SAndroid Build Coastguard Worker   }
1299*9880d681SAndroid Build Coastguard Worker }
1300*9880d681SAndroid Build Coastguard Worker 
1301*9880d681SAndroid Build Coastguard Worker /// emitDebugPubNames - Emit visible names into a debug pubnames section.
1302*9880d681SAndroid Build Coastguard Worker ///
emitDebugPubNames(bool GnuStyle)1303*9880d681SAndroid Build Coastguard Worker void DwarfDebug::emitDebugPubNames(bool GnuStyle) {
1304*9880d681SAndroid Build Coastguard Worker   MCSection *PSec = GnuStyle
1305*9880d681SAndroid Build Coastguard Worker                         ? Asm->getObjFileLowering().getDwarfGnuPubNamesSection()
1306*9880d681SAndroid Build Coastguard Worker                         : Asm->getObjFileLowering().getDwarfPubNamesSection();
1307*9880d681SAndroid Build Coastguard Worker 
1308*9880d681SAndroid Build Coastguard Worker   emitDebugPubSection(GnuStyle, PSec, "Names",
1309*9880d681SAndroid Build Coastguard Worker                       &DwarfCompileUnit::getGlobalNames);
1310*9880d681SAndroid Build Coastguard Worker }
1311*9880d681SAndroid Build Coastguard Worker 
emitDebugPubSection(bool GnuStyle,MCSection * PSec,StringRef Name,const StringMap<const DIE * > & (DwarfCompileUnit::* Accessor)()const)1312*9880d681SAndroid Build Coastguard Worker void DwarfDebug::emitDebugPubSection(
1313*9880d681SAndroid Build Coastguard Worker     bool GnuStyle, MCSection *PSec, StringRef Name,
1314*9880d681SAndroid Build Coastguard Worker     const StringMap<const DIE *> &(DwarfCompileUnit::*Accessor)() const) {
1315*9880d681SAndroid Build Coastguard Worker   for (const auto &NU : CUMap) {
1316*9880d681SAndroid Build Coastguard Worker     DwarfCompileUnit *TheU = NU.second;
1317*9880d681SAndroid Build Coastguard Worker 
1318*9880d681SAndroid Build Coastguard Worker     const auto &Globals = (TheU->*Accessor)();
1319*9880d681SAndroid Build Coastguard Worker 
1320*9880d681SAndroid Build Coastguard Worker     if (Globals.empty())
1321*9880d681SAndroid Build Coastguard Worker       continue;
1322*9880d681SAndroid Build Coastguard Worker 
1323*9880d681SAndroid Build Coastguard Worker     if (auto *Skeleton = TheU->getSkeleton())
1324*9880d681SAndroid Build Coastguard Worker       TheU = Skeleton;
1325*9880d681SAndroid Build Coastguard Worker 
1326*9880d681SAndroid Build Coastguard Worker     // Start the dwarf pubnames section.
1327*9880d681SAndroid Build Coastguard Worker     Asm->OutStreamer->SwitchSection(PSec);
1328*9880d681SAndroid Build Coastguard Worker 
1329*9880d681SAndroid Build Coastguard Worker     // Emit the header.
1330*9880d681SAndroid Build Coastguard Worker     Asm->OutStreamer->AddComment("Length of Public " + Name + " Info");
1331*9880d681SAndroid Build Coastguard Worker     MCSymbol *BeginLabel = Asm->createTempSymbol("pub" + Name + "_begin");
1332*9880d681SAndroid Build Coastguard Worker     MCSymbol *EndLabel = Asm->createTempSymbol("pub" + Name + "_end");
1333*9880d681SAndroid Build Coastguard Worker     Asm->EmitLabelDifference(EndLabel, BeginLabel, 4);
1334*9880d681SAndroid Build Coastguard Worker 
1335*9880d681SAndroid Build Coastguard Worker     Asm->OutStreamer->EmitLabel(BeginLabel);
1336*9880d681SAndroid Build Coastguard Worker 
1337*9880d681SAndroid Build Coastguard Worker     Asm->OutStreamer->AddComment("DWARF Version");
1338*9880d681SAndroid Build Coastguard Worker     Asm->EmitInt16(dwarf::DW_PUBNAMES_VERSION);
1339*9880d681SAndroid Build Coastguard Worker 
1340*9880d681SAndroid Build Coastguard Worker     Asm->OutStreamer->AddComment("Offset of Compilation Unit Info");
1341*9880d681SAndroid Build Coastguard Worker     Asm->emitDwarfSymbolReference(TheU->getLabelBegin());
1342*9880d681SAndroid Build Coastguard Worker 
1343*9880d681SAndroid Build Coastguard Worker     Asm->OutStreamer->AddComment("Compilation Unit Length");
1344*9880d681SAndroid Build Coastguard Worker     Asm->EmitInt32(TheU->getLength());
1345*9880d681SAndroid Build Coastguard Worker 
1346*9880d681SAndroid Build Coastguard Worker     // Emit the pubnames for this compilation unit.
1347*9880d681SAndroid Build Coastguard Worker     for (const auto &GI : Globals) {
1348*9880d681SAndroid Build Coastguard Worker       const char *Name = GI.getKeyData();
1349*9880d681SAndroid Build Coastguard Worker       const DIE *Entity = GI.second;
1350*9880d681SAndroid Build Coastguard Worker 
1351*9880d681SAndroid Build Coastguard Worker       Asm->OutStreamer->AddComment("DIE offset");
1352*9880d681SAndroid Build Coastguard Worker       Asm->EmitInt32(Entity->getOffset());
1353*9880d681SAndroid Build Coastguard Worker 
1354*9880d681SAndroid Build Coastguard Worker       if (GnuStyle) {
1355*9880d681SAndroid Build Coastguard Worker         dwarf::PubIndexEntryDescriptor Desc = computeIndexValue(TheU, Entity);
1356*9880d681SAndroid Build Coastguard Worker         Asm->OutStreamer->AddComment(
1357*9880d681SAndroid Build Coastguard Worker             Twine("Kind: ") + dwarf::GDBIndexEntryKindString(Desc.Kind) + ", " +
1358*9880d681SAndroid Build Coastguard Worker             dwarf::GDBIndexEntryLinkageString(Desc.Linkage));
1359*9880d681SAndroid Build Coastguard Worker         Asm->EmitInt8(Desc.toBits());
1360*9880d681SAndroid Build Coastguard Worker       }
1361*9880d681SAndroid Build Coastguard Worker 
1362*9880d681SAndroid Build Coastguard Worker       Asm->OutStreamer->AddComment("External Name");
1363*9880d681SAndroid Build Coastguard Worker       Asm->OutStreamer->EmitBytes(StringRef(Name, GI.getKeyLength() + 1));
1364*9880d681SAndroid Build Coastguard Worker     }
1365*9880d681SAndroid Build Coastguard Worker 
1366*9880d681SAndroid Build Coastguard Worker     Asm->OutStreamer->AddComment("End Mark");
1367*9880d681SAndroid Build Coastguard Worker     Asm->EmitInt32(0);
1368*9880d681SAndroid Build Coastguard Worker     Asm->OutStreamer->EmitLabel(EndLabel);
1369*9880d681SAndroid Build Coastguard Worker   }
1370*9880d681SAndroid Build Coastguard Worker }
1371*9880d681SAndroid Build Coastguard Worker 
emitDebugPubTypes(bool GnuStyle)1372*9880d681SAndroid Build Coastguard Worker void DwarfDebug::emitDebugPubTypes(bool GnuStyle) {
1373*9880d681SAndroid Build Coastguard Worker   MCSection *PSec = GnuStyle
1374*9880d681SAndroid Build Coastguard Worker                         ? Asm->getObjFileLowering().getDwarfGnuPubTypesSection()
1375*9880d681SAndroid Build Coastguard Worker                         : Asm->getObjFileLowering().getDwarfPubTypesSection();
1376*9880d681SAndroid Build Coastguard Worker 
1377*9880d681SAndroid Build Coastguard Worker   emitDebugPubSection(GnuStyle, PSec, "Types",
1378*9880d681SAndroid Build Coastguard Worker                       &DwarfCompileUnit::getGlobalTypes);
1379*9880d681SAndroid Build Coastguard Worker }
1380*9880d681SAndroid Build Coastguard Worker 
1381*9880d681SAndroid Build Coastguard Worker /// Emit null-terminated strings into a debug str section.
emitDebugStr()1382*9880d681SAndroid Build Coastguard Worker void DwarfDebug::emitDebugStr() {
1383*9880d681SAndroid Build Coastguard Worker   DwarfFile &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
1384*9880d681SAndroid Build Coastguard Worker   Holder.emitStrings(Asm->getObjFileLowering().getDwarfStrSection());
1385*9880d681SAndroid Build Coastguard Worker }
1386*9880d681SAndroid Build Coastguard Worker 
emitDebugLocEntry(ByteStreamer & Streamer,const DebugLocStream::Entry & Entry)1387*9880d681SAndroid Build Coastguard Worker void DwarfDebug::emitDebugLocEntry(ByteStreamer &Streamer,
1388*9880d681SAndroid Build Coastguard Worker                                    const DebugLocStream::Entry &Entry) {
1389*9880d681SAndroid Build Coastguard Worker   auto &&Comments = DebugLocs.getComments(Entry);
1390*9880d681SAndroid Build Coastguard Worker   auto Comment = Comments.begin();
1391*9880d681SAndroid Build Coastguard Worker   auto End = Comments.end();
1392*9880d681SAndroid Build Coastguard Worker   for (uint8_t Byte : DebugLocs.getBytes(Entry))
1393*9880d681SAndroid Build Coastguard Worker     Streamer.EmitInt8(Byte, Comment != End ? *(Comment++) : "");
1394*9880d681SAndroid Build Coastguard Worker }
1395*9880d681SAndroid Build Coastguard Worker 
emitDebugLocValue(const AsmPrinter & AP,const DIBasicType * BT,ByteStreamer & Streamer,const DebugLocEntry::Value & Value,unsigned PieceOffsetInBits)1396*9880d681SAndroid Build Coastguard Worker static void emitDebugLocValue(const AsmPrinter &AP, const DIBasicType *BT,
1397*9880d681SAndroid Build Coastguard Worker                               ByteStreamer &Streamer,
1398*9880d681SAndroid Build Coastguard Worker                               const DebugLocEntry::Value &Value,
1399*9880d681SAndroid Build Coastguard Worker                               unsigned PieceOffsetInBits) {
1400*9880d681SAndroid Build Coastguard Worker   DebugLocDwarfExpression DwarfExpr(AP.getDwarfDebug()->getDwarfVersion(),
1401*9880d681SAndroid Build Coastguard Worker                                     Streamer);
1402*9880d681SAndroid Build Coastguard Worker   // Regular entry.
1403*9880d681SAndroid Build Coastguard Worker   if (Value.isInt()) {
1404*9880d681SAndroid Build Coastguard Worker     if (BT && (BT->getEncoding() == dwarf::DW_ATE_signed ||
1405*9880d681SAndroid Build Coastguard Worker                BT->getEncoding() == dwarf::DW_ATE_signed_char))
1406*9880d681SAndroid Build Coastguard Worker       DwarfExpr.AddSignedConstant(Value.getInt());
1407*9880d681SAndroid Build Coastguard Worker     else
1408*9880d681SAndroid Build Coastguard Worker       DwarfExpr.AddUnsignedConstant(Value.getInt());
1409*9880d681SAndroid Build Coastguard Worker   } else if (Value.isLocation()) {
1410*9880d681SAndroid Build Coastguard Worker     MachineLocation Loc = Value.getLoc();
1411*9880d681SAndroid Build Coastguard Worker     const DIExpression *Expr = Value.getExpression();
1412*9880d681SAndroid Build Coastguard Worker     if (!Expr || !Expr->getNumElements())
1413*9880d681SAndroid Build Coastguard Worker       // Regular entry.
1414*9880d681SAndroid Build Coastguard Worker       AP.EmitDwarfRegOp(Streamer, Loc);
1415*9880d681SAndroid Build Coastguard Worker     else {
1416*9880d681SAndroid Build Coastguard Worker       // Complex address entry.
1417*9880d681SAndroid Build Coastguard Worker       const TargetRegisterInfo &TRI = *AP.MF->getSubtarget().getRegisterInfo();
1418*9880d681SAndroid Build Coastguard Worker       if (Loc.getOffset()) {
1419*9880d681SAndroid Build Coastguard Worker         DwarfExpr.AddMachineRegIndirect(TRI, Loc.getReg(), Loc.getOffset());
1420*9880d681SAndroid Build Coastguard Worker         DwarfExpr.AddExpression(Expr->expr_op_begin(), Expr->expr_op_end(),
1421*9880d681SAndroid Build Coastguard Worker                                 PieceOffsetInBits);
1422*9880d681SAndroid Build Coastguard Worker       } else
1423*9880d681SAndroid Build Coastguard Worker         DwarfExpr.AddMachineRegExpression(TRI, Expr, Loc.getReg(),
1424*9880d681SAndroid Build Coastguard Worker                                           PieceOffsetInBits);
1425*9880d681SAndroid Build Coastguard Worker     }
1426*9880d681SAndroid Build Coastguard Worker   } else if (Value.isConstantFP()) {
1427*9880d681SAndroid Build Coastguard Worker     APInt RawBytes = Value.getConstantFP()->getValueAPF().bitcastToAPInt();
1428*9880d681SAndroid Build Coastguard Worker     DwarfExpr.AddUnsignedConstant(RawBytes);
1429*9880d681SAndroid Build Coastguard Worker   }
1430*9880d681SAndroid Build Coastguard Worker }
1431*9880d681SAndroid Build Coastguard Worker 
finalize(const AsmPrinter & AP,DebugLocStream::ListBuilder & List,const DIBasicType * BT)1432*9880d681SAndroid Build Coastguard Worker void DebugLocEntry::finalize(const AsmPrinter &AP,
1433*9880d681SAndroid Build Coastguard Worker                              DebugLocStream::ListBuilder &List,
1434*9880d681SAndroid Build Coastguard Worker                              const DIBasicType *BT) {
1435*9880d681SAndroid Build Coastguard Worker   DebugLocStream::EntryBuilder Entry(List, Begin, End);
1436*9880d681SAndroid Build Coastguard Worker   BufferByteStreamer Streamer = Entry.getStreamer();
1437*9880d681SAndroid Build Coastguard Worker   const DebugLocEntry::Value &Value = Values[0];
1438*9880d681SAndroid Build Coastguard Worker   if (Value.isBitPiece()) {
1439*9880d681SAndroid Build Coastguard Worker     // Emit all pieces that belong to the same variable and range.
1440*9880d681SAndroid Build Coastguard Worker     assert(std::all_of(Values.begin(), Values.end(), [](DebugLocEntry::Value P) {
1441*9880d681SAndroid Build Coastguard Worker           return P.isBitPiece();
1442*9880d681SAndroid Build Coastguard Worker         }) && "all values are expected to be pieces");
1443*9880d681SAndroid Build Coastguard Worker     assert(std::is_sorted(Values.begin(), Values.end()) &&
1444*9880d681SAndroid Build Coastguard Worker            "pieces are expected to be sorted");
1445*9880d681SAndroid Build Coastguard Worker 
1446*9880d681SAndroid Build Coastguard Worker     unsigned Offset = 0;
1447*9880d681SAndroid Build Coastguard Worker     for (auto Piece : Values) {
1448*9880d681SAndroid Build Coastguard Worker       const DIExpression *Expr = Piece.getExpression();
1449*9880d681SAndroid Build Coastguard Worker       unsigned PieceOffset = Expr->getBitPieceOffset();
1450*9880d681SAndroid Build Coastguard Worker       unsigned PieceSize = Expr->getBitPieceSize();
1451*9880d681SAndroid Build Coastguard Worker       assert(Offset <= PieceOffset && "overlapping or duplicate pieces");
1452*9880d681SAndroid Build Coastguard Worker       if (Offset < PieceOffset) {
1453*9880d681SAndroid Build Coastguard Worker         // The DWARF spec seriously mandates pieces with no locations for gaps.
1454*9880d681SAndroid Build Coastguard Worker         DebugLocDwarfExpression Expr(AP.getDwarfDebug()->getDwarfVersion(),
1455*9880d681SAndroid Build Coastguard Worker                                      Streamer);
1456*9880d681SAndroid Build Coastguard Worker         Expr.AddOpPiece(PieceOffset-Offset, 0);
1457*9880d681SAndroid Build Coastguard Worker         Offset += PieceOffset-Offset;
1458*9880d681SAndroid Build Coastguard Worker       }
1459*9880d681SAndroid Build Coastguard Worker       Offset += PieceSize;
1460*9880d681SAndroid Build Coastguard Worker 
1461*9880d681SAndroid Build Coastguard Worker       emitDebugLocValue(AP, BT, Streamer, Piece, PieceOffset);
1462*9880d681SAndroid Build Coastguard Worker     }
1463*9880d681SAndroid Build Coastguard Worker   } else {
1464*9880d681SAndroid Build Coastguard Worker     assert(Values.size() == 1 && "only pieces may have >1 value");
1465*9880d681SAndroid Build Coastguard Worker     emitDebugLocValue(AP, BT, Streamer, Value, 0);
1466*9880d681SAndroid Build Coastguard Worker   }
1467*9880d681SAndroid Build Coastguard Worker }
1468*9880d681SAndroid Build Coastguard Worker 
emitDebugLocEntryLocation(const DebugLocStream::Entry & Entry)1469*9880d681SAndroid Build Coastguard Worker void DwarfDebug::emitDebugLocEntryLocation(const DebugLocStream::Entry &Entry) {
1470*9880d681SAndroid Build Coastguard Worker   // Emit the size.
1471*9880d681SAndroid Build Coastguard Worker   Asm->OutStreamer->AddComment("Loc expr size");
1472*9880d681SAndroid Build Coastguard Worker   Asm->EmitInt16(DebugLocs.getBytes(Entry).size());
1473*9880d681SAndroid Build Coastguard Worker 
1474*9880d681SAndroid Build Coastguard Worker   // Emit the entry.
1475*9880d681SAndroid Build Coastguard Worker   APByteStreamer Streamer(*Asm);
1476*9880d681SAndroid Build Coastguard Worker   emitDebugLocEntry(Streamer, Entry);
1477*9880d681SAndroid Build Coastguard Worker }
1478*9880d681SAndroid Build Coastguard Worker 
1479*9880d681SAndroid Build Coastguard Worker // Emit locations into the debug loc section.
emitDebugLoc()1480*9880d681SAndroid Build Coastguard Worker void DwarfDebug::emitDebugLoc() {
1481*9880d681SAndroid Build Coastguard Worker   // Start the dwarf loc section.
1482*9880d681SAndroid Build Coastguard Worker   Asm->OutStreamer->SwitchSection(
1483*9880d681SAndroid Build Coastguard Worker       Asm->getObjFileLowering().getDwarfLocSection());
1484*9880d681SAndroid Build Coastguard Worker   unsigned char Size = Asm->getDataLayout().getPointerSize();
1485*9880d681SAndroid Build Coastguard Worker   for (const auto &List : DebugLocs.getLists()) {
1486*9880d681SAndroid Build Coastguard Worker     Asm->OutStreamer->EmitLabel(List.Label);
1487*9880d681SAndroid Build Coastguard Worker     const DwarfCompileUnit *CU = List.CU;
1488*9880d681SAndroid Build Coastguard Worker     for (const auto &Entry : DebugLocs.getEntries(List)) {
1489*9880d681SAndroid Build Coastguard Worker       // Set up the range. This range is relative to the entry point of the
1490*9880d681SAndroid Build Coastguard Worker       // compile unit. This is a hard coded 0 for low_pc when we're emitting
1491*9880d681SAndroid Build Coastguard Worker       // ranges, or the DW_AT_low_pc on the compile unit otherwise.
1492*9880d681SAndroid Build Coastguard Worker       if (auto *Base = CU->getBaseAddress()) {
1493*9880d681SAndroid Build Coastguard Worker         Asm->EmitLabelDifference(Entry.BeginSym, Base, Size);
1494*9880d681SAndroid Build Coastguard Worker         Asm->EmitLabelDifference(Entry.EndSym, Base, Size);
1495*9880d681SAndroid Build Coastguard Worker       } else {
1496*9880d681SAndroid Build Coastguard Worker         Asm->OutStreamer->EmitSymbolValue(Entry.BeginSym, Size);
1497*9880d681SAndroid Build Coastguard Worker         Asm->OutStreamer->EmitSymbolValue(Entry.EndSym, Size);
1498*9880d681SAndroid Build Coastguard Worker       }
1499*9880d681SAndroid Build Coastguard Worker 
1500*9880d681SAndroid Build Coastguard Worker       emitDebugLocEntryLocation(Entry);
1501*9880d681SAndroid Build Coastguard Worker     }
1502*9880d681SAndroid Build Coastguard Worker     Asm->OutStreamer->EmitIntValue(0, Size);
1503*9880d681SAndroid Build Coastguard Worker     Asm->OutStreamer->EmitIntValue(0, Size);
1504*9880d681SAndroid Build Coastguard Worker   }
1505*9880d681SAndroid Build Coastguard Worker }
1506*9880d681SAndroid Build Coastguard Worker 
emitDebugLocDWO()1507*9880d681SAndroid Build Coastguard Worker void DwarfDebug::emitDebugLocDWO() {
1508*9880d681SAndroid Build Coastguard Worker   Asm->OutStreamer->SwitchSection(
1509*9880d681SAndroid Build Coastguard Worker       Asm->getObjFileLowering().getDwarfLocDWOSection());
1510*9880d681SAndroid Build Coastguard Worker   for (const auto &List : DebugLocs.getLists()) {
1511*9880d681SAndroid Build Coastguard Worker     Asm->OutStreamer->EmitLabel(List.Label);
1512*9880d681SAndroid Build Coastguard Worker     for (const auto &Entry : DebugLocs.getEntries(List)) {
1513*9880d681SAndroid Build Coastguard Worker       // Just always use start_length for now - at least that's one address
1514*9880d681SAndroid Build Coastguard Worker       // rather than two. We could get fancier and try to, say, reuse an
1515*9880d681SAndroid Build Coastguard Worker       // address we know we've emitted elsewhere (the start of the function?
1516*9880d681SAndroid Build Coastguard Worker       // The start of the CU or CU subrange that encloses this range?)
1517*9880d681SAndroid Build Coastguard Worker       Asm->EmitInt8(dwarf::DW_LLE_start_length_entry);
1518*9880d681SAndroid Build Coastguard Worker       unsigned idx = AddrPool.getIndex(Entry.BeginSym);
1519*9880d681SAndroid Build Coastguard Worker       Asm->EmitULEB128(idx);
1520*9880d681SAndroid Build Coastguard Worker       Asm->EmitLabelDifference(Entry.EndSym, Entry.BeginSym, 4);
1521*9880d681SAndroid Build Coastguard Worker 
1522*9880d681SAndroid Build Coastguard Worker       emitDebugLocEntryLocation(Entry);
1523*9880d681SAndroid Build Coastguard Worker     }
1524*9880d681SAndroid Build Coastguard Worker     Asm->EmitInt8(dwarf::DW_LLE_end_of_list_entry);
1525*9880d681SAndroid Build Coastguard Worker   }
1526*9880d681SAndroid Build Coastguard Worker }
1527*9880d681SAndroid Build Coastguard Worker 
1528*9880d681SAndroid Build Coastguard Worker struct ArangeSpan {
1529*9880d681SAndroid Build Coastguard Worker   const MCSymbol *Start, *End;
1530*9880d681SAndroid Build Coastguard Worker };
1531*9880d681SAndroid Build Coastguard Worker 
1532*9880d681SAndroid Build Coastguard Worker // Emit a debug aranges section, containing a CU lookup for any
1533*9880d681SAndroid Build Coastguard Worker // address we can tie back to a CU.
emitDebugARanges()1534*9880d681SAndroid Build Coastguard Worker void DwarfDebug::emitDebugARanges() {
1535*9880d681SAndroid Build Coastguard Worker   // Provides a unique id per text section.
1536*9880d681SAndroid Build Coastguard Worker   MapVector<MCSection *, SmallVector<SymbolCU, 8>> SectionMap;
1537*9880d681SAndroid Build Coastguard Worker 
1538*9880d681SAndroid Build Coastguard Worker   // Filter labels by section.
1539*9880d681SAndroid Build Coastguard Worker   for (const SymbolCU &SCU : ArangeLabels) {
1540*9880d681SAndroid Build Coastguard Worker     if (SCU.Sym->isInSection()) {
1541*9880d681SAndroid Build Coastguard Worker       // Make a note of this symbol and it's section.
1542*9880d681SAndroid Build Coastguard Worker       MCSection *Section = &SCU.Sym->getSection();
1543*9880d681SAndroid Build Coastguard Worker       if (!Section->getKind().isMetadata())
1544*9880d681SAndroid Build Coastguard Worker         SectionMap[Section].push_back(SCU);
1545*9880d681SAndroid Build Coastguard Worker     } else {
1546*9880d681SAndroid Build Coastguard Worker       // Some symbols (e.g. common/bss on mach-o) can have no section but still
1547*9880d681SAndroid Build Coastguard Worker       // appear in the output. This sucks as we rely on sections to build
1548*9880d681SAndroid Build Coastguard Worker       // arange spans. We can do it without, but it's icky.
1549*9880d681SAndroid Build Coastguard Worker       SectionMap[nullptr].push_back(SCU);
1550*9880d681SAndroid Build Coastguard Worker     }
1551*9880d681SAndroid Build Coastguard Worker   }
1552*9880d681SAndroid Build Coastguard Worker 
1553*9880d681SAndroid Build Coastguard Worker   DenseMap<DwarfCompileUnit *, std::vector<ArangeSpan>> Spans;
1554*9880d681SAndroid Build Coastguard Worker 
1555*9880d681SAndroid Build Coastguard Worker   for (auto &I : SectionMap) {
1556*9880d681SAndroid Build Coastguard Worker     MCSection *Section = I.first;
1557*9880d681SAndroid Build Coastguard Worker     SmallVector<SymbolCU, 8> &List = I.second;
1558*9880d681SAndroid Build Coastguard Worker     if (List.size() < 1)
1559*9880d681SAndroid Build Coastguard Worker       continue;
1560*9880d681SAndroid Build Coastguard Worker 
1561*9880d681SAndroid Build Coastguard Worker     // If we have no section (e.g. common), just write out
1562*9880d681SAndroid Build Coastguard Worker     // individual spans for each symbol.
1563*9880d681SAndroid Build Coastguard Worker     if (!Section) {
1564*9880d681SAndroid Build Coastguard Worker       for (const SymbolCU &Cur : List) {
1565*9880d681SAndroid Build Coastguard Worker         ArangeSpan Span;
1566*9880d681SAndroid Build Coastguard Worker         Span.Start = Cur.Sym;
1567*9880d681SAndroid Build Coastguard Worker         Span.End = nullptr;
1568*9880d681SAndroid Build Coastguard Worker         assert(Cur.CU);
1569*9880d681SAndroid Build Coastguard Worker         Spans[Cur.CU].push_back(Span);
1570*9880d681SAndroid Build Coastguard Worker       }
1571*9880d681SAndroid Build Coastguard Worker       continue;
1572*9880d681SAndroid Build Coastguard Worker     }
1573*9880d681SAndroid Build Coastguard Worker 
1574*9880d681SAndroid Build Coastguard Worker     // Sort the symbols by offset within the section.
1575*9880d681SAndroid Build Coastguard Worker     std::sort(
1576*9880d681SAndroid Build Coastguard Worker         List.begin(), List.end(), [&](const SymbolCU &A, const SymbolCU &B) {
1577*9880d681SAndroid Build Coastguard Worker           unsigned IA = A.Sym ? Asm->OutStreamer->GetSymbolOrder(A.Sym) : 0;
1578*9880d681SAndroid Build Coastguard Worker           unsigned IB = B.Sym ? Asm->OutStreamer->GetSymbolOrder(B.Sym) : 0;
1579*9880d681SAndroid Build Coastguard Worker 
1580*9880d681SAndroid Build Coastguard Worker           // Symbols with no order assigned should be placed at the end.
1581*9880d681SAndroid Build Coastguard Worker           // (e.g. section end labels)
1582*9880d681SAndroid Build Coastguard Worker           if (IA == 0)
1583*9880d681SAndroid Build Coastguard Worker             return false;
1584*9880d681SAndroid Build Coastguard Worker           if (IB == 0)
1585*9880d681SAndroid Build Coastguard Worker             return true;
1586*9880d681SAndroid Build Coastguard Worker           return IA < IB;
1587*9880d681SAndroid Build Coastguard Worker         });
1588*9880d681SAndroid Build Coastguard Worker 
1589*9880d681SAndroid Build Coastguard Worker     // Insert a final terminator.
1590*9880d681SAndroid Build Coastguard Worker     List.push_back(SymbolCU(nullptr, Asm->OutStreamer->endSection(Section)));
1591*9880d681SAndroid Build Coastguard Worker 
1592*9880d681SAndroid Build Coastguard Worker     // Build spans between each label.
1593*9880d681SAndroid Build Coastguard Worker     const MCSymbol *StartSym = List[0].Sym;
1594*9880d681SAndroid Build Coastguard Worker     for (size_t n = 1, e = List.size(); n < e; n++) {
1595*9880d681SAndroid Build Coastguard Worker       const SymbolCU &Prev = List[n - 1];
1596*9880d681SAndroid Build Coastguard Worker       const SymbolCU &Cur = List[n];
1597*9880d681SAndroid Build Coastguard Worker 
1598*9880d681SAndroid Build Coastguard Worker       // Try and build the longest span we can within the same CU.
1599*9880d681SAndroid Build Coastguard Worker       if (Cur.CU != Prev.CU) {
1600*9880d681SAndroid Build Coastguard Worker         ArangeSpan Span;
1601*9880d681SAndroid Build Coastguard Worker         Span.Start = StartSym;
1602*9880d681SAndroid Build Coastguard Worker         Span.End = Cur.Sym;
1603*9880d681SAndroid Build Coastguard Worker         assert(Prev.CU);
1604*9880d681SAndroid Build Coastguard Worker         Spans[Prev.CU].push_back(Span);
1605*9880d681SAndroid Build Coastguard Worker         StartSym = Cur.Sym;
1606*9880d681SAndroid Build Coastguard Worker       }
1607*9880d681SAndroid Build Coastguard Worker     }
1608*9880d681SAndroid Build Coastguard Worker   }
1609*9880d681SAndroid Build Coastguard Worker 
1610*9880d681SAndroid Build Coastguard Worker   // Start the dwarf aranges section.
1611*9880d681SAndroid Build Coastguard Worker   Asm->OutStreamer->SwitchSection(
1612*9880d681SAndroid Build Coastguard Worker       Asm->getObjFileLowering().getDwarfARangesSection());
1613*9880d681SAndroid Build Coastguard Worker 
1614*9880d681SAndroid Build Coastguard Worker   unsigned PtrSize = Asm->getDataLayout().getPointerSize();
1615*9880d681SAndroid Build Coastguard Worker 
1616*9880d681SAndroid Build Coastguard Worker   // Build a list of CUs used.
1617*9880d681SAndroid Build Coastguard Worker   std::vector<DwarfCompileUnit *> CUs;
1618*9880d681SAndroid Build Coastguard Worker   for (const auto &it : Spans) {
1619*9880d681SAndroid Build Coastguard Worker     DwarfCompileUnit *CU = it.first;
1620*9880d681SAndroid Build Coastguard Worker     CUs.push_back(CU);
1621*9880d681SAndroid Build Coastguard Worker   }
1622*9880d681SAndroid Build Coastguard Worker 
1623*9880d681SAndroid Build Coastguard Worker   // Sort the CU list (again, to ensure consistent output order).
1624*9880d681SAndroid Build Coastguard Worker   std::sort(CUs.begin(), CUs.end(),
1625*9880d681SAndroid Build Coastguard Worker             [](const DwarfCompileUnit *A, const DwarfCompileUnit *B) {
1626*9880d681SAndroid Build Coastguard Worker               return A->getUniqueID() < B->getUniqueID();
1627*9880d681SAndroid Build Coastguard Worker             });
1628*9880d681SAndroid Build Coastguard Worker 
1629*9880d681SAndroid Build Coastguard Worker   // Emit an arange table for each CU we used.
1630*9880d681SAndroid Build Coastguard Worker   for (DwarfCompileUnit *CU : CUs) {
1631*9880d681SAndroid Build Coastguard Worker     std::vector<ArangeSpan> &List = Spans[CU];
1632*9880d681SAndroid Build Coastguard Worker 
1633*9880d681SAndroid Build Coastguard Worker     // Describe the skeleton CU's offset and length, not the dwo file's.
1634*9880d681SAndroid Build Coastguard Worker     if (auto *Skel = CU->getSkeleton())
1635*9880d681SAndroid Build Coastguard Worker       CU = Skel;
1636*9880d681SAndroid Build Coastguard Worker 
1637*9880d681SAndroid Build Coastguard Worker     // Emit size of content not including length itself.
1638*9880d681SAndroid Build Coastguard Worker     unsigned ContentSize =
1639*9880d681SAndroid Build Coastguard Worker         sizeof(int16_t) + // DWARF ARange version number
1640*9880d681SAndroid Build Coastguard Worker         sizeof(int32_t) + // Offset of CU in the .debug_info section
1641*9880d681SAndroid Build Coastguard Worker         sizeof(int8_t) +  // Pointer Size (in bytes)
1642*9880d681SAndroid Build Coastguard Worker         sizeof(int8_t);   // Segment Size (in bytes)
1643*9880d681SAndroid Build Coastguard Worker 
1644*9880d681SAndroid Build Coastguard Worker     unsigned TupleSize = PtrSize * 2;
1645*9880d681SAndroid Build Coastguard Worker 
1646*9880d681SAndroid Build Coastguard Worker     // 7.20 in the Dwarf specs requires the table to be aligned to a tuple.
1647*9880d681SAndroid Build Coastguard Worker     unsigned Padding =
1648*9880d681SAndroid Build Coastguard Worker         OffsetToAlignment(sizeof(int32_t) + ContentSize, TupleSize);
1649*9880d681SAndroid Build Coastguard Worker 
1650*9880d681SAndroid Build Coastguard Worker     ContentSize += Padding;
1651*9880d681SAndroid Build Coastguard Worker     ContentSize += (List.size() + 1) * TupleSize;
1652*9880d681SAndroid Build Coastguard Worker 
1653*9880d681SAndroid Build Coastguard Worker     // For each compile unit, write the list of spans it covers.
1654*9880d681SAndroid Build Coastguard Worker     Asm->OutStreamer->AddComment("Length of ARange Set");
1655*9880d681SAndroid Build Coastguard Worker     Asm->EmitInt32(ContentSize);
1656*9880d681SAndroid Build Coastguard Worker     Asm->OutStreamer->AddComment("DWARF Arange version number");
1657*9880d681SAndroid Build Coastguard Worker     Asm->EmitInt16(dwarf::DW_ARANGES_VERSION);
1658*9880d681SAndroid Build Coastguard Worker     Asm->OutStreamer->AddComment("Offset Into Debug Info Section");
1659*9880d681SAndroid Build Coastguard Worker     Asm->emitDwarfSymbolReference(CU->getLabelBegin());
1660*9880d681SAndroid Build Coastguard Worker     Asm->OutStreamer->AddComment("Address Size (in bytes)");
1661*9880d681SAndroid Build Coastguard Worker     Asm->EmitInt8(PtrSize);
1662*9880d681SAndroid Build Coastguard Worker     Asm->OutStreamer->AddComment("Segment Size (in bytes)");
1663*9880d681SAndroid Build Coastguard Worker     Asm->EmitInt8(0);
1664*9880d681SAndroid Build Coastguard Worker 
1665*9880d681SAndroid Build Coastguard Worker     Asm->OutStreamer->emitFill(Padding, 0xff);
1666*9880d681SAndroid Build Coastguard Worker 
1667*9880d681SAndroid Build Coastguard Worker     for (const ArangeSpan &Span : List) {
1668*9880d681SAndroid Build Coastguard Worker       Asm->EmitLabelReference(Span.Start, PtrSize);
1669*9880d681SAndroid Build Coastguard Worker 
1670*9880d681SAndroid Build Coastguard Worker       // Calculate the size as being from the span start to it's end.
1671*9880d681SAndroid Build Coastguard Worker       if (Span.End) {
1672*9880d681SAndroid Build Coastguard Worker         Asm->EmitLabelDifference(Span.End, Span.Start, PtrSize);
1673*9880d681SAndroid Build Coastguard Worker       } else {
1674*9880d681SAndroid Build Coastguard Worker         // For symbols without an end marker (e.g. common), we
1675*9880d681SAndroid Build Coastguard Worker         // write a single arange entry containing just that one symbol.
1676*9880d681SAndroid Build Coastguard Worker         uint64_t Size = SymSize[Span.Start];
1677*9880d681SAndroid Build Coastguard Worker         if (Size == 0)
1678*9880d681SAndroid Build Coastguard Worker           Size = 1;
1679*9880d681SAndroid Build Coastguard Worker 
1680*9880d681SAndroid Build Coastguard Worker         Asm->OutStreamer->EmitIntValue(Size, PtrSize);
1681*9880d681SAndroid Build Coastguard Worker       }
1682*9880d681SAndroid Build Coastguard Worker     }
1683*9880d681SAndroid Build Coastguard Worker 
1684*9880d681SAndroid Build Coastguard Worker     Asm->OutStreamer->AddComment("ARange terminator");
1685*9880d681SAndroid Build Coastguard Worker     Asm->OutStreamer->EmitIntValue(0, PtrSize);
1686*9880d681SAndroid Build Coastguard Worker     Asm->OutStreamer->EmitIntValue(0, PtrSize);
1687*9880d681SAndroid Build Coastguard Worker   }
1688*9880d681SAndroid Build Coastguard Worker }
1689*9880d681SAndroid Build Coastguard Worker 
1690*9880d681SAndroid Build Coastguard Worker /// Emit address ranges into a debug ranges section.
emitDebugRanges()1691*9880d681SAndroid Build Coastguard Worker void DwarfDebug::emitDebugRanges() {
1692*9880d681SAndroid Build Coastguard Worker   // Start the dwarf ranges section.
1693*9880d681SAndroid Build Coastguard Worker   Asm->OutStreamer->SwitchSection(
1694*9880d681SAndroid Build Coastguard Worker       Asm->getObjFileLowering().getDwarfRangesSection());
1695*9880d681SAndroid Build Coastguard Worker 
1696*9880d681SAndroid Build Coastguard Worker   // Size for our labels.
1697*9880d681SAndroid Build Coastguard Worker   unsigned char Size = Asm->getDataLayout().getPointerSize();
1698*9880d681SAndroid Build Coastguard Worker 
1699*9880d681SAndroid Build Coastguard Worker   // Grab the specific ranges for the compile units in the module.
1700*9880d681SAndroid Build Coastguard Worker   for (const auto &I : CUMap) {
1701*9880d681SAndroid Build Coastguard Worker     DwarfCompileUnit *TheCU = I.second;
1702*9880d681SAndroid Build Coastguard Worker 
1703*9880d681SAndroid Build Coastguard Worker     if (auto *Skel = TheCU->getSkeleton())
1704*9880d681SAndroid Build Coastguard Worker       TheCU = Skel;
1705*9880d681SAndroid Build Coastguard Worker 
1706*9880d681SAndroid Build Coastguard Worker     // Iterate over the misc ranges for the compile units in the module.
1707*9880d681SAndroid Build Coastguard Worker     for (const RangeSpanList &List : TheCU->getRangeLists()) {
1708*9880d681SAndroid Build Coastguard Worker       // Emit our symbol so we can find the beginning of the range.
1709*9880d681SAndroid Build Coastguard Worker       Asm->OutStreamer->EmitLabel(List.getSym());
1710*9880d681SAndroid Build Coastguard Worker 
1711*9880d681SAndroid Build Coastguard Worker       for (const RangeSpan &Range : List.getRanges()) {
1712*9880d681SAndroid Build Coastguard Worker         const MCSymbol *Begin = Range.getStart();
1713*9880d681SAndroid Build Coastguard Worker         const MCSymbol *End = Range.getEnd();
1714*9880d681SAndroid Build Coastguard Worker         assert(Begin && "Range without a begin symbol?");
1715*9880d681SAndroid Build Coastguard Worker         assert(End && "Range without an end symbol?");
1716*9880d681SAndroid Build Coastguard Worker         if (auto *Base = TheCU->getBaseAddress()) {
1717*9880d681SAndroid Build Coastguard Worker           Asm->EmitLabelDifference(Begin, Base, Size);
1718*9880d681SAndroid Build Coastguard Worker           Asm->EmitLabelDifference(End, Base, Size);
1719*9880d681SAndroid Build Coastguard Worker         } else {
1720*9880d681SAndroid Build Coastguard Worker           Asm->OutStreamer->EmitSymbolValue(Begin, Size);
1721*9880d681SAndroid Build Coastguard Worker           Asm->OutStreamer->EmitSymbolValue(End, Size);
1722*9880d681SAndroid Build Coastguard Worker         }
1723*9880d681SAndroid Build Coastguard Worker       }
1724*9880d681SAndroid Build Coastguard Worker 
1725*9880d681SAndroid Build Coastguard Worker       // And terminate the list with two 0 values.
1726*9880d681SAndroid Build Coastguard Worker       Asm->OutStreamer->EmitIntValue(0, Size);
1727*9880d681SAndroid Build Coastguard Worker       Asm->OutStreamer->EmitIntValue(0, Size);
1728*9880d681SAndroid Build Coastguard Worker     }
1729*9880d681SAndroid Build Coastguard Worker   }
1730*9880d681SAndroid Build Coastguard Worker }
1731*9880d681SAndroid Build Coastguard Worker 
handleMacroNodes(DIMacroNodeArray Nodes,DwarfCompileUnit & U)1732*9880d681SAndroid Build Coastguard Worker void DwarfDebug::handleMacroNodes(DIMacroNodeArray Nodes, DwarfCompileUnit &U) {
1733*9880d681SAndroid Build Coastguard Worker   for (auto *MN : Nodes) {
1734*9880d681SAndroid Build Coastguard Worker     if (auto *M = dyn_cast<DIMacro>(MN))
1735*9880d681SAndroid Build Coastguard Worker       emitMacro(*M);
1736*9880d681SAndroid Build Coastguard Worker     else if (auto *F = dyn_cast<DIMacroFile>(MN))
1737*9880d681SAndroid Build Coastguard Worker       emitMacroFile(*F, U);
1738*9880d681SAndroid Build Coastguard Worker     else
1739*9880d681SAndroid Build Coastguard Worker       llvm_unreachable("Unexpected DI type!");
1740*9880d681SAndroid Build Coastguard Worker   }
1741*9880d681SAndroid Build Coastguard Worker }
1742*9880d681SAndroid Build Coastguard Worker 
emitMacro(DIMacro & M)1743*9880d681SAndroid Build Coastguard Worker void DwarfDebug::emitMacro(DIMacro &M) {
1744*9880d681SAndroid Build Coastguard Worker   Asm->EmitULEB128(M.getMacinfoType());
1745*9880d681SAndroid Build Coastguard Worker   Asm->EmitULEB128(M.getLine());
1746*9880d681SAndroid Build Coastguard Worker   StringRef Name = M.getName();
1747*9880d681SAndroid Build Coastguard Worker   StringRef Value = M.getValue();
1748*9880d681SAndroid Build Coastguard Worker   Asm->OutStreamer->EmitBytes(Name);
1749*9880d681SAndroid Build Coastguard Worker   if (!Value.empty()) {
1750*9880d681SAndroid Build Coastguard Worker     // There should be one space between macro name and macro value.
1751*9880d681SAndroid Build Coastguard Worker     Asm->EmitInt8(' ');
1752*9880d681SAndroid Build Coastguard Worker     Asm->OutStreamer->EmitBytes(Value);
1753*9880d681SAndroid Build Coastguard Worker   }
1754*9880d681SAndroid Build Coastguard Worker   Asm->EmitInt8('\0');
1755*9880d681SAndroid Build Coastguard Worker }
1756*9880d681SAndroid Build Coastguard Worker 
emitMacroFile(DIMacroFile & F,DwarfCompileUnit & U)1757*9880d681SAndroid Build Coastguard Worker void DwarfDebug::emitMacroFile(DIMacroFile &F, DwarfCompileUnit &U) {
1758*9880d681SAndroid Build Coastguard Worker   assert(F.getMacinfoType() == dwarf::DW_MACINFO_start_file);
1759*9880d681SAndroid Build Coastguard Worker   Asm->EmitULEB128(dwarf::DW_MACINFO_start_file);
1760*9880d681SAndroid Build Coastguard Worker   Asm->EmitULEB128(F.getLine());
1761*9880d681SAndroid Build Coastguard Worker   DIFile *File = F.getFile();
1762*9880d681SAndroid Build Coastguard Worker   unsigned FID =
1763*9880d681SAndroid Build Coastguard Worker       U.getOrCreateSourceID(File->getFilename(), File->getDirectory());
1764*9880d681SAndroid Build Coastguard Worker   Asm->EmitULEB128(FID);
1765*9880d681SAndroid Build Coastguard Worker   handleMacroNodes(F.getElements(), U);
1766*9880d681SAndroid Build Coastguard Worker   Asm->EmitULEB128(dwarf::DW_MACINFO_end_file);
1767*9880d681SAndroid Build Coastguard Worker }
1768*9880d681SAndroid Build Coastguard Worker 
1769*9880d681SAndroid Build Coastguard Worker /// Emit macros into a debug macinfo section.
emitDebugMacinfo()1770*9880d681SAndroid Build Coastguard Worker void DwarfDebug::emitDebugMacinfo() {
1771*9880d681SAndroid Build Coastguard Worker   // Start the dwarf macinfo section.
1772*9880d681SAndroid Build Coastguard Worker   Asm->OutStreamer->SwitchSection(
1773*9880d681SAndroid Build Coastguard Worker       Asm->getObjFileLowering().getDwarfMacinfoSection());
1774*9880d681SAndroid Build Coastguard Worker 
1775*9880d681SAndroid Build Coastguard Worker   for (const auto &P : CUMap) {
1776*9880d681SAndroid Build Coastguard Worker     auto &TheCU = *P.second;
1777*9880d681SAndroid Build Coastguard Worker     auto *SkCU = TheCU.getSkeleton();
1778*9880d681SAndroid Build Coastguard Worker     DwarfCompileUnit &U = SkCU ? *SkCU : TheCU;
1779*9880d681SAndroid Build Coastguard Worker     auto *CUNode = cast<DICompileUnit>(P.first);
1780*9880d681SAndroid Build Coastguard Worker     Asm->OutStreamer->EmitLabel(U.getMacroLabelBegin());
1781*9880d681SAndroid Build Coastguard Worker     handleMacroNodes(CUNode->getMacros(), U);
1782*9880d681SAndroid Build Coastguard Worker   }
1783*9880d681SAndroid Build Coastguard Worker   Asm->OutStreamer->AddComment("End Of Macro List Mark");
1784*9880d681SAndroid Build Coastguard Worker   Asm->EmitInt8(0);
1785*9880d681SAndroid Build Coastguard Worker }
1786*9880d681SAndroid Build Coastguard Worker 
1787*9880d681SAndroid Build Coastguard Worker // DWARF5 Experimental Separate Dwarf emitters.
1788*9880d681SAndroid Build Coastguard Worker 
initSkeletonUnit(const DwarfUnit & U,DIE & Die,std::unique_ptr<DwarfCompileUnit> NewU)1789*9880d681SAndroid Build Coastguard Worker void DwarfDebug::initSkeletonUnit(const DwarfUnit &U, DIE &Die,
1790*9880d681SAndroid Build Coastguard Worker                                   std::unique_ptr<DwarfCompileUnit> NewU) {
1791*9880d681SAndroid Build Coastguard Worker   NewU->addString(Die, dwarf::DW_AT_GNU_dwo_name,
1792*9880d681SAndroid Build Coastguard Worker                   U.getCUNode()->getSplitDebugFilename());
1793*9880d681SAndroid Build Coastguard Worker 
1794*9880d681SAndroid Build Coastguard Worker   if (!CompilationDir.empty())
1795*9880d681SAndroid Build Coastguard Worker     NewU->addString(Die, dwarf::DW_AT_comp_dir, CompilationDir);
1796*9880d681SAndroid Build Coastguard Worker 
1797*9880d681SAndroid Build Coastguard Worker   addGnuPubAttributes(*NewU, Die);
1798*9880d681SAndroid Build Coastguard Worker 
1799*9880d681SAndroid Build Coastguard Worker   SkeletonHolder.addUnit(std::move(NewU));
1800*9880d681SAndroid Build Coastguard Worker }
1801*9880d681SAndroid Build Coastguard Worker 
1802*9880d681SAndroid Build Coastguard Worker // This DIE has the following attributes: DW_AT_comp_dir, DW_AT_stmt_list,
1803*9880d681SAndroid Build Coastguard Worker // DW_AT_low_pc, DW_AT_high_pc, DW_AT_ranges, DW_AT_dwo_name, DW_AT_dwo_id,
1804*9880d681SAndroid Build Coastguard Worker // DW_AT_addr_base, DW_AT_ranges_base.
constructSkeletonCU(const DwarfCompileUnit & CU)1805*9880d681SAndroid Build Coastguard Worker DwarfCompileUnit &DwarfDebug::constructSkeletonCU(const DwarfCompileUnit &CU) {
1806*9880d681SAndroid Build Coastguard Worker 
1807*9880d681SAndroid Build Coastguard Worker   auto OwnedUnit = make_unique<DwarfCompileUnit>(
1808*9880d681SAndroid Build Coastguard Worker       CU.getUniqueID(), CU.getCUNode(), Asm, this, &SkeletonHolder);
1809*9880d681SAndroid Build Coastguard Worker   DwarfCompileUnit &NewCU = *OwnedUnit;
1810*9880d681SAndroid Build Coastguard Worker   NewCU.initSection(Asm->getObjFileLowering().getDwarfInfoSection());
1811*9880d681SAndroid Build Coastguard Worker 
1812*9880d681SAndroid Build Coastguard Worker   NewCU.initStmtList();
1813*9880d681SAndroid Build Coastguard Worker 
1814*9880d681SAndroid Build Coastguard Worker   initSkeletonUnit(CU, NewCU.getUnitDie(), std::move(OwnedUnit));
1815*9880d681SAndroid Build Coastguard Worker 
1816*9880d681SAndroid Build Coastguard Worker   return NewCU;
1817*9880d681SAndroid Build Coastguard Worker }
1818*9880d681SAndroid Build Coastguard Worker 
1819*9880d681SAndroid Build Coastguard Worker // Emit the .debug_info.dwo section for separated dwarf. This contains the
1820*9880d681SAndroid Build Coastguard Worker // compile units that would normally be in debug_info.
emitDebugInfoDWO()1821*9880d681SAndroid Build Coastguard Worker void DwarfDebug::emitDebugInfoDWO() {
1822*9880d681SAndroid Build Coastguard Worker   assert(useSplitDwarf() && "No split dwarf debug info?");
1823*9880d681SAndroid Build Coastguard Worker   // Don't emit relocations into the dwo file.
1824*9880d681SAndroid Build Coastguard Worker   InfoHolder.emitUnits(/* UseOffsets */ true);
1825*9880d681SAndroid Build Coastguard Worker }
1826*9880d681SAndroid Build Coastguard Worker 
1827*9880d681SAndroid Build Coastguard Worker // Emit the .debug_abbrev.dwo section for separated dwarf. This contains the
1828*9880d681SAndroid Build Coastguard Worker // abbreviations for the .debug_info.dwo section.
emitDebugAbbrevDWO()1829*9880d681SAndroid Build Coastguard Worker void DwarfDebug::emitDebugAbbrevDWO() {
1830*9880d681SAndroid Build Coastguard Worker   assert(useSplitDwarf() && "No split dwarf?");
1831*9880d681SAndroid Build Coastguard Worker   InfoHolder.emitAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevDWOSection());
1832*9880d681SAndroid Build Coastguard Worker }
1833*9880d681SAndroid Build Coastguard Worker 
emitDebugLineDWO()1834*9880d681SAndroid Build Coastguard Worker void DwarfDebug::emitDebugLineDWO() {
1835*9880d681SAndroid Build Coastguard Worker   assert(useSplitDwarf() && "No split dwarf?");
1836*9880d681SAndroid Build Coastguard Worker   Asm->OutStreamer->SwitchSection(
1837*9880d681SAndroid Build Coastguard Worker       Asm->getObjFileLowering().getDwarfLineDWOSection());
1838*9880d681SAndroid Build Coastguard Worker   SplitTypeUnitFileTable.Emit(*Asm->OutStreamer, MCDwarfLineTableParams());
1839*9880d681SAndroid Build Coastguard Worker }
1840*9880d681SAndroid Build Coastguard Worker 
1841*9880d681SAndroid Build Coastguard Worker // Emit the .debug_str.dwo section for separated dwarf. This contains the
1842*9880d681SAndroid Build Coastguard Worker // string section and is identical in format to traditional .debug_str
1843*9880d681SAndroid Build Coastguard Worker // sections.
emitDebugStrDWO()1844*9880d681SAndroid Build Coastguard Worker void DwarfDebug::emitDebugStrDWO() {
1845*9880d681SAndroid Build Coastguard Worker   assert(useSplitDwarf() && "No split dwarf?");
1846*9880d681SAndroid Build Coastguard Worker   MCSection *OffSec = Asm->getObjFileLowering().getDwarfStrOffDWOSection();
1847*9880d681SAndroid Build Coastguard Worker   InfoHolder.emitStrings(Asm->getObjFileLowering().getDwarfStrDWOSection(),
1848*9880d681SAndroid Build Coastguard Worker                          OffSec);
1849*9880d681SAndroid Build Coastguard Worker }
1850*9880d681SAndroid Build Coastguard Worker 
getDwoLineTable(const DwarfCompileUnit & CU)1851*9880d681SAndroid Build Coastguard Worker MCDwarfDwoLineTable *DwarfDebug::getDwoLineTable(const DwarfCompileUnit &CU) {
1852*9880d681SAndroid Build Coastguard Worker   if (!useSplitDwarf())
1853*9880d681SAndroid Build Coastguard Worker     return nullptr;
1854*9880d681SAndroid Build Coastguard Worker   if (SingleCU)
1855*9880d681SAndroid Build Coastguard Worker     SplitTypeUnitFileTable.setCompilationDir(CU.getCUNode()->getDirectory());
1856*9880d681SAndroid Build Coastguard Worker   return &SplitTypeUnitFileTable;
1857*9880d681SAndroid Build Coastguard Worker }
1858*9880d681SAndroid Build Coastguard Worker 
makeTypeSignature(StringRef Identifier)1859*9880d681SAndroid Build Coastguard Worker uint64_t DwarfDebug::makeTypeSignature(StringRef Identifier) {
1860*9880d681SAndroid Build Coastguard Worker   MD5 Hash;
1861*9880d681SAndroid Build Coastguard Worker   Hash.update(Identifier);
1862*9880d681SAndroid Build Coastguard Worker   // ... take the least significant 8 bytes and return those. Our MD5
1863*9880d681SAndroid Build Coastguard Worker   // implementation always returns its results in little endian, swap bytes
1864*9880d681SAndroid Build Coastguard Worker   // appropriately.
1865*9880d681SAndroid Build Coastguard Worker   MD5::MD5Result Result;
1866*9880d681SAndroid Build Coastguard Worker   Hash.final(Result);
1867*9880d681SAndroid Build Coastguard Worker   return support::endian::read64le(Result + 8);
1868*9880d681SAndroid Build Coastguard Worker }
1869*9880d681SAndroid Build Coastguard Worker 
addDwarfTypeUnitType(DwarfCompileUnit & CU,StringRef Identifier,DIE & RefDie,const DICompositeType * CTy)1870*9880d681SAndroid Build Coastguard Worker void DwarfDebug::addDwarfTypeUnitType(DwarfCompileUnit &CU,
1871*9880d681SAndroid Build Coastguard Worker                                       StringRef Identifier, DIE &RefDie,
1872*9880d681SAndroid Build Coastguard Worker                                       const DICompositeType *CTy) {
1873*9880d681SAndroid Build Coastguard Worker   // Fast path if we're building some type units and one has already used the
1874*9880d681SAndroid Build Coastguard Worker   // address pool we know we're going to throw away all this work anyway, so
1875*9880d681SAndroid Build Coastguard Worker   // don't bother building dependent types.
1876*9880d681SAndroid Build Coastguard Worker   if (!TypeUnitsUnderConstruction.empty() && AddrPool.hasBeenUsed())
1877*9880d681SAndroid Build Coastguard Worker     return;
1878*9880d681SAndroid Build Coastguard Worker 
1879*9880d681SAndroid Build Coastguard Worker   auto Ins = TypeSignatures.insert(std::make_pair(CTy, 0));
1880*9880d681SAndroid Build Coastguard Worker   if (!Ins.second) {
1881*9880d681SAndroid Build Coastguard Worker     CU.addDIETypeSignature(RefDie, Ins.first->second);
1882*9880d681SAndroid Build Coastguard Worker     return;
1883*9880d681SAndroid Build Coastguard Worker   }
1884*9880d681SAndroid Build Coastguard Worker 
1885*9880d681SAndroid Build Coastguard Worker   bool TopLevelType = TypeUnitsUnderConstruction.empty();
1886*9880d681SAndroid Build Coastguard Worker   AddrPool.resetUsedFlag();
1887*9880d681SAndroid Build Coastguard Worker 
1888*9880d681SAndroid Build Coastguard Worker   auto OwnedUnit = make_unique<DwarfTypeUnit>(CU, Asm, this, &InfoHolder,
1889*9880d681SAndroid Build Coastguard Worker                                               getDwoLineTable(CU));
1890*9880d681SAndroid Build Coastguard Worker   DwarfTypeUnit &NewTU = *OwnedUnit;
1891*9880d681SAndroid Build Coastguard Worker   DIE &UnitDie = NewTU.getUnitDie();
1892*9880d681SAndroid Build Coastguard Worker   TypeUnitsUnderConstruction.push_back(
1893*9880d681SAndroid Build Coastguard Worker       std::make_pair(std::move(OwnedUnit), CTy));
1894*9880d681SAndroid Build Coastguard Worker 
1895*9880d681SAndroid Build Coastguard Worker   NewTU.addUInt(UnitDie, dwarf::DW_AT_language, dwarf::DW_FORM_data2,
1896*9880d681SAndroid Build Coastguard Worker                 CU.getLanguage());
1897*9880d681SAndroid Build Coastguard Worker 
1898*9880d681SAndroid Build Coastguard Worker   uint64_t Signature = makeTypeSignature(Identifier);
1899*9880d681SAndroid Build Coastguard Worker   NewTU.setTypeSignature(Signature);
1900*9880d681SAndroid Build Coastguard Worker   Ins.first->second = Signature;
1901*9880d681SAndroid Build Coastguard Worker 
1902*9880d681SAndroid Build Coastguard Worker   if (useSplitDwarf())
1903*9880d681SAndroid Build Coastguard Worker     NewTU.initSection(Asm->getObjFileLowering().getDwarfTypesDWOSection());
1904*9880d681SAndroid Build Coastguard Worker   else {
1905*9880d681SAndroid Build Coastguard Worker     CU.applyStmtList(UnitDie);
1906*9880d681SAndroid Build Coastguard Worker     NewTU.initSection(
1907*9880d681SAndroid Build Coastguard Worker         Asm->getObjFileLowering().getDwarfTypesSection(Signature));
1908*9880d681SAndroid Build Coastguard Worker   }
1909*9880d681SAndroid Build Coastguard Worker 
1910*9880d681SAndroid Build Coastguard Worker   NewTU.setType(NewTU.createTypeDIE(CTy));
1911*9880d681SAndroid Build Coastguard Worker 
1912*9880d681SAndroid Build Coastguard Worker   if (TopLevelType) {
1913*9880d681SAndroid Build Coastguard Worker     auto TypeUnitsToAdd = std::move(TypeUnitsUnderConstruction);
1914*9880d681SAndroid Build Coastguard Worker     TypeUnitsUnderConstruction.clear();
1915*9880d681SAndroid Build Coastguard Worker 
1916*9880d681SAndroid Build Coastguard Worker     // Types referencing entries in the address table cannot be placed in type
1917*9880d681SAndroid Build Coastguard Worker     // units.
1918*9880d681SAndroid Build Coastguard Worker     if (AddrPool.hasBeenUsed()) {
1919*9880d681SAndroid Build Coastguard Worker 
1920*9880d681SAndroid Build Coastguard Worker       // Remove all the types built while building this type.
1921*9880d681SAndroid Build Coastguard Worker       // This is pessimistic as some of these types might not be dependent on
1922*9880d681SAndroid Build Coastguard Worker       // the type that used an address.
1923*9880d681SAndroid Build Coastguard Worker       for (const auto &TU : TypeUnitsToAdd)
1924*9880d681SAndroid Build Coastguard Worker         TypeSignatures.erase(TU.second);
1925*9880d681SAndroid Build Coastguard Worker 
1926*9880d681SAndroid Build Coastguard Worker       // Construct this type in the CU directly.
1927*9880d681SAndroid Build Coastguard Worker       // This is inefficient because all the dependent types will be rebuilt
1928*9880d681SAndroid Build Coastguard Worker       // from scratch, including building them in type units, discovering that
1929*9880d681SAndroid Build Coastguard Worker       // they depend on addresses, throwing them out and rebuilding them.
1930*9880d681SAndroid Build Coastguard Worker       CU.constructTypeDIE(RefDie, cast<DICompositeType>(CTy));
1931*9880d681SAndroid Build Coastguard Worker       return;
1932*9880d681SAndroid Build Coastguard Worker     }
1933*9880d681SAndroid Build Coastguard Worker 
1934*9880d681SAndroid Build Coastguard Worker     // If the type wasn't dependent on fission addresses, finish adding the type
1935*9880d681SAndroid Build Coastguard Worker     // and all its dependent types.
1936*9880d681SAndroid Build Coastguard Worker     for (auto &TU : TypeUnitsToAdd) {
1937*9880d681SAndroid Build Coastguard Worker       InfoHolder.computeSizeAndOffsetsForUnit(TU.first.get());
1938*9880d681SAndroid Build Coastguard Worker       InfoHolder.emitUnit(TU.first.get(), useSplitDwarf());
1939*9880d681SAndroid Build Coastguard Worker     }
1940*9880d681SAndroid Build Coastguard Worker   }
1941*9880d681SAndroid Build Coastguard Worker   CU.addDIETypeSignature(RefDie, Signature);
1942*9880d681SAndroid Build Coastguard Worker }
1943*9880d681SAndroid Build Coastguard Worker 
1944*9880d681SAndroid Build Coastguard Worker // Accelerator table mutators - add each name along with its companion
1945*9880d681SAndroid Build Coastguard Worker // DIE to the proper table while ensuring that the name that we're going
1946*9880d681SAndroid Build Coastguard Worker // to reference is in the string table. We do this since the names we
1947*9880d681SAndroid Build Coastguard Worker // add may not only be identical to the names in the DIE.
addAccelName(StringRef Name,const DIE & Die)1948*9880d681SAndroid Build Coastguard Worker void DwarfDebug::addAccelName(StringRef Name, const DIE &Die) {
1949*9880d681SAndroid Build Coastguard Worker   if (!useDwarfAccelTables())
1950*9880d681SAndroid Build Coastguard Worker     return;
1951*9880d681SAndroid Build Coastguard Worker   AccelNames.AddName(InfoHolder.getStringPool().getEntry(*Asm, Name), &Die);
1952*9880d681SAndroid Build Coastguard Worker }
1953*9880d681SAndroid Build Coastguard Worker 
addAccelObjC(StringRef Name,const DIE & Die)1954*9880d681SAndroid Build Coastguard Worker void DwarfDebug::addAccelObjC(StringRef Name, const DIE &Die) {
1955*9880d681SAndroid Build Coastguard Worker   if (!useDwarfAccelTables())
1956*9880d681SAndroid Build Coastguard Worker     return;
1957*9880d681SAndroid Build Coastguard Worker   AccelObjC.AddName(InfoHolder.getStringPool().getEntry(*Asm, Name), &Die);
1958*9880d681SAndroid Build Coastguard Worker }
1959*9880d681SAndroid Build Coastguard Worker 
addAccelNamespace(StringRef Name,const DIE & Die)1960*9880d681SAndroid Build Coastguard Worker void DwarfDebug::addAccelNamespace(StringRef Name, const DIE &Die) {
1961*9880d681SAndroid Build Coastguard Worker   if (!useDwarfAccelTables())
1962*9880d681SAndroid Build Coastguard Worker     return;
1963*9880d681SAndroid Build Coastguard Worker   AccelNamespace.AddName(InfoHolder.getStringPool().getEntry(*Asm, Name), &Die);
1964*9880d681SAndroid Build Coastguard Worker }
1965*9880d681SAndroid Build Coastguard Worker 
addAccelType(StringRef Name,const DIE & Die,char Flags)1966*9880d681SAndroid Build Coastguard Worker void DwarfDebug::addAccelType(StringRef Name, const DIE &Die, char Flags) {
1967*9880d681SAndroid Build Coastguard Worker   if (!useDwarfAccelTables())
1968*9880d681SAndroid Build Coastguard Worker     return;
1969*9880d681SAndroid Build Coastguard Worker   AccelTypes.AddName(InfoHolder.getStringPool().getEntry(*Asm, Name), &Die);
1970*9880d681SAndroid Build Coastguard Worker }
1971