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