blob: 01980e6f5edaf4656db4317503b4b37d88595d8e [file] [log] [blame]
Bill Wendling0310d762009-05-15 09:23:25 +00001//===-- llvm/CodeGen/DwarfDebug.cpp - Dwarf Debug Framework ---------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file contains support for writing dwarf debug info into asm files.
11//
12//===----------------------------------------------------------------------===//
Chris Lattner6cde3e62010-03-09 00:39:24 +000013
Devang Patele4b27562009-08-28 23:24:31 +000014#define DEBUG_TYPE "dwarfdebug"
Bill Wendling0310d762009-05-15 09:23:25 +000015#include "DwarfDebug.h"
Chris Lattner74e41f92010-04-05 05:24:55 +000016#include "DIE.h"
Eric Christopher0d27ca12013-08-08 23:45:55 +000017#include "DIEHash.h"
Eric Christopher09ac3d82011-11-07 09:24:32 +000018#include "DwarfAccelTable.h"
Devang Patel8b9df622011-04-12 17:40:32 +000019#include "DwarfCompileUnit.h"
Chandler Carruthd04a8d42012-12-03 16:50:05 +000020#include "llvm/ADT/STLExtras.h"
21#include "llvm/ADT/Statistic.h"
22#include "llvm/ADT/StringExtras.h"
23#include "llvm/ADT/Triple.h"
David Greeneb2c66fc2009-08-19 21:52:55 +000024#include "llvm/CodeGen/MachineFunction.h"
Bill Wendling0310d762009-05-15 09:23:25 +000025#include "llvm/CodeGen/MachineModuleInfo.h"
Chandler Carruthd04a8d42012-12-03 16:50:05 +000026#include "llvm/DIBuilder.h"
Chandler Carruthd04a8d42012-12-03 16:50:05 +000027#include "llvm/DebugInfo.h"
Chandler Carruth0b8c9a82013-01-02 11:36:10 +000028#include "llvm/IR/Constants.h"
29#include "llvm/IR/DataLayout.h"
30#include "llvm/IR/Instructions.h"
31#include "llvm/IR/Module.h"
Chris Lattnerb7db7332010-03-09 01:58:53 +000032#include "llvm/MC/MCAsmInfo.h"
Chris Lattnera87dea42009-07-31 18:48:30 +000033#include "llvm/MC/MCSection.h"
Chris Lattner6c2f9e12009-08-19 05:49:37 +000034#include "llvm/MC/MCStreamer.h"
Chris Lattnerb7db7332010-03-09 01:58:53 +000035#include "llvm/MC/MCSymbol.h"
Devang Pateleac9c072010-04-27 19:46:33 +000036#include "llvm/Support/CommandLine.h"
Daniel Dunbar6e4bdfc2009-10-13 06:47:08 +000037#include "llvm/Support/Debug.h"
38#include "llvm/Support/ErrorHandling.h"
Chris Lattner0ad9c912010-01-22 22:09:00 +000039#include "llvm/Support/FormattedStream.h"
Eric Christopher3dee5752013-07-26 17:02:41 +000040#include "llvm/Support/MD5.h"
Michael J. Spencer1f6efa32010-11-29 18:16:10 +000041#include "llvm/Support/Path.h"
Chandler Carruthd04a8d42012-12-03 16:50:05 +000042#include "llvm/Support/Timer.h"
43#include "llvm/Support/ValueHandle.h"
44#include "llvm/Target/TargetFrameLowering.h"
45#include "llvm/Target/TargetLoweringObjectFile.h"
46#include "llvm/Target/TargetMachine.h"
47#include "llvm/Target/TargetOptions.h"
48#include "llvm/Target/TargetRegisterInfo.h"
Bill Wendling0310d762009-05-15 09:23:25 +000049using namespace llvm;
50
Eric Christopher6e61e0b2013-07-23 22:16:41 +000051static cl::opt<bool>
52DisableDebugInfoPrinting("disable-debug-info-print", cl::Hidden,
53 cl::desc("Disable debug info printing"));
Devang Pateleac9c072010-04-27 19:46:33 +000054
Eric Christopher6e61e0b2013-07-23 22:16:41 +000055static cl::opt<bool> UnknownLocations(
56 "use-unknown-locations", cl::Hidden,
57 cl::desc("Make an absence of debug location information explicit."),
58 cl::init(false));
Dan Gohman281d65d2010-05-07 01:08:53 +000059
Eric Christopher6e61e0b2013-07-23 22:16:41 +000060static cl::opt<bool>
Eric Christopher3dee5752013-07-26 17:02:41 +000061GenerateODRHash("generate-odr-hash", cl::Hidden,
62 cl::desc("Add an ODR hash to external type DIEs."),
63 cl::init(false));
64
Eric Christopher0710bfa2013-08-13 01:21:55 +000065static cl::opt<bool>
66GenerateCUHash("generate-cu-hash", cl::Hidden,
67 cl::desc("Add the CU hash as the dwo_id."),
68 cl::init(false));
69
Eric Christopher20f47ab2012-08-23 22:36:40 +000070namespace {
Eric Christopher6e61e0b2013-07-23 22:16:41 +000071enum DefaultOnOff {
72 Default,
73 Enable,
74 Disable
75};
Eric Christopher20f47ab2012-08-23 22:36:40 +000076}
Eric Christopher09ac3d82011-11-07 09:24:32 +000077
Eric Christopher6e61e0b2013-07-23 22:16:41 +000078static cl::opt<DefaultOnOff>
79DwarfAccelTables("dwarf-accel-tables", cl::Hidden,
80 cl::desc("Output prototype dwarf accelerator tables."),
81 cl::values(clEnumVal(Default, "Default for platform"),
82 clEnumVal(Enable, "Enabled"),
83 clEnumVal(Disable, "Disabled"), clEnumValEnd),
84 cl::init(Default));
Eric Christopher20f47ab2012-08-23 22:36:40 +000085
Eric Christopher6e61e0b2013-07-23 22:16:41 +000086static cl::opt<DefaultOnOff>
87DarwinGDBCompat("darwin-gdb-compat", cl::Hidden,
88 cl::desc("Compatibility with Darwin gdb."),
89 cl::values(clEnumVal(Default, "Default for platform"),
90 clEnumVal(Enable, "Enabled"),
91 clEnumVal(Disable, "Disabled"), clEnumValEnd),
92 cl::init(Default));
Eric Christopher10cb7442012-08-23 07:10:46 +000093
Eric Christopher6e61e0b2013-07-23 22:16:41 +000094static cl::opt<DefaultOnOff>
95SplitDwarf("split-dwarf", cl::Hidden,
96 cl::desc("Output prototype dwarf split debug info."),
97 cl::values(clEnumVal(Default, "Default for platform"),
98 clEnumVal(Enable, "Enabled"),
99 clEnumVal(Disable, "Disabled"), clEnumValEnd),
100 cl::init(Default));
Eric Christopherf5b6dcd2012-11-12 22:22:20 +0000101
Eric Christopherf04e4ef2013-08-19 21:07:38 +0000102static cl::opt<DefaultOnOff>
103DwarfPubNames("generate-dwarf-pubnames", cl::Hidden,
104 cl::desc("Generate DWARF pubnames section"),
105 cl::values(clEnumVal(Default, "Default for platform"),
106 clEnumVal(Enable, "Enabled"),
107 clEnumVal(Disable, "Disabled"), clEnumValEnd),
108 cl::init(Default));
109
Bill Wendling5f017e82010-04-07 09:28:04 +0000110namespace {
Craig Topper4172a8a2013-07-16 01:17:10 +0000111 const char *const DWARFGroupName = "DWARF Emission";
112 const char *const DbgTimerName = "DWARF Debug Writer";
David Blaikied2e0f7e2013-05-06 23:33:07 +0000113
114 struct CompareFirst {
115 template <typename T> bool operator()(const T &lhs, const T &rhs) const {
116 return lhs.first < rhs.first;
117 }
118 };
Bill Wendling5f017e82010-04-07 09:28:04 +0000119} // end anonymous namespace
120
Bill Wendling0310d762009-05-15 09:23:25 +0000121//===----------------------------------------------------------------------===//
122
Eric Christopherb6dc8652012-11-27 22:43:45 +0000123// Configuration values for initial hash set sizes (log2).
124//
Bill Wendling0310d762009-05-15 09:23:25 +0000125static const unsigned InitAbbreviationsSetSize = 9; // log2(512)
Bill Wendling0310d762009-05-15 09:23:25 +0000126
127namespace llvm {
128
Nick Lewycky3bbb6f72011-07-29 03:49:23 +0000129DIType DbgVariable::getType() const {
Devang Patel3cbee302011-04-12 22:53:02 +0000130 DIType Ty = Var.getType();
131 // FIXME: isBlockByrefVariable should be reformulated in terms of complex
132 // addresses instead.
133 if (Var.isBlockByrefVariable()) {
134 /* Byref variables, in Blocks, are declared by the programmer as
135 "SomeType VarName;", but the compiler creates a
136 __Block_byref_x_VarName struct, and gives the variable VarName
137 either the struct, or a pointer to the struct, as its type. This
138 is necessary for various behind-the-scenes things the compiler
139 needs to do with by-reference variables in blocks.
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000140
Devang Patel3cbee302011-04-12 22:53:02 +0000141 However, as far as the original *programmer* is concerned, the
142 variable should still have type 'SomeType', as originally declared.
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000143
Devang Patel3cbee302011-04-12 22:53:02 +0000144 The following function dives into the __Block_byref_x_VarName
145 struct to find the original type of the variable. This will be
146 passed back to the code generating the type for the Debug
147 Information Entry for the variable 'VarName'. 'VarName' will then
148 have the original type 'SomeType' in its debug information.
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000149
Devang Patel3cbee302011-04-12 22:53:02 +0000150 The original type 'SomeType' will be the type of the field named
151 'VarName' inside the __Block_byref_x_VarName struct.
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000152
Devang Patel3cbee302011-04-12 22:53:02 +0000153 NOTE: In order for this to not completely fail on the debugger
154 side, the Debug Information Entry for the variable VarName needs to
155 have a DW_AT_location that tells the debugger how to unwind through
156 the pointers and __Block_byref_x_VarName struct to find the actual
157 value of the variable. The function addBlockByrefType does this. */
158 DIType subType = Ty;
Eric Christopher31667622013-08-08 01:41:00 +0000159 uint16_t tag = Ty.getTag();
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000160
Devang Patel3cbee302011-04-12 22:53:02 +0000161 if (tag == dwarf::DW_TAG_pointer_type) {
162 DIDerivedType DTy = DIDerivedType(Ty);
163 subType = DTy.getTypeDerivedFrom();
164 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000165
Devang Patel3cbee302011-04-12 22:53:02 +0000166 DICompositeType blockStruct = DICompositeType(subType);
167 DIArray Elements = blockStruct.getTypeArray();
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000168
Devang Patel3cbee302011-04-12 22:53:02 +0000169 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
170 DIDescriptor Element = Elements.getElement(i);
171 DIDerivedType DT = DIDerivedType(Element);
172 if (getName() == DT.getName())
173 return (DT.getTypeDerivedFrom());
Devang Patel8bd11de2010-08-09 21:01:39 +0000174 }
Devang Patel8bd11de2010-08-09 21:01:39 +0000175 }
Devang Patel3cbee302011-04-12 22:53:02 +0000176 return Ty;
177}
Bill Wendling0310d762009-05-15 09:23:25 +0000178
Chris Lattnerea761862010-04-05 04:09:20 +0000179} // end llvm namespace
Bill Wendling0310d762009-05-15 09:23:25 +0000180
Manman Ren0e6783f2013-07-02 23:40:10 +0000181/// Return Dwarf Version by checking module flags.
182static unsigned getDwarfVersionFromModule(const Module *M) {
Manman Renc8cfaa12013-07-16 23:21:16 +0000183 Value *Val = M->getModuleFlag("Dwarf Version");
184 if (!Val)
185 return dwarf::DWARF_VERSION;
186 return cast<ConstantInt>(Val)->getZExtValue();
Manman Ren0e6783f2013-07-02 23:40:10 +0000187}
188
Chris Lattner49cd6642010-04-05 05:11:15 +0000189DwarfDebug::DwarfDebug(AsmPrinter *A, Module *M)
Eric Christopher28bd25a2012-12-10 19:51:13 +0000190 : Asm(A), MMI(Asm->MMI), FirstCU(0),
Jim Grosbach1e20b962010-07-21 21:21:52 +0000191 AbbreviationsSet(InitAbbreviationsSetSize),
Eric Christopherb6714222013-01-08 22:22:06 +0000192 SourceIdMap(DIEValueAllocator),
Eric Christopher0e3e9b72012-12-10 23:34:43 +0000193 PrevLabel(NULL), GlobalCUIndexCount(0),
Eric Christopherb6714222013-01-08 22:22:06 +0000194 InfoHolder(A, &AbbreviationsSet, &Abbreviations, "info_string",
195 DIEValueAllocator),
Eric Christopher6eebe472012-12-19 22:02:53 +0000196 SkeletonAbbrevSet(InitAbbreviationsSetSize),
Eric Christopherb6714222013-01-08 22:22:06 +0000197 SkeletonHolder(A, &SkeletonAbbrevSet, &SkeletonAbbrevs, "skel_string",
198 DIEValueAllocator) {
Jim Grosbach1e20b962010-07-21 21:21:52 +0000199
Rafael Espindolaf2b04232011-05-06 14:56:22 +0000200 DwarfInfoSectionSym = DwarfAbbrevSectionSym = 0;
Chris Lattner4ad1efe2010-04-04 23:10:38 +0000201 DwarfStrSectionSym = TextSectionSym = 0;
Eric Christopher7a0103c2013-02-07 21:19:50 +0000202 DwarfDebugRangeSectionSym = DwarfDebugLocSectionSym = DwarfLineSectionSym = 0;
Eric Christopher9a9e73b2013-04-07 03:43:09 +0000203 DwarfAddrSectionSym = 0;
Eric Christopher64f824c2012-12-27 02:14:01 +0000204 DwarfAbbrevDWOSectionSym = DwarfStrDWOSectionSym = 0;
Devang Patelc3f5f782010-05-25 23:40:22 +0000205 FunctionBeginSym = FunctionEndSym = 0;
Eric Christopher60777d82012-04-02 17:58:52 +0000206
Eric Christopher10cb7442012-08-23 07:10:46 +0000207 // Turn on accelerator tables and older gdb compatibility
Eric Christopher05bae3b2013-08-19 21:41:38 +0000208 // for Darwin by default, pubnames by default for non-Darwin,
209 // and handle split dwarf.
Eric Christopher00297ba2013-04-27 01:07:52 +0000210 bool IsDarwin = Triple(A->getTargetTriple()).isOSDarwin();
Eric Christopherc1610fa2012-08-23 22:36:36 +0000211
Eric Christopher05bae3b2013-08-19 21:41:38 +0000212 if (DarwinGDBCompat == Default)
213 IsDarwinGDBCompat = IsDarwin;
214 else
215 IsDarwinGDBCompat = DarwinGDBCompat == Enable;
216
217 if (DwarfAccelTables == Default)
218 HasDwarfAccelTables = IsDarwin;
219 else
220 HasDwarfAccelTables = DwarfAccelTables = Enable;
Eric Christopher20f47ab2012-08-23 22:36:40 +0000221
Eric Christopher4daaed12012-12-10 19:51:21 +0000222 if (SplitDwarf == Default)
223 HasSplitDwarf = false;
Eric Christopherf5b6dcd2012-11-12 22:22:20 +0000224 else
Eric Christopher05bae3b2013-08-19 21:41:38 +0000225 HasSplitDwarf = SplitDwarf == Enable;
Eric Christopherf5b6dcd2012-11-12 22:22:20 +0000226
Eric Christopher05bae3b2013-08-19 21:41:38 +0000227 if (DwarfPubNames == Default)
228 HasDwarfPubNames = !IsDarwin;
229 else
230 HasDwarfPubNames = DwarfPubNames == Enable;
Eric Christopherf04e4ef2013-08-19 21:07:38 +0000231
Manman Ren0e6783f2013-07-02 23:40:10 +0000232 DwarfVersion = getDwarfVersionFromModule(MMI->getModule());
233
Dan Gohman03c3dc72010-06-18 15:56:31 +0000234 {
235 NamedRegionTimer T(DbgTimerName, DWARFGroupName, TimePassesIsEnabled);
Eric Christopherc4639d62012-11-19 22:42:15 +0000236 beginModule();
Torok Edwin9c421072010-04-07 10:44:46 +0000237 }
Bill Wendling0310d762009-05-15 09:23:25 +0000238}
239DwarfDebug::~DwarfDebug() {
Bill Wendling0310d762009-05-15 09:23:25 +0000240}
241
Eric Christopherb6dc8652012-11-27 22:43:45 +0000242// Switch to the specified MCSection and emit an assembler
243// temporary label to it if SymbolStem is specified.
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000244static MCSymbol *emitSectionSym(AsmPrinter *Asm, const MCSection *Section,
Eric Christopherd8a87522011-11-07 09:18:38 +0000245 const char *SymbolStem = 0) {
246 Asm->OutStreamer.SwitchSection(Section);
247 if (!SymbolStem) return 0;
248
249 MCSymbol *TmpSym = Asm->GetTempSymbol(SymbolStem);
250 Asm->OutStreamer.EmitLabel(TmpSym);
251 return TmpSym;
252}
253
Eric Christopher2e5d8702012-12-20 21:58:36 +0000254MCSymbol *DwarfUnits::getStringPoolSym() {
Eric Christopher64f824c2012-12-27 02:14:01 +0000255 return Asm->GetTempSymbol(StringPref);
Nick Lewycky390c40d2011-10-27 06:44:11 +0000256}
257
Eric Christopher2e5d8702012-12-20 21:58:36 +0000258MCSymbol *DwarfUnits::getStringPoolEntry(StringRef Str) {
259 std::pair<MCSymbol*, unsigned> &Entry =
Eric Christopherb6714222013-01-08 22:22:06 +0000260 StringPool.GetOrCreateValue(Str).getValue();
Chris Lattnerbc733f52010-03-13 02:17:42 +0000261 if (Entry.first) return Entry.first;
262
263 Entry.second = NextStringPoolNumber++;
Eric Christopher64f824c2012-12-27 02:14:01 +0000264 return Entry.first = Asm->GetTempSymbol(StringPref, Entry.second);
Chris Lattnerbc733f52010-03-13 02:17:42 +0000265}
266
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000267unsigned DwarfUnits::getStringPoolIndex(StringRef Str) {
268 std::pair<MCSymbol*, unsigned> &Entry =
Eric Christopherb6714222013-01-08 22:22:06 +0000269 StringPool.GetOrCreateValue(Str).getValue();
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000270 if (Entry.first) return Entry.second;
271
272 Entry.second = NextStringPoolNumber++;
273 Entry.first = Asm->GetTempSymbol(StringPref, Entry.second);
274 return Entry.second;
275}
276
David Blaikie321d83b2013-06-28 18:47:14 +0000277unsigned DwarfUnits::getAddrPoolIndex(const MCSymbol *Sym) {
David Blaikie8fed05e2013-07-01 23:55:52 +0000278 return getAddrPoolIndex(MCSymbolRefExpr::Create(Sym, Asm->OutContext));
279}
280
Ulrich Weigand18dbe502013-07-02 18:46:46 +0000281unsigned DwarfUnits::getAddrPoolIndex(const MCExpr *Sym) {
282 std::pair<DenseMap<const MCExpr *, unsigned>::iterator, bool> P =
David Blaikie1c736322013-06-28 18:47:19 +0000283 AddressPool.insert(std::make_pair(Sym, NextAddrPoolNumber));
David Blaikie1ca79902013-06-28 18:55:13 +0000284 if (P.second)
285 ++NextAddrPoolNumber;
David Blaikie1c736322013-06-28 18:47:19 +0000286 return P.first->second;
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000287}
288
Eric Christopherb6dc8652012-11-27 22:43:45 +0000289// Define a unique number for the abbreviation.
290//
Eric Christopher0e3e9b72012-12-10 23:34:43 +0000291void DwarfUnits::assignAbbrevNumber(DIEAbbrev &Abbrev) {
Bill Wendling0310d762009-05-15 09:23:25 +0000292 // Check the set for priors.
Eric Christopher0e3e9b72012-12-10 23:34:43 +0000293 DIEAbbrev *InSet = AbbreviationsSet->GetOrInsertNode(&Abbrev);
Bill Wendling0310d762009-05-15 09:23:25 +0000294
295 // If it's newly added.
296 if (InSet == &Abbrev) {
297 // Add to abbreviation list.
Eric Christopher0e3e9b72012-12-10 23:34:43 +0000298 Abbreviations->push_back(&Abbrev);
Bill Wendling0310d762009-05-15 09:23:25 +0000299
300 // Assign the vector position + 1 as its number.
Eric Christopher0e3e9b72012-12-10 23:34:43 +0000301 Abbrev.setNumber(Abbreviations->size());
Bill Wendling0310d762009-05-15 09:23:25 +0000302 } else {
303 // Assign existing abbreviation number.
304 Abbrev.setNumber(InSet->getNumber());
305 }
306}
307
Eric Christopher0ffe2b42011-11-10 19:25:34 +0000308static bool isObjCClass(StringRef Name) {
309 return Name.startswith("+") || Name.startswith("-");
310}
311
312static bool hasObjCCategory(StringRef Name) {
313 if (!isObjCClass(Name)) return false;
314
315 size_t pos = Name.find(')');
316 if (pos != std::string::npos) {
317 if (Name[pos+1] != ' ') return false;
318 return true;
319 }
320 return false;
321}
322
323static void getObjCClassCategory(StringRef In, StringRef &Class,
324 StringRef &Category) {
325 if (!hasObjCCategory(In)) {
326 Class = In.slice(In.find('[') + 1, In.find(' '));
327 Category = "";
328 return;
329 }
330
331 Class = In.slice(In.find('[') + 1, In.find('('));
332 Category = In.slice(In.find('[') + 1, In.find(' '));
333 return;
334}
335
336static StringRef getObjCMethodName(StringRef In) {
337 return In.slice(In.find(' ') + 1, In.find(']'));
338}
339
340// Add the various names to the Dwarf accelerator table names.
341static void addSubprogramNames(CompileUnit *TheCU, DISubprogram SP,
342 DIE* Die) {
343 if (!SP.isDefinition()) return;
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000344
Eric Christopher0ffe2b42011-11-10 19:25:34 +0000345 TheCU->addAccelName(SP.getName(), Die);
346
347 // If the linkage name is different than the name, go ahead and output
348 // that as well into the name table.
349 if (SP.getLinkageName() != "" && SP.getName() != SP.getLinkageName())
350 TheCU->addAccelName(SP.getLinkageName(), Die);
351
352 // If this is an Objective-C selector name add it to the ObjC accelerator
353 // too.
354 if (isObjCClass(SP.getName())) {
355 StringRef Class, Category;
356 getObjCClassCategory(SP.getName(), Class, Category);
357 TheCU->addAccelObjC(Class, Die);
358 if (Category != "")
359 TheCU->addAccelObjC(Category, Die);
360 // Also add the base method name to the name table.
361 TheCU->addAccelName(getObjCMethodName(SP.getName()), Die);
362 }
363}
364
Eric Christopherb6dc8652012-11-27 22:43:45 +0000365// Find DIE for the given subprogram and attach appropriate DW_AT_low_pc
366// and DW_AT_high_pc attributes. If there are global variables in this
367// scope then create and insert DIEs for these variables.
Devang Pateld3024342011-08-15 22:24:32 +0000368DIE *DwarfDebug::updateSubprogramScopeDIE(CompileUnit *SPCU,
369 const MDNode *SPNode) {
Devang Patel163a9f72010-05-10 22:49:55 +0000370 DIE *SPDie = SPCU->getDIE(SPNode);
Devang Patel8aa61472010-07-07 22:20:57 +0000371
Chris Lattnerd38fee82010-04-05 00:13:49 +0000372 assert(SPDie && "Unable to find subprogram DIE!");
373 DISubprogram SP(SPNode);
Jim Grosbach1e20b962010-07-21 21:21:52 +0000374
Bill Wendling168c1902012-11-07 05:19:04 +0000375 // If we're updating an abstract DIE, then we will be adding the children and
376 // object pointer later on. But what we don't want to do is process the
377 // concrete DIE twice.
Manman Renbc3e96f2013-03-12 18:27:15 +0000378 DIE *AbsSPDIE = AbstractSPDies.lookup(SPNode);
379 if (AbsSPDIE) {
380 bool InSameCU = (AbsSPDIE->getCompileUnit() == SPCU->getCUDie());
Bill Wendling168c1902012-11-07 05:19:04 +0000381 // Pick up abstract subprogram DIE.
Devang Patel8aa61472010-07-07 22:20:57 +0000382 SPDie = new DIE(dwarf::DW_TAG_subprogram);
Manman Renbc3e96f2013-03-12 18:27:15 +0000383 // If AbsSPDIE belongs to a different CU, use DW_FORM_ref_addr instead of
384 // DW_FORM_ref4.
Devang Patel3cbee302011-04-12 22:53:02 +0000385 SPCU->addDIEEntry(SPDie, dwarf::DW_AT_abstract_origin,
Manman Renbc3e96f2013-03-12 18:27:15 +0000386 InSameCU ? dwarf::DW_FORM_ref4 : dwarf::DW_FORM_ref_addr,
387 AbsSPDIE);
Devang Patel8aa61472010-07-07 22:20:57 +0000388 SPCU->addDie(SPDie);
Bill Wendlinga4c76932012-11-07 04:42:18 +0000389 } else {
390 DISubprogram SPDecl = SP.getFunctionDeclaration();
391 if (!SPDecl.isSubprogram()) {
392 // There is not any need to generate specification DIE for a function
393 // defined at compile unit level. If a function is defined inside another
394 // function then gdb prefers the definition at top level and but does not
395 // expect specification DIE in parent function. So avoid creating
396 // specification DIE for a function defined inside a function.
397 if (SP.isDefinition() && !SP.getContext().isCompileUnit() &&
398 !SP.getContext().isFile() &&
399 !isSubprogramContext(SP.getContext())) {
400 SPCU->addFlag(SPDie, dwarf::DW_AT_declaration);
401
402 // Add arguments.
403 DICompositeType SPTy = SP.getType();
404 DIArray Args = SPTy.getTypeArray();
Eric Christopher31667622013-08-08 01:41:00 +0000405 uint16_t SPTag = SPTy.getTag();
Bill Wendlinga4c76932012-11-07 04:42:18 +0000406 if (SPTag == dwarf::DW_TAG_subroutine_type)
407 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
408 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
409 DIType ATy = DIType(Args.getElement(i));
410 SPCU->addType(Arg, ATy);
411 if (ATy.isArtificial())
412 SPCU->addFlag(Arg, dwarf::DW_AT_artificial);
413 if (ATy.isObjectPointer())
414 SPCU->addDIEEntry(SPDie, dwarf::DW_AT_object_pointer,
415 dwarf::DW_FORM_ref4, Arg);
416 SPDie->addChild(Arg);
417 }
418 DIE *SPDeclDie = SPDie;
419 SPDie = new DIE(dwarf::DW_TAG_subprogram);
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000420 SPCU->addDIEEntry(SPDie, dwarf::DW_AT_specification,
421 dwarf::DW_FORM_ref4, SPDeclDie);
Bill Wendlinga4c76932012-11-07 04:42:18 +0000422 SPCU->addDie(SPDie);
423 }
424 }
Devang Patel8aa61472010-07-07 22:20:57 +0000425 }
426
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000427 SPCU->addLabelAddress(SPDie, dwarf::DW_AT_low_pc,
428 Asm->GetTempSymbol("func_begin",
429 Asm->getFunctionNumber()));
430 SPCU->addLabelAddress(SPDie, dwarf::DW_AT_high_pc,
431 Asm->GetTempSymbol("func_end",
432 Asm->getFunctionNumber()));
Chris Lattnerd38fee82010-04-05 00:13:49 +0000433 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
434 MachineLocation Location(RI->getFrameRegister(*Asm->MF));
Devang Patel3cbee302011-04-12 22:53:02 +0000435 SPCU->addAddress(SPDie, dwarf::DW_AT_frame_base, Location);
Devang Patelb4645642010-02-06 01:02:37 +0000436
Eric Christopher0ffe2b42011-11-10 19:25:34 +0000437 // Add name to the name table, we do this here because we're guaranteed
438 // to have concrete versions of our DW_TAG_subprogram nodes.
439 addSubprogramNames(SPCU, SP, SPDie);
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000440
Chris Lattnerd38fee82010-04-05 00:13:49 +0000441 return SPDie;
Devang Patel53bb5c92009-11-10 23:06:00 +0000442}
443
Eric Christopherb6dc8652012-11-27 22:43:45 +0000444// Construct new DW_TAG_lexical_block for this scope and attach
445// DW_AT_low_pc/DW_AT_high_pc labels.
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000446DIE *DwarfDebug::constructLexicalScopeDIE(CompileUnit *TheCU,
Devang Pateld3024342011-08-15 22:24:32 +0000447 LexicalScope *Scope) {
Devang Pateleac9c072010-04-27 19:46:33 +0000448 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_lexical_block);
449 if (Scope->isAbstractScope())
450 return ScopeDIE;
451
Craig Topper9f43ac62013-07-03 04:24:43 +0000452 const SmallVectorImpl<InsnRange> &Ranges = Scope->getRanges();
Devang Pateleac9c072010-04-27 19:46:33 +0000453 if (Ranges.empty())
454 return 0;
455
Eric Christopherf53d6432013-07-03 01:57:28 +0000456 // If we have multiple ranges, emit them into the range section.
Devang Pateleac9c072010-04-27 19:46:33 +0000457 if (Ranges.size() > 1) {
458 // .debug_range section has not been laid out yet. Emit offset in
Jim Grosbach1e20b962010-07-21 21:21:52 +0000459 // .debug_range as a uint, size 4, for now. emitDIE will handle
Devang Pateleac9c072010-04-27 19:46:33 +0000460 // DW_AT_ranges appropriately.
Devang Patel3cbee302011-04-12 22:53:02 +0000461 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_ranges, dwarf::DW_FORM_data4,
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000462 DebugRangeSymbols.size()
Chandler Carruth426c2bf2012-11-01 09:14:31 +0000463 * Asm->getDataLayout().getPointerSize());
Craig Topper2d785db2013-07-03 04:17:25 +0000464 for (SmallVectorImpl<InsnRange>::const_iterator RI = Ranges.begin(),
Devang Pateleac9c072010-04-27 19:46:33 +0000465 RE = Ranges.end(); RI != RE; ++RI) {
Devang Patelc3f5f782010-05-25 23:40:22 +0000466 DebugRangeSymbols.push_back(getLabelBeforeInsn(RI->first));
467 DebugRangeSymbols.push_back(getLabelAfterInsn(RI->second));
Devang Pateleac9c072010-04-27 19:46:33 +0000468 }
Eric Christopherda965de2013-07-03 01:22:29 +0000469
470 // Terminate the range list.
Devang Pateleac9c072010-04-27 19:46:33 +0000471 DebugRangeSymbols.push_back(NULL);
472 DebugRangeSymbols.push_back(NULL);
473 return ScopeDIE;
474 }
475
Eric Christopherf53d6432013-07-03 01:57:28 +0000476 // Construct the address range for this DIE.
Craig Topper2d785db2013-07-03 04:17:25 +0000477 SmallVectorImpl<InsnRange>::const_iterator RI = Ranges.begin();
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000478 MCSymbol *Start = getLabelBeforeInsn(RI->first);
479 MCSymbol *End = getLabelAfterInsn(RI->second);
Devang Pateleac9c072010-04-27 19:46:33 +0000480
Devang Patelc3f5f782010-05-25 23:40:22 +0000481 if (End == 0) return 0;
Devang Patel53bb5c92009-11-10 23:06:00 +0000482
Chris Lattnerb7db7332010-03-09 01:58:53 +0000483 assert(Start->isDefined() && "Invalid starting label for an inlined scope!");
484 assert(End->isDefined() && "Invalid end label for an inlined scope!");
Jim Grosbach1e20b962010-07-21 21:21:52 +0000485
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000486 TheCU->addLabelAddress(ScopeDIE, dwarf::DW_AT_low_pc, Start);
487 TheCU->addLabelAddress(ScopeDIE, dwarf::DW_AT_high_pc, End);
Devang Patel53bb5c92009-11-10 23:06:00 +0000488
489 return ScopeDIE;
490}
491
Eric Christopherb6dc8652012-11-27 22:43:45 +0000492// This scope represents inlined body of a function. Construct DIE to
493// represent this concrete inlined copy of the function.
Devang Pateld3024342011-08-15 22:24:32 +0000494DIE *DwarfDebug::constructInlinedScopeDIE(CompileUnit *TheCU,
495 LexicalScope *Scope) {
Craig Topper9f43ac62013-07-03 04:24:43 +0000496 const SmallVectorImpl<InsnRange> &Ranges = Scope->getRanges();
Nick Lewycky746cb672011-10-26 22:55:33 +0000497 assert(Ranges.empty() == false &&
498 "LexicalScope does not have instruction markers!");
Devang Pateleac9c072010-04-27 19:46:33 +0000499
Devang Patel26a92002011-07-27 00:34:13 +0000500 if (!Scope->getScopeNode())
501 return NULL;
502 DIScope DS(Scope->getScopeNode());
503 DISubprogram InlinedSP = getDISubprogram(DS);
Manman Ren742671b2013-05-29 17:16:59 +0000504 DIE *OriginDIE = TheCU->getDIE(InlinedSP);
Devang Patel26a92002011-07-27 00:34:13 +0000505 if (!OriginDIE) {
Bill Wendlinge0aae5b2012-10-30 17:51:02 +0000506 DEBUG(dbgs() << "Unable to find original DIE for an inlined subprogram.");
Devang Patel26a92002011-07-27 00:34:13 +0000507 return NULL;
508 }
509
Devang Pateld96efb82011-05-05 17:54:26 +0000510 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_inlined_subroutine);
Devang Patel3cbee302011-04-12 22:53:02 +0000511 TheCU->addDIEEntry(ScopeDIE, dwarf::DW_AT_abstract_origin,
Manman Ren742671b2013-05-29 17:16:59 +0000512 dwarf::DW_FORM_ref4, OriginDIE);
Devang Patel53bb5c92009-11-10 23:06:00 +0000513
Devang Patel26a92002011-07-27 00:34:13 +0000514 if (Ranges.size() > 1) {
515 // .debug_range section has not been laid out yet. Emit offset in
516 // .debug_range as a uint, size 4, for now. emitDIE will handle
517 // DW_AT_ranges appropriately.
518 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_ranges, dwarf::DW_FORM_data4,
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000519 DebugRangeSymbols.size()
Chandler Carruth426c2bf2012-11-01 09:14:31 +0000520 * Asm->getDataLayout().getPointerSize());
Craig Topper2d785db2013-07-03 04:17:25 +0000521 for (SmallVectorImpl<InsnRange>::const_iterator RI = Ranges.begin(),
Devang Patel26a92002011-07-27 00:34:13 +0000522 RE = Ranges.end(); RI != RE; ++RI) {
523 DebugRangeSymbols.push_back(getLabelBeforeInsn(RI->first));
524 DebugRangeSymbols.push_back(getLabelAfterInsn(RI->second));
525 }
526 DebugRangeSymbols.push_back(NULL);
527 DebugRangeSymbols.push_back(NULL);
528 } else {
Craig Topper2d785db2013-07-03 04:17:25 +0000529 SmallVectorImpl<InsnRange>::const_iterator RI = Ranges.begin();
Eric Christophere7177132013-07-03 02:23:53 +0000530 MCSymbol *StartLabel = getLabelBeforeInsn(RI->first);
531 MCSymbol *EndLabel = getLabelAfterInsn(RI->second);
532
533 if (StartLabel == 0 || EndLabel == 0)
534 llvm_unreachable("Unexpected Start and End labels for an inlined scope!");
535
536 assert(StartLabel->isDefined() &&
537 "Invalid starting label for an inlined scope!");
538 assert(EndLabel->isDefined() && "Invalid end label for an inlined scope!");
539
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000540 TheCU->addLabelAddress(ScopeDIE, dwarf::DW_AT_low_pc, StartLabel);
541 TheCU->addLabelAddress(ScopeDIE, dwarf::DW_AT_high_pc, EndLabel);
Devang Patel26a92002011-07-27 00:34:13 +0000542 }
Devang Patel53bb5c92009-11-10 23:06:00 +0000543
544 InlinedSubprogramDIEs.insert(OriginDIE);
545
Eric Christophere7177132013-07-03 02:23:53 +0000546 // Add the call site information to the DIE.
Devang Patel53bb5c92009-11-10 23:06:00 +0000547 DILocation DL(Scope->getInlinedAt());
Eric Christopher08212002012-03-26 21:38:38 +0000548 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_call_file, 0,
Manman Ren3de61b42013-03-07 01:42:00 +0000549 getOrCreateSourceID(DL.getFilename(), DL.getDirectory(),
550 TheCU->getUniqueID()));
Devang Patel3cbee302011-04-12 22:53:02 +0000551 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_call_line, 0, DL.getLineNumber());
Devang Patel53bb5c92009-11-10 23:06:00 +0000552
Eric Christophere7177132013-07-03 02:23:53 +0000553 // Track the start label for this inlined function.
554 //.debug_inlined section specification does not clearly state how
555 // to emit inlined scopes that are split into multiple instruction ranges.
556 // For now, use the first instruction range and emit low_pc/high_pc pair and
557 // corresponding the .debug_inlined section entry for this pair.
558 if (Asm->MAI->doesDwarfUseInlineInfoSection()) {
559 MCSymbol *StartLabel = getLabelBeforeInsn(Ranges.begin()->first);
Craig Topper01eb99a2013-07-03 04:40:27 +0000560 InlineInfoMap::iterator I = InlineInfo.find(InlinedSP);
Eric Christophere7177132013-07-03 02:23:53 +0000561
562 if (I == InlineInfo.end()) {
563 InlineInfo[InlinedSP].push_back(std::make_pair(StartLabel, ScopeDIE));
564 InlinedSPNodes.push_back(InlinedSP);
565 } else
566 I->second.push_back(std::make_pair(StartLabel, ScopeDIE));
567 }
568
Eric Christopher309bedd2011-12-04 06:02:38 +0000569 // Add name to the name table, we do this here because we're guaranteed
570 // to have concrete versions of our DW_TAG_inlined_subprogram nodes.
571 addSubprogramNames(TheCU, InlinedSP, ScopeDIE);
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000572
Devang Patel53bb5c92009-11-10 23:06:00 +0000573 return ScopeDIE;
574}
575
Eric Christopherb6dc8652012-11-27 22:43:45 +0000576// Construct a DIE for this scope.
Devang Pateld0b5a5e2011-08-15 22:04:40 +0000577DIE *DwarfDebug::constructScopeDIE(CompileUnit *TheCU, LexicalScope *Scope) {
Devang Patel3c91b052010-03-08 20:52:55 +0000578 if (!Scope || !Scope->getScopeNode())
579 return NULL;
Jim Grosbach1e20b962010-07-21 21:21:52 +0000580
Manman Ren8b15d742013-01-31 20:05:14 +0000581 DIScope DS(Scope->getScopeNode());
582 // Early return to avoid creating dangling variable|scope DIEs.
Manman Ren742671b2013-05-29 17:16:59 +0000583 if (!Scope->getInlinedAt() && DS.isSubprogram() && Scope->isAbstractScope() &&
584 !TheCU->getDIE(DS))
585 return NULL;
Manman Ren8b15d742013-01-31 20:05:14 +0000586
Nick Lewycky746cb672011-10-26 22:55:33 +0000587 SmallVector<DIE *, 8> Children;
Eric Christophere5212782012-09-12 23:36:19 +0000588 DIE *ObjectPointer = NULL;
Devang Patel0478c152011-03-01 22:58:55 +0000589
590 // Collect arguments for current function.
Devang Patelbf47fdb2011-08-10 20:55:27 +0000591 if (LScopes.isCurrentFunctionScope(Scope))
Devang Patel0478c152011-03-01 22:58:55 +0000592 for (unsigned i = 0, N = CurrentFnArguments.size(); i < N; ++i)
593 if (DbgVariable *ArgDV = CurrentFnArguments[i])
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000594 if (DIE *Arg =
Eric Christophere5212782012-09-12 23:36:19 +0000595 TheCU->constructVariableDIE(ArgDV, Scope->isAbstractScope())) {
Devang Patel0478c152011-03-01 22:58:55 +0000596 Children.push_back(Arg);
Eric Christophere5212782012-09-12 23:36:19 +0000597 if (ArgDV->isObjectPointer()) ObjectPointer = Arg;
598 }
Devang Patel0478c152011-03-01 22:58:55 +0000599
Eric Christopher1aeb7ac2011-10-03 15:49:16 +0000600 // Collect lexical scope children first.
Craig Topper9f43ac62013-07-03 04:24:43 +0000601 const SmallVectorImpl<DbgVariable *> &Variables =ScopeVariables.lookup(Scope);
Devang Patel5bc9fec2011-02-19 01:31:27 +0000602 for (unsigned i = 0, N = Variables.size(); i < N; ++i)
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000603 if (DIE *Variable =
Eric Christopher7b451cf2012-09-21 22:18:52 +0000604 TheCU->constructVariableDIE(Variables[i], Scope->isAbstractScope())) {
Devang Patel5bc9fec2011-02-19 01:31:27 +0000605 Children.push_back(Variable);
Eric Christopher7b451cf2012-09-21 22:18:52 +0000606 if (Variables[i]->isObjectPointer()) ObjectPointer = Variable;
607 }
Craig Topper9f43ac62013-07-03 04:24:43 +0000608 const SmallVectorImpl<LexicalScope *> &Scopes = Scope->getChildren();
Devang Patel5bc9fec2011-02-19 01:31:27 +0000609 for (unsigned j = 0, M = Scopes.size(); j < M; ++j)
Devang Pateld0b5a5e2011-08-15 22:04:40 +0000610 if (DIE *Nested = constructScopeDIE(TheCU, Scopes[j]))
Devang Patel5bc9fec2011-02-19 01:31:27 +0000611 Children.push_back(Nested);
Devang Patel3c91b052010-03-08 20:52:55 +0000612 DIE *ScopeDIE = NULL;
613 if (Scope->getInlinedAt())
Devang Pateld3024342011-08-15 22:24:32 +0000614 ScopeDIE = constructInlinedScopeDIE(TheCU, Scope);
Devang Patel3c91b052010-03-08 20:52:55 +0000615 else if (DS.isSubprogram()) {
Devang Patel0dd45582010-06-28 20:53:04 +0000616 ProcessedSPNodes.insert(DS);
Devang Patel8aa61472010-07-07 22:20:57 +0000617 if (Scope->isAbstractScope()) {
Manman Ren742671b2013-05-29 17:16:59 +0000618 ScopeDIE = TheCU->getDIE(DS);
Devang Patel8aa61472010-07-07 22:20:57 +0000619 // Note down abstract DIE.
620 if (ScopeDIE)
621 AbstractSPDies.insert(std::make_pair(DS, ScopeDIE));
622 }
Devang Patel3c91b052010-03-08 20:52:55 +0000623 else
Devang Pateld3024342011-08-15 22:24:32 +0000624 ScopeDIE = updateSubprogramScopeDIE(TheCU, DS);
Devang Patel3c91b052010-03-08 20:52:55 +0000625 }
Devang Patel5bc9fec2011-02-19 01:31:27 +0000626 else {
627 // There is no need to emit empty lexical block DIE.
David Blaikied2e0f7e2013-05-06 23:33:07 +0000628 std::pair<ImportedEntityMap::const_iterator,
629 ImportedEntityMap::const_iterator> Range = std::equal_range(
630 ScopesWithImportedEntities.begin(), ScopesWithImportedEntities.end(),
Timur Iskhodzhanov664fbee2013-05-07 07:47:47 +0000631 std::pair<const MDNode *, const MDNode *>(DS, (const MDNode*)0),
632 CompareFirst());
David Blaikied2e0f7e2013-05-06 23:33:07 +0000633 if (Children.empty() && Range.first == Range.second)
Devang Patel5bc9fec2011-02-19 01:31:27 +0000634 return NULL;
Devang Pateld3024342011-08-15 22:24:32 +0000635 ScopeDIE = constructLexicalScopeDIE(TheCU, Scope);
Eric Christopherfdfc81f2013-06-24 23:20:02 +0000636 for (ImportedEntityMap::const_iterator i = Range.first; i != Range.second;
637 ++i)
David Blaikied1221e32013-05-08 06:01:38 +0000638 constructImportedEntityDIE(TheCU, i->second, ScopeDIE);
Devang Patel5bc9fec2011-02-19 01:31:27 +0000639 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000640
Devang Patelaead63c2010-03-29 22:59:58 +0000641 if (!ScopeDIE) return NULL;
Jim Grosbach1e20b962010-07-21 21:21:52 +0000642
Devang Patel5bc9fec2011-02-19 01:31:27 +0000643 // Add children
Craig Topper2d785db2013-07-03 04:17:25 +0000644 for (SmallVectorImpl<DIE *>::iterator I = Children.begin(),
Devang Patel5bc9fec2011-02-19 01:31:27 +0000645 E = Children.end(); I != E; ++I)
646 ScopeDIE->addChild(*I);
Devang Patel193f7202009-11-24 01:14:22 +0000647
Eric Christophere5212782012-09-12 23:36:19 +0000648 if (DS.isSubprogram() && ObjectPointer != NULL)
649 TheCU->addDIEEntry(ScopeDIE, dwarf::DW_AT_object_pointer,
650 dwarf::DW_FORM_ref4, ObjectPointer);
651
Jim Grosbach1e20b962010-07-21 21:21:52 +0000652 if (DS.isSubprogram())
Eric Christopher0ffe2b42011-11-10 19:25:34 +0000653 TheCU->addPubTypes(DISubprogram(DS));
Jim Grosbach1e20b962010-07-21 21:21:52 +0000654
Eric Christopher0ffe2b42011-11-10 19:25:34 +0000655 return ScopeDIE;
Devang Patel53bb5c92009-11-10 23:06:00 +0000656}
657
Eric Christopherb6dc8652012-11-27 22:43:45 +0000658// Look up the source id with the given directory and source file names.
659// If none currently exists, create a new id and insert it in the
660// SourceIds map. This can update DirectoryNames and SourceFileNames maps
661// as well.
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000662unsigned DwarfDebug::getOrCreateSourceID(StringRef FileName,
Manman Ren3de61b42013-03-07 01:42:00 +0000663 StringRef DirName, unsigned CUID) {
664 // If we use .loc in assembly, we can't separate .file entries according to
665 // compile units. Thus all files will belong to the default compile unit.
666 if (Asm->TM.hasMCUseLoc() &&
667 Asm->OutStreamer.getKind() == MCStreamer::SK_AsmStreamer)
668 CUID = 0;
669
Devang Patel1905a182010-09-16 20:57:49 +0000670 // If FE did not provide a file name, then assume stdin.
671 if (FileName.empty())
Manman Ren3de61b42013-03-07 01:42:00 +0000672 return getOrCreateSourceID("<stdin>", StringRef(), CUID);
Devang Patel23670e52011-03-24 20:30:50 +0000673
Nick Lewycky6c1a7032011-11-02 20:55:33 +0000674 // TODO: this might not belong here. See if we can factor this better.
675 if (DirName == CompilationDir)
676 DirName = "";
677
Manman Ren3de61b42013-03-07 01:42:00 +0000678 // FileIDCUMap stores the current ID for the given compile unit.
679 unsigned SrcId = FileIDCUMap[CUID] + 1;
Devang Patel1905a182010-09-16 20:57:49 +0000680
Manman Ren3de61b42013-03-07 01:42:00 +0000681 // We look up the CUID/file/dir by concatenating them with a zero byte.
Benjamin Kramer74612c22012-03-11 14:56:26 +0000682 SmallString<128> NamePair;
Manman Ren5044a932013-04-06 01:02:38 +0000683 NamePair += utostr(CUID);
Manman Ren3de61b42013-03-07 01:42:00 +0000684 NamePair += '\0';
Benjamin Kramer74612c22012-03-11 14:56:26 +0000685 NamePair += DirName;
686 NamePair += '\0'; // Zero bytes are not allowed in paths.
687 NamePair += FileName;
688
689 StringMapEntry<unsigned> &Ent = SourceIdMap.GetOrCreateValue(NamePair, SrcId);
690 if (Ent.getValue() != SrcId)
691 return Ent.getValue();
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000692
Manman Ren3de61b42013-03-07 01:42:00 +0000693 FileIDCUMap[CUID] = SrcId;
Rafael Espindola5c055632010-11-18 02:04:25 +0000694 // Print out a .file directive to specify files for .loc directives.
Manman Ren3de61b42013-03-07 01:42:00 +0000695 Asm->OutStreamer.EmitDwarfFileDirective(SrcId, DirName, FileName, CUID);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000696
697 return SrcId;
698}
699
Eric Christopher72c16552012-12-20 21:58:40 +0000700// Create new CompileUnit for the given metadata node with tag
701// DW_TAG_compile_unit.
Devang Patel94c7ddb2011-08-16 22:09:43 +0000702CompileUnit *DwarfDebug::constructCompileUnit(const MDNode *N) {
Devang Patele4b27562009-08-28 23:24:31 +0000703 DICompileUnit DIUnit(N);
Devang Patel65dbc902009-11-25 17:36:49 +0000704 StringRef FN = DIUnit.getFilename();
Nick Lewycky6c1a7032011-11-02 20:55:33 +0000705 CompilationDir = DIUnit.getDirectory();
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000706
707 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
Eli Benderskyd4a05e02012-12-03 18:45:45 +0000708 CompileUnit *NewCU = new CompileUnit(GlobalCUIndexCount++,
Eric Christopher9c57ad22013-05-08 00:58:51 +0000709 DIUnit.getLanguage(), Die, N, Asm,
Eric Christopher2e5d8702012-12-20 21:58:36 +0000710 this, &InfoHolder);
Manman Ren3de61b42013-03-07 01:42:00 +0000711
712 FileIDCUMap[NewCU->getUniqueID()] = 0;
713 // Call this to emit a .file directive if it wasn't emitted for the source
714 // file this CU comes from yet.
715 getOrCreateSourceID(FN, CompilationDir, NewCU->getUniqueID());
716
Nick Lewycky390c40d2011-10-27 06:44:11 +0000717 NewCU->addString(Die, dwarf::DW_AT_producer, DIUnit.getProducer());
Devang Patel3cbee302011-04-12 22:53:02 +0000718 NewCU->addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data2,
719 DIUnit.getLanguage());
Nick Lewycky390c40d2011-10-27 06:44:11 +0000720 NewCU->addString(Die, dwarf::DW_AT_name, FN);
Eric Christophere0828ec2013-04-09 19:23:15 +0000721
Eric Christopher6635cad2012-08-01 18:19:01 +0000722 // 2.17.1 requires that we use DW_AT_low_pc for a single entry point
Eric Christophere0828ec2013-04-09 19:23:15 +0000723 // into an entity. We're using 0 (or a NULL label) for this. For
724 // split dwarf it's in the skeleton CU so omit it here.
725 if (!useSplitDwarf())
726 NewCU->addLabelAddress(Die, dwarf::DW_AT_low_pc, NULL);
Manman Ren43213cf2013-02-05 21:52:47 +0000727
728 // Define start line table label for each Compile Unit.
729 MCSymbol *LineTableStartSym = Asm->GetTempSymbol("line_table_start",
730 NewCU->getUniqueID());
731 Asm->OutStreamer.getContext().setMCLineTableSymbol(LineTableStartSym,
732 NewCU->getUniqueID());
733
Manman Ren01cb18e2013-05-21 00:57:22 +0000734 // Use a single line table if we are using .loc and generating assembly.
735 bool UseTheFirstCU =
736 (Asm->TM.hasMCUseLoc() &&
737 Asm->OutStreamer.getKind() == MCStreamer::SK_AsmStreamer) ||
738 (NewCU->getUniqueID() == 0);
739
Devang Patel4a602ca2010-03-22 23:11:36 +0000740 // DW_AT_stmt_list is a offset of line number information for this
Eric Christophere0828ec2013-04-09 19:23:15 +0000741 // compile unit in debug_line section. For split dwarf this is
742 // left in the skeleton CU and so not included.
Manman Renf2d89ff2013-02-09 00:41:44 +0000743 // The line table entries are not always emitted in assembly, so it
744 // is not okay to use line_table_start here.
Eric Christophere0828ec2013-04-09 19:23:15 +0000745 if (!useSplitDwarf()) {
746 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
Carlo Kok46f0b6f2013-08-13 17:46:57 +0000747 NewCU->addLabel(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_sec_offset,
Manman Ren01cb18e2013-05-21 00:57:22 +0000748 UseTheFirstCU ?
Eric Christophere0828ec2013-04-09 19:23:15 +0000749 Asm->GetTempSymbol("section_line") : LineTableStartSym);
Manman Ren01cb18e2013-05-21 00:57:22 +0000750 else if (UseTheFirstCU)
Eric Christophere0828ec2013-04-09 19:23:15 +0000751 NewCU->addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4, 0);
752 else
753 NewCU->addDelta(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4,
754 LineTableStartSym, DwarfLineSectionSym);
755 }
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000756
Eric Christophere0828ec2013-04-09 19:23:15 +0000757 // If we're using split dwarf the compilation dir is going to be in the
758 // skeleton CU and so we don't need to duplicate it here.
759 if (!useSplitDwarf() && !CompilationDir.empty())
Nick Lewycky6c1a7032011-11-02 20:55:33 +0000760 NewCU->addString(Die, dwarf::DW_AT_comp_dir, CompilationDir);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000761 if (DIUnit.isOptimized())
Eric Christopher873cf0a2012-08-24 01:14:27 +0000762 NewCU->addFlag(Die, dwarf::DW_AT_APPLE_optimized);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000763
Devang Patel65dbc902009-11-25 17:36:49 +0000764 StringRef Flags = DIUnit.getFlags();
765 if (!Flags.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +0000766 NewCU->addString(Die, dwarf::DW_AT_APPLE_flags, Flags);
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000767
Nick Lewyckyd5d52132011-10-17 23:27:36 +0000768 if (unsigned RVer = DIUnit.getRunTimeVersion())
Devang Patel3cbee302011-04-12 22:53:02 +0000769 NewCU->addUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers,
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000770 dwarf::DW_FORM_data1, RVer);
771
Devang Patel163a9f72010-05-10 22:49:55 +0000772 if (!FirstCU)
773 FirstCU = NewCU;
Eric Christopher208cc6f2013-02-05 07:31:55 +0000774
Eric Christopher0e3e9b72012-12-10 23:34:43 +0000775 InfoHolder.addUnit(NewCU);
776
Devang Patel163a9f72010-05-10 22:49:55 +0000777 CUMap.insert(std::make_pair(N, NewCU));
Devang Patel94c7ddb2011-08-16 22:09:43 +0000778 return NewCU;
Devang Patel163a9f72010-05-10 22:49:55 +0000779}
780
Eric Christopherb6dc8652012-11-27 22:43:45 +0000781// Construct subprogram DIE.
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000782void DwarfDebug::constructSubprogramDIE(CompileUnit *TheCU,
Devang Patel3655a212011-08-15 23:36:40 +0000783 const MDNode *N) {
Rafael Espindolab0527282011-11-04 19:00:29 +0000784 CompileUnit *&CURef = SPMap[N];
785 if (CURef)
786 return;
787 CURef = TheCU;
788
Devang Patele4b27562009-08-28 23:24:31 +0000789 DISubprogram SP(N);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000790 if (!SP.isDefinition())
791 // This is a method declaration which will be handled while constructing
792 // class type.
Devang Patel13e16b62009-06-26 01:49:18 +0000793 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000794
Devang Pateldbc64af2011-08-15 17:24:54 +0000795 DIE *SubprogramDie = TheCU->getOrCreateSubprogramDIE(SP);
Stuart Hastings639336e2010-04-06 21:38:29 +0000796
797 // Add to map.
Devang Patel163a9f72010-05-10 22:49:55 +0000798 TheCU->insertDIE(N, SubprogramDie);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000799
800 // Add to context owner.
Devang Patel3cbee302011-04-12 22:53:02 +0000801 TheCU->addToContextOwner(SubprogramDie, SP.getContext());
Devang Patel0000fad2009-12-08 23:21:45 +0000802
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +0000803 // Expose as global, if requested.
Eric Christopherf04e4ef2013-08-19 21:07:38 +0000804 if (HasDwarfPubNames)
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +0000805 TheCU->addGlobalName(SP.getName(), SubprogramDie);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000806}
807
David Blaikie20d9e412013-05-07 21:35:53 +0000808void DwarfDebug::constructImportedEntityDIE(CompileUnit *TheCU,
David Blaikiec462db62013-04-22 06:12:31 +0000809 const MDNode *N) {
David Blaikie20d9e412013-05-07 21:35:53 +0000810 DIImportedEntity Module(N);
David Blaikiec462db62013-04-22 06:12:31 +0000811 if (!Module.Verify())
812 return;
David Blaikied2e0f7e2013-05-06 23:33:07 +0000813 if (DIE *D = TheCU->getOrCreateContextDIE(Module.getContext()))
David Blaikied1221e32013-05-08 06:01:38 +0000814 constructImportedEntityDIE(TheCU, Module, D);
David Blaikied2e0f7e2013-05-06 23:33:07 +0000815}
816
David Blaikied1221e32013-05-08 06:01:38 +0000817void DwarfDebug::constructImportedEntityDIE(CompileUnit *TheCU, const MDNode *N,
David Blaikied2e0f7e2013-05-06 23:33:07 +0000818 DIE *Context) {
David Blaikie20d9e412013-05-07 21:35:53 +0000819 DIImportedEntity Module(N);
David Blaikied2e0f7e2013-05-06 23:33:07 +0000820 if (!Module.Verify())
821 return;
David Blaikied1221e32013-05-08 06:01:38 +0000822 return constructImportedEntityDIE(TheCU, Module, Context);
David Blaikied2e0f7e2013-05-06 23:33:07 +0000823}
824
David Blaikied1221e32013-05-08 06:01:38 +0000825void DwarfDebug::constructImportedEntityDIE(CompileUnit *TheCU,
David Blaikie20d9e412013-05-07 21:35:53 +0000826 const DIImportedEntity &Module,
David Blaikied2e0f7e2013-05-06 23:33:07 +0000827 DIE *Context) {
828 assert(Module.Verify() &&
829 "Use one of the MDNode * overloads to handle invalid metadata");
830 assert(Context && "Should always have a context for an imported_module");
David Blaikie20d9e412013-05-07 21:35:53 +0000831 DIE *IMDie = new DIE(Module.getTag());
David Blaikiec462db62013-04-22 06:12:31 +0000832 TheCU->insertDIE(Module, IMDie);
David Blaikie20d9e412013-05-07 21:35:53 +0000833 DIE *EntityDie;
834 DIDescriptor Entity = Module.getEntity();
835 if (Entity.isNameSpace())
836 EntityDie = TheCU->getOrCreateNameSpace(DINameSpace(Entity));
837 else if (Entity.isSubprogram())
838 EntityDie = TheCU->getOrCreateSubprogramDIE(DISubprogram(Entity));
David Blaikieaa76a932013-05-08 06:01:41 +0000839 else if (Entity.isType())
840 EntityDie = TheCU->getOrCreateTypeDIE(DIType(Entity));
David Blaikie20d9e412013-05-07 21:35:53 +0000841 else
David Blaikieaa76a932013-05-08 06:01:41 +0000842 EntityDie = TheCU->getDIE(Entity);
David Blaikiec462db62013-04-22 06:12:31 +0000843 unsigned FileID = getOrCreateSourceID(Module.getContext().getFilename(),
844 Module.getContext().getDirectory(),
845 TheCU->getUniqueID());
846 TheCU->addUInt(IMDie, dwarf::DW_AT_decl_file, 0, FileID);
847 TheCU->addUInt(IMDie, dwarf::DW_AT_decl_line, 0, Module.getLineNumber());
Eric Christopherfdfc81f2013-06-24 23:20:02 +0000848 TheCU->addDIEEntry(IMDie, dwarf::DW_AT_import, dwarf::DW_FORM_ref4,
849 EntityDie);
David Blaikie7b72cc72013-05-20 22:50:35 +0000850 StringRef Name = Module.getName();
851 if (!Name.empty())
852 TheCU->addString(IMDie, dwarf::DW_AT_name, Name);
David Blaikied2e0f7e2013-05-06 23:33:07 +0000853 Context->addChild(IMDie);
David Blaikiec462db62013-04-22 06:12:31 +0000854}
855
Eric Christopherb6dc8652012-11-27 22:43:45 +0000856// Emit all Dwarf sections that should come prior to the content. Create
857// global DIEs and emit initial debug info sections. This is invoked by
858// the target AsmPrinter.
Eric Christopherc4639d62012-11-19 22:42:15 +0000859void DwarfDebug::beginModule() {
Devang Pateleac9c072010-04-27 19:46:33 +0000860 if (DisableDebugInfoPrinting)
861 return;
862
Eric Christopherc4639d62012-11-19 22:42:15 +0000863 const Module *M = MMI->getModule();
864
Nick Lewycky3bbb6f72011-07-29 03:49:23 +0000865 // If module has named metadata anchors then use them, otherwise scan the
866 // module using debug info finder to collect debug info.
Devang Patel30692ab2011-05-03 16:45:22 +0000867 NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu");
David Blaikiec0ec8a42013-03-11 23:39:23 +0000868 if (!CU_Nodes)
Devang Patel02e603f2011-08-15 23:47:24 +0000869 return;
Devang Patel30692ab2011-05-03 16:45:22 +0000870
David Blaikiec0ec8a42013-03-11 23:39:23 +0000871 // Emit initial sections so we can reference labels later.
872 emitSectionLabels();
873
874 for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i) {
875 DICompileUnit CUNode(CU_Nodes->getOperand(i));
876 CompileUnit *CU = constructCompileUnit(CUNode);
David Blaikie20d9e412013-05-07 21:35:53 +0000877 DIArray ImportedEntities = CUNode.getImportedEntities();
878 for (unsigned i = 0, e = ImportedEntities.getNumElements(); i != e; ++i)
David Blaikied2e0f7e2013-05-06 23:33:07 +0000879 ScopesWithImportedEntities.push_back(std::make_pair(
David Blaikie20d9e412013-05-07 21:35:53 +0000880 DIImportedEntity(ImportedEntities.getElement(i)).getContext(),
881 ImportedEntities.getElement(i)));
David Blaikied2e0f7e2013-05-06 23:33:07 +0000882 std::sort(ScopesWithImportedEntities.begin(),
883 ScopesWithImportedEntities.end(), CompareFirst());
David Blaikiec0ec8a42013-03-11 23:39:23 +0000884 DIArray GVs = CUNode.getGlobalVariables();
885 for (unsigned i = 0, e = GVs.getNumElements(); i != e; ++i)
886 CU->createGlobalVariableDIE(GVs.getElement(i));
887 DIArray SPs = CUNode.getSubprograms();
888 for (unsigned i = 0, e = SPs.getNumElements(); i != e; ++i)
889 constructSubprogramDIE(CU, SPs.getElement(i));
890 DIArray EnumTypes = CUNode.getEnumTypes();
891 for (unsigned i = 0, e = EnumTypes.getNumElements(); i != e; ++i)
892 CU->getOrCreateTypeDIE(EnumTypes.getElement(i));
893 DIArray RetainedTypes = CUNode.getRetainedTypes();
894 for (unsigned i = 0, e = RetainedTypes.getNumElements(); i != e; ++i)
895 CU->getOrCreateTypeDIE(RetainedTypes.getElement(i));
David Blaikiec462db62013-04-22 06:12:31 +0000896 // Emit imported_modules last so that the relevant context is already
897 // available.
David Blaikie20d9e412013-05-07 21:35:53 +0000898 for (unsigned i = 0, e = ImportedEntities.getNumElements(); i != e; ++i)
899 constructImportedEntityDIE(CU, ImportedEntities.getElement(i));
David Blaikiec0ec8a42013-03-11 23:39:23 +0000900 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000901
Chris Lattnerd850ac72010-04-05 02:19:28 +0000902 // Tell MMI that we have debug info.
903 MMI->setDebugInfoAvailability(true);
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000904
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000905 // Prime section data.
Chris Lattnerf0144122009-07-28 03:13:23 +0000906 SectionMap.insert(Asm->getObjFileLowering().getTextSection());
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000907}
908
Eric Christopher4117bec2012-11-22 00:59:49 +0000909// Attach DW_AT_inline attribute with inlined subprogram DIEs.
910void DwarfDebug::computeInlinedDIEs() {
Devang Patel53bb5c92009-11-10 23:06:00 +0000911 // Attach DW_AT_inline attribute with inlined subprogram DIEs.
912 for (SmallPtrSet<DIE *, 4>::iterator AI = InlinedSubprogramDIEs.begin(),
Eric Christopherbdab8002012-11-27 00:13:51 +0000913 AE = InlinedSubprogramDIEs.end(); AI != AE; ++AI) {
Devang Patel53bb5c92009-11-10 23:06:00 +0000914 DIE *ISP = *AI;
Devang Patel3cbee302011-04-12 22:53:02 +0000915 FirstCU->addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
Devang Patel53bb5c92009-11-10 23:06:00 +0000916 }
Rafael Espindolad1ac3a42011-11-12 01:57:54 +0000917 for (DenseMap<const MDNode *, DIE *>::iterator AI = AbstractSPDies.begin(),
Eric Christopherbdab8002012-11-27 00:13:51 +0000918 AE = AbstractSPDies.end(); AI != AE; ++AI) {
Rafael Espindolad1ac3a42011-11-12 01:57:54 +0000919 DIE *ISP = AI->second;
920 if (InlinedSubprogramDIEs.count(ISP))
921 continue;
922 FirstCU->addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
923 }
Eric Christopher4117bec2012-11-22 00:59:49 +0000924}
925
926// Collect info for variables that were optimized out.
927void DwarfDebug::collectDeadVariables() {
928 const Module *M = MMI->getModule();
929 DenseMap<const MDNode *, LexicalScope *> DeadFnScopeMap;
930
931 if (NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu")) {
932 for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i) {
933 DICompileUnit TheCU(CU_Nodes->getOperand(i));
934 DIArray Subprograms = TheCU.getSubprograms();
935 for (unsigned i = 0, e = Subprograms.getNumElements(); i != e; ++i) {
Eric Christopherbdab8002012-11-27 00:13:51 +0000936 DISubprogram SP(Subprograms.getElement(i));
937 if (ProcessedSPNodes.count(SP) != 0) continue;
Manman Rend03d2b22013-07-08 18:33:29 +0000938 if (!SP.isSubprogram()) continue;
Eric Christopherbdab8002012-11-27 00:13:51 +0000939 if (!SP.isDefinition()) continue;
940 DIArray Variables = SP.getVariables();
941 if (Variables.getNumElements() == 0) continue;
Eric Christopher4117bec2012-11-22 00:59:49 +0000942
Eric Christopherbdab8002012-11-27 00:13:51 +0000943 LexicalScope *Scope =
944 new LexicalScope(NULL, DIDescriptor(SP), NULL, false);
945 DeadFnScopeMap[SP] = Scope;
Eric Christopher4117bec2012-11-22 00:59:49 +0000946
Eric Christopherbdab8002012-11-27 00:13:51 +0000947 // Construct subprogram DIE and add variables DIEs.
948 CompileUnit *SPCU = CUMap.lookup(TheCU);
949 assert(SPCU && "Unable to find Compile Unit!");
950 constructSubprogramDIE(SPCU, SP);
951 DIE *ScopeDIE = SPCU->getDIE(SP);
952 for (unsigned vi = 0, ve = Variables.getNumElements(); vi != ve; ++vi) {
953 DIVariable DV(Variables.getElement(vi));
Manman Rend03d2b22013-07-08 18:33:29 +0000954 if (!DV.isVariable()) continue;
Chandler Carruth05497cc2013-07-27 11:09:58 +0000955 DbgVariable NewVar(DV, NULL);
Eric Christopherbdab8002012-11-27 00:13:51 +0000956 if (DIE *VariableDIE =
Chandler Carruth05497cc2013-07-27 11:09:58 +0000957 SPCU->constructVariableDIE(&NewVar, Scope->isAbstractScope()))
Eric Christopherbdab8002012-11-27 00:13:51 +0000958 ScopeDIE->addChild(VariableDIE);
959 }
Eric Christopher4117bec2012-11-22 00:59:49 +0000960 }
961 }
962 }
963 DeleteContainerSeconds(DeadFnScopeMap);
964}
965
Eric Christopher0d27ca12013-08-08 23:45:55 +0000966// Type Signature [7.27] and ODR Hash code.
Eric Christopher3dee5752013-07-26 17:02:41 +0000967
968/// \brief Grabs the string in whichever attribute is passed in and returns
Eric Christopherb7669132013-08-07 01:18:33 +0000969/// a reference to it. Returns "" if the attribute doesn't exist.
Eric Christopher3dee5752013-07-26 17:02:41 +0000970static StringRef getDIEStringAttr(DIE *Die, unsigned Attr) {
Eric Christopherb7669132013-08-07 01:18:33 +0000971 DIEValue *V = Die->findAttribute(Attr);
Eric Christopher3dee5752013-07-26 17:02:41 +0000972
Eric Christopherb7669132013-08-07 01:18:33 +0000973 if (DIEString *S = dyn_cast_or_null<DIEString>(V))
974 return S->getString();
975
Eric Christopher3dee5752013-07-26 17:02:41 +0000976 return StringRef("");
977}
978
Eric Christopher3dee5752013-07-26 17:02:41 +0000979/// Return true if the current DIE is contained within an anonymous namespace.
980static bool isContainedInAnonNamespace(DIE *Die) {
981 DIE *Parent = Die->getParent();
982
983 while (Parent) {
Eric Christopher86aa03d2013-07-29 23:53:08 +0000984 if (Parent->getTag() == dwarf::DW_TAG_namespace &&
985 getDIEStringAttr(Parent, dwarf::DW_AT_name) == "")
Eric Christopher3dee5752013-07-26 17:02:41 +0000986 return true;
987 Parent = Parent->getParent();
988 }
989
990 return false;
991}
992
Eric Christopher028f3472013-08-07 01:18:24 +0000993/// Test if the current CU language is C++ and that we have
994/// a named type that is not contained in an anonymous namespace.
995static bool shouldAddODRHash(CompileUnit *CU, DIE *Die) {
Eric Christopherf76e1182013-08-07 08:35:10 +0000996 return CU->getLanguage() == dwarf::DW_LANG_C_plus_plus &&
997 getDIEStringAttr(Die, dwarf::DW_AT_name) != "" &&
998 !isContainedInAnonNamespace(Die);
Eric Christopher0d27ca12013-08-08 23:45:55 +0000999}
Eric Christopher028f3472013-08-07 01:18:24 +00001000
Eric Christopher4117bec2012-11-22 00:59:49 +00001001void DwarfDebug::finalizeModuleInfo() {
1002 // Collect info for variables that were optimized out.
1003 collectDeadVariables();
1004
1005 // Attach DW_AT_inline attribute with inlined subprogram DIEs.
1006 computeInlinedDIEs();
Devang Patel53bb5c92009-11-10 23:06:00 +00001007
Eric Christopherbe482042013-07-29 22:24:32 +00001008 // Split out type units and conditionally add an ODR tag to the split
1009 // out type.
Eric Christopher3dee5752013-07-26 17:02:41 +00001010 // FIXME: Do type splitting.
1011 for (unsigned i = 0, e = TypeUnits.size(); i != e; ++i) {
Eric Christopher3dee5752013-07-26 17:02:41 +00001012 DIE *Die = TypeUnits[i];
Eric Christopher0d27ca12013-08-08 23:45:55 +00001013 DIEHash Hash;
Eric Christopher028f3472013-08-07 01:18:24 +00001014 // If we've requested ODR hashes and it's applicable for an ODR hash then
1015 // add the ODR signature now.
Eric Christopher0d27ca12013-08-08 23:45:55 +00001016 // FIXME: This should be added onto the type unit, not the type, but this
1017 // works as an intermediate stage.
Eric Christopher028f3472013-08-07 01:18:24 +00001018 if (GenerateODRHash && shouldAddODRHash(CUMap.begin()->second, Die))
Eric Christopher0d27ca12013-08-08 23:45:55 +00001019 CUMap.begin()->second->addUInt(Die, dwarf::DW_AT_GNU_odr_signature,
1020 dwarf::DW_FORM_data8,
1021 Hash.computeDIEODRSignature(Die));
Eric Christopher3dee5752013-07-26 17:02:41 +00001022 }
1023
Eric Christopherf962c022013-08-12 20:27:48 +00001024 // Handle anything that needs to be done on a per-cu basis.
1025 for (DenseMap<const MDNode *, CompileUnit *>::iterator CUI = CUMap.begin(),
1026 CUE = CUMap.end();
1027 CUI != CUE; ++CUI) {
1028 CompileUnit *TheCU = CUI->second;
1029 // Emit DW_AT_containing_type attribute to connect types with their
1030 // vtable holding type.
1031 TheCU->constructContainingTypeDIEs();
1032
1033 // If we're splitting the dwarf out now that we've got the entire
1034 // CU then construct a skeleton CU based upon it.
1035 if (useSplitDwarf()) {
Eric Christopher0710bfa2013-08-13 01:21:55 +00001036 uint64_t ID = 0;
1037 if (GenerateCUHash) {
1038 DIEHash CUHash;
1039 ID = CUHash.computeCUSignature(TheCU->getCUDie());
1040 }
Eric Christopherf962c022013-08-12 20:27:48 +00001041 // This should be a unique identifier when we want to build .dwp files.
1042 TheCU->addUInt(TheCU->getCUDie(), dwarf::DW_AT_GNU_dwo_id,
Eric Christopher0710bfa2013-08-13 01:21:55 +00001043 dwarf::DW_FORM_data8, ID);
Eric Christopherf962c022013-08-12 20:27:48 +00001044 // Now construct the skeleton CU associated.
1045 CompileUnit *SkCU = constructSkeletonCU(CUI->first);
1046 // This should be a unique identifier when we want to build .dwp files.
1047 SkCU->addUInt(SkCU->getCUDie(), dwarf::DW_AT_GNU_dwo_id,
Eric Christopher0710bfa2013-08-13 01:21:55 +00001048 dwarf::DW_FORM_data8, ID);
Eric Christopherf962c022013-08-12 20:27:48 +00001049 }
1050 }
1051
1052 // Compute DIE offsets and sizes.
Eric Christopher0e3e9b72012-12-10 23:34:43 +00001053 InfoHolder.computeSizeAndOffsets();
1054 if (useSplitDwarf())
1055 SkeletonHolder.computeSizeAndOffsets();
Eric Christopher4117bec2012-11-22 00:59:49 +00001056}
1057
1058void DwarfDebug::endSections() {
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001059 // Standard sections final addresses.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00001060 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getTextSection());
Chris Lattnerc0215722010-04-04 19:25:43 +00001061 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("text_end"));
Chris Lattner6c2f9e12009-08-19 05:49:37 +00001062 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getDataSection());
Chris Lattnerc0215722010-04-04 19:25:43 +00001063 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("data_end"));
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001064
1065 // End text sections.
Benjamin Kramerb4c9d9c2012-10-31 13:45:49 +00001066 for (unsigned I = 0, E = SectionMap.size(); I != E; ++I) {
1067 Asm->OutStreamer.SwitchSection(SectionMap[I]);
1068 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("section_end", I+1));
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001069 }
Eric Christopher4117bec2012-11-22 00:59:49 +00001070}
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001071
Eric Christopherb6dc8652012-11-27 22:43:45 +00001072// Emit all Dwarf sections that should come after the content.
Eric Christopher4117bec2012-11-22 00:59:49 +00001073void DwarfDebug::endModule() {
1074
1075 if (!FirstCU) return;
1076
1077 // End any existing sections.
1078 // TODO: Does this need to happen?
1079 endSections();
1080
1081 // Finalize the debug info for the module.
1082 finalizeModuleInfo();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001083
Eric Christopher4daaed12012-12-10 19:51:21 +00001084 if (!useSplitDwarf()) {
Eric Christopher42885022012-11-27 22:43:42 +00001085 // Emit all the DIEs into a debug info section.
1086 emitDebugInfo();
Eric Christopher74802f72012-11-27 00:41:54 +00001087
Eric Christopher42885022012-11-27 22:43:42 +00001088 // Corresponding abbreviations into a abbrev section.
1089 emitAbbreviations();
1090
1091 // Emit info into a debug loc section.
1092 emitDebugLoc();
1093
1094 // Emit info into a debug aranges section.
1095 emitDebugARanges();
1096
1097 // Emit info into a debug ranges section.
1098 emitDebugRanges();
1099
1100 // Emit info into a debug macinfo section.
1101 emitDebugMacInfo();
1102
1103 // Emit inline info.
1104 // TODO: When we don't need the option anymore we
1105 // can remove all of the code that this section
1106 // depends upon.
1107 if (useDarwinGDBCompat())
1108 emitDebugInlineInfo();
1109 } else {
Eric Christopher0b944ee2012-12-11 19:42:09 +00001110 // TODO: Fill this in for separated debug sections and separate
Eric Christopher42885022012-11-27 22:43:42 +00001111 // out information into new sections.
1112
Eric Christopher98e237f2012-11-30 23:59:06 +00001113 // Emit the debug info section and compile units.
Eric Christopher42885022012-11-27 22:43:42 +00001114 emitDebugInfo();
Eric Christopher98e237f2012-11-30 23:59:06 +00001115 emitDebugInfoDWO();
Eric Christopher42885022012-11-27 22:43:42 +00001116
1117 // Corresponding abbreviations into a abbrev section.
1118 emitAbbreviations();
Eric Christopher6eebe472012-12-19 22:02:53 +00001119 emitDebugAbbrevDWO();
Eric Christopher42885022012-11-27 22:43:42 +00001120
1121 // Emit info into a debug loc section.
1122 emitDebugLoc();
1123
1124 // Emit info into a debug aranges section.
1125 emitDebugARanges();
1126
1127 // Emit info into a debug ranges section.
1128 emitDebugRanges();
1129
1130 // Emit info into a debug macinfo section.
1131 emitDebugMacInfo();
1132
Eric Christopher72f7bfb2013-01-15 23:56:56 +00001133 // Emit DWO addresses.
1134 InfoHolder.emitAddresses(Asm->getObjFileLowering().getDwarfAddrSection());
1135
Eric Christopher42885022012-11-27 22:43:42 +00001136 // Emit inline info.
1137 // TODO: When we don't need the option anymore we
1138 // can remove all of the code that this section
1139 // depends upon.
1140 if (useDarwinGDBCompat())
1141 emitDebugInlineInfo();
1142 }
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001143
Eric Christopher9d9f5a52012-08-23 07:32:06 +00001144 // Emit info into the dwarf accelerator table sections.
Eric Christopher20f47ab2012-08-23 22:36:40 +00001145 if (useDwarfAccelTables()) {
Eric Christopher09ac3d82011-11-07 09:24:32 +00001146 emitAccelNames();
1147 emitAccelObjC();
1148 emitAccelNamespaces();
1149 emitAccelTypes();
1150 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001151
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00001152 // Emit info into a debug pubnames section, if requested.
Eric Christopherf04e4ef2013-08-19 21:07:38 +00001153 if (HasDwarfPubNames)
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00001154 emitDebugPubnames();
1155
Devang Patel193f7202009-11-24 01:14:22 +00001156 // Emit info into a debug pubtypes section.
Eric Christopher360f0062012-08-23 07:10:56 +00001157 // TODO: When we don't need the option anymore we can
1158 // remove all of the code that adds to the table.
Eric Christopher20f47ab2012-08-23 22:36:40 +00001159 if (useDarwinGDBCompat())
Eric Christopher360f0062012-08-23 07:10:56 +00001160 emitDebugPubTypes();
Devang Patel193f7202009-11-24 01:14:22 +00001161
Eric Christopher42885022012-11-27 22:43:42 +00001162 // Finally emit string information into a string table.
Eric Christopherfcdbecb2012-11-27 06:49:23 +00001163 emitDebugStr();
Eric Christopher64f824c2012-12-27 02:14:01 +00001164 if (useSplitDwarf())
1165 emitDebugStrDWO();
Eric Christopherfcdbecb2012-11-27 06:49:23 +00001166
Devang Patele9a1cca2010-08-02 17:32:15 +00001167 // clean up.
Devang Patel94c7ddb2011-08-16 22:09:43 +00001168 SPMap.clear();
Devang Patel163a9f72010-05-10 22:49:55 +00001169 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
1170 E = CUMap.end(); I != E; ++I)
1171 delete I->second;
Eric Christopher9ec87b32012-12-10 19:51:18 +00001172
Craig Topper2d785db2013-07-03 04:17:25 +00001173 for (SmallVectorImpl<CompileUnit *>::iterator I = SkeletonCUs.begin(),
Eric Christopher01776a52013-02-06 21:53:56 +00001174 E = SkeletonCUs.end(); I != E; ++I)
1175 delete *I;
Eric Christopher9ec87b32012-12-10 19:51:18 +00001176
Eric Christopher98e237f2012-11-30 23:59:06 +00001177 // Reset these for the next Module if we have one.
1178 FirstCU = NULL;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001179}
1180
Eric Christopherb6dc8652012-11-27 22:43:45 +00001181// Find abstract variable, if any, associated with Var.
Devang Patelb549bcf2011-08-10 21:50:54 +00001182DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &DV,
Chris Lattnerde4845c2010-04-02 19:42:39 +00001183 DebugLoc ScopeLoc) {
Devang Patelb549bcf2011-08-10 21:50:54 +00001184 LLVMContext &Ctx = DV->getContext();
1185 // More then one inlined variable corresponds to one abstract variable.
1186 DIVariable Var = cleanseInlinedVariable(DV, Ctx);
Devang Patel2db49d72010-05-07 18:11:54 +00001187 DbgVariable *AbsDbgVariable = AbstractVariables.lookup(Var);
Devang Patel53bb5c92009-11-10 23:06:00 +00001188 if (AbsDbgVariable)
1189 return AbsDbgVariable;
1190
Devang Patelbf47fdb2011-08-10 20:55:27 +00001191 LexicalScope *Scope = LScopes.findAbstractScope(ScopeLoc.getScope(Ctx));
Devang Patel53bb5c92009-11-10 23:06:00 +00001192 if (!Scope)
1193 return NULL;
1194
Devang Patel5a1a67c2011-08-15 19:01:20 +00001195 AbsDbgVariable = new DbgVariable(Var, NULL);
Devang Patelbf47fdb2011-08-10 20:55:27 +00001196 addScopeVariable(Scope, AbsDbgVariable);
Devang Patel2db49d72010-05-07 18:11:54 +00001197 AbstractVariables[Var] = AbsDbgVariable;
Devang Patel53bb5c92009-11-10 23:06:00 +00001198 return AbsDbgVariable;
1199}
1200
Eric Christopherb6dc8652012-11-27 22:43:45 +00001201// If Var is a current function argument then add it to CurrentFnArguments list.
Devang Patel0478c152011-03-01 22:58:55 +00001202bool DwarfDebug::addCurrentFnArgument(const MachineFunction *MF,
Devang Patelbf47fdb2011-08-10 20:55:27 +00001203 DbgVariable *Var, LexicalScope *Scope) {
1204 if (!LScopes.isCurrentFunctionScope(Scope))
Devang Patel0478c152011-03-01 22:58:55 +00001205 return false;
1206 DIVariable DV = Var->getVariable();
1207 if (DV.getTag() != dwarf::DW_TAG_arg_variable)
1208 return false;
1209 unsigned ArgNo = DV.getArgNumber();
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001210 if (ArgNo == 0)
Devang Patel0478c152011-03-01 22:58:55 +00001211 return false;
1212
Devang Patelcb3a6572011-03-03 20:02:02 +00001213 size_t Size = CurrentFnArguments.size();
1214 if (Size == 0)
Devang Patel0478c152011-03-01 22:58:55 +00001215 CurrentFnArguments.resize(MF->getFunction()->arg_size());
Devang Patelbbd0f452011-03-03 21:49:41 +00001216 // llvm::Function argument size is not good indicator of how many
Devang Patel6f676be2011-03-03 20:08:10 +00001217 // arguments does the function have at source level.
1218 if (ArgNo > Size)
Devang Patelcb3a6572011-03-03 20:02:02 +00001219 CurrentFnArguments.resize(ArgNo * 2);
Devang Patel0478c152011-03-01 22:58:55 +00001220 CurrentFnArguments[ArgNo - 1] = Var;
1221 return true;
1222}
1223
Eric Christopherb6dc8652012-11-27 22:43:45 +00001224// Collect variable information from side table maintained by MMI.
Jim Grosbach1e20b962010-07-21 21:21:52 +00001225void
Nick Lewycky3bbb6f72011-07-29 03:49:23 +00001226DwarfDebug::collectVariableInfoFromMMITable(const MachineFunction *MF,
Devang Patelee432862010-05-20 19:57:06 +00001227 SmallPtrSet<const MDNode *, 16> &Processed) {
Devang Patele717faa2009-10-06 01:26:37 +00001228 MachineModuleInfo::VariableDbgInfoMapTy &VMap = MMI->getVariableDbgInfo();
1229 for (MachineModuleInfo::VariableDbgInfoMapTy::iterator VI = VMap.begin(),
1230 VE = VMap.end(); VI != VE; ++VI) {
Devang Patele9f8f5e2010-05-07 20:54:48 +00001231 const MDNode *Var = VI->first;
Devang Patel53bb5c92009-11-10 23:06:00 +00001232 if (!Var) continue;
Devang Patel98e1cac2010-05-14 21:01:35 +00001233 Processed.insert(Var);
Chris Lattnerde4845c2010-04-02 19:42:39 +00001234 DIVariable DV(Var);
1235 const std::pair<unsigned, DebugLoc> &VP = VI->second;
Devang Patel53bb5c92009-11-10 23:06:00 +00001236
Devang Patelbf47fdb2011-08-10 20:55:27 +00001237 LexicalScope *Scope = LScopes.findLexicalScope(VP.second);
Jim Grosbach1e20b962010-07-21 21:21:52 +00001238
Devang Patelfb0ee432009-11-10 23:20:04 +00001239 // If variable scope is not found then skip this variable.
Chris Lattnerde4845c2010-04-02 19:42:39 +00001240 if (Scope == 0)
Devang Patelfb0ee432009-11-10 23:20:04 +00001241 continue;
Devang Patel53bb5c92009-11-10 23:06:00 +00001242
Devang Patel26c1e562010-05-20 16:36:41 +00001243 DbgVariable *AbsDbgVariable = findAbstractVariable(DV, VP.second);
Devang Patel5a1a67c2011-08-15 19:01:20 +00001244 DbgVariable *RegVar = new DbgVariable(DV, AbsDbgVariable);
Devang Patelff9dd0a2011-08-15 21:24:36 +00001245 RegVar->setFrameIndex(VP.first);
Devang Patel0478c152011-03-01 22:58:55 +00001246 if (!addCurrentFnArgument(MF, RegVar, Scope))
Devang Patelbf47fdb2011-08-10 20:55:27 +00001247 addScopeVariable(Scope, RegVar);
Devang Patel5a1a67c2011-08-15 19:01:20 +00001248 if (AbsDbgVariable)
Devang Patelff9dd0a2011-08-15 21:24:36 +00001249 AbsDbgVariable->setFrameIndex(VP.first);
Devang Patele717faa2009-10-06 01:26:37 +00001250 }
Devang Patelee432862010-05-20 19:57:06 +00001251}
Devang Patel90a48ad2010-03-15 18:33:46 +00001252
Eric Christopherb6dc8652012-11-27 22:43:45 +00001253// Return true if debug value, encoded by DBG_VALUE instruction, is in a
1254// defined reg.
Devang Patelc3f5f782010-05-25 23:40:22 +00001255static bool isDbgValueInDefinedReg(const MachineInstr *MI) {
Nick Lewycky746cb672011-10-26 22:55:33 +00001256 assert(MI->isDebugValue() && "Invalid DBG_VALUE machine instruction!");
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001257 return MI->getNumOperands() == 3 &&
1258 MI->getOperand(0).isReg() && MI->getOperand(0).getReg() &&
Adrian Prantl35176402013-07-09 20:28:37 +00001259 (MI->getOperand(1).isImm() ||
1260 (MI->getOperand(1).isReg() && MI->getOperand(1).getReg() == 0U));
Devang Patelc3f5f782010-05-25 23:40:22 +00001261}
1262
Eric Christopherb6dc8652012-11-27 22:43:45 +00001263// Get .debug_loc entry for the instruction range starting at MI.
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001264static DotDebugLocEntry getDebugLocEntry(AsmPrinter *Asm,
1265 const MCSymbol *FLabel,
Devang Patel90b40412011-07-08 17:09:57 +00001266 const MCSymbol *SLabel,
1267 const MachineInstr *MI) {
1268 const MDNode *Var = MI->getOperand(MI->getNumOperands() - 1).getMetadata();
1269
David Blaikie6d9dbd52013-06-16 20:34:15 +00001270 assert(MI->getNumOperands() == 3);
Adrian Prantl35176402013-07-09 20:28:37 +00001271 if (MI->getOperand(0).isReg()) {
Devang Patel90b40412011-07-08 17:09:57 +00001272 MachineLocation MLoc;
Adrian Prantl35176402013-07-09 20:28:37 +00001273 // If the second operand is an immediate, this is a
1274 // register-indirect address.
1275 if (!MI->getOperand(1).isImm())
Adrian Prantl13131e62013-04-26 21:57:17 +00001276 MLoc.set(MI->getOperand(0).getReg());
1277 else
1278 MLoc.set(MI->getOperand(0).getReg(), MI->getOperand(1).getImm());
Devang Patel90b40412011-07-08 17:09:57 +00001279 return DotDebugLocEntry(FLabel, SLabel, MLoc, Var);
1280 }
1281 if (MI->getOperand(0).isImm())
1282 return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getImm());
1283 if (MI->getOperand(0).isFPImm())
1284 return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getFPImm());
1285 if (MI->getOperand(0).isCImm())
1286 return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getCImm());
1287
Craig Topper5e25ee82012-02-05 08:31:47 +00001288 llvm_unreachable("Unexpected 3 operand DBG_VALUE instruction!");
Devang Patel90b40412011-07-08 17:09:57 +00001289}
1290
Eric Christopherb6dc8652012-11-27 22:43:45 +00001291// Find variables for each lexical scope.
Jim Grosbach1e20b962010-07-21 21:21:52 +00001292void
Devang Patel78e127d2010-06-25 22:07:34 +00001293DwarfDebug::collectVariableInfo(const MachineFunction *MF,
1294 SmallPtrSet<const MDNode *, 16> &Processed) {
Jim Grosbach1e20b962010-07-21 21:21:52 +00001295
Eric Christopher4e976452013-07-03 21:37:03 +00001296 // Grab the variable info that was squirreled away in the MMI side-table.
Devang Patelee432862010-05-20 19:57:06 +00001297 collectVariableInfoFromMMITable(MF, Processed);
1298
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001299 for (SmallVectorImpl<const MDNode*>::const_iterator
1300 UVI = UserVariables.begin(), UVE = UserVariables.end(); UVI != UVE;
1301 ++UVI) {
1302 const MDNode *Var = *UVI;
1303 if (Processed.count(Var))
Devang Patelee432862010-05-20 19:57:06 +00001304 continue;
1305
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001306 // History contains relevant DBG_VALUE instructions for Var and instructions
1307 // clobbering it.
1308 SmallVectorImpl<const MachineInstr*> &History = DbgValues[Var];
1309 if (History.empty())
1310 continue;
1311 const MachineInstr *MInsn = History.front();
Devang Patelc3f5f782010-05-25 23:40:22 +00001312
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001313 DIVariable DV(Var);
Devang Patelbf47fdb2011-08-10 20:55:27 +00001314 LexicalScope *Scope = NULL;
Devang Pateld8720f42010-05-27 20:25:04 +00001315 if (DV.getTag() == dwarf::DW_TAG_arg_variable &&
1316 DISubprogram(DV.getContext()).describes(MF->getFunction()))
Devang Patelbf47fdb2011-08-10 20:55:27 +00001317 Scope = LScopes.getCurrentFunctionScope();
David Blaikiec0ec8a42013-03-11 23:39:23 +00001318 else if (MDNode *IA = DV.getInlinedAt())
1319 Scope = LScopes.findInlinedScope(DebugLoc::getFromDILocation(IA));
1320 else
1321 Scope = LScopes.findLexicalScope(cast<MDNode>(DV->getOperand(1)));
Devang Patelee432862010-05-20 19:57:06 +00001322 // If variable scope is not found then skip this variable.
Devang Patelc0c5a262010-05-21 00:10:20 +00001323 if (!Scope)
Devang Patelee432862010-05-20 19:57:06 +00001324 continue;
1325
1326 Processed.insert(DV);
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001327 assert(MInsn->isDebugValue() && "History must begin with debug value");
Devang Patel5a1a67c2011-08-15 19:01:20 +00001328 DbgVariable *AbsVar = findAbstractVariable(DV, MInsn->getDebugLoc());
1329 DbgVariable *RegVar = new DbgVariable(DV, AbsVar);
Devang Patel0478c152011-03-01 22:58:55 +00001330 if (!addCurrentFnArgument(MF, RegVar, Scope))
Devang Patelbf47fdb2011-08-10 20:55:27 +00001331 addScopeVariable(Scope, RegVar);
Devang Patel5a1a67c2011-08-15 19:01:20 +00001332 if (AbsVar)
Devang Patelff9dd0a2011-08-15 21:24:36 +00001333 AbsVar->setMInsn(MInsn);
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001334
Eric Christopherc56e3f02012-10-08 20:48:54 +00001335 // Simplify ranges that are fully coalesced.
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001336 if (History.size() <= 1 || (History.size() == 2 &&
1337 MInsn->isIdenticalTo(History.back()))) {
Devang Patelff9dd0a2011-08-15 21:24:36 +00001338 RegVar->setMInsn(MInsn);
Devang Patelc3f5f782010-05-25 23:40:22 +00001339 continue;
1340 }
1341
Eric Christopher498703b2013-01-28 17:33:26 +00001342 // Handle multiple DBG_VALUE instructions describing one variable.
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001343 RegVar->setDotDebugLocOffset(DotDebugLocEntries.size());
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001344
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001345 for (SmallVectorImpl<const MachineInstr*>::const_iterator
1346 HI = History.begin(), HE = History.end(); HI != HE; ++HI) {
1347 const MachineInstr *Begin = *HI;
1348 assert(Begin->isDebugValue() && "Invalid History entry");
Jakob Stoklund Olesene17232e2011-03-22 00:21:41 +00001349
Devang Patel4ada1d72011-06-01 23:00:17 +00001350 // Check if DBG_VALUE is truncating a range.
1351 if (Begin->getNumOperands() > 1 && Begin->getOperand(0).isReg()
1352 && !Begin->getOperand(0).getReg())
1353 continue;
1354
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001355 // Compute the range for a register location.
1356 const MCSymbol *FLabel = getLabelBeforeInsn(Begin);
1357 const MCSymbol *SLabel = 0;
1358
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001359 if (HI + 1 == HE)
1360 // If Begin is the last instruction in History then its value is valid
Chris Lattner7a2bdde2011-04-15 05:18:47 +00001361 // until the end of the function.
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001362 SLabel = FunctionEndSym;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001363 else {
1364 const MachineInstr *End = HI[1];
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001365 DEBUG(dbgs() << "DotDebugLoc Pair:\n"
Devang Patel476df5f2011-07-07 21:44:42 +00001366 << "\t" << *Begin << "\t" << *End << "\n");
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001367 if (End->isDebugValue())
1368 SLabel = getLabelBeforeInsn(End);
1369 else {
1370 // End is a normal instruction clobbering the range.
1371 SLabel = getLabelAfterInsn(End);
1372 assert(SLabel && "Forgot label after clobber instruction");
1373 ++HI;
1374 }
1375 }
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001376
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001377 // The value is valid until the next DBG_VALUE or clobber.
Eric Christopherabbb2002011-12-16 23:42:31 +00001378 DotDebugLocEntries.push_back(getDebugLocEntry(Asm, FLabel, SLabel,
1379 Begin));
Devang Patelc3f5f782010-05-25 23:40:22 +00001380 }
1381 DotDebugLocEntries.push_back(DotDebugLocEntry());
Devang Patel90a48ad2010-03-15 18:33:46 +00001382 }
Devang Patel98e1cac2010-05-14 21:01:35 +00001383
1384 // Collect info for variables that were optimized out.
Devang Patel93d39be2011-08-19 23:28:12 +00001385 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
1386 DIArray Variables = DISubprogram(FnScope->getScopeNode()).getVariables();
1387 for (unsigned i = 0, e = Variables.getNumElements(); i != e; ++i) {
1388 DIVariable DV(Variables.getElement(i));
Manman Rend03d2b22013-07-08 18:33:29 +00001389 if (!DV || !DV.isVariable() || !Processed.insert(DV))
Devang Patel93d39be2011-08-19 23:28:12 +00001390 continue;
1391 if (LexicalScope *Scope = LScopes.findLexicalScope(DV.getContext()))
1392 addScopeVariable(Scope, new DbgVariable(DV, NULL));
Devang Patel98e1cac2010-05-14 21:01:35 +00001393 }
Devang Patelc3f5f782010-05-25 23:40:22 +00001394}
Devang Patel98e1cac2010-05-14 21:01:35 +00001395
Eric Christopherb6dc8652012-11-27 22:43:45 +00001396// Return Label preceding the instruction.
Eric Christopher72f7bfb2013-01-15 23:56:56 +00001397MCSymbol *DwarfDebug::getLabelBeforeInsn(const MachineInstr *MI) {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001398 MCSymbol *Label = LabelsBeforeInsn.lookup(MI);
1399 assert(Label && "Didn't insert label before instruction");
1400 return Label;
Devang Patelc3f5f782010-05-25 23:40:22 +00001401}
1402
Eric Christopherb6dc8652012-11-27 22:43:45 +00001403// Return Label immediately following the instruction.
Eric Christopher72f7bfb2013-01-15 23:56:56 +00001404MCSymbol *DwarfDebug::getLabelAfterInsn(const MachineInstr *MI) {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001405 return LabelsAfterInsn.lookup(MI);
Devang Patele717faa2009-10-06 01:26:37 +00001406}
1407
Eric Christopherb6dc8652012-11-27 22:43:45 +00001408// Process beginning of an instruction.
Devang Patelcbbe2872010-10-26 17:49:02 +00001409void DwarfDebug::beginInstruction(const MachineInstr *MI) {
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001410 // Check if source location changes, but ignore DBG_VALUE locations.
1411 if (!MI->isDebugValue()) {
1412 DebugLoc DL = MI->getDebugLoc();
1413 if (DL != PrevInstLoc && (!DL.isUnknown() || UnknownLocations)) {
Eric Christopher60b35f42012-04-05 20:39:05 +00001414 unsigned Flags = 0;
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001415 PrevInstLoc = DL;
Devang Patel4243e672011-05-11 19:22:19 +00001416 if (DL == PrologEndLoc) {
1417 Flags |= DWARF2_FLAG_PROLOGUE_END;
1418 PrologEndLoc = DebugLoc();
1419 }
Eric Christopher60b35f42012-04-05 20:39:05 +00001420 if (PrologEndLoc.isUnknown())
1421 Flags |= DWARF2_FLAG_IS_STMT;
1422
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001423 if (!DL.isUnknown()) {
1424 const MDNode *Scope = DL.getScope(Asm->MF->getFunction()->getContext());
Devang Patel4243e672011-05-11 19:22:19 +00001425 recordSourceLine(DL.getLine(), DL.getCol(), Scope, Flags);
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001426 } else
Devang Patel4243e672011-05-11 19:22:19 +00001427 recordSourceLine(0, 0, 0, 0);
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001428 }
Devang Patelc3f5f782010-05-25 23:40:22 +00001429 }
Devang Patelaead63c2010-03-29 22:59:58 +00001430
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001431 // Insert labels where requested.
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001432 DenseMap<const MachineInstr*, MCSymbol*>::iterator I =
1433 LabelsBeforeInsn.find(MI);
1434
1435 // No label needed.
1436 if (I == LabelsBeforeInsn.end())
1437 return;
1438
1439 // Label already assigned.
1440 if (I->second)
Devang Patelb2b31a62010-05-26 19:37:24 +00001441 return;
Devang Patel553881b2010-03-29 17:20:31 +00001442
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001443 if (!PrevLabel) {
Devang Patel77051f52010-05-26 21:23:46 +00001444 PrevLabel = MMI->getContext().CreateTempSymbol();
1445 Asm->OutStreamer.EmitLabel(PrevLabel);
Devang Patelb2b31a62010-05-26 19:37:24 +00001446 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001447 I->second = PrevLabel;
Devang Patel0d20ac82009-10-06 01:50:42 +00001448}
1449
Eric Christopherb6dc8652012-11-27 22:43:45 +00001450// Process end of an instruction.
Devang Patelcbbe2872010-10-26 17:49:02 +00001451void DwarfDebug::endInstruction(const MachineInstr *MI) {
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001452 // Don't create a new label after DBG_VALUE instructions.
1453 // They don't generate code.
1454 if (!MI->isDebugValue())
1455 PrevLabel = 0;
1456
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001457 DenseMap<const MachineInstr*, MCSymbol*>::iterator I =
1458 LabelsAfterInsn.find(MI);
1459
1460 // No label needed.
1461 if (I == LabelsAfterInsn.end())
1462 return;
1463
1464 // Label already assigned.
1465 if (I->second)
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001466 return;
1467
1468 // We need a label after this instruction.
1469 if (!PrevLabel) {
1470 PrevLabel = MMI->getContext().CreateTempSymbol();
1471 Asm->OutStreamer.EmitLabel(PrevLabel);
Devang Patel1c246352010-04-08 16:50:29 +00001472 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001473 I->second = PrevLabel;
Devang Patel53bb5c92009-11-10 23:06:00 +00001474}
1475
Eric Christopherb6dc8652012-11-27 22:43:45 +00001476// Each LexicalScope has first instruction and last instruction to mark
1477// beginning and end of a scope respectively. Create an inverse map that list
1478// scopes starts (and ends) with an instruction. One instruction may start (or
1479// end) multiple scopes. Ignore scopes that are not reachable.
Devang Patele37b0c62010-04-08 18:43:56 +00001480void DwarfDebug::identifyScopeMarkers() {
Devang Patelbf47fdb2011-08-10 20:55:27 +00001481 SmallVector<LexicalScope *, 4> WorkList;
1482 WorkList.push_back(LScopes.getCurrentFunctionScope());
Devang Patel42aafd72010-01-20 02:05:23 +00001483 while (!WorkList.empty()) {
Devang Patelbf47fdb2011-08-10 20:55:27 +00001484 LexicalScope *S = WorkList.pop_back_val();
Jim Grosbach1e20b962010-07-21 21:21:52 +00001485
Craig Topper9f43ac62013-07-03 04:24:43 +00001486 const SmallVectorImpl<LexicalScope *> &Children = S->getChildren();
Jim Grosbach1e20b962010-07-21 21:21:52 +00001487 if (!Children.empty())
Craig Topper2d785db2013-07-03 04:17:25 +00001488 for (SmallVectorImpl<LexicalScope *>::const_iterator SI = Children.begin(),
Devang Patel42aafd72010-01-20 02:05:23 +00001489 SE = Children.end(); SI != SE; ++SI)
1490 WorkList.push_back(*SI);
1491
Devang Patel53bb5c92009-11-10 23:06:00 +00001492 if (S->isAbstractScope())
1493 continue;
Jim Grosbach1e20b962010-07-21 21:21:52 +00001494
Craig Topper9f43ac62013-07-03 04:24:43 +00001495 const SmallVectorImpl<InsnRange> &Ranges = S->getRanges();
Devang Pateleac9c072010-04-27 19:46:33 +00001496 if (Ranges.empty())
1497 continue;
Craig Topper2d785db2013-07-03 04:17:25 +00001498 for (SmallVectorImpl<InsnRange>::const_iterator RI = Ranges.begin(),
Devang Pateleac9c072010-04-27 19:46:33 +00001499 RE = Ranges.end(); RI != RE; ++RI) {
Devang Patelbf47fdb2011-08-10 20:55:27 +00001500 assert(RI->first && "InsnRange does not have first instruction!");
1501 assert(RI->second && "InsnRange does not have second instruction!");
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001502 requestLabelBeforeInsn(RI->first);
1503 requestLabelAfterInsn(RI->second);
Devang Pateleac9c072010-04-27 19:46:33 +00001504 }
Devang Patelaf9e8472009-10-01 20:31:14 +00001505 }
Devang Patelaf9e8472009-10-01 20:31:14 +00001506}
1507
Eric Christopherb6dc8652012-11-27 22:43:45 +00001508// Get MDNode for DebugLoc's scope.
Devang Patela3f48672011-05-09 22:14:49 +00001509static MDNode *getScopeNode(DebugLoc DL, const LLVMContext &Ctx) {
1510 if (MDNode *InlinedAt = DL.getInlinedAt(Ctx))
1511 return getScopeNode(DebugLoc::getFromDILocation(InlinedAt), Ctx);
1512 return DL.getScope(Ctx);
1513}
1514
Eric Christopherb6dc8652012-11-27 22:43:45 +00001515// Walk up the scope chain of given debug loc and find line number info
1516// for the function.
Devang Patel4243e672011-05-11 19:22:19 +00001517static DebugLoc getFnDebugLoc(DebugLoc DL, const LLVMContext &Ctx) {
1518 const MDNode *Scope = getScopeNode(DL, Ctx);
1519 DISubprogram SP = getDISubprogram(Scope);
Manman Rend03d2b22013-07-08 18:33:29 +00001520 if (SP.isSubprogram()) {
Eric Christopher6126a1e2012-04-03 00:43:49 +00001521 // Check for number of operands since the compatibility is
1522 // cheap here.
Eric Christopherfa5b0502012-04-03 17:55:42 +00001523 if (SP->getNumOperands() > 19)
Eric Christopher6126a1e2012-04-03 00:43:49 +00001524 return DebugLoc::get(SP.getScopeLineNumber(), 0, SP);
1525 else
1526 return DebugLoc::get(SP.getLineNumber(), 0, SP);
1527 }
1528
Devang Patel4243e672011-05-11 19:22:19 +00001529 return DebugLoc();
1530}
1531
Eric Christopherb6dc8652012-11-27 22:43:45 +00001532// Gather pre-function debug information. Assumes being called immediately
1533// after the function entry point has been emitted.
Chris Lattnereec791a2010-01-26 23:18:02 +00001534void DwarfDebug::beginFunction(const MachineFunction *MF) {
Chris Lattner994cb122010-04-05 03:52:55 +00001535 if (!MMI->hasDebugInfo()) return;
Devang Patelbf47fdb2011-08-10 20:55:27 +00001536 LScopes.initialize(*MF);
1537 if (LScopes.empty()) return;
1538 identifyScopeMarkers();
Devang Patel60b35bd2009-10-06 18:37:31 +00001539
Manman Ren43213cf2013-02-05 21:52:47 +00001540 // Set DwarfCompileUnitID in MCContext to the Compile Unit this function
1541 // belongs to.
1542 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
1543 CompileUnit *TheCU = SPMap.lookup(FnScope->getScopeNode());
1544 assert(TheCU && "Unable to find compile unit!");
Manman Ren01cb18e2013-05-21 00:57:22 +00001545 if (Asm->TM.hasMCUseLoc() &&
1546 Asm->OutStreamer.getKind() == MCStreamer::SK_AsmStreamer)
1547 // Use a single line table if we are using .loc and generating assembly.
1548 Asm->OutStreamer.getContext().setDwarfCompileUnitID(0);
1549 else
1550 Asm->OutStreamer.getContext().setDwarfCompileUnitID(TheCU->getUniqueID());
Manman Ren43213cf2013-02-05 21:52:47 +00001551
Devang Pateleac9c072010-04-27 19:46:33 +00001552 FunctionBeginSym = Asm->GetTempSymbol("func_begin",
1553 Asm->getFunctionNumber());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001554 // Assumes in correct section after the entry point.
Devang Pateleac9c072010-04-27 19:46:33 +00001555 Asm->OutStreamer.EmitLabel(FunctionBeginSym);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001556
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001557 assert(UserVariables.empty() && DbgValues.empty() && "Maps weren't cleaned");
1558
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001559 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
Eric Christopherb6dc8652012-11-27 22:43:45 +00001560 // LiveUserVar - Map physreg numbers to the MDNode they contain.
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001561 std::vector<const MDNode*> LiveUserVar(TRI->getNumRegs());
1562
Devang Patelb2b31a62010-05-26 19:37:24 +00001563 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001564 I != E; ++I) {
1565 bool AtBlockEntry = true;
Devang Patelb2b31a62010-05-26 19:37:24 +00001566 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
1567 II != IE; ++II) {
1568 const MachineInstr *MI = II;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001569
Devang Patelb2b31a62010-05-26 19:37:24 +00001570 if (MI->isDebugValue()) {
Nick Lewycky746cb672011-10-26 22:55:33 +00001571 assert(MI->getNumOperands() > 1 && "Invalid machine instruction!");
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001572
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001573 // Keep track of user variables.
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001574 const MDNode *Var =
1575 MI->getOperand(MI->getNumOperands() - 1).getMetadata();
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001576
1577 // Variable is in a register, we need to check for clobbers.
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001578 if (isDbgValueInDefinedReg(MI))
1579 LiveUserVar[MI->getOperand(0).getReg()] = Var;
1580
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001581 // Check the history of this variable.
1582 SmallVectorImpl<const MachineInstr*> &History = DbgValues[Var];
1583 if (History.empty()) {
1584 UserVariables.push_back(Var);
1585 // The first mention of a function argument gets the FunctionBeginSym
1586 // label, so arguments are visible when breaking at function entry.
1587 DIVariable DV(Var);
Manman Rend03d2b22013-07-08 18:33:29 +00001588 if (DV.isVariable() && DV.getTag() == dwarf::DW_TAG_arg_variable &&
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001589 DISubprogram(getDISubprogram(DV.getContext()))
1590 .describes(MF->getFunction()))
1591 LabelsBeforeInsn[MI] = FunctionBeginSym;
1592 } else {
1593 // We have seen this variable before. Try to coalesce DBG_VALUEs.
1594 const MachineInstr *Prev = History.back();
1595 if (Prev->isDebugValue()) {
1596 // Coalesce identical entries at the end of History.
1597 if (History.size() >= 2 &&
Devang Patel79862892011-07-07 00:14:27 +00001598 Prev->isIdenticalTo(History[History.size() - 2])) {
Eric Christopher02c1a642012-10-08 20:48:49 +00001599 DEBUG(dbgs() << "Coalescing identical DBG_VALUE entries:\n"
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001600 << "\t" << *Prev
Devang Patel79862892011-07-07 00:14:27 +00001601 << "\t" << *History[History.size() - 2] << "\n");
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001602 History.pop_back();
Devang Patel79862892011-07-07 00:14:27 +00001603 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001604
1605 // Terminate old register assignments that don't reach MI;
1606 MachineFunction::const_iterator PrevMBB = Prev->getParent();
1607 if (PrevMBB != I && (!AtBlockEntry || llvm::next(PrevMBB) != I) &&
1608 isDbgValueInDefinedReg(Prev)) {
1609 // Previous register assignment needs to terminate at the end of
1610 // its basic block.
1611 MachineBasicBlock::const_iterator LastMI =
1612 PrevMBB->getLastNonDebugInstr();
Devang Patel79862892011-07-07 00:14:27 +00001613 if (LastMI == PrevMBB->end()) {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001614 // Drop DBG_VALUE for empty range.
Eric Christopher02c1a642012-10-08 20:48:49 +00001615 DEBUG(dbgs() << "Dropping DBG_VALUE for empty range:\n"
Devang Patel79862892011-07-07 00:14:27 +00001616 << "\t" << *Prev << "\n");
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001617 History.pop_back();
David Blaikie4532c282013-06-20 00:25:24 +00001618 } else if (llvm::next(PrevMBB) != PrevMBB->getParent()->end())
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001619 // Terminate after LastMI.
1620 History.push_back(LastMI);
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001621 }
1622 }
1623 }
1624 History.push_back(MI);
Devang Patelb2b31a62010-05-26 19:37:24 +00001625 } else {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001626 // Not a DBG_VALUE instruction.
1627 if (!MI->isLabel())
1628 AtBlockEntry = false;
1629
Eric Christopher0313ced2012-10-04 20:46:14 +00001630 // First known non-DBG_VALUE and non-frame setup location marks
1631 // the beginning of the function body.
1632 if (!MI->getFlag(MachineInstr::FrameSetup) &&
1633 (PrologEndLoc.isUnknown() && !MI->getDebugLoc().isUnknown()))
Devang Patel4243e672011-05-11 19:22:19 +00001634 PrologEndLoc = MI->getDebugLoc();
1635
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001636 // Check if the instruction clobbers any registers with debug vars.
1637 for (MachineInstr::const_mop_iterator MOI = MI->operands_begin(),
1638 MOE = MI->operands_end(); MOI != MOE; ++MOI) {
1639 if (!MOI->isReg() || !MOI->isDef() || !MOI->getReg())
1640 continue;
Jakob Stoklund Olesen396618b2012-06-01 23:28:30 +00001641 for (MCRegAliasIterator AI(MOI->getReg(), TRI, true);
1642 AI.isValid(); ++AI) {
1643 unsigned Reg = *AI;
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001644 const MDNode *Var = LiveUserVar[Reg];
1645 if (!Var)
1646 continue;
1647 // Reg is now clobbered.
1648 LiveUserVar[Reg] = 0;
1649
1650 // Was MD last defined by a DBG_VALUE referring to Reg?
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001651 DbgValueHistoryMap::iterator HistI = DbgValues.find(Var);
1652 if (HistI == DbgValues.end())
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001653 continue;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001654 SmallVectorImpl<const MachineInstr*> &History = HistI->second;
1655 if (History.empty())
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001656 continue;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001657 const MachineInstr *Prev = History.back();
1658 // Sanity-check: Register assignments are terminated at the end of
1659 // their block.
1660 if (!Prev->isDebugValue() || Prev->getParent() != MI->getParent())
1661 continue;
1662 // Is the variable still in Reg?
1663 if (!isDbgValueInDefinedReg(Prev) ||
1664 Prev->getOperand(0).getReg() != Reg)
1665 continue;
1666 // Var is clobbered. Make sure the next instruction gets a label.
1667 History.push_back(MI);
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001668 }
1669 }
Devang Patelb2b31a62010-05-26 19:37:24 +00001670 }
Devang Patelb2b31a62010-05-26 19:37:24 +00001671 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001672 }
1673
1674 for (DbgValueHistoryMap::iterator I = DbgValues.begin(), E = DbgValues.end();
1675 I != E; ++I) {
1676 SmallVectorImpl<const MachineInstr*> &History = I->second;
1677 if (History.empty())
1678 continue;
1679
1680 // Make sure the final register assignments are terminated.
1681 const MachineInstr *Prev = History.back();
1682 if (Prev->isDebugValue() && isDbgValueInDefinedReg(Prev)) {
1683 const MachineBasicBlock *PrevMBB = Prev->getParent();
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001684 MachineBasicBlock::const_iterator LastMI =
Devang Patel5bc942c2011-08-10 23:58:09 +00001685 PrevMBB->getLastNonDebugInstr();
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001686 if (LastMI == PrevMBB->end())
1687 // Drop DBG_VALUE for empty range.
1688 History.pop_back();
David Blaikie4532c282013-06-20 00:25:24 +00001689 else if (PrevMBB != &PrevMBB->getParent()->back()) {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001690 // Terminate after LastMI.
1691 History.push_back(LastMI);
1692 }
1693 }
1694 // Request labels for the full history.
1695 for (unsigned i = 0, e = History.size(); i != e; ++i) {
1696 const MachineInstr *MI = History[i];
1697 if (MI->isDebugValue())
1698 requestLabelBeforeInsn(MI);
1699 else
1700 requestLabelAfterInsn(MI);
1701 }
1702 }
Devang Patelb2b31a62010-05-26 19:37:24 +00001703
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001704 PrevInstLoc = DebugLoc();
Devang Patelb2b31a62010-05-26 19:37:24 +00001705 PrevLabel = FunctionBeginSym;
Devang Patel4243e672011-05-11 19:22:19 +00001706
1707 // Record beginning of function.
1708 if (!PrologEndLoc.isUnknown()) {
1709 DebugLoc FnStartDL = getFnDebugLoc(PrologEndLoc,
1710 MF->getFunction()->getContext());
1711 recordSourceLine(FnStartDL.getLine(), FnStartDL.getCol(),
1712 FnStartDL.getScope(MF->getFunction()->getContext()),
David Blaikie836cfc42012-12-04 22:02:33 +00001713 // We'd like to list the prologue as "not statements" but GDB behaves
1714 // poorly if we do that. Revisit this with caution/GDB (7.5+) testing.
David Blaikieb36c5312012-12-04 21:05:36 +00001715 DWARF2_FLAG_IS_STMT);
Devang Patel4243e672011-05-11 19:22:19 +00001716 }
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001717}
1718
Devang Patelbf47fdb2011-08-10 20:55:27 +00001719void DwarfDebug::addScopeVariable(LexicalScope *LS, DbgVariable *Var) {
David Blaikie032d6242013-06-05 05:39:59 +00001720 SmallVectorImpl<DbgVariable *> &Vars = ScopeVariables[LS];
1721 DIVariable DV = Var->getVariable();
David Blaikieb20fdff2013-06-06 21:04:51 +00001722 // Variables with positive arg numbers are parameters.
1723 if (unsigned ArgNum = DV.getArgNumber()) {
1724 // Keep all parameters in order at the start of the variable list to ensure
1725 // function types are correct (no out-of-order parameters)
1726 //
1727 // This could be improved by only doing it for optimized builds (unoptimized
1728 // builds have the right order to begin with), searching from the back (this
1729 // would catch the unoptimized case quickly), or doing a binary search
1730 // rather than linear search.
1731 SmallVectorImpl<DbgVariable *>::iterator I = Vars.begin();
1732 while (I != Vars.end()) {
1733 unsigned CurNum = (*I)->getVariable().getArgNumber();
1734 // A local (non-parameter) variable has been found, insert immediately
1735 // before it.
1736 if (CurNum == 0)
1737 break;
1738 // A later indexed parameter has been found, insert immediately before it.
David Blaikiebabfebb2013-06-06 22:28:26 +00001739 if (CurNum > ArgNum)
David Blaikieb20fdff2013-06-06 21:04:51 +00001740 break;
David Blaikiebabfebb2013-06-06 22:28:26 +00001741 ++I;
David Blaikie032d6242013-06-05 05:39:59 +00001742 }
David Blaikieb20fdff2013-06-06 21:04:51 +00001743 Vars.insert(I, Var);
1744 return;
David Blaikie032d6242013-06-05 05:39:59 +00001745 }
1746
1747 Vars.push_back(Var);
Devang Patelbf47fdb2011-08-10 20:55:27 +00001748}
1749
Eric Christopherb6dc8652012-11-27 22:43:45 +00001750// Gather and emit post-function debug information.
Chris Lattnereec791a2010-01-26 23:18:02 +00001751void DwarfDebug::endFunction(const MachineFunction *MF) {
Devang Patelbf47fdb2011-08-10 20:55:27 +00001752 if (!MMI->hasDebugInfo() || LScopes.empty()) return;
Devang Patel70d75ca2009-11-12 19:02:56 +00001753
Devang Patelbf47fdb2011-08-10 20:55:27 +00001754 // Define end label for subprogram.
1755 FunctionEndSym = Asm->GetTempSymbol("func_end",
1756 Asm->getFunctionNumber());
1757 // Assumes in correct section after the entry point.
1758 Asm->OutStreamer.EmitLabel(FunctionEndSym);
Manman Ren43213cf2013-02-05 21:52:47 +00001759 // Set DwarfCompileUnitID in MCContext to default value.
1760 Asm->OutStreamer.getContext().setDwarfCompileUnitID(0);
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001761
Devang Patelbf47fdb2011-08-10 20:55:27 +00001762 SmallPtrSet<const MDNode *, 16> ProcessedVars;
1763 collectVariableInfo(MF, ProcessedVars);
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001764
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001765 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
Devang Patel94c7ddb2011-08-16 22:09:43 +00001766 CompileUnit *TheCU = SPMap.lookup(FnScope->getScopeNode());
Nick Lewycky746cb672011-10-26 22:55:33 +00001767 assert(TheCU && "Unable to find compile unit!");
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001768
Devang Patelbf47fdb2011-08-10 20:55:27 +00001769 // Construct abstract scopes.
Devang Patelcd9f6c52011-08-12 18:10:19 +00001770 ArrayRef<LexicalScope *> AList = LScopes.getAbstractScopesList();
1771 for (unsigned i = 0, e = AList.size(); i != e; ++i) {
1772 LexicalScope *AScope = AList[i];
1773 DISubprogram SP(AScope->getScopeNode());
Manman Rend03d2b22013-07-08 18:33:29 +00001774 if (SP.isSubprogram()) {
Devang Patelbf47fdb2011-08-10 20:55:27 +00001775 // Collect info for variables that were optimized out.
Devang Patel93d39be2011-08-19 23:28:12 +00001776 DIArray Variables = SP.getVariables();
1777 for (unsigned i = 0, e = Variables.getNumElements(); i != e; ++i) {
1778 DIVariable DV(Variables.getElement(i));
Manman Rend03d2b22013-07-08 18:33:29 +00001779 if (!DV || !DV.isVariable() || !ProcessedVars.insert(DV))
Devang Patel93d39be2011-08-19 23:28:12 +00001780 continue;
Alexey Samsonovb67bd332012-07-06 08:45:08 +00001781 // Check that DbgVariable for DV wasn't created earlier, when
1782 // findAbstractVariable() was called for inlined instance of DV.
1783 LLVMContext &Ctx = DV->getContext();
1784 DIVariable CleanDV = cleanseInlinedVariable(DV, Ctx);
1785 if (AbstractVariables.lookup(CleanDV))
1786 continue;
Devang Patel93d39be2011-08-19 23:28:12 +00001787 if (LexicalScope *Scope = LScopes.findAbstractScope(DV.getContext()))
1788 addScopeVariable(Scope, new DbgVariable(DV, NULL));
Devang Patel78e127d2010-06-25 22:07:34 +00001789 }
1790 }
Devang Patelcd9f6c52011-08-12 18:10:19 +00001791 if (ProcessedSPNodes.count(AScope->getScopeNode()) == 0)
Manman Ren742671b2013-05-29 17:16:59 +00001792 constructScopeDIE(TheCU, AScope);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001793 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001794
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001795 DIE *CurFnDIE = constructScopeDIE(TheCU, FnScope);
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001796
Nick Lewycky8a8d4792011-12-02 22:16:29 +00001797 if (!MF->getTarget().Options.DisableFramePointerElim(*MF))
Eric Christopher873cf0a2012-08-24 01:14:27 +00001798 TheCU->addFlag(CurFnDIE, dwarf::DW_AT_APPLE_omit_frame_ptr);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001799
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001800 // Clear debug info
Craig Topper01eb99a2013-07-03 04:40:27 +00001801 for (ScopeVariablesMap::iterator
Devang Patelbf47fdb2011-08-10 20:55:27 +00001802 I = ScopeVariables.begin(), E = ScopeVariables.end(); I != E; ++I)
1803 DeleteContainerPointers(I->second);
1804 ScopeVariables.clear();
Devang Pateleac0c9d2011-04-22 18:09:57 +00001805 DeleteContainerPointers(CurrentFnArguments);
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001806 UserVariables.clear();
1807 DbgValues.clear();
Jeffrey Yasskin5c213dc2010-03-12 17:45:06 +00001808 AbstractVariables.clear();
Devang Pateleac9c072010-04-27 19:46:33 +00001809 LabelsBeforeInsn.clear();
1810 LabelsAfterInsn.clear();
Devang Patelf2548ca2010-04-16 23:33:45 +00001811 PrevLabel = NULL;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001812}
1813
Eric Christopherb6dc8652012-11-27 22:43:45 +00001814// Register a source line with debug info. Returns the unique label that was
1815// emitted and which provides correspondence to the source line list.
Devang Patel4243e672011-05-11 19:22:19 +00001816void DwarfDebug::recordSourceLine(unsigned Line, unsigned Col, const MDNode *S,
1817 unsigned Flags) {
Devang Patel65dbc902009-11-25 17:36:49 +00001818 StringRef Fn;
Devang Patel23670e52011-03-24 20:30:50 +00001819 StringRef Dir;
Dan Gohman1cc0d622010-05-05 23:41:32 +00001820 unsigned Src = 1;
1821 if (S) {
1822 DIDescriptor Scope(S);
Devang Patelf84548d2009-10-05 18:03:19 +00001823
Dan Gohman1cc0d622010-05-05 23:41:32 +00001824 if (Scope.isCompileUnit()) {
1825 DICompileUnit CU(S);
Dan Gohman1cc0d622010-05-05 23:41:32 +00001826 Fn = CU.getFilename();
Devang Patel23670e52011-03-24 20:30:50 +00001827 Dir = CU.getDirectory();
Devang Patel3cabc9d2010-10-28 17:30:52 +00001828 } else if (Scope.isFile()) {
1829 DIFile F(S);
Devang Patel3cabc9d2010-10-28 17:30:52 +00001830 Fn = F.getFilename();
Devang Patel23670e52011-03-24 20:30:50 +00001831 Dir = F.getDirectory();
Dan Gohman1cc0d622010-05-05 23:41:32 +00001832 } else if (Scope.isSubprogram()) {
1833 DISubprogram SP(S);
Dan Gohman1cc0d622010-05-05 23:41:32 +00001834 Fn = SP.getFilename();
Devang Patel23670e52011-03-24 20:30:50 +00001835 Dir = SP.getDirectory();
Eric Christopher6618a242011-10-11 22:59:11 +00001836 } else if (Scope.isLexicalBlockFile()) {
1837 DILexicalBlockFile DBF(S);
1838 Fn = DBF.getFilename();
1839 Dir = DBF.getDirectory();
Dan Gohman1cc0d622010-05-05 23:41:32 +00001840 } else if (Scope.isLexicalBlock()) {
1841 DILexicalBlock DB(S);
Dan Gohman1cc0d622010-05-05 23:41:32 +00001842 Fn = DB.getFilename();
Devang Patel23670e52011-03-24 20:30:50 +00001843 Dir = DB.getDirectory();
Dan Gohman1cc0d622010-05-05 23:41:32 +00001844 } else
Craig Topper5e25ee82012-02-05 08:31:47 +00001845 llvm_unreachable("Unexpected scope info");
Dan Gohman1cc0d622010-05-05 23:41:32 +00001846
Manman Ren3de61b42013-03-07 01:42:00 +00001847 Src = getOrCreateSourceID(Fn, Dir,
1848 Asm->OutStreamer.getContext().getDwarfCompileUnitID());
Dan Gohman1cc0d622010-05-05 23:41:32 +00001849 }
Nick Lewycky3bbb6f72011-07-29 03:49:23 +00001850 Asm->OutStreamer.EmitDwarfLocDirective(Src, Line, Col, Flags, 0, 0, Fn);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001851}
1852
Bill Wendling829e67b2009-05-20 23:22:40 +00001853//===----------------------------------------------------------------------===//
1854// Emit Methods
1855//===----------------------------------------------------------------------===//
1856
Eric Christopherb6dc8652012-11-27 22:43:45 +00001857// Compute the size and offset of a DIE.
Jim Grosbach7ab38df2009-11-22 19:20:36 +00001858unsigned
Eric Christopher0e3e9b72012-12-10 23:34:43 +00001859DwarfUnits::computeSizeAndOffset(DIE *Die, unsigned Offset) {
Bill Wendling94d04b82009-05-20 23:21:38 +00001860 // Get the children.
1861 const std::vector<DIE *> &Children = Die->getChildren();
1862
Bill Wendling94d04b82009-05-20 23:21:38 +00001863 // Record the abbreviation.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001864 assignAbbrevNumber(Die->getAbbrev());
Bill Wendling94d04b82009-05-20 23:21:38 +00001865
1866 // Get the abbreviation for this DIE.
1867 unsigned AbbrevNumber = Die->getAbbrevNumber();
Eric Christopher0e3e9b72012-12-10 23:34:43 +00001868 const DIEAbbrev *Abbrev = Abbreviations->at(AbbrevNumber - 1);
Bill Wendling94d04b82009-05-20 23:21:38 +00001869
1870 // Set DIE offset
1871 Die->setOffset(Offset);
1872
1873 // Start the size with the size of abbreviation code.
Chris Lattneraf76e592009-08-22 20:48:53 +00001874 Offset += MCAsmInfo::getULEB128Size(AbbrevNumber);
Bill Wendling94d04b82009-05-20 23:21:38 +00001875
Eric Christopherf7cef702013-03-29 23:34:06 +00001876 const SmallVectorImpl<DIEValue*> &Values = Die->getValues();
1877 const SmallVectorImpl<DIEAbbrevData> &AbbrevData = Abbrev->getData();
Bill Wendling94d04b82009-05-20 23:21:38 +00001878
1879 // Size the DIE attribute values.
1880 for (unsigned i = 0, N = Values.size(); i < N; ++i)
1881 // Size attribute value.
Chris Lattnera37d5382010-04-05 00:18:22 +00001882 Offset += Values[i]->SizeOf(Asm, AbbrevData[i].getForm());
Bill Wendling94d04b82009-05-20 23:21:38 +00001883
1884 // Size the DIE children if any.
1885 if (!Children.empty()) {
1886 assert(Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes &&
1887 "Children flag not set");
1888
1889 for (unsigned j = 0, M = Children.size(); j < M; ++j)
Eric Christopherfbd19752012-11-20 22:14:13 +00001890 Offset = computeSizeAndOffset(Children[j], Offset);
Bill Wendling94d04b82009-05-20 23:21:38 +00001891
1892 // End of children marker.
1893 Offset += sizeof(int8_t);
1894 }
1895
1896 Die->setSize(Offset - Die->getOffset());
1897 return Offset;
1898}
1899
Eric Christopherb6dc8652012-11-27 22:43:45 +00001900// Compute the size and offset of all the DIEs.
Eric Christopher0e3e9b72012-12-10 23:34:43 +00001901void DwarfUnits::computeSizeAndOffsets() {
Manman Renbc3e96f2013-03-12 18:27:15 +00001902 // Offset from the beginning of debug info section.
Eric Christopherd2df98f2013-05-30 00:43:35 +00001903 unsigned SecOffset = 0;
Eric Christopherf7cef702013-03-29 23:34:06 +00001904 for (SmallVectorImpl<CompileUnit *>::iterator I = CUs.begin(),
Eric Christopher0e3e9b72012-12-10 23:34:43 +00001905 E = CUs.end(); I != E; ++I) {
Eric Christopherd2df98f2013-05-30 00:43:35 +00001906 (*I)->setDebugInfoOffset(SecOffset);
Eric Christopher98e237f2012-11-30 23:59:06 +00001907 unsigned Offset =
1908 sizeof(int32_t) + // Length of Compilation Unit Info
1909 sizeof(int16_t) + // DWARF version number
1910 sizeof(int32_t) + // Offset Into Abbrev. Section
1911 sizeof(int8_t); // Pointer Size (in bytes)
1912
Manman Renbc3e96f2013-03-12 18:27:15 +00001913 unsigned EndOffset = computeSizeAndOffset((*I)->getCUDie(), Offset);
Eric Christopherd2df98f2013-05-30 00:43:35 +00001914 SecOffset += EndOffset;
Devang Patel163a9f72010-05-10 22:49:55 +00001915 }
Bill Wendling94d04b82009-05-20 23:21:38 +00001916}
1917
Eric Christopherb6dc8652012-11-27 22:43:45 +00001918// Emit initial Dwarf sections with a label at the start of each one.
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001919void DwarfDebug::emitSectionLabels() {
Chris Lattner6c2f9e12009-08-19 05:49:37 +00001920 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
Daniel Dunbarf612ff62009-09-19 20:40:05 +00001921
Bill Wendling94d04b82009-05-20 23:21:38 +00001922 // Dwarf sections base addresses.
Jim Grosbach1e20b962010-07-21 21:21:52 +00001923 DwarfInfoSectionSym =
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001924 emitSectionSym(Asm, TLOF.getDwarfInfoSection(), "section_info");
Jim Grosbach1e20b962010-07-21 21:21:52 +00001925 DwarfAbbrevSectionSym =
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001926 emitSectionSym(Asm, TLOF.getDwarfAbbrevSection(), "section_abbrev");
Eric Christopher6eebe472012-12-19 22:02:53 +00001927 if (useSplitDwarf())
1928 DwarfAbbrevDWOSectionSym =
1929 emitSectionSym(Asm, TLOF.getDwarfAbbrevDWOSection(),
1930 "section_abbrev_dwo");
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001931 emitSectionSym(Asm, TLOF.getDwarfARangesSection());
Jim Grosbach1e20b962010-07-21 21:21:52 +00001932
Chris Lattner9c69e285532010-04-04 22:59:04 +00001933 if (const MCSection *MacroInfo = TLOF.getDwarfMacroInfoSection())
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001934 emitSectionSym(Asm, MacroInfo);
Bill Wendling94d04b82009-05-20 23:21:38 +00001935
Eric Christopher7a0103c2013-02-07 21:19:50 +00001936 DwarfLineSectionSym =
1937 emitSectionSym(Asm, TLOF.getDwarfLineSection(), "section_line");
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001938 emitSectionSym(Asm, TLOF.getDwarfLocSection());
Eric Christopherf04e4ef2013-08-19 21:07:38 +00001939 if (HasDwarfPubNames)
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00001940 emitSectionSym(Asm, TLOF.getDwarfPubNamesSection());
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001941 emitSectionSym(Asm, TLOF.getDwarfPubTypesSection());
Jim Grosbach1e20b962010-07-21 21:21:52 +00001942 DwarfStrSectionSym =
Eric Christopher64f824c2012-12-27 02:14:01 +00001943 emitSectionSym(Asm, TLOF.getDwarfStrSection(), "info_string");
Eric Christopher9a9e73b2013-04-07 03:43:09 +00001944 if (useSplitDwarf()) {
Eric Christopher64f824c2012-12-27 02:14:01 +00001945 DwarfStrDWOSectionSym =
1946 emitSectionSym(Asm, TLOF.getDwarfStrDWOSection(), "skel_string");
Eric Christopher9a9e73b2013-04-07 03:43:09 +00001947 DwarfAddrSectionSym =
1948 emitSectionSym(Asm, TLOF.getDwarfAddrSection(), "addr_sec");
1949 }
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001950 DwarfDebugRangeSectionSym = emitSectionSym(Asm, TLOF.getDwarfRangesSection(),
Devang Patelf2548ca2010-04-16 23:33:45 +00001951 "debug_range");
Bill Wendling94d04b82009-05-20 23:21:38 +00001952
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001953 DwarfDebugLocSectionSym = emitSectionSym(Asm, TLOF.getDwarfLocSection(),
Devang Patelc3f5f782010-05-25 23:40:22 +00001954 "section_debug_loc");
1955
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001956 TextSectionSym = emitSectionSym(Asm, TLOF.getTextSection(), "text_begin");
1957 emitSectionSym(Asm, TLOF.getDataSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00001958}
1959
Eric Christopherb6dc8652012-11-27 22:43:45 +00001960// Recursively emits a debug information entry.
Eric Christopher6eebe472012-12-19 22:02:53 +00001961void DwarfDebug::emitDIE(DIE *Die, std::vector<DIEAbbrev *> *Abbrevs) {
Bill Wendling94d04b82009-05-20 23:21:38 +00001962 // Get the abbreviation for this DIE.
1963 unsigned AbbrevNumber = Die->getAbbrevNumber();
Eric Christopher6eebe472012-12-19 22:02:53 +00001964 const DIEAbbrev *Abbrev = Abbrevs->at(AbbrevNumber - 1);
Bill Wendling94d04b82009-05-20 23:21:38 +00001965
Bill Wendling94d04b82009-05-20 23:21:38 +00001966 // Emit the code (index) for the abbreviation.
Chris Lattner3f53c832010-04-04 18:52:31 +00001967 if (Asm->isVerbose())
Chris Lattner894d75a2010-01-22 23:18:42 +00001968 Asm->OutStreamer.AddComment("Abbrev [" + Twine(AbbrevNumber) + "] 0x" +
1969 Twine::utohexstr(Die->getOffset()) + ":0x" +
1970 Twine::utohexstr(Die->getSize()) + " " +
1971 dwarf::TagString(Abbrev->getTag()));
Chris Lattner7e1a8f82010-04-04 19:09:29 +00001972 Asm->EmitULEB128(AbbrevNumber);
Bill Wendling94d04b82009-05-20 23:21:38 +00001973
Eric Christopherf7cef702013-03-29 23:34:06 +00001974 const SmallVectorImpl<DIEValue*> &Values = Die->getValues();
1975 const SmallVectorImpl<DIEAbbrevData> &AbbrevData = Abbrev->getData();
Bill Wendling94d04b82009-05-20 23:21:38 +00001976
1977 // Emit the DIE attribute values.
1978 for (unsigned i = 0, N = Values.size(); i < N; ++i) {
1979 unsigned Attr = AbbrevData[i].getAttribute();
1980 unsigned Form = AbbrevData[i].getForm();
1981 assert(Form && "Too many attributes for DIE (check abbreviation)");
1982
Chris Lattner3f53c832010-04-04 18:52:31 +00001983 if (Asm->isVerbose())
Chris Lattnera8013622010-01-24 18:54:17 +00001984 Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr));
Jim Grosbach1e20b962010-07-21 21:21:52 +00001985
Bill Wendling94d04b82009-05-20 23:21:38 +00001986 switch (Attr) {
Bill Wendling94d04b82009-05-20 23:21:38 +00001987 case dwarf::DW_AT_abstract_origin: {
1988 DIEEntry *E = cast<DIEEntry>(Values[i]);
1989 DIE *Origin = E->getEntry();
Devang Patel53bb5c92009-11-10 23:06:00 +00001990 unsigned Addr = Origin->getOffset();
Manman Renbc3e96f2013-03-12 18:27:15 +00001991 if (Form == dwarf::DW_FORM_ref_addr) {
1992 // For DW_FORM_ref_addr, output the offset from beginning of debug info
1993 // section. Origin->getOffset() returns the offset from start of the
1994 // compile unit.
1995 DwarfUnits &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
1996 Addr += Holder.getCUOffset(Origin->getCompileUnit());
1997 }
Manman Ren0e6783f2013-07-02 23:40:10 +00001998 Asm->OutStreamer.EmitIntValue(Addr,
1999 Form == dwarf::DW_FORM_ref_addr ? DIEEntry::getRefAddrSize(Asm) : 4);
Bill Wendling94d04b82009-05-20 23:21:38 +00002000 break;
2001 }
Devang Patelf2548ca2010-04-16 23:33:45 +00002002 case dwarf::DW_AT_ranges: {
2003 // DW_AT_range Value encodes offset in debug_range section.
2004 DIEInteger *V = cast<DIEInteger>(Values[i]);
Devang Patelb1fcfbe2010-09-02 16:43:44 +00002005
Nick Lewyckyffccd922012-06-22 01:25:12 +00002006 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections()) {
Devang Patelb1fcfbe2010-09-02 16:43:44 +00002007 Asm->EmitLabelPlusOffset(DwarfDebugRangeSectionSym,
2008 V->getValue(),
2009 4);
2010 } else {
2011 Asm->EmitLabelOffsetDifference(DwarfDebugRangeSectionSym,
2012 V->getValue(),
2013 DwarfDebugRangeSectionSym,
2014 4);
2015 }
Devang Patelf2548ca2010-04-16 23:33:45 +00002016 break;
2017 }
Devang Patelc3f5f782010-05-25 23:40:22 +00002018 case dwarf::DW_AT_location: {
Nick Lewyckyffccd922012-06-22 01:25:12 +00002019 if (DIELabel *L = dyn_cast<DIELabel>(Values[i])) {
2020 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +00002021 Asm->EmitLabelReference(L->getValue(), 4);
Nick Lewyckyffccd922012-06-22 01:25:12 +00002022 else
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +00002023 Asm->EmitLabelDifference(L->getValue(), DwarfDebugLocSectionSym, 4);
Nick Lewyckyffccd922012-06-22 01:25:12 +00002024 } else {
Devang Patelc3f5f782010-05-25 23:40:22 +00002025 Values[i]->EmitValue(Asm, Form);
Nick Lewyckyffccd922012-06-22 01:25:12 +00002026 }
Devang Patelc3f5f782010-05-25 23:40:22 +00002027 break;
2028 }
Devang Patel2a361602010-09-29 19:08:08 +00002029 case dwarf::DW_AT_accessibility: {
2030 if (Asm->isVerbose()) {
2031 DIEInteger *V = cast<DIEInteger>(Values[i]);
2032 Asm->OutStreamer.AddComment(dwarf::AccessibilityString(V->getValue()));
2033 }
2034 Values[i]->EmitValue(Asm, Form);
2035 break;
2036 }
Bill Wendling94d04b82009-05-20 23:21:38 +00002037 default:
2038 // Emit an attribute using the defined form.
Chris Lattnerd38fee82010-04-05 00:13:49 +00002039 Values[i]->EmitValue(Asm, Form);
Bill Wendling94d04b82009-05-20 23:21:38 +00002040 break;
2041 }
Bill Wendling94d04b82009-05-20 23:21:38 +00002042 }
2043
2044 // Emit the DIE children if any.
2045 if (Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes) {
2046 const std::vector<DIE *> &Children = Die->getChildren();
2047
2048 for (unsigned j = 0, M = Children.size(); j < M; ++j)
Eric Christopher6eebe472012-12-19 22:02:53 +00002049 emitDIE(Children[j], Abbrevs);
Bill Wendling94d04b82009-05-20 23:21:38 +00002050
Chris Lattner3f53c832010-04-04 18:52:31 +00002051 if (Asm->isVerbose())
Chris Lattner233f52b2010-03-09 23:52:58 +00002052 Asm->OutStreamer.AddComment("End Of Children Mark");
2053 Asm->EmitInt8(0);
Bill Wendling94d04b82009-05-20 23:21:38 +00002054 }
2055}
2056
Eric Christopherb1e66d02012-12-15 00:04:07 +00002057// Emit the various dwarf units to the unit section USection with
2058// the abbreviations going into ASection.
2059void DwarfUnits::emitUnits(DwarfDebug *DD,
2060 const MCSection *USection,
2061 const MCSection *ASection,
2062 const MCSymbol *ASectionSym) {
2063 Asm->OutStreamer.SwitchSection(USection);
Eric Christopherf7cef702013-03-29 23:34:06 +00002064 for (SmallVectorImpl<CompileUnit *>::iterator I = CUs.begin(),
Eric Christopherb1e66d02012-12-15 00:04:07 +00002065 E = CUs.end(); I != E; ++I) {
2066 CompileUnit *TheCU = *I;
Devang Patel163a9f72010-05-10 22:49:55 +00002067 DIE *Die = TheCU->getCUDie();
Jim Grosbach1e20b962010-07-21 21:21:52 +00002068
Devang Patel163a9f72010-05-10 22:49:55 +00002069 // Emit the compile units header.
Eric Christopherb1e66d02012-12-15 00:04:07 +00002070 Asm->OutStreamer
2071 .EmitLabel(Asm->GetTempSymbol(USection->getLabelBeginName(),
2072 TheCU->getUniqueID()));
Jim Grosbach1e20b962010-07-21 21:21:52 +00002073
Devang Patel163a9f72010-05-10 22:49:55 +00002074 // Emit size of content not including length itself
2075 unsigned ContentSize = Die->getSize() +
2076 sizeof(int16_t) + // DWARF version number
2077 sizeof(int32_t) + // Offset Into Abbrev. Section
Devang Patel65705d52011-04-13 19:41:17 +00002078 sizeof(int8_t); // Pointer Size (in bytes)
Jim Grosbach1e20b962010-07-21 21:21:52 +00002079
Devang Patel163a9f72010-05-10 22:49:55 +00002080 Asm->OutStreamer.AddComment("Length of Compilation Unit Info");
2081 Asm->EmitInt32(ContentSize);
2082 Asm->OutStreamer.AddComment("DWARF version number");
Manman Ren0e6783f2013-07-02 23:40:10 +00002083 Asm->EmitInt16(DD->getDwarfVersion());
Devang Patel163a9f72010-05-10 22:49:55 +00002084 Asm->OutStreamer.AddComment("Offset Into Abbrev. Section");
Eric Christopherb1e66d02012-12-15 00:04:07 +00002085 Asm->EmitSectionOffset(Asm->GetTempSymbol(ASection->getLabelBeginName()),
2086 ASectionSym);
Devang Patel163a9f72010-05-10 22:49:55 +00002087 Asm->OutStreamer.AddComment("Address Size (in bytes)");
Chandler Carruth426c2bf2012-11-01 09:14:31 +00002088 Asm->EmitInt8(Asm->getDataLayout().getPointerSize());
Jim Grosbach1e20b962010-07-21 21:21:52 +00002089
Eric Christopher6eebe472012-12-19 22:02:53 +00002090 DD->emitDIE(Die, Abbreviations);
Eric Christopherb1e66d02012-12-15 00:04:07 +00002091 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol(USection->getLabelEndName(),
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002092 TheCU->getUniqueID()));
Devang Patel163a9f72010-05-10 22:49:55 +00002093 }
Bill Wendling94d04b82009-05-20 23:21:38 +00002094}
2095
Manman Renbc3e96f2013-03-12 18:27:15 +00002096/// For a given compile unit DIE, returns offset from beginning of debug info.
2097unsigned DwarfUnits::getCUOffset(DIE *Die) {
Manman Ren4c6f8952013-03-13 18:41:27 +00002098 assert(Die->getTag() == dwarf::DW_TAG_compile_unit &&
2099 "Input DIE should be compile unit in getCUOffset.");
Eric Christophera1eacd02013-08-08 01:41:05 +00002100 for (SmallVectorImpl<CompileUnit *>::iterator I = CUs.begin(), E = CUs.end();
2101 I != E; ++I) {
Manman Renbc3e96f2013-03-12 18:27:15 +00002102 CompileUnit *TheCU = *I;
2103 if (TheCU->getCUDie() == Die)
2104 return TheCU->getDebugInfoOffset();
2105 }
Manman Ren4c6f8952013-03-13 18:41:27 +00002106 llvm_unreachable("The compile unit DIE should belong to CUs in DwarfUnits.");
Manman Renbc3e96f2013-03-12 18:27:15 +00002107}
2108
Eric Christopher98e237f2012-11-30 23:59:06 +00002109// Emit the debug info section.
2110void DwarfDebug::emitDebugInfo() {
Eric Christopherb1e66d02012-12-15 00:04:07 +00002111 DwarfUnits &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
2112
2113 Holder.emitUnits(this, Asm->getObjFileLowering().getDwarfInfoSection(),
2114 Asm->getObjFileLowering().getDwarfAbbrevSection(),
2115 DwarfAbbrevSectionSym);
Eric Christopher98e237f2012-11-30 23:59:06 +00002116}
2117
Eric Christopherb6dc8652012-11-27 22:43:45 +00002118// Emit the abbreviation section.
Eric Christopher7dc68db2012-11-20 23:30:11 +00002119void DwarfDebug::emitAbbreviations() {
Eric Christopher6eebe472012-12-19 22:02:53 +00002120 if (!useSplitDwarf())
2121 emitAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevSection(),
2122 &Abbreviations);
2123 else
2124 emitSkeletonAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevSection());
2125}
Bill Wendling94d04b82009-05-20 23:21:38 +00002126
Eric Christopher6eebe472012-12-19 22:02:53 +00002127void DwarfDebug::emitAbbrevs(const MCSection *Section,
2128 std::vector<DIEAbbrev *> *Abbrevs) {
2129 // Check to see if it is worth the effort.
2130 if (!Abbrevs->empty()) {
2131 // Start the debug abbrev section.
2132 Asm->OutStreamer.SwitchSection(Section);
2133
2134 MCSymbol *Begin = Asm->GetTempSymbol(Section->getLabelBeginName());
Eric Christopher44fedba2012-12-13 03:00:38 +00002135 Asm->OutStreamer.EmitLabel(Begin);
Bill Wendling94d04b82009-05-20 23:21:38 +00002136
2137 // For each abbrevation.
Eric Christopher6eebe472012-12-19 22:02:53 +00002138 for (unsigned i = 0, N = Abbrevs->size(); i < N; ++i) {
Bill Wendling94d04b82009-05-20 23:21:38 +00002139 // Get abbreviation data
Eric Christopher6eebe472012-12-19 22:02:53 +00002140 const DIEAbbrev *Abbrev = Abbrevs->at(i);
Bill Wendling94d04b82009-05-20 23:21:38 +00002141
2142 // Emit the abbrevations code (base 1 index.)
Chris Lattner7e1a8f82010-04-04 19:09:29 +00002143 Asm->EmitULEB128(Abbrev->getNumber(), "Abbreviation Code");
Bill Wendling94d04b82009-05-20 23:21:38 +00002144
2145 // Emit the abbreviations data.
Chris Lattnerd38fee82010-04-05 00:13:49 +00002146 Abbrev->Emit(Asm);
Bill Wendling94d04b82009-05-20 23:21:38 +00002147 }
2148
2149 // Mark end of abbreviations.
Chris Lattner7e1a8f82010-04-04 19:09:29 +00002150 Asm->EmitULEB128(0, "EOM(3)");
Bill Wendling94d04b82009-05-20 23:21:38 +00002151
Eric Christopher6eebe472012-12-19 22:02:53 +00002152 MCSymbol *End = Asm->GetTempSymbol(Section->getLabelEndName());
Eric Christopher44fedba2012-12-13 03:00:38 +00002153 Asm->OutStreamer.EmitLabel(End);
Bill Wendling94d04b82009-05-20 23:21:38 +00002154 }
2155}
2156
Eric Christopherb6dc8652012-11-27 22:43:45 +00002157// Emit the last address of the section and the end of the line matrix.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002158void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) {
Bill Wendling94d04b82009-05-20 23:21:38 +00002159 // Define last address of section.
Chris Lattner233f52b2010-03-09 23:52:58 +00002160 Asm->OutStreamer.AddComment("Extended Op");
2161 Asm->EmitInt8(0);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002162
Chris Lattner233f52b2010-03-09 23:52:58 +00002163 Asm->OutStreamer.AddComment("Op size");
Chandler Carruth426c2bf2012-11-01 09:14:31 +00002164 Asm->EmitInt8(Asm->getDataLayout().getPointerSize() + 1);
Chris Lattner233f52b2010-03-09 23:52:58 +00002165 Asm->OutStreamer.AddComment("DW_LNE_set_address");
2166 Asm->EmitInt8(dwarf::DW_LNE_set_address);
2167
2168 Asm->OutStreamer.AddComment("Section end label");
Chris Lattnerd85fc6e2010-03-10 01:17:49 +00002169
Chris Lattnerc0215722010-04-04 19:25:43 +00002170 Asm->OutStreamer.EmitSymbolValue(Asm->GetTempSymbol("section_end",SectionEnd),
Eric Christopherca1dd052013-01-09 01:35:34 +00002171 Asm->getDataLayout().getPointerSize());
Bill Wendling94d04b82009-05-20 23:21:38 +00002172
2173 // Mark end of matrix.
Chris Lattner233f52b2010-03-09 23:52:58 +00002174 Asm->OutStreamer.AddComment("DW_LNE_end_sequence");
2175 Asm->EmitInt8(0);
Chris Lattner0ad9c912010-01-22 22:09:00 +00002176 Asm->EmitInt8(1);
Chris Lattner894d75a2010-01-22 23:18:42 +00002177 Asm->EmitInt8(1);
Bill Wendling94d04b82009-05-20 23:21:38 +00002178}
2179
Eric Christopherb6dc8652012-11-27 22:43:45 +00002180// Emit visible names into a hashed accelerator table section.
Eric Christopher09ac3d82011-11-07 09:24:32 +00002181void DwarfDebug::emitAccelNames() {
2182 DwarfAccelTable AT(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset,
2183 dwarf::DW_FORM_data4));
2184 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2185 E = CUMap.end(); I != E; ++I) {
2186 CompileUnit *TheCU = I->second;
Eric Christopher0ffe2b42011-11-10 19:25:34 +00002187 const StringMap<std::vector<DIE*> > &Names = TheCU->getAccelNames();
2188 for (StringMap<std::vector<DIE*> >::const_iterator
Eric Christopher09ac3d82011-11-07 09:24:32 +00002189 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
Benjamin Kramer03406c42013-05-11 18:24:28 +00002190 StringRef Name = GI->getKey();
Eric Christopherfa03db02012-01-06 23:03:34 +00002191 const std::vector<DIE *> &Entities = GI->second;
Eric Christopher0ffe2b42011-11-10 19:25:34 +00002192 for (std::vector<DIE *>::const_iterator DI = Entities.begin(),
2193 DE = Entities.end(); DI != DE; ++DI)
2194 AT.AddName(Name, (*DI));
Eric Christopher09ac3d82011-11-07 09:24:32 +00002195 }
2196 }
2197
2198 AT.FinalizeTable(Asm, "Names");
2199 Asm->OutStreamer.SwitchSection(
2200 Asm->getObjFileLowering().getDwarfAccelNamesSection());
2201 MCSymbol *SectionBegin = Asm->GetTempSymbol("names_begin");
2202 Asm->OutStreamer.EmitLabel(SectionBegin);
2203
2204 // Emit the full data.
Eric Christopher2e5d8702012-12-20 21:58:36 +00002205 AT.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher09ac3d82011-11-07 09:24:32 +00002206}
2207
Eric Christopher72c16552012-12-20 21:58:40 +00002208// Emit objective C classes and categories into a hashed accelerator table
2209// section.
Eric Christopher09ac3d82011-11-07 09:24:32 +00002210void DwarfDebug::emitAccelObjC() {
2211 DwarfAccelTable AT(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset,
2212 dwarf::DW_FORM_data4));
2213 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2214 E = CUMap.end(); I != E; ++I) {
2215 CompileUnit *TheCU = I->second;
2216 const StringMap<std::vector<DIE*> > &Names = TheCU->getAccelObjC();
2217 for (StringMap<std::vector<DIE*> >::const_iterator
2218 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
Benjamin Kramer03406c42013-05-11 18:24:28 +00002219 StringRef Name = GI->getKey();
Eric Christopherfa03db02012-01-06 23:03:34 +00002220 const std::vector<DIE *> &Entities = GI->second;
Eric Christopher09ac3d82011-11-07 09:24:32 +00002221 for (std::vector<DIE *>::const_iterator DI = Entities.begin(),
2222 DE = Entities.end(); DI != DE; ++DI)
2223 AT.AddName(Name, (*DI));
2224 }
2225 }
2226
2227 AT.FinalizeTable(Asm, "ObjC");
2228 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering()
2229 .getDwarfAccelObjCSection());
2230 MCSymbol *SectionBegin = Asm->GetTempSymbol("objc_begin");
2231 Asm->OutStreamer.EmitLabel(SectionBegin);
2232
2233 // Emit the full data.
Eric Christopher2e5d8702012-12-20 21:58:36 +00002234 AT.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher09ac3d82011-11-07 09:24:32 +00002235}
2236
Eric Christopherb6dc8652012-11-27 22:43:45 +00002237// Emit namespace dies into a hashed accelerator table.
Eric Christopher09ac3d82011-11-07 09:24:32 +00002238void DwarfDebug::emitAccelNamespaces() {
2239 DwarfAccelTable AT(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset,
2240 dwarf::DW_FORM_data4));
2241 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2242 E = CUMap.end(); I != E; ++I) {
2243 CompileUnit *TheCU = I->second;
Eric Christopher8bd36ea2011-11-10 21:47:55 +00002244 const StringMap<std::vector<DIE*> > &Names = TheCU->getAccelNamespace();
2245 for (StringMap<std::vector<DIE*> >::const_iterator
Eric Christopher09ac3d82011-11-07 09:24:32 +00002246 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
Benjamin Kramer03406c42013-05-11 18:24:28 +00002247 StringRef Name = GI->getKey();
Eric Christopherfa03db02012-01-06 23:03:34 +00002248 const std::vector<DIE *> &Entities = GI->second;
Eric Christopher8bd36ea2011-11-10 21:47:55 +00002249 for (std::vector<DIE *>::const_iterator DI = Entities.begin(),
2250 DE = Entities.end(); DI != DE; ++DI)
2251 AT.AddName(Name, (*DI));
Eric Christopher09ac3d82011-11-07 09:24:32 +00002252 }
2253 }
2254
2255 AT.FinalizeTable(Asm, "namespac");
2256 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering()
2257 .getDwarfAccelNamespaceSection());
2258 MCSymbol *SectionBegin = Asm->GetTempSymbol("namespac_begin");
2259 Asm->OutStreamer.EmitLabel(SectionBegin);
2260
2261 // Emit the full data.
Eric Christopher2e5d8702012-12-20 21:58:36 +00002262 AT.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher09ac3d82011-11-07 09:24:32 +00002263}
2264
Eric Christopherb6dc8652012-11-27 22:43:45 +00002265// Emit type dies into a hashed accelerator table.
Eric Christopher09ac3d82011-11-07 09:24:32 +00002266void DwarfDebug::emitAccelTypes() {
Eric Christopherc36145f2012-01-06 04:35:23 +00002267 std::vector<DwarfAccelTable::Atom> Atoms;
2268 Atoms.push_back(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset,
2269 dwarf::DW_FORM_data4));
2270 Atoms.push_back(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeTag,
2271 dwarf::DW_FORM_data2));
2272 Atoms.push_back(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeTypeFlags,
2273 dwarf::DW_FORM_data1));
2274 DwarfAccelTable AT(Atoms);
Eric Christopher09ac3d82011-11-07 09:24:32 +00002275 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2276 E = CUMap.end(); I != E; ++I) {
2277 CompileUnit *TheCU = I->second;
Eric Christopherc36145f2012-01-06 04:35:23 +00002278 const StringMap<std::vector<std::pair<DIE*, unsigned > > > &Names
2279 = TheCU->getAccelTypes();
2280 for (StringMap<std::vector<std::pair<DIE*, unsigned> > >::const_iterator
Eric Christopher09ac3d82011-11-07 09:24:32 +00002281 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
Benjamin Kramer03406c42013-05-11 18:24:28 +00002282 StringRef Name = GI->getKey();
Eric Christopherfa03db02012-01-06 23:03:34 +00002283 const std::vector<std::pair<DIE *, unsigned> > &Entities = GI->second;
Eric Christopherc36145f2012-01-06 04:35:23 +00002284 for (std::vector<std::pair<DIE *, unsigned> >::const_iterator DI
2285 = Entities.begin(), DE = Entities.end(); DI !=DE; ++DI)
2286 AT.AddName(Name, (*DI).first, (*DI).second);
Eric Christopher09ac3d82011-11-07 09:24:32 +00002287 }
2288 }
2289
2290 AT.FinalizeTable(Asm, "types");
2291 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering()
2292 .getDwarfAccelTypesSection());
2293 MCSymbol *SectionBegin = Asm->GetTempSymbol("types_begin");
2294 Asm->OutStreamer.EmitLabel(SectionBegin);
2295
2296 // Emit the full data.
Eric Christopher2e5d8702012-12-20 21:58:36 +00002297 AT.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher09ac3d82011-11-07 09:24:32 +00002298}
2299
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00002300/// emitDebugPubnames - Emit visible names into a debug pubnames section.
2301///
2302void DwarfDebug::emitDebugPubnames() {
2303 const MCSection *ISec = Asm->getObjFileLowering().getDwarfInfoSection();
2304
2305 typedef DenseMap<const MDNode*, CompileUnit*> CUMapType;
2306 for (CUMapType::iterator I = CUMap.begin(), E = CUMap.end(); I != E; ++I) {
2307 CompileUnit *TheCU = I->second;
2308 unsigned ID = TheCU->getUniqueID();
2309
2310 if (TheCU->getGlobalNames().empty())
2311 continue;
2312
2313 // Start the dwarf pubnames section.
Eric Christopherf04e4ef2013-08-19 21:07:38 +00002314 Asm->OutStreamer
2315 .SwitchSection(Asm->getObjFileLowering().getDwarfPubNamesSection());
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00002316
2317 Asm->OutStreamer.AddComment("Length of Public Names Info");
2318 Asm->EmitLabelDifference(Asm->GetTempSymbol("pubnames_end", ID),
2319 Asm->GetTempSymbol("pubnames_begin", ID), 4);
2320
2321 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_begin", ID));
2322
2323 Asm->OutStreamer.AddComment("DWARF Version");
Manman Ren0e6783f2013-07-02 23:40:10 +00002324 Asm->EmitInt16(DwarfVersion);
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00002325
2326 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
2327 Asm->EmitSectionOffset(Asm->GetTempSymbol(ISec->getLabelBeginName(), ID),
2328 DwarfInfoSectionSym);
2329
2330 Asm->OutStreamer.AddComment("Compilation Unit Length");
2331 Asm->EmitLabelDifference(Asm->GetTempSymbol(ISec->getLabelEndName(), ID),
2332 Asm->GetTempSymbol(ISec->getLabelBeginName(), ID),
2333 4);
2334
2335 const StringMap<DIE*> &Globals = TheCU->getGlobalNames();
2336 for (StringMap<DIE*>::const_iterator
2337 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2338 const char *Name = GI->getKeyData();
2339 const DIE *Entity = GI->second;
2340
2341 Asm->OutStreamer.AddComment("DIE offset");
2342 Asm->EmitInt32(Entity->getOffset());
2343
2344 if (Asm->isVerbose())
2345 Asm->OutStreamer.AddComment("External Name");
Rafael Espindolaa3863ea2013-07-02 15:49:13 +00002346 Asm->OutStreamer.EmitBytes(StringRef(Name, GI->getKeyLength()+1));
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00002347 }
2348
2349 Asm->OutStreamer.AddComment("End Mark");
2350 Asm->EmitInt32(0);
2351 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_end", ID));
2352 }
2353}
2354
Devang Patel193f7202009-11-24 01:14:22 +00002355void DwarfDebug::emitDebugPubTypes() {
Devang Patel163a9f72010-05-10 22:49:55 +00002356 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2357 E = CUMap.end(); I != E; ++I) {
2358 CompileUnit *TheCU = I->second;
Eric Christopher63701182011-11-07 09:18:35 +00002359 // Start the dwarf pubtypes section.
Devang Patel163a9f72010-05-10 22:49:55 +00002360 Asm->OutStreamer.SwitchSection(
2361 Asm->getObjFileLowering().getDwarfPubTypesSection());
2362 Asm->OutStreamer.AddComment("Length of Public Types Info");
2363 Asm->EmitLabelDifference(
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002364 Asm->GetTempSymbol("pubtypes_end", TheCU->getUniqueID()),
2365 Asm->GetTempSymbol("pubtypes_begin", TheCU->getUniqueID()), 4);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002366
Devang Patel163a9f72010-05-10 22:49:55 +00002367 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_begin",
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002368 TheCU->getUniqueID()));
Jim Grosbach1e20b962010-07-21 21:21:52 +00002369
Devang Patel163a9f72010-05-10 22:49:55 +00002370 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DWARF Version");
Manman Ren0e6783f2013-07-02 23:40:10 +00002371 Asm->EmitInt16(DwarfVersion);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002372
Devang Patel163a9f72010-05-10 22:49:55 +00002373 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
Eric Christophercf6b8ad2012-12-15 00:04:04 +00002374 const MCSection *ISec = Asm->getObjFileLowering().getDwarfInfoSection();
2375 Asm->EmitSectionOffset(Asm->GetTempSymbol(ISec->getLabelBeginName(),
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002376 TheCU->getUniqueID()),
Devang Patel163a9f72010-05-10 22:49:55 +00002377 DwarfInfoSectionSym);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002378
Devang Patel163a9f72010-05-10 22:49:55 +00002379 Asm->OutStreamer.AddComment("Compilation Unit Length");
Eric Christophercf6b8ad2012-12-15 00:04:04 +00002380 Asm->EmitLabelDifference(Asm->GetTempSymbol(ISec->getLabelEndName(),
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002381 TheCU->getUniqueID()),
Eric Christophercf6b8ad2012-12-15 00:04:04 +00002382 Asm->GetTempSymbol(ISec->getLabelBeginName(),
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002383 TheCU->getUniqueID()),
Devang Patel163a9f72010-05-10 22:49:55 +00002384 4);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002385
Devang Patel163a9f72010-05-10 22:49:55 +00002386 const StringMap<DIE*> &Globals = TheCU->getGlobalTypes();
2387 for (StringMap<DIE*>::const_iterator
2388 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2389 const char *Name = GI->getKeyData();
Nick Lewycky3bbb6f72011-07-29 03:49:23 +00002390 DIE *Entity = GI->second;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002391
Devang Patel163a9f72010-05-10 22:49:55 +00002392 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
2393 Asm->EmitInt32(Entity->getOffset());
Jim Grosbach1e20b962010-07-21 21:21:52 +00002394
Devang Patel163a9f72010-05-10 22:49:55 +00002395 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("External Name");
Benjamin Kramer983c4572011-11-09 18:16:11 +00002396 // Emit the name with a terminating null byte.
Eric Christopher68ca5622013-01-09 01:57:54 +00002397 Asm->OutStreamer.EmitBytes(StringRef(Name, GI->getKeyLength()+1));
Devang Patel163a9f72010-05-10 22:49:55 +00002398 }
Jim Grosbach1e20b962010-07-21 21:21:52 +00002399
Devang Patel163a9f72010-05-10 22:49:55 +00002400 Asm->OutStreamer.AddComment("End Mark");
Jim Grosbach1e20b962010-07-21 21:21:52 +00002401 Asm->EmitInt32(0);
Devang Patel163a9f72010-05-10 22:49:55 +00002402 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_end",
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002403 TheCU->getUniqueID()));
Devang Patel193f7202009-11-24 01:14:22 +00002404 }
Devang Patel193f7202009-11-24 01:14:22 +00002405}
2406
Eric Christopher64f824c2012-12-27 02:14:01 +00002407// Emit strings into a string section.
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002408void DwarfUnits::emitStrings(const MCSection *StrSection,
2409 const MCSection *OffsetSection = NULL,
2410 const MCSymbol *StrSecSym = NULL) {
Eric Christopher64f824c2012-12-27 02:14:01 +00002411
Eric Christopherb6714222013-01-08 22:22:06 +00002412 if (StringPool.empty()) return;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002413
Chris Lattner0d9d70f2010-03-09 23:38:23 +00002414 // Start the dwarf str section.
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002415 Asm->OutStreamer.SwitchSection(StrSection);
Bill Wendling94d04b82009-05-20 23:21:38 +00002416
Chris Lattnerbc733f52010-03-13 02:17:42 +00002417 // Get all of the string pool entries and put them in an array by their ID so
2418 // we can sort them.
Jim Grosbach1e20b962010-07-21 21:21:52 +00002419 SmallVector<std::pair<unsigned,
Eric Christopherff348452013-01-07 22:40:45 +00002420 StringMapEntry<std::pair<MCSymbol*, unsigned> >*>, 64> Entries;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002421
Chris Lattnerbc733f52010-03-13 02:17:42 +00002422 for (StringMap<std::pair<MCSymbol*, unsigned> >::iterator
Eric Christopherb6714222013-01-08 22:22:06 +00002423 I = StringPool.begin(), E = StringPool.end();
Eric Christopher72c16552012-12-20 21:58:40 +00002424 I != E; ++I)
Chris Lattnerbc733f52010-03-13 02:17:42 +00002425 Entries.push_back(std::make_pair(I->second.second, &*I));
Jim Grosbach1e20b962010-07-21 21:21:52 +00002426
Chris Lattnerbc733f52010-03-13 02:17:42 +00002427 array_pod_sort(Entries.begin(), Entries.end());
Jim Grosbach1e20b962010-07-21 21:21:52 +00002428
Chris Lattnerbc733f52010-03-13 02:17:42 +00002429 for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
Chris Lattner0d9d70f2010-03-09 23:38:23 +00002430 // Emit a label for reference from debug information entries.
Chris Lattnerbc733f52010-03-13 02:17:42 +00002431 Asm->OutStreamer.EmitLabel(Entries[i].second->getValue().first);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002432
Benjamin Kramer983c4572011-11-09 18:16:11 +00002433 // Emit the string itself with a terminating null byte.
Benjamin Kramer0c45f7d2011-11-09 12:12:04 +00002434 Asm->OutStreamer.EmitBytes(StringRef(Entries[i].second->getKeyData(),
Eric Christopherca1dd052013-01-09 01:35:34 +00002435 Entries[i].second->getKeyLength()+1));
Bill Wendling94d04b82009-05-20 23:21:38 +00002436 }
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002437
2438 // If we've got an offset section go ahead and emit that now as well.
2439 if (OffsetSection) {
2440 Asm->OutStreamer.SwitchSection(OffsetSection);
2441 unsigned offset = 0;
Eric Christopher72f7bfb2013-01-15 23:56:56 +00002442 unsigned size = 4; // FIXME: DWARF64 is 8.
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002443 for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
Eric Christopher1ced2082013-01-09 03:52:05 +00002444 Asm->OutStreamer.EmitIntValue(offset, size);
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002445 offset += Entries[i].second->getKeyLength() + 1;
2446 }
2447 }
Bill Wendling94d04b82009-05-20 23:21:38 +00002448}
2449
Eric Christopher72f7bfb2013-01-15 23:56:56 +00002450// Emit strings into a string section.
2451void DwarfUnits::emitAddresses(const MCSection *AddrSection) {
2452
2453 if (AddressPool.empty()) return;
2454
2455 // Start the dwarf addr section.
2456 Asm->OutStreamer.SwitchSection(AddrSection);
2457
David Blaikie66f464e2013-07-08 17:51:28 +00002458 // Order the address pool entries by ID
David Blaikie5ce40912013-07-08 17:33:10 +00002459 SmallVector<const MCExpr *, 64> Entries(AddressPool.size());
Eric Christopher72f7bfb2013-01-15 23:56:56 +00002460
David Blaikie66f464e2013-07-08 17:51:28 +00002461 for (DenseMap<const MCExpr *, unsigned>::iterator I = AddressPool.begin(),
2462 E = AddressPool.end();
Eric Christopher72f7bfb2013-01-15 23:56:56 +00002463 I != E; ++I)
David Blaikie5ce40912013-07-08 17:33:10 +00002464 Entries[I->second] = I->first;
Eric Christopher72f7bfb2013-01-15 23:56:56 +00002465
2466 for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
Ulrich Weigand18dbe502013-07-02 18:46:46 +00002467 // Emit an expression for reference from debug information entries.
David Blaikie5ce40912013-07-08 17:33:10 +00002468 if (const MCExpr *Expr = Entries[i])
Ulrich Weigand18dbe502013-07-02 18:46:46 +00002469 Asm->OutStreamer.EmitValue(Expr, Asm->getDataLayout().getPointerSize());
Eric Christopher72f7bfb2013-01-15 23:56:56 +00002470 else
2471 Asm->OutStreamer.EmitIntValue(0, Asm->getDataLayout().getPointerSize());
2472 }
2473
2474}
2475
Eric Christopher64f824c2012-12-27 02:14:01 +00002476// Emit visible names into a debug str section.
2477void DwarfDebug::emitDebugStr() {
2478 DwarfUnits &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
2479 Holder.emitStrings(Asm->getObjFileLowering().getDwarfStrSection());
2480}
2481
Eric Christopherd3b98532013-07-02 21:36:07 +00002482// Emit locations into the debug loc section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002483void DwarfDebug::emitDebugLoc() {
Devang Patel80250682010-05-26 23:55:23 +00002484 if (DotDebugLocEntries.empty())
2485 return;
2486
Eric Christopherf7cef702013-03-29 23:34:06 +00002487 for (SmallVectorImpl<DotDebugLocEntry>::iterator
Devang Patel6c3ea902011-02-04 22:57:18 +00002488 I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
2489 I != E; ++I) {
2490 DotDebugLocEntry &Entry = *I;
2491 if (I + 1 != DotDebugLocEntries.end())
2492 Entry.Merge(I+1);
2493 }
2494
Daniel Dunbar83320a02011-03-16 22:16:39 +00002495 // Start the dwarf loc section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002496 Asm->OutStreamer.SwitchSection(
Devang Patelc3f5f782010-05-25 23:40:22 +00002497 Asm->getObjFileLowering().getDwarfLocSection());
Chandler Carruth426c2bf2012-11-01 09:14:31 +00002498 unsigned char Size = Asm->getDataLayout().getPointerSize();
Devang Patel80250682010-05-26 23:55:23 +00002499 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", 0));
2500 unsigned index = 1;
Eric Christopherf7cef702013-03-29 23:34:06 +00002501 for (SmallVectorImpl<DotDebugLocEntry>::iterator
Jim Grosbach1e20b962010-07-21 21:21:52 +00002502 I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
Devang Patel61409622010-07-07 20:12:52 +00002503 I != E; ++I, ++index) {
Devang Patel6c3ea902011-02-04 22:57:18 +00002504 DotDebugLocEntry &Entry = *I;
2505 if (Entry.isMerged()) continue;
Devang Patelc3f5f782010-05-25 23:40:22 +00002506 if (Entry.isEmpty()) {
Eric Christopherca1dd052013-01-09 01:35:34 +00002507 Asm->OutStreamer.EmitIntValue(0, Size);
2508 Asm->OutStreamer.EmitIntValue(0, Size);
Devang Patel80250682010-05-26 23:55:23 +00002509 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", index));
Devang Patelc3f5f782010-05-25 23:40:22 +00002510 } else {
Eric Christopher0d0782a2013-07-03 22:40:18 +00002511 Asm->OutStreamer.EmitSymbolValue(Entry.getBeginSym(), Size);
2512 Asm->OutStreamer.EmitSymbolValue(Entry.getEndSym(), Size);
2513 DIVariable DV(Entry.getVariable());
Rafael Espindola5b23b7f2011-05-27 22:05:41 +00002514 Asm->OutStreamer.AddComment("Loc expr size");
2515 MCSymbol *begin = Asm->OutStreamer.getContext().CreateTempSymbol();
2516 MCSymbol *end = Asm->OutStreamer.getContext().CreateTempSymbol();
2517 Asm->EmitLabelDifference(end, begin, 2);
2518 Asm->OutStreamer.EmitLabel(begin);
Devang Patel80efd4e2011-07-08 16:49:43 +00002519 if (Entry.isInt()) {
Devang Patelc4329072011-06-01 22:03:25 +00002520 DIBasicType BTy(DV.getType());
2521 if (BTy.Verify() &&
Eric Christopher0f1c7f62012-11-19 22:42:10 +00002522 (BTy.getEncoding() == dwarf::DW_ATE_signed
Devang Patelc4329072011-06-01 22:03:25 +00002523 || BTy.getEncoding() == dwarf::DW_ATE_signed_char)) {
2524 Asm->OutStreamer.AddComment("DW_OP_consts");
2525 Asm->EmitInt8(dwarf::DW_OP_consts);
Devang Patel80efd4e2011-07-08 16:49:43 +00002526 Asm->EmitSLEB128(Entry.getInt());
Devang Patelc4329072011-06-01 22:03:25 +00002527 } else {
2528 Asm->OutStreamer.AddComment("DW_OP_constu");
2529 Asm->EmitInt8(dwarf::DW_OP_constu);
Devang Patel80efd4e2011-07-08 16:49:43 +00002530 Asm->EmitULEB128(Entry.getInt());
Devang Patelc4329072011-06-01 22:03:25 +00002531 }
Devang Patel80efd4e2011-07-08 16:49:43 +00002532 } else if (Entry.isLocation()) {
Eric Christopher7c2f3e82013-07-03 22:40:21 +00002533 MachineLocation Loc = Entry.getLoc();
Eric Christopher0f1c7f62012-11-19 22:42:10 +00002534 if (!DV.hasComplexAddress())
Devang Patel80efd4e2011-07-08 16:49:43 +00002535 // Regular entry.
Eric Christopher7c2f3e82013-07-03 22:40:21 +00002536 Asm->EmitDwarfRegOp(Loc, DV.isIndirect());
Devang Patel80efd4e2011-07-08 16:49:43 +00002537 else {
2538 // Complex address entry.
2539 unsigned N = DV.getNumAddrElements();
2540 unsigned i = 0;
2541 if (N >= 2 && DV.getAddrElement(0) == DIBuilder::OpPlus) {
Eric Christopher7c2f3e82013-07-03 22:40:21 +00002542 if (Loc.getOffset()) {
Devang Patel80efd4e2011-07-08 16:49:43 +00002543 i = 2;
Eric Christopher7c2f3e82013-07-03 22:40:21 +00002544 Asm->EmitDwarfRegOp(Loc, DV.isIndirect());
Devang Patel80efd4e2011-07-08 16:49:43 +00002545 Asm->OutStreamer.AddComment("DW_OP_deref");
2546 Asm->EmitInt8(dwarf::DW_OP_deref);
2547 Asm->OutStreamer.AddComment("DW_OP_plus_uconst");
2548 Asm->EmitInt8(dwarf::DW_OP_plus_uconst);
2549 Asm->EmitSLEB128(DV.getAddrElement(1));
2550 } else {
2551 // If first address element is OpPlus then emit
2552 // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
Eric Christopher7c2f3e82013-07-03 22:40:21 +00002553 MachineLocation TLoc(Loc.getReg(), DV.getAddrElement(1));
2554 Asm->EmitDwarfRegOp(TLoc, DV.isIndirect());
Devang Patel80efd4e2011-07-08 16:49:43 +00002555 i = 2;
2556 }
2557 } else {
Eric Christopher7c2f3e82013-07-03 22:40:21 +00002558 Asm->EmitDwarfRegOp(Loc, DV.isIndirect());
Devang Patel80efd4e2011-07-08 16:49:43 +00002559 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +00002560
Devang Patel80efd4e2011-07-08 16:49:43 +00002561 // Emit remaining complex address elements.
2562 for (; i < N; ++i) {
2563 uint64_t Element = DV.getAddrElement(i);
2564 if (Element == DIBuilder::OpPlus) {
2565 Asm->EmitInt8(dwarf::DW_OP_plus_uconst);
2566 Asm->EmitULEB128(DV.getAddrElement(++i));
Eric Christopher50120762012-05-08 18:56:00 +00002567 } else if (Element == DIBuilder::OpDeref) {
Eric Christopher7c2f3e82013-07-03 22:40:21 +00002568 if (!Loc.isReg())
Eric Christopher50120762012-05-08 18:56:00 +00002569 Asm->EmitInt8(dwarf::DW_OP_deref);
2570 } else
2571 llvm_unreachable("unknown Opcode found in complex address");
Devang Patel80efd4e2011-07-08 16:49:43 +00002572 }
Devang Patelc26f5442011-04-28 02:22:40 +00002573 }
Devang Patelc26f5442011-04-28 02:22:40 +00002574 }
Devang Patel80efd4e2011-07-08 16:49:43 +00002575 // else ... ignore constant fp. There is not any good way to
2576 // to represent them here in dwarf.
Rafael Espindola5b23b7f2011-05-27 22:05:41 +00002577 Asm->OutStreamer.EmitLabel(end);
Devang Patelc3f5f782010-05-25 23:40:22 +00002578 }
2579 }
Bill Wendling94d04b82009-05-20 23:21:38 +00002580}
2581
Eric Christopherb6dc8652012-11-27 22:43:45 +00002582// Emit visible names into a debug aranges section.
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00002583void DwarfDebug::emitDebugARanges() {
Bill Wendling94d04b82009-05-20 23:21:38 +00002584 // Start the dwarf aranges section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002585 Asm->OutStreamer.SwitchSection(
2586 Asm->getObjFileLowering().getDwarfARangesSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002587}
2588
Eric Christopherb6dc8652012-11-27 22:43:45 +00002589// Emit visible names into a debug ranges section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002590void DwarfDebug::emitDebugRanges() {
Bill Wendling94d04b82009-05-20 23:21:38 +00002591 // Start the dwarf ranges section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002592 Asm->OutStreamer.SwitchSection(
Devang Patelf2548ca2010-04-16 23:33:45 +00002593 Asm->getObjFileLowering().getDwarfRangesSection());
Chandler Carruth426c2bf2012-11-01 09:14:31 +00002594 unsigned char Size = Asm->getDataLayout().getPointerSize();
Eric Christopherf7cef702013-03-29 23:34:06 +00002595 for (SmallVectorImpl<const MCSymbol *>::iterator
Jim Grosbach1e20b962010-07-21 21:21:52 +00002596 I = DebugRangeSymbols.begin(), E = DebugRangeSymbols.end();
Devang Pateleac9c072010-04-27 19:46:33 +00002597 I != E; ++I) {
2598 if (*I)
Eric Christopher1ced2082013-01-09 03:52:05 +00002599 Asm->OutStreamer.EmitSymbolValue(const_cast<MCSymbol*>(*I), Size);
Devang Patelf2548ca2010-04-16 23:33:45 +00002600 else
Eric Christopherca1dd052013-01-09 01:35:34 +00002601 Asm->OutStreamer.EmitIntValue(0, Size);
Devang Patelf2548ca2010-04-16 23:33:45 +00002602 }
Bill Wendling94d04b82009-05-20 23:21:38 +00002603}
2604
Eric Christopherb6dc8652012-11-27 22:43:45 +00002605// Emit visible names into a debug macinfo section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002606void DwarfDebug::emitDebugMacInfo() {
Daniel Dunbarf612ff62009-09-19 20:40:05 +00002607 if (const MCSection *LineInfo =
Chris Lattner18a4c162009-08-02 07:24:22 +00002608 Asm->getObjFileLowering().getDwarfMacroInfoSection()) {
Bill Wendling94d04b82009-05-20 23:21:38 +00002609 // Start the dwarf macinfo section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002610 Asm->OutStreamer.SwitchSection(LineInfo);
Bill Wendling94d04b82009-05-20 23:21:38 +00002611 }
2612}
2613
Eric Christopherb6dc8652012-11-27 22:43:45 +00002614// Emit inline info using following format.
2615// Section Header:
2616// 1. length of section
2617// 2. Dwarf version number
2618// 3. address size.
2619//
2620// Entries (one "entry" for each function that was inlined):
2621//
2622// 1. offset into __debug_str section for MIPS linkage name, if exists;
2623// otherwise offset into __debug_str for regular function name.
2624// 2. offset into __debug_str section for regular function name.
2625// 3. an unsigned LEB128 number indicating the number of distinct inlining
2626// instances for the function.
2627//
2628// The rest of the entry consists of a {die_offset, low_pc} pair for each
2629// inlined instance; the die_offset points to the inlined_subroutine die in the
2630// __debug_info section, and the low_pc is the starting address for the
2631// inlining instance.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002632void DwarfDebug::emitDebugInlineInfo() {
Eric Christopherb83e2bb2012-03-02 02:11:47 +00002633 if (!Asm->MAI->doesDwarfUseInlineInfoSection())
Bill Wendling94d04b82009-05-20 23:21:38 +00002634 return;
2635
Devang Patel163a9f72010-05-10 22:49:55 +00002636 if (!FirstCU)
Bill Wendling94d04b82009-05-20 23:21:38 +00002637 return;
2638
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002639 Asm->OutStreamer.SwitchSection(
2640 Asm->getObjFileLowering().getDwarfDebugInlineSection());
Chris Lattner0ad9c912010-01-22 22:09:00 +00002641
Chris Lattner233f52b2010-03-09 23:52:58 +00002642 Asm->OutStreamer.AddComment("Length of Debug Inlined Information Entry");
Chris Lattnera6437182010-04-04 19:58:12 +00002643 Asm->EmitLabelDifference(Asm->GetTempSymbol("debug_inlined_end", 1),
2644 Asm->GetTempSymbol("debug_inlined_begin", 1), 4);
Bill Wendling94d04b82009-05-20 23:21:38 +00002645
Chris Lattnerc0215722010-04-04 19:25:43 +00002646 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_begin", 1));
Bill Wendling94d04b82009-05-20 23:21:38 +00002647
Chris Lattner233f52b2010-03-09 23:52:58 +00002648 Asm->OutStreamer.AddComment("Dwarf Version");
Manman Ren0e6783f2013-07-02 23:40:10 +00002649 Asm->EmitInt16(DwarfVersion);
Chris Lattner233f52b2010-03-09 23:52:58 +00002650 Asm->OutStreamer.AddComment("Address Size (in bytes)");
Chandler Carruth426c2bf2012-11-01 09:14:31 +00002651 Asm->EmitInt8(Asm->getDataLayout().getPointerSize());
Bill Wendling94d04b82009-05-20 23:21:38 +00002652
Eric Christopherf7cef702013-03-29 23:34:06 +00002653 for (SmallVectorImpl<const MDNode *>::iterator I = InlinedSPNodes.begin(),
Devang Patel53bb5c92009-11-10 23:06:00 +00002654 E = InlinedSPNodes.end(); I != E; ++I) {
Jim Grosbach31ef40e2009-11-21 23:12:12 +00002655
Devang Patele9f8f5e2010-05-07 20:54:48 +00002656 const MDNode *Node = *I;
Craig Topper01eb99a2013-07-03 04:40:27 +00002657 InlineInfoMap::iterator II = InlineInfo.find(Node);
Eric Christopherf7cef702013-03-29 23:34:06 +00002658 SmallVectorImpl<InlineInfoLabels> &Labels = II->second;
Devang Patele4b27562009-08-28 23:24:31 +00002659 DISubprogram SP(Node);
Devang Patel65dbc902009-11-25 17:36:49 +00002660 StringRef LName = SP.getLinkageName();
2661 StringRef Name = SP.getName();
Bill Wendling94d04b82009-05-20 23:21:38 +00002662
Chris Lattner233f52b2010-03-09 23:52:58 +00002663 Asm->OutStreamer.AddComment("MIPS linkage name");
Eric Christopher50e26612012-03-02 01:57:52 +00002664 if (LName.empty())
Eric Christopher2e5d8702012-12-20 21:58:36 +00002665 Asm->EmitSectionOffset(InfoHolder.getStringPoolEntry(Name),
2666 DwarfStrSectionSym);
Eric Christopher50e26612012-03-02 01:57:52 +00002667 else
Benjamin Kramer7c2b4be2013-06-01 17:51:14 +00002668 Asm->EmitSectionOffset(
2669 InfoHolder.getStringPoolEntry(Function::getRealLinkageName(LName)),
2670 DwarfStrSectionSym);
Devang Patel53bb5c92009-11-10 23:06:00 +00002671
Chris Lattner233f52b2010-03-09 23:52:58 +00002672 Asm->OutStreamer.AddComment("Function name");
Eric Christopher2e5d8702012-12-20 21:58:36 +00002673 Asm->EmitSectionOffset(InfoHolder.getStringPoolEntry(Name),
2674 DwarfStrSectionSym);
Chris Lattner7e1a8f82010-04-04 19:09:29 +00002675 Asm->EmitULEB128(Labels.size(), "Inline count");
Bill Wendling94d04b82009-05-20 23:21:38 +00002676
Eric Christopherf7cef702013-03-29 23:34:06 +00002677 for (SmallVectorImpl<InlineInfoLabels>::iterator LI = Labels.begin(),
Bill Wendling94d04b82009-05-20 23:21:38 +00002678 LE = Labels.end(); LI != LE; ++LI) {
Chris Lattner3f53c832010-04-04 18:52:31 +00002679 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
Chris Lattner6ed0f902010-03-09 00:31:02 +00002680 Asm->EmitInt32(LI->second->getOffset());
Bill Wendling94d04b82009-05-20 23:21:38 +00002681
Chris Lattner3f53c832010-04-04 18:52:31 +00002682 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("low_pc");
Chris Lattnerd38fee82010-04-05 00:13:49 +00002683 Asm->OutStreamer.EmitSymbolValue(LI->first,
Eric Christopher1ced2082013-01-09 03:52:05 +00002684 Asm->getDataLayout().getPointerSize());
Bill Wendling94d04b82009-05-20 23:21:38 +00002685 }
2686 }
2687
Chris Lattnerc0215722010-04-04 19:25:43 +00002688 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_end", 1));
Bill Wendling94d04b82009-05-20 23:21:38 +00002689}
Eric Christopher98e237f2012-11-30 23:59:06 +00002690
Eric Christopher0b944ee2012-12-11 19:42:09 +00002691// DWARF5 Experimental Separate Dwarf emitters.
Eric Christopher98e237f2012-11-30 23:59:06 +00002692
2693// This DIE has the following attributes: DW_AT_comp_dir, DW_AT_stmt_list,
2694// DW_AT_low_pc, DW_AT_high_pc, DW_AT_ranges, DW_AT_dwo_name, DW_AT_dwo_id,
2695// DW_AT_ranges_base, DW_AT_addr_base. If DW_AT_ranges is present,
2696// DW_AT_low_pc and DW_AT_high_pc are not used, and vice versa.
Eric Christopher4daaed12012-12-10 19:51:21 +00002697CompileUnit *DwarfDebug::constructSkeletonCU(const MDNode *N) {
Eric Christopher98e237f2012-11-30 23:59:06 +00002698 DICompileUnit DIUnit(N);
Eric Christopher98e237f2012-11-30 23:59:06 +00002699 CompilationDir = DIUnit.getDirectory();
Eric Christopher98e237f2012-11-30 23:59:06 +00002700
2701 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002702 CompileUnit *NewCU = new CompileUnit(GlobalCUIndexCount++,
Eric Christopher9c57ad22013-05-08 00:58:51 +00002703 DIUnit.getLanguage(), Die, N, Asm,
Eric Christopher64f824c2012-12-27 02:14:01 +00002704 this, &SkeletonHolder);
Eric Christopher446b88f2013-01-17 03:00:04 +00002705
Eric Christopher3ce51a92013-02-22 23:50:08 +00002706 NewCU->addLocalString(Die, dwarf::DW_AT_GNU_dwo_name,
2707 DIUnit.getSplitDebugFilename());
Eric Christopher98e237f2012-11-30 23:59:06 +00002708
Eric Christopher1b0cd2f2013-04-22 07:51:08 +00002709 // Relocate to the beginning of the addr_base section, else 0 for the
2710 // beginning of the one for this compile unit.
Eric Christopher9a9e73b2013-04-07 03:43:09 +00002711 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
2712 NewCU->addLabel(Die, dwarf::DW_AT_GNU_addr_base, dwarf::DW_FORM_sec_offset,
2713 DwarfAddrSectionSym);
2714 else
Eric Christopher1b0cd2f2013-04-22 07:51:08 +00002715 NewCU->addUInt(Die, dwarf::DW_AT_GNU_addr_base,
2716 dwarf::DW_FORM_sec_offset, 0);
Eric Christopher98e237f2012-11-30 23:59:06 +00002717
2718 // 2.17.1 requires that we use DW_AT_low_pc for a single entry point
Eric Christopher72f7bfb2013-01-15 23:56:56 +00002719 // into an entity. We're using 0, or a NULL label for this.
Eric Christopher98e237f2012-11-30 23:59:06 +00002720 NewCU->addUInt(Die, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, 0);
Eric Christopher72f7bfb2013-01-15 23:56:56 +00002721
Eric Christopher98e237f2012-11-30 23:59:06 +00002722 // DW_AT_stmt_list is a offset of line number information for this
2723 // compile unit in debug_line section.
Eric Christopher9a9e73b2013-04-07 03:43:09 +00002724 // FIXME: Should handle multiple compile units.
Eric Christopher98e237f2012-11-30 23:59:06 +00002725 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
Eric Christopher446b88f2013-01-17 03:00:04 +00002726 NewCU->addLabel(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_sec_offset,
Eric Christopher7a0103c2013-02-07 21:19:50 +00002727 DwarfLineSectionSym);
Eric Christopher98e237f2012-11-30 23:59:06 +00002728 else
Eric Christopher446b88f2013-01-17 03:00:04 +00002729 NewCU->addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_sec_offset, 0);
Eric Christopher98e237f2012-11-30 23:59:06 +00002730
2731 if (!CompilationDir.empty())
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002732 NewCU->addLocalString(Die, dwarf::DW_AT_comp_dir, CompilationDir);
Eric Christopher98e237f2012-11-30 23:59:06 +00002733
Eric Christopher0e3e9b72012-12-10 23:34:43 +00002734 SkeletonHolder.addUnit(NewCU);
Eric Christopher01776a52013-02-06 21:53:56 +00002735 SkeletonCUs.push_back(NewCU);
Eric Christopher0e3e9b72012-12-10 23:34:43 +00002736
Eric Christopher98e237f2012-11-30 23:59:06 +00002737 return NewCU;
2738}
2739
Eric Christopher6eebe472012-12-19 22:02:53 +00002740void DwarfDebug::emitSkeletonAbbrevs(const MCSection *Section) {
2741 assert(useSplitDwarf() && "No split dwarf debug info?");
2742 emitAbbrevs(Section, &SkeletonAbbrevs);
Eric Christopher98e237f2012-11-30 23:59:06 +00002743}
2744
Eric Christopher0b944ee2012-12-11 19:42:09 +00002745// Emit the .debug_info.dwo section for separated dwarf. This contains the
2746// compile units that would normally be in debug_info.
Eric Christopher98e237f2012-11-30 23:59:06 +00002747void DwarfDebug::emitDebugInfoDWO() {
Eric Christopher4daaed12012-12-10 19:51:21 +00002748 assert(useSplitDwarf() && "No split dwarf debug info?");
Eric Christopherb1e66d02012-12-15 00:04:07 +00002749 InfoHolder.emitUnits(this, Asm->getObjFileLowering().getDwarfInfoDWOSection(),
Eric Christopher6eebe472012-12-19 22:02:53 +00002750 Asm->getObjFileLowering().getDwarfAbbrevDWOSection(),
2751 DwarfAbbrevDWOSectionSym);
2752}
2753
2754// Emit the .debug_abbrev.dwo section for separated dwarf. This contains the
2755// abbreviations for the .debug_info.dwo section.
2756void DwarfDebug::emitDebugAbbrevDWO() {
2757 assert(useSplitDwarf() && "No split dwarf?");
Eric Christopher72c16552012-12-20 21:58:40 +00002758 emitAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevDWOSection(),
2759 &Abbreviations);
Eric Christopher98e237f2012-11-30 23:59:06 +00002760}
Eric Christopher64f824c2012-12-27 02:14:01 +00002761
2762// Emit the .debug_str.dwo section for separated dwarf. This contains the
2763// string section and is identical in format to traditional .debug_str
2764// sections.
2765void DwarfDebug::emitDebugStrDWO() {
2766 assert(useSplitDwarf() && "No split dwarf?");
Eric Christopherff348452013-01-07 22:40:45 +00002767 const MCSection *OffSec = Asm->getObjFileLowering()
2768 .getDwarfStrOffDWOSection();
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002769 const MCSymbol *StrSym = DwarfStrSectionSym;
2770 InfoHolder.emitStrings(Asm->getObjFileLowering().getDwarfStrDWOSection(),
2771 OffSec, StrSym);
Eric Christopher64f824c2012-12-27 02:14:01 +00002772}