blob: 967c149b53d10fa548b5c6d99a39fabb7fc61a83 [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
Manman Ren8b15d742013-01-31 20:05:14 +0000543 DIScope DS(Scope->getScopeNode());
544 // Early return to avoid creating dangling variable|scope DIEs.
545 if (!Scope->getInlinedAt() && DS.isSubprogram() && Scope->isAbstractScope() &&
546 !TheCU->getDIE(DS))
547 return NULL;
548
Nick Lewycky746cb672011-10-26 22:55:33 +0000549 SmallVector<DIE *, 8> Children;
Eric Christophere5212782012-09-12 23:36:19 +0000550 DIE *ObjectPointer = NULL;
Devang Patel0478c152011-03-01 22:58:55 +0000551
552 // Collect arguments for current function.
Devang Patelbf47fdb2011-08-10 20:55:27 +0000553 if (LScopes.isCurrentFunctionScope(Scope))
Devang Patel0478c152011-03-01 22:58:55 +0000554 for (unsigned i = 0, N = CurrentFnArguments.size(); i < N; ++i)
555 if (DbgVariable *ArgDV = CurrentFnArguments[i])
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000556 if (DIE *Arg =
Eric Christophere5212782012-09-12 23:36:19 +0000557 TheCU->constructVariableDIE(ArgDV, Scope->isAbstractScope())) {
Devang Patel0478c152011-03-01 22:58:55 +0000558 Children.push_back(Arg);
Eric Christophere5212782012-09-12 23:36:19 +0000559 if (ArgDV->isObjectPointer()) ObjectPointer = Arg;
560 }
Devang Patel0478c152011-03-01 22:58:55 +0000561
Eric Christopher1aeb7ac2011-10-03 15:49:16 +0000562 // Collect lexical scope children first.
Devang Patelbf47fdb2011-08-10 20:55:27 +0000563 const SmallVector<DbgVariable *, 8> &Variables = ScopeVariables.lookup(Scope);
Devang Patel5bc9fec2011-02-19 01:31:27 +0000564 for (unsigned i = 0, N = Variables.size(); i < N; ++i)
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000565 if (DIE *Variable =
Eric Christopher7b451cf2012-09-21 22:18:52 +0000566 TheCU->constructVariableDIE(Variables[i], Scope->isAbstractScope())) {
Devang Patel5bc9fec2011-02-19 01:31:27 +0000567 Children.push_back(Variable);
Eric Christopher7b451cf2012-09-21 22:18:52 +0000568 if (Variables[i]->isObjectPointer()) ObjectPointer = Variable;
569 }
Devang Patelbf47fdb2011-08-10 20:55:27 +0000570 const SmallVector<LexicalScope *, 4> &Scopes = Scope->getChildren();
Devang Patel5bc9fec2011-02-19 01:31:27 +0000571 for (unsigned j = 0, M = Scopes.size(); j < M; ++j)
Devang Pateld0b5a5e2011-08-15 22:04:40 +0000572 if (DIE *Nested = constructScopeDIE(TheCU, Scopes[j]))
Devang Patel5bc9fec2011-02-19 01:31:27 +0000573 Children.push_back(Nested);
Devang Patel3c91b052010-03-08 20:52:55 +0000574 DIE *ScopeDIE = NULL;
575 if (Scope->getInlinedAt())
Devang Pateld3024342011-08-15 22:24:32 +0000576 ScopeDIE = constructInlinedScopeDIE(TheCU, Scope);
Devang Patel3c91b052010-03-08 20:52:55 +0000577 else if (DS.isSubprogram()) {
Devang Patel0dd45582010-06-28 20:53:04 +0000578 ProcessedSPNodes.insert(DS);
Devang Patel8aa61472010-07-07 22:20:57 +0000579 if (Scope->isAbstractScope()) {
Devang Pateld3024342011-08-15 22:24:32 +0000580 ScopeDIE = TheCU->getDIE(DS);
Devang Patel8aa61472010-07-07 22:20:57 +0000581 // Note down abstract DIE.
582 if (ScopeDIE)
583 AbstractSPDies.insert(std::make_pair(DS, ScopeDIE));
584 }
Devang Patel3c91b052010-03-08 20:52:55 +0000585 else
Devang Pateld3024342011-08-15 22:24:32 +0000586 ScopeDIE = updateSubprogramScopeDIE(TheCU, DS);
Devang Patel3c91b052010-03-08 20:52:55 +0000587 }
Devang Patel5bc9fec2011-02-19 01:31:27 +0000588 else {
589 // There is no need to emit empty lexical block DIE.
590 if (Children.empty())
591 return NULL;
Devang Pateld3024342011-08-15 22:24:32 +0000592 ScopeDIE = constructLexicalScopeDIE(TheCU, Scope);
Devang Patel5bc9fec2011-02-19 01:31:27 +0000593 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000594
Devang Patelaead63c2010-03-29 22:59:58 +0000595 if (!ScopeDIE) return NULL;
Jim Grosbach1e20b962010-07-21 21:21:52 +0000596
Devang Patel5bc9fec2011-02-19 01:31:27 +0000597 // Add children
598 for (SmallVector<DIE *, 8>::iterator I = Children.begin(),
599 E = Children.end(); I != E; ++I)
600 ScopeDIE->addChild(*I);
Devang Patel193f7202009-11-24 01:14:22 +0000601
Eric Christophere5212782012-09-12 23:36:19 +0000602 if (DS.isSubprogram() && ObjectPointer != NULL)
603 TheCU->addDIEEntry(ScopeDIE, dwarf::DW_AT_object_pointer,
604 dwarf::DW_FORM_ref4, ObjectPointer);
605
Jim Grosbach1e20b962010-07-21 21:21:52 +0000606 if (DS.isSubprogram())
Eric Christopher0ffe2b42011-11-10 19:25:34 +0000607 TheCU->addPubTypes(DISubprogram(DS));
Jim Grosbach1e20b962010-07-21 21:21:52 +0000608
Eric Christopher0ffe2b42011-11-10 19:25:34 +0000609 return ScopeDIE;
Devang Patel53bb5c92009-11-10 23:06:00 +0000610}
611
Eric Christopherb6dc8652012-11-27 22:43:45 +0000612// Look up the source id with the given directory and source file names.
613// If none currently exists, create a new id and insert it in the
614// SourceIds map. This can update DirectoryNames and SourceFileNames maps
615// as well.
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000616unsigned DwarfDebug::getOrCreateSourceID(StringRef FileName,
Devang Patel23670e52011-03-24 20:30:50 +0000617 StringRef DirName) {
Devang Patel1905a182010-09-16 20:57:49 +0000618 // If FE did not provide a file name, then assume stdin.
619 if (FileName.empty())
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000620 return getOrCreateSourceID("<stdin>", StringRef());
Devang Patel23670e52011-03-24 20:30:50 +0000621
Nick Lewycky6c1a7032011-11-02 20:55:33 +0000622 // TODO: this might not belong here. See if we can factor this better.
623 if (DirName == CompilationDir)
624 DirName = "";
625
Nick Lewycky44d798d2011-10-17 23:05:28 +0000626 unsigned SrcId = SourceIdMap.size()+1;
Devang Patel1905a182010-09-16 20:57:49 +0000627
Benjamin Kramer74612c22012-03-11 14:56:26 +0000628 // We look up the file/dir pair by concatenating them with a zero byte.
629 SmallString<128> NamePair;
630 NamePair += DirName;
631 NamePair += '\0'; // Zero bytes are not allowed in paths.
632 NamePair += FileName;
633
634 StringMapEntry<unsigned> &Ent = SourceIdMap.GetOrCreateValue(NamePair, SrcId);
635 if (Ent.getValue() != SrcId)
636 return Ent.getValue();
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000637
Rafael Espindola5c055632010-11-18 02:04:25 +0000638 // Print out a .file directive to specify files for .loc directives.
Benjamin Kramer74612c22012-03-11 14:56:26 +0000639 Asm->OutStreamer.EmitDwarfFileDirective(SrcId, DirName, FileName);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000640
641 return SrcId;
642}
643
Eric Christopher72c16552012-12-20 21:58:40 +0000644// Create new CompileUnit for the given metadata node with tag
645// DW_TAG_compile_unit.
Devang Patel94c7ddb2011-08-16 22:09:43 +0000646CompileUnit *DwarfDebug::constructCompileUnit(const MDNode *N) {
Devang Patele4b27562009-08-28 23:24:31 +0000647 DICompileUnit DIUnit(N);
Devang Patel65dbc902009-11-25 17:36:49 +0000648 StringRef FN = DIUnit.getFilename();
Nick Lewycky6c1a7032011-11-02 20:55:33 +0000649 CompilationDir = DIUnit.getDirectory();
Eli Benderskyd4a05e02012-12-03 18:45:45 +0000650 // Call this to emit a .file directive if it wasn't emitted for the source
651 // file this CU comes from yet.
652 getOrCreateSourceID(FN, CompilationDir);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000653
654 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
Eli Benderskyd4a05e02012-12-03 18:45:45 +0000655 CompileUnit *NewCU = new CompileUnit(GlobalCUIndexCount++,
Eric Christopher2e5d8702012-12-20 21:58:36 +0000656 DIUnit.getLanguage(), Die, Asm,
657 this, &InfoHolder);
Nick Lewycky390c40d2011-10-27 06:44:11 +0000658 NewCU->addString(Die, dwarf::DW_AT_producer, DIUnit.getProducer());
Devang Patel3cbee302011-04-12 22:53:02 +0000659 NewCU->addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data2,
660 DIUnit.getLanguage());
Nick Lewycky390c40d2011-10-27 06:44:11 +0000661 NewCU->addString(Die, dwarf::DW_AT_name, FN);
Eric Christopher6635cad2012-08-01 18:19:01 +0000662 // 2.17.1 requires that we use DW_AT_low_pc for a single entry point
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000663 // into an entity. We're using 0 (or a NULL label) for this.
664 NewCU->addLabelAddress(Die, dwarf::DW_AT_low_pc, NULL);
Devang Patel4a602ca2010-03-22 23:11:36 +0000665 // DW_AT_stmt_list is a offset of line number information for this
Devang Patelaf608bd2010-08-24 00:06:12 +0000666 // compile unit in debug_line section.
Rafael Espindola2241e512012-06-22 13:24:07 +0000667 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
Rafael Espindola597a7662011-05-04 17:44:06 +0000668 NewCU->addLabel(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4,
Devang Patel3cbee302011-04-12 22:53:02 +0000669 Asm->GetTempSymbol("section_line"));
Devang Patelae84d5b2010-08-31 23:50:19 +0000670 else
Devang Patel3cbee302011-04-12 22:53:02 +0000671 NewCU->addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4, 0);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000672
Nick Lewycky6c1a7032011-11-02 20:55:33 +0000673 if (!CompilationDir.empty())
674 NewCU->addString(Die, dwarf::DW_AT_comp_dir, CompilationDir);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000675 if (DIUnit.isOptimized())
Eric Christopher873cf0a2012-08-24 01:14:27 +0000676 NewCU->addFlag(Die, dwarf::DW_AT_APPLE_optimized);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000677
Devang Patel65dbc902009-11-25 17:36:49 +0000678 StringRef Flags = DIUnit.getFlags();
679 if (!Flags.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +0000680 NewCU->addString(Die, dwarf::DW_AT_APPLE_flags, Flags);
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000681
Nick Lewyckyd5d52132011-10-17 23:27:36 +0000682 if (unsigned RVer = DIUnit.getRunTimeVersion())
Devang Patel3cbee302011-04-12 22:53:02 +0000683 NewCU->addUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers,
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000684 dwarf::DW_FORM_data1, RVer);
685
Devang Patel163a9f72010-05-10 22:49:55 +0000686 if (!FirstCU)
687 FirstCU = NewCU;
Eric Christopher208cc6f2013-02-05 07:31:55 +0000688
Eric Christopher31fb5da2013-02-05 07:32:03 +0000689 if (useSplitDwarf()) {
690 // This should be a unique identifier when we want to build .dwp files.
Eric Christopher208cc6f2013-02-05 07:31:55 +0000691 NewCU->addUInt(Die, dwarf::DW_AT_GNU_dwo_id, dwarf::DW_FORM_data8, 0);
Eric Christopher31fb5da2013-02-05 07:32:03 +0000692 // Now construct the skeleton CU associated.
693 constructSkeletonCU(N);
694 }
Eric Christopher98e237f2012-11-30 23:59:06 +0000695
Eric Christopher0e3e9b72012-12-10 23:34:43 +0000696 InfoHolder.addUnit(NewCU);
697
Devang Patel163a9f72010-05-10 22:49:55 +0000698 CUMap.insert(std::make_pair(N, NewCU));
Devang Patel94c7ddb2011-08-16 22:09:43 +0000699 return NewCU;
Devang Patel163a9f72010-05-10 22:49:55 +0000700}
701
Eric Christopherb6dc8652012-11-27 22:43:45 +0000702// Construct subprogram DIE.
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000703void DwarfDebug::constructSubprogramDIE(CompileUnit *TheCU,
Devang Patel3655a212011-08-15 23:36:40 +0000704 const MDNode *N) {
Rafael Espindolab0527282011-11-04 19:00:29 +0000705 CompileUnit *&CURef = SPMap[N];
706 if (CURef)
707 return;
708 CURef = TheCU;
709
Devang Patele4b27562009-08-28 23:24:31 +0000710 DISubprogram SP(N);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000711 if (!SP.isDefinition())
712 // This is a method declaration which will be handled while constructing
713 // class type.
Devang Patel13e16b62009-06-26 01:49:18 +0000714 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000715
Devang Pateldbc64af2011-08-15 17:24:54 +0000716 DIE *SubprogramDie = TheCU->getOrCreateSubprogramDIE(SP);
Stuart Hastings639336e2010-04-06 21:38:29 +0000717
718 // Add to map.
Devang Patel163a9f72010-05-10 22:49:55 +0000719 TheCU->insertDIE(N, SubprogramDie);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000720
721 // Add to context owner.
Devang Patel3cbee302011-04-12 22:53:02 +0000722 TheCU->addToContextOwner(SubprogramDie, SP.getContext());
Devang Patel0000fad2009-12-08 23:21:45 +0000723
Devang Patel13e16b62009-06-26 01:49:18 +0000724 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000725}
726
Eric Christopherb6dc8652012-11-27 22:43:45 +0000727// Collect debug info from named mdnodes such as llvm.dbg.enum and llvm.dbg.ty.
Eric Christopherc4639d62012-11-19 22:42:15 +0000728void DwarfDebug::collectInfoFromNamedMDNodes(const Module *M) {
Devang Patel94c7ddb2011-08-16 22:09:43 +0000729 if (NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.sp"))
730 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
731 const MDNode *N = NMD->getOperand(i);
732 if (CompileUnit *CU = CUMap.lookup(DISubprogram(N).getCompileUnit()))
733 constructSubprogramDIE(CU, N);
734 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000735
Devang Patel94c7ddb2011-08-16 22:09:43 +0000736 if (NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.gv"))
737 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
738 const MDNode *N = NMD->getOperand(i);
739 if (CompileUnit *CU = CUMap.lookup(DIGlobalVariable(N).getCompileUnit()))
Devang Patel28bea082011-08-18 23:17:55 +0000740 CU->createGlobalVariableDIE(N);
Devang Patel94c7ddb2011-08-16 22:09:43 +0000741 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000742
Devang Patel02e603f2011-08-15 23:47:24 +0000743 if (NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.enum"))
744 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
745 DIType Ty(NMD->getOperand(i));
Devang Patel94c7ddb2011-08-16 22:09:43 +0000746 if (CompileUnit *CU = CUMap.lookup(Ty.getCompileUnit()))
747 CU->getOrCreateTypeDIE(Ty);
Devang Patel02e603f2011-08-15 23:47:24 +0000748 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000749
Devang Patel02e603f2011-08-15 23:47:24 +0000750 if (NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.ty"))
751 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
752 DIType Ty(NMD->getOperand(i));
Devang Patel94c7ddb2011-08-16 22:09:43 +0000753 if (CompileUnit *CU = CUMap.lookup(Ty.getCompileUnit()))
754 CU->getOrCreateTypeDIE(Ty);
Devang Patel02e603f2011-08-15 23:47:24 +0000755 }
756}
757
Eric Christopherb6dc8652012-11-27 22:43:45 +0000758// Collect debug info using DebugInfoFinder.
759// FIXME - Remove this when dragonegg switches to DIBuilder.
Eric Christopherc4639d62012-11-19 22:42:15 +0000760bool DwarfDebug::collectLegacyDebugInfo(const Module *M) {
Devang Patel02e603f2011-08-15 23:47:24 +0000761 DebugInfoFinder DbgFinder;
762 DbgFinder.processModule(*M);
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000763
Devang Patel02e603f2011-08-15 23:47:24 +0000764 bool HasDebugInfo = false;
765 // Scan all the compile-units to see if there are any marked as the main
766 // unit. If not, we do not generate debug info.
767 for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
768 E = DbgFinder.compile_unit_end(); I != E; ++I) {
769 if (DICompileUnit(*I).isMain()) {
770 HasDebugInfo = true;
771 break;
772 }
773 }
774 if (!HasDebugInfo) return false;
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000775
Devang Patel02e603f2011-08-15 23:47:24 +0000776 // Create all the compile unit DIEs.
777 for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
778 E = DbgFinder.compile_unit_end(); I != E; ++I)
779 constructCompileUnit(*I);
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000780
Devang Patel02e603f2011-08-15 23:47:24 +0000781 // Create DIEs for each global variable.
782 for (DebugInfoFinder::iterator I = DbgFinder.global_variable_begin(),
783 E = DbgFinder.global_variable_end(); I != E; ++I) {
784 const MDNode *N = *I;
Devang Patel94c7ddb2011-08-16 22:09:43 +0000785 if (CompileUnit *CU = CUMap.lookup(DIGlobalVariable(N).getCompileUnit()))
Devang Patel28bea082011-08-18 23:17:55 +0000786 CU->createGlobalVariableDIE(N);
Devang Patel02e603f2011-08-15 23:47:24 +0000787 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000788
Devang Patel02e603f2011-08-15 23:47:24 +0000789 // Create DIEs for each subprogram.
790 for (DebugInfoFinder::iterator I = DbgFinder.subprogram_begin(),
791 E = DbgFinder.subprogram_end(); I != E; ++I) {
792 const MDNode *N = *I;
Devang Patel94c7ddb2011-08-16 22:09:43 +0000793 if (CompileUnit *CU = CUMap.lookup(DISubprogram(N).getCompileUnit()))
794 constructSubprogramDIE(CU, N);
Devang Patel02e603f2011-08-15 23:47:24 +0000795 }
796
797 return HasDebugInfo;
798}
799
Eric Christopherb6dc8652012-11-27 22:43:45 +0000800// Emit all Dwarf sections that should come prior to the content. Create
801// global DIEs and emit initial debug info sections. This is invoked by
802// the target AsmPrinter.
Eric Christopherc4639d62012-11-19 22:42:15 +0000803void DwarfDebug::beginModule() {
Devang Pateleac9c072010-04-27 19:46:33 +0000804 if (DisableDebugInfoPrinting)
805 return;
806
Eric Christopherc4639d62012-11-19 22:42:15 +0000807 const Module *M = MMI->getModule();
808
Nick Lewycky3bbb6f72011-07-29 03:49:23 +0000809 // If module has named metadata anchors then use them, otherwise scan the
810 // module using debug info finder to collect debug info.
Devang Patel30692ab2011-05-03 16:45:22 +0000811 NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu");
812 if (CU_Nodes) {
Devang Patel94c7ddb2011-08-16 22:09:43 +0000813 for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i) {
814 DICompileUnit CUNode(CU_Nodes->getOperand(i));
815 CompileUnit *CU = constructCompileUnit(CUNode);
816 DIArray GVs = CUNode.getGlobalVariables();
817 for (unsigned i = 0, e = GVs.getNumElements(); i != e; ++i)
Devang Patel28bea082011-08-18 23:17:55 +0000818 CU->createGlobalVariableDIE(GVs.getElement(i));
Devang Patel94c7ddb2011-08-16 22:09:43 +0000819 DIArray SPs = CUNode.getSubprograms();
820 for (unsigned i = 0, e = SPs.getNumElements(); i != e; ++i)
821 constructSubprogramDIE(CU, SPs.getElement(i));
822 DIArray EnumTypes = CUNode.getEnumTypes();
823 for (unsigned i = 0, e = EnumTypes.getNumElements(); i != e; ++i)
824 CU->getOrCreateTypeDIE(EnumTypes.getElement(i));
825 DIArray RetainedTypes = CUNode.getRetainedTypes();
826 for (unsigned i = 0, e = RetainedTypes.getNumElements(); i != e; ++i)
827 CU->getOrCreateTypeDIE(RetainedTypes.getElement(i));
828 }
Devang Patel02e603f2011-08-15 23:47:24 +0000829 } else if (!collectLegacyDebugInfo(M))
830 return;
Devang Patel30692ab2011-05-03 16:45:22 +0000831
Devang Patel02e603f2011-08-15 23:47:24 +0000832 collectInfoFromNamedMDNodes(M);
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000833
Chris Lattnerd850ac72010-04-05 02:19:28 +0000834 // Tell MMI that we have debug info.
835 MMI->setDebugInfoAvailability(true);
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000836
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000837 // Prime section data.
Chris Lattnerf0144122009-07-28 03:13:23 +0000838 SectionMap.insert(Asm->getObjFileLowering().getTextSection());
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000839}
840
Eric Christopher4117bec2012-11-22 00:59:49 +0000841// Attach DW_AT_inline attribute with inlined subprogram DIEs.
842void DwarfDebug::computeInlinedDIEs() {
Devang Patel53bb5c92009-11-10 23:06:00 +0000843 // Attach DW_AT_inline attribute with inlined subprogram DIEs.
844 for (SmallPtrSet<DIE *, 4>::iterator AI = InlinedSubprogramDIEs.begin(),
Eric Christopherbdab8002012-11-27 00:13:51 +0000845 AE = InlinedSubprogramDIEs.end(); AI != AE; ++AI) {
Devang Patel53bb5c92009-11-10 23:06:00 +0000846 DIE *ISP = *AI;
Devang Patel3cbee302011-04-12 22:53:02 +0000847 FirstCU->addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
Devang Patel53bb5c92009-11-10 23:06:00 +0000848 }
Rafael Espindolad1ac3a42011-11-12 01:57:54 +0000849 for (DenseMap<const MDNode *, DIE *>::iterator AI = AbstractSPDies.begin(),
Eric Christopherbdab8002012-11-27 00:13:51 +0000850 AE = AbstractSPDies.end(); AI != AE; ++AI) {
Rafael Espindolad1ac3a42011-11-12 01:57:54 +0000851 DIE *ISP = AI->second;
852 if (InlinedSubprogramDIEs.count(ISP))
853 continue;
854 FirstCU->addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
855 }
Eric Christopher4117bec2012-11-22 00:59:49 +0000856}
857
858// Collect info for variables that were optimized out.
859void DwarfDebug::collectDeadVariables() {
860 const Module *M = MMI->getModule();
861 DenseMap<const MDNode *, LexicalScope *> DeadFnScopeMap;
862
863 if (NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu")) {
864 for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i) {
865 DICompileUnit TheCU(CU_Nodes->getOperand(i));
866 DIArray Subprograms = TheCU.getSubprograms();
867 for (unsigned i = 0, e = Subprograms.getNumElements(); i != e; ++i) {
Eric Christopherbdab8002012-11-27 00:13:51 +0000868 DISubprogram SP(Subprograms.getElement(i));
869 if (ProcessedSPNodes.count(SP) != 0) continue;
870 if (!SP.Verify()) continue;
871 if (!SP.isDefinition()) continue;
872 DIArray Variables = SP.getVariables();
873 if (Variables.getNumElements() == 0) continue;
Eric Christopher4117bec2012-11-22 00:59:49 +0000874
Eric Christopherbdab8002012-11-27 00:13:51 +0000875 LexicalScope *Scope =
876 new LexicalScope(NULL, DIDescriptor(SP), NULL, false);
877 DeadFnScopeMap[SP] = Scope;
Eric Christopher4117bec2012-11-22 00:59:49 +0000878
Eric Christopherbdab8002012-11-27 00:13:51 +0000879 // Construct subprogram DIE and add variables DIEs.
880 CompileUnit *SPCU = CUMap.lookup(TheCU);
881 assert(SPCU && "Unable to find Compile Unit!");
882 constructSubprogramDIE(SPCU, SP);
883 DIE *ScopeDIE = SPCU->getDIE(SP);
884 for (unsigned vi = 0, ve = Variables.getNumElements(); vi != ve; ++vi) {
885 DIVariable DV(Variables.getElement(vi));
886 if (!DV.Verify()) continue;
887 DbgVariable *NewVar = new DbgVariable(DV, NULL);
888 if (DIE *VariableDIE =
889 SPCU->constructVariableDIE(NewVar, Scope->isAbstractScope()))
890 ScopeDIE->addChild(VariableDIE);
891 }
Eric Christopher4117bec2012-11-22 00:59:49 +0000892 }
893 }
894 }
895 DeleteContainerSeconds(DeadFnScopeMap);
896}
897
898void DwarfDebug::finalizeModuleInfo() {
899 // Collect info for variables that were optimized out.
900 collectDeadVariables();
901
902 // Attach DW_AT_inline attribute with inlined subprogram DIEs.
903 computeInlinedDIEs();
Devang Patel53bb5c92009-11-10 23:06:00 +0000904
Eric Christopher6635cad2012-08-01 18:19:01 +0000905 // Emit DW_AT_containing_type attribute to connect types with their
906 // vtable holding type.
Devang Pateldbc64af2011-08-15 17:24:54 +0000907 for (DenseMap<const MDNode *, CompileUnit *>::iterator CUI = CUMap.begin(),
Eric Christopherbdab8002012-11-27 00:13:51 +0000908 CUE = CUMap.end(); CUI != CUE; ++CUI) {
Devang Pateldbc64af2011-08-15 17:24:54 +0000909 CompileUnit *TheCU = CUI->second;
910 TheCU->constructContainingTypeDIEs();
Devang Patel5d11eb02009-12-03 19:11:07 +0000911 }
912
Eric Christopher4117bec2012-11-22 00:59:49 +0000913 // Compute DIE offsets and sizes.
Eric Christopher0e3e9b72012-12-10 23:34:43 +0000914 InfoHolder.computeSizeAndOffsets();
915 if (useSplitDwarf())
916 SkeletonHolder.computeSizeAndOffsets();
Eric Christopher4117bec2012-11-22 00:59:49 +0000917}
918
919void DwarfDebug::endSections() {
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000920 // Standard sections final addresses.
Chris Lattner6c2f9e12009-08-19 05:49:37 +0000921 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getTextSection());
Chris Lattnerc0215722010-04-04 19:25:43 +0000922 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("text_end"));
Chris Lattner6c2f9e12009-08-19 05:49:37 +0000923 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getDataSection());
Chris Lattnerc0215722010-04-04 19:25:43 +0000924 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("data_end"));
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000925
926 // End text sections.
Benjamin Kramerb4c9d9c2012-10-31 13:45:49 +0000927 for (unsigned I = 0, E = SectionMap.size(); I != E; ++I) {
928 Asm->OutStreamer.SwitchSection(SectionMap[I]);
929 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("section_end", I+1));
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000930 }
Eric Christopher4117bec2012-11-22 00:59:49 +0000931}
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000932
Eric Christopherb6dc8652012-11-27 22:43:45 +0000933// Emit all Dwarf sections that should come after the content.
Eric Christopher4117bec2012-11-22 00:59:49 +0000934void DwarfDebug::endModule() {
935
936 if (!FirstCU) return;
937
938 // End any existing sections.
939 // TODO: Does this need to happen?
940 endSections();
941
942 // Finalize the debug info for the module.
943 finalizeModuleInfo();
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000944
Eric Christopher97c34722012-11-19 19:43:59 +0000945 // Emit initial sections.
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000946 emitSectionLabels();
Eric Christopher97c34722012-11-19 19:43:59 +0000947
Eric Christopher4daaed12012-12-10 19:51:21 +0000948 if (!useSplitDwarf()) {
Eric Christopher42885022012-11-27 22:43:42 +0000949 // Emit all the DIEs into a debug info section.
950 emitDebugInfo();
Eric Christopher74802f72012-11-27 00:41:54 +0000951
Eric Christopher42885022012-11-27 22:43:42 +0000952 // Corresponding abbreviations into a abbrev section.
953 emitAbbreviations();
954
955 // Emit info into a debug loc section.
956 emitDebugLoc();
957
958 // Emit info into a debug aranges section.
959 emitDebugARanges();
960
961 // Emit info into a debug ranges section.
962 emitDebugRanges();
963
964 // Emit info into a debug macinfo section.
965 emitDebugMacInfo();
966
967 // Emit inline info.
968 // TODO: When we don't need the option anymore we
969 // can remove all of the code that this section
970 // depends upon.
971 if (useDarwinGDBCompat())
972 emitDebugInlineInfo();
973 } else {
Eric Christopher0b944ee2012-12-11 19:42:09 +0000974 // TODO: Fill this in for separated debug sections and separate
Eric Christopher42885022012-11-27 22:43:42 +0000975 // out information into new sections.
976
Eric Christopher98e237f2012-11-30 23:59:06 +0000977 // Emit the debug info section and compile units.
Eric Christopher42885022012-11-27 22:43:42 +0000978 emitDebugInfo();
Eric Christopher98e237f2012-11-30 23:59:06 +0000979 emitDebugInfoDWO();
Eric Christopher42885022012-11-27 22:43:42 +0000980
981 // Corresponding abbreviations into a abbrev section.
982 emitAbbreviations();
Eric Christopher6eebe472012-12-19 22:02:53 +0000983 emitDebugAbbrevDWO();
Eric Christopher42885022012-11-27 22:43:42 +0000984
985 // Emit info into a debug loc section.
986 emitDebugLoc();
987
988 // Emit info into a debug aranges section.
989 emitDebugARanges();
990
991 // Emit info into a debug ranges section.
992 emitDebugRanges();
993
994 // Emit info into a debug macinfo section.
995 emitDebugMacInfo();
996
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000997 // Emit DWO addresses.
998 InfoHolder.emitAddresses(Asm->getObjFileLowering().getDwarfAddrSection());
999
Eric Christopher42885022012-11-27 22:43:42 +00001000 // Emit inline info.
1001 // TODO: When we don't need the option anymore we
1002 // can remove all of the code that this section
1003 // depends upon.
1004 if (useDarwinGDBCompat())
1005 emitDebugInlineInfo();
1006 }
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001007
Eric Christopher9d9f5a52012-08-23 07:32:06 +00001008 // Emit info into the dwarf accelerator table sections.
Eric Christopher20f47ab2012-08-23 22:36:40 +00001009 if (useDwarfAccelTables()) {
Eric Christopher09ac3d82011-11-07 09:24:32 +00001010 emitAccelNames();
1011 emitAccelObjC();
1012 emitAccelNamespaces();
1013 emitAccelTypes();
1014 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001015
Devang Patel193f7202009-11-24 01:14:22 +00001016 // Emit info into a debug pubtypes section.
Eric Christopher360f0062012-08-23 07:10:56 +00001017 // TODO: When we don't need the option anymore we can
1018 // remove all of the code that adds to the table.
Eric Christopher20f47ab2012-08-23 22:36:40 +00001019 if (useDarwinGDBCompat())
Eric Christopher360f0062012-08-23 07:10:56 +00001020 emitDebugPubTypes();
Devang Patel193f7202009-11-24 01:14:22 +00001021
Eric Christopher42885022012-11-27 22:43:42 +00001022 // Finally emit string information into a string table.
Eric Christopherfcdbecb2012-11-27 06:49:23 +00001023 emitDebugStr();
Eric Christopher64f824c2012-12-27 02:14:01 +00001024 if (useSplitDwarf())
1025 emitDebugStrDWO();
Eric Christopherfcdbecb2012-11-27 06:49:23 +00001026
Devang Patele9a1cca2010-08-02 17:32:15 +00001027 // clean up.
Devang Patel94c7ddb2011-08-16 22:09:43 +00001028 SPMap.clear();
Devang Patel163a9f72010-05-10 22:49:55 +00001029 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
1030 E = CUMap.end(); I != E; ++I)
1031 delete I->second;
Eric Christopher9ec87b32012-12-10 19:51:18 +00001032
Eric Christopher4daaed12012-12-10 19:51:21 +00001033 delete SkeletonCU;
Eric Christopher9ec87b32012-12-10 19:51:18 +00001034
Eric Christopher98e237f2012-11-30 23:59:06 +00001035 // Reset these for the next Module if we have one.
1036 FirstCU = NULL;
Eric Christopher4daaed12012-12-10 19:51:21 +00001037 SkeletonCU = NULL;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001038}
1039
Eric Christopherb6dc8652012-11-27 22:43:45 +00001040// Find abstract variable, if any, associated with Var.
Devang Patelb549bcf2011-08-10 21:50:54 +00001041DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &DV,
Chris Lattnerde4845c2010-04-02 19:42:39 +00001042 DebugLoc ScopeLoc) {
Devang Patelb549bcf2011-08-10 21:50:54 +00001043 LLVMContext &Ctx = DV->getContext();
1044 // More then one inlined variable corresponds to one abstract variable.
1045 DIVariable Var = cleanseInlinedVariable(DV, Ctx);
Devang Patel2db49d72010-05-07 18:11:54 +00001046 DbgVariable *AbsDbgVariable = AbstractVariables.lookup(Var);
Devang Patel53bb5c92009-11-10 23:06:00 +00001047 if (AbsDbgVariable)
1048 return AbsDbgVariable;
1049
Devang Patelbf47fdb2011-08-10 20:55:27 +00001050 LexicalScope *Scope = LScopes.findAbstractScope(ScopeLoc.getScope(Ctx));
Devang Patel53bb5c92009-11-10 23:06:00 +00001051 if (!Scope)
1052 return NULL;
1053
Devang Patel5a1a67c2011-08-15 19:01:20 +00001054 AbsDbgVariable = new DbgVariable(Var, NULL);
Devang Patelbf47fdb2011-08-10 20:55:27 +00001055 addScopeVariable(Scope, AbsDbgVariable);
Devang Patel2db49d72010-05-07 18:11:54 +00001056 AbstractVariables[Var] = AbsDbgVariable;
Devang Patel53bb5c92009-11-10 23:06:00 +00001057 return AbsDbgVariable;
1058}
1059
Eric Christopherb6dc8652012-11-27 22:43:45 +00001060// If Var is a current function argument then add it to CurrentFnArguments list.
Devang Patel0478c152011-03-01 22:58:55 +00001061bool DwarfDebug::addCurrentFnArgument(const MachineFunction *MF,
Devang Patelbf47fdb2011-08-10 20:55:27 +00001062 DbgVariable *Var, LexicalScope *Scope) {
1063 if (!LScopes.isCurrentFunctionScope(Scope))
Devang Patel0478c152011-03-01 22:58:55 +00001064 return false;
1065 DIVariable DV = Var->getVariable();
1066 if (DV.getTag() != dwarf::DW_TAG_arg_variable)
1067 return false;
1068 unsigned ArgNo = DV.getArgNumber();
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001069 if (ArgNo == 0)
Devang Patel0478c152011-03-01 22:58:55 +00001070 return false;
1071
Devang Patelcb3a6572011-03-03 20:02:02 +00001072 size_t Size = CurrentFnArguments.size();
1073 if (Size == 0)
Devang Patel0478c152011-03-01 22:58:55 +00001074 CurrentFnArguments.resize(MF->getFunction()->arg_size());
Devang Patelbbd0f452011-03-03 21:49:41 +00001075 // llvm::Function argument size is not good indicator of how many
Devang Patel6f676be2011-03-03 20:08:10 +00001076 // arguments does the function have at source level.
1077 if (ArgNo > Size)
Devang Patelcb3a6572011-03-03 20:02:02 +00001078 CurrentFnArguments.resize(ArgNo * 2);
Devang Patel0478c152011-03-01 22:58:55 +00001079 CurrentFnArguments[ArgNo - 1] = Var;
1080 return true;
1081}
1082
Eric Christopherb6dc8652012-11-27 22:43:45 +00001083// Collect variable information from side table maintained by MMI.
Jim Grosbach1e20b962010-07-21 21:21:52 +00001084void
Nick Lewycky3bbb6f72011-07-29 03:49:23 +00001085DwarfDebug::collectVariableInfoFromMMITable(const MachineFunction *MF,
Devang Patelee432862010-05-20 19:57:06 +00001086 SmallPtrSet<const MDNode *, 16> &Processed) {
Devang Patele717faa2009-10-06 01:26:37 +00001087 MachineModuleInfo::VariableDbgInfoMapTy &VMap = MMI->getVariableDbgInfo();
1088 for (MachineModuleInfo::VariableDbgInfoMapTy::iterator VI = VMap.begin(),
1089 VE = VMap.end(); VI != VE; ++VI) {
Devang Patele9f8f5e2010-05-07 20:54:48 +00001090 const MDNode *Var = VI->first;
Devang Patel53bb5c92009-11-10 23:06:00 +00001091 if (!Var) continue;
Devang Patel98e1cac2010-05-14 21:01:35 +00001092 Processed.insert(Var);
Chris Lattnerde4845c2010-04-02 19:42:39 +00001093 DIVariable DV(Var);
1094 const std::pair<unsigned, DebugLoc> &VP = VI->second;
Devang Patel53bb5c92009-11-10 23:06:00 +00001095
Devang Patelbf47fdb2011-08-10 20:55:27 +00001096 LexicalScope *Scope = LScopes.findLexicalScope(VP.second);
Jim Grosbach1e20b962010-07-21 21:21:52 +00001097
Devang Patelfb0ee432009-11-10 23:20:04 +00001098 // If variable scope is not found then skip this variable.
Chris Lattnerde4845c2010-04-02 19:42:39 +00001099 if (Scope == 0)
Devang Patelfb0ee432009-11-10 23:20:04 +00001100 continue;
Devang Patel53bb5c92009-11-10 23:06:00 +00001101
Devang Patel26c1e562010-05-20 16:36:41 +00001102 DbgVariable *AbsDbgVariable = findAbstractVariable(DV, VP.second);
Devang Patel5a1a67c2011-08-15 19:01:20 +00001103 DbgVariable *RegVar = new DbgVariable(DV, AbsDbgVariable);
Devang Patelff9dd0a2011-08-15 21:24:36 +00001104 RegVar->setFrameIndex(VP.first);
Devang Patel0478c152011-03-01 22:58:55 +00001105 if (!addCurrentFnArgument(MF, RegVar, Scope))
Devang Patelbf47fdb2011-08-10 20:55:27 +00001106 addScopeVariable(Scope, RegVar);
Devang Patel5a1a67c2011-08-15 19:01:20 +00001107 if (AbsDbgVariable)
Devang Patelff9dd0a2011-08-15 21:24:36 +00001108 AbsDbgVariable->setFrameIndex(VP.first);
Devang Patele717faa2009-10-06 01:26:37 +00001109 }
Devang Patelee432862010-05-20 19:57:06 +00001110}
Devang Patel90a48ad2010-03-15 18:33:46 +00001111
Eric Christopherb6dc8652012-11-27 22:43:45 +00001112// Return true if debug value, encoded by DBG_VALUE instruction, is in a
1113// defined reg.
Devang Patelc3f5f782010-05-25 23:40:22 +00001114static bool isDbgValueInDefinedReg(const MachineInstr *MI) {
Nick Lewycky746cb672011-10-26 22:55:33 +00001115 assert(MI->isDebugValue() && "Invalid DBG_VALUE machine instruction!");
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001116 return MI->getNumOperands() == 3 &&
1117 MI->getOperand(0).isReg() && MI->getOperand(0).getReg() &&
1118 MI->getOperand(1).isImm() && MI->getOperand(1).getImm() == 0;
Devang Patelc3f5f782010-05-25 23:40:22 +00001119}
1120
Eric Christopherb6dc8652012-11-27 22:43:45 +00001121// Get .debug_loc entry for the instruction range starting at MI.
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001122static DotDebugLocEntry getDebugLocEntry(AsmPrinter *Asm,
1123 const MCSymbol *FLabel,
Devang Patel90b40412011-07-08 17:09:57 +00001124 const MCSymbol *SLabel,
1125 const MachineInstr *MI) {
1126 const MDNode *Var = MI->getOperand(MI->getNumOperands() - 1).getMetadata();
1127
1128 if (MI->getNumOperands() != 3) {
1129 MachineLocation MLoc = Asm->getDebugValueLocation(MI);
1130 return DotDebugLocEntry(FLabel, SLabel, MLoc, Var);
1131 }
1132 if (MI->getOperand(0).isReg() && MI->getOperand(1).isImm()) {
1133 MachineLocation MLoc;
1134 MLoc.set(MI->getOperand(0).getReg(), MI->getOperand(1).getImm());
1135 return DotDebugLocEntry(FLabel, SLabel, MLoc, Var);
1136 }
1137 if (MI->getOperand(0).isImm())
1138 return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getImm());
1139 if (MI->getOperand(0).isFPImm())
1140 return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getFPImm());
1141 if (MI->getOperand(0).isCImm())
1142 return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getCImm());
1143
Craig Topper5e25ee82012-02-05 08:31:47 +00001144 llvm_unreachable("Unexpected 3 operand DBG_VALUE instruction!");
Devang Patel90b40412011-07-08 17:09:57 +00001145}
1146
Eric Christopherb6dc8652012-11-27 22:43:45 +00001147// Find variables for each lexical scope.
Jim Grosbach1e20b962010-07-21 21:21:52 +00001148void
Devang Patel78e127d2010-06-25 22:07:34 +00001149DwarfDebug::collectVariableInfo(const MachineFunction *MF,
1150 SmallPtrSet<const MDNode *, 16> &Processed) {
Jim Grosbach1e20b962010-07-21 21:21:52 +00001151
Eric Christopherb6dc8652012-11-27 22:43:45 +00001152 // collection info from MMI table.
Devang Patelee432862010-05-20 19:57:06 +00001153 collectVariableInfoFromMMITable(MF, Processed);
1154
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001155 for (SmallVectorImpl<const MDNode*>::const_iterator
1156 UVI = UserVariables.begin(), UVE = UserVariables.end(); UVI != UVE;
1157 ++UVI) {
1158 const MDNode *Var = *UVI;
1159 if (Processed.count(Var))
Devang Patelee432862010-05-20 19:57:06 +00001160 continue;
1161
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001162 // History contains relevant DBG_VALUE instructions for Var and instructions
1163 // clobbering it.
1164 SmallVectorImpl<const MachineInstr*> &History = DbgValues[Var];
1165 if (History.empty())
1166 continue;
1167 const MachineInstr *MInsn = History.front();
Devang Patelc3f5f782010-05-25 23:40:22 +00001168
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001169 DIVariable DV(Var);
Devang Patelbf47fdb2011-08-10 20:55:27 +00001170 LexicalScope *Scope = NULL;
Devang Pateld8720f42010-05-27 20:25:04 +00001171 if (DV.getTag() == dwarf::DW_TAG_arg_variable &&
1172 DISubprogram(DV.getContext()).describes(MF->getFunction()))
Devang Patelbf47fdb2011-08-10 20:55:27 +00001173 Scope = LScopes.getCurrentFunctionScope();
Devang Patel40c7e412011-07-20 22:18:50 +00001174 else {
1175 if (DV.getVersion() <= LLVMDebugVersion9)
Devang Patelbf47fdb2011-08-10 20:55:27 +00001176 Scope = LScopes.findLexicalScope(MInsn->getDebugLoc());
Devang Patel40c7e412011-07-20 22:18:50 +00001177 else {
1178 if (MDNode *IA = DV.getInlinedAt())
Devang Patelbf47fdb2011-08-10 20:55:27 +00001179 Scope = LScopes.findInlinedScope(DebugLoc::getFromDILocation(IA));
Devang Patel40c7e412011-07-20 22:18:50 +00001180 else
Devang Patelbf47fdb2011-08-10 20:55:27 +00001181 Scope = LScopes.findLexicalScope(cast<MDNode>(DV->getOperand(1)));
Devang Patel40c7e412011-07-20 22:18:50 +00001182 }
1183 }
Devang Patelee432862010-05-20 19:57:06 +00001184 // If variable scope is not found then skip this variable.
Devang Patelc0c5a262010-05-21 00:10:20 +00001185 if (!Scope)
Devang Patelee432862010-05-20 19:57:06 +00001186 continue;
1187
1188 Processed.insert(DV);
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001189 assert(MInsn->isDebugValue() && "History must begin with debug value");
Devang Patel5a1a67c2011-08-15 19:01:20 +00001190 DbgVariable *AbsVar = findAbstractVariable(DV, MInsn->getDebugLoc());
1191 DbgVariable *RegVar = new DbgVariable(DV, AbsVar);
Devang Patel0478c152011-03-01 22:58:55 +00001192 if (!addCurrentFnArgument(MF, RegVar, Scope))
Devang Patelbf47fdb2011-08-10 20:55:27 +00001193 addScopeVariable(Scope, RegVar);
Devang Patel5a1a67c2011-08-15 19:01:20 +00001194 if (AbsVar)
Devang Patelff9dd0a2011-08-15 21:24:36 +00001195 AbsVar->setMInsn(MInsn);
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001196
Eric Christopherc56e3f02012-10-08 20:48:54 +00001197 // Simplify ranges that are fully coalesced.
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001198 if (History.size() <= 1 || (History.size() == 2 &&
1199 MInsn->isIdenticalTo(History.back()))) {
Devang Patelff9dd0a2011-08-15 21:24:36 +00001200 RegVar->setMInsn(MInsn);
Devang Patelc3f5f782010-05-25 23:40:22 +00001201 continue;
1202 }
1203
Eric Christopher498703b2013-01-28 17:33:26 +00001204 // Handle multiple DBG_VALUE instructions describing one variable.
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001205 RegVar->setDotDebugLocOffset(DotDebugLocEntries.size());
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001206
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001207 for (SmallVectorImpl<const MachineInstr*>::const_iterator
1208 HI = History.begin(), HE = History.end(); HI != HE; ++HI) {
1209 const MachineInstr *Begin = *HI;
1210 assert(Begin->isDebugValue() && "Invalid History entry");
Jakob Stoklund Olesene17232e2011-03-22 00:21:41 +00001211
Devang Patel4ada1d72011-06-01 23:00:17 +00001212 // Check if DBG_VALUE is truncating a range.
1213 if (Begin->getNumOperands() > 1 && Begin->getOperand(0).isReg()
1214 && !Begin->getOperand(0).getReg())
1215 continue;
1216
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001217 // Compute the range for a register location.
1218 const MCSymbol *FLabel = getLabelBeforeInsn(Begin);
1219 const MCSymbol *SLabel = 0;
1220
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001221 if (HI + 1 == HE)
1222 // If Begin is the last instruction in History then its value is valid
Chris Lattner7a2bdde2011-04-15 05:18:47 +00001223 // until the end of the function.
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001224 SLabel = FunctionEndSym;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001225 else {
1226 const MachineInstr *End = HI[1];
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001227 DEBUG(dbgs() << "DotDebugLoc Pair:\n"
Devang Patel476df5f2011-07-07 21:44:42 +00001228 << "\t" << *Begin << "\t" << *End << "\n");
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001229 if (End->isDebugValue())
1230 SLabel = getLabelBeforeInsn(End);
1231 else {
1232 // End is a normal instruction clobbering the range.
1233 SLabel = getLabelAfterInsn(End);
1234 assert(SLabel && "Forgot label after clobber instruction");
1235 ++HI;
1236 }
1237 }
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001238
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001239 // The value is valid until the next DBG_VALUE or clobber.
Eric Christopherabbb2002011-12-16 23:42:31 +00001240 DotDebugLocEntries.push_back(getDebugLocEntry(Asm, FLabel, SLabel,
1241 Begin));
Devang Patelc3f5f782010-05-25 23:40:22 +00001242 }
1243 DotDebugLocEntries.push_back(DotDebugLocEntry());
Devang Patel90a48ad2010-03-15 18:33:46 +00001244 }
Devang Patel98e1cac2010-05-14 21:01:35 +00001245
1246 // Collect info for variables that were optimized out.
Devang Patel93d39be2011-08-19 23:28:12 +00001247 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
1248 DIArray Variables = DISubprogram(FnScope->getScopeNode()).getVariables();
1249 for (unsigned i = 0, e = Variables.getNumElements(); i != e; ++i) {
1250 DIVariable DV(Variables.getElement(i));
1251 if (!DV || !DV.Verify() || !Processed.insert(DV))
1252 continue;
1253 if (LexicalScope *Scope = LScopes.findLexicalScope(DV.getContext()))
1254 addScopeVariable(Scope, new DbgVariable(DV, NULL));
Devang Patel98e1cac2010-05-14 21:01:35 +00001255 }
Devang Patelc3f5f782010-05-25 23:40:22 +00001256}
Devang Patel98e1cac2010-05-14 21:01:35 +00001257
Eric Christopherb6dc8652012-11-27 22:43:45 +00001258// Return Label preceding the instruction.
Eric Christopher72f7bfb2013-01-15 23:56:56 +00001259MCSymbol *DwarfDebug::getLabelBeforeInsn(const MachineInstr *MI) {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001260 MCSymbol *Label = LabelsBeforeInsn.lookup(MI);
1261 assert(Label && "Didn't insert label before instruction");
1262 return Label;
Devang Patelc3f5f782010-05-25 23:40:22 +00001263}
1264
Eric Christopherb6dc8652012-11-27 22:43:45 +00001265// Return Label immediately following the instruction.
Eric Christopher72f7bfb2013-01-15 23:56:56 +00001266MCSymbol *DwarfDebug::getLabelAfterInsn(const MachineInstr *MI) {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001267 return LabelsAfterInsn.lookup(MI);
Devang Patele717faa2009-10-06 01:26:37 +00001268}
1269
Eric Christopherb6dc8652012-11-27 22:43:45 +00001270// Process beginning of an instruction.
Devang Patelcbbe2872010-10-26 17:49:02 +00001271void DwarfDebug::beginInstruction(const MachineInstr *MI) {
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001272 // Check if source location changes, but ignore DBG_VALUE locations.
1273 if (!MI->isDebugValue()) {
1274 DebugLoc DL = MI->getDebugLoc();
1275 if (DL != PrevInstLoc && (!DL.isUnknown() || UnknownLocations)) {
Eric Christopher60b35f42012-04-05 20:39:05 +00001276 unsigned Flags = 0;
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001277 PrevInstLoc = DL;
Devang Patel4243e672011-05-11 19:22:19 +00001278 if (DL == PrologEndLoc) {
1279 Flags |= DWARF2_FLAG_PROLOGUE_END;
1280 PrologEndLoc = DebugLoc();
1281 }
Eric Christopher60b35f42012-04-05 20:39:05 +00001282 if (PrologEndLoc.isUnknown())
1283 Flags |= DWARF2_FLAG_IS_STMT;
1284
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001285 if (!DL.isUnknown()) {
1286 const MDNode *Scope = DL.getScope(Asm->MF->getFunction()->getContext());
Devang Patel4243e672011-05-11 19:22:19 +00001287 recordSourceLine(DL.getLine(), DL.getCol(), Scope, Flags);
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001288 } else
Devang Patel4243e672011-05-11 19:22:19 +00001289 recordSourceLine(0, 0, 0, 0);
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001290 }
Devang Patelc3f5f782010-05-25 23:40:22 +00001291 }
Devang Patelaead63c2010-03-29 22:59:58 +00001292
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001293 // Insert labels where requested.
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001294 DenseMap<const MachineInstr*, MCSymbol*>::iterator I =
1295 LabelsBeforeInsn.find(MI);
1296
1297 // No label needed.
1298 if (I == LabelsBeforeInsn.end())
1299 return;
1300
1301 // Label already assigned.
1302 if (I->second)
Devang Patelb2b31a62010-05-26 19:37:24 +00001303 return;
Devang Patel553881b2010-03-29 17:20:31 +00001304
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001305 if (!PrevLabel) {
Devang Patel77051f52010-05-26 21:23:46 +00001306 PrevLabel = MMI->getContext().CreateTempSymbol();
1307 Asm->OutStreamer.EmitLabel(PrevLabel);
Devang Patelb2b31a62010-05-26 19:37:24 +00001308 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001309 I->second = PrevLabel;
Devang Patel0d20ac82009-10-06 01:50:42 +00001310}
1311
Eric Christopherb6dc8652012-11-27 22:43:45 +00001312// Process end of an instruction.
Devang Patelcbbe2872010-10-26 17:49:02 +00001313void DwarfDebug::endInstruction(const MachineInstr *MI) {
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001314 // Don't create a new label after DBG_VALUE instructions.
1315 // They don't generate code.
1316 if (!MI->isDebugValue())
1317 PrevLabel = 0;
1318
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001319 DenseMap<const MachineInstr*, MCSymbol*>::iterator I =
1320 LabelsAfterInsn.find(MI);
1321
1322 // No label needed.
1323 if (I == LabelsAfterInsn.end())
1324 return;
1325
1326 // Label already assigned.
1327 if (I->second)
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001328 return;
1329
1330 // We need a label after this instruction.
1331 if (!PrevLabel) {
1332 PrevLabel = MMI->getContext().CreateTempSymbol();
1333 Asm->OutStreamer.EmitLabel(PrevLabel);
Devang Patel1c246352010-04-08 16:50:29 +00001334 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001335 I->second = PrevLabel;
Devang Patel53bb5c92009-11-10 23:06:00 +00001336}
1337
Eric Christopherb6dc8652012-11-27 22:43:45 +00001338// Each LexicalScope has first instruction and last instruction to mark
1339// beginning and end of a scope respectively. Create an inverse map that list
1340// scopes starts (and ends) with an instruction. One instruction may start (or
1341// end) multiple scopes. Ignore scopes that are not reachable.
Devang Patele37b0c62010-04-08 18:43:56 +00001342void DwarfDebug::identifyScopeMarkers() {
Devang Patelbf47fdb2011-08-10 20:55:27 +00001343 SmallVector<LexicalScope *, 4> WorkList;
1344 WorkList.push_back(LScopes.getCurrentFunctionScope());
Devang Patel42aafd72010-01-20 02:05:23 +00001345 while (!WorkList.empty()) {
Devang Patelbf47fdb2011-08-10 20:55:27 +00001346 LexicalScope *S = WorkList.pop_back_val();
Jim Grosbach1e20b962010-07-21 21:21:52 +00001347
Devang Patelbf47fdb2011-08-10 20:55:27 +00001348 const SmallVector<LexicalScope *, 4> &Children = S->getChildren();
Jim Grosbach1e20b962010-07-21 21:21:52 +00001349 if (!Children.empty())
Devang Patelbf47fdb2011-08-10 20:55:27 +00001350 for (SmallVector<LexicalScope *, 4>::const_iterator SI = Children.begin(),
Devang Patel42aafd72010-01-20 02:05:23 +00001351 SE = Children.end(); SI != SE; ++SI)
1352 WorkList.push_back(*SI);
1353
Devang Patel53bb5c92009-11-10 23:06:00 +00001354 if (S->isAbstractScope())
1355 continue;
Jim Grosbach1e20b962010-07-21 21:21:52 +00001356
Devang Patelbf47fdb2011-08-10 20:55:27 +00001357 const SmallVector<InsnRange, 4> &Ranges = S->getRanges();
Devang Pateleac9c072010-04-27 19:46:33 +00001358 if (Ranges.empty())
1359 continue;
Devang Patelbf47fdb2011-08-10 20:55:27 +00001360 for (SmallVector<InsnRange, 4>::const_iterator RI = Ranges.begin(),
Devang Pateleac9c072010-04-27 19:46:33 +00001361 RE = Ranges.end(); RI != RE; ++RI) {
Devang Patelbf47fdb2011-08-10 20:55:27 +00001362 assert(RI->first && "InsnRange does not have first instruction!");
1363 assert(RI->second && "InsnRange does not have second instruction!");
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001364 requestLabelBeforeInsn(RI->first);
1365 requestLabelAfterInsn(RI->second);
Devang Pateleac9c072010-04-27 19:46:33 +00001366 }
Devang Patelaf9e8472009-10-01 20:31:14 +00001367 }
Devang Patelaf9e8472009-10-01 20:31:14 +00001368}
1369
Eric Christopherb6dc8652012-11-27 22:43:45 +00001370// Get MDNode for DebugLoc's scope.
Devang Patela3f48672011-05-09 22:14:49 +00001371static MDNode *getScopeNode(DebugLoc DL, const LLVMContext &Ctx) {
1372 if (MDNode *InlinedAt = DL.getInlinedAt(Ctx))
1373 return getScopeNode(DebugLoc::getFromDILocation(InlinedAt), Ctx);
1374 return DL.getScope(Ctx);
1375}
1376
Eric Christopherb6dc8652012-11-27 22:43:45 +00001377// Walk up the scope chain of given debug loc and find line number info
1378// for the function.
Devang Patel4243e672011-05-11 19:22:19 +00001379static DebugLoc getFnDebugLoc(DebugLoc DL, const LLVMContext &Ctx) {
1380 const MDNode *Scope = getScopeNode(DL, Ctx);
1381 DISubprogram SP = getDISubprogram(Scope);
Eric Christopher6126a1e2012-04-03 00:43:49 +00001382 if (SP.Verify()) {
1383 // Check for number of operands since the compatibility is
1384 // cheap here.
Eric Christopherfa5b0502012-04-03 17:55:42 +00001385 if (SP->getNumOperands() > 19)
Eric Christopher6126a1e2012-04-03 00:43:49 +00001386 return DebugLoc::get(SP.getScopeLineNumber(), 0, SP);
1387 else
1388 return DebugLoc::get(SP.getLineNumber(), 0, SP);
1389 }
1390
Devang Patel4243e672011-05-11 19:22:19 +00001391 return DebugLoc();
1392}
1393
Eric Christopherb6dc8652012-11-27 22:43:45 +00001394// Gather pre-function debug information. Assumes being called immediately
1395// after the function entry point has been emitted.
Chris Lattnereec791a2010-01-26 23:18:02 +00001396void DwarfDebug::beginFunction(const MachineFunction *MF) {
Chris Lattner994cb122010-04-05 03:52:55 +00001397 if (!MMI->hasDebugInfo()) return;
Devang Patelbf47fdb2011-08-10 20:55:27 +00001398 LScopes.initialize(*MF);
1399 if (LScopes.empty()) return;
1400 identifyScopeMarkers();
Devang Patel60b35bd2009-10-06 18:37:31 +00001401
Devang Pateleac9c072010-04-27 19:46:33 +00001402 FunctionBeginSym = Asm->GetTempSymbol("func_begin",
1403 Asm->getFunctionNumber());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001404 // Assumes in correct section after the entry point.
Devang Pateleac9c072010-04-27 19:46:33 +00001405 Asm->OutStreamer.EmitLabel(FunctionBeginSym);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001406
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001407 assert(UserVariables.empty() && DbgValues.empty() && "Maps weren't cleaned");
1408
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001409 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
Eric Christopherb6dc8652012-11-27 22:43:45 +00001410 // LiveUserVar - Map physreg numbers to the MDNode they contain.
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001411 std::vector<const MDNode*> LiveUserVar(TRI->getNumRegs());
1412
Devang Patelb2b31a62010-05-26 19:37:24 +00001413 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001414 I != E; ++I) {
1415 bool AtBlockEntry = true;
Devang Patelb2b31a62010-05-26 19:37:24 +00001416 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
1417 II != IE; ++II) {
1418 const MachineInstr *MI = II;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001419
Devang Patelb2b31a62010-05-26 19:37:24 +00001420 if (MI->isDebugValue()) {
Nick Lewycky746cb672011-10-26 22:55:33 +00001421 assert(MI->getNumOperands() > 1 && "Invalid machine instruction!");
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001422
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001423 // Keep track of user variables.
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001424 const MDNode *Var =
1425 MI->getOperand(MI->getNumOperands() - 1).getMetadata();
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001426
1427 // Variable is in a register, we need to check for clobbers.
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001428 if (isDbgValueInDefinedReg(MI))
1429 LiveUserVar[MI->getOperand(0).getReg()] = Var;
1430
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001431 // Check the history of this variable.
1432 SmallVectorImpl<const MachineInstr*> &History = DbgValues[Var];
1433 if (History.empty()) {
1434 UserVariables.push_back(Var);
1435 // The first mention of a function argument gets the FunctionBeginSym
1436 // label, so arguments are visible when breaking at function entry.
1437 DIVariable DV(Var);
1438 if (DV.Verify() && DV.getTag() == dwarf::DW_TAG_arg_variable &&
1439 DISubprogram(getDISubprogram(DV.getContext()))
1440 .describes(MF->getFunction()))
1441 LabelsBeforeInsn[MI] = FunctionBeginSym;
1442 } else {
1443 // We have seen this variable before. Try to coalesce DBG_VALUEs.
1444 const MachineInstr *Prev = History.back();
1445 if (Prev->isDebugValue()) {
1446 // Coalesce identical entries at the end of History.
1447 if (History.size() >= 2 &&
Devang Patel79862892011-07-07 00:14:27 +00001448 Prev->isIdenticalTo(History[History.size() - 2])) {
Eric Christopher02c1a642012-10-08 20:48:49 +00001449 DEBUG(dbgs() << "Coalescing identical DBG_VALUE entries:\n"
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001450 << "\t" << *Prev
Devang Patel79862892011-07-07 00:14:27 +00001451 << "\t" << *History[History.size() - 2] << "\n");
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001452 History.pop_back();
Devang Patel79862892011-07-07 00:14:27 +00001453 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001454
1455 // Terminate old register assignments that don't reach MI;
1456 MachineFunction::const_iterator PrevMBB = Prev->getParent();
1457 if (PrevMBB != I && (!AtBlockEntry || llvm::next(PrevMBB) != I) &&
1458 isDbgValueInDefinedReg(Prev)) {
1459 // Previous register assignment needs to terminate at the end of
1460 // its basic block.
1461 MachineBasicBlock::const_iterator LastMI =
1462 PrevMBB->getLastNonDebugInstr();
Devang Patel79862892011-07-07 00:14:27 +00001463 if (LastMI == PrevMBB->end()) {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001464 // Drop DBG_VALUE for empty range.
Eric Christopher02c1a642012-10-08 20:48:49 +00001465 DEBUG(dbgs() << "Dropping DBG_VALUE for empty range:\n"
Devang Patel79862892011-07-07 00:14:27 +00001466 << "\t" << *Prev << "\n");
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001467 History.pop_back();
Devang Patel79862892011-07-07 00:14:27 +00001468 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001469 else {
1470 // Terminate after LastMI.
1471 History.push_back(LastMI);
1472 }
1473 }
1474 }
1475 }
1476 History.push_back(MI);
Devang Patelb2b31a62010-05-26 19:37:24 +00001477 } else {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001478 // Not a DBG_VALUE instruction.
1479 if (!MI->isLabel())
1480 AtBlockEntry = false;
1481
Eric Christopher0313ced2012-10-04 20:46:14 +00001482 // First known non-DBG_VALUE and non-frame setup location marks
1483 // the beginning of the function body.
1484 if (!MI->getFlag(MachineInstr::FrameSetup) &&
1485 (PrologEndLoc.isUnknown() && !MI->getDebugLoc().isUnknown()))
Devang Patel4243e672011-05-11 19:22:19 +00001486 PrologEndLoc = MI->getDebugLoc();
1487
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001488 // Check if the instruction clobbers any registers with debug vars.
1489 for (MachineInstr::const_mop_iterator MOI = MI->operands_begin(),
1490 MOE = MI->operands_end(); MOI != MOE; ++MOI) {
1491 if (!MOI->isReg() || !MOI->isDef() || !MOI->getReg())
1492 continue;
Jakob Stoklund Olesen396618b2012-06-01 23:28:30 +00001493 for (MCRegAliasIterator AI(MOI->getReg(), TRI, true);
1494 AI.isValid(); ++AI) {
1495 unsigned Reg = *AI;
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001496 const MDNode *Var = LiveUserVar[Reg];
1497 if (!Var)
1498 continue;
1499 // Reg is now clobbered.
1500 LiveUserVar[Reg] = 0;
1501
1502 // Was MD last defined by a DBG_VALUE referring to Reg?
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001503 DbgValueHistoryMap::iterator HistI = DbgValues.find(Var);
1504 if (HistI == DbgValues.end())
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001505 continue;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001506 SmallVectorImpl<const MachineInstr*> &History = HistI->second;
1507 if (History.empty())
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001508 continue;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001509 const MachineInstr *Prev = History.back();
1510 // Sanity-check: Register assignments are terminated at the end of
1511 // their block.
1512 if (!Prev->isDebugValue() || Prev->getParent() != MI->getParent())
1513 continue;
1514 // Is the variable still in Reg?
1515 if (!isDbgValueInDefinedReg(Prev) ||
1516 Prev->getOperand(0).getReg() != Reg)
1517 continue;
1518 // Var is clobbered. Make sure the next instruction gets a label.
1519 History.push_back(MI);
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001520 }
1521 }
Devang Patelb2b31a62010-05-26 19:37:24 +00001522 }
Devang Patelb2b31a62010-05-26 19:37:24 +00001523 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001524 }
1525
1526 for (DbgValueHistoryMap::iterator I = DbgValues.begin(), E = DbgValues.end();
1527 I != E; ++I) {
1528 SmallVectorImpl<const MachineInstr*> &History = I->second;
1529 if (History.empty())
1530 continue;
1531
1532 // Make sure the final register assignments are terminated.
1533 const MachineInstr *Prev = History.back();
1534 if (Prev->isDebugValue() && isDbgValueInDefinedReg(Prev)) {
1535 const MachineBasicBlock *PrevMBB = Prev->getParent();
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001536 MachineBasicBlock::const_iterator LastMI =
Devang Patel5bc942c2011-08-10 23:58:09 +00001537 PrevMBB->getLastNonDebugInstr();
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001538 if (LastMI == PrevMBB->end())
1539 // Drop DBG_VALUE for empty range.
1540 History.pop_back();
1541 else {
1542 // Terminate after LastMI.
1543 History.push_back(LastMI);
1544 }
1545 }
1546 // Request labels for the full history.
1547 for (unsigned i = 0, e = History.size(); i != e; ++i) {
1548 const MachineInstr *MI = History[i];
1549 if (MI->isDebugValue())
1550 requestLabelBeforeInsn(MI);
1551 else
1552 requestLabelAfterInsn(MI);
1553 }
1554 }
Devang Patelb2b31a62010-05-26 19:37:24 +00001555
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001556 PrevInstLoc = DebugLoc();
Devang Patelb2b31a62010-05-26 19:37:24 +00001557 PrevLabel = FunctionBeginSym;
Devang Patel4243e672011-05-11 19:22:19 +00001558
1559 // Record beginning of function.
1560 if (!PrologEndLoc.isUnknown()) {
1561 DebugLoc FnStartDL = getFnDebugLoc(PrologEndLoc,
1562 MF->getFunction()->getContext());
1563 recordSourceLine(FnStartDL.getLine(), FnStartDL.getCol(),
1564 FnStartDL.getScope(MF->getFunction()->getContext()),
David Blaikie836cfc42012-12-04 22:02:33 +00001565 // We'd like to list the prologue as "not statements" but GDB behaves
1566 // poorly if we do that. Revisit this with caution/GDB (7.5+) testing.
David Blaikieb36c5312012-12-04 21:05:36 +00001567 DWARF2_FLAG_IS_STMT);
Devang Patel4243e672011-05-11 19:22:19 +00001568 }
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001569}
1570
Devang Patelbf47fdb2011-08-10 20:55:27 +00001571void DwarfDebug::addScopeVariable(LexicalScope *LS, DbgVariable *Var) {
1572// SmallVector<DbgVariable *, 8> &Vars = ScopeVariables.lookup(LS);
1573 ScopeVariables[LS].push_back(Var);
1574// Vars.push_back(Var);
1575}
1576
Eric Christopherb6dc8652012-11-27 22:43:45 +00001577// Gather and emit post-function debug information.
Chris Lattnereec791a2010-01-26 23:18:02 +00001578void DwarfDebug::endFunction(const MachineFunction *MF) {
Devang Patelbf47fdb2011-08-10 20:55:27 +00001579 if (!MMI->hasDebugInfo() || LScopes.empty()) return;
Devang Patel70d75ca2009-11-12 19:02:56 +00001580
Devang Patelbf47fdb2011-08-10 20:55:27 +00001581 // Define end label for subprogram.
1582 FunctionEndSym = Asm->GetTempSymbol("func_end",
1583 Asm->getFunctionNumber());
1584 // Assumes in correct section after the entry point.
1585 Asm->OutStreamer.EmitLabel(FunctionEndSym);
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001586
Devang Patelbf47fdb2011-08-10 20:55:27 +00001587 SmallPtrSet<const MDNode *, 16> ProcessedVars;
1588 collectVariableInfo(MF, ProcessedVars);
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001589
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001590 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
Devang Patel94c7ddb2011-08-16 22:09:43 +00001591 CompileUnit *TheCU = SPMap.lookup(FnScope->getScopeNode());
Nick Lewycky746cb672011-10-26 22:55:33 +00001592 assert(TheCU && "Unable to find compile unit!");
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001593
Devang Patelbf47fdb2011-08-10 20:55:27 +00001594 // Construct abstract scopes.
Devang Patelcd9f6c52011-08-12 18:10:19 +00001595 ArrayRef<LexicalScope *> AList = LScopes.getAbstractScopesList();
1596 for (unsigned i = 0, e = AList.size(); i != e; ++i) {
1597 LexicalScope *AScope = AList[i];
1598 DISubprogram SP(AScope->getScopeNode());
Devang Patelbf47fdb2011-08-10 20:55:27 +00001599 if (SP.Verify()) {
1600 // Collect info for variables that were optimized out.
Devang Patel93d39be2011-08-19 23:28:12 +00001601 DIArray Variables = SP.getVariables();
1602 for (unsigned i = 0, e = Variables.getNumElements(); i != e; ++i) {
1603 DIVariable DV(Variables.getElement(i));
1604 if (!DV || !DV.Verify() || !ProcessedVars.insert(DV))
1605 continue;
Alexey Samsonovb67bd332012-07-06 08:45:08 +00001606 // Check that DbgVariable for DV wasn't created earlier, when
1607 // findAbstractVariable() was called for inlined instance of DV.
1608 LLVMContext &Ctx = DV->getContext();
1609 DIVariable CleanDV = cleanseInlinedVariable(DV, Ctx);
1610 if (AbstractVariables.lookup(CleanDV))
1611 continue;
Devang Patel93d39be2011-08-19 23:28:12 +00001612 if (LexicalScope *Scope = LScopes.findAbstractScope(DV.getContext()))
1613 addScopeVariable(Scope, new DbgVariable(DV, NULL));
Devang Patel78e127d2010-06-25 22:07:34 +00001614 }
1615 }
Devang Patelcd9f6c52011-08-12 18:10:19 +00001616 if (ProcessedSPNodes.count(AScope->getScopeNode()) == 0)
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001617 constructScopeDIE(TheCU, AScope);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001618 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001619
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001620 DIE *CurFnDIE = constructScopeDIE(TheCU, FnScope);
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001621
Nick Lewycky8a8d4792011-12-02 22:16:29 +00001622 if (!MF->getTarget().Options.DisableFramePointerElim(*MF))
Eric Christopher873cf0a2012-08-24 01:14:27 +00001623 TheCU->addFlag(CurFnDIE, dwarf::DW_AT_APPLE_omit_frame_ptr);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001624
Devang Patelbf47fdb2011-08-10 20:55:27 +00001625 DebugFrames.push_back(FunctionDebugFrameInfo(Asm->getFunctionNumber(),
1626 MMI->getFrameMoves()));
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001627
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001628 // Clear debug info
Devang Patelbf47fdb2011-08-10 20:55:27 +00001629 for (DenseMap<LexicalScope *, SmallVector<DbgVariable *, 8> >::iterator
1630 I = ScopeVariables.begin(), E = ScopeVariables.end(); I != E; ++I)
1631 DeleteContainerPointers(I->second);
1632 ScopeVariables.clear();
Devang Pateleac0c9d2011-04-22 18:09:57 +00001633 DeleteContainerPointers(CurrentFnArguments);
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001634 UserVariables.clear();
1635 DbgValues.clear();
Jeffrey Yasskin5c213dc2010-03-12 17:45:06 +00001636 AbstractVariables.clear();
Devang Pateleac9c072010-04-27 19:46:33 +00001637 LabelsBeforeInsn.clear();
1638 LabelsAfterInsn.clear();
Devang Patelf2548ca2010-04-16 23:33:45 +00001639 PrevLabel = NULL;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001640}
1641
Eric Christopherb6dc8652012-11-27 22:43:45 +00001642// Register a source line with debug info. Returns the unique label that was
1643// emitted and which provides correspondence to the source line list.
Devang Patel4243e672011-05-11 19:22:19 +00001644void DwarfDebug::recordSourceLine(unsigned Line, unsigned Col, const MDNode *S,
1645 unsigned Flags) {
Devang Patel65dbc902009-11-25 17:36:49 +00001646 StringRef Fn;
Devang Patel23670e52011-03-24 20:30:50 +00001647 StringRef Dir;
Dan Gohman1cc0d622010-05-05 23:41:32 +00001648 unsigned Src = 1;
1649 if (S) {
1650 DIDescriptor Scope(S);
Devang Patelf84548d2009-10-05 18:03:19 +00001651
Dan Gohman1cc0d622010-05-05 23:41:32 +00001652 if (Scope.isCompileUnit()) {
1653 DICompileUnit CU(S);
Dan Gohman1cc0d622010-05-05 23:41:32 +00001654 Fn = CU.getFilename();
Devang Patel23670e52011-03-24 20:30:50 +00001655 Dir = CU.getDirectory();
Devang Patel3cabc9d2010-10-28 17:30:52 +00001656 } else if (Scope.isFile()) {
1657 DIFile F(S);
Devang Patel3cabc9d2010-10-28 17:30:52 +00001658 Fn = F.getFilename();
Devang Patel23670e52011-03-24 20:30:50 +00001659 Dir = F.getDirectory();
Dan Gohman1cc0d622010-05-05 23:41:32 +00001660 } else if (Scope.isSubprogram()) {
1661 DISubprogram SP(S);
Dan Gohman1cc0d622010-05-05 23:41:32 +00001662 Fn = SP.getFilename();
Devang Patel23670e52011-03-24 20:30:50 +00001663 Dir = SP.getDirectory();
Eric Christopher6618a242011-10-11 22:59:11 +00001664 } else if (Scope.isLexicalBlockFile()) {
1665 DILexicalBlockFile DBF(S);
1666 Fn = DBF.getFilename();
1667 Dir = DBF.getDirectory();
Dan Gohman1cc0d622010-05-05 23:41:32 +00001668 } else if (Scope.isLexicalBlock()) {
1669 DILexicalBlock DB(S);
Dan Gohman1cc0d622010-05-05 23:41:32 +00001670 Fn = DB.getFilename();
Devang Patel23670e52011-03-24 20:30:50 +00001671 Dir = DB.getDirectory();
Dan Gohman1cc0d622010-05-05 23:41:32 +00001672 } else
Craig Topper5e25ee82012-02-05 08:31:47 +00001673 llvm_unreachable("Unexpected scope info");
Dan Gohman1cc0d622010-05-05 23:41:32 +00001674
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001675 Src = getOrCreateSourceID(Fn, Dir);
Dan Gohman1cc0d622010-05-05 23:41:32 +00001676 }
Nick Lewycky3bbb6f72011-07-29 03:49:23 +00001677 Asm->OutStreamer.EmitDwarfLocDirective(Src, Line, Col, Flags, 0, 0, Fn);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001678}
1679
Bill Wendling829e67b2009-05-20 23:22:40 +00001680//===----------------------------------------------------------------------===//
1681// Emit Methods
1682//===----------------------------------------------------------------------===//
1683
Eric Christopherb6dc8652012-11-27 22:43:45 +00001684// Compute the size and offset of a DIE.
Jim Grosbach7ab38df2009-11-22 19:20:36 +00001685unsigned
Eric Christopher0e3e9b72012-12-10 23:34:43 +00001686DwarfUnits::computeSizeAndOffset(DIE *Die, unsigned Offset) {
Bill Wendling94d04b82009-05-20 23:21:38 +00001687 // Get the children.
1688 const std::vector<DIE *> &Children = Die->getChildren();
1689
Bill Wendling94d04b82009-05-20 23:21:38 +00001690 // Record the abbreviation.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001691 assignAbbrevNumber(Die->getAbbrev());
Bill Wendling94d04b82009-05-20 23:21:38 +00001692
1693 // Get the abbreviation for this DIE.
1694 unsigned AbbrevNumber = Die->getAbbrevNumber();
Eric Christopher0e3e9b72012-12-10 23:34:43 +00001695 const DIEAbbrev *Abbrev = Abbreviations->at(AbbrevNumber - 1);
Bill Wendling94d04b82009-05-20 23:21:38 +00001696
1697 // Set DIE offset
1698 Die->setOffset(Offset);
1699
1700 // Start the size with the size of abbreviation code.
Chris Lattneraf76e592009-08-22 20:48:53 +00001701 Offset += MCAsmInfo::getULEB128Size(AbbrevNumber);
Bill Wendling94d04b82009-05-20 23:21:38 +00001702
1703 const SmallVector<DIEValue*, 32> &Values = Die->getValues();
1704 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
1705
1706 // Size the DIE attribute values.
1707 for (unsigned i = 0, N = Values.size(); i < N; ++i)
1708 // Size attribute value.
Chris Lattnera37d5382010-04-05 00:18:22 +00001709 Offset += Values[i]->SizeOf(Asm, AbbrevData[i].getForm());
Bill Wendling94d04b82009-05-20 23:21:38 +00001710
1711 // Size the DIE children if any.
1712 if (!Children.empty()) {
1713 assert(Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes &&
1714 "Children flag not set");
1715
1716 for (unsigned j = 0, M = Children.size(); j < M; ++j)
Eric Christopherfbd19752012-11-20 22:14:13 +00001717 Offset = computeSizeAndOffset(Children[j], Offset);
Bill Wendling94d04b82009-05-20 23:21:38 +00001718
1719 // End of children marker.
1720 Offset += sizeof(int8_t);
1721 }
1722
1723 Die->setSize(Offset - Die->getOffset());
1724 return Offset;
1725}
1726
Eric Christopherb6dc8652012-11-27 22:43:45 +00001727// Compute the size and offset of all the DIEs.
Eric Christopher0e3e9b72012-12-10 23:34:43 +00001728void DwarfUnits::computeSizeAndOffsets() {
1729 for (SmallVector<CompileUnit *, 1>::iterator I = CUs.begin(),
1730 E = CUs.end(); I != E; ++I) {
Eric Christopher98e237f2012-11-30 23:59:06 +00001731 unsigned Offset =
1732 sizeof(int32_t) + // Length of Compilation Unit Info
1733 sizeof(int16_t) + // DWARF version number
1734 sizeof(int32_t) + // Offset Into Abbrev. Section
1735 sizeof(int8_t); // Pointer Size (in bytes)
1736
Eric Christopher0e3e9b72012-12-10 23:34:43 +00001737 computeSizeAndOffset((*I)->getCUDie(), Offset);
Devang Patel163a9f72010-05-10 22:49:55 +00001738 }
Bill Wendling94d04b82009-05-20 23:21:38 +00001739}
1740
Eric Christopherb6dc8652012-11-27 22:43:45 +00001741// Emit initial Dwarf sections with a label at the start of each one.
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001742void DwarfDebug::emitSectionLabels() {
Chris Lattner6c2f9e12009-08-19 05:49:37 +00001743 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
Daniel Dunbarf612ff62009-09-19 20:40:05 +00001744
Bill Wendling94d04b82009-05-20 23:21:38 +00001745 // Dwarf sections base addresses.
Jim Grosbach1e20b962010-07-21 21:21:52 +00001746 DwarfInfoSectionSym =
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001747 emitSectionSym(Asm, TLOF.getDwarfInfoSection(), "section_info");
Jim Grosbach1e20b962010-07-21 21:21:52 +00001748 DwarfAbbrevSectionSym =
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001749 emitSectionSym(Asm, TLOF.getDwarfAbbrevSection(), "section_abbrev");
Eric Christopher6eebe472012-12-19 22:02:53 +00001750 if (useSplitDwarf())
1751 DwarfAbbrevDWOSectionSym =
1752 emitSectionSym(Asm, TLOF.getDwarfAbbrevDWOSection(),
1753 "section_abbrev_dwo");
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001754 emitSectionSym(Asm, TLOF.getDwarfARangesSection());
Jim Grosbach1e20b962010-07-21 21:21:52 +00001755
Chris Lattner9c69e285532010-04-04 22:59:04 +00001756 if (const MCSection *MacroInfo = TLOF.getDwarfMacroInfoSection())
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001757 emitSectionSym(Asm, MacroInfo);
Bill Wendling94d04b82009-05-20 23:21:38 +00001758
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001759 emitSectionSym(Asm, TLOF.getDwarfLineSection(), "section_line");
1760 emitSectionSym(Asm, TLOF.getDwarfLocSection());
1761 emitSectionSym(Asm, TLOF.getDwarfPubTypesSection());
Jim Grosbach1e20b962010-07-21 21:21:52 +00001762 DwarfStrSectionSym =
Eric Christopher64f824c2012-12-27 02:14:01 +00001763 emitSectionSym(Asm, TLOF.getDwarfStrSection(), "info_string");
1764 if (useSplitDwarf())
1765 DwarfStrDWOSectionSym =
1766 emitSectionSym(Asm, TLOF.getDwarfStrDWOSection(), "skel_string");
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001767 DwarfDebugRangeSectionSym = emitSectionSym(Asm, TLOF.getDwarfRangesSection(),
Devang Patelf2548ca2010-04-16 23:33:45 +00001768 "debug_range");
Bill Wendling94d04b82009-05-20 23:21:38 +00001769
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001770 DwarfDebugLocSectionSym = emitSectionSym(Asm, TLOF.getDwarfLocSection(),
Devang Patelc3f5f782010-05-25 23:40:22 +00001771 "section_debug_loc");
1772
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001773 TextSectionSym = emitSectionSym(Asm, TLOF.getTextSection(), "text_begin");
1774 emitSectionSym(Asm, TLOF.getDataSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00001775}
1776
Eric Christopherb6dc8652012-11-27 22:43:45 +00001777// Recursively emits a debug information entry.
Eric Christopher6eebe472012-12-19 22:02:53 +00001778void DwarfDebug::emitDIE(DIE *Die, std::vector<DIEAbbrev *> *Abbrevs) {
Bill Wendling94d04b82009-05-20 23:21:38 +00001779 // Get the abbreviation for this DIE.
1780 unsigned AbbrevNumber = Die->getAbbrevNumber();
Eric Christopher6eebe472012-12-19 22:02:53 +00001781 const DIEAbbrev *Abbrev = Abbrevs->at(AbbrevNumber - 1);
Bill Wendling94d04b82009-05-20 23:21:38 +00001782
Bill Wendling94d04b82009-05-20 23:21:38 +00001783 // Emit the code (index) for the abbreviation.
Chris Lattner3f53c832010-04-04 18:52:31 +00001784 if (Asm->isVerbose())
Chris Lattner894d75a2010-01-22 23:18:42 +00001785 Asm->OutStreamer.AddComment("Abbrev [" + Twine(AbbrevNumber) + "] 0x" +
1786 Twine::utohexstr(Die->getOffset()) + ":0x" +
1787 Twine::utohexstr(Die->getSize()) + " " +
1788 dwarf::TagString(Abbrev->getTag()));
Chris Lattner7e1a8f82010-04-04 19:09:29 +00001789 Asm->EmitULEB128(AbbrevNumber);
Bill Wendling94d04b82009-05-20 23:21:38 +00001790
Jeffrey Yasskin638fe8d2010-03-22 18:47:14 +00001791 const SmallVector<DIEValue*, 32> &Values = Die->getValues();
Bill Wendling94d04b82009-05-20 23:21:38 +00001792 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
1793
1794 // Emit the DIE attribute values.
1795 for (unsigned i = 0, N = Values.size(); i < N; ++i) {
1796 unsigned Attr = AbbrevData[i].getAttribute();
1797 unsigned Form = AbbrevData[i].getForm();
1798 assert(Form && "Too many attributes for DIE (check abbreviation)");
1799
Chris Lattner3f53c832010-04-04 18:52:31 +00001800 if (Asm->isVerbose())
Chris Lattnera8013622010-01-24 18:54:17 +00001801 Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr));
Jim Grosbach1e20b962010-07-21 21:21:52 +00001802
Bill Wendling94d04b82009-05-20 23:21:38 +00001803 switch (Attr) {
Bill Wendling94d04b82009-05-20 23:21:38 +00001804 case dwarf::DW_AT_abstract_origin: {
1805 DIEEntry *E = cast<DIEEntry>(Values[i]);
1806 DIE *Origin = E->getEntry();
Devang Patel53bb5c92009-11-10 23:06:00 +00001807 unsigned Addr = Origin->getOffset();
Bill Wendling94d04b82009-05-20 23:21:38 +00001808 Asm->EmitInt32(Addr);
1809 break;
1810 }
Devang Patelf2548ca2010-04-16 23:33:45 +00001811 case dwarf::DW_AT_ranges: {
1812 // DW_AT_range Value encodes offset in debug_range section.
1813 DIEInteger *V = cast<DIEInteger>(Values[i]);
Devang Patelb1fcfbe2010-09-02 16:43:44 +00001814
Nick Lewyckyffccd922012-06-22 01:25:12 +00001815 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections()) {
Devang Patelb1fcfbe2010-09-02 16:43:44 +00001816 Asm->EmitLabelPlusOffset(DwarfDebugRangeSectionSym,
1817 V->getValue(),
1818 4);
1819 } else {
1820 Asm->EmitLabelOffsetDifference(DwarfDebugRangeSectionSym,
1821 V->getValue(),
1822 DwarfDebugRangeSectionSym,
1823 4);
1824 }
Devang Patelf2548ca2010-04-16 23:33:45 +00001825 break;
1826 }
Devang Patelc3f5f782010-05-25 23:40:22 +00001827 case dwarf::DW_AT_location: {
Nick Lewyckyffccd922012-06-22 01:25:12 +00001828 if (DIELabel *L = dyn_cast<DIELabel>(Values[i])) {
1829 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
1830 Asm->EmitLabelReference(L->getValue(), 4);
1831 else
1832 Asm->EmitLabelDifference(L->getValue(), DwarfDebugLocSectionSym, 4);
1833 } else {
Devang Patelc3f5f782010-05-25 23:40:22 +00001834 Values[i]->EmitValue(Asm, Form);
Nick Lewyckyffccd922012-06-22 01:25:12 +00001835 }
Devang Patelc3f5f782010-05-25 23:40:22 +00001836 break;
1837 }
Devang Patel2a361602010-09-29 19:08:08 +00001838 case dwarf::DW_AT_accessibility: {
1839 if (Asm->isVerbose()) {
1840 DIEInteger *V = cast<DIEInteger>(Values[i]);
1841 Asm->OutStreamer.AddComment(dwarf::AccessibilityString(V->getValue()));
1842 }
1843 Values[i]->EmitValue(Asm, Form);
1844 break;
1845 }
Bill Wendling94d04b82009-05-20 23:21:38 +00001846 default:
1847 // Emit an attribute using the defined form.
Chris Lattnerd38fee82010-04-05 00:13:49 +00001848 Values[i]->EmitValue(Asm, Form);
Bill Wendling94d04b82009-05-20 23:21:38 +00001849 break;
1850 }
Bill Wendling94d04b82009-05-20 23:21:38 +00001851 }
1852
1853 // Emit the DIE children if any.
1854 if (Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes) {
1855 const std::vector<DIE *> &Children = Die->getChildren();
1856
1857 for (unsigned j = 0, M = Children.size(); j < M; ++j)
Eric Christopher6eebe472012-12-19 22:02:53 +00001858 emitDIE(Children[j], Abbrevs);
Bill Wendling94d04b82009-05-20 23:21:38 +00001859
Chris Lattner3f53c832010-04-04 18:52:31 +00001860 if (Asm->isVerbose())
Chris Lattner233f52b2010-03-09 23:52:58 +00001861 Asm->OutStreamer.AddComment("End Of Children Mark");
1862 Asm->EmitInt8(0);
Bill Wendling94d04b82009-05-20 23:21:38 +00001863 }
1864}
1865
Eric Christopherb1e66d02012-12-15 00:04:07 +00001866// Emit the various dwarf units to the unit section USection with
1867// the abbreviations going into ASection.
1868void DwarfUnits::emitUnits(DwarfDebug *DD,
1869 const MCSection *USection,
1870 const MCSection *ASection,
1871 const MCSymbol *ASectionSym) {
1872 Asm->OutStreamer.SwitchSection(USection);
1873 for (SmallVector<CompileUnit *, 1>::iterator I = CUs.begin(),
1874 E = CUs.end(); I != E; ++I) {
1875 CompileUnit *TheCU = *I;
Devang Patel163a9f72010-05-10 22:49:55 +00001876 DIE *Die = TheCU->getCUDie();
Jim Grosbach1e20b962010-07-21 21:21:52 +00001877
Devang Patel163a9f72010-05-10 22:49:55 +00001878 // Emit the compile units header.
Eric Christopherb1e66d02012-12-15 00:04:07 +00001879 Asm->OutStreamer
1880 .EmitLabel(Asm->GetTempSymbol(USection->getLabelBeginName(),
1881 TheCU->getUniqueID()));
Jim Grosbach1e20b962010-07-21 21:21:52 +00001882
Devang Patel163a9f72010-05-10 22:49:55 +00001883 // Emit size of content not including length itself
1884 unsigned ContentSize = Die->getSize() +
1885 sizeof(int16_t) + // DWARF version number
1886 sizeof(int32_t) + // Offset Into Abbrev. Section
Devang Patel65705d52011-04-13 19:41:17 +00001887 sizeof(int8_t); // Pointer Size (in bytes)
Jim Grosbach1e20b962010-07-21 21:21:52 +00001888
Devang Patel163a9f72010-05-10 22:49:55 +00001889 Asm->OutStreamer.AddComment("Length of Compilation Unit Info");
1890 Asm->EmitInt32(ContentSize);
1891 Asm->OutStreamer.AddComment("DWARF version number");
1892 Asm->EmitInt16(dwarf::DWARF_VERSION);
1893 Asm->OutStreamer.AddComment("Offset Into Abbrev. Section");
Eric Christopherb1e66d02012-12-15 00:04:07 +00001894 Asm->EmitSectionOffset(Asm->GetTempSymbol(ASection->getLabelBeginName()),
1895 ASectionSym);
Devang Patel163a9f72010-05-10 22:49:55 +00001896 Asm->OutStreamer.AddComment("Address Size (in bytes)");
Chandler Carruth426c2bf2012-11-01 09:14:31 +00001897 Asm->EmitInt8(Asm->getDataLayout().getPointerSize());
Jim Grosbach1e20b962010-07-21 21:21:52 +00001898
Eric Christopher6eebe472012-12-19 22:02:53 +00001899 DD->emitDIE(Die, Abbreviations);
Eric Christopherb1e66d02012-12-15 00:04:07 +00001900 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol(USection->getLabelEndName(),
Eli Benderskyd4a05e02012-12-03 18:45:45 +00001901 TheCU->getUniqueID()));
Devang Patel163a9f72010-05-10 22:49:55 +00001902 }
Bill Wendling94d04b82009-05-20 23:21:38 +00001903}
1904
Eric Christopher98e237f2012-11-30 23:59:06 +00001905// Emit the debug info section.
1906void DwarfDebug::emitDebugInfo() {
Eric Christopherb1e66d02012-12-15 00:04:07 +00001907 DwarfUnits &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
1908
1909 Holder.emitUnits(this, Asm->getObjFileLowering().getDwarfInfoSection(),
1910 Asm->getObjFileLowering().getDwarfAbbrevSection(),
1911 DwarfAbbrevSectionSym);
Eric Christopher98e237f2012-11-30 23:59:06 +00001912}
1913
Eric Christopherb6dc8652012-11-27 22:43:45 +00001914// Emit the abbreviation section.
Eric Christopher7dc68db2012-11-20 23:30:11 +00001915void DwarfDebug::emitAbbreviations() {
Eric Christopher6eebe472012-12-19 22:02:53 +00001916 if (!useSplitDwarf())
1917 emitAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevSection(),
1918 &Abbreviations);
1919 else
1920 emitSkeletonAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevSection());
1921}
Bill Wendling94d04b82009-05-20 23:21:38 +00001922
Eric Christopher6eebe472012-12-19 22:02:53 +00001923void DwarfDebug::emitAbbrevs(const MCSection *Section,
1924 std::vector<DIEAbbrev *> *Abbrevs) {
1925 // Check to see if it is worth the effort.
1926 if (!Abbrevs->empty()) {
1927 // Start the debug abbrev section.
1928 Asm->OutStreamer.SwitchSection(Section);
1929
1930 MCSymbol *Begin = Asm->GetTempSymbol(Section->getLabelBeginName());
Eric Christopher44fedba2012-12-13 03:00:38 +00001931 Asm->OutStreamer.EmitLabel(Begin);
Bill Wendling94d04b82009-05-20 23:21:38 +00001932
1933 // For each abbrevation.
Eric Christopher6eebe472012-12-19 22:02:53 +00001934 for (unsigned i = 0, N = Abbrevs->size(); i < N; ++i) {
Bill Wendling94d04b82009-05-20 23:21:38 +00001935 // Get abbreviation data
Eric Christopher6eebe472012-12-19 22:02:53 +00001936 const DIEAbbrev *Abbrev = Abbrevs->at(i);
Bill Wendling94d04b82009-05-20 23:21:38 +00001937
1938 // Emit the abbrevations code (base 1 index.)
Chris Lattner7e1a8f82010-04-04 19:09:29 +00001939 Asm->EmitULEB128(Abbrev->getNumber(), "Abbreviation Code");
Bill Wendling94d04b82009-05-20 23:21:38 +00001940
1941 // Emit the abbreviations data.
Chris Lattnerd38fee82010-04-05 00:13:49 +00001942 Abbrev->Emit(Asm);
Bill Wendling94d04b82009-05-20 23:21:38 +00001943 }
1944
1945 // Mark end of abbreviations.
Chris Lattner7e1a8f82010-04-04 19:09:29 +00001946 Asm->EmitULEB128(0, "EOM(3)");
Bill Wendling94d04b82009-05-20 23:21:38 +00001947
Eric Christopher6eebe472012-12-19 22:02:53 +00001948 MCSymbol *End = Asm->GetTempSymbol(Section->getLabelEndName());
Eric Christopher44fedba2012-12-13 03:00:38 +00001949 Asm->OutStreamer.EmitLabel(End);
Bill Wendling94d04b82009-05-20 23:21:38 +00001950 }
1951}
1952
Eric Christopherb6dc8652012-11-27 22:43:45 +00001953// Emit the last address of the section and the end of the line matrix.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001954void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) {
Bill Wendling94d04b82009-05-20 23:21:38 +00001955 // Define last address of section.
Chris Lattner233f52b2010-03-09 23:52:58 +00001956 Asm->OutStreamer.AddComment("Extended Op");
1957 Asm->EmitInt8(0);
Jim Grosbach1e20b962010-07-21 21:21:52 +00001958
Chris Lattner233f52b2010-03-09 23:52:58 +00001959 Asm->OutStreamer.AddComment("Op size");
Chandler Carruth426c2bf2012-11-01 09:14:31 +00001960 Asm->EmitInt8(Asm->getDataLayout().getPointerSize() + 1);
Chris Lattner233f52b2010-03-09 23:52:58 +00001961 Asm->OutStreamer.AddComment("DW_LNE_set_address");
1962 Asm->EmitInt8(dwarf::DW_LNE_set_address);
1963
1964 Asm->OutStreamer.AddComment("Section end label");
Chris Lattnerd85fc6e2010-03-10 01:17:49 +00001965
Chris Lattnerc0215722010-04-04 19:25:43 +00001966 Asm->OutStreamer.EmitSymbolValue(Asm->GetTempSymbol("section_end",SectionEnd),
Eric Christopherca1dd052013-01-09 01:35:34 +00001967 Asm->getDataLayout().getPointerSize());
Bill Wendling94d04b82009-05-20 23:21:38 +00001968
1969 // Mark end of matrix.
Chris Lattner233f52b2010-03-09 23:52:58 +00001970 Asm->OutStreamer.AddComment("DW_LNE_end_sequence");
1971 Asm->EmitInt8(0);
Chris Lattner0ad9c912010-01-22 22:09:00 +00001972 Asm->EmitInt8(1);
Chris Lattner894d75a2010-01-22 23:18:42 +00001973 Asm->EmitInt8(1);
Bill Wendling94d04b82009-05-20 23:21:38 +00001974}
1975
Eric Christopherb6dc8652012-11-27 22:43:45 +00001976// Emit visible names into a hashed accelerator table section.
Eric Christopher09ac3d82011-11-07 09:24:32 +00001977void DwarfDebug::emitAccelNames() {
1978 DwarfAccelTable AT(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset,
1979 dwarf::DW_FORM_data4));
1980 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
1981 E = CUMap.end(); I != E; ++I) {
1982 CompileUnit *TheCU = I->second;
Eric Christopher0ffe2b42011-11-10 19:25:34 +00001983 const StringMap<std::vector<DIE*> > &Names = TheCU->getAccelNames();
1984 for (StringMap<std::vector<DIE*> >::const_iterator
Eric Christopher09ac3d82011-11-07 09:24:32 +00001985 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
1986 const char *Name = GI->getKeyData();
Eric Christopherfa03db02012-01-06 23:03:34 +00001987 const std::vector<DIE *> &Entities = GI->second;
Eric Christopher0ffe2b42011-11-10 19:25:34 +00001988 for (std::vector<DIE *>::const_iterator DI = Entities.begin(),
1989 DE = Entities.end(); DI != DE; ++DI)
1990 AT.AddName(Name, (*DI));
Eric Christopher09ac3d82011-11-07 09:24:32 +00001991 }
1992 }
1993
1994 AT.FinalizeTable(Asm, "Names");
1995 Asm->OutStreamer.SwitchSection(
1996 Asm->getObjFileLowering().getDwarfAccelNamesSection());
1997 MCSymbol *SectionBegin = Asm->GetTempSymbol("names_begin");
1998 Asm->OutStreamer.EmitLabel(SectionBegin);
1999
2000 // Emit the full data.
Eric Christopher2e5d8702012-12-20 21:58:36 +00002001 AT.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher09ac3d82011-11-07 09:24:32 +00002002}
2003
Eric Christopher72c16552012-12-20 21:58:40 +00002004// Emit objective C classes and categories into a hashed accelerator table
2005// section.
Eric Christopher09ac3d82011-11-07 09:24:32 +00002006void DwarfDebug::emitAccelObjC() {
2007 DwarfAccelTable AT(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset,
2008 dwarf::DW_FORM_data4));
2009 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2010 E = CUMap.end(); I != E; ++I) {
2011 CompileUnit *TheCU = I->second;
2012 const StringMap<std::vector<DIE*> > &Names = TheCU->getAccelObjC();
2013 for (StringMap<std::vector<DIE*> >::const_iterator
2014 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
2015 const char *Name = GI->getKeyData();
Eric Christopherfa03db02012-01-06 23:03:34 +00002016 const std::vector<DIE *> &Entities = GI->second;
Eric Christopher09ac3d82011-11-07 09:24:32 +00002017 for (std::vector<DIE *>::const_iterator DI = Entities.begin(),
2018 DE = Entities.end(); DI != DE; ++DI)
2019 AT.AddName(Name, (*DI));
2020 }
2021 }
2022
2023 AT.FinalizeTable(Asm, "ObjC");
2024 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering()
2025 .getDwarfAccelObjCSection());
2026 MCSymbol *SectionBegin = Asm->GetTempSymbol("objc_begin");
2027 Asm->OutStreamer.EmitLabel(SectionBegin);
2028
2029 // Emit the full data.
Eric Christopher2e5d8702012-12-20 21:58:36 +00002030 AT.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher09ac3d82011-11-07 09:24:32 +00002031}
2032
Eric Christopherb6dc8652012-11-27 22:43:45 +00002033// Emit namespace dies into a hashed accelerator table.
Eric Christopher09ac3d82011-11-07 09:24:32 +00002034void DwarfDebug::emitAccelNamespaces() {
2035 DwarfAccelTable AT(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset,
2036 dwarf::DW_FORM_data4));
2037 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2038 E = CUMap.end(); I != E; ++I) {
2039 CompileUnit *TheCU = I->second;
Eric Christopher8bd36ea2011-11-10 21:47:55 +00002040 const StringMap<std::vector<DIE*> > &Names = TheCU->getAccelNamespace();
2041 for (StringMap<std::vector<DIE*> >::const_iterator
Eric Christopher09ac3d82011-11-07 09:24:32 +00002042 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
2043 const char *Name = GI->getKeyData();
Eric Christopherfa03db02012-01-06 23:03:34 +00002044 const std::vector<DIE *> &Entities = GI->second;
Eric Christopher8bd36ea2011-11-10 21:47:55 +00002045 for (std::vector<DIE *>::const_iterator DI = Entities.begin(),
2046 DE = Entities.end(); DI != DE; ++DI)
2047 AT.AddName(Name, (*DI));
Eric Christopher09ac3d82011-11-07 09:24:32 +00002048 }
2049 }
2050
2051 AT.FinalizeTable(Asm, "namespac");
2052 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering()
2053 .getDwarfAccelNamespaceSection());
2054 MCSymbol *SectionBegin = Asm->GetTempSymbol("namespac_begin");
2055 Asm->OutStreamer.EmitLabel(SectionBegin);
2056
2057 // Emit the full data.
Eric Christopher2e5d8702012-12-20 21:58:36 +00002058 AT.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher09ac3d82011-11-07 09:24:32 +00002059}
2060
Eric Christopherb6dc8652012-11-27 22:43:45 +00002061// Emit type dies into a hashed accelerator table.
Eric Christopher09ac3d82011-11-07 09:24:32 +00002062void DwarfDebug::emitAccelTypes() {
Eric Christopherc36145f2012-01-06 04:35:23 +00002063 std::vector<DwarfAccelTable::Atom> Atoms;
2064 Atoms.push_back(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset,
2065 dwarf::DW_FORM_data4));
2066 Atoms.push_back(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeTag,
2067 dwarf::DW_FORM_data2));
2068 Atoms.push_back(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeTypeFlags,
2069 dwarf::DW_FORM_data1));
2070 DwarfAccelTable AT(Atoms);
Eric Christopher09ac3d82011-11-07 09:24:32 +00002071 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2072 E = CUMap.end(); I != E; ++I) {
2073 CompileUnit *TheCU = I->second;
Eric Christopherc36145f2012-01-06 04:35:23 +00002074 const StringMap<std::vector<std::pair<DIE*, unsigned > > > &Names
2075 = TheCU->getAccelTypes();
2076 for (StringMap<std::vector<std::pair<DIE*, unsigned> > >::const_iterator
Eric Christopher09ac3d82011-11-07 09:24:32 +00002077 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
2078 const char *Name = GI->getKeyData();
Eric Christopherfa03db02012-01-06 23:03:34 +00002079 const std::vector<std::pair<DIE *, unsigned> > &Entities = GI->second;
Eric Christopherc36145f2012-01-06 04:35:23 +00002080 for (std::vector<std::pair<DIE *, unsigned> >::const_iterator DI
2081 = Entities.begin(), DE = Entities.end(); DI !=DE; ++DI)
2082 AT.AddName(Name, (*DI).first, (*DI).second);
Eric Christopher09ac3d82011-11-07 09:24:32 +00002083 }
2084 }
2085
2086 AT.FinalizeTable(Asm, "types");
2087 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering()
2088 .getDwarfAccelTypesSection());
2089 MCSymbol *SectionBegin = Asm->GetTempSymbol("types_begin");
2090 Asm->OutStreamer.EmitLabel(SectionBegin);
2091
2092 // Emit the full data.
Eric Christopher2e5d8702012-12-20 21:58:36 +00002093 AT.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher09ac3d82011-11-07 09:24:32 +00002094}
2095
Devang Patel193f7202009-11-24 01:14:22 +00002096void DwarfDebug::emitDebugPubTypes() {
Devang Patel163a9f72010-05-10 22:49:55 +00002097 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2098 E = CUMap.end(); I != E; ++I) {
2099 CompileUnit *TheCU = I->second;
Eric Christopher63701182011-11-07 09:18:35 +00002100 // Start the dwarf pubtypes section.
Devang Patel163a9f72010-05-10 22:49:55 +00002101 Asm->OutStreamer.SwitchSection(
2102 Asm->getObjFileLowering().getDwarfPubTypesSection());
2103 Asm->OutStreamer.AddComment("Length of Public Types Info");
2104 Asm->EmitLabelDifference(
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002105 Asm->GetTempSymbol("pubtypes_end", TheCU->getUniqueID()),
2106 Asm->GetTempSymbol("pubtypes_begin", TheCU->getUniqueID()), 4);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002107
Devang Patel163a9f72010-05-10 22:49:55 +00002108 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_begin",
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002109 TheCU->getUniqueID()));
Jim Grosbach1e20b962010-07-21 21:21:52 +00002110
Devang Patel163a9f72010-05-10 22:49:55 +00002111 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DWARF Version");
2112 Asm->EmitInt16(dwarf::DWARF_VERSION);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002113
Devang Patel163a9f72010-05-10 22:49:55 +00002114 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
Eric Christophercf6b8ad2012-12-15 00:04:04 +00002115 const MCSection *ISec = Asm->getObjFileLowering().getDwarfInfoSection();
2116 Asm->EmitSectionOffset(Asm->GetTempSymbol(ISec->getLabelBeginName(),
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002117 TheCU->getUniqueID()),
Devang Patel163a9f72010-05-10 22:49:55 +00002118 DwarfInfoSectionSym);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002119
Devang Patel163a9f72010-05-10 22:49:55 +00002120 Asm->OutStreamer.AddComment("Compilation Unit Length");
Eric Christophercf6b8ad2012-12-15 00:04:04 +00002121 Asm->EmitLabelDifference(Asm->GetTempSymbol(ISec->getLabelEndName(),
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002122 TheCU->getUniqueID()),
Eric Christophercf6b8ad2012-12-15 00:04:04 +00002123 Asm->GetTempSymbol(ISec->getLabelBeginName(),
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002124 TheCU->getUniqueID()),
Devang Patel163a9f72010-05-10 22:49:55 +00002125 4);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002126
Devang Patel163a9f72010-05-10 22:49:55 +00002127 const StringMap<DIE*> &Globals = TheCU->getGlobalTypes();
2128 for (StringMap<DIE*>::const_iterator
2129 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2130 const char *Name = GI->getKeyData();
Nick Lewycky3bbb6f72011-07-29 03:49:23 +00002131 DIE *Entity = GI->second;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002132
Devang Patel163a9f72010-05-10 22:49:55 +00002133 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
2134 Asm->EmitInt32(Entity->getOffset());
Jim Grosbach1e20b962010-07-21 21:21:52 +00002135
Devang Patel163a9f72010-05-10 22:49:55 +00002136 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("External Name");
Benjamin Kramer983c4572011-11-09 18:16:11 +00002137 // Emit the name with a terminating null byte.
Eric Christopher68ca5622013-01-09 01:57:54 +00002138 Asm->OutStreamer.EmitBytes(StringRef(Name, GI->getKeyLength()+1));
Devang Patel163a9f72010-05-10 22:49:55 +00002139 }
Jim Grosbach1e20b962010-07-21 21:21:52 +00002140
Devang Patel163a9f72010-05-10 22:49:55 +00002141 Asm->OutStreamer.AddComment("End Mark");
Jim Grosbach1e20b962010-07-21 21:21:52 +00002142 Asm->EmitInt32(0);
Devang Patel163a9f72010-05-10 22:49:55 +00002143 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_end",
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002144 TheCU->getUniqueID()));
Devang Patel193f7202009-11-24 01:14:22 +00002145 }
Devang Patel193f7202009-11-24 01:14:22 +00002146}
2147
Eric Christopher64f824c2012-12-27 02:14:01 +00002148// Emit strings into a string section.
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002149void DwarfUnits::emitStrings(const MCSection *StrSection,
2150 const MCSection *OffsetSection = NULL,
2151 const MCSymbol *StrSecSym = NULL) {
Eric Christopher64f824c2012-12-27 02:14:01 +00002152
Eric Christopherb6714222013-01-08 22:22:06 +00002153 if (StringPool.empty()) return;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002154
Chris Lattner0d9d70f2010-03-09 23:38:23 +00002155 // Start the dwarf str section.
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002156 Asm->OutStreamer.SwitchSection(StrSection);
Bill Wendling94d04b82009-05-20 23:21:38 +00002157
Chris Lattnerbc733f52010-03-13 02:17:42 +00002158 // Get all of the string pool entries and put them in an array by their ID so
2159 // we can sort them.
Jim Grosbach1e20b962010-07-21 21:21:52 +00002160 SmallVector<std::pair<unsigned,
Eric Christopherff348452013-01-07 22:40:45 +00002161 StringMapEntry<std::pair<MCSymbol*, unsigned> >*>, 64> Entries;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002162
Chris Lattnerbc733f52010-03-13 02:17:42 +00002163 for (StringMap<std::pair<MCSymbol*, unsigned> >::iterator
Eric Christopherb6714222013-01-08 22:22:06 +00002164 I = StringPool.begin(), E = StringPool.end();
Eric Christopher72c16552012-12-20 21:58:40 +00002165 I != E; ++I)
Chris Lattnerbc733f52010-03-13 02:17:42 +00002166 Entries.push_back(std::make_pair(I->second.second, &*I));
Jim Grosbach1e20b962010-07-21 21:21:52 +00002167
Chris Lattnerbc733f52010-03-13 02:17:42 +00002168 array_pod_sort(Entries.begin(), Entries.end());
Jim Grosbach1e20b962010-07-21 21:21:52 +00002169
Chris Lattnerbc733f52010-03-13 02:17:42 +00002170 for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
Chris Lattner0d9d70f2010-03-09 23:38:23 +00002171 // Emit a label for reference from debug information entries.
Chris Lattnerbc733f52010-03-13 02:17:42 +00002172 Asm->OutStreamer.EmitLabel(Entries[i].second->getValue().first);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002173
Benjamin Kramer983c4572011-11-09 18:16:11 +00002174 // Emit the string itself with a terminating null byte.
Benjamin Kramer0c45f7d2011-11-09 12:12:04 +00002175 Asm->OutStreamer.EmitBytes(StringRef(Entries[i].second->getKeyData(),
Eric Christopherca1dd052013-01-09 01:35:34 +00002176 Entries[i].second->getKeyLength()+1));
Bill Wendling94d04b82009-05-20 23:21:38 +00002177 }
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002178
2179 // If we've got an offset section go ahead and emit that now as well.
2180 if (OffsetSection) {
2181 Asm->OutStreamer.SwitchSection(OffsetSection);
2182 unsigned offset = 0;
Eric Christopher72f7bfb2013-01-15 23:56:56 +00002183 unsigned size = 4; // FIXME: DWARF64 is 8.
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002184 for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
Eric Christopher1ced2082013-01-09 03:52:05 +00002185 Asm->OutStreamer.EmitIntValue(offset, size);
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002186 offset += Entries[i].second->getKeyLength() + 1;
2187 }
2188 }
Bill Wendling94d04b82009-05-20 23:21:38 +00002189}
2190
Eric Christopher72f7bfb2013-01-15 23:56:56 +00002191// Emit strings into a string section.
2192void DwarfUnits::emitAddresses(const MCSection *AddrSection) {
2193
2194 if (AddressPool.empty()) return;
2195
2196 // Start the dwarf addr section.
2197 Asm->OutStreamer.SwitchSection(AddrSection);
2198
2199 // Get all of the string pool entries and put them in an array by their ID so
2200 // we can sort them.
2201 SmallVector<std::pair<unsigned,
2202 std::pair<MCSymbol*, unsigned>* >, 64> Entries;
2203
2204 for (DenseMap<MCSymbol*, std::pair<MCSymbol*, unsigned> >::iterator
2205 I = AddressPool.begin(), E = AddressPool.end();
2206 I != E; ++I)
2207 Entries.push_back(std::make_pair(I->second.second, &(I->second)));
2208
2209 array_pod_sort(Entries.begin(), Entries.end());
2210
2211 for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
2212 // Emit a label for reference from debug information entries.
2213 MCSymbol *Sym = Entries[i].second->first;
2214 if (Sym)
2215 Asm->EmitLabelReference(Entries[i].second->first,
2216 Asm->getDataLayout().getPointerSize());
2217 else
2218 Asm->OutStreamer.EmitIntValue(0, Asm->getDataLayout().getPointerSize());
2219 }
2220
2221}
2222
Eric Christopher64f824c2012-12-27 02:14:01 +00002223// Emit visible names into a debug str section.
2224void DwarfDebug::emitDebugStr() {
2225 DwarfUnits &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
2226 Holder.emitStrings(Asm->getObjFileLowering().getDwarfStrSection());
2227}
2228
Eric Christopherb6dc8652012-11-27 22:43:45 +00002229// Emit visible names into a debug loc section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002230void DwarfDebug::emitDebugLoc() {
Devang Patel80250682010-05-26 23:55:23 +00002231 if (DotDebugLocEntries.empty())
2232 return;
2233
Devang Patel6c3ea902011-02-04 22:57:18 +00002234 for (SmallVector<DotDebugLocEntry, 4>::iterator
2235 I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
2236 I != E; ++I) {
2237 DotDebugLocEntry &Entry = *I;
2238 if (I + 1 != DotDebugLocEntries.end())
2239 Entry.Merge(I+1);
2240 }
2241
Daniel Dunbar83320a02011-03-16 22:16:39 +00002242 // Start the dwarf loc section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002243 Asm->OutStreamer.SwitchSection(
Devang Patelc3f5f782010-05-25 23:40:22 +00002244 Asm->getObjFileLowering().getDwarfLocSection());
Chandler Carruth426c2bf2012-11-01 09:14:31 +00002245 unsigned char Size = Asm->getDataLayout().getPointerSize();
Devang Patel80250682010-05-26 23:55:23 +00002246 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", 0));
2247 unsigned index = 1;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002248 for (SmallVector<DotDebugLocEntry, 4>::iterator
2249 I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
Devang Patel61409622010-07-07 20:12:52 +00002250 I != E; ++I, ++index) {
Devang Patel6c3ea902011-02-04 22:57:18 +00002251 DotDebugLocEntry &Entry = *I;
2252 if (Entry.isMerged()) continue;
Devang Patelc3f5f782010-05-25 23:40:22 +00002253 if (Entry.isEmpty()) {
Eric Christopherca1dd052013-01-09 01:35:34 +00002254 Asm->OutStreamer.EmitIntValue(0, Size);
2255 Asm->OutStreamer.EmitIntValue(0, Size);
Devang Patel80250682010-05-26 23:55:23 +00002256 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", index));
Devang Patelc3f5f782010-05-25 23:40:22 +00002257 } else {
Eric Christopher1ced2082013-01-09 03:52:05 +00002258 Asm->OutStreamer.EmitSymbolValue(Entry.Begin, Size);
2259 Asm->OutStreamer.EmitSymbolValue(Entry.End, Size);
Devang Patelc26f5442011-04-28 02:22:40 +00002260 DIVariable DV(Entry.Variable);
Rafael Espindola5b23b7f2011-05-27 22:05:41 +00002261 Asm->OutStreamer.AddComment("Loc expr size");
2262 MCSymbol *begin = Asm->OutStreamer.getContext().CreateTempSymbol();
2263 MCSymbol *end = Asm->OutStreamer.getContext().CreateTempSymbol();
2264 Asm->EmitLabelDifference(end, begin, 2);
2265 Asm->OutStreamer.EmitLabel(begin);
Devang Patel80efd4e2011-07-08 16:49:43 +00002266 if (Entry.isInt()) {
Devang Patelc4329072011-06-01 22:03:25 +00002267 DIBasicType BTy(DV.getType());
2268 if (BTy.Verify() &&
Eric Christopher0f1c7f62012-11-19 22:42:10 +00002269 (BTy.getEncoding() == dwarf::DW_ATE_signed
Devang Patelc4329072011-06-01 22:03:25 +00002270 || BTy.getEncoding() == dwarf::DW_ATE_signed_char)) {
2271 Asm->OutStreamer.AddComment("DW_OP_consts");
2272 Asm->EmitInt8(dwarf::DW_OP_consts);
Devang Patel80efd4e2011-07-08 16:49:43 +00002273 Asm->EmitSLEB128(Entry.getInt());
Devang Patelc4329072011-06-01 22:03:25 +00002274 } else {
2275 Asm->OutStreamer.AddComment("DW_OP_constu");
2276 Asm->EmitInt8(dwarf::DW_OP_constu);
Devang Patel80efd4e2011-07-08 16:49:43 +00002277 Asm->EmitULEB128(Entry.getInt());
Devang Patelc4329072011-06-01 22:03:25 +00002278 }
Devang Patel80efd4e2011-07-08 16:49:43 +00002279 } else if (Entry.isLocation()) {
Eric Christopher0f1c7f62012-11-19 22:42:10 +00002280 if (!DV.hasComplexAddress())
Devang Patel80efd4e2011-07-08 16:49:43 +00002281 // Regular entry.
Devang Patelc26f5442011-04-28 02:22:40 +00002282 Asm->EmitDwarfRegOp(Entry.Loc);
Devang Patel80efd4e2011-07-08 16:49:43 +00002283 else {
2284 // Complex address entry.
2285 unsigned N = DV.getNumAddrElements();
2286 unsigned i = 0;
2287 if (N >= 2 && DV.getAddrElement(0) == DIBuilder::OpPlus) {
2288 if (Entry.Loc.getOffset()) {
2289 i = 2;
2290 Asm->EmitDwarfRegOp(Entry.Loc);
2291 Asm->OutStreamer.AddComment("DW_OP_deref");
2292 Asm->EmitInt8(dwarf::DW_OP_deref);
2293 Asm->OutStreamer.AddComment("DW_OP_plus_uconst");
2294 Asm->EmitInt8(dwarf::DW_OP_plus_uconst);
2295 Asm->EmitSLEB128(DV.getAddrElement(1));
2296 } else {
2297 // If first address element is OpPlus then emit
2298 // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
2299 MachineLocation Loc(Entry.Loc.getReg(), DV.getAddrElement(1));
2300 Asm->EmitDwarfRegOp(Loc);
2301 i = 2;
2302 }
2303 } else {
2304 Asm->EmitDwarfRegOp(Entry.Loc);
2305 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +00002306
Devang Patel80efd4e2011-07-08 16:49:43 +00002307 // Emit remaining complex address elements.
2308 for (; i < N; ++i) {
2309 uint64_t Element = DV.getAddrElement(i);
2310 if (Element == DIBuilder::OpPlus) {
2311 Asm->EmitInt8(dwarf::DW_OP_plus_uconst);
2312 Asm->EmitULEB128(DV.getAddrElement(++i));
Eric Christopher50120762012-05-08 18:56:00 +00002313 } else if (Element == DIBuilder::OpDeref) {
Eric Christophera80f2d12012-05-08 21:24:39 +00002314 if (!Entry.Loc.isReg())
Eric Christopher50120762012-05-08 18:56:00 +00002315 Asm->EmitInt8(dwarf::DW_OP_deref);
2316 } else
2317 llvm_unreachable("unknown Opcode found in complex address");
Devang Patel80efd4e2011-07-08 16:49:43 +00002318 }
Devang Patelc26f5442011-04-28 02:22:40 +00002319 }
Devang Patelc26f5442011-04-28 02:22:40 +00002320 }
Devang Patel80efd4e2011-07-08 16:49:43 +00002321 // else ... ignore constant fp. There is not any good way to
2322 // to represent them here in dwarf.
Rafael Espindola5b23b7f2011-05-27 22:05:41 +00002323 Asm->OutStreamer.EmitLabel(end);
Devang Patelc3f5f782010-05-25 23:40:22 +00002324 }
2325 }
Bill Wendling94d04b82009-05-20 23:21:38 +00002326}
2327
Eric Christopherb6dc8652012-11-27 22:43:45 +00002328// Emit visible names into a debug aranges section.
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00002329void DwarfDebug::emitDebugARanges() {
Bill Wendling94d04b82009-05-20 23:21:38 +00002330 // Start the dwarf aranges section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002331 Asm->OutStreamer.SwitchSection(
2332 Asm->getObjFileLowering().getDwarfARangesSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002333}
2334
Eric Christopherb6dc8652012-11-27 22:43:45 +00002335// Emit visible names into a debug ranges section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002336void DwarfDebug::emitDebugRanges() {
Bill Wendling94d04b82009-05-20 23:21:38 +00002337 // Start the dwarf ranges section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002338 Asm->OutStreamer.SwitchSection(
Devang Patelf2548ca2010-04-16 23:33:45 +00002339 Asm->getObjFileLowering().getDwarfRangesSection());
Chandler Carruth426c2bf2012-11-01 09:14:31 +00002340 unsigned char Size = Asm->getDataLayout().getPointerSize();
Devang Pateleac9c072010-04-27 19:46:33 +00002341 for (SmallVector<const MCSymbol *, 8>::iterator
Jim Grosbach1e20b962010-07-21 21:21:52 +00002342 I = DebugRangeSymbols.begin(), E = DebugRangeSymbols.end();
Devang Pateleac9c072010-04-27 19:46:33 +00002343 I != E; ++I) {
2344 if (*I)
Eric Christopher1ced2082013-01-09 03:52:05 +00002345 Asm->OutStreamer.EmitSymbolValue(const_cast<MCSymbol*>(*I), Size);
Devang Patelf2548ca2010-04-16 23:33:45 +00002346 else
Eric Christopherca1dd052013-01-09 01:35:34 +00002347 Asm->OutStreamer.EmitIntValue(0, Size);
Devang Patelf2548ca2010-04-16 23:33:45 +00002348 }
Bill Wendling94d04b82009-05-20 23:21:38 +00002349}
2350
Eric Christopherb6dc8652012-11-27 22:43:45 +00002351// Emit visible names into a debug macinfo section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002352void DwarfDebug::emitDebugMacInfo() {
Daniel Dunbarf612ff62009-09-19 20:40:05 +00002353 if (const MCSection *LineInfo =
Chris Lattner18a4c162009-08-02 07:24:22 +00002354 Asm->getObjFileLowering().getDwarfMacroInfoSection()) {
Bill Wendling94d04b82009-05-20 23:21:38 +00002355 // Start the dwarf macinfo section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002356 Asm->OutStreamer.SwitchSection(LineInfo);
Bill Wendling94d04b82009-05-20 23:21:38 +00002357 }
2358}
2359
Eric Christopherb6dc8652012-11-27 22:43:45 +00002360// Emit inline info using following format.
2361// Section Header:
2362// 1. length of section
2363// 2. Dwarf version number
2364// 3. address size.
2365//
2366// Entries (one "entry" for each function that was inlined):
2367//
2368// 1. offset into __debug_str section for MIPS linkage name, if exists;
2369// otherwise offset into __debug_str for regular function name.
2370// 2. offset into __debug_str section for regular function name.
2371// 3. an unsigned LEB128 number indicating the number of distinct inlining
2372// instances for the function.
2373//
2374// The rest of the entry consists of a {die_offset, low_pc} pair for each
2375// inlined instance; the die_offset points to the inlined_subroutine die in the
2376// __debug_info section, and the low_pc is the starting address for the
2377// inlining instance.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002378void DwarfDebug::emitDebugInlineInfo() {
Eric Christopherb83e2bb2012-03-02 02:11:47 +00002379 if (!Asm->MAI->doesDwarfUseInlineInfoSection())
Bill Wendling94d04b82009-05-20 23:21:38 +00002380 return;
2381
Devang Patel163a9f72010-05-10 22:49:55 +00002382 if (!FirstCU)
Bill Wendling94d04b82009-05-20 23:21:38 +00002383 return;
2384
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002385 Asm->OutStreamer.SwitchSection(
2386 Asm->getObjFileLowering().getDwarfDebugInlineSection());
Chris Lattner0ad9c912010-01-22 22:09:00 +00002387
Chris Lattner233f52b2010-03-09 23:52:58 +00002388 Asm->OutStreamer.AddComment("Length of Debug Inlined Information Entry");
Chris Lattnera6437182010-04-04 19:58:12 +00002389 Asm->EmitLabelDifference(Asm->GetTempSymbol("debug_inlined_end", 1),
2390 Asm->GetTempSymbol("debug_inlined_begin", 1), 4);
Bill Wendling94d04b82009-05-20 23:21:38 +00002391
Chris Lattnerc0215722010-04-04 19:25:43 +00002392 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_begin", 1));
Bill Wendling94d04b82009-05-20 23:21:38 +00002393
Chris Lattner233f52b2010-03-09 23:52:58 +00002394 Asm->OutStreamer.AddComment("Dwarf Version");
2395 Asm->EmitInt16(dwarf::DWARF_VERSION);
2396 Asm->OutStreamer.AddComment("Address Size (in bytes)");
Chandler Carruth426c2bf2012-11-01 09:14:31 +00002397 Asm->EmitInt8(Asm->getDataLayout().getPointerSize());
Bill Wendling94d04b82009-05-20 23:21:38 +00002398
Devang Patele9f8f5e2010-05-07 20:54:48 +00002399 for (SmallVector<const MDNode *, 4>::iterator I = InlinedSPNodes.begin(),
Devang Patel53bb5c92009-11-10 23:06:00 +00002400 E = InlinedSPNodes.end(); I != E; ++I) {
Jim Grosbach31ef40e2009-11-21 23:12:12 +00002401
Devang Patele9f8f5e2010-05-07 20:54:48 +00002402 const MDNode *Node = *I;
2403 DenseMap<const MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator II
Jim Grosbach7ab38df2009-11-22 19:20:36 +00002404 = InlineInfo.find(Node);
Devang Patel53bb5c92009-11-10 23:06:00 +00002405 SmallVector<InlineInfoLabels, 4> &Labels = II->second;
Devang Patele4b27562009-08-28 23:24:31 +00002406 DISubprogram SP(Node);
Devang Patel65dbc902009-11-25 17:36:49 +00002407 StringRef LName = SP.getLinkageName();
2408 StringRef Name = SP.getName();
Bill Wendling94d04b82009-05-20 23:21:38 +00002409
Chris Lattner233f52b2010-03-09 23:52:58 +00002410 Asm->OutStreamer.AddComment("MIPS linkage name");
Eric Christopher50e26612012-03-02 01:57:52 +00002411 if (LName.empty())
Eric Christopher2e5d8702012-12-20 21:58:36 +00002412 Asm->EmitSectionOffset(InfoHolder.getStringPoolEntry(Name),
2413 DwarfStrSectionSym);
Eric Christopher50e26612012-03-02 01:57:52 +00002414 else
Eric Christopher2e5d8702012-12-20 21:58:36 +00002415 Asm->EmitSectionOffset(InfoHolder
2416 .getStringPoolEntry(getRealLinkageName(LName)),
Chris Lattner6189ed12010-04-04 23:25:33 +00002417 DwarfStrSectionSym);
Devang Patel53bb5c92009-11-10 23:06:00 +00002418
Chris Lattner233f52b2010-03-09 23:52:58 +00002419 Asm->OutStreamer.AddComment("Function name");
Eric Christopher2e5d8702012-12-20 21:58:36 +00002420 Asm->EmitSectionOffset(InfoHolder.getStringPoolEntry(Name),
2421 DwarfStrSectionSym);
Chris Lattner7e1a8f82010-04-04 19:09:29 +00002422 Asm->EmitULEB128(Labels.size(), "Inline count");
Bill Wendling94d04b82009-05-20 23:21:38 +00002423
Devang Patel53bb5c92009-11-10 23:06:00 +00002424 for (SmallVector<InlineInfoLabels, 4>::iterator LI = Labels.begin(),
Bill Wendling94d04b82009-05-20 23:21:38 +00002425 LE = Labels.end(); LI != LE; ++LI) {
Chris Lattner3f53c832010-04-04 18:52:31 +00002426 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
Chris Lattner6ed0f902010-03-09 00:31:02 +00002427 Asm->EmitInt32(LI->second->getOffset());
Bill Wendling94d04b82009-05-20 23:21:38 +00002428
Chris Lattner3f53c832010-04-04 18:52:31 +00002429 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("low_pc");
Chris Lattnerd38fee82010-04-05 00:13:49 +00002430 Asm->OutStreamer.EmitSymbolValue(LI->first,
Eric Christopher1ced2082013-01-09 03:52:05 +00002431 Asm->getDataLayout().getPointerSize());
Bill Wendling94d04b82009-05-20 23:21:38 +00002432 }
2433 }
2434
Chris Lattnerc0215722010-04-04 19:25:43 +00002435 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_end", 1));
Bill Wendling94d04b82009-05-20 23:21:38 +00002436}
Eric Christopher98e237f2012-11-30 23:59:06 +00002437
Eric Christopher0b944ee2012-12-11 19:42:09 +00002438// DWARF5 Experimental Separate Dwarf emitters.
Eric Christopher98e237f2012-11-30 23:59:06 +00002439
2440// This DIE has the following attributes: DW_AT_comp_dir, DW_AT_stmt_list,
2441// DW_AT_low_pc, DW_AT_high_pc, DW_AT_ranges, DW_AT_dwo_name, DW_AT_dwo_id,
2442// DW_AT_ranges_base, DW_AT_addr_base. If DW_AT_ranges is present,
2443// DW_AT_low_pc and DW_AT_high_pc are not used, and vice versa.
Eric Christopher4daaed12012-12-10 19:51:21 +00002444CompileUnit *DwarfDebug::constructSkeletonCU(const MDNode *N) {
Eric Christopher98e237f2012-11-30 23:59:06 +00002445 DICompileUnit DIUnit(N);
Eric Christopher98e237f2012-11-30 23:59:06 +00002446 CompilationDir = DIUnit.getDirectory();
Eric Christopher98e237f2012-11-30 23:59:06 +00002447
2448 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002449 CompileUnit *NewCU = new CompileUnit(GlobalCUIndexCount++,
Eric Christopher2e5d8702012-12-20 21:58:36 +00002450 DIUnit.getLanguage(), Die, Asm,
Eric Christopher64f824c2012-12-27 02:14:01 +00002451 this, &SkeletonHolder);
Eric Christopher446b88f2013-01-17 03:00:04 +00002452
2453 SmallString<16> T(DIUnit.getFilename());
2454 sys::path::replace_extension(T, ".dwo");
2455 StringRef FN = sys::path::filename(T);
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002456 NewCU->addLocalString(Die, dwarf::DW_AT_GNU_dwo_name, FN);
Eric Christopher98e237f2012-11-30 23:59:06 +00002457
Eric Christopher208cc6f2013-02-05 07:31:55 +00002458 // This should be a unique identifier when we want to build .dwp files.
2459 NewCU->addUInt(Die, dwarf::DW_AT_GNU_dwo_id, dwarf::DW_FORM_data8, 0);
Eric Christopherd96c72a2013-01-17 02:59:59 +00002460
2461 // FIXME: The addr base should be relative for each compile unit, however,
2462 // this one is going to be 0 anyhow.
2463 NewCU->addUInt(Die, dwarf::DW_AT_GNU_addr_base, dwarf::DW_FORM_sec_offset, 0);
Eric Christopher98e237f2012-11-30 23:59:06 +00002464
2465 // 2.17.1 requires that we use DW_AT_low_pc for a single entry point
Eric Christopher72f7bfb2013-01-15 23:56:56 +00002466 // into an entity. We're using 0, or a NULL label for this.
Eric Christopher98e237f2012-11-30 23:59:06 +00002467 NewCU->addUInt(Die, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, 0);
Eric Christopher72f7bfb2013-01-15 23:56:56 +00002468
Eric Christopher98e237f2012-11-30 23:59:06 +00002469 // DW_AT_stmt_list is a offset of line number information for this
2470 // compile unit in debug_line section.
2471 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
Eric Christopher446b88f2013-01-17 03:00:04 +00002472 NewCU->addLabel(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_sec_offset,
Eric Christopher98e237f2012-11-30 23:59:06 +00002473 Asm->GetTempSymbol("section_line"));
2474 else
Eric Christopher446b88f2013-01-17 03:00:04 +00002475 NewCU->addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_sec_offset, 0);
Eric Christopher98e237f2012-11-30 23:59:06 +00002476
2477 if (!CompilationDir.empty())
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002478 NewCU->addLocalString(Die, dwarf::DW_AT_comp_dir, CompilationDir);
Eric Christopher98e237f2012-11-30 23:59:06 +00002479
Eric Christopher31fb5da2013-02-05 07:32:03 +00002480 if (!SkeletonCU)
2481 SkeletonCU = NewCU;
2482
Eric Christopher0e3e9b72012-12-10 23:34:43 +00002483 SkeletonHolder.addUnit(NewCU);
2484
Eric Christopher98e237f2012-11-30 23:59:06 +00002485 return NewCU;
2486}
2487
Eric Christopher4daaed12012-12-10 19:51:21 +00002488void DwarfDebug::emitSkeletonCU(const MCSection *Section) {
Eric Christopher98e237f2012-11-30 23:59:06 +00002489 Asm->OutStreamer.SwitchSection(Section);
Eric Christopher4daaed12012-12-10 19:51:21 +00002490 DIE *Die = SkeletonCU->getCUDie();
Eric Christopher98e237f2012-11-30 23:59:06 +00002491
2492 // Emit the compile units header.
Eric Christophercf6b8ad2012-12-15 00:04:04 +00002493 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol(Section->getLabelBeginName(),
Eric Christopher4daaed12012-12-10 19:51:21 +00002494 SkeletonCU->getUniqueID()));
Eric Christopher98e237f2012-11-30 23:59:06 +00002495
2496 // Emit size of content not including length itself
2497 unsigned ContentSize = Die->getSize() +
2498 sizeof(int16_t) + // DWARF version number
2499 sizeof(int32_t) + // Offset Into Abbrev. Section
2500 sizeof(int8_t); // Pointer Size (in bytes)
2501
2502 Asm->OutStreamer.AddComment("Length of Compilation Unit Info");
2503 Asm->EmitInt32(ContentSize);
2504 Asm->OutStreamer.AddComment("DWARF version number");
2505 Asm->EmitInt16(dwarf::DWARF_VERSION);
2506 Asm->OutStreamer.AddComment("Offset Into Abbrev. Section");
Eric Christopher6eebe472012-12-19 22:02:53 +00002507
2508 const MCSection *ASec = Asm->getObjFileLowering().getDwarfAbbrevSection();
2509 Asm->EmitSectionOffset(Asm->GetTempSymbol(ASec->getLabelBeginName()),
Eric Christopher98e237f2012-11-30 23:59:06 +00002510 DwarfAbbrevSectionSym);
2511 Asm->OutStreamer.AddComment("Address Size (in bytes)");
2512 Asm->EmitInt8(Asm->getDataLayout().getPointerSize());
2513
Eric Christopher6eebe472012-12-19 22:02:53 +00002514 emitDIE(Die, &SkeletonAbbrevs);
Eric Christophercf6b8ad2012-12-15 00:04:04 +00002515 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol(Section->getLabelEndName(),
Eric Christopher4daaed12012-12-10 19:51:21 +00002516 SkeletonCU->getUniqueID()));
Eric Christopher6eebe472012-12-19 22:02:53 +00002517}
Eric Christopher98e237f2012-11-30 23:59:06 +00002518
Eric Christopher6eebe472012-12-19 22:02:53 +00002519void DwarfDebug::emitSkeletonAbbrevs(const MCSection *Section) {
2520 assert(useSplitDwarf() && "No split dwarf debug info?");
2521 emitAbbrevs(Section, &SkeletonAbbrevs);
Eric Christopher98e237f2012-11-30 23:59:06 +00002522}
2523
Eric Christopher0b944ee2012-12-11 19:42:09 +00002524// Emit the .debug_info.dwo section for separated dwarf. This contains the
2525// compile units that would normally be in debug_info.
Eric Christopher98e237f2012-11-30 23:59:06 +00002526void DwarfDebug::emitDebugInfoDWO() {
Eric Christopher4daaed12012-12-10 19:51:21 +00002527 assert(useSplitDwarf() && "No split dwarf debug info?");
Eric Christopherb1e66d02012-12-15 00:04:07 +00002528 InfoHolder.emitUnits(this, Asm->getObjFileLowering().getDwarfInfoDWOSection(),
Eric Christopher6eebe472012-12-19 22:02:53 +00002529 Asm->getObjFileLowering().getDwarfAbbrevDWOSection(),
2530 DwarfAbbrevDWOSectionSym);
2531}
2532
2533// Emit the .debug_abbrev.dwo section for separated dwarf. This contains the
2534// abbreviations for the .debug_info.dwo section.
2535void DwarfDebug::emitDebugAbbrevDWO() {
2536 assert(useSplitDwarf() && "No split dwarf?");
Eric Christopher72c16552012-12-20 21:58:40 +00002537 emitAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevDWOSection(),
2538 &Abbreviations);
Eric Christopher98e237f2012-11-30 23:59:06 +00002539}
Eric Christopher64f824c2012-12-27 02:14:01 +00002540
2541// Emit the .debug_str.dwo section for separated dwarf. This contains the
2542// string section and is identical in format to traditional .debug_str
2543// sections.
2544void DwarfDebug::emitDebugStrDWO() {
2545 assert(useSplitDwarf() && "No split dwarf?");
Eric Christopherff348452013-01-07 22:40:45 +00002546 const MCSection *OffSec = Asm->getObjFileLowering()
2547 .getDwarfStrOffDWOSection();
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002548 const MCSymbol *StrSym = DwarfStrSectionSym;
2549 InfoHolder.emitStrings(Asm->getObjFileLowering().getDwarfStrDWOSection(),
2550 OffSec, StrSym);
Eric Christopher64f824c2012-12-27 02:14:01 +00002551}