blob: dd233eaa1bcc98e523ea0451f7dcd197b0839278 [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 Christopher09ac3d82011-11-07 09:24:32 +000017#include "DwarfAccelTable.h"
Devang Patel8b9df622011-04-12 17:40:32 +000018#include "DwarfCompileUnit.h"
Chandler Carruthd04a8d42012-12-03 16:50:05 +000019#include "llvm/ADT/STLExtras.h"
20#include "llvm/ADT/Statistic.h"
21#include "llvm/ADT/StringExtras.h"
22#include "llvm/ADT/Triple.h"
David Greeneb2c66fc2009-08-19 21:52:55 +000023#include "llvm/CodeGen/MachineFunction.h"
Bill Wendling0310d762009-05-15 09:23:25 +000024#include "llvm/CodeGen/MachineModuleInfo.h"
Chandler Carruthd04a8d42012-12-03 16:50:05 +000025#include "llvm/DIBuilder.h"
Chandler Carruthd04a8d42012-12-03 16:50:05 +000026#include "llvm/DebugInfo.h"
Chandler Carruth0b8c9a82013-01-02 11:36:10 +000027#include "llvm/IR/Constants.h"
28#include "llvm/IR/DataLayout.h"
29#include "llvm/IR/Instructions.h"
30#include "llvm/IR/Module.h"
Chris Lattnerb7db7332010-03-09 01:58:53 +000031#include "llvm/MC/MCAsmInfo.h"
Chris Lattnera87dea42009-07-31 18:48:30 +000032#include "llvm/MC/MCSection.h"
Chris Lattner6c2f9e12009-08-19 05:49:37 +000033#include "llvm/MC/MCStreamer.h"
Chris Lattnerb7db7332010-03-09 01:58:53 +000034#include "llvm/MC/MCSymbol.h"
Devang Pateleac9c072010-04-27 19:46:33 +000035#include "llvm/Support/CommandLine.h"
Daniel Dunbar6e4bdfc2009-10-13 06:47:08 +000036#include "llvm/Support/Debug.h"
37#include "llvm/Support/ErrorHandling.h"
Chris Lattner0ad9c912010-01-22 22:09:00 +000038#include "llvm/Support/FormattedStream.h"
Michael J. Spencer1f6efa32010-11-29 18:16:10 +000039#include "llvm/Support/Path.h"
Chandler Carruthd04a8d42012-12-03 16:50:05 +000040#include "llvm/Support/Timer.h"
41#include "llvm/Support/ValueHandle.h"
42#include "llvm/Target/TargetFrameLowering.h"
43#include "llvm/Target/TargetLoweringObjectFile.h"
44#include "llvm/Target/TargetMachine.h"
45#include "llvm/Target/TargetOptions.h"
46#include "llvm/Target/TargetRegisterInfo.h"
Bill Wendling0310d762009-05-15 09:23:25 +000047using namespace llvm;
48
Jim Grosbach1e20b962010-07-21 21:21:52 +000049static cl::opt<bool> DisableDebugInfoPrinting("disable-debug-info-print",
Devang Patel61409622010-07-07 20:12:52 +000050 cl::Hidden,
Devang Pateleac9c072010-04-27 19:46:33 +000051 cl::desc("Disable debug info printing"));
52
Dan Gohman281d65d2010-05-07 01:08:53 +000053static cl::opt<bool> UnknownLocations("use-unknown-locations", cl::Hidden,
Chris Lattner7a2bdde2011-04-15 05:18:47 +000054 cl::desc("Make an absence of debug location information explicit."),
Dan Gohman281d65d2010-05-07 01:08:53 +000055 cl::init(false));
56
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +000057static cl::opt<bool> GenerateDwarfPubNamesSection("generate-dwarf-pubnames",
Eric Christopher3dcb5382013-04-03 05:26:07 +000058 cl::Hidden, cl::init(false),
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +000059 cl::desc("Generate DWARF pubnames section"));
60
Eric Christopher20f47ab2012-08-23 22:36:40 +000061namespace {
62 enum DefaultOnOff {
63 Default, Enable, Disable
64 };
65}
Eric Christopher09ac3d82011-11-07 09:24:32 +000066
Eric Christopher20f47ab2012-08-23 22:36:40 +000067static cl::opt<DefaultOnOff> DwarfAccelTables("dwarf-accel-tables", cl::Hidden,
68 cl::desc("Output prototype dwarf accelerator tables."),
69 cl::values(
70 clEnumVal(Default, "Default for platform"),
71 clEnumVal(Enable, "Enabled"),
72 clEnumVal(Disable, "Disabled"),
73 clEnumValEnd),
74 cl::init(Default));
75
76static cl::opt<DefaultOnOff> DarwinGDBCompat("darwin-gdb-compat", cl::Hidden,
Eric Christopher10cb7442012-08-23 07:10:46 +000077 cl::desc("Compatibility with Darwin gdb."),
Eric Christopher20f47ab2012-08-23 22:36:40 +000078 cl::values(
79 clEnumVal(Default, "Default for platform"),
80 clEnumVal(Enable, "Enabled"),
81 clEnumVal(Disable, "Disabled"),
82 clEnumValEnd),
83 cl::init(Default));
Eric Christopher10cb7442012-08-23 07:10:46 +000084
Eric Christopher4daaed12012-12-10 19:51:21 +000085static cl::opt<DefaultOnOff> SplitDwarf("split-dwarf", cl::Hidden,
86 cl::desc("Output prototype dwarf split debug info."),
Eric Christopherf5b6dcd2012-11-12 22:22:20 +000087 cl::values(
88 clEnumVal(Default, "Default for platform"),
89 clEnumVal(Enable, "Enabled"),
90 clEnumVal(Disable, "Disabled"),
91 clEnumValEnd),
92 cl::init(Default));
93
Bill Wendling5f017e82010-04-07 09:28:04 +000094namespace {
95 const char *DWARFGroupName = "DWARF Emission";
96 const char *DbgTimerName = "DWARF Debug Writer";
David Blaikied2e0f7e2013-05-06 23:33:07 +000097
98 struct CompareFirst {
99 template <typename T> bool operator()(const T &lhs, const T &rhs) const {
100 return lhs.first < rhs.first;
101 }
102 };
Bill Wendling5f017e82010-04-07 09:28:04 +0000103} // end anonymous namespace
104
Bill Wendling0310d762009-05-15 09:23:25 +0000105//===----------------------------------------------------------------------===//
106
Eric Christopherb6dc8652012-11-27 22:43:45 +0000107// Configuration values for initial hash set sizes (log2).
108//
Bill Wendling0310d762009-05-15 09:23:25 +0000109static const unsigned InitAbbreviationsSetSize = 9; // log2(512)
Bill Wendling0310d762009-05-15 09:23:25 +0000110
111namespace llvm {
112
Nick Lewycky3bbb6f72011-07-29 03:49:23 +0000113DIType DbgVariable::getType() const {
Devang Patel3cbee302011-04-12 22:53:02 +0000114 DIType Ty = Var.getType();
115 // FIXME: isBlockByrefVariable should be reformulated in terms of complex
116 // addresses instead.
117 if (Var.isBlockByrefVariable()) {
118 /* Byref variables, in Blocks, are declared by the programmer as
119 "SomeType VarName;", but the compiler creates a
120 __Block_byref_x_VarName struct, and gives the variable VarName
121 either the struct, or a pointer to the struct, as its type. This
122 is necessary for various behind-the-scenes things the compiler
123 needs to do with by-reference variables in blocks.
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000124
Devang Patel3cbee302011-04-12 22:53:02 +0000125 However, as far as the original *programmer* is concerned, the
126 variable should still have type 'SomeType', as originally declared.
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000127
Devang Patel3cbee302011-04-12 22:53:02 +0000128 The following function dives into the __Block_byref_x_VarName
129 struct to find the original type of the variable. This will be
130 passed back to the code generating the type for the Debug
131 Information Entry for the variable 'VarName'. 'VarName' will then
132 have the original type 'SomeType' in its debug information.
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000133
Devang Patel3cbee302011-04-12 22:53:02 +0000134 The original type 'SomeType' will be the type of the field named
135 'VarName' inside the __Block_byref_x_VarName struct.
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000136
Devang Patel3cbee302011-04-12 22:53:02 +0000137 NOTE: In order for this to not completely fail on the debugger
138 side, the Debug Information Entry for the variable VarName needs to
139 have a DW_AT_location that tells the debugger how to unwind through
140 the pointers and __Block_byref_x_VarName struct to find the actual
141 value of the variable. The function addBlockByrefType does this. */
142 DIType subType = Ty;
143 unsigned tag = Ty.getTag();
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000144
Devang Patel3cbee302011-04-12 22:53:02 +0000145 if (tag == dwarf::DW_TAG_pointer_type) {
146 DIDerivedType DTy = DIDerivedType(Ty);
147 subType = DTy.getTypeDerivedFrom();
148 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000149
Devang Patel3cbee302011-04-12 22:53:02 +0000150 DICompositeType blockStruct = DICompositeType(subType);
151 DIArray Elements = blockStruct.getTypeArray();
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000152
Devang Patel3cbee302011-04-12 22:53:02 +0000153 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
154 DIDescriptor Element = Elements.getElement(i);
155 DIDerivedType DT = DIDerivedType(Element);
156 if (getName() == DT.getName())
157 return (DT.getTypeDerivedFrom());
Devang Patel8bd11de2010-08-09 21:01:39 +0000158 }
Devang Patel8bd11de2010-08-09 21:01:39 +0000159 }
Devang Patel3cbee302011-04-12 22:53:02 +0000160 return Ty;
161}
Bill Wendling0310d762009-05-15 09:23:25 +0000162
Chris Lattnerea761862010-04-05 04:09:20 +0000163} // end llvm namespace
Bill Wendling0310d762009-05-15 09:23:25 +0000164
Chris Lattner49cd6642010-04-05 05:11:15 +0000165DwarfDebug::DwarfDebug(AsmPrinter *A, Module *M)
Eric Christopher28bd25a2012-12-10 19:51:13 +0000166 : Asm(A), MMI(Asm->MMI), FirstCU(0),
Jim Grosbach1e20b962010-07-21 21:21:52 +0000167 AbbreviationsSet(InitAbbreviationsSetSize),
Eric Christopherb6714222013-01-08 22:22:06 +0000168 SourceIdMap(DIEValueAllocator),
Eric Christopher0e3e9b72012-12-10 23:34:43 +0000169 PrevLabel(NULL), GlobalCUIndexCount(0),
Eric Christopherb6714222013-01-08 22:22:06 +0000170 InfoHolder(A, &AbbreviationsSet, &Abbreviations, "info_string",
171 DIEValueAllocator),
Eric Christopher6eebe472012-12-19 22:02:53 +0000172 SkeletonAbbrevSet(InitAbbreviationsSetSize),
Eric Christopherb6714222013-01-08 22:22:06 +0000173 SkeletonHolder(A, &SkeletonAbbrevSet, &SkeletonAbbrevs, "skel_string",
174 DIEValueAllocator) {
Jim Grosbach1e20b962010-07-21 21:21:52 +0000175
Rafael Espindolaf2b04232011-05-06 14:56:22 +0000176 DwarfInfoSectionSym = DwarfAbbrevSectionSym = 0;
Chris Lattner4ad1efe2010-04-04 23:10:38 +0000177 DwarfStrSectionSym = TextSectionSym = 0;
Eric Christopher7a0103c2013-02-07 21:19:50 +0000178 DwarfDebugRangeSectionSym = DwarfDebugLocSectionSym = DwarfLineSectionSym = 0;
Eric Christopher9a9e73b2013-04-07 03:43:09 +0000179 DwarfAddrSectionSym = 0;
Eric Christopher64f824c2012-12-27 02:14:01 +0000180 DwarfAbbrevDWOSectionSym = DwarfStrDWOSectionSym = 0;
Devang Patelc3f5f782010-05-25 23:40:22 +0000181 FunctionBeginSym = FunctionEndSym = 0;
Eric Christopher60777d82012-04-02 17:58:52 +0000182
Eric Christopher10cb7442012-08-23 07:10:46 +0000183 // Turn on accelerator tables and older gdb compatibility
184 // for Darwin.
Eric Christopher00297ba2013-04-27 01:07:52 +0000185 bool IsDarwin = Triple(A->getTargetTriple()).isOSDarwin();
Eric Christopher20f47ab2012-08-23 22:36:40 +0000186 if (DarwinGDBCompat == Default) {
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000187 if (IsDarwin)
188 IsDarwinGDBCompat = true;
Eric Christopher20f47ab2012-08-23 22:36:40 +0000189 else
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000190 IsDarwinGDBCompat = false;
Eric Christopher20f47ab2012-08-23 22:36:40 +0000191 } else
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000192 IsDarwinGDBCompat = DarwinGDBCompat == Enable ? true : false;
Eric Christopherc1610fa2012-08-23 22:36:36 +0000193
Eric Christopher20f47ab2012-08-23 22:36:40 +0000194 if (DwarfAccelTables == Default) {
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000195 if (IsDarwin)
196 HasDwarfAccelTables = true;
Eric Christopher20f47ab2012-08-23 22:36:40 +0000197 else
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000198 HasDwarfAccelTables = false;
Eric Christopher20f47ab2012-08-23 22:36:40 +0000199 } else
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000200 HasDwarfAccelTables = DwarfAccelTables == Enable ? true : false;
Eric Christopher20f47ab2012-08-23 22:36:40 +0000201
Eric Christopher4daaed12012-12-10 19:51:21 +0000202 if (SplitDwarf == Default)
203 HasSplitDwarf = false;
Eric Christopherf5b6dcd2012-11-12 22:22:20 +0000204 else
Eric Christopher4daaed12012-12-10 19:51:21 +0000205 HasSplitDwarf = SplitDwarf == Enable ? true : false;
Eric Christopherf5b6dcd2012-11-12 22:22:20 +0000206
Dan Gohman03c3dc72010-06-18 15:56:31 +0000207 {
208 NamedRegionTimer T(DbgTimerName, DWARFGroupName, TimePassesIsEnabled);
Eric Christopherc4639d62012-11-19 22:42:15 +0000209 beginModule();
Torok Edwin9c421072010-04-07 10:44:46 +0000210 }
Bill Wendling0310d762009-05-15 09:23:25 +0000211}
212DwarfDebug::~DwarfDebug() {
Bill Wendling0310d762009-05-15 09:23:25 +0000213}
214
Eric Christopherb6dc8652012-11-27 22:43:45 +0000215// Switch to the specified MCSection and emit an assembler
216// temporary label to it if SymbolStem is specified.
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000217static MCSymbol *emitSectionSym(AsmPrinter *Asm, const MCSection *Section,
Eric Christopherd8a87522011-11-07 09:18:38 +0000218 const char *SymbolStem = 0) {
219 Asm->OutStreamer.SwitchSection(Section);
220 if (!SymbolStem) return 0;
221
222 MCSymbol *TmpSym = Asm->GetTempSymbol(SymbolStem);
223 Asm->OutStreamer.EmitLabel(TmpSym);
224 return TmpSym;
225}
226
Eric Christopher2e5d8702012-12-20 21:58:36 +0000227MCSymbol *DwarfUnits::getStringPoolSym() {
Eric Christopher64f824c2012-12-27 02:14:01 +0000228 return Asm->GetTempSymbol(StringPref);
Nick Lewycky390c40d2011-10-27 06:44:11 +0000229}
230
Eric Christopher2e5d8702012-12-20 21:58:36 +0000231MCSymbol *DwarfUnits::getStringPoolEntry(StringRef Str) {
232 std::pair<MCSymbol*, unsigned> &Entry =
Eric Christopherb6714222013-01-08 22:22:06 +0000233 StringPool.GetOrCreateValue(Str).getValue();
Chris Lattnerbc733f52010-03-13 02:17:42 +0000234 if (Entry.first) return Entry.first;
235
236 Entry.second = NextStringPoolNumber++;
Eric Christopher64f824c2012-12-27 02:14:01 +0000237 return Entry.first = Asm->GetTempSymbol(StringPref, Entry.second);
Chris Lattnerbc733f52010-03-13 02:17:42 +0000238}
239
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000240unsigned DwarfUnits::getStringPoolIndex(StringRef Str) {
241 std::pair<MCSymbol*, unsigned> &Entry =
Eric Christopherb6714222013-01-08 22:22:06 +0000242 StringPool.GetOrCreateValue(Str).getValue();
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000243 if (Entry.first) return Entry.second;
244
245 Entry.second = NextStringPoolNumber++;
246 Entry.first = Asm->GetTempSymbol(StringPref, Entry.second);
247 return Entry.second;
248}
249
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000250unsigned DwarfUnits::getAddrPoolIndex(MCSymbol *Sym) {
251 std::pair<MCSymbol*, unsigned> &Entry = AddressPool[Sym];
252 if (Entry.first) return Entry.second;
253
254 Entry.second = NextAddrPoolNumber++;
255 Entry.first = Sym;
256 return Entry.second;
257}
258
Eric Christopherb6dc8652012-11-27 22:43:45 +0000259// Define a unique number for the abbreviation.
260//
Eric Christopher0e3e9b72012-12-10 23:34:43 +0000261void DwarfUnits::assignAbbrevNumber(DIEAbbrev &Abbrev) {
Bill Wendling0310d762009-05-15 09:23:25 +0000262 // Profile the node so that we can make it unique.
263 FoldingSetNodeID ID;
264 Abbrev.Profile(ID);
265
266 // Check the set for priors.
Eric Christopher0e3e9b72012-12-10 23:34:43 +0000267 DIEAbbrev *InSet = AbbreviationsSet->GetOrInsertNode(&Abbrev);
Bill Wendling0310d762009-05-15 09:23:25 +0000268
269 // If it's newly added.
270 if (InSet == &Abbrev) {
271 // Add to abbreviation list.
Eric Christopher0e3e9b72012-12-10 23:34:43 +0000272 Abbreviations->push_back(&Abbrev);
Bill Wendling0310d762009-05-15 09:23:25 +0000273
274 // Assign the vector position + 1 as its number.
Eric Christopher0e3e9b72012-12-10 23:34:43 +0000275 Abbrev.setNumber(Abbreviations->size());
Bill Wendling0310d762009-05-15 09:23:25 +0000276 } else {
277 // Assign existing abbreviation number.
278 Abbrev.setNumber(InSet->getNumber());
279 }
280}
281
Eric Christopherb6dc8652012-11-27 22:43:45 +0000282// If special LLVM prefix that is used to inform the asm
283// printer to not emit usual symbol prefix before the symbol name is used then
284// return linkage name after skipping this special LLVM prefix.
Devang Patel351ca332010-01-05 01:46:14 +0000285static StringRef getRealLinkageName(StringRef LinkageName) {
286 char One = '\1';
287 if (LinkageName.startswith(StringRef(&One, 1)))
288 return LinkageName.substr(1);
289 return LinkageName;
290}
291
Eric Christopher0ffe2b42011-11-10 19:25:34 +0000292static bool isObjCClass(StringRef Name) {
293 return Name.startswith("+") || Name.startswith("-");
294}
295
296static bool hasObjCCategory(StringRef Name) {
297 if (!isObjCClass(Name)) return false;
298
299 size_t pos = Name.find(')');
300 if (pos != std::string::npos) {
301 if (Name[pos+1] != ' ') return false;
302 return true;
303 }
304 return false;
305}
306
307static void getObjCClassCategory(StringRef In, StringRef &Class,
308 StringRef &Category) {
309 if (!hasObjCCategory(In)) {
310 Class = In.slice(In.find('[') + 1, In.find(' '));
311 Category = "";
312 return;
313 }
314
315 Class = In.slice(In.find('[') + 1, In.find('('));
316 Category = In.slice(In.find('[') + 1, In.find(' '));
317 return;
318}
319
320static StringRef getObjCMethodName(StringRef In) {
321 return In.slice(In.find(' ') + 1, In.find(']'));
322}
323
324// Add the various names to the Dwarf accelerator table names.
325static void addSubprogramNames(CompileUnit *TheCU, DISubprogram SP,
326 DIE* Die) {
327 if (!SP.isDefinition()) return;
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000328
Eric Christopher0ffe2b42011-11-10 19:25:34 +0000329 TheCU->addAccelName(SP.getName(), Die);
330
331 // If the linkage name is different than the name, go ahead and output
332 // that as well into the name table.
333 if (SP.getLinkageName() != "" && SP.getName() != SP.getLinkageName())
334 TheCU->addAccelName(SP.getLinkageName(), Die);
335
336 // If this is an Objective-C selector name add it to the ObjC accelerator
337 // too.
338 if (isObjCClass(SP.getName())) {
339 StringRef Class, Category;
340 getObjCClassCategory(SP.getName(), Class, Category);
341 TheCU->addAccelObjC(Class, Die);
342 if (Category != "")
343 TheCU->addAccelObjC(Category, Die);
344 // Also add the base method name to the name table.
345 TheCU->addAccelName(getObjCMethodName(SP.getName()), Die);
346 }
347}
348
Eric Christopherb6dc8652012-11-27 22:43:45 +0000349// Find DIE for the given subprogram and attach appropriate DW_AT_low_pc
350// and DW_AT_high_pc attributes. If there are global variables in this
351// scope then create and insert DIEs for these variables.
Devang Pateld3024342011-08-15 22:24:32 +0000352DIE *DwarfDebug::updateSubprogramScopeDIE(CompileUnit *SPCU,
353 const MDNode *SPNode) {
Devang Patel163a9f72010-05-10 22:49:55 +0000354 DIE *SPDie = SPCU->getDIE(SPNode);
Devang Patel8aa61472010-07-07 22:20:57 +0000355
Chris Lattnerd38fee82010-04-05 00:13:49 +0000356 assert(SPDie && "Unable to find subprogram DIE!");
357 DISubprogram SP(SPNode);
Jim Grosbach1e20b962010-07-21 21:21:52 +0000358
Bill Wendling168c1902012-11-07 05:19:04 +0000359 // If we're updating an abstract DIE, then we will be adding the children and
360 // object pointer later on. But what we don't want to do is process the
361 // concrete DIE twice.
Manman Renbc3e96f2013-03-12 18:27:15 +0000362 DIE *AbsSPDIE = AbstractSPDies.lookup(SPNode);
363 if (AbsSPDIE) {
364 bool InSameCU = (AbsSPDIE->getCompileUnit() == SPCU->getCUDie());
Bill Wendling168c1902012-11-07 05:19:04 +0000365 // Pick up abstract subprogram DIE.
Devang Patel8aa61472010-07-07 22:20:57 +0000366 SPDie = new DIE(dwarf::DW_TAG_subprogram);
Manman Renbc3e96f2013-03-12 18:27:15 +0000367 // If AbsSPDIE belongs to a different CU, use DW_FORM_ref_addr instead of
368 // DW_FORM_ref4.
Devang Patel3cbee302011-04-12 22:53:02 +0000369 SPCU->addDIEEntry(SPDie, dwarf::DW_AT_abstract_origin,
Manman Renbc3e96f2013-03-12 18:27:15 +0000370 InSameCU ? dwarf::DW_FORM_ref4 : dwarf::DW_FORM_ref_addr,
371 AbsSPDIE);
Devang Patel8aa61472010-07-07 22:20:57 +0000372 SPCU->addDie(SPDie);
Bill Wendlinga4c76932012-11-07 04:42:18 +0000373 } else {
374 DISubprogram SPDecl = SP.getFunctionDeclaration();
375 if (!SPDecl.isSubprogram()) {
376 // There is not any need to generate specification DIE for a function
377 // defined at compile unit level. If a function is defined inside another
378 // function then gdb prefers the definition at top level and but does not
379 // expect specification DIE in parent function. So avoid creating
380 // specification DIE for a function defined inside a function.
381 if (SP.isDefinition() && !SP.getContext().isCompileUnit() &&
382 !SP.getContext().isFile() &&
383 !isSubprogramContext(SP.getContext())) {
384 SPCU->addFlag(SPDie, dwarf::DW_AT_declaration);
385
386 // Add arguments.
387 DICompositeType SPTy = SP.getType();
388 DIArray Args = SPTy.getTypeArray();
389 unsigned SPTag = SPTy.getTag();
390 if (SPTag == dwarf::DW_TAG_subroutine_type)
391 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
392 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
393 DIType ATy = DIType(Args.getElement(i));
394 SPCU->addType(Arg, ATy);
395 if (ATy.isArtificial())
396 SPCU->addFlag(Arg, dwarf::DW_AT_artificial);
397 if (ATy.isObjectPointer())
398 SPCU->addDIEEntry(SPDie, dwarf::DW_AT_object_pointer,
399 dwarf::DW_FORM_ref4, Arg);
400 SPDie->addChild(Arg);
401 }
402 DIE *SPDeclDie = SPDie;
403 SPDie = new DIE(dwarf::DW_TAG_subprogram);
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000404 SPCU->addDIEEntry(SPDie, dwarf::DW_AT_specification,
405 dwarf::DW_FORM_ref4, SPDeclDie);
Bill Wendlinga4c76932012-11-07 04:42:18 +0000406 SPCU->addDie(SPDie);
407 }
408 }
Devang Patel8aa61472010-07-07 22:20:57 +0000409 }
410
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000411 SPCU->addLabelAddress(SPDie, dwarf::DW_AT_low_pc,
412 Asm->GetTempSymbol("func_begin",
413 Asm->getFunctionNumber()));
414 SPCU->addLabelAddress(SPDie, dwarf::DW_AT_high_pc,
415 Asm->GetTempSymbol("func_end",
416 Asm->getFunctionNumber()));
Chris Lattnerd38fee82010-04-05 00:13:49 +0000417 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
418 MachineLocation Location(RI->getFrameRegister(*Asm->MF));
Devang Patel3cbee302011-04-12 22:53:02 +0000419 SPCU->addAddress(SPDie, dwarf::DW_AT_frame_base, Location);
Devang Patelb4645642010-02-06 01:02:37 +0000420
Eric Christopher0ffe2b42011-11-10 19:25:34 +0000421 // Add name to the name table, we do this here because we're guaranteed
422 // to have concrete versions of our DW_TAG_subprogram nodes.
423 addSubprogramNames(SPCU, SP, SPDie);
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000424
Chris Lattnerd38fee82010-04-05 00:13:49 +0000425 return SPDie;
Devang Patel53bb5c92009-11-10 23:06:00 +0000426}
427
Eric Christopherb6dc8652012-11-27 22:43:45 +0000428// Construct new DW_TAG_lexical_block for this scope and attach
429// DW_AT_low_pc/DW_AT_high_pc labels.
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000430DIE *DwarfDebug::constructLexicalScopeDIE(CompileUnit *TheCU,
Devang Pateld3024342011-08-15 22:24:32 +0000431 LexicalScope *Scope) {
Devang Pateleac9c072010-04-27 19:46:33 +0000432 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_lexical_block);
433 if (Scope->isAbstractScope())
434 return ScopeDIE;
435
Devang Patelbf47fdb2011-08-10 20:55:27 +0000436 const SmallVector<InsnRange, 4> &Ranges = Scope->getRanges();
Devang Pateleac9c072010-04-27 19:46:33 +0000437 if (Ranges.empty())
438 return 0;
439
Devang Patelbf47fdb2011-08-10 20:55:27 +0000440 SmallVector<InsnRange, 4>::const_iterator RI = Ranges.begin();
Devang Pateleac9c072010-04-27 19:46:33 +0000441 if (Ranges.size() > 1) {
442 // .debug_range section has not been laid out yet. Emit offset in
Jim Grosbach1e20b962010-07-21 21:21:52 +0000443 // .debug_range as a uint, size 4, for now. emitDIE will handle
Devang Pateleac9c072010-04-27 19:46:33 +0000444 // DW_AT_ranges appropriately.
Devang Patel3cbee302011-04-12 22:53:02 +0000445 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_ranges, dwarf::DW_FORM_data4,
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000446 DebugRangeSymbols.size()
Chandler Carruth426c2bf2012-11-01 09:14:31 +0000447 * Asm->getDataLayout().getPointerSize());
Devang Patelbf47fdb2011-08-10 20:55:27 +0000448 for (SmallVector<InsnRange, 4>::const_iterator RI = Ranges.begin(),
Devang Pateleac9c072010-04-27 19:46:33 +0000449 RE = Ranges.end(); RI != RE; ++RI) {
Devang Patelc3f5f782010-05-25 23:40:22 +0000450 DebugRangeSymbols.push_back(getLabelBeforeInsn(RI->first));
451 DebugRangeSymbols.push_back(getLabelAfterInsn(RI->second));
Devang Pateleac9c072010-04-27 19:46:33 +0000452 }
453 DebugRangeSymbols.push_back(NULL);
454 DebugRangeSymbols.push_back(NULL);
455 return ScopeDIE;
456 }
457
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000458 MCSymbol *Start = getLabelBeforeInsn(RI->first);
459 MCSymbol *End = getLabelAfterInsn(RI->second);
Devang Pateleac9c072010-04-27 19:46:33 +0000460
Devang Patelc3f5f782010-05-25 23:40:22 +0000461 if (End == 0) return 0;
Devang Patel53bb5c92009-11-10 23:06:00 +0000462
Chris Lattnerb7db7332010-03-09 01:58:53 +0000463 assert(Start->isDefined() && "Invalid starting label for an inlined scope!");
464 assert(End->isDefined() && "Invalid end label for an inlined scope!");
Jim Grosbach1e20b962010-07-21 21:21:52 +0000465
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000466 TheCU->addLabelAddress(ScopeDIE, dwarf::DW_AT_low_pc, Start);
467 TheCU->addLabelAddress(ScopeDIE, dwarf::DW_AT_high_pc, End);
Devang Patel53bb5c92009-11-10 23:06:00 +0000468
469 return ScopeDIE;
470}
471
Eric Christopherb6dc8652012-11-27 22:43:45 +0000472// This scope represents inlined body of a function. Construct DIE to
473// represent this concrete inlined copy of the function.
Devang Pateld3024342011-08-15 22:24:32 +0000474DIE *DwarfDebug::constructInlinedScopeDIE(CompileUnit *TheCU,
475 LexicalScope *Scope) {
Devang Patelbf47fdb2011-08-10 20:55:27 +0000476 const SmallVector<InsnRange, 4> &Ranges = Scope->getRanges();
Nick Lewycky746cb672011-10-26 22:55:33 +0000477 assert(Ranges.empty() == false &&
478 "LexicalScope does not have instruction markers!");
Devang Pateleac9c072010-04-27 19:46:33 +0000479
Devang Patel26a92002011-07-27 00:34:13 +0000480 if (!Scope->getScopeNode())
481 return NULL;
482 DIScope DS(Scope->getScopeNode());
483 DISubprogram InlinedSP = getDISubprogram(DS);
Devang Patel26a92002011-07-27 00:34:13 +0000484 DIE *OriginDIE = TheCU->getDIE(InlinedSP);
485 if (!OriginDIE) {
Bill Wendlinge0aae5b2012-10-30 17:51:02 +0000486 DEBUG(dbgs() << "Unable to find original DIE for an inlined subprogram.");
Devang Patel26a92002011-07-27 00:34:13 +0000487 return NULL;
488 }
489
Devang Patelbf47fdb2011-08-10 20:55:27 +0000490 SmallVector<InsnRange, 4>::const_iterator RI = Ranges.begin();
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000491 MCSymbol *StartLabel = getLabelBeforeInsn(RI->first);
492 MCSymbol *EndLabel = getLabelAfterInsn(RI->second);
Devang Pateleac9c072010-04-27 19:46:33 +0000493
Devang Patel0afbf232010-07-08 22:39:20 +0000494 if (StartLabel == 0 || EndLabel == 0) {
Bill Wendlinge0aae5b2012-10-30 17:51:02 +0000495 llvm_unreachable("Unexpected Start and End labels for an inlined scope!");
Devang Pateleac9c072010-04-27 19:46:33 +0000496 }
Chris Lattnerb7db7332010-03-09 01:58:53 +0000497 assert(StartLabel->isDefined() &&
Chris Lattnera34ec2292010-03-09 01:51:43 +0000498 "Invalid starting label for an inlined scope!");
Chris Lattnerb7db7332010-03-09 01:58:53 +0000499 assert(EndLabel->isDefined() &&
Chris Lattnera34ec2292010-03-09 01:51:43 +0000500 "Invalid end label for an inlined scope!");
Devang Pateleac9c072010-04-27 19:46:33 +0000501
Devang Pateld96efb82011-05-05 17:54:26 +0000502 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_inlined_subroutine);
Devang Patel3cbee302011-04-12 22:53:02 +0000503 TheCU->addDIEEntry(ScopeDIE, dwarf::DW_AT_abstract_origin,
504 dwarf::DW_FORM_ref4, OriginDIE);
Devang Patel53bb5c92009-11-10 23:06:00 +0000505
Devang Patel26a92002011-07-27 00:34:13 +0000506 if (Ranges.size() > 1) {
507 // .debug_range section has not been laid out yet. Emit offset in
508 // .debug_range as a uint, size 4, for now. emitDIE will handle
509 // DW_AT_ranges appropriately.
510 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_ranges, dwarf::DW_FORM_data4,
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000511 DebugRangeSymbols.size()
Chandler Carruth426c2bf2012-11-01 09:14:31 +0000512 * Asm->getDataLayout().getPointerSize());
Devang Patelbf47fdb2011-08-10 20:55:27 +0000513 for (SmallVector<InsnRange, 4>::const_iterator RI = Ranges.begin(),
Devang Patel26a92002011-07-27 00:34:13 +0000514 RE = Ranges.end(); RI != RE; ++RI) {
515 DebugRangeSymbols.push_back(getLabelBeforeInsn(RI->first));
516 DebugRangeSymbols.push_back(getLabelAfterInsn(RI->second));
517 }
518 DebugRangeSymbols.push_back(NULL);
519 DebugRangeSymbols.push_back(NULL);
520 } else {
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000521 TheCU->addLabelAddress(ScopeDIE, dwarf::DW_AT_low_pc, StartLabel);
522 TheCU->addLabelAddress(ScopeDIE, dwarf::DW_AT_high_pc, EndLabel);
Devang Patel26a92002011-07-27 00:34:13 +0000523 }
Devang Patel53bb5c92009-11-10 23:06:00 +0000524
525 InlinedSubprogramDIEs.insert(OriginDIE);
526
527 // Track the start label for this inlined function.
Devang Patel26a92002011-07-27 00:34:13 +0000528 //.debug_inlined section specification does not clearly state how
529 // to emit inlined scope that is split into multiple instruction ranges.
530 // For now, use first instruction range and emit low_pc/high_pc pair and
531 // corresponding .debug_inlined section entry for this pair.
Devang Patele9f8f5e2010-05-07 20:54:48 +0000532 DenseMap<const MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator
Devang Patel2db49d72010-05-07 18:11:54 +0000533 I = InlineInfo.find(InlinedSP);
Devang Patel53bb5c92009-11-10 23:06:00 +0000534
535 if (I == InlineInfo.end()) {
Nick Lewycky746cb672011-10-26 22:55:33 +0000536 InlineInfo[InlinedSP].push_back(std::make_pair(StartLabel, ScopeDIE));
Devang Patel2db49d72010-05-07 18:11:54 +0000537 InlinedSPNodes.push_back(InlinedSP);
Devang Patel53bb5c92009-11-10 23:06:00 +0000538 } else
Chris Lattner6ed0f902010-03-09 00:31:02 +0000539 I->second.push_back(std::make_pair(StartLabel, ScopeDIE));
Devang Patel53bb5c92009-11-10 23:06:00 +0000540
Devang Patel53bb5c92009-11-10 23:06:00 +0000541 DILocation DL(Scope->getInlinedAt());
Eric Christopher08212002012-03-26 21:38:38 +0000542 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_call_file, 0,
Manman Ren3de61b42013-03-07 01:42:00 +0000543 getOrCreateSourceID(DL.getFilename(), DL.getDirectory(),
544 TheCU->getUniqueID()));
Devang Patel3cbee302011-04-12 22:53:02 +0000545 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_call_line, 0, DL.getLineNumber());
Devang Patel53bb5c92009-11-10 23:06:00 +0000546
Eric Christopher309bedd2011-12-04 06:02:38 +0000547 // Add name to the name table, we do this here because we're guaranteed
548 // to have concrete versions of our DW_TAG_inlined_subprogram nodes.
549 addSubprogramNames(TheCU, InlinedSP, ScopeDIE);
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000550
Devang Patel53bb5c92009-11-10 23:06:00 +0000551 return ScopeDIE;
552}
553
Eric Christopherb6dc8652012-11-27 22:43:45 +0000554// Construct a DIE for this scope.
Devang Pateld0b5a5e2011-08-15 22:04:40 +0000555DIE *DwarfDebug::constructScopeDIE(CompileUnit *TheCU, LexicalScope *Scope) {
Devang Patel3c91b052010-03-08 20:52:55 +0000556 if (!Scope || !Scope->getScopeNode())
557 return NULL;
Jim Grosbach1e20b962010-07-21 21:21:52 +0000558
Manman Ren8b15d742013-01-31 20:05:14 +0000559 DIScope DS(Scope->getScopeNode());
560 // Early return to avoid creating dangling variable|scope DIEs.
561 if (!Scope->getInlinedAt() && DS.isSubprogram() && Scope->isAbstractScope() &&
562 !TheCU->getDIE(DS))
563 return NULL;
564
Nick Lewycky746cb672011-10-26 22:55:33 +0000565 SmallVector<DIE *, 8> Children;
Eric Christophere5212782012-09-12 23:36:19 +0000566 DIE *ObjectPointer = NULL;
Devang Patel0478c152011-03-01 22:58:55 +0000567
568 // Collect arguments for current function.
Devang Patelbf47fdb2011-08-10 20:55:27 +0000569 if (LScopes.isCurrentFunctionScope(Scope))
Devang Patel0478c152011-03-01 22:58:55 +0000570 for (unsigned i = 0, N = CurrentFnArguments.size(); i < N; ++i)
571 if (DbgVariable *ArgDV = CurrentFnArguments[i])
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000572 if (DIE *Arg =
Eric Christophere5212782012-09-12 23:36:19 +0000573 TheCU->constructVariableDIE(ArgDV, Scope->isAbstractScope())) {
Devang Patel0478c152011-03-01 22:58:55 +0000574 Children.push_back(Arg);
Eric Christophere5212782012-09-12 23:36:19 +0000575 if (ArgDV->isObjectPointer()) ObjectPointer = Arg;
576 }
Devang Patel0478c152011-03-01 22:58:55 +0000577
Eric Christopher1aeb7ac2011-10-03 15:49:16 +0000578 // Collect lexical scope children first.
Devang Patelbf47fdb2011-08-10 20:55:27 +0000579 const SmallVector<DbgVariable *, 8> &Variables = ScopeVariables.lookup(Scope);
Devang Patel5bc9fec2011-02-19 01:31:27 +0000580 for (unsigned i = 0, N = Variables.size(); i < N; ++i)
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000581 if (DIE *Variable =
Eric Christopher7b451cf2012-09-21 22:18:52 +0000582 TheCU->constructVariableDIE(Variables[i], Scope->isAbstractScope())) {
Devang Patel5bc9fec2011-02-19 01:31:27 +0000583 Children.push_back(Variable);
Eric Christopher7b451cf2012-09-21 22:18:52 +0000584 if (Variables[i]->isObjectPointer()) ObjectPointer = Variable;
585 }
Devang Patelbf47fdb2011-08-10 20:55:27 +0000586 const SmallVector<LexicalScope *, 4> &Scopes = Scope->getChildren();
Devang Patel5bc9fec2011-02-19 01:31:27 +0000587 for (unsigned j = 0, M = Scopes.size(); j < M; ++j)
Devang Pateld0b5a5e2011-08-15 22:04:40 +0000588 if (DIE *Nested = constructScopeDIE(TheCU, Scopes[j]))
Devang Patel5bc9fec2011-02-19 01:31:27 +0000589 Children.push_back(Nested);
Devang Patel3c91b052010-03-08 20:52:55 +0000590 DIE *ScopeDIE = NULL;
591 if (Scope->getInlinedAt())
Devang Pateld3024342011-08-15 22:24:32 +0000592 ScopeDIE = constructInlinedScopeDIE(TheCU, Scope);
Devang Patel3c91b052010-03-08 20:52:55 +0000593 else if (DS.isSubprogram()) {
Devang Patel0dd45582010-06-28 20:53:04 +0000594 ProcessedSPNodes.insert(DS);
Devang Patel8aa61472010-07-07 22:20:57 +0000595 if (Scope->isAbstractScope()) {
Devang Pateld3024342011-08-15 22:24:32 +0000596 ScopeDIE = TheCU->getDIE(DS);
Devang Patel8aa61472010-07-07 22:20:57 +0000597 // Note down abstract DIE.
598 if (ScopeDIE)
599 AbstractSPDies.insert(std::make_pair(DS, ScopeDIE));
600 }
Devang Patel3c91b052010-03-08 20:52:55 +0000601 else
Devang Pateld3024342011-08-15 22:24:32 +0000602 ScopeDIE = updateSubprogramScopeDIE(TheCU, DS);
Devang Patel3c91b052010-03-08 20:52:55 +0000603 }
Devang Patel5bc9fec2011-02-19 01:31:27 +0000604 else {
605 // There is no need to emit empty lexical block DIE.
David Blaikied2e0f7e2013-05-06 23:33:07 +0000606 std::pair<ImportedEntityMap::const_iterator,
607 ImportedEntityMap::const_iterator> Range = std::equal_range(
608 ScopesWithImportedEntities.begin(), ScopesWithImportedEntities.end(),
609 std::pair<const MDNode *, const MDNode *>(DS, 0), CompareFirst());
610 if (Children.empty() && Range.first == Range.second)
Devang Patel5bc9fec2011-02-19 01:31:27 +0000611 return NULL;
Devang Pateld3024342011-08-15 22:24:32 +0000612 ScopeDIE = constructLexicalScopeDIE(TheCU, Scope);
David Blaikied2e0f7e2013-05-06 23:33:07 +0000613 for (ImportedEntityMap::const_iterator i = Range.first; i != Range.second; ++i)
614 constructImportedModuleDIE(TheCU, i->second, ScopeDIE);
Devang Patel5bc9fec2011-02-19 01:31:27 +0000615 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000616
Devang Patelaead63c2010-03-29 22:59:58 +0000617 if (!ScopeDIE) return NULL;
Jim Grosbach1e20b962010-07-21 21:21:52 +0000618
Devang Patel5bc9fec2011-02-19 01:31:27 +0000619 // Add children
620 for (SmallVector<DIE *, 8>::iterator I = Children.begin(),
621 E = Children.end(); I != E; ++I)
622 ScopeDIE->addChild(*I);
Devang Patel193f7202009-11-24 01:14:22 +0000623
Eric Christophere5212782012-09-12 23:36:19 +0000624 if (DS.isSubprogram() && ObjectPointer != NULL)
625 TheCU->addDIEEntry(ScopeDIE, dwarf::DW_AT_object_pointer,
626 dwarf::DW_FORM_ref4, ObjectPointer);
627
Jim Grosbach1e20b962010-07-21 21:21:52 +0000628 if (DS.isSubprogram())
Eric Christopher0ffe2b42011-11-10 19:25:34 +0000629 TheCU->addPubTypes(DISubprogram(DS));
Jim Grosbach1e20b962010-07-21 21:21:52 +0000630
Eric Christopher0ffe2b42011-11-10 19:25:34 +0000631 return ScopeDIE;
Devang Patel53bb5c92009-11-10 23:06:00 +0000632}
633
Eric Christopherb6dc8652012-11-27 22:43:45 +0000634// Look up the source id with the given directory and source file names.
635// If none currently exists, create a new id and insert it in the
636// SourceIds map. This can update DirectoryNames and SourceFileNames maps
637// as well.
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000638unsigned DwarfDebug::getOrCreateSourceID(StringRef FileName,
Manman Ren3de61b42013-03-07 01:42:00 +0000639 StringRef DirName, unsigned CUID) {
640 // If we use .loc in assembly, we can't separate .file entries according to
641 // compile units. Thus all files will belong to the default compile unit.
642 if (Asm->TM.hasMCUseLoc() &&
643 Asm->OutStreamer.getKind() == MCStreamer::SK_AsmStreamer)
644 CUID = 0;
645
Devang Patel1905a182010-09-16 20:57:49 +0000646 // If FE did not provide a file name, then assume stdin.
647 if (FileName.empty())
Manman Ren3de61b42013-03-07 01:42:00 +0000648 return getOrCreateSourceID("<stdin>", StringRef(), CUID);
Devang Patel23670e52011-03-24 20:30:50 +0000649
Nick Lewycky6c1a7032011-11-02 20:55:33 +0000650 // TODO: this might not belong here. See if we can factor this better.
651 if (DirName == CompilationDir)
652 DirName = "";
653
Manman Ren3de61b42013-03-07 01:42:00 +0000654 // FileIDCUMap stores the current ID for the given compile unit.
655 unsigned SrcId = FileIDCUMap[CUID] + 1;
Devang Patel1905a182010-09-16 20:57:49 +0000656
Manman Ren3de61b42013-03-07 01:42:00 +0000657 // We look up the CUID/file/dir by concatenating them with a zero byte.
Benjamin Kramer74612c22012-03-11 14:56:26 +0000658 SmallString<128> NamePair;
Manman Ren5044a932013-04-06 01:02:38 +0000659 NamePair += utostr(CUID);
Manman Ren3de61b42013-03-07 01:42:00 +0000660 NamePair += '\0';
Benjamin Kramer74612c22012-03-11 14:56:26 +0000661 NamePair += DirName;
662 NamePair += '\0'; // Zero bytes are not allowed in paths.
663 NamePair += FileName;
664
665 StringMapEntry<unsigned> &Ent = SourceIdMap.GetOrCreateValue(NamePair, SrcId);
666 if (Ent.getValue() != SrcId)
667 return Ent.getValue();
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000668
Manman Ren3de61b42013-03-07 01:42:00 +0000669 FileIDCUMap[CUID] = SrcId;
Rafael Espindola5c055632010-11-18 02:04:25 +0000670 // Print out a .file directive to specify files for .loc directives.
Manman Ren3de61b42013-03-07 01:42:00 +0000671 Asm->OutStreamer.EmitDwarfFileDirective(SrcId, DirName, FileName, CUID);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000672
673 return SrcId;
674}
675
Eric Christopher72c16552012-12-20 21:58:40 +0000676// Create new CompileUnit for the given metadata node with tag
677// DW_TAG_compile_unit.
Devang Patel94c7ddb2011-08-16 22:09:43 +0000678CompileUnit *DwarfDebug::constructCompileUnit(const MDNode *N) {
Devang Patele4b27562009-08-28 23:24:31 +0000679 DICompileUnit DIUnit(N);
Devang Patel65dbc902009-11-25 17:36:49 +0000680 StringRef FN = DIUnit.getFilename();
Nick Lewycky6c1a7032011-11-02 20:55:33 +0000681 CompilationDir = DIUnit.getDirectory();
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000682
683 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
Eli Benderskyd4a05e02012-12-03 18:45:45 +0000684 CompileUnit *NewCU = new CompileUnit(GlobalCUIndexCount++,
Eric Christopher2e5d8702012-12-20 21:58:36 +0000685 DIUnit.getLanguage(), Die, Asm,
686 this, &InfoHolder);
Manman Ren3de61b42013-03-07 01:42:00 +0000687
688 FileIDCUMap[NewCU->getUniqueID()] = 0;
689 // Call this to emit a .file directive if it wasn't emitted for the source
690 // file this CU comes from yet.
691 getOrCreateSourceID(FN, CompilationDir, NewCU->getUniqueID());
692
Nick Lewycky390c40d2011-10-27 06:44:11 +0000693 NewCU->addString(Die, dwarf::DW_AT_producer, DIUnit.getProducer());
Devang Patel3cbee302011-04-12 22:53:02 +0000694 NewCU->addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data2,
695 DIUnit.getLanguage());
Nick Lewycky390c40d2011-10-27 06:44:11 +0000696 NewCU->addString(Die, dwarf::DW_AT_name, FN);
Eric Christophere0828ec2013-04-09 19:23:15 +0000697
Eric Christopher6635cad2012-08-01 18:19:01 +0000698 // 2.17.1 requires that we use DW_AT_low_pc for a single entry point
Eric Christophere0828ec2013-04-09 19:23:15 +0000699 // into an entity. We're using 0 (or a NULL label) for this. For
700 // split dwarf it's in the skeleton CU so omit it here.
701 if (!useSplitDwarf())
702 NewCU->addLabelAddress(Die, dwarf::DW_AT_low_pc, NULL);
Manman Ren43213cf2013-02-05 21:52:47 +0000703
704 // Define start line table label for each Compile Unit.
705 MCSymbol *LineTableStartSym = Asm->GetTempSymbol("line_table_start",
706 NewCU->getUniqueID());
707 Asm->OutStreamer.getContext().setMCLineTableSymbol(LineTableStartSym,
708 NewCU->getUniqueID());
709
Devang Patel4a602ca2010-03-22 23:11:36 +0000710 // DW_AT_stmt_list is a offset of line number information for this
Eric Christophere0828ec2013-04-09 19:23:15 +0000711 // compile unit in debug_line section. For split dwarf this is
712 // left in the skeleton CU and so not included.
Manman Renf2d89ff2013-02-09 00:41:44 +0000713 // The line table entries are not always emitted in assembly, so it
714 // is not okay to use line_table_start here.
Eric Christophere0828ec2013-04-09 19:23:15 +0000715 if (!useSplitDwarf()) {
716 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
717 NewCU->addLabel(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4,
718 NewCU->getUniqueID() == 0 ?
719 Asm->GetTempSymbol("section_line") : LineTableStartSym);
720 else if (NewCU->getUniqueID() == 0)
721 NewCU->addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4, 0);
722 else
723 NewCU->addDelta(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4,
724 LineTableStartSym, DwarfLineSectionSym);
725 }
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000726
Eric Christophere0828ec2013-04-09 19:23:15 +0000727 // If we're using split dwarf the compilation dir is going to be in the
728 // skeleton CU and so we don't need to duplicate it here.
729 if (!useSplitDwarf() && !CompilationDir.empty())
Nick Lewycky6c1a7032011-11-02 20:55:33 +0000730 NewCU->addString(Die, dwarf::DW_AT_comp_dir, CompilationDir);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000731 if (DIUnit.isOptimized())
Eric Christopher873cf0a2012-08-24 01:14:27 +0000732 NewCU->addFlag(Die, dwarf::DW_AT_APPLE_optimized);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000733
Devang Patel65dbc902009-11-25 17:36:49 +0000734 StringRef Flags = DIUnit.getFlags();
735 if (!Flags.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +0000736 NewCU->addString(Die, dwarf::DW_AT_APPLE_flags, Flags);
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000737
Nick Lewyckyd5d52132011-10-17 23:27:36 +0000738 if (unsigned RVer = DIUnit.getRunTimeVersion())
Devang Patel3cbee302011-04-12 22:53:02 +0000739 NewCU->addUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers,
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000740 dwarf::DW_FORM_data1, RVer);
741
Devang Patel163a9f72010-05-10 22:49:55 +0000742 if (!FirstCU)
743 FirstCU = NewCU;
Eric Christopher208cc6f2013-02-05 07:31:55 +0000744
Eric Christopher0e3e9b72012-12-10 23:34:43 +0000745 InfoHolder.addUnit(NewCU);
746
Devang Patel163a9f72010-05-10 22:49:55 +0000747 CUMap.insert(std::make_pair(N, NewCU));
Devang Patel94c7ddb2011-08-16 22:09:43 +0000748 return NewCU;
Devang Patel163a9f72010-05-10 22:49:55 +0000749}
750
Eric Christopherb6dc8652012-11-27 22:43:45 +0000751// Construct subprogram DIE.
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000752void DwarfDebug::constructSubprogramDIE(CompileUnit *TheCU,
Devang Patel3655a212011-08-15 23:36:40 +0000753 const MDNode *N) {
Rafael Espindolab0527282011-11-04 19:00:29 +0000754 CompileUnit *&CURef = SPMap[N];
755 if (CURef)
756 return;
757 CURef = TheCU;
758
Devang Patele4b27562009-08-28 23:24:31 +0000759 DISubprogram SP(N);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000760 if (!SP.isDefinition())
761 // This is a method declaration which will be handled while constructing
762 // class type.
Devang Patel13e16b62009-06-26 01:49:18 +0000763 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000764
Devang Pateldbc64af2011-08-15 17:24:54 +0000765 DIE *SubprogramDie = TheCU->getOrCreateSubprogramDIE(SP);
Stuart Hastings639336e2010-04-06 21:38:29 +0000766
767 // Add to map.
Devang Patel163a9f72010-05-10 22:49:55 +0000768 TheCU->insertDIE(N, SubprogramDie);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000769
770 // Add to context owner.
Devang Patel3cbee302011-04-12 22:53:02 +0000771 TheCU->addToContextOwner(SubprogramDie, SP.getContext());
Devang Patel0000fad2009-12-08 23:21:45 +0000772
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +0000773 // Expose as global, if requested.
774 if (GenerateDwarfPubNamesSection)
775 TheCU->addGlobalName(SP.getName(), SubprogramDie);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000776}
777
David Blaikiec462db62013-04-22 06:12:31 +0000778void DwarfDebug::constructImportedModuleDIE(CompileUnit *TheCU,
779 const MDNode *N) {
780 DIImportedModule Module(N);
781 if (!Module.Verify())
782 return;
David Blaikied2e0f7e2013-05-06 23:33:07 +0000783 if (DIE *D = TheCU->getOrCreateContextDIE(Module.getContext()))
784 constructImportedModuleDIE(TheCU, Module, D);
785}
786
787void DwarfDebug::constructImportedModuleDIE(CompileUnit *TheCU, const MDNode *N,
788 DIE *Context) {
789 DIImportedModule Module(N);
790 if (!Module.Verify())
791 return;
792 return constructImportedModuleDIE(TheCU, Module, Context);
793}
794
795void DwarfDebug::constructImportedModuleDIE(CompileUnit *TheCU,
796 const DIImportedModule &Module,
797 DIE *Context) {
798 assert(Module.Verify() &&
799 "Use one of the MDNode * overloads to handle invalid metadata");
800 assert(Context && "Should always have a context for an imported_module");
David Blaikiec462db62013-04-22 06:12:31 +0000801 DIE *IMDie = new DIE(dwarf::DW_TAG_imported_module);
802 TheCU->insertDIE(Module, IMDie);
803 DIE *NSDie = TheCU->getOrCreateNameSpace(Module.getNameSpace());
804 unsigned FileID = getOrCreateSourceID(Module.getContext().getFilename(),
805 Module.getContext().getDirectory(),
806 TheCU->getUniqueID());
807 TheCU->addUInt(IMDie, dwarf::DW_AT_decl_file, 0, FileID);
808 TheCU->addUInt(IMDie, dwarf::DW_AT_decl_line, 0, Module.getLineNumber());
809 TheCU->addDIEEntry(IMDie, dwarf::DW_AT_import, dwarf::DW_FORM_ref4, NSDie);
David Blaikied2e0f7e2013-05-06 23:33:07 +0000810 Context->addChild(IMDie);
David Blaikiec462db62013-04-22 06:12:31 +0000811}
812
Eric Christopherb6dc8652012-11-27 22:43:45 +0000813// Emit all Dwarf sections that should come prior to the content. Create
814// global DIEs and emit initial debug info sections. This is invoked by
815// the target AsmPrinter.
Eric Christopherc4639d62012-11-19 22:42:15 +0000816void DwarfDebug::beginModule() {
Devang Pateleac9c072010-04-27 19:46:33 +0000817 if (DisableDebugInfoPrinting)
818 return;
819
Eric Christopherc4639d62012-11-19 22:42:15 +0000820 const Module *M = MMI->getModule();
821
Nick Lewycky3bbb6f72011-07-29 03:49:23 +0000822 // If module has named metadata anchors then use them, otherwise scan the
823 // module using debug info finder to collect debug info.
Devang Patel30692ab2011-05-03 16:45:22 +0000824 NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu");
David Blaikiec0ec8a42013-03-11 23:39:23 +0000825 if (!CU_Nodes)
Devang Patel02e603f2011-08-15 23:47:24 +0000826 return;
Devang Patel30692ab2011-05-03 16:45:22 +0000827
David Blaikiec0ec8a42013-03-11 23:39:23 +0000828 // Emit initial sections so we can reference labels later.
829 emitSectionLabels();
830
831 for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i) {
832 DICompileUnit CUNode(CU_Nodes->getOperand(i));
833 CompileUnit *CU = constructCompileUnit(CUNode);
David Blaikied2e0f7e2013-05-06 23:33:07 +0000834 DIArray ImportedModules = CUNode.getImportedModules();
835 for (unsigned i = 0, e = ImportedModules.getNumElements(); i != e; ++i)
836 ScopesWithImportedEntities.push_back(std::make_pair(
837 DIImportedModule(ImportedModules.getElement(i)).getContext(),
838 ImportedModules.getElement(i)));
839 std::sort(ScopesWithImportedEntities.begin(),
840 ScopesWithImportedEntities.end(), CompareFirst());
David Blaikiec0ec8a42013-03-11 23:39:23 +0000841 DIArray GVs = CUNode.getGlobalVariables();
842 for (unsigned i = 0, e = GVs.getNumElements(); i != e; ++i)
843 CU->createGlobalVariableDIE(GVs.getElement(i));
844 DIArray SPs = CUNode.getSubprograms();
845 for (unsigned i = 0, e = SPs.getNumElements(); i != e; ++i)
846 constructSubprogramDIE(CU, SPs.getElement(i));
847 DIArray EnumTypes = CUNode.getEnumTypes();
848 for (unsigned i = 0, e = EnumTypes.getNumElements(); i != e; ++i)
849 CU->getOrCreateTypeDIE(EnumTypes.getElement(i));
850 DIArray RetainedTypes = CUNode.getRetainedTypes();
851 for (unsigned i = 0, e = RetainedTypes.getNumElements(); i != e; ++i)
852 CU->getOrCreateTypeDIE(RetainedTypes.getElement(i));
David Blaikiec462db62013-04-22 06:12:31 +0000853 // Emit imported_modules last so that the relevant context is already
854 // available.
David Blaikiec462db62013-04-22 06:12:31 +0000855 for (unsigned i = 0, e = ImportedModules.getNumElements(); i != e; ++i)
856 constructImportedModuleDIE(CU, ImportedModules.getElement(i));
Eric Christopherc126c322013-03-29 20:23:02 +0000857 // If we're splitting the dwarf out now that we've got the entire
858 // CU then construct a skeleton CU based upon it.
859 if (useSplitDwarf()) {
Eric Christopher13367122013-04-24 12:56:18 +0000860 // This should be a unique identifier when we want to build .dwp files.
Eric Christopher1b0cd2f2013-04-22 07:51:08 +0000861 CU->addUInt(CU->getCUDie(), dwarf::DW_AT_GNU_dwo_id,
862 dwarf::DW_FORM_data8, 0);
Eric Christopherc126c322013-03-29 20:23:02 +0000863 // Now construct the skeleton CU associated.
864 constructSkeletonCU(CUNode);
865 }
David Blaikiec0ec8a42013-03-11 23:39:23 +0000866 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000867
Chris Lattnerd850ac72010-04-05 02:19:28 +0000868 // Tell MMI that we have debug info.
869 MMI->setDebugInfoAvailability(true);
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000870
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000871 // Prime section data.
Chris Lattnerf0144122009-07-28 03:13:23 +0000872 SectionMap.insert(Asm->getObjFileLowering().getTextSection());
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000873}
874
Eric Christopher4117bec2012-11-22 00:59:49 +0000875// Attach DW_AT_inline attribute with inlined subprogram DIEs.
876void DwarfDebug::computeInlinedDIEs() {
Devang Patel53bb5c92009-11-10 23:06:00 +0000877 // Attach DW_AT_inline attribute with inlined subprogram DIEs.
878 for (SmallPtrSet<DIE *, 4>::iterator AI = InlinedSubprogramDIEs.begin(),
Eric Christopherbdab8002012-11-27 00:13:51 +0000879 AE = InlinedSubprogramDIEs.end(); AI != AE; ++AI) {
Devang Patel53bb5c92009-11-10 23:06:00 +0000880 DIE *ISP = *AI;
Devang Patel3cbee302011-04-12 22:53:02 +0000881 FirstCU->addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
Devang Patel53bb5c92009-11-10 23:06:00 +0000882 }
Rafael Espindolad1ac3a42011-11-12 01:57:54 +0000883 for (DenseMap<const MDNode *, DIE *>::iterator AI = AbstractSPDies.begin(),
Eric Christopherbdab8002012-11-27 00:13:51 +0000884 AE = AbstractSPDies.end(); AI != AE; ++AI) {
Rafael Espindolad1ac3a42011-11-12 01:57:54 +0000885 DIE *ISP = AI->second;
886 if (InlinedSubprogramDIEs.count(ISP))
887 continue;
888 FirstCU->addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
889 }
Eric Christopher4117bec2012-11-22 00:59:49 +0000890}
891
892// Collect info for variables that were optimized out.
893void DwarfDebug::collectDeadVariables() {
894 const Module *M = MMI->getModule();
895 DenseMap<const MDNode *, LexicalScope *> DeadFnScopeMap;
896
897 if (NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu")) {
898 for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i) {
899 DICompileUnit TheCU(CU_Nodes->getOperand(i));
900 DIArray Subprograms = TheCU.getSubprograms();
901 for (unsigned i = 0, e = Subprograms.getNumElements(); i != e; ++i) {
Eric Christopherbdab8002012-11-27 00:13:51 +0000902 DISubprogram SP(Subprograms.getElement(i));
903 if (ProcessedSPNodes.count(SP) != 0) continue;
904 if (!SP.Verify()) continue;
905 if (!SP.isDefinition()) continue;
906 DIArray Variables = SP.getVariables();
907 if (Variables.getNumElements() == 0) continue;
Eric Christopher4117bec2012-11-22 00:59:49 +0000908
Eric Christopherbdab8002012-11-27 00:13:51 +0000909 LexicalScope *Scope =
910 new LexicalScope(NULL, DIDescriptor(SP), NULL, false);
911 DeadFnScopeMap[SP] = Scope;
Eric Christopher4117bec2012-11-22 00:59:49 +0000912
Eric Christopherbdab8002012-11-27 00:13:51 +0000913 // Construct subprogram DIE and add variables DIEs.
914 CompileUnit *SPCU = CUMap.lookup(TheCU);
915 assert(SPCU && "Unable to find Compile Unit!");
916 constructSubprogramDIE(SPCU, SP);
917 DIE *ScopeDIE = SPCU->getDIE(SP);
918 for (unsigned vi = 0, ve = Variables.getNumElements(); vi != ve; ++vi) {
919 DIVariable DV(Variables.getElement(vi));
920 if (!DV.Verify()) continue;
921 DbgVariable *NewVar = new DbgVariable(DV, NULL);
922 if (DIE *VariableDIE =
923 SPCU->constructVariableDIE(NewVar, Scope->isAbstractScope()))
924 ScopeDIE->addChild(VariableDIE);
925 }
Eric Christopher4117bec2012-11-22 00:59:49 +0000926 }
927 }
928 }
929 DeleteContainerSeconds(DeadFnScopeMap);
930}
931
932void DwarfDebug::finalizeModuleInfo() {
933 // Collect info for variables that were optimized out.
934 collectDeadVariables();
935
936 // Attach DW_AT_inline attribute with inlined subprogram DIEs.
937 computeInlinedDIEs();
Devang Patel53bb5c92009-11-10 23:06:00 +0000938
Eric Christopher6635cad2012-08-01 18:19:01 +0000939 // Emit DW_AT_containing_type attribute to connect types with their
940 // vtable holding type.
Devang Pateldbc64af2011-08-15 17:24:54 +0000941 for (DenseMap<const MDNode *, CompileUnit *>::iterator CUI = CUMap.begin(),
Eric Christopherbdab8002012-11-27 00:13:51 +0000942 CUE = CUMap.end(); CUI != CUE; ++CUI) {
Devang Pateldbc64af2011-08-15 17:24:54 +0000943 CompileUnit *TheCU = CUI->second;
944 TheCU->constructContainingTypeDIEs();
Devang Patel5d11eb02009-12-03 19:11:07 +0000945 }
946
Eric Christopher4117bec2012-11-22 00:59:49 +0000947 // Compute DIE offsets and sizes.
Eric Christopher0e3e9b72012-12-10 23:34:43 +0000948 InfoHolder.computeSizeAndOffsets();
949 if (useSplitDwarf())
950 SkeletonHolder.computeSizeAndOffsets();
Eric Christopher4117bec2012-11-22 00:59:49 +0000951}
952
953void DwarfDebug::endSections() {
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000954 // Standard sections final addresses.
Chris Lattner6c2f9e12009-08-19 05:49:37 +0000955 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getTextSection());
Chris Lattnerc0215722010-04-04 19:25:43 +0000956 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("text_end"));
Chris Lattner6c2f9e12009-08-19 05:49:37 +0000957 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getDataSection());
Chris Lattnerc0215722010-04-04 19:25:43 +0000958 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("data_end"));
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000959
960 // End text sections.
Benjamin Kramerb4c9d9c2012-10-31 13:45:49 +0000961 for (unsigned I = 0, E = SectionMap.size(); I != E; ++I) {
962 Asm->OutStreamer.SwitchSection(SectionMap[I]);
963 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("section_end", I+1));
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000964 }
Eric Christopher4117bec2012-11-22 00:59:49 +0000965}
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000966
Eric Christopherb6dc8652012-11-27 22:43:45 +0000967// Emit all Dwarf sections that should come after the content.
Eric Christopher4117bec2012-11-22 00:59:49 +0000968void DwarfDebug::endModule() {
969
970 if (!FirstCU) return;
971
972 // End any existing sections.
973 // TODO: Does this need to happen?
974 endSections();
975
976 // Finalize the debug info for the module.
977 finalizeModuleInfo();
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000978
Eric Christopher4daaed12012-12-10 19:51:21 +0000979 if (!useSplitDwarf()) {
Eric Christopher42885022012-11-27 22:43:42 +0000980 // Emit all the DIEs into a debug info section.
981 emitDebugInfo();
Eric Christopher74802f72012-11-27 00:41:54 +0000982
Eric Christopher42885022012-11-27 22:43:42 +0000983 // Corresponding abbreviations into a abbrev section.
984 emitAbbreviations();
985
986 // Emit info into a debug loc section.
987 emitDebugLoc();
988
989 // Emit info into a debug aranges section.
990 emitDebugARanges();
991
992 // Emit info into a debug ranges section.
993 emitDebugRanges();
994
995 // Emit info into a debug macinfo section.
996 emitDebugMacInfo();
997
998 // Emit inline info.
999 // TODO: When we don't need the option anymore we
1000 // can remove all of the code that this section
1001 // depends upon.
1002 if (useDarwinGDBCompat())
1003 emitDebugInlineInfo();
1004 } else {
Eric Christopher0b944ee2012-12-11 19:42:09 +00001005 // TODO: Fill this in for separated debug sections and separate
Eric Christopher42885022012-11-27 22:43:42 +00001006 // out information into new sections.
1007
Eric Christopher98e237f2012-11-30 23:59:06 +00001008 // Emit the debug info section and compile units.
Eric Christopher42885022012-11-27 22:43:42 +00001009 emitDebugInfo();
Eric Christopher98e237f2012-11-30 23:59:06 +00001010 emitDebugInfoDWO();
Eric Christopher42885022012-11-27 22:43:42 +00001011
1012 // Corresponding abbreviations into a abbrev section.
1013 emitAbbreviations();
Eric Christopher6eebe472012-12-19 22:02:53 +00001014 emitDebugAbbrevDWO();
Eric Christopher42885022012-11-27 22:43:42 +00001015
1016 // Emit info into a debug loc section.
1017 emitDebugLoc();
1018
1019 // Emit info into a debug aranges section.
1020 emitDebugARanges();
1021
1022 // Emit info into a debug ranges section.
1023 emitDebugRanges();
1024
1025 // Emit info into a debug macinfo section.
1026 emitDebugMacInfo();
1027
Eric Christopher72f7bfb2013-01-15 23:56:56 +00001028 // Emit DWO addresses.
1029 InfoHolder.emitAddresses(Asm->getObjFileLowering().getDwarfAddrSection());
1030
Eric Christopher42885022012-11-27 22:43:42 +00001031 // Emit inline info.
1032 // TODO: When we don't need the option anymore we
1033 // can remove all of the code that this section
1034 // depends upon.
1035 if (useDarwinGDBCompat())
1036 emitDebugInlineInfo();
1037 }
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001038
Eric Christopher9d9f5a52012-08-23 07:32:06 +00001039 // Emit info into the dwarf accelerator table sections.
Eric Christopher20f47ab2012-08-23 22:36:40 +00001040 if (useDwarfAccelTables()) {
Eric Christopher09ac3d82011-11-07 09:24:32 +00001041 emitAccelNames();
1042 emitAccelObjC();
1043 emitAccelNamespaces();
1044 emitAccelTypes();
1045 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001046
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00001047 // Emit info into a debug pubnames section, if requested.
1048 if (GenerateDwarfPubNamesSection)
1049 emitDebugPubnames();
1050
Devang Patel193f7202009-11-24 01:14:22 +00001051 // Emit info into a debug pubtypes section.
Eric Christopher360f0062012-08-23 07:10:56 +00001052 // TODO: When we don't need the option anymore we can
1053 // remove all of the code that adds to the table.
Eric Christopher20f47ab2012-08-23 22:36:40 +00001054 if (useDarwinGDBCompat())
Eric Christopher360f0062012-08-23 07:10:56 +00001055 emitDebugPubTypes();
Devang Patel193f7202009-11-24 01:14:22 +00001056
Eric Christopher42885022012-11-27 22:43:42 +00001057 // Finally emit string information into a string table.
Eric Christopherfcdbecb2012-11-27 06:49:23 +00001058 emitDebugStr();
Eric Christopher64f824c2012-12-27 02:14:01 +00001059 if (useSplitDwarf())
1060 emitDebugStrDWO();
Eric Christopherfcdbecb2012-11-27 06:49:23 +00001061
Devang Patele9a1cca2010-08-02 17:32:15 +00001062 // clean up.
Devang Patel94c7ddb2011-08-16 22:09:43 +00001063 SPMap.clear();
Devang Patel163a9f72010-05-10 22:49:55 +00001064 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
1065 E = CUMap.end(); I != E; ++I)
1066 delete I->second;
Eric Christopher9ec87b32012-12-10 19:51:18 +00001067
Eric Christopher01776a52013-02-06 21:53:56 +00001068 for (SmallVector<CompileUnit *, 1>::iterator I = SkeletonCUs.begin(),
1069 E = SkeletonCUs.end(); I != E; ++I)
1070 delete *I;
Eric Christopher9ec87b32012-12-10 19:51:18 +00001071
Eric Christopher98e237f2012-11-30 23:59:06 +00001072 // Reset these for the next Module if we have one.
1073 FirstCU = NULL;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001074}
1075
Eric Christopherb6dc8652012-11-27 22:43:45 +00001076// Find abstract variable, if any, associated with Var.
Devang Patelb549bcf2011-08-10 21:50:54 +00001077DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &DV,
Chris Lattnerde4845c2010-04-02 19:42:39 +00001078 DebugLoc ScopeLoc) {
Devang Patelb549bcf2011-08-10 21:50:54 +00001079 LLVMContext &Ctx = DV->getContext();
1080 // More then one inlined variable corresponds to one abstract variable.
1081 DIVariable Var = cleanseInlinedVariable(DV, Ctx);
Devang Patel2db49d72010-05-07 18:11:54 +00001082 DbgVariable *AbsDbgVariable = AbstractVariables.lookup(Var);
Devang Patel53bb5c92009-11-10 23:06:00 +00001083 if (AbsDbgVariable)
1084 return AbsDbgVariable;
1085
Devang Patelbf47fdb2011-08-10 20:55:27 +00001086 LexicalScope *Scope = LScopes.findAbstractScope(ScopeLoc.getScope(Ctx));
Devang Patel53bb5c92009-11-10 23:06:00 +00001087 if (!Scope)
1088 return NULL;
1089
Devang Patel5a1a67c2011-08-15 19:01:20 +00001090 AbsDbgVariable = new DbgVariable(Var, NULL);
Devang Patelbf47fdb2011-08-10 20:55:27 +00001091 addScopeVariable(Scope, AbsDbgVariable);
Devang Patel2db49d72010-05-07 18:11:54 +00001092 AbstractVariables[Var] = AbsDbgVariable;
Devang Patel53bb5c92009-11-10 23:06:00 +00001093 return AbsDbgVariable;
1094}
1095
Eric Christopherb6dc8652012-11-27 22:43:45 +00001096// If Var is a current function argument then add it to CurrentFnArguments list.
Devang Patel0478c152011-03-01 22:58:55 +00001097bool DwarfDebug::addCurrentFnArgument(const MachineFunction *MF,
Devang Patelbf47fdb2011-08-10 20:55:27 +00001098 DbgVariable *Var, LexicalScope *Scope) {
1099 if (!LScopes.isCurrentFunctionScope(Scope))
Devang Patel0478c152011-03-01 22:58:55 +00001100 return false;
1101 DIVariable DV = Var->getVariable();
1102 if (DV.getTag() != dwarf::DW_TAG_arg_variable)
1103 return false;
1104 unsigned ArgNo = DV.getArgNumber();
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001105 if (ArgNo == 0)
Devang Patel0478c152011-03-01 22:58:55 +00001106 return false;
1107
Devang Patelcb3a6572011-03-03 20:02:02 +00001108 size_t Size = CurrentFnArguments.size();
1109 if (Size == 0)
Devang Patel0478c152011-03-01 22:58:55 +00001110 CurrentFnArguments.resize(MF->getFunction()->arg_size());
Devang Patelbbd0f452011-03-03 21:49:41 +00001111 // llvm::Function argument size is not good indicator of how many
Devang Patel6f676be2011-03-03 20:08:10 +00001112 // arguments does the function have at source level.
1113 if (ArgNo > Size)
Devang Patelcb3a6572011-03-03 20:02:02 +00001114 CurrentFnArguments.resize(ArgNo * 2);
Devang Patel0478c152011-03-01 22:58:55 +00001115 CurrentFnArguments[ArgNo - 1] = Var;
1116 return true;
1117}
1118
Eric Christopherb6dc8652012-11-27 22:43:45 +00001119// Collect variable information from side table maintained by MMI.
Jim Grosbach1e20b962010-07-21 21:21:52 +00001120void
Nick Lewycky3bbb6f72011-07-29 03:49:23 +00001121DwarfDebug::collectVariableInfoFromMMITable(const MachineFunction *MF,
Devang Patelee432862010-05-20 19:57:06 +00001122 SmallPtrSet<const MDNode *, 16> &Processed) {
Devang Patele717faa2009-10-06 01:26:37 +00001123 MachineModuleInfo::VariableDbgInfoMapTy &VMap = MMI->getVariableDbgInfo();
1124 for (MachineModuleInfo::VariableDbgInfoMapTy::iterator VI = VMap.begin(),
1125 VE = VMap.end(); VI != VE; ++VI) {
Devang Patele9f8f5e2010-05-07 20:54:48 +00001126 const MDNode *Var = VI->first;
Devang Patel53bb5c92009-11-10 23:06:00 +00001127 if (!Var) continue;
Devang Patel98e1cac2010-05-14 21:01:35 +00001128 Processed.insert(Var);
Chris Lattnerde4845c2010-04-02 19:42:39 +00001129 DIVariable DV(Var);
1130 const std::pair<unsigned, DebugLoc> &VP = VI->second;
Devang Patel53bb5c92009-11-10 23:06:00 +00001131
Devang Patelbf47fdb2011-08-10 20:55:27 +00001132 LexicalScope *Scope = LScopes.findLexicalScope(VP.second);
Jim Grosbach1e20b962010-07-21 21:21:52 +00001133
Devang Patelfb0ee432009-11-10 23:20:04 +00001134 // If variable scope is not found then skip this variable.
Chris Lattnerde4845c2010-04-02 19:42:39 +00001135 if (Scope == 0)
Devang Patelfb0ee432009-11-10 23:20:04 +00001136 continue;
Devang Patel53bb5c92009-11-10 23:06:00 +00001137
Devang Patel26c1e562010-05-20 16:36:41 +00001138 DbgVariable *AbsDbgVariable = findAbstractVariable(DV, VP.second);
Devang Patel5a1a67c2011-08-15 19:01:20 +00001139 DbgVariable *RegVar = new DbgVariable(DV, AbsDbgVariable);
Devang Patelff9dd0a2011-08-15 21:24:36 +00001140 RegVar->setFrameIndex(VP.first);
Devang Patel0478c152011-03-01 22:58:55 +00001141 if (!addCurrentFnArgument(MF, RegVar, Scope))
Devang Patelbf47fdb2011-08-10 20:55:27 +00001142 addScopeVariable(Scope, RegVar);
Devang Patel5a1a67c2011-08-15 19:01:20 +00001143 if (AbsDbgVariable)
Devang Patelff9dd0a2011-08-15 21:24:36 +00001144 AbsDbgVariable->setFrameIndex(VP.first);
Devang Patele717faa2009-10-06 01:26:37 +00001145 }
Devang Patelee432862010-05-20 19:57:06 +00001146}
Devang Patel90a48ad2010-03-15 18:33:46 +00001147
Eric Christopherb6dc8652012-11-27 22:43:45 +00001148// Return true if debug value, encoded by DBG_VALUE instruction, is in a
1149// defined reg.
Devang Patelc3f5f782010-05-25 23:40:22 +00001150static bool isDbgValueInDefinedReg(const MachineInstr *MI) {
Nick Lewycky746cb672011-10-26 22:55:33 +00001151 assert(MI->isDebugValue() && "Invalid DBG_VALUE machine instruction!");
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001152 return MI->getNumOperands() == 3 &&
1153 MI->getOperand(0).isReg() && MI->getOperand(0).getReg() &&
Adrian Prantl86a87d92013-04-30 22:35:14 +00001154 MI->getOperand(1).isImm() && MI->getOperand(1).getImm() == 0;
Devang Patelc3f5f782010-05-25 23:40:22 +00001155}
1156
Eric Christopherb6dc8652012-11-27 22:43:45 +00001157// Get .debug_loc entry for the instruction range starting at MI.
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001158static DotDebugLocEntry getDebugLocEntry(AsmPrinter *Asm,
1159 const MCSymbol *FLabel,
Devang Patel90b40412011-07-08 17:09:57 +00001160 const MCSymbol *SLabel,
1161 const MachineInstr *MI) {
1162 const MDNode *Var = MI->getOperand(MI->getNumOperands() - 1).getMetadata();
1163
1164 if (MI->getNumOperands() != 3) {
1165 MachineLocation MLoc = Asm->getDebugValueLocation(MI);
1166 return DotDebugLocEntry(FLabel, SLabel, MLoc, Var);
1167 }
Adrian Prantl86a87d92013-04-30 22:35:14 +00001168 if (MI->getOperand(0).isReg() && MI->getOperand(1).isImm()) {
Devang Patel90b40412011-07-08 17:09:57 +00001169 MachineLocation MLoc;
Adrian Prantl86a87d92013-04-30 22:35:14 +00001170 // TODO: Currently an offset of 0 in a DBG_VALUE means
1171 // we need to generate a direct register value.
1172 // There is no way to specify an indirect value with offset 0.
1173 if (MI->getOperand(1).getImm() == 0)
Adrian Prantl13131e62013-04-26 21:57:17 +00001174 MLoc.set(MI->getOperand(0).getReg());
1175 else
1176 MLoc.set(MI->getOperand(0).getReg(), MI->getOperand(1).getImm());
Devang Patel90b40412011-07-08 17:09:57 +00001177 return DotDebugLocEntry(FLabel, SLabel, MLoc, Var);
1178 }
1179 if (MI->getOperand(0).isImm())
1180 return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getImm());
1181 if (MI->getOperand(0).isFPImm())
1182 return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getFPImm());
1183 if (MI->getOperand(0).isCImm())
1184 return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getCImm());
1185
Craig Topper5e25ee82012-02-05 08:31:47 +00001186 llvm_unreachable("Unexpected 3 operand DBG_VALUE instruction!");
Devang Patel90b40412011-07-08 17:09:57 +00001187}
1188
Eric Christopherb6dc8652012-11-27 22:43:45 +00001189// Find variables for each lexical scope.
Jim Grosbach1e20b962010-07-21 21:21:52 +00001190void
Devang Patel78e127d2010-06-25 22:07:34 +00001191DwarfDebug::collectVariableInfo(const MachineFunction *MF,
1192 SmallPtrSet<const MDNode *, 16> &Processed) {
Jim Grosbach1e20b962010-07-21 21:21:52 +00001193
Eric Christopherb6dc8652012-11-27 22:43:45 +00001194 // collection info from MMI table.
Devang Patelee432862010-05-20 19:57:06 +00001195 collectVariableInfoFromMMITable(MF, Processed);
1196
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001197 for (SmallVectorImpl<const MDNode*>::const_iterator
1198 UVI = UserVariables.begin(), UVE = UserVariables.end(); UVI != UVE;
1199 ++UVI) {
1200 const MDNode *Var = *UVI;
1201 if (Processed.count(Var))
Devang Patelee432862010-05-20 19:57:06 +00001202 continue;
1203
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001204 // History contains relevant DBG_VALUE instructions for Var and instructions
1205 // clobbering it.
1206 SmallVectorImpl<const MachineInstr*> &History = DbgValues[Var];
1207 if (History.empty())
1208 continue;
1209 const MachineInstr *MInsn = History.front();
Devang Patelc3f5f782010-05-25 23:40:22 +00001210
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001211 DIVariable DV(Var);
Devang Patelbf47fdb2011-08-10 20:55:27 +00001212 LexicalScope *Scope = NULL;
Devang Pateld8720f42010-05-27 20:25:04 +00001213 if (DV.getTag() == dwarf::DW_TAG_arg_variable &&
1214 DISubprogram(DV.getContext()).describes(MF->getFunction()))
Devang Patelbf47fdb2011-08-10 20:55:27 +00001215 Scope = LScopes.getCurrentFunctionScope();
David Blaikiec0ec8a42013-03-11 23:39:23 +00001216 else if (MDNode *IA = DV.getInlinedAt())
1217 Scope = LScopes.findInlinedScope(DebugLoc::getFromDILocation(IA));
1218 else
1219 Scope = LScopes.findLexicalScope(cast<MDNode>(DV->getOperand(1)));
Devang Patelee432862010-05-20 19:57:06 +00001220 // If variable scope is not found then skip this variable.
Devang Patelc0c5a262010-05-21 00:10:20 +00001221 if (!Scope)
Devang Patelee432862010-05-20 19:57:06 +00001222 continue;
1223
1224 Processed.insert(DV);
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001225 assert(MInsn->isDebugValue() && "History must begin with debug value");
Devang Patel5a1a67c2011-08-15 19:01:20 +00001226 DbgVariable *AbsVar = findAbstractVariable(DV, MInsn->getDebugLoc());
1227 DbgVariable *RegVar = new DbgVariable(DV, AbsVar);
Devang Patel0478c152011-03-01 22:58:55 +00001228 if (!addCurrentFnArgument(MF, RegVar, Scope))
Devang Patelbf47fdb2011-08-10 20:55:27 +00001229 addScopeVariable(Scope, RegVar);
Devang Patel5a1a67c2011-08-15 19:01:20 +00001230 if (AbsVar)
Devang Patelff9dd0a2011-08-15 21:24:36 +00001231 AbsVar->setMInsn(MInsn);
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001232
Eric Christopherc56e3f02012-10-08 20:48:54 +00001233 // Simplify ranges that are fully coalesced.
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001234 if (History.size() <= 1 || (History.size() == 2 &&
1235 MInsn->isIdenticalTo(History.back()))) {
Devang Patelff9dd0a2011-08-15 21:24:36 +00001236 RegVar->setMInsn(MInsn);
Devang Patelc3f5f782010-05-25 23:40:22 +00001237 continue;
1238 }
1239
Eric Christopher498703b2013-01-28 17:33:26 +00001240 // Handle multiple DBG_VALUE instructions describing one variable.
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001241 RegVar->setDotDebugLocOffset(DotDebugLocEntries.size());
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001242
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001243 for (SmallVectorImpl<const MachineInstr*>::const_iterator
1244 HI = History.begin(), HE = History.end(); HI != HE; ++HI) {
1245 const MachineInstr *Begin = *HI;
1246 assert(Begin->isDebugValue() && "Invalid History entry");
Jakob Stoklund Olesene17232e2011-03-22 00:21:41 +00001247
Devang Patel4ada1d72011-06-01 23:00:17 +00001248 // Check if DBG_VALUE is truncating a range.
1249 if (Begin->getNumOperands() > 1 && Begin->getOperand(0).isReg()
1250 && !Begin->getOperand(0).getReg())
1251 continue;
1252
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001253 // Compute the range for a register location.
1254 const MCSymbol *FLabel = getLabelBeforeInsn(Begin);
1255 const MCSymbol *SLabel = 0;
1256
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001257 if (HI + 1 == HE)
1258 // If Begin is the last instruction in History then its value is valid
Chris Lattner7a2bdde2011-04-15 05:18:47 +00001259 // until the end of the function.
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001260 SLabel = FunctionEndSym;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001261 else {
1262 const MachineInstr *End = HI[1];
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001263 DEBUG(dbgs() << "DotDebugLoc Pair:\n"
Devang Patel476df5f2011-07-07 21:44:42 +00001264 << "\t" << *Begin << "\t" << *End << "\n");
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001265 if (End->isDebugValue())
1266 SLabel = getLabelBeforeInsn(End);
1267 else {
1268 // End is a normal instruction clobbering the range.
1269 SLabel = getLabelAfterInsn(End);
1270 assert(SLabel && "Forgot label after clobber instruction");
1271 ++HI;
1272 }
1273 }
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001274
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001275 // The value is valid until the next DBG_VALUE or clobber.
Eric Christopherabbb2002011-12-16 23:42:31 +00001276 DotDebugLocEntries.push_back(getDebugLocEntry(Asm, FLabel, SLabel,
1277 Begin));
Devang Patelc3f5f782010-05-25 23:40:22 +00001278 }
1279 DotDebugLocEntries.push_back(DotDebugLocEntry());
Devang Patel90a48ad2010-03-15 18:33:46 +00001280 }
Devang Patel98e1cac2010-05-14 21:01:35 +00001281
1282 // Collect info for variables that were optimized out.
Devang Patel93d39be2011-08-19 23:28:12 +00001283 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
1284 DIArray Variables = DISubprogram(FnScope->getScopeNode()).getVariables();
1285 for (unsigned i = 0, e = Variables.getNumElements(); i != e; ++i) {
1286 DIVariable DV(Variables.getElement(i));
1287 if (!DV || !DV.Verify() || !Processed.insert(DV))
1288 continue;
1289 if (LexicalScope *Scope = LScopes.findLexicalScope(DV.getContext()))
1290 addScopeVariable(Scope, new DbgVariable(DV, NULL));
Devang Patel98e1cac2010-05-14 21:01:35 +00001291 }
Devang Patelc3f5f782010-05-25 23:40:22 +00001292}
Devang Patel98e1cac2010-05-14 21:01:35 +00001293
Eric Christopherb6dc8652012-11-27 22:43:45 +00001294// Return Label preceding the instruction.
Eric Christopher72f7bfb2013-01-15 23:56:56 +00001295MCSymbol *DwarfDebug::getLabelBeforeInsn(const MachineInstr *MI) {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001296 MCSymbol *Label = LabelsBeforeInsn.lookup(MI);
1297 assert(Label && "Didn't insert label before instruction");
1298 return Label;
Devang Patelc3f5f782010-05-25 23:40:22 +00001299}
1300
Eric Christopherb6dc8652012-11-27 22:43:45 +00001301// Return Label immediately following the instruction.
Eric Christopher72f7bfb2013-01-15 23:56:56 +00001302MCSymbol *DwarfDebug::getLabelAfterInsn(const MachineInstr *MI) {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001303 return LabelsAfterInsn.lookup(MI);
Devang Patele717faa2009-10-06 01:26:37 +00001304}
1305
Eric Christopherb6dc8652012-11-27 22:43:45 +00001306// Process beginning of an instruction.
Devang Patelcbbe2872010-10-26 17:49:02 +00001307void DwarfDebug::beginInstruction(const MachineInstr *MI) {
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001308 // Check if source location changes, but ignore DBG_VALUE locations.
1309 if (!MI->isDebugValue()) {
1310 DebugLoc DL = MI->getDebugLoc();
1311 if (DL != PrevInstLoc && (!DL.isUnknown() || UnknownLocations)) {
Eric Christopher60b35f42012-04-05 20:39:05 +00001312 unsigned Flags = 0;
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001313 PrevInstLoc = DL;
Devang Patel4243e672011-05-11 19:22:19 +00001314 if (DL == PrologEndLoc) {
1315 Flags |= DWARF2_FLAG_PROLOGUE_END;
1316 PrologEndLoc = DebugLoc();
1317 }
Eric Christopher60b35f42012-04-05 20:39:05 +00001318 if (PrologEndLoc.isUnknown())
1319 Flags |= DWARF2_FLAG_IS_STMT;
1320
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001321 if (!DL.isUnknown()) {
1322 const MDNode *Scope = DL.getScope(Asm->MF->getFunction()->getContext());
Devang Patel4243e672011-05-11 19:22:19 +00001323 recordSourceLine(DL.getLine(), DL.getCol(), Scope, Flags);
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001324 } else
Devang Patel4243e672011-05-11 19:22:19 +00001325 recordSourceLine(0, 0, 0, 0);
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001326 }
Devang Patelc3f5f782010-05-25 23:40:22 +00001327 }
Devang Patelaead63c2010-03-29 22:59:58 +00001328
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001329 // Insert labels where requested.
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001330 DenseMap<const MachineInstr*, MCSymbol*>::iterator I =
1331 LabelsBeforeInsn.find(MI);
1332
1333 // No label needed.
1334 if (I == LabelsBeforeInsn.end())
1335 return;
1336
1337 // Label already assigned.
1338 if (I->second)
Devang Patelb2b31a62010-05-26 19:37:24 +00001339 return;
Devang Patel553881b2010-03-29 17:20:31 +00001340
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001341 if (!PrevLabel) {
Devang Patel77051f52010-05-26 21:23:46 +00001342 PrevLabel = MMI->getContext().CreateTempSymbol();
1343 Asm->OutStreamer.EmitLabel(PrevLabel);
Devang Patelb2b31a62010-05-26 19:37:24 +00001344 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001345 I->second = PrevLabel;
Devang Patel0d20ac82009-10-06 01:50:42 +00001346}
1347
Eric Christopherb6dc8652012-11-27 22:43:45 +00001348// Process end of an instruction.
Devang Patelcbbe2872010-10-26 17:49:02 +00001349void DwarfDebug::endInstruction(const MachineInstr *MI) {
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001350 // Don't create a new label after DBG_VALUE instructions.
1351 // They don't generate code.
1352 if (!MI->isDebugValue())
1353 PrevLabel = 0;
1354
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001355 DenseMap<const MachineInstr*, MCSymbol*>::iterator I =
1356 LabelsAfterInsn.find(MI);
1357
1358 // No label needed.
1359 if (I == LabelsAfterInsn.end())
1360 return;
1361
1362 // Label already assigned.
1363 if (I->second)
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001364 return;
1365
1366 // We need a label after this instruction.
1367 if (!PrevLabel) {
1368 PrevLabel = MMI->getContext().CreateTempSymbol();
1369 Asm->OutStreamer.EmitLabel(PrevLabel);
Devang Patel1c246352010-04-08 16:50:29 +00001370 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001371 I->second = PrevLabel;
Devang Patel53bb5c92009-11-10 23:06:00 +00001372}
1373
Eric Christopherb6dc8652012-11-27 22:43:45 +00001374// Each LexicalScope has first instruction and last instruction to mark
1375// beginning and end of a scope respectively. Create an inverse map that list
1376// scopes starts (and ends) with an instruction. One instruction may start (or
1377// end) multiple scopes. Ignore scopes that are not reachable.
Devang Patele37b0c62010-04-08 18:43:56 +00001378void DwarfDebug::identifyScopeMarkers() {
Devang Patelbf47fdb2011-08-10 20:55:27 +00001379 SmallVector<LexicalScope *, 4> WorkList;
1380 WorkList.push_back(LScopes.getCurrentFunctionScope());
Devang Patel42aafd72010-01-20 02:05:23 +00001381 while (!WorkList.empty()) {
Devang Patelbf47fdb2011-08-10 20:55:27 +00001382 LexicalScope *S = WorkList.pop_back_val();
Jim Grosbach1e20b962010-07-21 21:21:52 +00001383
Devang Patelbf47fdb2011-08-10 20:55:27 +00001384 const SmallVector<LexicalScope *, 4> &Children = S->getChildren();
Jim Grosbach1e20b962010-07-21 21:21:52 +00001385 if (!Children.empty())
Devang Patelbf47fdb2011-08-10 20:55:27 +00001386 for (SmallVector<LexicalScope *, 4>::const_iterator SI = Children.begin(),
Devang Patel42aafd72010-01-20 02:05:23 +00001387 SE = Children.end(); SI != SE; ++SI)
1388 WorkList.push_back(*SI);
1389
Devang Patel53bb5c92009-11-10 23:06:00 +00001390 if (S->isAbstractScope())
1391 continue;
Jim Grosbach1e20b962010-07-21 21:21:52 +00001392
Devang Patelbf47fdb2011-08-10 20:55:27 +00001393 const SmallVector<InsnRange, 4> &Ranges = S->getRanges();
Devang Pateleac9c072010-04-27 19:46:33 +00001394 if (Ranges.empty())
1395 continue;
Devang Patelbf47fdb2011-08-10 20:55:27 +00001396 for (SmallVector<InsnRange, 4>::const_iterator RI = Ranges.begin(),
Devang Pateleac9c072010-04-27 19:46:33 +00001397 RE = Ranges.end(); RI != RE; ++RI) {
Devang Patelbf47fdb2011-08-10 20:55:27 +00001398 assert(RI->first && "InsnRange does not have first instruction!");
1399 assert(RI->second && "InsnRange does not have second instruction!");
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001400 requestLabelBeforeInsn(RI->first);
1401 requestLabelAfterInsn(RI->second);
Devang Pateleac9c072010-04-27 19:46:33 +00001402 }
Devang Patelaf9e8472009-10-01 20:31:14 +00001403 }
Devang Patelaf9e8472009-10-01 20:31:14 +00001404}
1405
Eric Christopherb6dc8652012-11-27 22:43:45 +00001406// Get MDNode for DebugLoc's scope.
Devang Patela3f48672011-05-09 22:14:49 +00001407static MDNode *getScopeNode(DebugLoc DL, const LLVMContext &Ctx) {
1408 if (MDNode *InlinedAt = DL.getInlinedAt(Ctx))
1409 return getScopeNode(DebugLoc::getFromDILocation(InlinedAt), Ctx);
1410 return DL.getScope(Ctx);
1411}
1412
Eric Christopherb6dc8652012-11-27 22:43:45 +00001413// Walk up the scope chain of given debug loc and find line number info
1414// for the function.
Devang Patel4243e672011-05-11 19:22:19 +00001415static DebugLoc getFnDebugLoc(DebugLoc DL, const LLVMContext &Ctx) {
1416 const MDNode *Scope = getScopeNode(DL, Ctx);
1417 DISubprogram SP = getDISubprogram(Scope);
Eric Christopher6126a1e2012-04-03 00:43:49 +00001418 if (SP.Verify()) {
1419 // Check for number of operands since the compatibility is
1420 // cheap here.
Eric Christopherfa5b0502012-04-03 17:55:42 +00001421 if (SP->getNumOperands() > 19)
Eric Christopher6126a1e2012-04-03 00:43:49 +00001422 return DebugLoc::get(SP.getScopeLineNumber(), 0, SP);
1423 else
1424 return DebugLoc::get(SP.getLineNumber(), 0, SP);
1425 }
1426
Devang Patel4243e672011-05-11 19:22:19 +00001427 return DebugLoc();
1428}
1429
Eric Christopherb6dc8652012-11-27 22:43:45 +00001430// Gather pre-function debug information. Assumes being called immediately
1431// after the function entry point has been emitted.
Chris Lattnereec791a2010-01-26 23:18:02 +00001432void DwarfDebug::beginFunction(const MachineFunction *MF) {
Chris Lattner994cb122010-04-05 03:52:55 +00001433 if (!MMI->hasDebugInfo()) return;
Devang Patelbf47fdb2011-08-10 20:55:27 +00001434 LScopes.initialize(*MF);
1435 if (LScopes.empty()) return;
1436 identifyScopeMarkers();
Devang Patel60b35bd2009-10-06 18:37:31 +00001437
Manman Ren43213cf2013-02-05 21:52:47 +00001438 // Set DwarfCompileUnitID in MCContext to the Compile Unit this function
1439 // belongs to.
1440 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
1441 CompileUnit *TheCU = SPMap.lookup(FnScope->getScopeNode());
1442 assert(TheCU && "Unable to find compile unit!");
1443 Asm->OutStreamer.getContext().setDwarfCompileUnitID(TheCU->getUniqueID());
1444
Devang Pateleac9c072010-04-27 19:46:33 +00001445 FunctionBeginSym = Asm->GetTempSymbol("func_begin",
1446 Asm->getFunctionNumber());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001447 // Assumes in correct section after the entry point.
Devang Pateleac9c072010-04-27 19:46:33 +00001448 Asm->OutStreamer.EmitLabel(FunctionBeginSym);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001449
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001450 assert(UserVariables.empty() && DbgValues.empty() && "Maps weren't cleaned");
1451
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001452 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
Eric Christopherb6dc8652012-11-27 22:43:45 +00001453 // LiveUserVar - Map physreg numbers to the MDNode they contain.
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001454 std::vector<const MDNode*> LiveUserVar(TRI->getNumRegs());
1455
Devang Patelb2b31a62010-05-26 19:37:24 +00001456 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001457 I != E; ++I) {
1458 bool AtBlockEntry = true;
Devang Patelb2b31a62010-05-26 19:37:24 +00001459 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
1460 II != IE; ++II) {
1461 const MachineInstr *MI = II;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001462
Devang Patelb2b31a62010-05-26 19:37:24 +00001463 if (MI->isDebugValue()) {
Nick Lewycky746cb672011-10-26 22:55:33 +00001464 assert(MI->getNumOperands() > 1 && "Invalid machine instruction!");
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001465
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001466 // Keep track of user variables.
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001467 const MDNode *Var =
1468 MI->getOperand(MI->getNumOperands() - 1).getMetadata();
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001469
1470 // Variable is in a register, we need to check for clobbers.
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001471 if (isDbgValueInDefinedReg(MI))
1472 LiveUserVar[MI->getOperand(0).getReg()] = Var;
1473
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001474 // Check the history of this variable.
1475 SmallVectorImpl<const MachineInstr*> &History = DbgValues[Var];
1476 if (History.empty()) {
1477 UserVariables.push_back(Var);
1478 // The first mention of a function argument gets the FunctionBeginSym
1479 // label, so arguments are visible when breaking at function entry.
1480 DIVariable DV(Var);
1481 if (DV.Verify() && DV.getTag() == dwarf::DW_TAG_arg_variable &&
1482 DISubprogram(getDISubprogram(DV.getContext()))
1483 .describes(MF->getFunction()))
1484 LabelsBeforeInsn[MI] = FunctionBeginSym;
1485 } else {
1486 // We have seen this variable before. Try to coalesce DBG_VALUEs.
1487 const MachineInstr *Prev = History.back();
1488 if (Prev->isDebugValue()) {
1489 // Coalesce identical entries at the end of History.
1490 if (History.size() >= 2 &&
Devang Patel79862892011-07-07 00:14:27 +00001491 Prev->isIdenticalTo(History[History.size() - 2])) {
Eric Christopher02c1a642012-10-08 20:48:49 +00001492 DEBUG(dbgs() << "Coalescing identical DBG_VALUE entries:\n"
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001493 << "\t" << *Prev
Devang Patel79862892011-07-07 00:14:27 +00001494 << "\t" << *History[History.size() - 2] << "\n");
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001495 History.pop_back();
Devang Patel79862892011-07-07 00:14:27 +00001496 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001497
1498 // Terminate old register assignments that don't reach MI;
1499 MachineFunction::const_iterator PrevMBB = Prev->getParent();
1500 if (PrevMBB != I && (!AtBlockEntry || llvm::next(PrevMBB) != I) &&
1501 isDbgValueInDefinedReg(Prev)) {
1502 // Previous register assignment needs to terminate at the end of
1503 // its basic block.
1504 MachineBasicBlock::const_iterator LastMI =
1505 PrevMBB->getLastNonDebugInstr();
Devang Patel79862892011-07-07 00:14:27 +00001506 if (LastMI == PrevMBB->end()) {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001507 // Drop DBG_VALUE for empty range.
Eric Christopher02c1a642012-10-08 20:48:49 +00001508 DEBUG(dbgs() << "Dropping DBG_VALUE for empty range:\n"
Devang Patel79862892011-07-07 00:14:27 +00001509 << "\t" << *Prev << "\n");
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001510 History.pop_back();
Devang Patel79862892011-07-07 00:14:27 +00001511 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001512 else {
1513 // Terminate after LastMI.
1514 History.push_back(LastMI);
1515 }
1516 }
1517 }
1518 }
1519 History.push_back(MI);
Devang Patelb2b31a62010-05-26 19:37:24 +00001520 } else {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001521 // Not a DBG_VALUE instruction.
1522 if (!MI->isLabel())
1523 AtBlockEntry = false;
1524
Eric Christopher0313ced2012-10-04 20:46:14 +00001525 // First known non-DBG_VALUE and non-frame setup location marks
1526 // the beginning of the function body.
1527 if (!MI->getFlag(MachineInstr::FrameSetup) &&
1528 (PrologEndLoc.isUnknown() && !MI->getDebugLoc().isUnknown()))
Devang Patel4243e672011-05-11 19:22:19 +00001529 PrologEndLoc = MI->getDebugLoc();
1530
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001531 // Check if the instruction clobbers any registers with debug vars.
1532 for (MachineInstr::const_mop_iterator MOI = MI->operands_begin(),
1533 MOE = MI->operands_end(); MOI != MOE; ++MOI) {
1534 if (!MOI->isReg() || !MOI->isDef() || !MOI->getReg())
1535 continue;
Jakob Stoklund Olesen396618b2012-06-01 23:28:30 +00001536 for (MCRegAliasIterator AI(MOI->getReg(), TRI, true);
1537 AI.isValid(); ++AI) {
1538 unsigned Reg = *AI;
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001539 const MDNode *Var = LiveUserVar[Reg];
1540 if (!Var)
1541 continue;
1542 // Reg is now clobbered.
1543 LiveUserVar[Reg] = 0;
1544
1545 // Was MD last defined by a DBG_VALUE referring to Reg?
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001546 DbgValueHistoryMap::iterator HistI = DbgValues.find(Var);
1547 if (HistI == DbgValues.end())
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001548 continue;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001549 SmallVectorImpl<const MachineInstr*> &History = HistI->second;
1550 if (History.empty())
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001551 continue;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001552 const MachineInstr *Prev = History.back();
1553 // Sanity-check: Register assignments are terminated at the end of
1554 // their block.
1555 if (!Prev->isDebugValue() || Prev->getParent() != MI->getParent())
1556 continue;
1557 // Is the variable still in Reg?
1558 if (!isDbgValueInDefinedReg(Prev) ||
1559 Prev->getOperand(0).getReg() != Reg)
1560 continue;
1561 // Var is clobbered. Make sure the next instruction gets a label.
1562 History.push_back(MI);
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001563 }
1564 }
Devang Patelb2b31a62010-05-26 19:37:24 +00001565 }
Devang Patelb2b31a62010-05-26 19:37:24 +00001566 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001567 }
1568
1569 for (DbgValueHistoryMap::iterator I = DbgValues.begin(), E = DbgValues.end();
1570 I != E; ++I) {
1571 SmallVectorImpl<const MachineInstr*> &History = I->second;
1572 if (History.empty())
1573 continue;
1574
1575 // Make sure the final register assignments are terminated.
1576 const MachineInstr *Prev = History.back();
1577 if (Prev->isDebugValue() && isDbgValueInDefinedReg(Prev)) {
1578 const MachineBasicBlock *PrevMBB = Prev->getParent();
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001579 MachineBasicBlock::const_iterator LastMI =
Devang Patel5bc942c2011-08-10 23:58:09 +00001580 PrevMBB->getLastNonDebugInstr();
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001581 if (LastMI == PrevMBB->end())
1582 // Drop DBG_VALUE for empty range.
1583 History.pop_back();
1584 else {
1585 // Terminate after LastMI.
1586 History.push_back(LastMI);
1587 }
1588 }
1589 // Request labels for the full history.
1590 for (unsigned i = 0, e = History.size(); i != e; ++i) {
1591 const MachineInstr *MI = History[i];
1592 if (MI->isDebugValue())
1593 requestLabelBeforeInsn(MI);
1594 else
1595 requestLabelAfterInsn(MI);
1596 }
1597 }
Devang Patelb2b31a62010-05-26 19:37:24 +00001598
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001599 PrevInstLoc = DebugLoc();
Devang Patelb2b31a62010-05-26 19:37:24 +00001600 PrevLabel = FunctionBeginSym;
Devang Patel4243e672011-05-11 19:22:19 +00001601
1602 // Record beginning of function.
1603 if (!PrologEndLoc.isUnknown()) {
1604 DebugLoc FnStartDL = getFnDebugLoc(PrologEndLoc,
1605 MF->getFunction()->getContext());
1606 recordSourceLine(FnStartDL.getLine(), FnStartDL.getCol(),
1607 FnStartDL.getScope(MF->getFunction()->getContext()),
David Blaikie836cfc42012-12-04 22:02:33 +00001608 // We'd like to list the prologue as "not statements" but GDB behaves
1609 // poorly if we do that. Revisit this with caution/GDB (7.5+) testing.
David Blaikieb36c5312012-12-04 21:05:36 +00001610 DWARF2_FLAG_IS_STMT);
Devang Patel4243e672011-05-11 19:22:19 +00001611 }
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001612}
1613
Devang Patelbf47fdb2011-08-10 20:55:27 +00001614void DwarfDebug::addScopeVariable(LexicalScope *LS, DbgVariable *Var) {
1615// SmallVector<DbgVariable *, 8> &Vars = ScopeVariables.lookup(LS);
1616 ScopeVariables[LS].push_back(Var);
1617// Vars.push_back(Var);
1618}
1619
Eric Christopherb6dc8652012-11-27 22:43:45 +00001620// Gather and emit post-function debug information.
Chris Lattnereec791a2010-01-26 23:18:02 +00001621void DwarfDebug::endFunction(const MachineFunction *MF) {
Devang Patelbf47fdb2011-08-10 20:55:27 +00001622 if (!MMI->hasDebugInfo() || LScopes.empty()) return;
Devang Patel70d75ca2009-11-12 19:02:56 +00001623
Devang Patelbf47fdb2011-08-10 20:55:27 +00001624 // Define end label for subprogram.
1625 FunctionEndSym = Asm->GetTempSymbol("func_end",
1626 Asm->getFunctionNumber());
1627 // Assumes in correct section after the entry point.
1628 Asm->OutStreamer.EmitLabel(FunctionEndSym);
Manman Ren43213cf2013-02-05 21:52:47 +00001629 // Set DwarfCompileUnitID in MCContext to default value.
1630 Asm->OutStreamer.getContext().setDwarfCompileUnitID(0);
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001631
Devang Patelbf47fdb2011-08-10 20:55:27 +00001632 SmallPtrSet<const MDNode *, 16> ProcessedVars;
1633 collectVariableInfo(MF, ProcessedVars);
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001634
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001635 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
Devang Patel94c7ddb2011-08-16 22:09:43 +00001636 CompileUnit *TheCU = SPMap.lookup(FnScope->getScopeNode());
Nick Lewycky746cb672011-10-26 22:55:33 +00001637 assert(TheCU && "Unable to find compile unit!");
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001638
Devang Patelbf47fdb2011-08-10 20:55:27 +00001639 // Construct abstract scopes.
Devang Patelcd9f6c52011-08-12 18:10:19 +00001640 ArrayRef<LexicalScope *> AList = LScopes.getAbstractScopesList();
1641 for (unsigned i = 0, e = AList.size(); i != e; ++i) {
1642 LexicalScope *AScope = AList[i];
1643 DISubprogram SP(AScope->getScopeNode());
Devang Patelbf47fdb2011-08-10 20:55:27 +00001644 if (SP.Verify()) {
1645 // Collect info for variables that were optimized out.
Devang Patel93d39be2011-08-19 23:28:12 +00001646 DIArray Variables = SP.getVariables();
1647 for (unsigned i = 0, e = Variables.getNumElements(); i != e; ++i) {
1648 DIVariable DV(Variables.getElement(i));
1649 if (!DV || !DV.Verify() || !ProcessedVars.insert(DV))
1650 continue;
Alexey Samsonovb67bd332012-07-06 08:45:08 +00001651 // Check that DbgVariable for DV wasn't created earlier, when
1652 // findAbstractVariable() was called for inlined instance of DV.
1653 LLVMContext &Ctx = DV->getContext();
1654 DIVariable CleanDV = cleanseInlinedVariable(DV, Ctx);
1655 if (AbstractVariables.lookup(CleanDV))
1656 continue;
Devang Patel93d39be2011-08-19 23:28:12 +00001657 if (LexicalScope *Scope = LScopes.findAbstractScope(DV.getContext()))
1658 addScopeVariable(Scope, new DbgVariable(DV, NULL));
Devang Patel78e127d2010-06-25 22:07:34 +00001659 }
1660 }
Devang Patelcd9f6c52011-08-12 18:10:19 +00001661 if (ProcessedSPNodes.count(AScope->getScopeNode()) == 0)
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001662 constructScopeDIE(TheCU, AScope);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001663 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001664
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001665 DIE *CurFnDIE = constructScopeDIE(TheCU, FnScope);
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001666
Nick Lewycky8a8d4792011-12-02 22:16:29 +00001667 if (!MF->getTarget().Options.DisableFramePointerElim(*MF))
Eric Christopher873cf0a2012-08-24 01:14:27 +00001668 TheCU->addFlag(CurFnDIE, dwarf::DW_AT_APPLE_omit_frame_ptr);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001669
Devang Patelbf47fdb2011-08-10 20:55:27 +00001670 DebugFrames.push_back(FunctionDebugFrameInfo(Asm->getFunctionNumber(),
1671 MMI->getFrameMoves()));
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001672
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001673 // Clear debug info
Devang Patelbf47fdb2011-08-10 20:55:27 +00001674 for (DenseMap<LexicalScope *, SmallVector<DbgVariable *, 8> >::iterator
1675 I = ScopeVariables.begin(), E = ScopeVariables.end(); I != E; ++I)
1676 DeleteContainerPointers(I->second);
1677 ScopeVariables.clear();
Devang Pateleac0c9d2011-04-22 18:09:57 +00001678 DeleteContainerPointers(CurrentFnArguments);
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001679 UserVariables.clear();
1680 DbgValues.clear();
Jeffrey Yasskin5c213dc2010-03-12 17:45:06 +00001681 AbstractVariables.clear();
Devang Pateleac9c072010-04-27 19:46:33 +00001682 LabelsBeforeInsn.clear();
1683 LabelsAfterInsn.clear();
Devang Patelf2548ca2010-04-16 23:33:45 +00001684 PrevLabel = NULL;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001685}
1686
Eric Christopherb6dc8652012-11-27 22:43:45 +00001687// Register a source line with debug info. Returns the unique label that was
1688// emitted and which provides correspondence to the source line list.
Devang Patel4243e672011-05-11 19:22:19 +00001689void DwarfDebug::recordSourceLine(unsigned Line, unsigned Col, const MDNode *S,
1690 unsigned Flags) {
Devang Patel65dbc902009-11-25 17:36:49 +00001691 StringRef Fn;
Devang Patel23670e52011-03-24 20:30:50 +00001692 StringRef Dir;
Dan Gohman1cc0d622010-05-05 23:41:32 +00001693 unsigned Src = 1;
1694 if (S) {
1695 DIDescriptor Scope(S);
Devang Patelf84548d2009-10-05 18:03:19 +00001696
Dan Gohman1cc0d622010-05-05 23:41:32 +00001697 if (Scope.isCompileUnit()) {
1698 DICompileUnit CU(S);
Dan Gohman1cc0d622010-05-05 23:41:32 +00001699 Fn = CU.getFilename();
Devang Patel23670e52011-03-24 20:30:50 +00001700 Dir = CU.getDirectory();
Devang Patel3cabc9d2010-10-28 17:30:52 +00001701 } else if (Scope.isFile()) {
1702 DIFile F(S);
Devang Patel3cabc9d2010-10-28 17:30:52 +00001703 Fn = F.getFilename();
Devang Patel23670e52011-03-24 20:30:50 +00001704 Dir = F.getDirectory();
Dan Gohman1cc0d622010-05-05 23:41:32 +00001705 } else if (Scope.isSubprogram()) {
1706 DISubprogram SP(S);
Dan Gohman1cc0d622010-05-05 23:41:32 +00001707 Fn = SP.getFilename();
Devang Patel23670e52011-03-24 20:30:50 +00001708 Dir = SP.getDirectory();
Eric Christopher6618a242011-10-11 22:59:11 +00001709 } else if (Scope.isLexicalBlockFile()) {
1710 DILexicalBlockFile DBF(S);
1711 Fn = DBF.getFilename();
1712 Dir = DBF.getDirectory();
Dan Gohman1cc0d622010-05-05 23:41:32 +00001713 } else if (Scope.isLexicalBlock()) {
1714 DILexicalBlock DB(S);
Dan Gohman1cc0d622010-05-05 23:41:32 +00001715 Fn = DB.getFilename();
Devang Patel23670e52011-03-24 20:30:50 +00001716 Dir = DB.getDirectory();
Dan Gohman1cc0d622010-05-05 23:41:32 +00001717 } else
Craig Topper5e25ee82012-02-05 08:31:47 +00001718 llvm_unreachable("Unexpected scope info");
Dan Gohman1cc0d622010-05-05 23:41:32 +00001719
Manman Ren3de61b42013-03-07 01:42:00 +00001720 Src = getOrCreateSourceID(Fn, Dir,
1721 Asm->OutStreamer.getContext().getDwarfCompileUnitID());
Dan Gohman1cc0d622010-05-05 23:41:32 +00001722 }
Nick Lewycky3bbb6f72011-07-29 03:49:23 +00001723 Asm->OutStreamer.EmitDwarfLocDirective(Src, Line, Col, Flags, 0, 0, Fn);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001724}
1725
Bill Wendling829e67b2009-05-20 23:22:40 +00001726//===----------------------------------------------------------------------===//
1727// Emit Methods
1728//===----------------------------------------------------------------------===//
1729
Eric Christopherb6dc8652012-11-27 22:43:45 +00001730// Compute the size and offset of a DIE.
Jim Grosbach7ab38df2009-11-22 19:20:36 +00001731unsigned
Eric Christopher0e3e9b72012-12-10 23:34:43 +00001732DwarfUnits::computeSizeAndOffset(DIE *Die, unsigned Offset) {
Bill Wendling94d04b82009-05-20 23:21:38 +00001733 // Get the children.
1734 const std::vector<DIE *> &Children = Die->getChildren();
1735
Bill Wendling94d04b82009-05-20 23:21:38 +00001736 // Record the abbreviation.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001737 assignAbbrevNumber(Die->getAbbrev());
Bill Wendling94d04b82009-05-20 23:21:38 +00001738
1739 // Get the abbreviation for this DIE.
1740 unsigned AbbrevNumber = Die->getAbbrevNumber();
Eric Christopher0e3e9b72012-12-10 23:34:43 +00001741 const DIEAbbrev *Abbrev = Abbreviations->at(AbbrevNumber - 1);
Bill Wendling94d04b82009-05-20 23:21:38 +00001742
1743 // Set DIE offset
1744 Die->setOffset(Offset);
1745
1746 // Start the size with the size of abbreviation code.
Chris Lattneraf76e592009-08-22 20:48:53 +00001747 Offset += MCAsmInfo::getULEB128Size(AbbrevNumber);
Bill Wendling94d04b82009-05-20 23:21:38 +00001748
Eric Christopherf7cef702013-03-29 23:34:06 +00001749 const SmallVectorImpl<DIEValue*> &Values = Die->getValues();
1750 const SmallVectorImpl<DIEAbbrevData> &AbbrevData = Abbrev->getData();
Bill Wendling94d04b82009-05-20 23:21:38 +00001751
1752 // Size the DIE attribute values.
1753 for (unsigned i = 0, N = Values.size(); i < N; ++i)
1754 // Size attribute value.
Chris Lattnera37d5382010-04-05 00:18:22 +00001755 Offset += Values[i]->SizeOf(Asm, AbbrevData[i].getForm());
Bill Wendling94d04b82009-05-20 23:21:38 +00001756
1757 // Size the DIE children if any.
1758 if (!Children.empty()) {
1759 assert(Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes &&
1760 "Children flag not set");
1761
1762 for (unsigned j = 0, M = Children.size(); j < M; ++j)
Eric Christopherfbd19752012-11-20 22:14:13 +00001763 Offset = computeSizeAndOffset(Children[j], Offset);
Bill Wendling94d04b82009-05-20 23:21:38 +00001764
1765 // End of children marker.
1766 Offset += sizeof(int8_t);
1767 }
1768
1769 Die->setSize(Offset - Die->getOffset());
1770 return Offset;
1771}
1772
Eric Christopherb6dc8652012-11-27 22:43:45 +00001773// Compute the size and offset of all the DIEs.
Eric Christopher0e3e9b72012-12-10 23:34:43 +00001774void DwarfUnits::computeSizeAndOffsets() {
Manman Renbc3e96f2013-03-12 18:27:15 +00001775 // Offset from the beginning of debug info section.
1776 unsigned AccuOffset = 0;
Eric Christopherf7cef702013-03-29 23:34:06 +00001777 for (SmallVectorImpl<CompileUnit *>::iterator I = CUs.begin(),
Eric Christopher0e3e9b72012-12-10 23:34:43 +00001778 E = CUs.end(); I != E; ++I) {
Manman Renbc3e96f2013-03-12 18:27:15 +00001779 (*I)->setDebugInfoOffset(AccuOffset);
Eric Christopher98e237f2012-11-30 23:59:06 +00001780 unsigned Offset =
1781 sizeof(int32_t) + // Length of Compilation Unit Info
1782 sizeof(int16_t) + // DWARF version number
1783 sizeof(int32_t) + // Offset Into Abbrev. Section
1784 sizeof(int8_t); // Pointer Size (in bytes)
1785
Manman Renbc3e96f2013-03-12 18:27:15 +00001786 unsigned EndOffset = computeSizeAndOffset((*I)->getCUDie(), Offset);
1787 AccuOffset += EndOffset;
Devang Patel163a9f72010-05-10 22:49:55 +00001788 }
Bill Wendling94d04b82009-05-20 23:21:38 +00001789}
1790
Eric Christopherb6dc8652012-11-27 22:43:45 +00001791// Emit initial Dwarf sections with a label at the start of each one.
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001792void DwarfDebug::emitSectionLabels() {
Chris Lattner6c2f9e12009-08-19 05:49:37 +00001793 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
Daniel Dunbarf612ff62009-09-19 20:40:05 +00001794
Bill Wendling94d04b82009-05-20 23:21:38 +00001795 // Dwarf sections base addresses.
Jim Grosbach1e20b962010-07-21 21:21:52 +00001796 DwarfInfoSectionSym =
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001797 emitSectionSym(Asm, TLOF.getDwarfInfoSection(), "section_info");
Jim Grosbach1e20b962010-07-21 21:21:52 +00001798 DwarfAbbrevSectionSym =
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001799 emitSectionSym(Asm, TLOF.getDwarfAbbrevSection(), "section_abbrev");
Eric Christopher6eebe472012-12-19 22:02:53 +00001800 if (useSplitDwarf())
1801 DwarfAbbrevDWOSectionSym =
1802 emitSectionSym(Asm, TLOF.getDwarfAbbrevDWOSection(),
1803 "section_abbrev_dwo");
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001804 emitSectionSym(Asm, TLOF.getDwarfARangesSection());
Jim Grosbach1e20b962010-07-21 21:21:52 +00001805
Chris Lattner9c69e285532010-04-04 22:59:04 +00001806 if (const MCSection *MacroInfo = TLOF.getDwarfMacroInfoSection())
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001807 emitSectionSym(Asm, MacroInfo);
Bill Wendling94d04b82009-05-20 23:21:38 +00001808
Eric Christopher7a0103c2013-02-07 21:19:50 +00001809 DwarfLineSectionSym =
1810 emitSectionSym(Asm, TLOF.getDwarfLineSection(), "section_line");
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001811 emitSectionSym(Asm, TLOF.getDwarfLocSection());
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00001812 if (GenerateDwarfPubNamesSection)
1813 emitSectionSym(Asm, TLOF.getDwarfPubNamesSection());
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001814 emitSectionSym(Asm, TLOF.getDwarfPubTypesSection());
Jim Grosbach1e20b962010-07-21 21:21:52 +00001815 DwarfStrSectionSym =
Eric Christopher64f824c2012-12-27 02:14:01 +00001816 emitSectionSym(Asm, TLOF.getDwarfStrSection(), "info_string");
Eric Christopher9a9e73b2013-04-07 03:43:09 +00001817 if (useSplitDwarf()) {
Eric Christopher64f824c2012-12-27 02:14:01 +00001818 DwarfStrDWOSectionSym =
1819 emitSectionSym(Asm, TLOF.getDwarfStrDWOSection(), "skel_string");
Eric Christopher9a9e73b2013-04-07 03:43:09 +00001820 DwarfAddrSectionSym =
1821 emitSectionSym(Asm, TLOF.getDwarfAddrSection(), "addr_sec");
1822 }
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001823 DwarfDebugRangeSectionSym = emitSectionSym(Asm, TLOF.getDwarfRangesSection(),
Devang Patelf2548ca2010-04-16 23:33:45 +00001824 "debug_range");
Bill Wendling94d04b82009-05-20 23:21:38 +00001825
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001826 DwarfDebugLocSectionSym = emitSectionSym(Asm, TLOF.getDwarfLocSection(),
Devang Patelc3f5f782010-05-25 23:40:22 +00001827 "section_debug_loc");
1828
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001829 TextSectionSym = emitSectionSym(Asm, TLOF.getTextSection(), "text_begin");
1830 emitSectionSym(Asm, TLOF.getDataSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00001831}
1832
Eric Christopherb6dc8652012-11-27 22:43:45 +00001833// Recursively emits a debug information entry.
Eric Christopher6eebe472012-12-19 22:02:53 +00001834void DwarfDebug::emitDIE(DIE *Die, std::vector<DIEAbbrev *> *Abbrevs) {
Bill Wendling94d04b82009-05-20 23:21:38 +00001835 // Get the abbreviation for this DIE.
1836 unsigned AbbrevNumber = Die->getAbbrevNumber();
Eric Christopher6eebe472012-12-19 22:02:53 +00001837 const DIEAbbrev *Abbrev = Abbrevs->at(AbbrevNumber - 1);
Bill Wendling94d04b82009-05-20 23:21:38 +00001838
Bill Wendling94d04b82009-05-20 23:21:38 +00001839 // Emit the code (index) for the abbreviation.
Chris Lattner3f53c832010-04-04 18:52:31 +00001840 if (Asm->isVerbose())
Chris Lattner894d75a2010-01-22 23:18:42 +00001841 Asm->OutStreamer.AddComment("Abbrev [" + Twine(AbbrevNumber) + "] 0x" +
1842 Twine::utohexstr(Die->getOffset()) + ":0x" +
1843 Twine::utohexstr(Die->getSize()) + " " +
1844 dwarf::TagString(Abbrev->getTag()));
Chris Lattner7e1a8f82010-04-04 19:09:29 +00001845 Asm->EmitULEB128(AbbrevNumber);
Bill Wendling94d04b82009-05-20 23:21:38 +00001846
Eric Christopherf7cef702013-03-29 23:34:06 +00001847 const SmallVectorImpl<DIEValue*> &Values = Die->getValues();
1848 const SmallVectorImpl<DIEAbbrevData> &AbbrevData = Abbrev->getData();
Bill Wendling94d04b82009-05-20 23:21:38 +00001849
1850 // Emit the DIE attribute values.
1851 for (unsigned i = 0, N = Values.size(); i < N; ++i) {
1852 unsigned Attr = AbbrevData[i].getAttribute();
1853 unsigned Form = AbbrevData[i].getForm();
1854 assert(Form && "Too many attributes for DIE (check abbreviation)");
1855
Chris Lattner3f53c832010-04-04 18:52:31 +00001856 if (Asm->isVerbose())
Chris Lattnera8013622010-01-24 18:54:17 +00001857 Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr));
Jim Grosbach1e20b962010-07-21 21:21:52 +00001858
Bill Wendling94d04b82009-05-20 23:21:38 +00001859 switch (Attr) {
Bill Wendling94d04b82009-05-20 23:21:38 +00001860 case dwarf::DW_AT_abstract_origin: {
1861 DIEEntry *E = cast<DIEEntry>(Values[i]);
1862 DIE *Origin = E->getEntry();
Devang Patel53bb5c92009-11-10 23:06:00 +00001863 unsigned Addr = Origin->getOffset();
Manman Renbc3e96f2013-03-12 18:27:15 +00001864 if (Form == dwarf::DW_FORM_ref_addr) {
1865 // For DW_FORM_ref_addr, output the offset from beginning of debug info
1866 // section. Origin->getOffset() returns the offset from start of the
1867 // compile unit.
1868 DwarfUnits &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
1869 Addr += Holder.getCUOffset(Origin->getCompileUnit());
1870 }
Manman Ren624a93e2013-04-04 23:13:11 +00001871 Asm->EmitInt32(Addr);
Bill Wendling94d04b82009-05-20 23:21:38 +00001872 break;
1873 }
Devang Patelf2548ca2010-04-16 23:33:45 +00001874 case dwarf::DW_AT_ranges: {
1875 // DW_AT_range Value encodes offset in debug_range section.
1876 DIEInteger *V = cast<DIEInteger>(Values[i]);
Devang Patelb1fcfbe2010-09-02 16:43:44 +00001877
Nick Lewyckyffccd922012-06-22 01:25:12 +00001878 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections()) {
Devang Patelb1fcfbe2010-09-02 16:43:44 +00001879 Asm->EmitLabelPlusOffset(DwarfDebugRangeSectionSym,
1880 V->getValue(),
1881 4);
1882 } else {
1883 Asm->EmitLabelOffsetDifference(DwarfDebugRangeSectionSym,
1884 V->getValue(),
1885 DwarfDebugRangeSectionSym,
1886 4);
1887 }
Devang Patelf2548ca2010-04-16 23:33:45 +00001888 break;
1889 }
Devang Patelc3f5f782010-05-25 23:40:22 +00001890 case dwarf::DW_AT_location: {
Nick Lewyckyffccd922012-06-22 01:25:12 +00001891 if (DIELabel *L = dyn_cast<DIELabel>(Values[i])) {
1892 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
1893 Asm->EmitLabelReference(L->getValue(), 4);
1894 else
1895 Asm->EmitLabelDifference(L->getValue(), DwarfDebugLocSectionSym, 4);
1896 } else {
Devang Patelc3f5f782010-05-25 23:40:22 +00001897 Values[i]->EmitValue(Asm, Form);
Nick Lewyckyffccd922012-06-22 01:25:12 +00001898 }
Devang Patelc3f5f782010-05-25 23:40:22 +00001899 break;
1900 }
Devang Patel2a361602010-09-29 19:08:08 +00001901 case dwarf::DW_AT_accessibility: {
1902 if (Asm->isVerbose()) {
1903 DIEInteger *V = cast<DIEInteger>(Values[i]);
1904 Asm->OutStreamer.AddComment(dwarf::AccessibilityString(V->getValue()));
1905 }
1906 Values[i]->EmitValue(Asm, Form);
1907 break;
1908 }
Bill Wendling94d04b82009-05-20 23:21:38 +00001909 default:
1910 // Emit an attribute using the defined form.
Chris Lattnerd38fee82010-04-05 00:13:49 +00001911 Values[i]->EmitValue(Asm, Form);
Bill Wendling94d04b82009-05-20 23:21:38 +00001912 break;
1913 }
Bill Wendling94d04b82009-05-20 23:21:38 +00001914 }
1915
1916 // Emit the DIE children if any.
1917 if (Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes) {
1918 const std::vector<DIE *> &Children = Die->getChildren();
1919
1920 for (unsigned j = 0, M = Children.size(); j < M; ++j)
Eric Christopher6eebe472012-12-19 22:02:53 +00001921 emitDIE(Children[j], Abbrevs);
Bill Wendling94d04b82009-05-20 23:21:38 +00001922
Chris Lattner3f53c832010-04-04 18:52:31 +00001923 if (Asm->isVerbose())
Chris Lattner233f52b2010-03-09 23:52:58 +00001924 Asm->OutStreamer.AddComment("End Of Children Mark");
1925 Asm->EmitInt8(0);
Bill Wendling94d04b82009-05-20 23:21:38 +00001926 }
1927}
1928
Eric Christopherb1e66d02012-12-15 00:04:07 +00001929// Emit the various dwarf units to the unit section USection with
1930// the abbreviations going into ASection.
1931void DwarfUnits::emitUnits(DwarfDebug *DD,
1932 const MCSection *USection,
1933 const MCSection *ASection,
1934 const MCSymbol *ASectionSym) {
1935 Asm->OutStreamer.SwitchSection(USection);
Eric Christopherf7cef702013-03-29 23:34:06 +00001936 for (SmallVectorImpl<CompileUnit *>::iterator I = CUs.begin(),
Eric Christopherb1e66d02012-12-15 00:04:07 +00001937 E = CUs.end(); I != E; ++I) {
1938 CompileUnit *TheCU = *I;
Devang Patel163a9f72010-05-10 22:49:55 +00001939 DIE *Die = TheCU->getCUDie();
Jim Grosbach1e20b962010-07-21 21:21:52 +00001940
Devang Patel163a9f72010-05-10 22:49:55 +00001941 // Emit the compile units header.
Eric Christopherb1e66d02012-12-15 00:04:07 +00001942 Asm->OutStreamer
1943 .EmitLabel(Asm->GetTempSymbol(USection->getLabelBeginName(),
1944 TheCU->getUniqueID()));
Jim Grosbach1e20b962010-07-21 21:21:52 +00001945
Devang Patel163a9f72010-05-10 22:49:55 +00001946 // Emit size of content not including length itself
1947 unsigned ContentSize = Die->getSize() +
1948 sizeof(int16_t) + // DWARF version number
1949 sizeof(int32_t) + // Offset Into Abbrev. Section
Devang Patel65705d52011-04-13 19:41:17 +00001950 sizeof(int8_t); // Pointer Size (in bytes)
Jim Grosbach1e20b962010-07-21 21:21:52 +00001951
Devang Patel163a9f72010-05-10 22:49:55 +00001952 Asm->OutStreamer.AddComment("Length of Compilation Unit Info");
1953 Asm->EmitInt32(ContentSize);
1954 Asm->OutStreamer.AddComment("DWARF version number");
1955 Asm->EmitInt16(dwarf::DWARF_VERSION);
1956 Asm->OutStreamer.AddComment("Offset Into Abbrev. Section");
Eric Christopherb1e66d02012-12-15 00:04:07 +00001957 Asm->EmitSectionOffset(Asm->GetTempSymbol(ASection->getLabelBeginName()),
1958 ASectionSym);
Devang Patel163a9f72010-05-10 22:49:55 +00001959 Asm->OutStreamer.AddComment("Address Size (in bytes)");
Chandler Carruth426c2bf2012-11-01 09:14:31 +00001960 Asm->EmitInt8(Asm->getDataLayout().getPointerSize());
Jim Grosbach1e20b962010-07-21 21:21:52 +00001961
Eric Christopher6eebe472012-12-19 22:02:53 +00001962 DD->emitDIE(Die, Abbreviations);
Eric Christopherb1e66d02012-12-15 00:04:07 +00001963 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol(USection->getLabelEndName(),
Eli Benderskyd4a05e02012-12-03 18:45:45 +00001964 TheCU->getUniqueID()));
Devang Patel163a9f72010-05-10 22:49:55 +00001965 }
Bill Wendling94d04b82009-05-20 23:21:38 +00001966}
1967
Manman Renbc3e96f2013-03-12 18:27:15 +00001968/// For a given compile unit DIE, returns offset from beginning of debug info.
1969unsigned DwarfUnits::getCUOffset(DIE *Die) {
Manman Ren4c6f8952013-03-13 18:41:27 +00001970 assert(Die->getTag() == dwarf::DW_TAG_compile_unit &&
1971 "Input DIE should be compile unit in getCUOffset.");
Eric Christopherf7cef702013-03-29 23:34:06 +00001972 for (SmallVectorImpl<CompileUnit *>::iterator I = CUs.begin(),
Manman Renbc3e96f2013-03-12 18:27:15 +00001973 E = CUs.end(); I != E; ++I) {
1974 CompileUnit *TheCU = *I;
1975 if (TheCU->getCUDie() == Die)
1976 return TheCU->getDebugInfoOffset();
1977 }
Manman Ren4c6f8952013-03-13 18:41:27 +00001978 llvm_unreachable("The compile unit DIE should belong to CUs in DwarfUnits.");
Manman Renbc3e96f2013-03-12 18:27:15 +00001979}
1980
Eric Christopher98e237f2012-11-30 23:59:06 +00001981// Emit the debug info section.
1982void DwarfDebug::emitDebugInfo() {
Eric Christopherb1e66d02012-12-15 00:04:07 +00001983 DwarfUnits &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
1984
1985 Holder.emitUnits(this, Asm->getObjFileLowering().getDwarfInfoSection(),
1986 Asm->getObjFileLowering().getDwarfAbbrevSection(),
1987 DwarfAbbrevSectionSym);
Eric Christopher98e237f2012-11-30 23:59:06 +00001988}
1989
Eric Christopherb6dc8652012-11-27 22:43:45 +00001990// Emit the abbreviation section.
Eric Christopher7dc68db2012-11-20 23:30:11 +00001991void DwarfDebug::emitAbbreviations() {
Eric Christopher6eebe472012-12-19 22:02:53 +00001992 if (!useSplitDwarf())
1993 emitAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevSection(),
1994 &Abbreviations);
1995 else
1996 emitSkeletonAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevSection());
1997}
Bill Wendling94d04b82009-05-20 23:21:38 +00001998
Eric Christopher6eebe472012-12-19 22:02:53 +00001999void DwarfDebug::emitAbbrevs(const MCSection *Section,
2000 std::vector<DIEAbbrev *> *Abbrevs) {
2001 // Check to see if it is worth the effort.
2002 if (!Abbrevs->empty()) {
2003 // Start the debug abbrev section.
2004 Asm->OutStreamer.SwitchSection(Section);
2005
2006 MCSymbol *Begin = Asm->GetTempSymbol(Section->getLabelBeginName());
Eric Christopher44fedba2012-12-13 03:00:38 +00002007 Asm->OutStreamer.EmitLabel(Begin);
Bill Wendling94d04b82009-05-20 23:21:38 +00002008
2009 // For each abbrevation.
Eric Christopher6eebe472012-12-19 22:02:53 +00002010 for (unsigned i = 0, N = Abbrevs->size(); i < N; ++i) {
Bill Wendling94d04b82009-05-20 23:21:38 +00002011 // Get abbreviation data
Eric Christopher6eebe472012-12-19 22:02:53 +00002012 const DIEAbbrev *Abbrev = Abbrevs->at(i);
Bill Wendling94d04b82009-05-20 23:21:38 +00002013
2014 // Emit the abbrevations code (base 1 index.)
Chris Lattner7e1a8f82010-04-04 19:09:29 +00002015 Asm->EmitULEB128(Abbrev->getNumber(), "Abbreviation Code");
Bill Wendling94d04b82009-05-20 23:21:38 +00002016
2017 // Emit the abbreviations data.
Chris Lattnerd38fee82010-04-05 00:13:49 +00002018 Abbrev->Emit(Asm);
Bill Wendling94d04b82009-05-20 23:21:38 +00002019 }
2020
2021 // Mark end of abbreviations.
Chris Lattner7e1a8f82010-04-04 19:09:29 +00002022 Asm->EmitULEB128(0, "EOM(3)");
Bill Wendling94d04b82009-05-20 23:21:38 +00002023
Eric Christopher6eebe472012-12-19 22:02:53 +00002024 MCSymbol *End = Asm->GetTempSymbol(Section->getLabelEndName());
Eric Christopher44fedba2012-12-13 03:00:38 +00002025 Asm->OutStreamer.EmitLabel(End);
Bill Wendling94d04b82009-05-20 23:21:38 +00002026 }
2027}
2028
Eric Christopherb6dc8652012-11-27 22:43:45 +00002029// Emit the last address of the section and the end of the line matrix.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002030void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) {
Bill Wendling94d04b82009-05-20 23:21:38 +00002031 // Define last address of section.
Chris Lattner233f52b2010-03-09 23:52:58 +00002032 Asm->OutStreamer.AddComment("Extended Op");
2033 Asm->EmitInt8(0);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002034
Chris Lattner233f52b2010-03-09 23:52:58 +00002035 Asm->OutStreamer.AddComment("Op size");
Chandler Carruth426c2bf2012-11-01 09:14:31 +00002036 Asm->EmitInt8(Asm->getDataLayout().getPointerSize() + 1);
Chris Lattner233f52b2010-03-09 23:52:58 +00002037 Asm->OutStreamer.AddComment("DW_LNE_set_address");
2038 Asm->EmitInt8(dwarf::DW_LNE_set_address);
2039
2040 Asm->OutStreamer.AddComment("Section end label");
Chris Lattnerd85fc6e2010-03-10 01:17:49 +00002041
Chris Lattnerc0215722010-04-04 19:25:43 +00002042 Asm->OutStreamer.EmitSymbolValue(Asm->GetTempSymbol("section_end",SectionEnd),
Eric Christopherca1dd052013-01-09 01:35:34 +00002043 Asm->getDataLayout().getPointerSize());
Bill Wendling94d04b82009-05-20 23:21:38 +00002044
2045 // Mark end of matrix.
Chris Lattner233f52b2010-03-09 23:52:58 +00002046 Asm->OutStreamer.AddComment("DW_LNE_end_sequence");
2047 Asm->EmitInt8(0);
Chris Lattner0ad9c912010-01-22 22:09:00 +00002048 Asm->EmitInt8(1);
Chris Lattner894d75a2010-01-22 23:18:42 +00002049 Asm->EmitInt8(1);
Bill Wendling94d04b82009-05-20 23:21:38 +00002050}
2051
Eric Christopherb6dc8652012-11-27 22:43:45 +00002052// Emit visible names into a hashed accelerator table section.
Eric Christopher09ac3d82011-11-07 09:24:32 +00002053void DwarfDebug::emitAccelNames() {
2054 DwarfAccelTable AT(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset,
2055 dwarf::DW_FORM_data4));
2056 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2057 E = CUMap.end(); I != E; ++I) {
2058 CompileUnit *TheCU = I->second;
Eric Christopher0ffe2b42011-11-10 19:25:34 +00002059 const StringMap<std::vector<DIE*> > &Names = TheCU->getAccelNames();
2060 for (StringMap<std::vector<DIE*> >::const_iterator
Eric Christopher09ac3d82011-11-07 09:24:32 +00002061 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
2062 const char *Name = GI->getKeyData();
Eric Christopherfa03db02012-01-06 23:03:34 +00002063 const std::vector<DIE *> &Entities = GI->second;
Eric Christopher0ffe2b42011-11-10 19:25:34 +00002064 for (std::vector<DIE *>::const_iterator DI = Entities.begin(),
2065 DE = Entities.end(); DI != DE; ++DI)
2066 AT.AddName(Name, (*DI));
Eric Christopher09ac3d82011-11-07 09:24:32 +00002067 }
2068 }
2069
2070 AT.FinalizeTable(Asm, "Names");
2071 Asm->OutStreamer.SwitchSection(
2072 Asm->getObjFileLowering().getDwarfAccelNamesSection());
2073 MCSymbol *SectionBegin = Asm->GetTempSymbol("names_begin");
2074 Asm->OutStreamer.EmitLabel(SectionBegin);
2075
2076 // Emit the full data.
Eric Christopher2e5d8702012-12-20 21:58:36 +00002077 AT.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher09ac3d82011-11-07 09:24:32 +00002078}
2079
Eric Christopher72c16552012-12-20 21:58:40 +00002080// Emit objective C classes and categories into a hashed accelerator table
2081// section.
Eric Christopher09ac3d82011-11-07 09:24:32 +00002082void DwarfDebug::emitAccelObjC() {
2083 DwarfAccelTable AT(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset,
2084 dwarf::DW_FORM_data4));
2085 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2086 E = CUMap.end(); I != E; ++I) {
2087 CompileUnit *TheCU = I->second;
2088 const StringMap<std::vector<DIE*> > &Names = TheCU->getAccelObjC();
2089 for (StringMap<std::vector<DIE*> >::const_iterator
2090 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
2091 const char *Name = GI->getKeyData();
Eric Christopherfa03db02012-01-06 23:03:34 +00002092 const std::vector<DIE *> &Entities = GI->second;
Eric Christopher09ac3d82011-11-07 09:24:32 +00002093 for (std::vector<DIE *>::const_iterator DI = Entities.begin(),
2094 DE = Entities.end(); DI != DE; ++DI)
2095 AT.AddName(Name, (*DI));
2096 }
2097 }
2098
2099 AT.FinalizeTable(Asm, "ObjC");
2100 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering()
2101 .getDwarfAccelObjCSection());
2102 MCSymbol *SectionBegin = Asm->GetTempSymbol("objc_begin");
2103 Asm->OutStreamer.EmitLabel(SectionBegin);
2104
2105 // Emit the full data.
Eric Christopher2e5d8702012-12-20 21:58:36 +00002106 AT.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher09ac3d82011-11-07 09:24:32 +00002107}
2108
Eric Christopherb6dc8652012-11-27 22:43:45 +00002109// Emit namespace dies into a hashed accelerator table.
Eric Christopher09ac3d82011-11-07 09:24:32 +00002110void DwarfDebug::emitAccelNamespaces() {
2111 DwarfAccelTable AT(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset,
2112 dwarf::DW_FORM_data4));
2113 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2114 E = CUMap.end(); I != E; ++I) {
2115 CompileUnit *TheCU = I->second;
Eric Christopher8bd36ea2011-11-10 21:47:55 +00002116 const StringMap<std::vector<DIE*> > &Names = TheCU->getAccelNamespace();
2117 for (StringMap<std::vector<DIE*> >::const_iterator
Eric Christopher09ac3d82011-11-07 09:24:32 +00002118 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
2119 const char *Name = GI->getKeyData();
Eric Christopherfa03db02012-01-06 23:03:34 +00002120 const std::vector<DIE *> &Entities = GI->second;
Eric Christopher8bd36ea2011-11-10 21:47:55 +00002121 for (std::vector<DIE *>::const_iterator DI = Entities.begin(),
2122 DE = Entities.end(); DI != DE; ++DI)
2123 AT.AddName(Name, (*DI));
Eric Christopher09ac3d82011-11-07 09:24:32 +00002124 }
2125 }
2126
2127 AT.FinalizeTable(Asm, "namespac");
2128 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering()
2129 .getDwarfAccelNamespaceSection());
2130 MCSymbol *SectionBegin = Asm->GetTempSymbol("namespac_begin");
2131 Asm->OutStreamer.EmitLabel(SectionBegin);
2132
2133 // Emit the full data.
Eric Christopher2e5d8702012-12-20 21:58:36 +00002134 AT.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher09ac3d82011-11-07 09:24:32 +00002135}
2136
Eric Christopherb6dc8652012-11-27 22:43:45 +00002137// Emit type dies into a hashed accelerator table.
Eric Christopher09ac3d82011-11-07 09:24:32 +00002138void DwarfDebug::emitAccelTypes() {
Eric Christopherc36145f2012-01-06 04:35:23 +00002139 std::vector<DwarfAccelTable::Atom> Atoms;
2140 Atoms.push_back(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset,
2141 dwarf::DW_FORM_data4));
2142 Atoms.push_back(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeTag,
2143 dwarf::DW_FORM_data2));
2144 Atoms.push_back(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeTypeFlags,
2145 dwarf::DW_FORM_data1));
2146 DwarfAccelTable AT(Atoms);
Eric Christopher09ac3d82011-11-07 09:24:32 +00002147 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2148 E = CUMap.end(); I != E; ++I) {
2149 CompileUnit *TheCU = I->second;
Eric Christopherc36145f2012-01-06 04:35:23 +00002150 const StringMap<std::vector<std::pair<DIE*, unsigned > > > &Names
2151 = TheCU->getAccelTypes();
2152 for (StringMap<std::vector<std::pair<DIE*, unsigned> > >::const_iterator
Eric Christopher09ac3d82011-11-07 09:24:32 +00002153 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
2154 const char *Name = GI->getKeyData();
Eric Christopherfa03db02012-01-06 23:03:34 +00002155 const std::vector<std::pair<DIE *, unsigned> > &Entities = GI->second;
Eric Christopherc36145f2012-01-06 04:35:23 +00002156 for (std::vector<std::pair<DIE *, unsigned> >::const_iterator DI
2157 = Entities.begin(), DE = Entities.end(); DI !=DE; ++DI)
2158 AT.AddName(Name, (*DI).first, (*DI).second);
Eric Christopher09ac3d82011-11-07 09:24:32 +00002159 }
2160 }
2161
2162 AT.FinalizeTable(Asm, "types");
2163 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering()
2164 .getDwarfAccelTypesSection());
2165 MCSymbol *SectionBegin = Asm->GetTempSymbol("types_begin");
2166 Asm->OutStreamer.EmitLabel(SectionBegin);
2167
2168 // Emit the full data.
Eric Christopher2e5d8702012-12-20 21:58:36 +00002169 AT.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher09ac3d82011-11-07 09:24:32 +00002170}
2171
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00002172/// emitDebugPubnames - Emit visible names into a debug pubnames section.
2173///
2174void DwarfDebug::emitDebugPubnames() {
2175 const MCSection *ISec = Asm->getObjFileLowering().getDwarfInfoSection();
2176
2177 typedef DenseMap<const MDNode*, CompileUnit*> CUMapType;
2178 for (CUMapType::iterator I = CUMap.begin(), E = CUMap.end(); I != E; ++I) {
2179 CompileUnit *TheCU = I->second;
2180 unsigned ID = TheCU->getUniqueID();
2181
2182 if (TheCU->getGlobalNames().empty())
2183 continue;
2184
2185 // Start the dwarf pubnames section.
2186 Asm->OutStreamer.SwitchSection(
2187 Asm->getObjFileLowering().getDwarfPubNamesSection());
2188
2189 Asm->OutStreamer.AddComment("Length of Public Names Info");
2190 Asm->EmitLabelDifference(Asm->GetTempSymbol("pubnames_end", ID),
2191 Asm->GetTempSymbol("pubnames_begin", ID), 4);
2192
2193 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_begin", ID));
2194
2195 Asm->OutStreamer.AddComment("DWARF Version");
2196 Asm->EmitInt16(dwarf::DWARF_VERSION);
2197
2198 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
2199 Asm->EmitSectionOffset(Asm->GetTempSymbol(ISec->getLabelBeginName(), ID),
2200 DwarfInfoSectionSym);
2201
2202 Asm->OutStreamer.AddComment("Compilation Unit Length");
2203 Asm->EmitLabelDifference(Asm->GetTempSymbol(ISec->getLabelEndName(), ID),
2204 Asm->GetTempSymbol(ISec->getLabelBeginName(), ID),
2205 4);
2206
2207 const StringMap<DIE*> &Globals = TheCU->getGlobalNames();
2208 for (StringMap<DIE*>::const_iterator
2209 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2210 const char *Name = GI->getKeyData();
2211 const DIE *Entity = GI->second;
2212
2213 Asm->OutStreamer.AddComment("DIE offset");
2214 Asm->EmitInt32(Entity->getOffset());
2215
2216 if (Asm->isVerbose())
2217 Asm->OutStreamer.AddComment("External Name");
2218 Asm->OutStreamer.EmitBytes(StringRef(Name, strlen(Name)+1), 0);
2219 }
2220
2221 Asm->OutStreamer.AddComment("End Mark");
2222 Asm->EmitInt32(0);
2223 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_end", ID));
2224 }
2225}
2226
Devang Patel193f7202009-11-24 01:14:22 +00002227void DwarfDebug::emitDebugPubTypes() {
Devang Patel163a9f72010-05-10 22:49:55 +00002228 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2229 E = CUMap.end(); I != E; ++I) {
2230 CompileUnit *TheCU = I->second;
Eric Christopher63701182011-11-07 09:18:35 +00002231 // Start the dwarf pubtypes section.
Devang Patel163a9f72010-05-10 22:49:55 +00002232 Asm->OutStreamer.SwitchSection(
2233 Asm->getObjFileLowering().getDwarfPubTypesSection());
2234 Asm->OutStreamer.AddComment("Length of Public Types Info");
2235 Asm->EmitLabelDifference(
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002236 Asm->GetTempSymbol("pubtypes_end", TheCU->getUniqueID()),
2237 Asm->GetTempSymbol("pubtypes_begin", TheCU->getUniqueID()), 4);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002238
Devang Patel163a9f72010-05-10 22:49:55 +00002239 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_begin",
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002240 TheCU->getUniqueID()));
Jim Grosbach1e20b962010-07-21 21:21:52 +00002241
Devang Patel163a9f72010-05-10 22:49:55 +00002242 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DWARF Version");
2243 Asm->EmitInt16(dwarf::DWARF_VERSION);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002244
Devang Patel163a9f72010-05-10 22:49:55 +00002245 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
Eric Christophercf6b8ad2012-12-15 00:04:04 +00002246 const MCSection *ISec = Asm->getObjFileLowering().getDwarfInfoSection();
2247 Asm->EmitSectionOffset(Asm->GetTempSymbol(ISec->getLabelBeginName(),
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002248 TheCU->getUniqueID()),
Devang Patel163a9f72010-05-10 22:49:55 +00002249 DwarfInfoSectionSym);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002250
Devang Patel163a9f72010-05-10 22:49:55 +00002251 Asm->OutStreamer.AddComment("Compilation Unit Length");
Eric Christophercf6b8ad2012-12-15 00:04:04 +00002252 Asm->EmitLabelDifference(Asm->GetTempSymbol(ISec->getLabelEndName(),
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002253 TheCU->getUniqueID()),
Eric Christophercf6b8ad2012-12-15 00:04:04 +00002254 Asm->GetTempSymbol(ISec->getLabelBeginName(),
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002255 TheCU->getUniqueID()),
Devang Patel163a9f72010-05-10 22:49:55 +00002256 4);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002257
Devang Patel163a9f72010-05-10 22:49:55 +00002258 const StringMap<DIE*> &Globals = TheCU->getGlobalTypes();
2259 for (StringMap<DIE*>::const_iterator
2260 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2261 const char *Name = GI->getKeyData();
Nick Lewycky3bbb6f72011-07-29 03:49:23 +00002262 DIE *Entity = GI->second;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002263
Devang Patel163a9f72010-05-10 22:49:55 +00002264 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
2265 Asm->EmitInt32(Entity->getOffset());
Jim Grosbach1e20b962010-07-21 21:21:52 +00002266
Devang Patel163a9f72010-05-10 22:49:55 +00002267 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("External Name");
Benjamin Kramer983c4572011-11-09 18:16:11 +00002268 // Emit the name with a terminating null byte.
Eric Christopher68ca5622013-01-09 01:57:54 +00002269 Asm->OutStreamer.EmitBytes(StringRef(Name, GI->getKeyLength()+1));
Devang Patel163a9f72010-05-10 22:49:55 +00002270 }
Jim Grosbach1e20b962010-07-21 21:21:52 +00002271
Devang Patel163a9f72010-05-10 22:49:55 +00002272 Asm->OutStreamer.AddComment("End Mark");
Jim Grosbach1e20b962010-07-21 21:21:52 +00002273 Asm->EmitInt32(0);
Devang Patel163a9f72010-05-10 22:49:55 +00002274 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_end",
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002275 TheCU->getUniqueID()));
Devang Patel193f7202009-11-24 01:14:22 +00002276 }
Devang Patel193f7202009-11-24 01:14:22 +00002277}
2278
Eric Christopher64f824c2012-12-27 02:14:01 +00002279// Emit strings into a string section.
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002280void DwarfUnits::emitStrings(const MCSection *StrSection,
2281 const MCSection *OffsetSection = NULL,
2282 const MCSymbol *StrSecSym = NULL) {
Eric Christopher64f824c2012-12-27 02:14:01 +00002283
Eric Christopherb6714222013-01-08 22:22:06 +00002284 if (StringPool.empty()) return;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002285
Chris Lattner0d9d70f2010-03-09 23:38:23 +00002286 // Start the dwarf str section.
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002287 Asm->OutStreamer.SwitchSection(StrSection);
Bill Wendling94d04b82009-05-20 23:21:38 +00002288
Chris Lattnerbc733f52010-03-13 02:17:42 +00002289 // Get all of the string pool entries and put them in an array by their ID so
2290 // we can sort them.
Jim Grosbach1e20b962010-07-21 21:21:52 +00002291 SmallVector<std::pair<unsigned,
Eric Christopherff348452013-01-07 22:40:45 +00002292 StringMapEntry<std::pair<MCSymbol*, unsigned> >*>, 64> Entries;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002293
Chris Lattnerbc733f52010-03-13 02:17:42 +00002294 for (StringMap<std::pair<MCSymbol*, unsigned> >::iterator
Eric Christopherb6714222013-01-08 22:22:06 +00002295 I = StringPool.begin(), E = StringPool.end();
Eric Christopher72c16552012-12-20 21:58:40 +00002296 I != E; ++I)
Chris Lattnerbc733f52010-03-13 02:17:42 +00002297 Entries.push_back(std::make_pair(I->second.second, &*I));
Jim Grosbach1e20b962010-07-21 21:21:52 +00002298
Chris Lattnerbc733f52010-03-13 02:17:42 +00002299 array_pod_sort(Entries.begin(), Entries.end());
Jim Grosbach1e20b962010-07-21 21:21:52 +00002300
Chris Lattnerbc733f52010-03-13 02:17:42 +00002301 for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
Chris Lattner0d9d70f2010-03-09 23:38:23 +00002302 // Emit a label for reference from debug information entries.
Chris Lattnerbc733f52010-03-13 02:17:42 +00002303 Asm->OutStreamer.EmitLabel(Entries[i].second->getValue().first);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002304
Benjamin Kramer983c4572011-11-09 18:16:11 +00002305 // Emit the string itself with a terminating null byte.
Benjamin Kramer0c45f7d2011-11-09 12:12:04 +00002306 Asm->OutStreamer.EmitBytes(StringRef(Entries[i].second->getKeyData(),
Eric Christopherca1dd052013-01-09 01:35:34 +00002307 Entries[i].second->getKeyLength()+1));
Bill Wendling94d04b82009-05-20 23:21:38 +00002308 }
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002309
2310 // If we've got an offset section go ahead and emit that now as well.
2311 if (OffsetSection) {
2312 Asm->OutStreamer.SwitchSection(OffsetSection);
2313 unsigned offset = 0;
Eric Christopher72f7bfb2013-01-15 23:56:56 +00002314 unsigned size = 4; // FIXME: DWARF64 is 8.
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002315 for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
Eric Christopher1ced2082013-01-09 03:52:05 +00002316 Asm->OutStreamer.EmitIntValue(offset, size);
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002317 offset += Entries[i].second->getKeyLength() + 1;
2318 }
2319 }
Bill Wendling94d04b82009-05-20 23:21:38 +00002320}
2321
Eric Christopher72f7bfb2013-01-15 23:56:56 +00002322// Emit strings into a string section.
2323void DwarfUnits::emitAddresses(const MCSection *AddrSection) {
2324
2325 if (AddressPool.empty()) return;
2326
2327 // Start the dwarf addr section.
2328 Asm->OutStreamer.SwitchSection(AddrSection);
2329
2330 // Get all of the string pool entries and put them in an array by their ID so
2331 // we can sort them.
2332 SmallVector<std::pair<unsigned,
2333 std::pair<MCSymbol*, unsigned>* >, 64> Entries;
2334
2335 for (DenseMap<MCSymbol*, std::pair<MCSymbol*, unsigned> >::iterator
2336 I = AddressPool.begin(), E = AddressPool.end();
2337 I != E; ++I)
2338 Entries.push_back(std::make_pair(I->second.second, &(I->second)));
2339
2340 array_pod_sort(Entries.begin(), Entries.end());
2341
2342 for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
2343 // Emit a label for reference from debug information entries.
2344 MCSymbol *Sym = Entries[i].second->first;
2345 if (Sym)
2346 Asm->EmitLabelReference(Entries[i].second->first,
2347 Asm->getDataLayout().getPointerSize());
2348 else
2349 Asm->OutStreamer.EmitIntValue(0, Asm->getDataLayout().getPointerSize());
2350 }
2351
2352}
2353
Eric Christopher64f824c2012-12-27 02:14:01 +00002354// Emit visible names into a debug str section.
2355void DwarfDebug::emitDebugStr() {
2356 DwarfUnits &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
2357 Holder.emitStrings(Asm->getObjFileLowering().getDwarfStrSection());
2358}
2359
Eric Christopherb6dc8652012-11-27 22:43:45 +00002360// Emit visible names into a debug loc section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002361void DwarfDebug::emitDebugLoc() {
Devang Patel80250682010-05-26 23:55:23 +00002362 if (DotDebugLocEntries.empty())
2363 return;
2364
Eric Christopherf7cef702013-03-29 23:34:06 +00002365 for (SmallVectorImpl<DotDebugLocEntry>::iterator
Devang Patel6c3ea902011-02-04 22:57:18 +00002366 I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
2367 I != E; ++I) {
2368 DotDebugLocEntry &Entry = *I;
2369 if (I + 1 != DotDebugLocEntries.end())
2370 Entry.Merge(I+1);
2371 }
2372
Daniel Dunbar83320a02011-03-16 22:16:39 +00002373 // Start the dwarf loc section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002374 Asm->OutStreamer.SwitchSection(
Devang Patelc3f5f782010-05-25 23:40:22 +00002375 Asm->getObjFileLowering().getDwarfLocSection());
Chandler Carruth426c2bf2012-11-01 09:14:31 +00002376 unsigned char Size = Asm->getDataLayout().getPointerSize();
Devang Patel80250682010-05-26 23:55:23 +00002377 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", 0));
2378 unsigned index = 1;
Eric Christopherf7cef702013-03-29 23:34:06 +00002379 for (SmallVectorImpl<DotDebugLocEntry>::iterator
Jim Grosbach1e20b962010-07-21 21:21:52 +00002380 I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
Devang Patel61409622010-07-07 20:12:52 +00002381 I != E; ++I, ++index) {
Devang Patel6c3ea902011-02-04 22:57:18 +00002382 DotDebugLocEntry &Entry = *I;
2383 if (Entry.isMerged()) continue;
Devang Patelc3f5f782010-05-25 23:40:22 +00002384 if (Entry.isEmpty()) {
Eric Christopherca1dd052013-01-09 01:35:34 +00002385 Asm->OutStreamer.EmitIntValue(0, Size);
2386 Asm->OutStreamer.EmitIntValue(0, Size);
Devang Patel80250682010-05-26 23:55:23 +00002387 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", index));
Devang Patelc3f5f782010-05-25 23:40:22 +00002388 } else {
Eric Christopher1ced2082013-01-09 03:52:05 +00002389 Asm->OutStreamer.EmitSymbolValue(Entry.Begin, Size);
2390 Asm->OutStreamer.EmitSymbolValue(Entry.End, Size);
Devang Patelc26f5442011-04-28 02:22:40 +00002391 DIVariable DV(Entry.Variable);
Rafael Espindola5b23b7f2011-05-27 22:05:41 +00002392 Asm->OutStreamer.AddComment("Loc expr size");
2393 MCSymbol *begin = Asm->OutStreamer.getContext().CreateTempSymbol();
2394 MCSymbol *end = Asm->OutStreamer.getContext().CreateTempSymbol();
2395 Asm->EmitLabelDifference(end, begin, 2);
2396 Asm->OutStreamer.EmitLabel(begin);
Devang Patel80efd4e2011-07-08 16:49:43 +00002397 if (Entry.isInt()) {
Devang Patelc4329072011-06-01 22:03:25 +00002398 DIBasicType BTy(DV.getType());
2399 if (BTy.Verify() &&
Eric Christopher0f1c7f62012-11-19 22:42:10 +00002400 (BTy.getEncoding() == dwarf::DW_ATE_signed
Devang Patelc4329072011-06-01 22:03:25 +00002401 || BTy.getEncoding() == dwarf::DW_ATE_signed_char)) {
2402 Asm->OutStreamer.AddComment("DW_OP_consts");
2403 Asm->EmitInt8(dwarf::DW_OP_consts);
Devang Patel80efd4e2011-07-08 16:49:43 +00002404 Asm->EmitSLEB128(Entry.getInt());
Devang Patelc4329072011-06-01 22:03:25 +00002405 } else {
2406 Asm->OutStreamer.AddComment("DW_OP_constu");
2407 Asm->EmitInt8(dwarf::DW_OP_constu);
Devang Patel80efd4e2011-07-08 16:49:43 +00002408 Asm->EmitULEB128(Entry.getInt());
Devang Patelc4329072011-06-01 22:03:25 +00002409 }
Devang Patel80efd4e2011-07-08 16:49:43 +00002410 } else if (Entry.isLocation()) {
Eric Christopher0f1c7f62012-11-19 22:42:10 +00002411 if (!DV.hasComplexAddress())
Devang Patel80efd4e2011-07-08 16:49:43 +00002412 // Regular entry.
Devang Patelc26f5442011-04-28 02:22:40 +00002413 Asm->EmitDwarfRegOp(Entry.Loc);
Devang Patel80efd4e2011-07-08 16:49:43 +00002414 else {
2415 // Complex address entry.
2416 unsigned N = DV.getNumAddrElements();
2417 unsigned i = 0;
2418 if (N >= 2 && DV.getAddrElement(0) == DIBuilder::OpPlus) {
2419 if (Entry.Loc.getOffset()) {
2420 i = 2;
2421 Asm->EmitDwarfRegOp(Entry.Loc);
2422 Asm->OutStreamer.AddComment("DW_OP_deref");
2423 Asm->EmitInt8(dwarf::DW_OP_deref);
2424 Asm->OutStreamer.AddComment("DW_OP_plus_uconst");
2425 Asm->EmitInt8(dwarf::DW_OP_plus_uconst);
2426 Asm->EmitSLEB128(DV.getAddrElement(1));
2427 } else {
2428 // If first address element is OpPlus then emit
2429 // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
2430 MachineLocation Loc(Entry.Loc.getReg(), DV.getAddrElement(1));
2431 Asm->EmitDwarfRegOp(Loc);
2432 i = 2;
2433 }
2434 } else {
2435 Asm->EmitDwarfRegOp(Entry.Loc);
2436 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +00002437
Devang Patel80efd4e2011-07-08 16:49:43 +00002438 // Emit remaining complex address elements.
2439 for (; i < N; ++i) {
2440 uint64_t Element = DV.getAddrElement(i);
2441 if (Element == DIBuilder::OpPlus) {
2442 Asm->EmitInt8(dwarf::DW_OP_plus_uconst);
2443 Asm->EmitULEB128(DV.getAddrElement(++i));
Eric Christopher50120762012-05-08 18:56:00 +00002444 } else if (Element == DIBuilder::OpDeref) {
Eric Christophera80f2d12012-05-08 21:24:39 +00002445 if (!Entry.Loc.isReg())
Eric Christopher50120762012-05-08 18:56:00 +00002446 Asm->EmitInt8(dwarf::DW_OP_deref);
2447 } else
2448 llvm_unreachable("unknown Opcode found in complex address");
Devang Patel80efd4e2011-07-08 16:49:43 +00002449 }
Devang Patelc26f5442011-04-28 02:22:40 +00002450 }
Devang Patelc26f5442011-04-28 02:22:40 +00002451 }
Devang Patel80efd4e2011-07-08 16:49:43 +00002452 // else ... ignore constant fp. There is not any good way to
2453 // to represent them here in dwarf.
Rafael Espindola5b23b7f2011-05-27 22:05:41 +00002454 Asm->OutStreamer.EmitLabel(end);
Devang Patelc3f5f782010-05-25 23:40:22 +00002455 }
2456 }
Bill Wendling94d04b82009-05-20 23:21:38 +00002457}
2458
Eric Christopherb6dc8652012-11-27 22:43:45 +00002459// Emit visible names into a debug aranges section.
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00002460void DwarfDebug::emitDebugARanges() {
Bill Wendling94d04b82009-05-20 23:21:38 +00002461 // Start the dwarf aranges section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002462 Asm->OutStreamer.SwitchSection(
2463 Asm->getObjFileLowering().getDwarfARangesSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002464}
2465
Eric Christopherb6dc8652012-11-27 22:43:45 +00002466// Emit visible names into a debug ranges section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002467void DwarfDebug::emitDebugRanges() {
Bill Wendling94d04b82009-05-20 23:21:38 +00002468 // Start the dwarf ranges section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002469 Asm->OutStreamer.SwitchSection(
Devang Patelf2548ca2010-04-16 23:33:45 +00002470 Asm->getObjFileLowering().getDwarfRangesSection());
Chandler Carruth426c2bf2012-11-01 09:14:31 +00002471 unsigned char Size = Asm->getDataLayout().getPointerSize();
Eric Christopherf7cef702013-03-29 23:34:06 +00002472 for (SmallVectorImpl<const MCSymbol *>::iterator
Jim Grosbach1e20b962010-07-21 21:21:52 +00002473 I = DebugRangeSymbols.begin(), E = DebugRangeSymbols.end();
Devang Pateleac9c072010-04-27 19:46:33 +00002474 I != E; ++I) {
2475 if (*I)
Eric Christopher1ced2082013-01-09 03:52:05 +00002476 Asm->OutStreamer.EmitSymbolValue(const_cast<MCSymbol*>(*I), Size);
Devang Patelf2548ca2010-04-16 23:33:45 +00002477 else
Eric Christopherca1dd052013-01-09 01:35:34 +00002478 Asm->OutStreamer.EmitIntValue(0, Size);
Devang Patelf2548ca2010-04-16 23:33:45 +00002479 }
Bill Wendling94d04b82009-05-20 23:21:38 +00002480}
2481
Eric Christopherb6dc8652012-11-27 22:43:45 +00002482// Emit visible names into a debug macinfo section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002483void DwarfDebug::emitDebugMacInfo() {
Daniel Dunbarf612ff62009-09-19 20:40:05 +00002484 if (const MCSection *LineInfo =
Chris Lattner18a4c162009-08-02 07:24:22 +00002485 Asm->getObjFileLowering().getDwarfMacroInfoSection()) {
Bill Wendling94d04b82009-05-20 23:21:38 +00002486 // Start the dwarf macinfo section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002487 Asm->OutStreamer.SwitchSection(LineInfo);
Bill Wendling94d04b82009-05-20 23:21:38 +00002488 }
2489}
2490
Eric Christopherb6dc8652012-11-27 22:43:45 +00002491// Emit inline info using following format.
2492// Section Header:
2493// 1. length of section
2494// 2. Dwarf version number
2495// 3. address size.
2496//
2497// Entries (one "entry" for each function that was inlined):
2498//
2499// 1. offset into __debug_str section for MIPS linkage name, if exists;
2500// otherwise offset into __debug_str for regular function name.
2501// 2. offset into __debug_str section for regular function name.
2502// 3. an unsigned LEB128 number indicating the number of distinct inlining
2503// instances for the function.
2504//
2505// The rest of the entry consists of a {die_offset, low_pc} pair for each
2506// inlined instance; the die_offset points to the inlined_subroutine die in the
2507// __debug_info section, and the low_pc is the starting address for the
2508// inlining instance.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002509void DwarfDebug::emitDebugInlineInfo() {
Eric Christopherb83e2bb2012-03-02 02:11:47 +00002510 if (!Asm->MAI->doesDwarfUseInlineInfoSection())
Bill Wendling94d04b82009-05-20 23:21:38 +00002511 return;
2512
Devang Patel163a9f72010-05-10 22:49:55 +00002513 if (!FirstCU)
Bill Wendling94d04b82009-05-20 23:21:38 +00002514 return;
2515
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002516 Asm->OutStreamer.SwitchSection(
2517 Asm->getObjFileLowering().getDwarfDebugInlineSection());
Chris Lattner0ad9c912010-01-22 22:09:00 +00002518
Chris Lattner233f52b2010-03-09 23:52:58 +00002519 Asm->OutStreamer.AddComment("Length of Debug Inlined Information Entry");
Chris Lattnera6437182010-04-04 19:58:12 +00002520 Asm->EmitLabelDifference(Asm->GetTempSymbol("debug_inlined_end", 1),
2521 Asm->GetTempSymbol("debug_inlined_begin", 1), 4);
Bill Wendling94d04b82009-05-20 23:21:38 +00002522
Chris Lattnerc0215722010-04-04 19:25:43 +00002523 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_begin", 1));
Bill Wendling94d04b82009-05-20 23:21:38 +00002524
Chris Lattner233f52b2010-03-09 23:52:58 +00002525 Asm->OutStreamer.AddComment("Dwarf Version");
2526 Asm->EmitInt16(dwarf::DWARF_VERSION);
2527 Asm->OutStreamer.AddComment("Address Size (in bytes)");
Chandler Carruth426c2bf2012-11-01 09:14:31 +00002528 Asm->EmitInt8(Asm->getDataLayout().getPointerSize());
Bill Wendling94d04b82009-05-20 23:21:38 +00002529
Eric Christopherf7cef702013-03-29 23:34:06 +00002530 for (SmallVectorImpl<const MDNode *>::iterator I = InlinedSPNodes.begin(),
Devang Patel53bb5c92009-11-10 23:06:00 +00002531 E = InlinedSPNodes.end(); I != E; ++I) {
Jim Grosbach31ef40e2009-11-21 23:12:12 +00002532
Devang Patele9f8f5e2010-05-07 20:54:48 +00002533 const MDNode *Node = *I;
2534 DenseMap<const MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator II
Jim Grosbach7ab38df2009-11-22 19:20:36 +00002535 = InlineInfo.find(Node);
Eric Christopherf7cef702013-03-29 23:34:06 +00002536 SmallVectorImpl<InlineInfoLabels> &Labels = II->second;
Devang Patele4b27562009-08-28 23:24:31 +00002537 DISubprogram SP(Node);
Devang Patel65dbc902009-11-25 17:36:49 +00002538 StringRef LName = SP.getLinkageName();
2539 StringRef Name = SP.getName();
Bill Wendling94d04b82009-05-20 23:21:38 +00002540
Chris Lattner233f52b2010-03-09 23:52:58 +00002541 Asm->OutStreamer.AddComment("MIPS linkage name");
Eric Christopher50e26612012-03-02 01:57:52 +00002542 if (LName.empty())
Eric Christopher2e5d8702012-12-20 21:58:36 +00002543 Asm->EmitSectionOffset(InfoHolder.getStringPoolEntry(Name),
2544 DwarfStrSectionSym);
Eric Christopher50e26612012-03-02 01:57:52 +00002545 else
Eric Christopher2e5d8702012-12-20 21:58:36 +00002546 Asm->EmitSectionOffset(InfoHolder
2547 .getStringPoolEntry(getRealLinkageName(LName)),
Chris Lattner6189ed12010-04-04 23:25:33 +00002548 DwarfStrSectionSym);
Devang Patel53bb5c92009-11-10 23:06:00 +00002549
Chris Lattner233f52b2010-03-09 23:52:58 +00002550 Asm->OutStreamer.AddComment("Function name");
Eric Christopher2e5d8702012-12-20 21:58:36 +00002551 Asm->EmitSectionOffset(InfoHolder.getStringPoolEntry(Name),
2552 DwarfStrSectionSym);
Chris Lattner7e1a8f82010-04-04 19:09:29 +00002553 Asm->EmitULEB128(Labels.size(), "Inline count");
Bill Wendling94d04b82009-05-20 23:21:38 +00002554
Eric Christopherf7cef702013-03-29 23:34:06 +00002555 for (SmallVectorImpl<InlineInfoLabels>::iterator LI = Labels.begin(),
Bill Wendling94d04b82009-05-20 23:21:38 +00002556 LE = Labels.end(); LI != LE; ++LI) {
Chris Lattner3f53c832010-04-04 18:52:31 +00002557 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
Chris Lattner6ed0f902010-03-09 00:31:02 +00002558 Asm->EmitInt32(LI->second->getOffset());
Bill Wendling94d04b82009-05-20 23:21:38 +00002559
Chris Lattner3f53c832010-04-04 18:52:31 +00002560 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("low_pc");
Chris Lattnerd38fee82010-04-05 00:13:49 +00002561 Asm->OutStreamer.EmitSymbolValue(LI->first,
Eric Christopher1ced2082013-01-09 03:52:05 +00002562 Asm->getDataLayout().getPointerSize());
Bill Wendling94d04b82009-05-20 23:21:38 +00002563 }
2564 }
2565
Chris Lattnerc0215722010-04-04 19:25:43 +00002566 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_end", 1));
Bill Wendling94d04b82009-05-20 23:21:38 +00002567}
Eric Christopher98e237f2012-11-30 23:59:06 +00002568
Eric Christopher0b944ee2012-12-11 19:42:09 +00002569// DWARF5 Experimental Separate Dwarf emitters.
Eric Christopher98e237f2012-11-30 23:59:06 +00002570
2571// This DIE has the following attributes: DW_AT_comp_dir, DW_AT_stmt_list,
2572// DW_AT_low_pc, DW_AT_high_pc, DW_AT_ranges, DW_AT_dwo_name, DW_AT_dwo_id,
2573// DW_AT_ranges_base, DW_AT_addr_base. If DW_AT_ranges is present,
2574// DW_AT_low_pc and DW_AT_high_pc are not used, and vice versa.
Eric Christopher4daaed12012-12-10 19:51:21 +00002575CompileUnit *DwarfDebug::constructSkeletonCU(const MDNode *N) {
Eric Christopher98e237f2012-11-30 23:59:06 +00002576 DICompileUnit DIUnit(N);
Eric Christopher98e237f2012-11-30 23:59:06 +00002577 CompilationDir = DIUnit.getDirectory();
Eric Christopher98e237f2012-11-30 23:59:06 +00002578
2579 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002580 CompileUnit *NewCU = new CompileUnit(GlobalCUIndexCount++,
Eric Christopher2e5d8702012-12-20 21:58:36 +00002581 DIUnit.getLanguage(), Die, Asm,
Eric Christopher64f824c2012-12-27 02:14:01 +00002582 this, &SkeletonHolder);
Eric Christopher446b88f2013-01-17 03:00:04 +00002583
Eric Christopher3ce51a92013-02-22 23:50:08 +00002584 NewCU->addLocalString(Die, dwarf::DW_AT_GNU_dwo_name,
2585 DIUnit.getSplitDebugFilename());
Eric Christopher98e237f2012-11-30 23:59:06 +00002586
Eric Christopher208cc6f2013-02-05 07:31:55 +00002587 // This should be a unique identifier when we want to build .dwp files.
2588 NewCU->addUInt(Die, dwarf::DW_AT_GNU_dwo_id, dwarf::DW_FORM_data8, 0);
Eric Christopherd96c72a2013-01-17 02:59:59 +00002589
Eric Christopher1b0cd2f2013-04-22 07:51:08 +00002590 // Relocate to the beginning of the addr_base section, else 0 for the
2591 // beginning of the one for this compile unit.
Eric Christopher9a9e73b2013-04-07 03:43:09 +00002592 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
2593 NewCU->addLabel(Die, dwarf::DW_AT_GNU_addr_base, dwarf::DW_FORM_sec_offset,
2594 DwarfAddrSectionSym);
2595 else
Eric Christopher1b0cd2f2013-04-22 07:51:08 +00002596 NewCU->addUInt(Die, dwarf::DW_AT_GNU_addr_base,
2597 dwarf::DW_FORM_sec_offset, 0);
Eric Christopher98e237f2012-11-30 23:59:06 +00002598
2599 // 2.17.1 requires that we use DW_AT_low_pc for a single entry point
Eric Christopher72f7bfb2013-01-15 23:56:56 +00002600 // into an entity. We're using 0, or a NULL label for this.
Eric Christopher98e237f2012-11-30 23:59:06 +00002601 NewCU->addUInt(Die, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, 0);
Eric Christopher72f7bfb2013-01-15 23:56:56 +00002602
Eric Christopher98e237f2012-11-30 23:59:06 +00002603 // DW_AT_stmt_list is a offset of line number information for this
2604 // compile unit in debug_line section.
Eric Christopher9a9e73b2013-04-07 03:43:09 +00002605 // FIXME: Should handle multiple compile units.
Eric Christopher98e237f2012-11-30 23:59:06 +00002606 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
Eric Christopher446b88f2013-01-17 03:00:04 +00002607 NewCU->addLabel(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_sec_offset,
Eric Christopher7a0103c2013-02-07 21:19:50 +00002608 DwarfLineSectionSym);
Eric Christopher98e237f2012-11-30 23:59:06 +00002609 else
Eric Christopher446b88f2013-01-17 03:00:04 +00002610 NewCU->addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_sec_offset, 0);
Eric Christopher98e237f2012-11-30 23:59:06 +00002611
2612 if (!CompilationDir.empty())
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002613 NewCU->addLocalString(Die, dwarf::DW_AT_comp_dir, CompilationDir);
Eric Christopher98e237f2012-11-30 23:59:06 +00002614
Eric Christopher0e3e9b72012-12-10 23:34:43 +00002615 SkeletonHolder.addUnit(NewCU);
Eric Christopher01776a52013-02-06 21:53:56 +00002616 SkeletonCUs.push_back(NewCU);
Eric Christopher0e3e9b72012-12-10 23:34:43 +00002617
Eric Christopher98e237f2012-11-30 23:59:06 +00002618 return NewCU;
2619}
2620
Eric Christopher6eebe472012-12-19 22:02:53 +00002621void DwarfDebug::emitSkeletonAbbrevs(const MCSection *Section) {
2622 assert(useSplitDwarf() && "No split dwarf debug info?");
2623 emitAbbrevs(Section, &SkeletonAbbrevs);
Eric Christopher98e237f2012-11-30 23:59:06 +00002624}
2625
Eric Christopher0b944ee2012-12-11 19:42:09 +00002626// Emit the .debug_info.dwo section for separated dwarf. This contains the
2627// compile units that would normally be in debug_info.
Eric Christopher98e237f2012-11-30 23:59:06 +00002628void DwarfDebug::emitDebugInfoDWO() {
Eric Christopher4daaed12012-12-10 19:51:21 +00002629 assert(useSplitDwarf() && "No split dwarf debug info?");
Eric Christopherb1e66d02012-12-15 00:04:07 +00002630 InfoHolder.emitUnits(this, Asm->getObjFileLowering().getDwarfInfoDWOSection(),
Eric Christopher6eebe472012-12-19 22:02:53 +00002631 Asm->getObjFileLowering().getDwarfAbbrevDWOSection(),
2632 DwarfAbbrevDWOSectionSym);
2633}
2634
2635// Emit the .debug_abbrev.dwo section for separated dwarf. This contains the
2636// abbreviations for the .debug_info.dwo section.
2637void DwarfDebug::emitDebugAbbrevDWO() {
2638 assert(useSplitDwarf() && "No split dwarf?");
Eric Christopher72c16552012-12-20 21:58:40 +00002639 emitAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevDWOSection(),
2640 &Abbreviations);
Eric Christopher98e237f2012-11-30 23:59:06 +00002641}
Eric Christopher64f824c2012-12-27 02:14:01 +00002642
2643// Emit the .debug_str.dwo section for separated dwarf. This contains the
2644// string section and is identical in format to traditional .debug_str
2645// sections.
2646void DwarfDebug::emitDebugStrDWO() {
2647 assert(useSplitDwarf() && "No split dwarf?");
Eric Christopherff348452013-01-07 22:40:45 +00002648 const MCSection *OffSec = Asm->getObjFileLowering()
2649 .getDwarfStrOffDWOSection();
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002650 const MCSymbol *StrSym = DwarfStrSectionSym;
2651 InfoHolder.emitStrings(Asm->getObjFileLowering().getDwarfStrDWOSection(),
2652 OffSec, StrSym);
Eric Christopher64f824c2012-12-27 02:14:01 +00002653}