blob: 1813132f877f25bcf4719a9d57d9749846949b6f [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
Eric Christopher20f47ab2012-08-23 22:36:40 +000057namespace {
58 enum DefaultOnOff {
59 Default, Enable, Disable
60 };
61}
Eric Christopher09ac3d82011-11-07 09:24:32 +000062
Eric Christopher20f47ab2012-08-23 22:36:40 +000063static cl::opt<DefaultOnOff> DwarfAccelTables("dwarf-accel-tables", cl::Hidden,
64 cl::desc("Output prototype dwarf accelerator tables."),
65 cl::values(
66 clEnumVal(Default, "Default for platform"),
67 clEnumVal(Enable, "Enabled"),
68 clEnumVal(Disable, "Disabled"),
69 clEnumValEnd),
70 cl::init(Default));
71
72static cl::opt<DefaultOnOff> DarwinGDBCompat("darwin-gdb-compat", cl::Hidden,
Eric Christopher10cb7442012-08-23 07:10:46 +000073 cl::desc("Compatibility with Darwin gdb."),
Eric Christopher20f47ab2012-08-23 22:36:40 +000074 cl::values(
75 clEnumVal(Default, "Default for platform"),
76 clEnumVal(Enable, "Enabled"),
77 clEnumVal(Disable, "Disabled"),
78 clEnumValEnd),
79 cl::init(Default));
Eric Christopher10cb7442012-08-23 07:10:46 +000080
Eric Christopher4daaed12012-12-10 19:51:21 +000081static cl::opt<DefaultOnOff> SplitDwarf("split-dwarf", cl::Hidden,
82 cl::desc("Output prototype dwarf split debug info."),
Eric Christopherf5b6dcd2012-11-12 22:22:20 +000083 cl::values(
84 clEnumVal(Default, "Default for platform"),
85 clEnumVal(Enable, "Enabled"),
86 clEnumVal(Disable, "Disabled"),
87 clEnumValEnd),
88 cl::init(Default));
89
Bill Wendling5f017e82010-04-07 09:28:04 +000090namespace {
91 const char *DWARFGroupName = "DWARF Emission";
92 const char *DbgTimerName = "DWARF Debug Writer";
93} // end anonymous namespace
94
Bill Wendling0310d762009-05-15 09:23:25 +000095//===----------------------------------------------------------------------===//
96
Eric Christopherb6dc8652012-11-27 22:43:45 +000097// Configuration values for initial hash set sizes (log2).
98//
Bill Wendling0310d762009-05-15 09:23:25 +000099static const unsigned InitAbbreviationsSetSize = 9; // log2(512)
Bill Wendling0310d762009-05-15 09:23:25 +0000100
101namespace llvm {
102
Nick Lewycky3bbb6f72011-07-29 03:49:23 +0000103DIType DbgVariable::getType() const {
Devang Patel3cbee302011-04-12 22:53:02 +0000104 DIType Ty = Var.getType();
105 // FIXME: isBlockByrefVariable should be reformulated in terms of complex
106 // addresses instead.
107 if (Var.isBlockByrefVariable()) {
108 /* Byref variables, in Blocks, are declared by the programmer as
109 "SomeType VarName;", but the compiler creates a
110 __Block_byref_x_VarName struct, and gives the variable VarName
111 either the struct, or a pointer to the struct, as its type. This
112 is necessary for various behind-the-scenes things the compiler
113 needs to do with by-reference variables in blocks.
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000114
Devang Patel3cbee302011-04-12 22:53:02 +0000115 However, as far as the original *programmer* is concerned, the
116 variable should still have type 'SomeType', as originally declared.
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000117
Devang Patel3cbee302011-04-12 22:53:02 +0000118 The following function dives into the __Block_byref_x_VarName
119 struct to find the original type of the variable. This will be
120 passed back to the code generating the type for the Debug
121 Information Entry for the variable 'VarName'. 'VarName' will then
122 have the original type 'SomeType' in its debug information.
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000123
Devang Patel3cbee302011-04-12 22:53:02 +0000124 The original type 'SomeType' will be the type of the field named
125 'VarName' inside the __Block_byref_x_VarName struct.
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000126
Devang Patel3cbee302011-04-12 22:53:02 +0000127 NOTE: In order for this to not completely fail on the debugger
128 side, the Debug Information Entry for the variable VarName needs to
129 have a DW_AT_location that tells the debugger how to unwind through
130 the pointers and __Block_byref_x_VarName struct to find the actual
131 value of the variable. The function addBlockByrefType does this. */
132 DIType subType = Ty;
133 unsigned tag = Ty.getTag();
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000134
Devang Patel3cbee302011-04-12 22:53:02 +0000135 if (tag == dwarf::DW_TAG_pointer_type) {
136 DIDerivedType DTy = DIDerivedType(Ty);
137 subType = DTy.getTypeDerivedFrom();
138 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000139
Devang Patel3cbee302011-04-12 22:53:02 +0000140 DICompositeType blockStruct = DICompositeType(subType);
141 DIArray Elements = blockStruct.getTypeArray();
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000142
Devang Patel3cbee302011-04-12 22:53:02 +0000143 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
144 DIDescriptor Element = Elements.getElement(i);
145 DIDerivedType DT = DIDerivedType(Element);
146 if (getName() == DT.getName())
147 return (DT.getTypeDerivedFrom());
Devang Patel8bd11de2010-08-09 21:01:39 +0000148 }
Devang Patel8bd11de2010-08-09 21:01:39 +0000149 }
Devang Patel3cbee302011-04-12 22:53:02 +0000150 return Ty;
151}
Bill Wendling0310d762009-05-15 09:23:25 +0000152
Chris Lattnerea761862010-04-05 04:09:20 +0000153} // end llvm namespace
Bill Wendling0310d762009-05-15 09:23:25 +0000154
Chris Lattner49cd6642010-04-05 05:11:15 +0000155DwarfDebug::DwarfDebug(AsmPrinter *A, Module *M)
Eric Christopher28bd25a2012-12-10 19:51:13 +0000156 : Asm(A), MMI(Asm->MMI), FirstCU(0),
Jim Grosbach1e20b962010-07-21 21:21:52 +0000157 AbbreviationsSet(InitAbbreviationsSetSize),
Eric Christopherb6714222013-01-08 22:22:06 +0000158 SourceIdMap(DIEValueAllocator),
Eric Christopher0e3e9b72012-12-10 23:34:43 +0000159 PrevLabel(NULL), GlobalCUIndexCount(0),
Eric Christopherb6714222013-01-08 22:22:06 +0000160 InfoHolder(A, &AbbreviationsSet, &Abbreviations, "info_string",
161 DIEValueAllocator),
Eric Christopher6eebe472012-12-19 22:02:53 +0000162 SkeletonCU(0),
163 SkeletonAbbrevSet(InitAbbreviationsSetSize),
Eric Christopherb6714222013-01-08 22:22:06 +0000164 SkeletonHolder(A, &SkeletonAbbrevSet, &SkeletonAbbrevs, "skel_string",
165 DIEValueAllocator) {
Jim Grosbach1e20b962010-07-21 21:21:52 +0000166
Rafael Espindolaf2b04232011-05-06 14:56:22 +0000167 DwarfInfoSectionSym = DwarfAbbrevSectionSym = 0;
Chris Lattner4ad1efe2010-04-04 23:10:38 +0000168 DwarfStrSectionSym = TextSectionSym = 0;
Jim Grosbach1e20b962010-07-21 21:21:52 +0000169 DwarfDebugRangeSectionSym = DwarfDebugLocSectionSym = 0;
Eric Christopher64f824c2012-12-27 02:14:01 +0000170 DwarfAbbrevDWOSectionSym = DwarfStrDWOSectionSym = 0;
Devang Patelc3f5f782010-05-25 23:40:22 +0000171 FunctionBeginSym = FunctionEndSym = 0;
Eric Christopher60777d82012-04-02 17:58:52 +0000172
Eric Christopher10cb7442012-08-23 07:10:46 +0000173 // Turn on accelerator tables and older gdb compatibility
174 // for Darwin.
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000175 bool IsDarwin = Triple(M->getTargetTriple()).isOSDarwin();
Eric Christopher20f47ab2012-08-23 22:36:40 +0000176 if (DarwinGDBCompat == Default) {
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000177 if (IsDarwin)
178 IsDarwinGDBCompat = true;
Eric Christopher20f47ab2012-08-23 22:36:40 +0000179 else
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000180 IsDarwinGDBCompat = false;
Eric Christopher20f47ab2012-08-23 22:36:40 +0000181 } else
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000182 IsDarwinGDBCompat = DarwinGDBCompat == Enable ? true : false;
Eric Christopherc1610fa2012-08-23 22:36:36 +0000183
Eric Christopher20f47ab2012-08-23 22:36:40 +0000184 if (DwarfAccelTables == Default) {
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000185 if (IsDarwin)
186 HasDwarfAccelTables = true;
Eric Christopher20f47ab2012-08-23 22:36:40 +0000187 else
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000188 HasDwarfAccelTables = false;
Eric Christopher20f47ab2012-08-23 22:36:40 +0000189 } else
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000190 HasDwarfAccelTables = DwarfAccelTables == Enable ? true : false;
Eric Christopher20f47ab2012-08-23 22:36:40 +0000191
Eric Christopher4daaed12012-12-10 19:51:21 +0000192 if (SplitDwarf == Default)
193 HasSplitDwarf = false;
Eric Christopherf5b6dcd2012-11-12 22:22:20 +0000194 else
Eric Christopher4daaed12012-12-10 19:51:21 +0000195 HasSplitDwarf = SplitDwarf == Enable ? true : false;
Eric Christopherf5b6dcd2012-11-12 22:22:20 +0000196
Dan Gohman03c3dc72010-06-18 15:56:31 +0000197 {
198 NamedRegionTimer T(DbgTimerName, DWARFGroupName, TimePassesIsEnabled);
Eric Christopherc4639d62012-11-19 22:42:15 +0000199 beginModule();
Torok Edwin9c421072010-04-07 10:44:46 +0000200 }
Bill Wendling0310d762009-05-15 09:23:25 +0000201}
202DwarfDebug::~DwarfDebug() {
Bill Wendling0310d762009-05-15 09:23:25 +0000203}
204
Eric Christopherb6dc8652012-11-27 22:43:45 +0000205// Switch to the specified MCSection and emit an assembler
206// temporary label to it if SymbolStem is specified.
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000207static MCSymbol *emitSectionSym(AsmPrinter *Asm, const MCSection *Section,
Eric Christopherd8a87522011-11-07 09:18:38 +0000208 const char *SymbolStem = 0) {
209 Asm->OutStreamer.SwitchSection(Section);
210 if (!SymbolStem) return 0;
211
212 MCSymbol *TmpSym = Asm->GetTempSymbol(SymbolStem);
213 Asm->OutStreamer.EmitLabel(TmpSym);
214 return TmpSym;
215}
216
Eric Christopher2e5d8702012-12-20 21:58:36 +0000217MCSymbol *DwarfUnits::getStringPoolSym() {
Eric Christopher64f824c2012-12-27 02:14:01 +0000218 return Asm->GetTempSymbol(StringPref);
Nick Lewycky390c40d2011-10-27 06:44:11 +0000219}
220
Eric Christopher2e5d8702012-12-20 21:58:36 +0000221MCSymbol *DwarfUnits::getStringPoolEntry(StringRef Str) {
222 std::pair<MCSymbol*, unsigned> &Entry =
Eric Christopherb6714222013-01-08 22:22:06 +0000223 StringPool.GetOrCreateValue(Str).getValue();
Chris Lattnerbc733f52010-03-13 02:17:42 +0000224 if (Entry.first) return Entry.first;
225
226 Entry.second = NextStringPoolNumber++;
Eric Christopher64f824c2012-12-27 02:14:01 +0000227 return Entry.first = Asm->GetTempSymbol(StringPref, Entry.second);
Chris Lattnerbc733f52010-03-13 02:17:42 +0000228}
229
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000230unsigned DwarfUnits::getStringPoolIndex(StringRef Str) {
231 std::pair<MCSymbol*, unsigned> &Entry =
Eric Christopherb6714222013-01-08 22:22:06 +0000232 StringPool.GetOrCreateValue(Str).getValue();
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000233 if (Entry.first) return Entry.second;
234
235 Entry.second = NextStringPoolNumber++;
236 Entry.first = Asm->GetTempSymbol(StringPref, Entry.second);
237 return Entry.second;
238}
239
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000240unsigned DwarfUnits::getAddrPoolIndex(MCSymbol *Sym) {
241 std::pair<MCSymbol*, unsigned> &Entry = AddressPool[Sym];
242 if (Entry.first) return Entry.second;
243
244 Entry.second = NextAddrPoolNumber++;
245 Entry.first = Sym;
246 return Entry.second;
247}
248
Eric Christopherb6dc8652012-11-27 22:43:45 +0000249// Define a unique number for the abbreviation.
250//
Eric Christopher0e3e9b72012-12-10 23:34:43 +0000251void DwarfUnits::assignAbbrevNumber(DIEAbbrev &Abbrev) {
Bill Wendling0310d762009-05-15 09:23:25 +0000252 // Profile the node so that we can make it unique.
253 FoldingSetNodeID ID;
254 Abbrev.Profile(ID);
255
256 // Check the set for priors.
Eric Christopher0e3e9b72012-12-10 23:34:43 +0000257 DIEAbbrev *InSet = AbbreviationsSet->GetOrInsertNode(&Abbrev);
Bill Wendling0310d762009-05-15 09:23:25 +0000258
259 // If it's newly added.
260 if (InSet == &Abbrev) {
261 // Add to abbreviation list.
Eric Christopher0e3e9b72012-12-10 23:34:43 +0000262 Abbreviations->push_back(&Abbrev);
Bill Wendling0310d762009-05-15 09:23:25 +0000263
264 // Assign the vector position + 1 as its number.
Eric Christopher0e3e9b72012-12-10 23:34:43 +0000265 Abbrev.setNumber(Abbreviations->size());
Bill Wendling0310d762009-05-15 09:23:25 +0000266 } else {
267 // Assign existing abbreviation number.
268 Abbrev.setNumber(InSet->getNumber());
269 }
270}
271
Eric Christopherb6dc8652012-11-27 22:43:45 +0000272// If special LLVM prefix that is used to inform the asm
273// printer to not emit usual symbol prefix before the symbol name is used then
274// return linkage name after skipping this special LLVM prefix.
Devang Patel351ca332010-01-05 01:46:14 +0000275static StringRef getRealLinkageName(StringRef LinkageName) {
276 char One = '\1';
277 if (LinkageName.startswith(StringRef(&One, 1)))
278 return LinkageName.substr(1);
279 return LinkageName;
280}
281
Eric Christopher0ffe2b42011-11-10 19:25:34 +0000282static bool isObjCClass(StringRef Name) {
283 return Name.startswith("+") || Name.startswith("-");
284}
285
286static bool hasObjCCategory(StringRef Name) {
287 if (!isObjCClass(Name)) return false;
288
289 size_t pos = Name.find(')');
290 if (pos != std::string::npos) {
291 if (Name[pos+1] != ' ') return false;
292 return true;
293 }
294 return false;
295}
296
297static void getObjCClassCategory(StringRef In, StringRef &Class,
298 StringRef &Category) {
299 if (!hasObjCCategory(In)) {
300 Class = In.slice(In.find('[') + 1, In.find(' '));
301 Category = "";
302 return;
303 }
304
305 Class = In.slice(In.find('[') + 1, In.find('('));
306 Category = In.slice(In.find('[') + 1, In.find(' '));
307 return;
308}
309
310static StringRef getObjCMethodName(StringRef In) {
311 return In.slice(In.find(' ') + 1, In.find(']'));
312}
313
314// Add the various names to the Dwarf accelerator table names.
315static void addSubprogramNames(CompileUnit *TheCU, DISubprogram SP,
316 DIE* Die) {
317 if (!SP.isDefinition()) return;
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000318
Eric Christopher0ffe2b42011-11-10 19:25:34 +0000319 TheCU->addAccelName(SP.getName(), Die);
320
321 // If the linkage name is different than the name, go ahead and output
322 // that as well into the name table.
323 if (SP.getLinkageName() != "" && SP.getName() != SP.getLinkageName())
324 TheCU->addAccelName(SP.getLinkageName(), Die);
325
326 // If this is an Objective-C selector name add it to the ObjC accelerator
327 // too.
328 if (isObjCClass(SP.getName())) {
329 StringRef Class, Category;
330 getObjCClassCategory(SP.getName(), Class, Category);
331 TheCU->addAccelObjC(Class, Die);
332 if (Category != "")
333 TheCU->addAccelObjC(Category, Die);
334 // Also add the base method name to the name table.
335 TheCU->addAccelName(getObjCMethodName(SP.getName()), Die);
336 }
337}
338
Eric Christopherb6dc8652012-11-27 22:43:45 +0000339// Find DIE for the given subprogram and attach appropriate DW_AT_low_pc
340// and DW_AT_high_pc attributes. If there are global variables in this
341// scope then create and insert DIEs for these variables.
Devang Pateld3024342011-08-15 22:24:32 +0000342DIE *DwarfDebug::updateSubprogramScopeDIE(CompileUnit *SPCU,
343 const MDNode *SPNode) {
Devang Patel163a9f72010-05-10 22:49:55 +0000344 DIE *SPDie = SPCU->getDIE(SPNode);
Devang Patel8aa61472010-07-07 22:20:57 +0000345
Chris Lattnerd38fee82010-04-05 00:13:49 +0000346 assert(SPDie && "Unable to find subprogram DIE!");
347 DISubprogram SP(SPNode);
Jim Grosbach1e20b962010-07-21 21:21:52 +0000348
Bill Wendling168c1902012-11-07 05:19:04 +0000349 // If we're updating an abstract DIE, then we will be adding the children and
350 // object pointer later on. But what we don't want to do is process the
351 // concrete DIE twice.
Devang Patel8aa61472010-07-07 22:20:57 +0000352 if (DIE *AbsSPDIE = AbstractSPDies.lookup(SPNode)) {
Bill Wendling168c1902012-11-07 05:19:04 +0000353 // Pick up abstract subprogram DIE.
Devang Patel8aa61472010-07-07 22:20:57 +0000354 SPDie = new DIE(dwarf::DW_TAG_subprogram);
Devang Patel3cbee302011-04-12 22:53:02 +0000355 SPCU->addDIEEntry(SPDie, dwarf::DW_AT_abstract_origin,
356 dwarf::DW_FORM_ref4, AbsSPDIE);
Devang Patel8aa61472010-07-07 22:20:57 +0000357 SPCU->addDie(SPDie);
Bill Wendlinga4c76932012-11-07 04:42:18 +0000358 } else {
359 DISubprogram SPDecl = SP.getFunctionDeclaration();
360 if (!SPDecl.isSubprogram()) {
361 // There is not any need to generate specification DIE for a function
362 // defined at compile unit level. If a function is defined inside another
363 // function then gdb prefers the definition at top level and but does not
364 // expect specification DIE in parent function. So avoid creating
365 // specification DIE for a function defined inside a function.
366 if (SP.isDefinition() && !SP.getContext().isCompileUnit() &&
367 !SP.getContext().isFile() &&
368 !isSubprogramContext(SP.getContext())) {
369 SPCU->addFlag(SPDie, dwarf::DW_AT_declaration);
370
371 // Add arguments.
372 DICompositeType SPTy = SP.getType();
373 DIArray Args = SPTy.getTypeArray();
374 unsigned SPTag = SPTy.getTag();
375 if (SPTag == dwarf::DW_TAG_subroutine_type)
376 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
377 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
378 DIType ATy = DIType(Args.getElement(i));
379 SPCU->addType(Arg, ATy);
380 if (ATy.isArtificial())
381 SPCU->addFlag(Arg, dwarf::DW_AT_artificial);
382 if (ATy.isObjectPointer())
383 SPCU->addDIEEntry(SPDie, dwarf::DW_AT_object_pointer,
384 dwarf::DW_FORM_ref4, Arg);
385 SPDie->addChild(Arg);
386 }
387 DIE *SPDeclDie = SPDie;
388 SPDie = new DIE(dwarf::DW_TAG_subprogram);
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000389 SPCU->addDIEEntry(SPDie, dwarf::DW_AT_specification,
390 dwarf::DW_FORM_ref4, SPDeclDie);
Bill Wendlinga4c76932012-11-07 04:42:18 +0000391 SPCU->addDie(SPDie);
392 }
393 }
Devang Patel8aa61472010-07-07 22:20:57 +0000394 }
395
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000396 SPCU->addLabelAddress(SPDie, dwarf::DW_AT_low_pc,
397 Asm->GetTempSymbol("func_begin",
398 Asm->getFunctionNumber()));
399 SPCU->addLabelAddress(SPDie, dwarf::DW_AT_high_pc,
400 Asm->GetTempSymbol("func_end",
401 Asm->getFunctionNumber()));
Chris Lattnerd38fee82010-04-05 00:13:49 +0000402 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
403 MachineLocation Location(RI->getFrameRegister(*Asm->MF));
Devang Patel3cbee302011-04-12 22:53:02 +0000404 SPCU->addAddress(SPDie, dwarf::DW_AT_frame_base, Location);
Devang Patelb4645642010-02-06 01:02:37 +0000405
Eric Christopher0ffe2b42011-11-10 19:25:34 +0000406 // Add name to the name table, we do this here because we're guaranteed
407 // to have concrete versions of our DW_TAG_subprogram nodes.
408 addSubprogramNames(SPCU, SP, SPDie);
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000409
Chris Lattnerd38fee82010-04-05 00:13:49 +0000410 return SPDie;
Devang Patel53bb5c92009-11-10 23:06:00 +0000411}
412
Eric Christopherb6dc8652012-11-27 22:43:45 +0000413// Construct new DW_TAG_lexical_block for this scope and attach
414// DW_AT_low_pc/DW_AT_high_pc labels.
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000415DIE *DwarfDebug::constructLexicalScopeDIE(CompileUnit *TheCU,
Devang Pateld3024342011-08-15 22:24:32 +0000416 LexicalScope *Scope) {
Devang Pateleac9c072010-04-27 19:46:33 +0000417 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_lexical_block);
418 if (Scope->isAbstractScope())
419 return ScopeDIE;
420
Devang Patelbf47fdb2011-08-10 20:55:27 +0000421 const SmallVector<InsnRange, 4> &Ranges = Scope->getRanges();
Devang Pateleac9c072010-04-27 19:46:33 +0000422 if (Ranges.empty())
423 return 0;
424
Devang Patelbf47fdb2011-08-10 20:55:27 +0000425 SmallVector<InsnRange, 4>::const_iterator RI = Ranges.begin();
Devang Pateleac9c072010-04-27 19:46:33 +0000426 if (Ranges.size() > 1) {
427 // .debug_range section has not been laid out yet. Emit offset in
Jim Grosbach1e20b962010-07-21 21:21:52 +0000428 // .debug_range as a uint, size 4, for now. emitDIE will handle
Devang Pateleac9c072010-04-27 19:46:33 +0000429 // DW_AT_ranges appropriately.
Devang Patel3cbee302011-04-12 22:53:02 +0000430 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_ranges, dwarf::DW_FORM_data4,
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000431 DebugRangeSymbols.size()
Chandler Carruth426c2bf2012-11-01 09:14:31 +0000432 * Asm->getDataLayout().getPointerSize());
Devang Patelbf47fdb2011-08-10 20:55:27 +0000433 for (SmallVector<InsnRange, 4>::const_iterator RI = Ranges.begin(),
Devang Pateleac9c072010-04-27 19:46:33 +0000434 RE = Ranges.end(); RI != RE; ++RI) {
Devang Patelc3f5f782010-05-25 23:40:22 +0000435 DebugRangeSymbols.push_back(getLabelBeforeInsn(RI->first));
436 DebugRangeSymbols.push_back(getLabelAfterInsn(RI->second));
Devang Pateleac9c072010-04-27 19:46:33 +0000437 }
438 DebugRangeSymbols.push_back(NULL);
439 DebugRangeSymbols.push_back(NULL);
440 return ScopeDIE;
441 }
442
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000443 MCSymbol *Start = getLabelBeforeInsn(RI->first);
444 MCSymbol *End = getLabelAfterInsn(RI->second);
Devang Pateleac9c072010-04-27 19:46:33 +0000445
Devang Patelc3f5f782010-05-25 23:40:22 +0000446 if (End == 0) return 0;
Devang Patel53bb5c92009-11-10 23:06:00 +0000447
Chris Lattnerb7db7332010-03-09 01:58:53 +0000448 assert(Start->isDefined() && "Invalid starting label for an inlined scope!");
449 assert(End->isDefined() && "Invalid end label for an inlined scope!");
Jim Grosbach1e20b962010-07-21 21:21:52 +0000450
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000451 TheCU->addLabelAddress(ScopeDIE, dwarf::DW_AT_low_pc, Start);
452 TheCU->addLabelAddress(ScopeDIE, dwarf::DW_AT_high_pc, End);
Devang Patel53bb5c92009-11-10 23:06:00 +0000453
454 return ScopeDIE;
455}
456
Eric Christopherb6dc8652012-11-27 22:43:45 +0000457// This scope represents inlined body of a function. Construct DIE to
458// represent this concrete inlined copy of the function.
Devang Pateld3024342011-08-15 22:24:32 +0000459DIE *DwarfDebug::constructInlinedScopeDIE(CompileUnit *TheCU,
460 LexicalScope *Scope) {
Devang Patelbf47fdb2011-08-10 20:55:27 +0000461 const SmallVector<InsnRange, 4> &Ranges = Scope->getRanges();
Nick Lewycky746cb672011-10-26 22:55:33 +0000462 assert(Ranges.empty() == false &&
463 "LexicalScope does not have instruction markers!");
Devang Pateleac9c072010-04-27 19:46:33 +0000464
Devang Patel26a92002011-07-27 00:34:13 +0000465 if (!Scope->getScopeNode())
466 return NULL;
467 DIScope DS(Scope->getScopeNode());
468 DISubprogram InlinedSP = getDISubprogram(DS);
Devang Patel26a92002011-07-27 00:34:13 +0000469 DIE *OriginDIE = TheCU->getDIE(InlinedSP);
470 if (!OriginDIE) {
Bill Wendlinge0aae5b2012-10-30 17:51:02 +0000471 DEBUG(dbgs() << "Unable to find original DIE for an inlined subprogram.");
Devang Patel26a92002011-07-27 00:34:13 +0000472 return NULL;
473 }
474
Devang Patelbf47fdb2011-08-10 20:55:27 +0000475 SmallVector<InsnRange, 4>::const_iterator RI = Ranges.begin();
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000476 MCSymbol *StartLabel = getLabelBeforeInsn(RI->first);
477 MCSymbol *EndLabel = getLabelAfterInsn(RI->second);
Devang Pateleac9c072010-04-27 19:46:33 +0000478
Devang Patel0afbf232010-07-08 22:39:20 +0000479 if (StartLabel == 0 || EndLabel == 0) {
Bill Wendlinge0aae5b2012-10-30 17:51:02 +0000480 llvm_unreachable("Unexpected Start and End labels for an inlined scope!");
Devang Pateleac9c072010-04-27 19:46:33 +0000481 }
Chris Lattnerb7db7332010-03-09 01:58:53 +0000482 assert(StartLabel->isDefined() &&
Chris Lattnera34ec2292010-03-09 01:51:43 +0000483 "Invalid starting label for an inlined scope!");
Chris Lattnerb7db7332010-03-09 01:58:53 +0000484 assert(EndLabel->isDefined() &&
Chris Lattnera34ec2292010-03-09 01:51:43 +0000485 "Invalid end label for an inlined scope!");
Devang Pateleac9c072010-04-27 19:46:33 +0000486
Devang Pateld96efb82011-05-05 17:54:26 +0000487 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_inlined_subroutine);
Devang Patel3cbee302011-04-12 22:53:02 +0000488 TheCU->addDIEEntry(ScopeDIE, dwarf::DW_AT_abstract_origin,
489 dwarf::DW_FORM_ref4, OriginDIE);
Devang Patel53bb5c92009-11-10 23:06:00 +0000490
Devang Patel26a92002011-07-27 00:34:13 +0000491 if (Ranges.size() > 1) {
492 // .debug_range section has not been laid out yet. Emit offset in
493 // .debug_range as a uint, size 4, for now. emitDIE will handle
494 // DW_AT_ranges appropriately.
495 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_ranges, dwarf::DW_FORM_data4,
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000496 DebugRangeSymbols.size()
Chandler Carruth426c2bf2012-11-01 09:14:31 +0000497 * Asm->getDataLayout().getPointerSize());
Devang Patelbf47fdb2011-08-10 20:55:27 +0000498 for (SmallVector<InsnRange, 4>::const_iterator RI = Ranges.begin(),
Devang Patel26a92002011-07-27 00:34:13 +0000499 RE = Ranges.end(); RI != RE; ++RI) {
500 DebugRangeSymbols.push_back(getLabelBeforeInsn(RI->first));
501 DebugRangeSymbols.push_back(getLabelAfterInsn(RI->second));
502 }
503 DebugRangeSymbols.push_back(NULL);
504 DebugRangeSymbols.push_back(NULL);
505 } else {
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000506 TheCU->addLabelAddress(ScopeDIE, dwarf::DW_AT_low_pc, StartLabel);
507 TheCU->addLabelAddress(ScopeDIE, dwarf::DW_AT_high_pc, EndLabel);
Devang Patel26a92002011-07-27 00:34:13 +0000508 }
Devang Patel53bb5c92009-11-10 23:06:00 +0000509
510 InlinedSubprogramDIEs.insert(OriginDIE);
511
512 // Track the start label for this inlined function.
Devang Patel26a92002011-07-27 00:34:13 +0000513 //.debug_inlined section specification does not clearly state how
514 // to emit inlined scope that is split into multiple instruction ranges.
515 // For now, use first instruction range and emit low_pc/high_pc pair and
516 // corresponding .debug_inlined section entry for this pair.
Devang Patele9f8f5e2010-05-07 20:54:48 +0000517 DenseMap<const MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator
Devang Patel2db49d72010-05-07 18:11:54 +0000518 I = InlineInfo.find(InlinedSP);
Devang Patel53bb5c92009-11-10 23:06:00 +0000519
520 if (I == InlineInfo.end()) {
Nick Lewycky746cb672011-10-26 22:55:33 +0000521 InlineInfo[InlinedSP].push_back(std::make_pair(StartLabel, ScopeDIE));
Devang Patel2db49d72010-05-07 18:11:54 +0000522 InlinedSPNodes.push_back(InlinedSP);
Devang Patel53bb5c92009-11-10 23:06:00 +0000523 } else
Chris Lattner6ed0f902010-03-09 00:31:02 +0000524 I->second.push_back(std::make_pair(StartLabel, ScopeDIE));
Devang Patel53bb5c92009-11-10 23:06:00 +0000525
Devang Patel53bb5c92009-11-10 23:06:00 +0000526 DILocation DL(Scope->getInlinedAt());
Eric Christopher08212002012-03-26 21:38:38 +0000527 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_call_file, 0,
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000528 getOrCreateSourceID(DL.getFilename(), DL.getDirectory()));
Devang Patel3cbee302011-04-12 22:53:02 +0000529 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_call_line, 0, DL.getLineNumber());
Devang Patel53bb5c92009-11-10 23:06:00 +0000530
Eric Christopher309bedd2011-12-04 06:02:38 +0000531 // Add name to the name table, we do this here because we're guaranteed
532 // to have concrete versions of our DW_TAG_inlined_subprogram nodes.
533 addSubprogramNames(TheCU, InlinedSP, ScopeDIE);
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000534
Devang Patel53bb5c92009-11-10 23:06:00 +0000535 return ScopeDIE;
536}
537
Eric Christopherb6dc8652012-11-27 22:43:45 +0000538// Construct a DIE for this scope.
Devang Pateld0b5a5e2011-08-15 22:04:40 +0000539DIE *DwarfDebug::constructScopeDIE(CompileUnit *TheCU, LexicalScope *Scope) {
Devang Patel3c91b052010-03-08 20:52:55 +0000540 if (!Scope || !Scope->getScopeNode())
541 return NULL;
Jim Grosbach1e20b962010-07-21 21:21:52 +0000542
Nick Lewycky746cb672011-10-26 22:55:33 +0000543 SmallVector<DIE *, 8> Children;
Eric Christophere5212782012-09-12 23:36:19 +0000544 DIE *ObjectPointer = NULL;
Devang Patel0478c152011-03-01 22:58:55 +0000545
546 // Collect arguments for current function.
Devang Patelbf47fdb2011-08-10 20:55:27 +0000547 if (LScopes.isCurrentFunctionScope(Scope))
Devang Patel0478c152011-03-01 22:58:55 +0000548 for (unsigned i = 0, N = CurrentFnArguments.size(); i < N; ++i)
549 if (DbgVariable *ArgDV = CurrentFnArguments[i])
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000550 if (DIE *Arg =
Eric Christophere5212782012-09-12 23:36:19 +0000551 TheCU->constructVariableDIE(ArgDV, Scope->isAbstractScope())) {
Devang Patel0478c152011-03-01 22:58:55 +0000552 Children.push_back(Arg);
Eric Christophere5212782012-09-12 23:36:19 +0000553 if (ArgDV->isObjectPointer()) ObjectPointer = Arg;
554 }
Devang Patel0478c152011-03-01 22:58:55 +0000555
Eric Christopher1aeb7ac2011-10-03 15:49:16 +0000556 // Collect lexical scope children first.
Devang Patelbf47fdb2011-08-10 20:55:27 +0000557 const SmallVector<DbgVariable *, 8> &Variables = ScopeVariables.lookup(Scope);
Devang Patel5bc9fec2011-02-19 01:31:27 +0000558 for (unsigned i = 0, N = Variables.size(); i < N; ++i)
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000559 if (DIE *Variable =
Eric Christopher7b451cf2012-09-21 22:18:52 +0000560 TheCU->constructVariableDIE(Variables[i], Scope->isAbstractScope())) {
Devang Patel5bc9fec2011-02-19 01:31:27 +0000561 Children.push_back(Variable);
Eric Christopher7b451cf2012-09-21 22:18:52 +0000562 if (Variables[i]->isObjectPointer()) ObjectPointer = Variable;
563 }
Devang Patelbf47fdb2011-08-10 20:55:27 +0000564 const SmallVector<LexicalScope *, 4> &Scopes = Scope->getChildren();
Devang Patel5bc9fec2011-02-19 01:31:27 +0000565 for (unsigned j = 0, M = Scopes.size(); j < M; ++j)
Devang Pateld0b5a5e2011-08-15 22:04:40 +0000566 if (DIE *Nested = constructScopeDIE(TheCU, Scopes[j]))
Devang Patel5bc9fec2011-02-19 01:31:27 +0000567 Children.push_back(Nested);
Devang Patel3c91b052010-03-08 20:52:55 +0000568 DIScope DS(Scope->getScopeNode());
569 DIE *ScopeDIE = NULL;
570 if (Scope->getInlinedAt())
Devang Pateld3024342011-08-15 22:24:32 +0000571 ScopeDIE = constructInlinedScopeDIE(TheCU, Scope);
Devang Patel3c91b052010-03-08 20:52:55 +0000572 else if (DS.isSubprogram()) {
Devang Patel0dd45582010-06-28 20:53:04 +0000573 ProcessedSPNodes.insert(DS);
Devang Patel8aa61472010-07-07 22:20:57 +0000574 if (Scope->isAbstractScope()) {
Devang Pateld3024342011-08-15 22:24:32 +0000575 ScopeDIE = TheCU->getDIE(DS);
Devang Patel8aa61472010-07-07 22:20:57 +0000576 // Note down abstract DIE.
577 if (ScopeDIE)
578 AbstractSPDies.insert(std::make_pair(DS, ScopeDIE));
579 }
Devang Patel3c91b052010-03-08 20:52:55 +0000580 else
Devang Pateld3024342011-08-15 22:24:32 +0000581 ScopeDIE = updateSubprogramScopeDIE(TheCU, DS);
Devang Patel3c91b052010-03-08 20:52:55 +0000582 }
Devang Patel5bc9fec2011-02-19 01:31:27 +0000583 else {
584 // There is no need to emit empty lexical block DIE.
585 if (Children.empty())
586 return NULL;
Devang Pateld3024342011-08-15 22:24:32 +0000587 ScopeDIE = constructLexicalScopeDIE(TheCU, Scope);
Devang Patel5bc9fec2011-02-19 01:31:27 +0000588 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000589
Devang Patelaead63c2010-03-29 22:59:58 +0000590 if (!ScopeDIE) return NULL;
Jim Grosbach1e20b962010-07-21 21:21:52 +0000591
Devang Patel5bc9fec2011-02-19 01:31:27 +0000592 // Add children
593 for (SmallVector<DIE *, 8>::iterator I = Children.begin(),
594 E = Children.end(); I != E; ++I)
595 ScopeDIE->addChild(*I);
Devang Patel193f7202009-11-24 01:14:22 +0000596
Eric Christophere5212782012-09-12 23:36:19 +0000597 if (DS.isSubprogram() && ObjectPointer != NULL)
598 TheCU->addDIEEntry(ScopeDIE, dwarf::DW_AT_object_pointer,
599 dwarf::DW_FORM_ref4, ObjectPointer);
600
Jim Grosbach1e20b962010-07-21 21:21:52 +0000601 if (DS.isSubprogram())
Eric Christopher0ffe2b42011-11-10 19:25:34 +0000602 TheCU->addPubTypes(DISubprogram(DS));
Jim Grosbach1e20b962010-07-21 21:21:52 +0000603
Eric Christopher0ffe2b42011-11-10 19:25:34 +0000604 return ScopeDIE;
Devang Patel53bb5c92009-11-10 23:06:00 +0000605}
606
Eric Christopherb6dc8652012-11-27 22:43:45 +0000607// Look up the source id with the given directory and source file names.
608// If none currently exists, create a new id and insert it in the
609// SourceIds map. This can update DirectoryNames and SourceFileNames maps
610// as well.
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000611unsigned DwarfDebug::getOrCreateSourceID(StringRef FileName,
Devang Patel23670e52011-03-24 20:30:50 +0000612 StringRef DirName) {
Devang Patel1905a182010-09-16 20:57:49 +0000613 // If FE did not provide a file name, then assume stdin.
614 if (FileName.empty())
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000615 return getOrCreateSourceID("<stdin>", StringRef());
Devang Patel23670e52011-03-24 20:30:50 +0000616
Nick Lewycky6c1a7032011-11-02 20:55:33 +0000617 // TODO: this might not belong here. See if we can factor this better.
618 if (DirName == CompilationDir)
619 DirName = "";
620
Nick Lewycky44d798d2011-10-17 23:05:28 +0000621 unsigned SrcId = SourceIdMap.size()+1;
Devang Patel1905a182010-09-16 20:57:49 +0000622
Benjamin Kramer74612c22012-03-11 14:56:26 +0000623 // We look up the file/dir pair by concatenating them with a zero byte.
624 SmallString<128> NamePair;
625 NamePair += DirName;
626 NamePair += '\0'; // Zero bytes are not allowed in paths.
627 NamePair += FileName;
628
629 StringMapEntry<unsigned> &Ent = SourceIdMap.GetOrCreateValue(NamePair, SrcId);
630 if (Ent.getValue() != SrcId)
631 return Ent.getValue();
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000632
Rafael Espindola5c055632010-11-18 02:04:25 +0000633 // Print out a .file directive to specify files for .loc directives.
Benjamin Kramer74612c22012-03-11 14:56:26 +0000634 Asm->OutStreamer.EmitDwarfFileDirective(SrcId, DirName, FileName);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000635
636 return SrcId;
637}
638
Eric Christopher72c16552012-12-20 21:58:40 +0000639// Create new CompileUnit for the given metadata node with tag
640// DW_TAG_compile_unit.
Devang Patel94c7ddb2011-08-16 22:09:43 +0000641CompileUnit *DwarfDebug::constructCompileUnit(const MDNode *N) {
Devang Patele4b27562009-08-28 23:24:31 +0000642 DICompileUnit DIUnit(N);
Devang Patel65dbc902009-11-25 17:36:49 +0000643 StringRef FN = DIUnit.getFilename();
Nick Lewycky6c1a7032011-11-02 20:55:33 +0000644 CompilationDir = DIUnit.getDirectory();
Eli Benderskyd4a05e02012-12-03 18:45:45 +0000645 // Call this to emit a .file directive if it wasn't emitted for the source
646 // file this CU comes from yet.
647 getOrCreateSourceID(FN, CompilationDir);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000648
649 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
Eli Benderskyd4a05e02012-12-03 18:45:45 +0000650 CompileUnit *NewCU = new CompileUnit(GlobalCUIndexCount++,
Eric Christopher2e5d8702012-12-20 21:58:36 +0000651 DIUnit.getLanguage(), Die, Asm,
652 this, &InfoHolder);
Nick Lewycky390c40d2011-10-27 06:44:11 +0000653 NewCU->addString(Die, dwarf::DW_AT_producer, DIUnit.getProducer());
Devang Patel3cbee302011-04-12 22:53:02 +0000654 NewCU->addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data2,
655 DIUnit.getLanguage());
Nick Lewycky390c40d2011-10-27 06:44:11 +0000656 NewCU->addString(Die, dwarf::DW_AT_name, FN);
Eric Christopher6635cad2012-08-01 18:19:01 +0000657 // 2.17.1 requires that we use DW_AT_low_pc for a single entry point
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000658 // into an entity. We're using 0 (or a NULL label) for this.
659 NewCU->addLabelAddress(Die, dwarf::DW_AT_low_pc, NULL);
Devang Patel4a602ca2010-03-22 23:11:36 +0000660 // DW_AT_stmt_list is a offset of line number information for this
Devang Patelaf608bd2010-08-24 00:06:12 +0000661 // compile unit in debug_line section.
Rafael Espindola2241e512012-06-22 13:24:07 +0000662 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
Rafael Espindola597a7662011-05-04 17:44:06 +0000663 NewCU->addLabel(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4,
Devang Patel3cbee302011-04-12 22:53:02 +0000664 Asm->GetTempSymbol("section_line"));
Devang Patelae84d5b2010-08-31 23:50:19 +0000665 else
Devang Patel3cbee302011-04-12 22:53:02 +0000666 NewCU->addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4, 0);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000667
Nick Lewycky6c1a7032011-11-02 20:55:33 +0000668 if (!CompilationDir.empty())
669 NewCU->addString(Die, dwarf::DW_AT_comp_dir, CompilationDir);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000670 if (DIUnit.isOptimized())
Eric Christopher873cf0a2012-08-24 01:14:27 +0000671 NewCU->addFlag(Die, dwarf::DW_AT_APPLE_optimized);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000672
Devang Patel65dbc902009-11-25 17:36:49 +0000673 StringRef Flags = DIUnit.getFlags();
674 if (!Flags.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +0000675 NewCU->addString(Die, dwarf::DW_AT_APPLE_flags, Flags);
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000676
Nick Lewyckyd5d52132011-10-17 23:27:36 +0000677 if (unsigned RVer = DIUnit.getRunTimeVersion())
Devang Patel3cbee302011-04-12 22:53:02 +0000678 NewCU->addUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers,
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000679 dwarf::DW_FORM_data1, RVer);
680
Devang Patel163a9f72010-05-10 22:49:55 +0000681 if (!FirstCU)
682 FirstCU = NewCU;
Eric Christopher4daaed12012-12-10 19:51:21 +0000683 if (useSplitDwarf() && !SkeletonCU)
684 SkeletonCU = constructSkeletonCU(N);
Eric Christopher98e237f2012-11-30 23:59:06 +0000685
Eric Christopher0e3e9b72012-12-10 23:34:43 +0000686 InfoHolder.addUnit(NewCU);
687
Devang Patel163a9f72010-05-10 22:49:55 +0000688 CUMap.insert(std::make_pair(N, NewCU));
Devang Patel94c7ddb2011-08-16 22:09:43 +0000689 return NewCU;
Devang Patel163a9f72010-05-10 22:49:55 +0000690}
691
Eric Christopherb6dc8652012-11-27 22:43:45 +0000692// Construct subprogram DIE.
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000693void DwarfDebug::constructSubprogramDIE(CompileUnit *TheCU,
Devang Patel3655a212011-08-15 23:36:40 +0000694 const MDNode *N) {
Rafael Espindolab0527282011-11-04 19:00:29 +0000695 CompileUnit *&CURef = SPMap[N];
696 if (CURef)
697 return;
698 CURef = TheCU;
699
Devang Patele4b27562009-08-28 23:24:31 +0000700 DISubprogram SP(N);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000701 if (!SP.isDefinition())
702 // This is a method declaration which will be handled while constructing
703 // class type.
Devang Patel13e16b62009-06-26 01:49:18 +0000704 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000705
Devang Pateldbc64af2011-08-15 17:24:54 +0000706 DIE *SubprogramDie = TheCU->getOrCreateSubprogramDIE(SP);
Stuart Hastings639336e2010-04-06 21:38:29 +0000707
708 // Add to map.
Devang Patel163a9f72010-05-10 22:49:55 +0000709 TheCU->insertDIE(N, SubprogramDie);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000710
711 // Add to context owner.
Devang Patel3cbee302011-04-12 22:53:02 +0000712 TheCU->addToContextOwner(SubprogramDie, SP.getContext());
Devang Patel0000fad2009-12-08 23:21:45 +0000713
Devang Patel13e16b62009-06-26 01:49:18 +0000714 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000715}
716
Eric Christopherb6dc8652012-11-27 22:43:45 +0000717// Collect debug info from named mdnodes such as llvm.dbg.enum and llvm.dbg.ty.
Eric Christopherc4639d62012-11-19 22:42:15 +0000718void DwarfDebug::collectInfoFromNamedMDNodes(const Module *M) {
Devang Patel94c7ddb2011-08-16 22:09:43 +0000719 if (NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.sp"))
720 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
721 const MDNode *N = NMD->getOperand(i);
722 if (CompileUnit *CU = CUMap.lookup(DISubprogram(N).getCompileUnit()))
723 constructSubprogramDIE(CU, N);
724 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000725
Devang Patel94c7ddb2011-08-16 22:09:43 +0000726 if (NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.gv"))
727 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
728 const MDNode *N = NMD->getOperand(i);
729 if (CompileUnit *CU = CUMap.lookup(DIGlobalVariable(N).getCompileUnit()))
Devang Patel28bea082011-08-18 23:17:55 +0000730 CU->createGlobalVariableDIE(N);
Devang Patel94c7ddb2011-08-16 22:09:43 +0000731 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000732
Devang Patel02e603f2011-08-15 23:47:24 +0000733 if (NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.enum"))
734 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
735 DIType Ty(NMD->getOperand(i));
Devang Patel94c7ddb2011-08-16 22:09:43 +0000736 if (CompileUnit *CU = CUMap.lookup(Ty.getCompileUnit()))
737 CU->getOrCreateTypeDIE(Ty);
Devang Patel02e603f2011-08-15 23:47:24 +0000738 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000739
Devang Patel02e603f2011-08-15 23:47:24 +0000740 if (NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.ty"))
741 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
742 DIType Ty(NMD->getOperand(i));
Devang Patel94c7ddb2011-08-16 22:09:43 +0000743 if (CompileUnit *CU = CUMap.lookup(Ty.getCompileUnit()))
744 CU->getOrCreateTypeDIE(Ty);
Devang Patel02e603f2011-08-15 23:47:24 +0000745 }
746}
747
Eric Christopherb6dc8652012-11-27 22:43:45 +0000748// Collect debug info using DebugInfoFinder.
749// FIXME - Remove this when dragonegg switches to DIBuilder.
Eric Christopherc4639d62012-11-19 22:42:15 +0000750bool DwarfDebug::collectLegacyDebugInfo(const Module *M) {
Devang Patel02e603f2011-08-15 23:47:24 +0000751 DebugInfoFinder DbgFinder;
752 DbgFinder.processModule(*M);
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000753
Devang Patel02e603f2011-08-15 23:47:24 +0000754 bool HasDebugInfo = false;
755 // Scan all the compile-units to see if there are any marked as the main
756 // unit. If not, we do not generate debug info.
757 for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
758 E = DbgFinder.compile_unit_end(); I != E; ++I) {
759 if (DICompileUnit(*I).isMain()) {
760 HasDebugInfo = true;
761 break;
762 }
763 }
764 if (!HasDebugInfo) return false;
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000765
Devang Patel02e603f2011-08-15 23:47:24 +0000766 // Create all the compile unit DIEs.
767 for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
768 E = DbgFinder.compile_unit_end(); I != E; ++I)
769 constructCompileUnit(*I);
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000770
Devang Patel02e603f2011-08-15 23:47:24 +0000771 // Create DIEs for each global variable.
772 for (DebugInfoFinder::iterator I = DbgFinder.global_variable_begin(),
773 E = DbgFinder.global_variable_end(); I != E; ++I) {
774 const MDNode *N = *I;
Devang Patel94c7ddb2011-08-16 22:09:43 +0000775 if (CompileUnit *CU = CUMap.lookup(DIGlobalVariable(N).getCompileUnit()))
Devang Patel28bea082011-08-18 23:17:55 +0000776 CU->createGlobalVariableDIE(N);
Devang Patel02e603f2011-08-15 23:47:24 +0000777 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000778
Devang Patel02e603f2011-08-15 23:47:24 +0000779 // Create DIEs for each subprogram.
780 for (DebugInfoFinder::iterator I = DbgFinder.subprogram_begin(),
781 E = DbgFinder.subprogram_end(); I != E; ++I) {
782 const MDNode *N = *I;
Devang Patel94c7ddb2011-08-16 22:09:43 +0000783 if (CompileUnit *CU = CUMap.lookup(DISubprogram(N).getCompileUnit()))
784 constructSubprogramDIE(CU, N);
Devang Patel02e603f2011-08-15 23:47:24 +0000785 }
786
787 return HasDebugInfo;
788}
789
Eric Christopherb6dc8652012-11-27 22:43:45 +0000790// Emit all Dwarf sections that should come prior to the content. Create
791// global DIEs and emit initial debug info sections. This is invoked by
792// the target AsmPrinter.
Eric Christopherc4639d62012-11-19 22:42:15 +0000793void DwarfDebug::beginModule() {
Devang Pateleac9c072010-04-27 19:46:33 +0000794 if (DisableDebugInfoPrinting)
795 return;
796
Eric Christopherc4639d62012-11-19 22:42:15 +0000797 const Module *M = MMI->getModule();
798
Nick Lewycky3bbb6f72011-07-29 03:49:23 +0000799 // If module has named metadata anchors then use them, otherwise scan the
800 // module using debug info finder to collect debug info.
Devang Patel30692ab2011-05-03 16:45:22 +0000801 NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu");
802 if (CU_Nodes) {
Devang Patel94c7ddb2011-08-16 22:09:43 +0000803 for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i) {
804 DICompileUnit CUNode(CU_Nodes->getOperand(i));
805 CompileUnit *CU = constructCompileUnit(CUNode);
806 DIArray GVs = CUNode.getGlobalVariables();
807 for (unsigned i = 0, e = GVs.getNumElements(); i != e; ++i)
Devang Patel28bea082011-08-18 23:17:55 +0000808 CU->createGlobalVariableDIE(GVs.getElement(i));
Devang Patel94c7ddb2011-08-16 22:09:43 +0000809 DIArray SPs = CUNode.getSubprograms();
810 for (unsigned i = 0, e = SPs.getNumElements(); i != e; ++i)
811 constructSubprogramDIE(CU, SPs.getElement(i));
812 DIArray EnumTypes = CUNode.getEnumTypes();
813 for (unsigned i = 0, e = EnumTypes.getNumElements(); i != e; ++i)
814 CU->getOrCreateTypeDIE(EnumTypes.getElement(i));
815 DIArray RetainedTypes = CUNode.getRetainedTypes();
816 for (unsigned i = 0, e = RetainedTypes.getNumElements(); i != e; ++i)
817 CU->getOrCreateTypeDIE(RetainedTypes.getElement(i));
818 }
Devang Patel02e603f2011-08-15 23:47:24 +0000819 } else if (!collectLegacyDebugInfo(M))
820 return;
Devang Patel30692ab2011-05-03 16:45:22 +0000821
Devang Patel02e603f2011-08-15 23:47:24 +0000822 collectInfoFromNamedMDNodes(M);
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000823
Chris Lattnerd850ac72010-04-05 02:19:28 +0000824 // Tell MMI that we have debug info.
825 MMI->setDebugInfoAvailability(true);
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000826
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000827 // Prime section data.
Chris Lattnerf0144122009-07-28 03:13:23 +0000828 SectionMap.insert(Asm->getObjFileLowering().getTextSection());
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000829}
830
Eric Christopher4117bec2012-11-22 00:59:49 +0000831// Attach DW_AT_inline attribute with inlined subprogram DIEs.
832void DwarfDebug::computeInlinedDIEs() {
Devang Patel53bb5c92009-11-10 23:06:00 +0000833 // Attach DW_AT_inline attribute with inlined subprogram DIEs.
834 for (SmallPtrSet<DIE *, 4>::iterator AI = InlinedSubprogramDIEs.begin(),
Eric Christopherbdab8002012-11-27 00:13:51 +0000835 AE = InlinedSubprogramDIEs.end(); AI != AE; ++AI) {
Devang Patel53bb5c92009-11-10 23:06:00 +0000836 DIE *ISP = *AI;
Devang Patel3cbee302011-04-12 22:53:02 +0000837 FirstCU->addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
Devang Patel53bb5c92009-11-10 23:06:00 +0000838 }
Rafael Espindolad1ac3a42011-11-12 01:57:54 +0000839 for (DenseMap<const MDNode *, DIE *>::iterator AI = AbstractSPDies.begin(),
Eric Christopherbdab8002012-11-27 00:13:51 +0000840 AE = AbstractSPDies.end(); AI != AE; ++AI) {
Rafael Espindolad1ac3a42011-11-12 01:57:54 +0000841 DIE *ISP = AI->second;
842 if (InlinedSubprogramDIEs.count(ISP))
843 continue;
844 FirstCU->addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
845 }
Eric Christopher4117bec2012-11-22 00:59:49 +0000846}
847
848// Collect info for variables that were optimized out.
849void DwarfDebug::collectDeadVariables() {
850 const Module *M = MMI->getModule();
851 DenseMap<const MDNode *, LexicalScope *> DeadFnScopeMap;
852
853 if (NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu")) {
854 for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i) {
855 DICompileUnit TheCU(CU_Nodes->getOperand(i));
856 DIArray Subprograms = TheCU.getSubprograms();
857 for (unsigned i = 0, e = Subprograms.getNumElements(); i != e; ++i) {
Eric Christopherbdab8002012-11-27 00:13:51 +0000858 DISubprogram SP(Subprograms.getElement(i));
859 if (ProcessedSPNodes.count(SP) != 0) continue;
860 if (!SP.Verify()) continue;
861 if (!SP.isDefinition()) continue;
862 DIArray Variables = SP.getVariables();
863 if (Variables.getNumElements() == 0) continue;
Eric Christopher4117bec2012-11-22 00:59:49 +0000864
Eric Christopherbdab8002012-11-27 00:13:51 +0000865 LexicalScope *Scope =
866 new LexicalScope(NULL, DIDescriptor(SP), NULL, false);
867 DeadFnScopeMap[SP] = Scope;
Eric Christopher4117bec2012-11-22 00:59:49 +0000868
Eric Christopherbdab8002012-11-27 00:13:51 +0000869 // Construct subprogram DIE and add variables DIEs.
870 CompileUnit *SPCU = CUMap.lookup(TheCU);
871 assert(SPCU && "Unable to find Compile Unit!");
872 constructSubprogramDIE(SPCU, SP);
873 DIE *ScopeDIE = SPCU->getDIE(SP);
874 for (unsigned vi = 0, ve = Variables.getNumElements(); vi != ve; ++vi) {
875 DIVariable DV(Variables.getElement(vi));
876 if (!DV.Verify()) continue;
877 DbgVariable *NewVar = new DbgVariable(DV, NULL);
878 if (DIE *VariableDIE =
879 SPCU->constructVariableDIE(NewVar, Scope->isAbstractScope()))
880 ScopeDIE->addChild(VariableDIE);
881 }
Eric Christopher4117bec2012-11-22 00:59:49 +0000882 }
883 }
884 }
885 DeleteContainerSeconds(DeadFnScopeMap);
886}
887
888void DwarfDebug::finalizeModuleInfo() {
889 // Collect info for variables that were optimized out.
890 collectDeadVariables();
891
892 // Attach DW_AT_inline attribute with inlined subprogram DIEs.
893 computeInlinedDIEs();
Devang Patel53bb5c92009-11-10 23:06:00 +0000894
Eric Christopher6635cad2012-08-01 18:19:01 +0000895 // Emit DW_AT_containing_type attribute to connect types with their
896 // vtable holding type.
Devang Pateldbc64af2011-08-15 17:24:54 +0000897 for (DenseMap<const MDNode *, CompileUnit *>::iterator CUI = CUMap.begin(),
Eric Christopherbdab8002012-11-27 00:13:51 +0000898 CUE = CUMap.end(); CUI != CUE; ++CUI) {
Devang Pateldbc64af2011-08-15 17:24:54 +0000899 CompileUnit *TheCU = CUI->second;
900 TheCU->constructContainingTypeDIEs();
Devang Patel5d11eb02009-12-03 19:11:07 +0000901 }
902
Eric Christopher4117bec2012-11-22 00:59:49 +0000903 // Compute DIE offsets and sizes.
Eric Christopher0e3e9b72012-12-10 23:34:43 +0000904 InfoHolder.computeSizeAndOffsets();
905 if (useSplitDwarf())
906 SkeletonHolder.computeSizeAndOffsets();
Eric Christopher4117bec2012-11-22 00:59:49 +0000907}
908
909void DwarfDebug::endSections() {
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000910 // Standard sections final addresses.
Chris Lattner6c2f9e12009-08-19 05:49:37 +0000911 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getTextSection());
Chris Lattnerc0215722010-04-04 19:25:43 +0000912 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("text_end"));
Chris Lattner6c2f9e12009-08-19 05:49:37 +0000913 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getDataSection());
Chris Lattnerc0215722010-04-04 19:25:43 +0000914 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("data_end"));
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000915
916 // End text sections.
Benjamin Kramerb4c9d9c2012-10-31 13:45:49 +0000917 for (unsigned I = 0, E = SectionMap.size(); I != E; ++I) {
918 Asm->OutStreamer.SwitchSection(SectionMap[I]);
919 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("section_end", I+1));
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000920 }
Eric Christopher4117bec2012-11-22 00:59:49 +0000921}
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000922
Eric Christopherb6dc8652012-11-27 22:43:45 +0000923// Emit all Dwarf sections that should come after the content.
Eric Christopher4117bec2012-11-22 00:59:49 +0000924void DwarfDebug::endModule() {
925
926 if (!FirstCU) return;
927
928 // End any existing sections.
929 // TODO: Does this need to happen?
930 endSections();
931
932 // Finalize the debug info for the module.
933 finalizeModuleInfo();
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000934
Eric Christopher97c34722012-11-19 19:43:59 +0000935 // Emit initial sections.
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000936 emitSectionLabels();
Eric Christopher97c34722012-11-19 19:43:59 +0000937
Eric Christopher4daaed12012-12-10 19:51:21 +0000938 if (!useSplitDwarf()) {
Eric Christopher42885022012-11-27 22:43:42 +0000939 // Emit all the DIEs into a debug info section.
940 emitDebugInfo();
Eric Christopher74802f72012-11-27 00:41:54 +0000941
Eric Christopher42885022012-11-27 22:43:42 +0000942 // Corresponding abbreviations into a abbrev section.
943 emitAbbreviations();
944
945 // Emit info into a debug loc section.
946 emitDebugLoc();
947
948 // Emit info into a debug aranges section.
949 emitDebugARanges();
950
951 // Emit info into a debug ranges section.
952 emitDebugRanges();
953
954 // Emit info into a debug macinfo section.
955 emitDebugMacInfo();
956
957 // Emit inline info.
958 // TODO: When we don't need the option anymore we
959 // can remove all of the code that this section
960 // depends upon.
961 if (useDarwinGDBCompat())
962 emitDebugInlineInfo();
963 } else {
Eric Christopher0b944ee2012-12-11 19:42:09 +0000964 // TODO: Fill this in for separated debug sections and separate
Eric Christopher42885022012-11-27 22:43:42 +0000965 // out information into new sections.
966
Eric Christopher98e237f2012-11-30 23:59:06 +0000967 // Emit the debug info section and compile units.
Eric Christopher42885022012-11-27 22:43:42 +0000968 emitDebugInfo();
Eric Christopher98e237f2012-11-30 23:59:06 +0000969 emitDebugInfoDWO();
Eric Christopher42885022012-11-27 22:43:42 +0000970
971 // Corresponding abbreviations into a abbrev section.
972 emitAbbreviations();
Eric Christopher6eebe472012-12-19 22:02:53 +0000973 emitDebugAbbrevDWO();
Eric Christopher42885022012-11-27 22:43:42 +0000974
975 // Emit info into a debug loc section.
976 emitDebugLoc();
977
978 // Emit info into a debug aranges section.
979 emitDebugARanges();
980
981 // Emit info into a debug ranges section.
982 emitDebugRanges();
983
984 // Emit info into a debug macinfo section.
985 emitDebugMacInfo();
986
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000987 // Emit DWO addresses.
988 InfoHolder.emitAddresses(Asm->getObjFileLowering().getDwarfAddrSection());
989
Eric Christopher42885022012-11-27 22:43:42 +0000990 // Emit inline info.
991 // TODO: When we don't need the option anymore we
992 // can remove all of the code that this section
993 // depends upon.
994 if (useDarwinGDBCompat())
995 emitDebugInlineInfo();
996 }
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000997
Eric Christopher9d9f5a52012-08-23 07:32:06 +0000998 // Emit info into the dwarf accelerator table sections.
Eric Christopher20f47ab2012-08-23 22:36:40 +0000999 if (useDwarfAccelTables()) {
Eric Christopher09ac3d82011-11-07 09:24:32 +00001000 emitAccelNames();
1001 emitAccelObjC();
1002 emitAccelNamespaces();
1003 emitAccelTypes();
1004 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001005
Devang Patel193f7202009-11-24 01:14:22 +00001006 // Emit info into a debug pubtypes section.
Eric Christopher360f0062012-08-23 07:10:56 +00001007 // TODO: When we don't need the option anymore we can
1008 // remove all of the code that adds to the table.
Eric Christopher20f47ab2012-08-23 22:36:40 +00001009 if (useDarwinGDBCompat())
Eric Christopher360f0062012-08-23 07:10:56 +00001010 emitDebugPubTypes();
Devang Patel193f7202009-11-24 01:14:22 +00001011
Eric Christopher42885022012-11-27 22:43:42 +00001012 // Finally emit string information into a string table.
Eric Christopherfcdbecb2012-11-27 06:49:23 +00001013 emitDebugStr();
Eric Christopher64f824c2012-12-27 02:14:01 +00001014 if (useSplitDwarf())
1015 emitDebugStrDWO();
Eric Christopherfcdbecb2012-11-27 06:49:23 +00001016
Devang Patele9a1cca2010-08-02 17:32:15 +00001017 // clean up.
Devang Patel94c7ddb2011-08-16 22:09:43 +00001018 SPMap.clear();
Devang Patel163a9f72010-05-10 22:49:55 +00001019 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
1020 E = CUMap.end(); I != E; ++I)
1021 delete I->second;
Eric Christopher9ec87b32012-12-10 19:51:18 +00001022
Eric Christopher4daaed12012-12-10 19:51:21 +00001023 delete SkeletonCU;
Eric Christopher9ec87b32012-12-10 19:51:18 +00001024
Eric Christopher98e237f2012-11-30 23:59:06 +00001025 // Reset these for the next Module if we have one.
1026 FirstCU = NULL;
Eric Christopher4daaed12012-12-10 19:51:21 +00001027 SkeletonCU = NULL;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001028}
1029
Eric Christopherb6dc8652012-11-27 22:43:45 +00001030// Find abstract variable, if any, associated with Var.
Devang Patelb549bcf2011-08-10 21:50:54 +00001031DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &DV,
Chris Lattnerde4845c2010-04-02 19:42:39 +00001032 DebugLoc ScopeLoc) {
Devang Patelb549bcf2011-08-10 21:50:54 +00001033 LLVMContext &Ctx = DV->getContext();
1034 // More then one inlined variable corresponds to one abstract variable.
1035 DIVariable Var = cleanseInlinedVariable(DV, Ctx);
Devang Patel2db49d72010-05-07 18:11:54 +00001036 DbgVariable *AbsDbgVariable = AbstractVariables.lookup(Var);
Devang Patel53bb5c92009-11-10 23:06:00 +00001037 if (AbsDbgVariable)
1038 return AbsDbgVariable;
1039
Devang Patelbf47fdb2011-08-10 20:55:27 +00001040 LexicalScope *Scope = LScopes.findAbstractScope(ScopeLoc.getScope(Ctx));
Devang Patel53bb5c92009-11-10 23:06:00 +00001041 if (!Scope)
1042 return NULL;
1043
Devang Patel5a1a67c2011-08-15 19:01:20 +00001044 AbsDbgVariable = new DbgVariable(Var, NULL);
Devang Patelbf47fdb2011-08-10 20:55:27 +00001045 addScopeVariable(Scope, AbsDbgVariable);
Devang Patel2db49d72010-05-07 18:11:54 +00001046 AbstractVariables[Var] = AbsDbgVariable;
Devang Patel53bb5c92009-11-10 23:06:00 +00001047 return AbsDbgVariable;
1048}
1049
Eric Christopherb6dc8652012-11-27 22:43:45 +00001050// If Var is a current function argument then add it to CurrentFnArguments list.
Devang Patel0478c152011-03-01 22:58:55 +00001051bool DwarfDebug::addCurrentFnArgument(const MachineFunction *MF,
Devang Patelbf47fdb2011-08-10 20:55:27 +00001052 DbgVariable *Var, LexicalScope *Scope) {
1053 if (!LScopes.isCurrentFunctionScope(Scope))
Devang Patel0478c152011-03-01 22:58:55 +00001054 return false;
1055 DIVariable DV = Var->getVariable();
1056 if (DV.getTag() != dwarf::DW_TAG_arg_variable)
1057 return false;
1058 unsigned ArgNo = DV.getArgNumber();
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001059 if (ArgNo == 0)
Devang Patel0478c152011-03-01 22:58:55 +00001060 return false;
1061
Devang Patelcb3a6572011-03-03 20:02:02 +00001062 size_t Size = CurrentFnArguments.size();
1063 if (Size == 0)
Devang Patel0478c152011-03-01 22:58:55 +00001064 CurrentFnArguments.resize(MF->getFunction()->arg_size());
Devang Patelbbd0f452011-03-03 21:49:41 +00001065 // llvm::Function argument size is not good indicator of how many
Devang Patel6f676be2011-03-03 20:08:10 +00001066 // arguments does the function have at source level.
1067 if (ArgNo > Size)
Devang Patelcb3a6572011-03-03 20:02:02 +00001068 CurrentFnArguments.resize(ArgNo * 2);
Devang Patel0478c152011-03-01 22:58:55 +00001069 CurrentFnArguments[ArgNo - 1] = Var;
1070 return true;
1071}
1072
Eric Christopherb6dc8652012-11-27 22:43:45 +00001073// Collect variable information from side table maintained by MMI.
Jim Grosbach1e20b962010-07-21 21:21:52 +00001074void
Nick Lewycky3bbb6f72011-07-29 03:49:23 +00001075DwarfDebug::collectVariableInfoFromMMITable(const MachineFunction *MF,
Devang Patelee432862010-05-20 19:57:06 +00001076 SmallPtrSet<const MDNode *, 16> &Processed) {
Devang Patele717faa2009-10-06 01:26:37 +00001077 MachineModuleInfo::VariableDbgInfoMapTy &VMap = MMI->getVariableDbgInfo();
1078 for (MachineModuleInfo::VariableDbgInfoMapTy::iterator VI = VMap.begin(),
1079 VE = VMap.end(); VI != VE; ++VI) {
Devang Patele9f8f5e2010-05-07 20:54:48 +00001080 const MDNode *Var = VI->first;
Devang Patel53bb5c92009-11-10 23:06:00 +00001081 if (!Var) continue;
Devang Patel98e1cac2010-05-14 21:01:35 +00001082 Processed.insert(Var);
Chris Lattnerde4845c2010-04-02 19:42:39 +00001083 DIVariable DV(Var);
1084 const std::pair<unsigned, DebugLoc> &VP = VI->second;
Devang Patel53bb5c92009-11-10 23:06:00 +00001085
Devang Patelbf47fdb2011-08-10 20:55:27 +00001086 LexicalScope *Scope = LScopes.findLexicalScope(VP.second);
Jim Grosbach1e20b962010-07-21 21:21:52 +00001087
Devang Patelfb0ee432009-11-10 23:20:04 +00001088 // If variable scope is not found then skip this variable.
Chris Lattnerde4845c2010-04-02 19:42:39 +00001089 if (Scope == 0)
Devang Patelfb0ee432009-11-10 23:20:04 +00001090 continue;
Devang Patel53bb5c92009-11-10 23:06:00 +00001091
Devang Patel26c1e562010-05-20 16:36:41 +00001092 DbgVariable *AbsDbgVariable = findAbstractVariable(DV, VP.second);
Devang Patel5a1a67c2011-08-15 19:01:20 +00001093 DbgVariable *RegVar = new DbgVariable(DV, AbsDbgVariable);
Devang Patelff9dd0a2011-08-15 21:24:36 +00001094 RegVar->setFrameIndex(VP.first);
Devang Patel0478c152011-03-01 22:58:55 +00001095 if (!addCurrentFnArgument(MF, RegVar, Scope))
Devang Patelbf47fdb2011-08-10 20:55:27 +00001096 addScopeVariable(Scope, RegVar);
Devang Patel5a1a67c2011-08-15 19:01:20 +00001097 if (AbsDbgVariable)
Devang Patelff9dd0a2011-08-15 21:24:36 +00001098 AbsDbgVariable->setFrameIndex(VP.first);
Devang Patele717faa2009-10-06 01:26:37 +00001099 }
Devang Patelee432862010-05-20 19:57:06 +00001100}
Devang Patel90a48ad2010-03-15 18:33:46 +00001101
Eric Christopherb6dc8652012-11-27 22:43:45 +00001102// Return true if debug value, encoded by DBG_VALUE instruction, is in a
1103// defined reg.
Devang Patelc3f5f782010-05-25 23:40:22 +00001104static bool isDbgValueInDefinedReg(const MachineInstr *MI) {
Nick Lewycky746cb672011-10-26 22:55:33 +00001105 assert(MI->isDebugValue() && "Invalid DBG_VALUE machine instruction!");
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001106 return MI->getNumOperands() == 3 &&
1107 MI->getOperand(0).isReg() && MI->getOperand(0).getReg() &&
1108 MI->getOperand(1).isImm() && MI->getOperand(1).getImm() == 0;
Devang Patelc3f5f782010-05-25 23:40:22 +00001109}
1110
Eric Christopherb6dc8652012-11-27 22:43:45 +00001111// Get .debug_loc entry for the instruction range starting at MI.
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001112static DotDebugLocEntry getDebugLocEntry(AsmPrinter *Asm,
1113 const MCSymbol *FLabel,
Devang Patel90b40412011-07-08 17:09:57 +00001114 const MCSymbol *SLabel,
1115 const MachineInstr *MI) {
1116 const MDNode *Var = MI->getOperand(MI->getNumOperands() - 1).getMetadata();
1117
1118 if (MI->getNumOperands() != 3) {
1119 MachineLocation MLoc = Asm->getDebugValueLocation(MI);
1120 return DotDebugLocEntry(FLabel, SLabel, MLoc, Var);
1121 }
1122 if (MI->getOperand(0).isReg() && MI->getOperand(1).isImm()) {
1123 MachineLocation MLoc;
1124 MLoc.set(MI->getOperand(0).getReg(), MI->getOperand(1).getImm());
1125 return DotDebugLocEntry(FLabel, SLabel, MLoc, Var);
1126 }
1127 if (MI->getOperand(0).isImm())
1128 return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getImm());
1129 if (MI->getOperand(0).isFPImm())
1130 return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getFPImm());
1131 if (MI->getOperand(0).isCImm())
1132 return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getCImm());
1133
Craig Topper5e25ee82012-02-05 08:31:47 +00001134 llvm_unreachable("Unexpected 3 operand DBG_VALUE instruction!");
Devang Patel90b40412011-07-08 17:09:57 +00001135}
1136
Eric Christopherb6dc8652012-11-27 22:43:45 +00001137// Find variables for each lexical scope.
Jim Grosbach1e20b962010-07-21 21:21:52 +00001138void
Devang Patel78e127d2010-06-25 22:07:34 +00001139DwarfDebug::collectVariableInfo(const MachineFunction *MF,
1140 SmallPtrSet<const MDNode *, 16> &Processed) {
Jim Grosbach1e20b962010-07-21 21:21:52 +00001141
Eric Christopherb6dc8652012-11-27 22:43:45 +00001142 // collection info from MMI table.
Devang Patelee432862010-05-20 19:57:06 +00001143 collectVariableInfoFromMMITable(MF, Processed);
1144
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001145 for (SmallVectorImpl<const MDNode*>::const_iterator
1146 UVI = UserVariables.begin(), UVE = UserVariables.end(); UVI != UVE;
1147 ++UVI) {
1148 const MDNode *Var = *UVI;
1149 if (Processed.count(Var))
Devang Patelee432862010-05-20 19:57:06 +00001150 continue;
1151
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001152 // History contains relevant DBG_VALUE instructions for Var and instructions
1153 // clobbering it.
1154 SmallVectorImpl<const MachineInstr*> &History = DbgValues[Var];
1155 if (History.empty())
1156 continue;
1157 const MachineInstr *MInsn = History.front();
Devang Patelc3f5f782010-05-25 23:40:22 +00001158
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001159 DIVariable DV(Var);
Devang Patelbf47fdb2011-08-10 20:55:27 +00001160 LexicalScope *Scope = NULL;
Devang Pateld8720f42010-05-27 20:25:04 +00001161 if (DV.getTag() == dwarf::DW_TAG_arg_variable &&
1162 DISubprogram(DV.getContext()).describes(MF->getFunction()))
Devang Patelbf47fdb2011-08-10 20:55:27 +00001163 Scope = LScopes.getCurrentFunctionScope();
Devang Patel40c7e412011-07-20 22:18:50 +00001164 else {
1165 if (DV.getVersion() <= LLVMDebugVersion9)
Devang Patelbf47fdb2011-08-10 20:55:27 +00001166 Scope = LScopes.findLexicalScope(MInsn->getDebugLoc());
Devang Patel40c7e412011-07-20 22:18:50 +00001167 else {
1168 if (MDNode *IA = DV.getInlinedAt())
Devang Patelbf47fdb2011-08-10 20:55:27 +00001169 Scope = LScopes.findInlinedScope(DebugLoc::getFromDILocation(IA));
Devang Patel40c7e412011-07-20 22:18:50 +00001170 else
Devang Patelbf47fdb2011-08-10 20:55:27 +00001171 Scope = LScopes.findLexicalScope(cast<MDNode>(DV->getOperand(1)));
Devang Patel40c7e412011-07-20 22:18:50 +00001172 }
1173 }
Devang Patelee432862010-05-20 19:57:06 +00001174 // If variable scope is not found then skip this variable.
Devang Patelc0c5a262010-05-21 00:10:20 +00001175 if (!Scope)
Devang Patelee432862010-05-20 19:57:06 +00001176 continue;
1177
1178 Processed.insert(DV);
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001179 assert(MInsn->isDebugValue() && "History must begin with debug value");
Devang Patel5a1a67c2011-08-15 19:01:20 +00001180 DbgVariable *AbsVar = findAbstractVariable(DV, MInsn->getDebugLoc());
1181 DbgVariable *RegVar = new DbgVariable(DV, AbsVar);
Devang Patel0478c152011-03-01 22:58:55 +00001182 if (!addCurrentFnArgument(MF, RegVar, Scope))
Devang Patelbf47fdb2011-08-10 20:55:27 +00001183 addScopeVariable(Scope, RegVar);
Devang Patel5a1a67c2011-08-15 19:01:20 +00001184 if (AbsVar)
Devang Patelff9dd0a2011-08-15 21:24:36 +00001185 AbsVar->setMInsn(MInsn);
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001186
Eric Christopherc56e3f02012-10-08 20:48:54 +00001187 // Simplify ranges that are fully coalesced.
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001188 if (History.size() <= 1 || (History.size() == 2 &&
1189 MInsn->isIdenticalTo(History.back()))) {
Devang Patelff9dd0a2011-08-15 21:24:36 +00001190 RegVar->setMInsn(MInsn);
Devang Patelc3f5f782010-05-25 23:40:22 +00001191 continue;
1192 }
1193
1194 // handle multiple DBG_VALUE instructions describing one variable.
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001195 RegVar->setDotDebugLocOffset(DotDebugLocEntries.size());
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001196
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001197 for (SmallVectorImpl<const MachineInstr*>::const_iterator
1198 HI = History.begin(), HE = History.end(); HI != HE; ++HI) {
1199 const MachineInstr *Begin = *HI;
1200 assert(Begin->isDebugValue() && "Invalid History entry");
Jakob Stoklund Olesene17232e2011-03-22 00:21:41 +00001201
Devang Patel4ada1d72011-06-01 23:00:17 +00001202 // Check if DBG_VALUE is truncating a range.
1203 if (Begin->getNumOperands() > 1 && Begin->getOperand(0).isReg()
1204 && !Begin->getOperand(0).getReg())
1205 continue;
1206
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001207 // Compute the range for a register location.
1208 const MCSymbol *FLabel = getLabelBeforeInsn(Begin);
1209 const MCSymbol *SLabel = 0;
1210
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001211 if (HI + 1 == HE)
1212 // If Begin is the last instruction in History then its value is valid
Chris Lattner7a2bdde2011-04-15 05:18:47 +00001213 // until the end of the function.
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001214 SLabel = FunctionEndSym;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001215 else {
1216 const MachineInstr *End = HI[1];
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001217 DEBUG(dbgs() << "DotDebugLoc Pair:\n"
Devang Patel476df5f2011-07-07 21:44:42 +00001218 << "\t" << *Begin << "\t" << *End << "\n");
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001219 if (End->isDebugValue())
1220 SLabel = getLabelBeforeInsn(End);
1221 else {
1222 // End is a normal instruction clobbering the range.
1223 SLabel = getLabelAfterInsn(End);
1224 assert(SLabel && "Forgot label after clobber instruction");
1225 ++HI;
1226 }
1227 }
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001228
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001229 // The value is valid until the next DBG_VALUE or clobber.
Eric Christopherabbb2002011-12-16 23:42:31 +00001230 DotDebugLocEntries.push_back(getDebugLocEntry(Asm, FLabel, SLabel,
1231 Begin));
Devang Patelc3f5f782010-05-25 23:40:22 +00001232 }
1233 DotDebugLocEntries.push_back(DotDebugLocEntry());
Devang Patel90a48ad2010-03-15 18:33:46 +00001234 }
Devang Patel98e1cac2010-05-14 21:01:35 +00001235
1236 // Collect info for variables that were optimized out.
Devang Patel93d39be2011-08-19 23:28:12 +00001237 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
1238 DIArray Variables = DISubprogram(FnScope->getScopeNode()).getVariables();
1239 for (unsigned i = 0, e = Variables.getNumElements(); i != e; ++i) {
1240 DIVariable DV(Variables.getElement(i));
1241 if (!DV || !DV.Verify() || !Processed.insert(DV))
1242 continue;
1243 if (LexicalScope *Scope = LScopes.findLexicalScope(DV.getContext()))
1244 addScopeVariable(Scope, new DbgVariable(DV, NULL));
Devang Patel98e1cac2010-05-14 21:01:35 +00001245 }
Devang Patelc3f5f782010-05-25 23:40:22 +00001246}
Devang Patel98e1cac2010-05-14 21:01:35 +00001247
Eric Christopherb6dc8652012-11-27 22:43:45 +00001248// Return Label preceding the instruction.
Eric Christopher72f7bfb2013-01-15 23:56:56 +00001249MCSymbol *DwarfDebug::getLabelBeforeInsn(const MachineInstr *MI) {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001250 MCSymbol *Label = LabelsBeforeInsn.lookup(MI);
1251 assert(Label && "Didn't insert label before instruction");
1252 return Label;
Devang Patelc3f5f782010-05-25 23:40:22 +00001253}
1254
Eric Christopherb6dc8652012-11-27 22:43:45 +00001255// Return Label immediately following the instruction.
Eric Christopher72f7bfb2013-01-15 23:56:56 +00001256MCSymbol *DwarfDebug::getLabelAfterInsn(const MachineInstr *MI) {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001257 return LabelsAfterInsn.lookup(MI);
Devang Patele717faa2009-10-06 01:26:37 +00001258}
1259
Eric Christopherb6dc8652012-11-27 22:43:45 +00001260// Process beginning of an instruction.
Devang Patelcbbe2872010-10-26 17:49:02 +00001261void DwarfDebug::beginInstruction(const MachineInstr *MI) {
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001262 // Check if source location changes, but ignore DBG_VALUE locations.
1263 if (!MI->isDebugValue()) {
1264 DebugLoc DL = MI->getDebugLoc();
1265 if (DL != PrevInstLoc && (!DL.isUnknown() || UnknownLocations)) {
Eric Christopher60b35f42012-04-05 20:39:05 +00001266 unsigned Flags = 0;
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001267 PrevInstLoc = DL;
Devang Patel4243e672011-05-11 19:22:19 +00001268 if (DL == PrologEndLoc) {
1269 Flags |= DWARF2_FLAG_PROLOGUE_END;
1270 PrologEndLoc = DebugLoc();
1271 }
Eric Christopher60b35f42012-04-05 20:39:05 +00001272 if (PrologEndLoc.isUnknown())
1273 Flags |= DWARF2_FLAG_IS_STMT;
1274
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001275 if (!DL.isUnknown()) {
1276 const MDNode *Scope = DL.getScope(Asm->MF->getFunction()->getContext());
Devang Patel4243e672011-05-11 19:22:19 +00001277 recordSourceLine(DL.getLine(), DL.getCol(), Scope, Flags);
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001278 } else
Devang Patel4243e672011-05-11 19:22:19 +00001279 recordSourceLine(0, 0, 0, 0);
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001280 }
Devang Patelc3f5f782010-05-25 23:40:22 +00001281 }
Devang Patelaead63c2010-03-29 22:59:58 +00001282
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001283 // Insert labels where requested.
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001284 DenseMap<const MachineInstr*, MCSymbol*>::iterator I =
1285 LabelsBeforeInsn.find(MI);
1286
1287 // No label needed.
1288 if (I == LabelsBeforeInsn.end())
1289 return;
1290
1291 // Label already assigned.
1292 if (I->second)
Devang Patelb2b31a62010-05-26 19:37:24 +00001293 return;
Devang Patel553881b2010-03-29 17:20:31 +00001294
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001295 if (!PrevLabel) {
Devang Patel77051f52010-05-26 21:23:46 +00001296 PrevLabel = MMI->getContext().CreateTempSymbol();
1297 Asm->OutStreamer.EmitLabel(PrevLabel);
Devang Patelb2b31a62010-05-26 19:37:24 +00001298 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001299 I->second = PrevLabel;
Devang Patel0d20ac82009-10-06 01:50:42 +00001300}
1301
Eric Christopherb6dc8652012-11-27 22:43:45 +00001302// Process end of an instruction.
Devang Patelcbbe2872010-10-26 17:49:02 +00001303void DwarfDebug::endInstruction(const MachineInstr *MI) {
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001304 // Don't create a new label after DBG_VALUE instructions.
1305 // They don't generate code.
1306 if (!MI->isDebugValue())
1307 PrevLabel = 0;
1308
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001309 DenseMap<const MachineInstr*, MCSymbol*>::iterator I =
1310 LabelsAfterInsn.find(MI);
1311
1312 // No label needed.
1313 if (I == LabelsAfterInsn.end())
1314 return;
1315
1316 // Label already assigned.
1317 if (I->second)
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001318 return;
1319
1320 // We need a label after this instruction.
1321 if (!PrevLabel) {
1322 PrevLabel = MMI->getContext().CreateTempSymbol();
1323 Asm->OutStreamer.EmitLabel(PrevLabel);
Devang Patel1c246352010-04-08 16:50:29 +00001324 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001325 I->second = PrevLabel;
Devang Patel53bb5c92009-11-10 23:06:00 +00001326}
1327
Eric Christopherb6dc8652012-11-27 22:43:45 +00001328// Each LexicalScope has first instruction and last instruction to mark
1329// beginning and end of a scope respectively. Create an inverse map that list
1330// scopes starts (and ends) with an instruction. One instruction may start (or
1331// end) multiple scopes. Ignore scopes that are not reachable.
Devang Patele37b0c62010-04-08 18:43:56 +00001332void DwarfDebug::identifyScopeMarkers() {
Devang Patelbf47fdb2011-08-10 20:55:27 +00001333 SmallVector<LexicalScope *, 4> WorkList;
1334 WorkList.push_back(LScopes.getCurrentFunctionScope());
Devang Patel42aafd72010-01-20 02:05:23 +00001335 while (!WorkList.empty()) {
Devang Patelbf47fdb2011-08-10 20:55:27 +00001336 LexicalScope *S = WorkList.pop_back_val();
Jim Grosbach1e20b962010-07-21 21:21:52 +00001337
Devang Patelbf47fdb2011-08-10 20:55:27 +00001338 const SmallVector<LexicalScope *, 4> &Children = S->getChildren();
Jim Grosbach1e20b962010-07-21 21:21:52 +00001339 if (!Children.empty())
Devang Patelbf47fdb2011-08-10 20:55:27 +00001340 for (SmallVector<LexicalScope *, 4>::const_iterator SI = Children.begin(),
Devang Patel42aafd72010-01-20 02:05:23 +00001341 SE = Children.end(); SI != SE; ++SI)
1342 WorkList.push_back(*SI);
1343
Devang Patel53bb5c92009-11-10 23:06:00 +00001344 if (S->isAbstractScope())
1345 continue;
Jim Grosbach1e20b962010-07-21 21:21:52 +00001346
Devang Patelbf47fdb2011-08-10 20:55:27 +00001347 const SmallVector<InsnRange, 4> &Ranges = S->getRanges();
Devang Pateleac9c072010-04-27 19:46:33 +00001348 if (Ranges.empty())
1349 continue;
Devang Patelbf47fdb2011-08-10 20:55:27 +00001350 for (SmallVector<InsnRange, 4>::const_iterator RI = Ranges.begin(),
Devang Pateleac9c072010-04-27 19:46:33 +00001351 RE = Ranges.end(); RI != RE; ++RI) {
Devang Patelbf47fdb2011-08-10 20:55:27 +00001352 assert(RI->first && "InsnRange does not have first instruction!");
1353 assert(RI->second && "InsnRange does not have second instruction!");
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001354 requestLabelBeforeInsn(RI->first);
1355 requestLabelAfterInsn(RI->second);
Devang Pateleac9c072010-04-27 19:46:33 +00001356 }
Devang Patelaf9e8472009-10-01 20:31:14 +00001357 }
Devang Patelaf9e8472009-10-01 20:31:14 +00001358}
1359
Eric Christopherb6dc8652012-11-27 22:43:45 +00001360// Get MDNode for DebugLoc's scope.
Devang Patela3f48672011-05-09 22:14:49 +00001361static MDNode *getScopeNode(DebugLoc DL, const LLVMContext &Ctx) {
1362 if (MDNode *InlinedAt = DL.getInlinedAt(Ctx))
1363 return getScopeNode(DebugLoc::getFromDILocation(InlinedAt), Ctx);
1364 return DL.getScope(Ctx);
1365}
1366
Eric Christopherb6dc8652012-11-27 22:43:45 +00001367// Walk up the scope chain of given debug loc and find line number info
1368// for the function.
Devang Patel4243e672011-05-11 19:22:19 +00001369static DebugLoc getFnDebugLoc(DebugLoc DL, const LLVMContext &Ctx) {
1370 const MDNode *Scope = getScopeNode(DL, Ctx);
1371 DISubprogram SP = getDISubprogram(Scope);
Eric Christopher6126a1e2012-04-03 00:43:49 +00001372 if (SP.Verify()) {
1373 // Check for number of operands since the compatibility is
1374 // cheap here.
Eric Christopherfa5b0502012-04-03 17:55:42 +00001375 if (SP->getNumOperands() > 19)
Eric Christopher6126a1e2012-04-03 00:43:49 +00001376 return DebugLoc::get(SP.getScopeLineNumber(), 0, SP);
1377 else
1378 return DebugLoc::get(SP.getLineNumber(), 0, SP);
1379 }
1380
Devang Patel4243e672011-05-11 19:22:19 +00001381 return DebugLoc();
1382}
1383
Eric Christopherb6dc8652012-11-27 22:43:45 +00001384// Gather pre-function debug information. Assumes being called immediately
1385// after the function entry point has been emitted.
Chris Lattnereec791a2010-01-26 23:18:02 +00001386void DwarfDebug::beginFunction(const MachineFunction *MF) {
Chris Lattner994cb122010-04-05 03:52:55 +00001387 if (!MMI->hasDebugInfo()) return;
Devang Patelbf47fdb2011-08-10 20:55:27 +00001388 LScopes.initialize(*MF);
1389 if (LScopes.empty()) return;
1390 identifyScopeMarkers();
Devang Patel60b35bd2009-10-06 18:37:31 +00001391
Devang Pateleac9c072010-04-27 19:46:33 +00001392 FunctionBeginSym = Asm->GetTempSymbol("func_begin",
1393 Asm->getFunctionNumber());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001394 // Assumes in correct section after the entry point.
Devang Pateleac9c072010-04-27 19:46:33 +00001395 Asm->OutStreamer.EmitLabel(FunctionBeginSym);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001396
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001397 assert(UserVariables.empty() && DbgValues.empty() && "Maps weren't cleaned");
1398
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001399 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
Eric Christopherb6dc8652012-11-27 22:43:45 +00001400 // LiveUserVar - Map physreg numbers to the MDNode they contain.
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001401 std::vector<const MDNode*> LiveUserVar(TRI->getNumRegs());
1402
Devang Patelb2b31a62010-05-26 19:37:24 +00001403 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001404 I != E; ++I) {
1405 bool AtBlockEntry = true;
Devang Patelb2b31a62010-05-26 19:37:24 +00001406 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
1407 II != IE; ++II) {
1408 const MachineInstr *MI = II;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001409
Devang Patelb2b31a62010-05-26 19:37:24 +00001410 if (MI->isDebugValue()) {
Nick Lewycky746cb672011-10-26 22:55:33 +00001411 assert(MI->getNumOperands() > 1 && "Invalid machine instruction!");
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001412
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001413 // Keep track of user variables.
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001414 const MDNode *Var =
1415 MI->getOperand(MI->getNumOperands() - 1).getMetadata();
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001416
1417 // Variable is in a register, we need to check for clobbers.
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001418 if (isDbgValueInDefinedReg(MI))
1419 LiveUserVar[MI->getOperand(0).getReg()] = Var;
1420
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001421 // Check the history of this variable.
1422 SmallVectorImpl<const MachineInstr*> &History = DbgValues[Var];
1423 if (History.empty()) {
1424 UserVariables.push_back(Var);
1425 // The first mention of a function argument gets the FunctionBeginSym
1426 // label, so arguments are visible when breaking at function entry.
1427 DIVariable DV(Var);
1428 if (DV.Verify() && DV.getTag() == dwarf::DW_TAG_arg_variable &&
1429 DISubprogram(getDISubprogram(DV.getContext()))
1430 .describes(MF->getFunction()))
1431 LabelsBeforeInsn[MI] = FunctionBeginSym;
1432 } else {
1433 // We have seen this variable before. Try to coalesce DBG_VALUEs.
1434 const MachineInstr *Prev = History.back();
1435 if (Prev->isDebugValue()) {
1436 // Coalesce identical entries at the end of History.
1437 if (History.size() >= 2 &&
Devang Patel79862892011-07-07 00:14:27 +00001438 Prev->isIdenticalTo(History[History.size() - 2])) {
Eric Christopher02c1a642012-10-08 20:48:49 +00001439 DEBUG(dbgs() << "Coalescing identical DBG_VALUE entries:\n"
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001440 << "\t" << *Prev
Devang Patel79862892011-07-07 00:14:27 +00001441 << "\t" << *History[History.size() - 2] << "\n");
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001442 History.pop_back();
Devang Patel79862892011-07-07 00:14:27 +00001443 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001444
1445 // Terminate old register assignments that don't reach MI;
1446 MachineFunction::const_iterator PrevMBB = Prev->getParent();
1447 if (PrevMBB != I && (!AtBlockEntry || llvm::next(PrevMBB) != I) &&
1448 isDbgValueInDefinedReg(Prev)) {
1449 // Previous register assignment needs to terminate at the end of
1450 // its basic block.
1451 MachineBasicBlock::const_iterator LastMI =
1452 PrevMBB->getLastNonDebugInstr();
Devang Patel79862892011-07-07 00:14:27 +00001453 if (LastMI == PrevMBB->end()) {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001454 // Drop DBG_VALUE for empty range.
Eric Christopher02c1a642012-10-08 20:48:49 +00001455 DEBUG(dbgs() << "Dropping DBG_VALUE for empty range:\n"
Devang Patel79862892011-07-07 00:14:27 +00001456 << "\t" << *Prev << "\n");
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001457 History.pop_back();
Devang Patel79862892011-07-07 00:14:27 +00001458 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001459 else {
1460 // Terminate after LastMI.
1461 History.push_back(LastMI);
1462 }
1463 }
1464 }
1465 }
1466 History.push_back(MI);
Devang Patelb2b31a62010-05-26 19:37:24 +00001467 } else {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001468 // Not a DBG_VALUE instruction.
1469 if (!MI->isLabel())
1470 AtBlockEntry = false;
1471
Eric Christopher0313ced2012-10-04 20:46:14 +00001472 // First known non-DBG_VALUE and non-frame setup location marks
1473 // the beginning of the function body.
1474 if (!MI->getFlag(MachineInstr::FrameSetup) &&
1475 (PrologEndLoc.isUnknown() && !MI->getDebugLoc().isUnknown()))
Devang Patel4243e672011-05-11 19:22:19 +00001476 PrologEndLoc = MI->getDebugLoc();
1477
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001478 // Check if the instruction clobbers any registers with debug vars.
1479 for (MachineInstr::const_mop_iterator MOI = MI->operands_begin(),
1480 MOE = MI->operands_end(); MOI != MOE; ++MOI) {
1481 if (!MOI->isReg() || !MOI->isDef() || !MOI->getReg())
1482 continue;
Jakob Stoklund Olesen396618b2012-06-01 23:28:30 +00001483 for (MCRegAliasIterator AI(MOI->getReg(), TRI, true);
1484 AI.isValid(); ++AI) {
1485 unsigned Reg = *AI;
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001486 const MDNode *Var = LiveUserVar[Reg];
1487 if (!Var)
1488 continue;
1489 // Reg is now clobbered.
1490 LiveUserVar[Reg] = 0;
1491
1492 // Was MD last defined by a DBG_VALUE referring to Reg?
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001493 DbgValueHistoryMap::iterator HistI = DbgValues.find(Var);
1494 if (HistI == DbgValues.end())
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001495 continue;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001496 SmallVectorImpl<const MachineInstr*> &History = HistI->second;
1497 if (History.empty())
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001498 continue;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001499 const MachineInstr *Prev = History.back();
1500 // Sanity-check: Register assignments are terminated at the end of
1501 // their block.
1502 if (!Prev->isDebugValue() || Prev->getParent() != MI->getParent())
1503 continue;
1504 // Is the variable still in Reg?
1505 if (!isDbgValueInDefinedReg(Prev) ||
1506 Prev->getOperand(0).getReg() != Reg)
1507 continue;
1508 // Var is clobbered. Make sure the next instruction gets a label.
1509 History.push_back(MI);
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001510 }
1511 }
Devang Patelb2b31a62010-05-26 19:37:24 +00001512 }
Devang Patelb2b31a62010-05-26 19:37:24 +00001513 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001514 }
1515
1516 for (DbgValueHistoryMap::iterator I = DbgValues.begin(), E = DbgValues.end();
1517 I != E; ++I) {
1518 SmallVectorImpl<const MachineInstr*> &History = I->second;
1519 if (History.empty())
1520 continue;
1521
1522 // Make sure the final register assignments are terminated.
1523 const MachineInstr *Prev = History.back();
1524 if (Prev->isDebugValue() && isDbgValueInDefinedReg(Prev)) {
1525 const MachineBasicBlock *PrevMBB = Prev->getParent();
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001526 MachineBasicBlock::const_iterator LastMI =
Devang Patel5bc942c2011-08-10 23:58:09 +00001527 PrevMBB->getLastNonDebugInstr();
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001528 if (LastMI == PrevMBB->end())
1529 // Drop DBG_VALUE for empty range.
1530 History.pop_back();
1531 else {
1532 // Terminate after LastMI.
1533 History.push_back(LastMI);
1534 }
1535 }
1536 // Request labels for the full history.
1537 for (unsigned i = 0, e = History.size(); i != e; ++i) {
1538 const MachineInstr *MI = History[i];
1539 if (MI->isDebugValue())
1540 requestLabelBeforeInsn(MI);
1541 else
1542 requestLabelAfterInsn(MI);
1543 }
1544 }
Devang Patelb2b31a62010-05-26 19:37:24 +00001545
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001546 PrevInstLoc = DebugLoc();
Devang Patelb2b31a62010-05-26 19:37:24 +00001547 PrevLabel = FunctionBeginSym;
Devang Patel4243e672011-05-11 19:22:19 +00001548
1549 // Record beginning of function.
1550 if (!PrologEndLoc.isUnknown()) {
1551 DebugLoc FnStartDL = getFnDebugLoc(PrologEndLoc,
1552 MF->getFunction()->getContext());
1553 recordSourceLine(FnStartDL.getLine(), FnStartDL.getCol(),
1554 FnStartDL.getScope(MF->getFunction()->getContext()),
David Blaikie836cfc42012-12-04 22:02:33 +00001555 // We'd like to list the prologue as "not statements" but GDB behaves
1556 // poorly if we do that. Revisit this with caution/GDB (7.5+) testing.
David Blaikieb36c5312012-12-04 21:05:36 +00001557 DWARF2_FLAG_IS_STMT);
Devang Patel4243e672011-05-11 19:22:19 +00001558 }
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001559}
1560
Devang Patelbf47fdb2011-08-10 20:55:27 +00001561void DwarfDebug::addScopeVariable(LexicalScope *LS, DbgVariable *Var) {
1562// SmallVector<DbgVariable *, 8> &Vars = ScopeVariables.lookup(LS);
1563 ScopeVariables[LS].push_back(Var);
1564// Vars.push_back(Var);
1565}
1566
Eric Christopherb6dc8652012-11-27 22:43:45 +00001567// Gather and emit post-function debug information.
Chris Lattnereec791a2010-01-26 23:18:02 +00001568void DwarfDebug::endFunction(const MachineFunction *MF) {
Devang Patelbf47fdb2011-08-10 20:55:27 +00001569 if (!MMI->hasDebugInfo() || LScopes.empty()) return;
Devang Patel70d75ca2009-11-12 19:02:56 +00001570
Devang Patelbf47fdb2011-08-10 20:55:27 +00001571 // Define end label for subprogram.
1572 FunctionEndSym = Asm->GetTempSymbol("func_end",
1573 Asm->getFunctionNumber());
1574 // Assumes in correct section after the entry point.
1575 Asm->OutStreamer.EmitLabel(FunctionEndSym);
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001576
Devang Patelbf47fdb2011-08-10 20:55:27 +00001577 SmallPtrSet<const MDNode *, 16> ProcessedVars;
1578 collectVariableInfo(MF, ProcessedVars);
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001579
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001580 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
Devang Patel94c7ddb2011-08-16 22:09:43 +00001581 CompileUnit *TheCU = SPMap.lookup(FnScope->getScopeNode());
Nick Lewycky746cb672011-10-26 22:55:33 +00001582 assert(TheCU && "Unable to find compile unit!");
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001583
Devang Patelbf47fdb2011-08-10 20:55:27 +00001584 // Construct abstract scopes.
Devang Patelcd9f6c52011-08-12 18:10:19 +00001585 ArrayRef<LexicalScope *> AList = LScopes.getAbstractScopesList();
1586 for (unsigned i = 0, e = AList.size(); i != e; ++i) {
1587 LexicalScope *AScope = AList[i];
1588 DISubprogram SP(AScope->getScopeNode());
Devang Patelbf47fdb2011-08-10 20:55:27 +00001589 if (SP.Verify()) {
1590 // Collect info for variables that were optimized out.
Devang Patel93d39be2011-08-19 23:28:12 +00001591 DIArray Variables = SP.getVariables();
1592 for (unsigned i = 0, e = Variables.getNumElements(); i != e; ++i) {
1593 DIVariable DV(Variables.getElement(i));
1594 if (!DV || !DV.Verify() || !ProcessedVars.insert(DV))
1595 continue;
Alexey Samsonovb67bd332012-07-06 08:45:08 +00001596 // Check that DbgVariable for DV wasn't created earlier, when
1597 // findAbstractVariable() was called for inlined instance of DV.
1598 LLVMContext &Ctx = DV->getContext();
1599 DIVariable CleanDV = cleanseInlinedVariable(DV, Ctx);
1600 if (AbstractVariables.lookup(CleanDV))
1601 continue;
Devang Patel93d39be2011-08-19 23:28:12 +00001602 if (LexicalScope *Scope = LScopes.findAbstractScope(DV.getContext()))
1603 addScopeVariable(Scope, new DbgVariable(DV, NULL));
Devang Patel78e127d2010-06-25 22:07:34 +00001604 }
1605 }
Devang Patelcd9f6c52011-08-12 18:10:19 +00001606 if (ProcessedSPNodes.count(AScope->getScopeNode()) == 0)
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001607 constructScopeDIE(TheCU, AScope);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001608 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001609
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001610 DIE *CurFnDIE = constructScopeDIE(TheCU, FnScope);
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001611
Nick Lewycky8a8d4792011-12-02 22:16:29 +00001612 if (!MF->getTarget().Options.DisableFramePointerElim(*MF))
Eric Christopher873cf0a2012-08-24 01:14:27 +00001613 TheCU->addFlag(CurFnDIE, dwarf::DW_AT_APPLE_omit_frame_ptr);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001614
Devang Patelbf47fdb2011-08-10 20:55:27 +00001615 DebugFrames.push_back(FunctionDebugFrameInfo(Asm->getFunctionNumber(),
1616 MMI->getFrameMoves()));
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001617
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001618 // Clear debug info
Devang Patelbf47fdb2011-08-10 20:55:27 +00001619 for (DenseMap<LexicalScope *, SmallVector<DbgVariable *, 8> >::iterator
1620 I = ScopeVariables.begin(), E = ScopeVariables.end(); I != E; ++I)
1621 DeleteContainerPointers(I->second);
1622 ScopeVariables.clear();
Devang Pateleac0c9d2011-04-22 18:09:57 +00001623 DeleteContainerPointers(CurrentFnArguments);
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001624 UserVariables.clear();
1625 DbgValues.clear();
Jeffrey Yasskin5c213dc2010-03-12 17:45:06 +00001626 AbstractVariables.clear();
Devang Pateleac9c072010-04-27 19:46:33 +00001627 LabelsBeforeInsn.clear();
1628 LabelsAfterInsn.clear();
Devang Patelf2548ca2010-04-16 23:33:45 +00001629 PrevLabel = NULL;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001630}
1631
Eric Christopherb6dc8652012-11-27 22:43:45 +00001632// Register a source line with debug info. Returns the unique label that was
1633// emitted and which provides correspondence to the source line list.
Devang Patel4243e672011-05-11 19:22:19 +00001634void DwarfDebug::recordSourceLine(unsigned Line, unsigned Col, const MDNode *S,
1635 unsigned Flags) {
Devang Patel65dbc902009-11-25 17:36:49 +00001636 StringRef Fn;
Devang Patel23670e52011-03-24 20:30:50 +00001637 StringRef Dir;
Dan Gohman1cc0d622010-05-05 23:41:32 +00001638 unsigned Src = 1;
1639 if (S) {
1640 DIDescriptor Scope(S);
Devang Patelf84548d2009-10-05 18:03:19 +00001641
Dan Gohman1cc0d622010-05-05 23:41:32 +00001642 if (Scope.isCompileUnit()) {
1643 DICompileUnit CU(S);
Dan Gohman1cc0d622010-05-05 23:41:32 +00001644 Fn = CU.getFilename();
Devang Patel23670e52011-03-24 20:30:50 +00001645 Dir = CU.getDirectory();
Devang Patel3cabc9d2010-10-28 17:30:52 +00001646 } else if (Scope.isFile()) {
1647 DIFile F(S);
Devang Patel3cabc9d2010-10-28 17:30:52 +00001648 Fn = F.getFilename();
Devang Patel23670e52011-03-24 20:30:50 +00001649 Dir = F.getDirectory();
Dan Gohman1cc0d622010-05-05 23:41:32 +00001650 } else if (Scope.isSubprogram()) {
1651 DISubprogram SP(S);
Dan Gohman1cc0d622010-05-05 23:41:32 +00001652 Fn = SP.getFilename();
Devang Patel23670e52011-03-24 20:30:50 +00001653 Dir = SP.getDirectory();
Eric Christopher6618a242011-10-11 22:59:11 +00001654 } else if (Scope.isLexicalBlockFile()) {
1655 DILexicalBlockFile DBF(S);
1656 Fn = DBF.getFilename();
1657 Dir = DBF.getDirectory();
Dan Gohman1cc0d622010-05-05 23:41:32 +00001658 } else if (Scope.isLexicalBlock()) {
1659 DILexicalBlock DB(S);
Dan Gohman1cc0d622010-05-05 23:41:32 +00001660 Fn = DB.getFilename();
Devang Patel23670e52011-03-24 20:30:50 +00001661 Dir = DB.getDirectory();
Dan Gohman1cc0d622010-05-05 23:41:32 +00001662 } else
Craig Topper5e25ee82012-02-05 08:31:47 +00001663 llvm_unreachable("Unexpected scope info");
Dan Gohman1cc0d622010-05-05 23:41:32 +00001664
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001665 Src = getOrCreateSourceID(Fn, Dir);
Dan Gohman1cc0d622010-05-05 23:41:32 +00001666 }
Nick Lewycky3bbb6f72011-07-29 03:49:23 +00001667 Asm->OutStreamer.EmitDwarfLocDirective(Src, Line, Col, Flags, 0, 0, Fn);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001668}
1669
Bill Wendling829e67b2009-05-20 23:22:40 +00001670//===----------------------------------------------------------------------===//
1671// Emit Methods
1672//===----------------------------------------------------------------------===//
1673
Eric Christopherb6dc8652012-11-27 22:43:45 +00001674// Compute the size and offset of a DIE.
Jim Grosbach7ab38df2009-11-22 19:20:36 +00001675unsigned
Eric Christopher0e3e9b72012-12-10 23:34:43 +00001676DwarfUnits::computeSizeAndOffset(DIE *Die, unsigned Offset) {
Bill Wendling94d04b82009-05-20 23:21:38 +00001677 // Get the children.
1678 const std::vector<DIE *> &Children = Die->getChildren();
1679
Bill Wendling94d04b82009-05-20 23:21:38 +00001680 // Record the abbreviation.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001681 assignAbbrevNumber(Die->getAbbrev());
Bill Wendling94d04b82009-05-20 23:21:38 +00001682
1683 // Get the abbreviation for this DIE.
1684 unsigned AbbrevNumber = Die->getAbbrevNumber();
Eric Christopher0e3e9b72012-12-10 23:34:43 +00001685 const DIEAbbrev *Abbrev = Abbreviations->at(AbbrevNumber - 1);
Bill Wendling94d04b82009-05-20 23:21:38 +00001686
1687 // Set DIE offset
1688 Die->setOffset(Offset);
1689
1690 // Start the size with the size of abbreviation code.
Chris Lattneraf76e592009-08-22 20:48:53 +00001691 Offset += MCAsmInfo::getULEB128Size(AbbrevNumber);
Bill Wendling94d04b82009-05-20 23:21:38 +00001692
1693 const SmallVector<DIEValue*, 32> &Values = Die->getValues();
1694 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
1695
1696 // Size the DIE attribute values.
1697 for (unsigned i = 0, N = Values.size(); i < N; ++i)
1698 // Size attribute value.
Chris Lattnera37d5382010-04-05 00:18:22 +00001699 Offset += Values[i]->SizeOf(Asm, AbbrevData[i].getForm());
Bill Wendling94d04b82009-05-20 23:21:38 +00001700
1701 // Size the DIE children if any.
1702 if (!Children.empty()) {
1703 assert(Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes &&
1704 "Children flag not set");
1705
1706 for (unsigned j = 0, M = Children.size(); j < M; ++j)
Eric Christopherfbd19752012-11-20 22:14:13 +00001707 Offset = computeSizeAndOffset(Children[j], Offset);
Bill Wendling94d04b82009-05-20 23:21:38 +00001708
1709 // End of children marker.
1710 Offset += sizeof(int8_t);
1711 }
1712
1713 Die->setSize(Offset - Die->getOffset());
1714 return Offset;
1715}
1716
Eric Christopherb6dc8652012-11-27 22:43:45 +00001717// Compute the size and offset of all the DIEs.
Eric Christopher0e3e9b72012-12-10 23:34:43 +00001718void DwarfUnits::computeSizeAndOffsets() {
1719 for (SmallVector<CompileUnit *, 1>::iterator I = CUs.begin(),
1720 E = CUs.end(); I != E; ++I) {
Eric Christopher98e237f2012-11-30 23:59:06 +00001721 unsigned Offset =
1722 sizeof(int32_t) + // Length of Compilation Unit Info
1723 sizeof(int16_t) + // DWARF version number
1724 sizeof(int32_t) + // Offset Into Abbrev. Section
1725 sizeof(int8_t); // Pointer Size (in bytes)
1726
Eric Christopher0e3e9b72012-12-10 23:34:43 +00001727 computeSizeAndOffset((*I)->getCUDie(), Offset);
Devang Patel163a9f72010-05-10 22:49:55 +00001728 }
Bill Wendling94d04b82009-05-20 23:21:38 +00001729}
1730
Eric Christopherb6dc8652012-11-27 22:43:45 +00001731// Emit initial Dwarf sections with a label at the start of each one.
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001732void DwarfDebug::emitSectionLabels() {
Chris Lattner6c2f9e12009-08-19 05:49:37 +00001733 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
Daniel Dunbarf612ff62009-09-19 20:40:05 +00001734
Bill Wendling94d04b82009-05-20 23:21:38 +00001735 // Dwarf sections base addresses.
Jim Grosbach1e20b962010-07-21 21:21:52 +00001736 DwarfInfoSectionSym =
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001737 emitSectionSym(Asm, TLOF.getDwarfInfoSection(), "section_info");
Jim Grosbach1e20b962010-07-21 21:21:52 +00001738 DwarfAbbrevSectionSym =
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001739 emitSectionSym(Asm, TLOF.getDwarfAbbrevSection(), "section_abbrev");
Eric Christopher6eebe472012-12-19 22:02:53 +00001740 if (useSplitDwarf())
1741 DwarfAbbrevDWOSectionSym =
1742 emitSectionSym(Asm, TLOF.getDwarfAbbrevDWOSection(),
1743 "section_abbrev_dwo");
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001744 emitSectionSym(Asm, TLOF.getDwarfARangesSection());
Jim Grosbach1e20b962010-07-21 21:21:52 +00001745
Chris Lattner9c69e285532010-04-04 22:59:04 +00001746 if (const MCSection *MacroInfo = TLOF.getDwarfMacroInfoSection())
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001747 emitSectionSym(Asm, MacroInfo);
Bill Wendling94d04b82009-05-20 23:21:38 +00001748
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001749 emitSectionSym(Asm, TLOF.getDwarfLineSection(), "section_line");
1750 emitSectionSym(Asm, TLOF.getDwarfLocSection());
1751 emitSectionSym(Asm, TLOF.getDwarfPubTypesSection());
Jim Grosbach1e20b962010-07-21 21:21:52 +00001752 DwarfStrSectionSym =
Eric Christopher64f824c2012-12-27 02:14:01 +00001753 emitSectionSym(Asm, TLOF.getDwarfStrSection(), "info_string");
1754 if (useSplitDwarf())
1755 DwarfStrDWOSectionSym =
1756 emitSectionSym(Asm, TLOF.getDwarfStrDWOSection(), "skel_string");
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001757 DwarfDebugRangeSectionSym = emitSectionSym(Asm, TLOF.getDwarfRangesSection(),
Devang Patelf2548ca2010-04-16 23:33:45 +00001758 "debug_range");
Bill Wendling94d04b82009-05-20 23:21:38 +00001759
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001760 DwarfDebugLocSectionSym = emitSectionSym(Asm, TLOF.getDwarfLocSection(),
Devang Patelc3f5f782010-05-25 23:40:22 +00001761 "section_debug_loc");
1762
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001763 TextSectionSym = emitSectionSym(Asm, TLOF.getTextSection(), "text_begin");
1764 emitSectionSym(Asm, TLOF.getDataSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00001765}
1766
Eric Christopherb6dc8652012-11-27 22:43:45 +00001767// Recursively emits a debug information entry.
Eric Christopher6eebe472012-12-19 22:02:53 +00001768void DwarfDebug::emitDIE(DIE *Die, std::vector<DIEAbbrev *> *Abbrevs) {
Bill Wendling94d04b82009-05-20 23:21:38 +00001769 // Get the abbreviation for this DIE.
1770 unsigned AbbrevNumber = Die->getAbbrevNumber();
Eric Christopher6eebe472012-12-19 22:02:53 +00001771 const DIEAbbrev *Abbrev = Abbrevs->at(AbbrevNumber - 1);
Bill Wendling94d04b82009-05-20 23:21:38 +00001772
Bill Wendling94d04b82009-05-20 23:21:38 +00001773 // Emit the code (index) for the abbreviation.
Chris Lattner3f53c832010-04-04 18:52:31 +00001774 if (Asm->isVerbose())
Chris Lattner894d75a2010-01-22 23:18:42 +00001775 Asm->OutStreamer.AddComment("Abbrev [" + Twine(AbbrevNumber) + "] 0x" +
1776 Twine::utohexstr(Die->getOffset()) + ":0x" +
1777 Twine::utohexstr(Die->getSize()) + " " +
1778 dwarf::TagString(Abbrev->getTag()));
Chris Lattner7e1a8f82010-04-04 19:09:29 +00001779 Asm->EmitULEB128(AbbrevNumber);
Bill Wendling94d04b82009-05-20 23:21:38 +00001780
Jeffrey Yasskin638fe8d2010-03-22 18:47:14 +00001781 const SmallVector<DIEValue*, 32> &Values = Die->getValues();
Bill Wendling94d04b82009-05-20 23:21:38 +00001782 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
1783
1784 // Emit the DIE attribute values.
1785 for (unsigned i = 0, N = Values.size(); i < N; ++i) {
1786 unsigned Attr = AbbrevData[i].getAttribute();
1787 unsigned Form = AbbrevData[i].getForm();
1788 assert(Form && "Too many attributes for DIE (check abbreviation)");
1789
Chris Lattner3f53c832010-04-04 18:52:31 +00001790 if (Asm->isVerbose())
Chris Lattnera8013622010-01-24 18:54:17 +00001791 Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr));
Jim Grosbach1e20b962010-07-21 21:21:52 +00001792
Bill Wendling94d04b82009-05-20 23:21:38 +00001793 switch (Attr) {
Bill Wendling94d04b82009-05-20 23:21:38 +00001794 case dwarf::DW_AT_abstract_origin: {
1795 DIEEntry *E = cast<DIEEntry>(Values[i]);
1796 DIE *Origin = E->getEntry();
Devang Patel53bb5c92009-11-10 23:06:00 +00001797 unsigned Addr = Origin->getOffset();
Bill Wendling94d04b82009-05-20 23:21:38 +00001798 Asm->EmitInt32(Addr);
1799 break;
1800 }
Devang Patelf2548ca2010-04-16 23:33:45 +00001801 case dwarf::DW_AT_ranges: {
1802 // DW_AT_range Value encodes offset in debug_range section.
1803 DIEInteger *V = cast<DIEInteger>(Values[i]);
Devang Patelb1fcfbe2010-09-02 16:43:44 +00001804
Nick Lewyckyffccd922012-06-22 01:25:12 +00001805 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections()) {
Devang Patelb1fcfbe2010-09-02 16:43:44 +00001806 Asm->EmitLabelPlusOffset(DwarfDebugRangeSectionSym,
1807 V->getValue(),
1808 4);
1809 } else {
1810 Asm->EmitLabelOffsetDifference(DwarfDebugRangeSectionSym,
1811 V->getValue(),
1812 DwarfDebugRangeSectionSym,
1813 4);
1814 }
Devang Patelf2548ca2010-04-16 23:33:45 +00001815 break;
1816 }
Devang Patelc3f5f782010-05-25 23:40:22 +00001817 case dwarf::DW_AT_location: {
Nick Lewyckyffccd922012-06-22 01:25:12 +00001818 if (DIELabel *L = dyn_cast<DIELabel>(Values[i])) {
1819 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
1820 Asm->EmitLabelReference(L->getValue(), 4);
1821 else
1822 Asm->EmitLabelDifference(L->getValue(), DwarfDebugLocSectionSym, 4);
1823 } else {
Devang Patelc3f5f782010-05-25 23:40:22 +00001824 Values[i]->EmitValue(Asm, Form);
Nick Lewyckyffccd922012-06-22 01:25:12 +00001825 }
Devang Patelc3f5f782010-05-25 23:40:22 +00001826 break;
1827 }
Devang Patel2a361602010-09-29 19:08:08 +00001828 case dwarf::DW_AT_accessibility: {
1829 if (Asm->isVerbose()) {
1830 DIEInteger *V = cast<DIEInteger>(Values[i]);
1831 Asm->OutStreamer.AddComment(dwarf::AccessibilityString(V->getValue()));
1832 }
1833 Values[i]->EmitValue(Asm, Form);
1834 break;
1835 }
Bill Wendling94d04b82009-05-20 23:21:38 +00001836 default:
1837 // Emit an attribute using the defined form.
Chris Lattnerd38fee82010-04-05 00:13:49 +00001838 Values[i]->EmitValue(Asm, Form);
Bill Wendling94d04b82009-05-20 23:21:38 +00001839 break;
1840 }
Bill Wendling94d04b82009-05-20 23:21:38 +00001841 }
1842
1843 // Emit the DIE children if any.
1844 if (Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes) {
1845 const std::vector<DIE *> &Children = Die->getChildren();
1846
1847 for (unsigned j = 0, M = Children.size(); j < M; ++j)
Eric Christopher6eebe472012-12-19 22:02:53 +00001848 emitDIE(Children[j], Abbrevs);
Bill Wendling94d04b82009-05-20 23:21:38 +00001849
Chris Lattner3f53c832010-04-04 18:52:31 +00001850 if (Asm->isVerbose())
Chris Lattner233f52b2010-03-09 23:52:58 +00001851 Asm->OutStreamer.AddComment("End Of Children Mark");
1852 Asm->EmitInt8(0);
Bill Wendling94d04b82009-05-20 23:21:38 +00001853 }
1854}
1855
Eric Christopherb1e66d02012-12-15 00:04:07 +00001856// Emit the various dwarf units to the unit section USection with
1857// the abbreviations going into ASection.
1858void DwarfUnits::emitUnits(DwarfDebug *DD,
1859 const MCSection *USection,
1860 const MCSection *ASection,
1861 const MCSymbol *ASectionSym) {
1862 Asm->OutStreamer.SwitchSection(USection);
1863 for (SmallVector<CompileUnit *, 1>::iterator I = CUs.begin(),
1864 E = CUs.end(); I != E; ++I) {
1865 CompileUnit *TheCU = *I;
Devang Patel163a9f72010-05-10 22:49:55 +00001866 DIE *Die = TheCU->getCUDie();
Jim Grosbach1e20b962010-07-21 21:21:52 +00001867
Devang Patel163a9f72010-05-10 22:49:55 +00001868 // Emit the compile units header.
Eric Christopherb1e66d02012-12-15 00:04:07 +00001869 Asm->OutStreamer
1870 .EmitLabel(Asm->GetTempSymbol(USection->getLabelBeginName(),
1871 TheCU->getUniqueID()));
Jim Grosbach1e20b962010-07-21 21:21:52 +00001872
Devang Patel163a9f72010-05-10 22:49:55 +00001873 // Emit size of content not including length itself
1874 unsigned ContentSize = Die->getSize() +
1875 sizeof(int16_t) + // DWARF version number
1876 sizeof(int32_t) + // Offset Into Abbrev. Section
Devang Patel65705d52011-04-13 19:41:17 +00001877 sizeof(int8_t); // Pointer Size (in bytes)
Jim Grosbach1e20b962010-07-21 21:21:52 +00001878
Devang Patel163a9f72010-05-10 22:49:55 +00001879 Asm->OutStreamer.AddComment("Length of Compilation Unit Info");
1880 Asm->EmitInt32(ContentSize);
1881 Asm->OutStreamer.AddComment("DWARF version number");
1882 Asm->EmitInt16(dwarf::DWARF_VERSION);
1883 Asm->OutStreamer.AddComment("Offset Into Abbrev. Section");
Eric Christopherb1e66d02012-12-15 00:04:07 +00001884 Asm->EmitSectionOffset(Asm->GetTempSymbol(ASection->getLabelBeginName()),
1885 ASectionSym);
Devang Patel163a9f72010-05-10 22:49:55 +00001886 Asm->OutStreamer.AddComment("Address Size (in bytes)");
Chandler Carruth426c2bf2012-11-01 09:14:31 +00001887 Asm->EmitInt8(Asm->getDataLayout().getPointerSize());
Jim Grosbach1e20b962010-07-21 21:21:52 +00001888
Eric Christopher6eebe472012-12-19 22:02:53 +00001889 DD->emitDIE(Die, Abbreviations);
Eric Christopherb1e66d02012-12-15 00:04:07 +00001890 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol(USection->getLabelEndName(),
Eli Benderskyd4a05e02012-12-03 18:45:45 +00001891 TheCU->getUniqueID()));
Devang Patel163a9f72010-05-10 22:49:55 +00001892 }
Bill Wendling94d04b82009-05-20 23:21:38 +00001893}
1894
Eric Christopher98e237f2012-11-30 23:59:06 +00001895// Emit the debug info section.
1896void DwarfDebug::emitDebugInfo() {
Eric Christopherb1e66d02012-12-15 00:04:07 +00001897 DwarfUnits &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
1898
1899 Holder.emitUnits(this, Asm->getObjFileLowering().getDwarfInfoSection(),
1900 Asm->getObjFileLowering().getDwarfAbbrevSection(),
1901 DwarfAbbrevSectionSym);
Eric Christopher98e237f2012-11-30 23:59:06 +00001902}
1903
Eric Christopherb6dc8652012-11-27 22:43:45 +00001904// Emit the abbreviation section.
Eric Christopher7dc68db2012-11-20 23:30:11 +00001905void DwarfDebug::emitAbbreviations() {
Eric Christopher6eebe472012-12-19 22:02:53 +00001906 if (!useSplitDwarf())
1907 emitAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevSection(),
1908 &Abbreviations);
1909 else
1910 emitSkeletonAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevSection());
1911}
Bill Wendling94d04b82009-05-20 23:21:38 +00001912
Eric Christopher6eebe472012-12-19 22:02:53 +00001913void DwarfDebug::emitAbbrevs(const MCSection *Section,
1914 std::vector<DIEAbbrev *> *Abbrevs) {
1915 // Check to see if it is worth the effort.
1916 if (!Abbrevs->empty()) {
1917 // Start the debug abbrev section.
1918 Asm->OutStreamer.SwitchSection(Section);
1919
1920 MCSymbol *Begin = Asm->GetTempSymbol(Section->getLabelBeginName());
Eric Christopher44fedba2012-12-13 03:00:38 +00001921 Asm->OutStreamer.EmitLabel(Begin);
Bill Wendling94d04b82009-05-20 23:21:38 +00001922
1923 // For each abbrevation.
Eric Christopher6eebe472012-12-19 22:02:53 +00001924 for (unsigned i = 0, N = Abbrevs->size(); i < N; ++i) {
Bill Wendling94d04b82009-05-20 23:21:38 +00001925 // Get abbreviation data
Eric Christopher6eebe472012-12-19 22:02:53 +00001926 const DIEAbbrev *Abbrev = Abbrevs->at(i);
Bill Wendling94d04b82009-05-20 23:21:38 +00001927
1928 // Emit the abbrevations code (base 1 index.)
Chris Lattner7e1a8f82010-04-04 19:09:29 +00001929 Asm->EmitULEB128(Abbrev->getNumber(), "Abbreviation Code");
Bill Wendling94d04b82009-05-20 23:21:38 +00001930
1931 // Emit the abbreviations data.
Chris Lattnerd38fee82010-04-05 00:13:49 +00001932 Abbrev->Emit(Asm);
Bill Wendling94d04b82009-05-20 23:21:38 +00001933 }
1934
1935 // Mark end of abbreviations.
Chris Lattner7e1a8f82010-04-04 19:09:29 +00001936 Asm->EmitULEB128(0, "EOM(3)");
Bill Wendling94d04b82009-05-20 23:21:38 +00001937
Eric Christopher6eebe472012-12-19 22:02:53 +00001938 MCSymbol *End = Asm->GetTempSymbol(Section->getLabelEndName());
Eric Christopher44fedba2012-12-13 03:00:38 +00001939 Asm->OutStreamer.EmitLabel(End);
Bill Wendling94d04b82009-05-20 23:21:38 +00001940 }
1941}
1942
Eric Christopherb6dc8652012-11-27 22:43:45 +00001943// Emit the last address of the section and the end of the line matrix.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001944void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) {
Bill Wendling94d04b82009-05-20 23:21:38 +00001945 // Define last address of section.
Chris Lattner233f52b2010-03-09 23:52:58 +00001946 Asm->OutStreamer.AddComment("Extended Op");
1947 Asm->EmitInt8(0);
Jim Grosbach1e20b962010-07-21 21:21:52 +00001948
Chris Lattner233f52b2010-03-09 23:52:58 +00001949 Asm->OutStreamer.AddComment("Op size");
Chandler Carruth426c2bf2012-11-01 09:14:31 +00001950 Asm->EmitInt8(Asm->getDataLayout().getPointerSize() + 1);
Chris Lattner233f52b2010-03-09 23:52:58 +00001951 Asm->OutStreamer.AddComment("DW_LNE_set_address");
1952 Asm->EmitInt8(dwarf::DW_LNE_set_address);
1953
1954 Asm->OutStreamer.AddComment("Section end label");
Chris Lattnerd85fc6e2010-03-10 01:17:49 +00001955
Chris Lattnerc0215722010-04-04 19:25:43 +00001956 Asm->OutStreamer.EmitSymbolValue(Asm->GetTempSymbol("section_end",SectionEnd),
Eric Christopherca1dd052013-01-09 01:35:34 +00001957 Asm->getDataLayout().getPointerSize());
Bill Wendling94d04b82009-05-20 23:21:38 +00001958
1959 // Mark end of matrix.
Chris Lattner233f52b2010-03-09 23:52:58 +00001960 Asm->OutStreamer.AddComment("DW_LNE_end_sequence");
1961 Asm->EmitInt8(0);
Chris Lattner0ad9c912010-01-22 22:09:00 +00001962 Asm->EmitInt8(1);
Chris Lattner894d75a2010-01-22 23:18:42 +00001963 Asm->EmitInt8(1);
Bill Wendling94d04b82009-05-20 23:21:38 +00001964}
1965
Eric Christopherb6dc8652012-11-27 22:43:45 +00001966// Emit visible names into a hashed accelerator table section.
Eric Christopher09ac3d82011-11-07 09:24:32 +00001967void DwarfDebug::emitAccelNames() {
1968 DwarfAccelTable AT(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset,
1969 dwarf::DW_FORM_data4));
1970 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
1971 E = CUMap.end(); I != E; ++I) {
1972 CompileUnit *TheCU = I->second;
Eric Christopher0ffe2b42011-11-10 19:25:34 +00001973 const StringMap<std::vector<DIE*> > &Names = TheCU->getAccelNames();
1974 for (StringMap<std::vector<DIE*> >::const_iterator
Eric Christopher09ac3d82011-11-07 09:24:32 +00001975 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
1976 const char *Name = GI->getKeyData();
Eric Christopherfa03db02012-01-06 23:03:34 +00001977 const std::vector<DIE *> &Entities = GI->second;
Eric Christopher0ffe2b42011-11-10 19:25:34 +00001978 for (std::vector<DIE *>::const_iterator DI = Entities.begin(),
1979 DE = Entities.end(); DI != DE; ++DI)
1980 AT.AddName(Name, (*DI));
Eric Christopher09ac3d82011-11-07 09:24:32 +00001981 }
1982 }
1983
1984 AT.FinalizeTable(Asm, "Names");
1985 Asm->OutStreamer.SwitchSection(
1986 Asm->getObjFileLowering().getDwarfAccelNamesSection());
1987 MCSymbol *SectionBegin = Asm->GetTempSymbol("names_begin");
1988 Asm->OutStreamer.EmitLabel(SectionBegin);
1989
1990 // Emit the full data.
Eric Christopher2e5d8702012-12-20 21:58:36 +00001991 AT.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher09ac3d82011-11-07 09:24:32 +00001992}
1993
Eric Christopher72c16552012-12-20 21:58:40 +00001994// Emit objective C classes and categories into a hashed accelerator table
1995// section.
Eric Christopher09ac3d82011-11-07 09:24:32 +00001996void DwarfDebug::emitAccelObjC() {
1997 DwarfAccelTable AT(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset,
1998 dwarf::DW_FORM_data4));
1999 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2000 E = CUMap.end(); I != E; ++I) {
2001 CompileUnit *TheCU = I->second;
2002 const StringMap<std::vector<DIE*> > &Names = TheCU->getAccelObjC();
2003 for (StringMap<std::vector<DIE*> >::const_iterator
2004 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
2005 const char *Name = GI->getKeyData();
Eric Christopherfa03db02012-01-06 23:03:34 +00002006 const std::vector<DIE *> &Entities = GI->second;
Eric Christopher09ac3d82011-11-07 09:24:32 +00002007 for (std::vector<DIE *>::const_iterator DI = Entities.begin(),
2008 DE = Entities.end(); DI != DE; ++DI)
2009 AT.AddName(Name, (*DI));
2010 }
2011 }
2012
2013 AT.FinalizeTable(Asm, "ObjC");
2014 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering()
2015 .getDwarfAccelObjCSection());
2016 MCSymbol *SectionBegin = Asm->GetTempSymbol("objc_begin");
2017 Asm->OutStreamer.EmitLabel(SectionBegin);
2018
2019 // Emit the full data.
Eric Christopher2e5d8702012-12-20 21:58:36 +00002020 AT.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher09ac3d82011-11-07 09:24:32 +00002021}
2022
Eric Christopherb6dc8652012-11-27 22:43:45 +00002023// Emit namespace dies into a hashed accelerator table.
Eric Christopher09ac3d82011-11-07 09:24:32 +00002024void DwarfDebug::emitAccelNamespaces() {
2025 DwarfAccelTable AT(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset,
2026 dwarf::DW_FORM_data4));
2027 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2028 E = CUMap.end(); I != E; ++I) {
2029 CompileUnit *TheCU = I->second;
Eric Christopher8bd36ea2011-11-10 21:47:55 +00002030 const StringMap<std::vector<DIE*> > &Names = TheCU->getAccelNamespace();
2031 for (StringMap<std::vector<DIE*> >::const_iterator
Eric Christopher09ac3d82011-11-07 09:24:32 +00002032 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
2033 const char *Name = GI->getKeyData();
Eric Christopherfa03db02012-01-06 23:03:34 +00002034 const std::vector<DIE *> &Entities = GI->second;
Eric Christopher8bd36ea2011-11-10 21:47:55 +00002035 for (std::vector<DIE *>::const_iterator DI = Entities.begin(),
2036 DE = Entities.end(); DI != DE; ++DI)
2037 AT.AddName(Name, (*DI));
Eric Christopher09ac3d82011-11-07 09:24:32 +00002038 }
2039 }
2040
2041 AT.FinalizeTable(Asm, "namespac");
2042 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering()
2043 .getDwarfAccelNamespaceSection());
2044 MCSymbol *SectionBegin = Asm->GetTempSymbol("namespac_begin");
2045 Asm->OutStreamer.EmitLabel(SectionBegin);
2046
2047 // Emit the full data.
Eric Christopher2e5d8702012-12-20 21:58:36 +00002048 AT.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher09ac3d82011-11-07 09:24:32 +00002049}
2050
Eric Christopherb6dc8652012-11-27 22:43:45 +00002051// Emit type dies into a hashed accelerator table.
Eric Christopher09ac3d82011-11-07 09:24:32 +00002052void DwarfDebug::emitAccelTypes() {
Eric Christopherc36145f2012-01-06 04:35:23 +00002053 std::vector<DwarfAccelTable::Atom> Atoms;
2054 Atoms.push_back(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset,
2055 dwarf::DW_FORM_data4));
2056 Atoms.push_back(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeTag,
2057 dwarf::DW_FORM_data2));
2058 Atoms.push_back(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeTypeFlags,
2059 dwarf::DW_FORM_data1));
2060 DwarfAccelTable AT(Atoms);
Eric Christopher09ac3d82011-11-07 09:24:32 +00002061 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2062 E = CUMap.end(); I != E; ++I) {
2063 CompileUnit *TheCU = I->second;
Eric Christopherc36145f2012-01-06 04:35:23 +00002064 const StringMap<std::vector<std::pair<DIE*, unsigned > > > &Names
2065 = TheCU->getAccelTypes();
2066 for (StringMap<std::vector<std::pair<DIE*, unsigned> > >::const_iterator
Eric Christopher09ac3d82011-11-07 09:24:32 +00002067 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
2068 const char *Name = GI->getKeyData();
Eric Christopherfa03db02012-01-06 23:03:34 +00002069 const std::vector<std::pair<DIE *, unsigned> > &Entities = GI->second;
Eric Christopherc36145f2012-01-06 04:35:23 +00002070 for (std::vector<std::pair<DIE *, unsigned> >::const_iterator DI
2071 = Entities.begin(), DE = Entities.end(); DI !=DE; ++DI)
2072 AT.AddName(Name, (*DI).first, (*DI).second);
Eric Christopher09ac3d82011-11-07 09:24:32 +00002073 }
2074 }
2075
2076 AT.FinalizeTable(Asm, "types");
2077 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering()
2078 .getDwarfAccelTypesSection());
2079 MCSymbol *SectionBegin = Asm->GetTempSymbol("types_begin");
2080 Asm->OutStreamer.EmitLabel(SectionBegin);
2081
2082 // Emit the full data.
Eric Christopher2e5d8702012-12-20 21:58:36 +00002083 AT.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher09ac3d82011-11-07 09:24:32 +00002084}
2085
Devang Patel193f7202009-11-24 01:14:22 +00002086void DwarfDebug::emitDebugPubTypes() {
Devang Patel163a9f72010-05-10 22:49:55 +00002087 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2088 E = CUMap.end(); I != E; ++I) {
2089 CompileUnit *TheCU = I->second;
Eric Christopher63701182011-11-07 09:18:35 +00002090 // Start the dwarf pubtypes section.
Devang Patel163a9f72010-05-10 22:49:55 +00002091 Asm->OutStreamer.SwitchSection(
2092 Asm->getObjFileLowering().getDwarfPubTypesSection());
2093 Asm->OutStreamer.AddComment("Length of Public Types Info");
2094 Asm->EmitLabelDifference(
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002095 Asm->GetTempSymbol("pubtypes_end", TheCU->getUniqueID()),
2096 Asm->GetTempSymbol("pubtypes_begin", TheCU->getUniqueID()), 4);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002097
Devang Patel163a9f72010-05-10 22:49:55 +00002098 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_begin",
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002099 TheCU->getUniqueID()));
Jim Grosbach1e20b962010-07-21 21:21:52 +00002100
Devang Patel163a9f72010-05-10 22:49:55 +00002101 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DWARF Version");
2102 Asm->EmitInt16(dwarf::DWARF_VERSION);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002103
Devang Patel163a9f72010-05-10 22:49:55 +00002104 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
Eric Christophercf6b8ad2012-12-15 00:04:04 +00002105 const MCSection *ISec = Asm->getObjFileLowering().getDwarfInfoSection();
2106 Asm->EmitSectionOffset(Asm->GetTempSymbol(ISec->getLabelBeginName(),
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002107 TheCU->getUniqueID()),
Devang Patel163a9f72010-05-10 22:49:55 +00002108 DwarfInfoSectionSym);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002109
Devang Patel163a9f72010-05-10 22:49:55 +00002110 Asm->OutStreamer.AddComment("Compilation Unit Length");
Eric Christophercf6b8ad2012-12-15 00:04:04 +00002111 Asm->EmitLabelDifference(Asm->GetTempSymbol(ISec->getLabelEndName(),
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002112 TheCU->getUniqueID()),
Eric Christophercf6b8ad2012-12-15 00:04:04 +00002113 Asm->GetTempSymbol(ISec->getLabelBeginName(),
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002114 TheCU->getUniqueID()),
Devang Patel163a9f72010-05-10 22:49:55 +00002115 4);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002116
Devang Patel163a9f72010-05-10 22:49:55 +00002117 const StringMap<DIE*> &Globals = TheCU->getGlobalTypes();
2118 for (StringMap<DIE*>::const_iterator
2119 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2120 const char *Name = GI->getKeyData();
Nick Lewycky3bbb6f72011-07-29 03:49:23 +00002121 DIE *Entity = GI->second;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002122
Devang Patel163a9f72010-05-10 22:49:55 +00002123 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
2124 Asm->EmitInt32(Entity->getOffset());
Jim Grosbach1e20b962010-07-21 21:21:52 +00002125
Devang Patel163a9f72010-05-10 22:49:55 +00002126 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("External Name");
Benjamin Kramer983c4572011-11-09 18:16:11 +00002127 // Emit the name with a terminating null byte.
Eric Christopher68ca5622013-01-09 01:57:54 +00002128 Asm->OutStreamer.EmitBytes(StringRef(Name, GI->getKeyLength()+1));
Devang Patel163a9f72010-05-10 22:49:55 +00002129 }
Jim Grosbach1e20b962010-07-21 21:21:52 +00002130
Devang Patel163a9f72010-05-10 22:49:55 +00002131 Asm->OutStreamer.AddComment("End Mark");
Jim Grosbach1e20b962010-07-21 21:21:52 +00002132 Asm->EmitInt32(0);
Devang Patel163a9f72010-05-10 22:49:55 +00002133 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_end",
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002134 TheCU->getUniqueID()));
Devang Patel193f7202009-11-24 01:14:22 +00002135 }
Devang Patel193f7202009-11-24 01:14:22 +00002136}
2137
Eric Christopher64f824c2012-12-27 02:14:01 +00002138// Emit strings into a string section.
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002139void DwarfUnits::emitStrings(const MCSection *StrSection,
2140 const MCSection *OffsetSection = NULL,
2141 const MCSymbol *StrSecSym = NULL) {
Eric Christopher64f824c2012-12-27 02:14:01 +00002142
Eric Christopherb6714222013-01-08 22:22:06 +00002143 if (StringPool.empty()) return;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002144
Chris Lattner0d9d70f2010-03-09 23:38:23 +00002145 // Start the dwarf str section.
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002146 Asm->OutStreamer.SwitchSection(StrSection);
Bill Wendling94d04b82009-05-20 23:21:38 +00002147
Chris Lattnerbc733f52010-03-13 02:17:42 +00002148 // Get all of the string pool entries and put them in an array by their ID so
2149 // we can sort them.
Jim Grosbach1e20b962010-07-21 21:21:52 +00002150 SmallVector<std::pair<unsigned,
Eric Christopherff348452013-01-07 22:40:45 +00002151 StringMapEntry<std::pair<MCSymbol*, unsigned> >*>, 64> Entries;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002152
Chris Lattnerbc733f52010-03-13 02:17:42 +00002153 for (StringMap<std::pair<MCSymbol*, unsigned> >::iterator
Eric Christopherb6714222013-01-08 22:22:06 +00002154 I = StringPool.begin(), E = StringPool.end();
Eric Christopher72c16552012-12-20 21:58:40 +00002155 I != E; ++I)
Chris Lattnerbc733f52010-03-13 02:17:42 +00002156 Entries.push_back(std::make_pair(I->second.second, &*I));
Jim Grosbach1e20b962010-07-21 21:21:52 +00002157
Chris Lattnerbc733f52010-03-13 02:17:42 +00002158 array_pod_sort(Entries.begin(), Entries.end());
Jim Grosbach1e20b962010-07-21 21:21:52 +00002159
Chris Lattnerbc733f52010-03-13 02:17:42 +00002160 for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
Chris Lattner0d9d70f2010-03-09 23:38:23 +00002161 // Emit a label for reference from debug information entries.
Chris Lattnerbc733f52010-03-13 02:17:42 +00002162 Asm->OutStreamer.EmitLabel(Entries[i].second->getValue().first);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002163
Benjamin Kramer983c4572011-11-09 18:16:11 +00002164 // Emit the string itself with a terminating null byte.
Benjamin Kramer0c45f7d2011-11-09 12:12:04 +00002165 Asm->OutStreamer.EmitBytes(StringRef(Entries[i].second->getKeyData(),
Eric Christopherca1dd052013-01-09 01:35:34 +00002166 Entries[i].second->getKeyLength()+1));
Bill Wendling94d04b82009-05-20 23:21:38 +00002167 }
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002168
2169 // If we've got an offset section go ahead and emit that now as well.
2170 if (OffsetSection) {
2171 Asm->OutStreamer.SwitchSection(OffsetSection);
2172 unsigned offset = 0;
Eric Christopher72f7bfb2013-01-15 23:56:56 +00002173 unsigned size = 4; // FIXME: DWARF64 is 8.
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002174 for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
Eric Christopher1ced2082013-01-09 03:52:05 +00002175 Asm->OutStreamer.EmitIntValue(offset, size);
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002176 offset += Entries[i].second->getKeyLength() + 1;
2177 }
2178 }
Bill Wendling94d04b82009-05-20 23:21:38 +00002179}
2180
Eric Christopher72f7bfb2013-01-15 23:56:56 +00002181// Emit strings into a string section.
2182void DwarfUnits::emitAddresses(const MCSection *AddrSection) {
2183
2184 if (AddressPool.empty()) return;
2185
2186 // Start the dwarf addr section.
2187 Asm->OutStreamer.SwitchSection(AddrSection);
2188
2189 // Get all of the string pool entries and put them in an array by their ID so
2190 // we can sort them.
2191 SmallVector<std::pair<unsigned,
2192 std::pair<MCSymbol*, unsigned>* >, 64> Entries;
2193
2194 for (DenseMap<MCSymbol*, std::pair<MCSymbol*, unsigned> >::iterator
2195 I = AddressPool.begin(), E = AddressPool.end();
2196 I != E; ++I)
2197 Entries.push_back(std::make_pair(I->second.second, &(I->second)));
2198
2199 array_pod_sort(Entries.begin(), Entries.end());
2200
2201 for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
2202 // Emit a label for reference from debug information entries.
2203 MCSymbol *Sym = Entries[i].second->first;
2204 if (Sym)
2205 Asm->EmitLabelReference(Entries[i].second->first,
2206 Asm->getDataLayout().getPointerSize());
2207 else
2208 Asm->OutStreamer.EmitIntValue(0, Asm->getDataLayout().getPointerSize());
2209 }
2210
2211}
2212
Eric Christopher64f824c2012-12-27 02:14:01 +00002213// Emit visible names into a debug str section.
2214void DwarfDebug::emitDebugStr() {
2215 DwarfUnits &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
2216 Holder.emitStrings(Asm->getObjFileLowering().getDwarfStrSection());
2217}
2218
Eric Christopherb6dc8652012-11-27 22:43:45 +00002219// Emit visible names into a debug loc section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002220void DwarfDebug::emitDebugLoc() {
Devang Patel80250682010-05-26 23:55:23 +00002221 if (DotDebugLocEntries.empty())
2222 return;
2223
Devang Patel6c3ea902011-02-04 22:57:18 +00002224 for (SmallVector<DotDebugLocEntry, 4>::iterator
2225 I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
2226 I != E; ++I) {
2227 DotDebugLocEntry &Entry = *I;
2228 if (I + 1 != DotDebugLocEntries.end())
2229 Entry.Merge(I+1);
2230 }
2231
Daniel Dunbar83320a02011-03-16 22:16:39 +00002232 // Start the dwarf loc section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002233 Asm->OutStreamer.SwitchSection(
Devang Patelc3f5f782010-05-25 23:40:22 +00002234 Asm->getObjFileLowering().getDwarfLocSection());
Chandler Carruth426c2bf2012-11-01 09:14:31 +00002235 unsigned char Size = Asm->getDataLayout().getPointerSize();
Devang Patel80250682010-05-26 23:55:23 +00002236 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", 0));
2237 unsigned index = 1;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002238 for (SmallVector<DotDebugLocEntry, 4>::iterator
2239 I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
Devang Patel61409622010-07-07 20:12:52 +00002240 I != E; ++I, ++index) {
Devang Patel6c3ea902011-02-04 22:57:18 +00002241 DotDebugLocEntry &Entry = *I;
2242 if (Entry.isMerged()) continue;
Devang Patelc3f5f782010-05-25 23:40:22 +00002243 if (Entry.isEmpty()) {
Eric Christopherca1dd052013-01-09 01:35:34 +00002244 Asm->OutStreamer.EmitIntValue(0, Size);
2245 Asm->OutStreamer.EmitIntValue(0, Size);
Devang Patel80250682010-05-26 23:55:23 +00002246 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", index));
Devang Patelc3f5f782010-05-25 23:40:22 +00002247 } else {
Eric Christopher1ced2082013-01-09 03:52:05 +00002248 Asm->OutStreamer.EmitSymbolValue(Entry.Begin, Size);
2249 Asm->OutStreamer.EmitSymbolValue(Entry.End, Size);
Devang Patelc26f5442011-04-28 02:22:40 +00002250 DIVariable DV(Entry.Variable);
Rafael Espindola5b23b7f2011-05-27 22:05:41 +00002251 Asm->OutStreamer.AddComment("Loc expr size");
2252 MCSymbol *begin = Asm->OutStreamer.getContext().CreateTempSymbol();
2253 MCSymbol *end = Asm->OutStreamer.getContext().CreateTempSymbol();
2254 Asm->EmitLabelDifference(end, begin, 2);
2255 Asm->OutStreamer.EmitLabel(begin);
Devang Patel80efd4e2011-07-08 16:49:43 +00002256 if (Entry.isInt()) {
Devang Patelc4329072011-06-01 22:03:25 +00002257 DIBasicType BTy(DV.getType());
2258 if (BTy.Verify() &&
Eric Christopher0f1c7f62012-11-19 22:42:10 +00002259 (BTy.getEncoding() == dwarf::DW_ATE_signed
Devang Patelc4329072011-06-01 22:03:25 +00002260 || BTy.getEncoding() == dwarf::DW_ATE_signed_char)) {
2261 Asm->OutStreamer.AddComment("DW_OP_consts");
2262 Asm->EmitInt8(dwarf::DW_OP_consts);
Devang Patel80efd4e2011-07-08 16:49:43 +00002263 Asm->EmitSLEB128(Entry.getInt());
Devang Patelc4329072011-06-01 22:03:25 +00002264 } else {
2265 Asm->OutStreamer.AddComment("DW_OP_constu");
2266 Asm->EmitInt8(dwarf::DW_OP_constu);
Devang Patel80efd4e2011-07-08 16:49:43 +00002267 Asm->EmitULEB128(Entry.getInt());
Devang Patelc4329072011-06-01 22:03:25 +00002268 }
Devang Patel80efd4e2011-07-08 16:49:43 +00002269 } else if (Entry.isLocation()) {
Eric Christopher0f1c7f62012-11-19 22:42:10 +00002270 if (!DV.hasComplexAddress())
Devang Patel80efd4e2011-07-08 16:49:43 +00002271 // Regular entry.
Devang Patelc26f5442011-04-28 02:22:40 +00002272 Asm->EmitDwarfRegOp(Entry.Loc);
Devang Patel80efd4e2011-07-08 16:49:43 +00002273 else {
2274 // Complex address entry.
2275 unsigned N = DV.getNumAddrElements();
2276 unsigned i = 0;
2277 if (N >= 2 && DV.getAddrElement(0) == DIBuilder::OpPlus) {
2278 if (Entry.Loc.getOffset()) {
2279 i = 2;
2280 Asm->EmitDwarfRegOp(Entry.Loc);
2281 Asm->OutStreamer.AddComment("DW_OP_deref");
2282 Asm->EmitInt8(dwarf::DW_OP_deref);
2283 Asm->OutStreamer.AddComment("DW_OP_plus_uconst");
2284 Asm->EmitInt8(dwarf::DW_OP_plus_uconst);
2285 Asm->EmitSLEB128(DV.getAddrElement(1));
2286 } else {
2287 // If first address element is OpPlus then emit
2288 // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
2289 MachineLocation Loc(Entry.Loc.getReg(), DV.getAddrElement(1));
2290 Asm->EmitDwarfRegOp(Loc);
2291 i = 2;
2292 }
2293 } else {
2294 Asm->EmitDwarfRegOp(Entry.Loc);
2295 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +00002296
Devang Patel80efd4e2011-07-08 16:49:43 +00002297 // Emit remaining complex address elements.
2298 for (; i < N; ++i) {
2299 uint64_t Element = DV.getAddrElement(i);
2300 if (Element == DIBuilder::OpPlus) {
2301 Asm->EmitInt8(dwarf::DW_OP_plus_uconst);
2302 Asm->EmitULEB128(DV.getAddrElement(++i));
Eric Christopher50120762012-05-08 18:56:00 +00002303 } else if (Element == DIBuilder::OpDeref) {
Eric Christophera80f2d12012-05-08 21:24:39 +00002304 if (!Entry.Loc.isReg())
Eric Christopher50120762012-05-08 18:56:00 +00002305 Asm->EmitInt8(dwarf::DW_OP_deref);
2306 } else
2307 llvm_unreachable("unknown Opcode found in complex address");
Devang Patel80efd4e2011-07-08 16:49:43 +00002308 }
Devang Patelc26f5442011-04-28 02:22:40 +00002309 }
Devang Patelc26f5442011-04-28 02:22:40 +00002310 }
Devang Patel80efd4e2011-07-08 16:49:43 +00002311 // else ... ignore constant fp. There is not any good way to
2312 // to represent them here in dwarf.
Rafael Espindola5b23b7f2011-05-27 22:05:41 +00002313 Asm->OutStreamer.EmitLabel(end);
Devang Patelc3f5f782010-05-25 23:40:22 +00002314 }
2315 }
Bill Wendling94d04b82009-05-20 23:21:38 +00002316}
2317
Eric Christopherb6dc8652012-11-27 22:43:45 +00002318// Emit visible names into a debug aranges section.
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00002319void DwarfDebug::emitDebugARanges() {
Bill Wendling94d04b82009-05-20 23:21:38 +00002320 // Start the dwarf aranges section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002321 Asm->OutStreamer.SwitchSection(
2322 Asm->getObjFileLowering().getDwarfARangesSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002323}
2324
Eric Christopherb6dc8652012-11-27 22:43:45 +00002325// Emit visible names into a debug ranges section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002326void DwarfDebug::emitDebugRanges() {
Bill Wendling94d04b82009-05-20 23:21:38 +00002327 // Start the dwarf ranges section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002328 Asm->OutStreamer.SwitchSection(
Devang Patelf2548ca2010-04-16 23:33:45 +00002329 Asm->getObjFileLowering().getDwarfRangesSection());
Chandler Carruth426c2bf2012-11-01 09:14:31 +00002330 unsigned char Size = Asm->getDataLayout().getPointerSize();
Devang Pateleac9c072010-04-27 19:46:33 +00002331 for (SmallVector<const MCSymbol *, 8>::iterator
Jim Grosbach1e20b962010-07-21 21:21:52 +00002332 I = DebugRangeSymbols.begin(), E = DebugRangeSymbols.end();
Devang Pateleac9c072010-04-27 19:46:33 +00002333 I != E; ++I) {
2334 if (*I)
Eric Christopher1ced2082013-01-09 03:52:05 +00002335 Asm->OutStreamer.EmitSymbolValue(const_cast<MCSymbol*>(*I), Size);
Devang Patelf2548ca2010-04-16 23:33:45 +00002336 else
Eric Christopherca1dd052013-01-09 01:35:34 +00002337 Asm->OutStreamer.EmitIntValue(0, Size);
Devang Patelf2548ca2010-04-16 23:33:45 +00002338 }
Bill Wendling94d04b82009-05-20 23:21:38 +00002339}
2340
Eric Christopherb6dc8652012-11-27 22:43:45 +00002341// Emit visible names into a debug macinfo section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002342void DwarfDebug::emitDebugMacInfo() {
Daniel Dunbarf612ff62009-09-19 20:40:05 +00002343 if (const MCSection *LineInfo =
Chris Lattner18a4c162009-08-02 07:24:22 +00002344 Asm->getObjFileLowering().getDwarfMacroInfoSection()) {
Bill Wendling94d04b82009-05-20 23:21:38 +00002345 // Start the dwarf macinfo section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002346 Asm->OutStreamer.SwitchSection(LineInfo);
Bill Wendling94d04b82009-05-20 23:21:38 +00002347 }
2348}
2349
Eric Christopherb6dc8652012-11-27 22:43:45 +00002350// Emit inline info using following format.
2351// Section Header:
2352// 1. length of section
2353// 2. Dwarf version number
2354// 3. address size.
2355//
2356// Entries (one "entry" for each function that was inlined):
2357//
2358// 1. offset into __debug_str section for MIPS linkage name, if exists;
2359// otherwise offset into __debug_str for regular function name.
2360// 2. offset into __debug_str section for regular function name.
2361// 3. an unsigned LEB128 number indicating the number of distinct inlining
2362// instances for the function.
2363//
2364// The rest of the entry consists of a {die_offset, low_pc} pair for each
2365// inlined instance; the die_offset points to the inlined_subroutine die in the
2366// __debug_info section, and the low_pc is the starting address for the
2367// inlining instance.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002368void DwarfDebug::emitDebugInlineInfo() {
Eric Christopherb83e2bb2012-03-02 02:11:47 +00002369 if (!Asm->MAI->doesDwarfUseInlineInfoSection())
Bill Wendling94d04b82009-05-20 23:21:38 +00002370 return;
2371
Devang Patel163a9f72010-05-10 22:49:55 +00002372 if (!FirstCU)
Bill Wendling94d04b82009-05-20 23:21:38 +00002373 return;
2374
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002375 Asm->OutStreamer.SwitchSection(
2376 Asm->getObjFileLowering().getDwarfDebugInlineSection());
Chris Lattner0ad9c912010-01-22 22:09:00 +00002377
Chris Lattner233f52b2010-03-09 23:52:58 +00002378 Asm->OutStreamer.AddComment("Length of Debug Inlined Information Entry");
Chris Lattnera6437182010-04-04 19:58:12 +00002379 Asm->EmitLabelDifference(Asm->GetTempSymbol("debug_inlined_end", 1),
2380 Asm->GetTempSymbol("debug_inlined_begin", 1), 4);
Bill Wendling94d04b82009-05-20 23:21:38 +00002381
Chris Lattnerc0215722010-04-04 19:25:43 +00002382 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_begin", 1));
Bill Wendling94d04b82009-05-20 23:21:38 +00002383
Chris Lattner233f52b2010-03-09 23:52:58 +00002384 Asm->OutStreamer.AddComment("Dwarf Version");
2385 Asm->EmitInt16(dwarf::DWARF_VERSION);
2386 Asm->OutStreamer.AddComment("Address Size (in bytes)");
Chandler Carruth426c2bf2012-11-01 09:14:31 +00002387 Asm->EmitInt8(Asm->getDataLayout().getPointerSize());
Bill Wendling94d04b82009-05-20 23:21:38 +00002388
Devang Patele9f8f5e2010-05-07 20:54:48 +00002389 for (SmallVector<const MDNode *, 4>::iterator I = InlinedSPNodes.begin(),
Devang Patel53bb5c92009-11-10 23:06:00 +00002390 E = InlinedSPNodes.end(); I != E; ++I) {
Jim Grosbach31ef40e2009-11-21 23:12:12 +00002391
Devang Patele9f8f5e2010-05-07 20:54:48 +00002392 const MDNode *Node = *I;
2393 DenseMap<const MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator II
Jim Grosbach7ab38df2009-11-22 19:20:36 +00002394 = InlineInfo.find(Node);
Devang Patel53bb5c92009-11-10 23:06:00 +00002395 SmallVector<InlineInfoLabels, 4> &Labels = II->second;
Devang Patele4b27562009-08-28 23:24:31 +00002396 DISubprogram SP(Node);
Devang Patel65dbc902009-11-25 17:36:49 +00002397 StringRef LName = SP.getLinkageName();
2398 StringRef Name = SP.getName();
Bill Wendling94d04b82009-05-20 23:21:38 +00002399
Chris Lattner233f52b2010-03-09 23:52:58 +00002400 Asm->OutStreamer.AddComment("MIPS linkage name");
Eric Christopher50e26612012-03-02 01:57:52 +00002401 if (LName.empty())
Eric Christopher2e5d8702012-12-20 21:58:36 +00002402 Asm->EmitSectionOffset(InfoHolder.getStringPoolEntry(Name),
2403 DwarfStrSectionSym);
Eric Christopher50e26612012-03-02 01:57:52 +00002404 else
Eric Christopher2e5d8702012-12-20 21:58:36 +00002405 Asm->EmitSectionOffset(InfoHolder
2406 .getStringPoolEntry(getRealLinkageName(LName)),
Chris Lattner6189ed12010-04-04 23:25:33 +00002407 DwarfStrSectionSym);
Devang Patel53bb5c92009-11-10 23:06:00 +00002408
Chris Lattner233f52b2010-03-09 23:52:58 +00002409 Asm->OutStreamer.AddComment("Function name");
Eric Christopher2e5d8702012-12-20 21:58:36 +00002410 Asm->EmitSectionOffset(InfoHolder.getStringPoolEntry(Name),
2411 DwarfStrSectionSym);
Chris Lattner7e1a8f82010-04-04 19:09:29 +00002412 Asm->EmitULEB128(Labels.size(), "Inline count");
Bill Wendling94d04b82009-05-20 23:21:38 +00002413
Devang Patel53bb5c92009-11-10 23:06:00 +00002414 for (SmallVector<InlineInfoLabels, 4>::iterator LI = Labels.begin(),
Bill Wendling94d04b82009-05-20 23:21:38 +00002415 LE = Labels.end(); LI != LE; ++LI) {
Chris Lattner3f53c832010-04-04 18:52:31 +00002416 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
Chris Lattner6ed0f902010-03-09 00:31:02 +00002417 Asm->EmitInt32(LI->second->getOffset());
Bill Wendling94d04b82009-05-20 23:21:38 +00002418
Chris Lattner3f53c832010-04-04 18:52:31 +00002419 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("low_pc");
Chris Lattnerd38fee82010-04-05 00:13:49 +00002420 Asm->OutStreamer.EmitSymbolValue(LI->first,
Eric Christopher1ced2082013-01-09 03:52:05 +00002421 Asm->getDataLayout().getPointerSize());
Bill Wendling94d04b82009-05-20 23:21:38 +00002422 }
2423 }
2424
Chris Lattnerc0215722010-04-04 19:25:43 +00002425 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_end", 1));
Bill Wendling94d04b82009-05-20 23:21:38 +00002426}
Eric Christopher98e237f2012-11-30 23:59:06 +00002427
Eric Christopher0b944ee2012-12-11 19:42:09 +00002428// DWARF5 Experimental Separate Dwarf emitters.
Eric Christopher98e237f2012-11-30 23:59:06 +00002429
2430// This DIE has the following attributes: DW_AT_comp_dir, DW_AT_stmt_list,
2431// DW_AT_low_pc, DW_AT_high_pc, DW_AT_ranges, DW_AT_dwo_name, DW_AT_dwo_id,
2432// DW_AT_ranges_base, DW_AT_addr_base. If DW_AT_ranges is present,
2433// DW_AT_low_pc and DW_AT_high_pc are not used, and vice versa.
Eric Christopher4daaed12012-12-10 19:51:21 +00002434CompileUnit *DwarfDebug::constructSkeletonCU(const MDNode *N) {
Eric Christopher98e237f2012-11-30 23:59:06 +00002435 DICompileUnit DIUnit(N);
2436 StringRef FN = DIUnit.getFilename();
2437 CompilationDir = DIUnit.getDirectory();
Eric Christopher98e237f2012-11-30 23:59:06 +00002438
2439 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002440 CompileUnit *NewCU = new CompileUnit(GlobalCUIndexCount++,
Eric Christopher2e5d8702012-12-20 21:58:36 +00002441 DIUnit.getLanguage(), Die, Asm,
Eric Christopher64f824c2012-12-27 02:14:01 +00002442 this, &SkeletonHolder);
Eric Christopher98e237f2012-11-30 23:59:06 +00002443 // FIXME: This should be the .dwo file.
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002444 NewCU->addLocalString(Die, dwarf::DW_AT_GNU_dwo_name, FN);
Eric Christopher98e237f2012-11-30 23:59:06 +00002445
2446 // FIXME: We also need DW_AT_addr_base and DW_AT_dwo_id.
2447
2448 // 2.17.1 requires that we use DW_AT_low_pc for a single entry point
Eric Christopher72f7bfb2013-01-15 23:56:56 +00002449 // into an entity. We're using 0, or a NULL label for this.
Eric Christopher98e237f2012-11-30 23:59:06 +00002450 NewCU->addUInt(Die, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, 0);
Eric Christopher72f7bfb2013-01-15 23:56:56 +00002451
Eric Christopher98e237f2012-11-30 23:59:06 +00002452 // DW_AT_stmt_list is a offset of line number information for this
2453 // compile unit in debug_line section.
2454 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
2455 NewCU->addLabel(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4,
2456 Asm->GetTempSymbol("section_line"));
2457 else
2458 NewCU->addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4, 0);
2459
2460 if (!CompilationDir.empty())
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002461 NewCU->addLocalString(Die, dwarf::DW_AT_comp_dir, CompilationDir);
Eric Christopher98e237f2012-11-30 23:59:06 +00002462
Eric Christopher0e3e9b72012-12-10 23:34:43 +00002463 SkeletonHolder.addUnit(NewCU);
2464
Eric Christopher98e237f2012-11-30 23:59:06 +00002465 return NewCU;
2466}
2467
Eric Christopher4daaed12012-12-10 19:51:21 +00002468void DwarfDebug::emitSkeletonCU(const MCSection *Section) {
Eric Christopher98e237f2012-11-30 23:59:06 +00002469 Asm->OutStreamer.SwitchSection(Section);
Eric Christopher4daaed12012-12-10 19:51:21 +00002470 DIE *Die = SkeletonCU->getCUDie();
Eric Christopher98e237f2012-11-30 23:59:06 +00002471
2472 // Emit the compile units header.
Eric Christophercf6b8ad2012-12-15 00:04:04 +00002473 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol(Section->getLabelBeginName(),
Eric Christopher4daaed12012-12-10 19:51:21 +00002474 SkeletonCU->getUniqueID()));
Eric Christopher98e237f2012-11-30 23:59:06 +00002475
2476 // Emit size of content not including length itself
2477 unsigned ContentSize = Die->getSize() +
2478 sizeof(int16_t) + // DWARF version number
2479 sizeof(int32_t) + // Offset Into Abbrev. Section
2480 sizeof(int8_t); // Pointer Size (in bytes)
2481
2482 Asm->OutStreamer.AddComment("Length of Compilation Unit Info");
2483 Asm->EmitInt32(ContentSize);
2484 Asm->OutStreamer.AddComment("DWARF version number");
2485 Asm->EmitInt16(dwarf::DWARF_VERSION);
2486 Asm->OutStreamer.AddComment("Offset Into Abbrev. Section");
Eric Christopher6eebe472012-12-19 22:02:53 +00002487
2488 const MCSection *ASec = Asm->getObjFileLowering().getDwarfAbbrevSection();
2489 Asm->EmitSectionOffset(Asm->GetTempSymbol(ASec->getLabelBeginName()),
Eric Christopher98e237f2012-11-30 23:59:06 +00002490 DwarfAbbrevSectionSym);
2491 Asm->OutStreamer.AddComment("Address Size (in bytes)");
2492 Asm->EmitInt8(Asm->getDataLayout().getPointerSize());
2493
Eric Christopher6eebe472012-12-19 22:02:53 +00002494 emitDIE(Die, &SkeletonAbbrevs);
Eric Christophercf6b8ad2012-12-15 00:04:04 +00002495 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol(Section->getLabelEndName(),
Eric Christopher4daaed12012-12-10 19:51:21 +00002496 SkeletonCU->getUniqueID()));
Eric Christopher6eebe472012-12-19 22:02:53 +00002497}
Eric Christopher98e237f2012-11-30 23:59:06 +00002498
Eric Christopher6eebe472012-12-19 22:02:53 +00002499void DwarfDebug::emitSkeletonAbbrevs(const MCSection *Section) {
2500 assert(useSplitDwarf() && "No split dwarf debug info?");
2501 emitAbbrevs(Section, &SkeletonAbbrevs);
Eric Christopher98e237f2012-11-30 23:59:06 +00002502}
2503
Eric Christopher0b944ee2012-12-11 19:42:09 +00002504// Emit the .debug_info.dwo section for separated dwarf. This contains the
2505// compile units that would normally be in debug_info.
Eric Christopher98e237f2012-11-30 23:59:06 +00002506void DwarfDebug::emitDebugInfoDWO() {
Eric Christopher4daaed12012-12-10 19:51:21 +00002507 assert(useSplitDwarf() && "No split dwarf debug info?");
Eric Christopherb1e66d02012-12-15 00:04:07 +00002508 InfoHolder.emitUnits(this, Asm->getObjFileLowering().getDwarfInfoDWOSection(),
Eric Christopher6eebe472012-12-19 22:02:53 +00002509 Asm->getObjFileLowering().getDwarfAbbrevDWOSection(),
2510 DwarfAbbrevDWOSectionSym);
2511}
2512
2513// Emit the .debug_abbrev.dwo section for separated dwarf. This contains the
2514// abbreviations for the .debug_info.dwo section.
2515void DwarfDebug::emitDebugAbbrevDWO() {
2516 assert(useSplitDwarf() && "No split dwarf?");
Eric Christopher72c16552012-12-20 21:58:40 +00002517 emitAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevDWOSection(),
2518 &Abbreviations);
Eric Christopher98e237f2012-11-30 23:59:06 +00002519}
Eric Christopher64f824c2012-12-27 02:14:01 +00002520
2521// Emit the .debug_str.dwo section for separated dwarf. This contains the
2522// string section and is identical in format to traditional .debug_str
2523// sections.
2524void DwarfDebug::emitDebugStrDWO() {
2525 assert(useSplitDwarf() && "No split dwarf?");
Eric Christopherff348452013-01-07 22:40:45 +00002526 const MCSection *OffSec = Asm->getObjFileLowering()
2527 .getDwarfStrOffDWOSection();
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002528 const MCSymbol *StrSym = DwarfStrSectionSym;
2529 InfoHolder.emitStrings(Asm->getObjFileLowering().getDwarfStrDWOSection(),
2530 OffSec, StrSym);
Eric Christopher64f824c2012-12-27 02:14:01 +00002531}