blob: 340949007fa1c3fa34de05ca25f0a253074145dd [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);
Manman Ren43213cf2013-02-05 21:52:47 +0000665
666 // Define start line table label for each Compile Unit.
667 MCSymbol *LineTableStartSym = Asm->GetTempSymbol("line_table_start",
668 NewCU->getUniqueID());
669 Asm->OutStreamer.getContext().setMCLineTableSymbol(LineTableStartSym,
670 NewCU->getUniqueID());
671
Devang Patel4a602ca2010-03-22 23:11:36 +0000672 // DW_AT_stmt_list is a offset of line number information for this
Devang Patelaf608bd2010-08-24 00:06:12 +0000673 // compile unit in debug_line section.
Rafael Espindola2241e512012-06-22 13:24:07 +0000674 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
Rafael Espindola597a7662011-05-04 17:44:06 +0000675 NewCU->addLabel(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4,
Manman Ren43213cf2013-02-05 21:52:47 +0000676 LineTableStartSym);
Manman Ren9c5861f2013-02-06 00:59:41 +0000677 else if (NewCU->getUniqueID() == 0)
678 NewCU->addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4, 0);
Devang Patelae84d5b2010-08-31 23:50:19 +0000679 else
Manman Ren43213cf2013-02-05 21:52:47 +0000680 NewCU->addDelta(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4,
681 LineTableStartSym, Asm->GetTempSymbol("section_line"));
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000682
Nick Lewycky6c1a7032011-11-02 20:55:33 +0000683 if (!CompilationDir.empty())
684 NewCU->addString(Die, dwarf::DW_AT_comp_dir, CompilationDir);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000685 if (DIUnit.isOptimized())
Eric Christopher873cf0a2012-08-24 01:14:27 +0000686 NewCU->addFlag(Die, dwarf::DW_AT_APPLE_optimized);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000687
Devang Patel65dbc902009-11-25 17:36:49 +0000688 StringRef Flags = DIUnit.getFlags();
689 if (!Flags.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +0000690 NewCU->addString(Die, dwarf::DW_AT_APPLE_flags, Flags);
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000691
Nick Lewyckyd5d52132011-10-17 23:27:36 +0000692 if (unsigned RVer = DIUnit.getRunTimeVersion())
Devang Patel3cbee302011-04-12 22:53:02 +0000693 NewCU->addUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers,
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000694 dwarf::DW_FORM_data1, RVer);
695
Devang Patel163a9f72010-05-10 22:49:55 +0000696 if (!FirstCU)
697 FirstCU = NewCU;
Eric Christopher208cc6f2013-02-05 07:31:55 +0000698
Eric Christopher31fb5da2013-02-05 07:32:03 +0000699 if (useSplitDwarf()) {
700 // This should be a unique identifier when we want to build .dwp files.
Eric Christopher208cc6f2013-02-05 07:31:55 +0000701 NewCU->addUInt(Die, dwarf::DW_AT_GNU_dwo_id, dwarf::DW_FORM_data8, 0);
Eric Christopher31fb5da2013-02-05 07:32:03 +0000702 // Now construct the skeleton CU associated.
703 constructSkeletonCU(N);
704 }
Eric Christopher98e237f2012-11-30 23:59:06 +0000705
Eric Christopher0e3e9b72012-12-10 23:34:43 +0000706 InfoHolder.addUnit(NewCU);
707
Devang Patel163a9f72010-05-10 22:49:55 +0000708 CUMap.insert(std::make_pair(N, NewCU));
Devang Patel94c7ddb2011-08-16 22:09:43 +0000709 return NewCU;
Devang Patel163a9f72010-05-10 22:49:55 +0000710}
711
Eric Christopherb6dc8652012-11-27 22:43:45 +0000712// Construct subprogram DIE.
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000713void DwarfDebug::constructSubprogramDIE(CompileUnit *TheCU,
Devang Patel3655a212011-08-15 23:36:40 +0000714 const MDNode *N) {
Rafael Espindolab0527282011-11-04 19:00:29 +0000715 CompileUnit *&CURef = SPMap[N];
716 if (CURef)
717 return;
718 CURef = TheCU;
719
Devang Patele4b27562009-08-28 23:24:31 +0000720 DISubprogram SP(N);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000721 if (!SP.isDefinition())
722 // This is a method declaration which will be handled while constructing
723 // class type.
Devang Patel13e16b62009-06-26 01:49:18 +0000724 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000725
Devang Pateldbc64af2011-08-15 17:24:54 +0000726 DIE *SubprogramDie = TheCU->getOrCreateSubprogramDIE(SP);
Stuart Hastings639336e2010-04-06 21:38:29 +0000727
728 // Add to map.
Devang Patel163a9f72010-05-10 22:49:55 +0000729 TheCU->insertDIE(N, SubprogramDie);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000730
731 // Add to context owner.
Devang Patel3cbee302011-04-12 22:53:02 +0000732 TheCU->addToContextOwner(SubprogramDie, SP.getContext());
Devang Patel0000fad2009-12-08 23:21:45 +0000733
Devang Patel13e16b62009-06-26 01:49:18 +0000734 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000735}
736
Eric Christopherb6dc8652012-11-27 22:43:45 +0000737// Collect debug info from named mdnodes such as llvm.dbg.enum and llvm.dbg.ty.
Eric Christopherc4639d62012-11-19 22:42:15 +0000738void DwarfDebug::collectInfoFromNamedMDNodes(const Module *M) {
Devang Patel94c7ddb2011-08-16 22:09:43 +0000739 if (NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.sp"))
740 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
741 const MDNode *N = NMD->getOperand(i);
742 if (CompileUnit *CU = CUMap.lookup(DISubprogram(N).getCompileUnit()))
743 constructSubprogramDIE(CU, N);
744 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000745
Devang Patel94c7ddb2011-08-16 22:09:43 +0000746 if (NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.gv"))
747 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
748 const MDNode *N = NMD->getOperand(i);
749 if (CompileUnit *CU = CUMap.lookup(DIGlobalVariable(N).getCompileUnit()))
Devang Patel28bea082011-08-18 23:17:55 +0000750 CU->createGlobalVariableDIE(N);
Devang Patel94c7ddb2011-08-16 22:09:43 +0000751 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000752
Devang Patel02e603f2011-08-15 23:47:24 +0000753 if (NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.enum"))
754 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
755 DIType Ty(NMD->getOperand(i));
Devang Patel94c7ddb2011-08-16 22:09:43 +0000756 if (CompileUnit *CU = CUMap.lookup(Ty.getCompileUnit()))
757 CU->getOrCreateTypeDIE(Ty);
Devang Patel02e603f2011-08-15 23:47:24 +0000758 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000759
Devang Patel02e603f2011-08-15 23:47:24 +0000760 if (NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.ty"))
761 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
762 DIType Ty(NMD->getOperand(i));
Devang Patel94c7ddb2011-08-16 22:09:43 +0000763 if (CompileUnit *CU = CUMap.lookup(Ty.getCompileUnit()))
764 CU->getOrCreateTypeDIE(Ty);
Devang Patel02e603f2011-08-15 23:47:24 +0000765 }
766}
767
Eric Christopherb6dc8652012-11-27 22:43:45 +0000768// Collect debug info using DebugInfoFinder.
769// FIXME - Remove this when dragonegg switches to DIBuilder.
Eric Christopherc4639d62012-11-19 22:42:15 +0000770bool DwarfDebug::collectLegacyDebugInfo(const Module *M) {
Devang Patel02e603f2011-08-15 23:47:24 +0000771 DebugInfoFinder DbgFinder;
772 DbgFinder.processModule(*M);
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000773
Devang Patel02e603f2011-08-15 23:47:24 +0000774 bool HasDebugInfo = false;
775 // Scan all the compile-units to see if there are any marked as the main
776 // unit. If not, we do not generate debug info.
777 for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
778 E = DbgFinder.compile_unit_end(); I != E; ++I) {
779 if (DICompileUnit(*I).isMain()) {
780 HasDebugInfo = true;
781 break;
782 }
783 }
784 if (!HasDebugInfo) return false;
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000785
Devang Patel02e603f2011-08-15 23:47:24 +0000786 // Create all the compile unit DIEs.
787 for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
788 E = DbgFinder.compile_unit_end(); I != E; ++I)
789 constructCompileUnit(*I);
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000790
Devang Patel02e603f2011-08-15 23:47:24 +0000791 // Create DIEs for each global variable.
792 for (DebugInfoFinder::iterator I = DbgFinder.global_variable_begin(),
793 E = DbgFinder.global_variable_end(); I != E; ++I) {
794 const MDNode *N = *I;
Devang Patel94c7ddb2011-08-16 22:09:43 +0000795 if (CompileUnit *CU = CUMap.lookup(DIGlobalVariable(N).getCompileUnit()))
Devang Patel28bea082011-08-18 23:17:55 +0000796 CU->createGlobalVariableDIE(N);
Devang Patel02e603f2011-08-15 23:47:24 +0000797 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000798
Devang Patel02e603f2011-08-15 23:47:24 +0000799 // Create DIEs for each subprogram.
800 for (DebugInfoFinder::iterator I = DbgFinder.subprogram_begin(),
801 E = DbgFinder.subprogram_end(); I != E; ++I) {
802 const MDNode *N = *I;
Devang Patel94c7ddb2011-08-16 22:09:43 +0000803 if (CompileUnit *CU = CUMap.lookup(DISubprogram(N).getCompileUnit()))
804 constructSubprogramDIE(CU, N);
Devang Patel02e603f2011-08-15 23:47:24 +0000805 }
806
807 return HasDebugInfo;
808}
809
Eric Christopherb6dc8652012-11-27 22:43:45 +0000810// Emit all Dwarf sections that should come prior to the content. Create
811// global DIEs and emit initial debug info sections. This is invoked by
812// the target AsmPrinter.
Eric Christopherc4639d62012-11-19 22:42:15 +0000813void DwarfDebug::beginModule() {
Devang Pateleac9c072010-04-27 19:46:33 +0000814 if (DisableDebugInfoPrinting)
815 return;
816
Eric Christopherc4639d62012-11-19 22:42:15 +0000817 const Module *M = MMI->getModule();
818
Nick Lewycky3bbb6f72011-07-29 03:49:23 +0000819 // If module has named metadata anchors then use them, otherwise scan the
820 // module using debug info finder to collect debug info.
Devang Patel30692ab2011-05-03 16:45:22 +0000821 NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu");
822 if (CU_Nodes) {
Devang Patel94c7ddb2011-08-16 22:09:43 +0000823 for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i) {
824 DICompileUnit CUNode(CU_Nodes->getOperand(i));
825 CompileUnit *CU = constructCompileUnit(CUNode);
826 DIArray GVs = CUNode.getGlobalVariables();
827 for (unsigned i = 0, e = GVs.getNumElements(); i != e; ++i)
Devang Patel28bea082011-08-18 23:17:55 +0000828 CU->createGlobalVariableDIE(GVs.getElement(i));
Devang Patel94c7ddb2011-08-16 22:09:43 +0000829 DIArray SPs = CUNode.getSubprograms();
830 for (unsigned i = 0, e = SPs.getNumElements(); i != e; ++i)
831 constructSubprogramDIE(CU, SPs.getElement(i));
832 DIArray EnumTypes = CUNode.getEnumTypes();
833 for (unsigned i = 0, e = EnumTypes.getNumElements(); i != e; ++i)
834 CU->getOrCreateTypeDIE(EnumTypes.getElement(i));
835 DIArray RetainedTypes = CUNode.getRetainedTypes();
836 for (unsigned i = 0, e = RetainedTypes.getNumElements(); i != e; ++i)
837 CU->getOrCreateTypeDIE(RetainedTypes.getElement(i));
838 }
Devang Patel02e603f2011-08-15 23:47:24 +0000839 } else if (!collectLegacyDebugInfo(M))
840 return;
Devang Patel30692ab2011-05-03 16:45:22 +0000841
Devang Patel02e603f2011-08-15 23:47:24 +0000842 collectInfoFromNamedMDNodes(M);
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000843
Chris Lattnerd850ac72010-04-05 02:19:28 +0000844 // Tell MMI that we have debug info.
845 MMI->setDebugInfoAvailability(true);
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000846
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000847 // Prime section data.
Chris Lattnerf0144122009-07-28 03:13:23 +0000848 SectionMap.insert(Asm->getObjFileLowering().getTextSection());
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000849}
850
Eric Christopher4117bec2012-11-22 00:59:49 +0000851// Attach DW_AT_inline attribute with inlined subprogram DIEs.
852void DwarfDebug::computeInlinedDIEs() {
Devang Patel53bb5c92009-11-10 23:06:00 +0000853 // Attach DW_AT_inline attribute with inlined subprogram DIEs.
854 for (SmallPtrSet<DIE *, 4>::iterator AI = InlinedSubprogramDIEs.begin(),
Eric Christopherbdab8002012-11-27 00:13:51 +0000855 AE = InlinedSubprogramDIEs.end(); AI != AE; ++AI) {
Devang Patel53bb5c92009-11-10 23:06:00 +0000856 DIE *ISP = *AI;
Devang Patel3cbee302011-04-12 22:53:02 +0000857 FirstCU->addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
Devang Patel53bb5c92009-11-10 23:06:00 +0000858 }
Rafael Espindolad1ac3a42011-11-12 01:57:54 +0000859 for (DenseMap<const MDNode *, DIE *>::iterator AI = AbstractSPDies.begin(),
Eric Christopherbdab8002012-11-27 00:13:51 +0000860 AE = AbstractSPDies.end(); AI != AE; ++AI) {
Rafael Espindolad1ac3a42011-11-12 01:57:54 +0000861 DIE *ISP = AI->second;
862 if (InlinedSubprogramDIEs.count(ISP))
863 continue;
864 FirstCU->addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
865 }
Eric Christopher4117bec2012-11-22 00:59:49 +0000866}
867
868// Collect info for variables that were optimized out.
869void DwarfDebug::collectDeadVariables() {
870 const Module *M = MMI->getModule();
871 DenseMap<const MDNode *, LexicalScope *> DeadFnScopeMap;
872
873 if (NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu")) {
874 for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i) {
875 DICompileUnit TheCU(CU_Nodes->getOperand(i));
876 DIArray Subprograms = TheCU.getSubprograms();
877 for (unsigned i = 0, e = Subprograms.getNumElements(); i != e; ++i) {
Eric Christopherbdab8002012-11-27 00:13:51 +0000878 DISubprogram SP(Subprograms.getElement(i));
879 if (ProcessedSPNodes.count(SP) != 0) continue;
880 if (!SP.Verify()) continue;
881 if (!SP.isDefinition()) continue;
882 DIArray Variables = SP.getVariables();
883 if (Variables.getNumElements() == 0) continue;
Eric Christopher4117bec2012-11-22 00:59:49 +0000884
Eric Christopherbdab8002012-11-27 00:13:51 +0000885 LexicalScope *Scope =
886 new LexicalScope(NULL, DIDescriptor(SP), NULL, false);
887 DeadFnScopeMap[SP] = Scope;
Eric Christopher4117bec2012-11-22 00:59:49 +0000888
Eric Christopherbdab8002012-11-27 00:13:51 +0000889 // Construct subprogram DIE and add variables DIEs.
890 CompileUnit *SPCU = CUMap.lookup(TheCU);
891 assert(SPCU && "Unable to find Compile Unit!");
892 constructSubprogramDIE(SPCU, SP);
893 DIE *ScopeDIE = SPCU->getDIE(SP);
894 for (unsigned vi = 0, ve = Variables.getNumElements(); vi != ve; ++vi) {
895 DIVariable DV(Variables.getElement(vi));
896 if (!DV.Verify()) continue;
897 DbgVariable *NewVar = new DbgVariable(DV, NULL);
898 if (DIE *VariableDIE =
899 SPCU->constructVariableDIE(NewVar, Scope->isAbstractScope()))
900 ScopeDIE->addChild(VariableDIE);
901 }
Eric Christopher4117bec2012-11-22 00:59:49 +0000902 }
903 }
904 }
905 DeleteContainerSeconds(DeadFnScopeMap);
906}
907
908void DwarfDebug::finalizeModuleInfo() {
909 // Collect info for variables that were optimized out.
910 collectDeadVariables();
911
912 // Attach DW_AT_inline attribute with inlined subprogram DIEs.
913 computeInlinedDIEs();
Devang Patel53bb5c92009-11-10 23:06:00 +0000914
Eric Christopher6635cad2012-08-01 18:19:01 +0000915 // Emit DW_AT_containing_type attribute to connect types with their
916 // vtable holding type.
Devang Pateldbc64af2011-08-15 17:24:54 +0000917 for (DenseMap<const MDNode *, CompileUnit *>::iterator CUI = CUMap.begin(),
Eric Christopherbdab8002012-11-27 00:13:51 +0000918 CUE = CUMap.end(); CUI != CUE; ++CUI) {
Devang Pateldbc64af2011-08-15 17:24:54 +0000919 CompileUnit *TheCU = CUI->second;
920 TheCU->constructContainingTypeDIEs();
Devang Patel5d11eb02009-12-03 19:11:07 +0000921 }
922
Eric Christopher4117bec2012-11-22 00:59:49 +0000923 // Compute DIE offsets and sizes.
Eric Christopher0e3e9b72012-12-10 23:34:43 +0000924 InfoHolder.computeSizeAndOffsets();
925 if (useSplitDwarf())
926 SkeletonHolder.computeSizeAndOffsets();
Eric Christopher4117bec2012-11-22 00:59:49 +0000927}
928
929void DwarfDebug::endSections() {
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000930 // Standard sections final addresses.
Chris Lattner6c2f9e12009-08-19 05:49:37 +0000931 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getTextSection());
Chris Lattnerc0215722010-04-04 19:25:43 +0000932 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("text_end"));
Chris Lattner6c2f9e12009-08-19 05:49:37 +0000933 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getDataSection());
Chris Lattnerc0215722010-04-04 19:25:43 +0000934 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("data_end"));
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000935
936 // End text sections.
Benjamin Kramerb4c9d9c2012-10-31 13:45:49 +0000937 for (unsigned I = 0, E = SectionMap.size(); I != E; ++I) {
938 Asm->OutStreamer.SwitchSection(SectionMap[I]);
939 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("section_end", I+1));
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000940 }
Eric Christopher4117bec2012-11-22 00:59:49 +0000941}
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000942
Eric Christopherb6dc8652012-11-27 22:43:45 +0000943// Emit all Dwarf sections that should come after the content.
Eric Christopher4117bec2012-11-22 00:59:49 +0000944void DwarfDebug::endModule() {
945
946 if (!FirstCU) return;
947
948 // End any existing sections.
949 // TODO: Does this need to happen?
950 endSections();
951
952 // Finalize the debug info for the module.
953 finalizeModuleInfo();
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000954
Eric Christopher97c34722012-11-19 19:43:59 +0000955 // Emit initial sections.
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000956 emitSectionLabels();
Eric Christopher97c34722012-11-19 19:43:59 +0000957
Eric Christopher4daaed12012-12-10 19:51:21 +0000958 if (!useSplitDwarf()) {
Eric Christopher42885022012-11-27 22:43:42 +0000959 // Emit all the DIEs into a debug info section.
960 emitDebugInfo();
Eric Christopher74802f72012-11-27 00:41:54 +0000961
Eric Christopher42885022012-11-27 22:43:42 +0000962 // Corresponding abbreviations into a abbrev section.
963 emitAbbreviations();
964
965 // Emit info into a debug loc section.
966 emitDebugLoc();
967
968 // Emit info into a debug aranges section.
969 emitDebugARanges();
970
971 // Emit info into a debug ranges section.
972 emitDebugRanges();
973
974 // Emit info into a debug macinfo section.
975 emitDebugMacInfo();
976
977 // Emit inline info.
978 // TODO: When we don't need the option anymore we
979 // can remove all of the code that this section
980 // depends upon.
981 if (useDarwinGDBCompat())
982 emitDebugInlineInfo();
983 } else {
Eric Christopher0b944ee2012-12-11 19:42:09 +0000984 // TODO: Fill this in for separated debug sections and separate
Eric Christopher42885022012-11-27 22:43:42 +0000985 // out information into new sections.
986
Eric Christopher98e237f2012-11-30 23:59:06 +0000987 // Emit the debug info section and compile units.
Eric Christopher42885022012-11-27 22:43:42 +0000988 emitDebugInfo();
Eric Christopher98e237f2012-11-30 23:59:06 +0000989 emitDebugInfoDWO();
Eric Christopher42885022012-11-27 22:43:42 +0000990
991 // Corresponding abbreviations into a abbrev section.
992 emitAbbreviations();
Eric Christopher6eebe472012-12-19 22:02:53 +0000993 emitDebugAbbrevDWO();
Eric Christopher42885022012-11-27 22:43:42 +0000994
995 // Emit info into a debug loc section.
996 emitDebugLoc();
997
998 // Emit info into a debug aranges section.
999 emitDebugARanges();
1000
1001 // Emit info into a debug ranges section.
1002 emitDebugRanges();
1003
1004 // Emit info into a debug macinfo section.
1005 emitDebugMacInfo();
1006
Eric Christopher72f7bfb2013-01-15 23:56:56 +00001007 // Emit DWO addresses.
1008 InfoHolder.emitAddresses(Asm->getObjFileLowering().getDwarfAddrSection());
1009
Eric Christopher42885022012-11-27 22:43:42 +00001010 // Emit inline info.
1011 // TODO: When we don't need the option anymore we
1012 // can remove all of the code that this section
1013 // depends upon.
1014 if (useDarwinGDBCompat())
1015 emitDebugInlineInfo();
1016 }
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001017
Eric Christopher9d9f5a52012-08-23 07:32:06 +00001018 // Emit info into the dwarf accelerator table sections.
Eric Christopher20f47ab2012-08-23 22:36:40 +00001019 if (useDwarfAccelTables()) {
Eric Christopher09ac3d82011-11-07 09:24:32 +00001020 emitAccelNames();
1021 emitAccelObjC();
1022 emitAccelNamespaces();
1023 emitAccelTypes();
1024 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001025
Devang Patel193f7202009-11-24 01:14:22 +00001026 // Emit info into a debug pubtypes section.
Eric Christopher360f0062012-08-23 07:10:56 +00001027 // TODO: When we don't need the option anymore we can
1028 // remove all of the code that adds to the table.
Eric Christopher20f47ab2012-08-23 22:36:40 +00001029 if (useDarwinGDBCompat())
Eric Christopher360f0062012-08-23 07:10:56 +00001030 emitDebugPubTypes();
Devang Patel193f7202009-11-24 01:14:22 +00001031
Eric Christopher42885022012-11-27 22:43:42 +00001032 // Finally emit string information into a string table.
Eric Christopherfcdbecb2012-11-27 06:49:23 +00001033 emitDebugStr();
Eric Christopher64f824c2012-12-27 02:14:01 +00001034 if (useSplitDwarf())
1035 emitDebugStrDWO();
Eric Christopherfcdbecb2012-11-27 06:49:23 +00001036
Devang Patele9a1cca2010-08-02 17:32:15 +00001037 // clean up.
Devang Patel94c7ddb2011-08-16 22:09:43 +00001038 SPMap.clear();
Devang Patel163a9f72010-05-10 22:49:55 +00001039 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
1040 E = CUMap.end(); I != E; ++I)
1041 delete I->second;
Eric Christopher9ec87b32012-12-10 19:51:18 +00001042
Eric Christopher4daaed12012-12-10 19:51:21 +00001043 delete SkeletonCU;
Eric Christopher9ec87b32012-12-10 19:51:18 +00001044
Eric Christopher98e237f2012-11-30 23:59:06 +00001045 // Reset these for the next Module if we have one.
1046 FirstCU = NULL;
Eric Christopher4daaed12012-12-10 19:51:21 +00001047 SkeletonCU = NULL;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001048}
1049
Eric Christopherb6dc8652012-11-27 22:43:45 +00001050// Find abstract variable, if any, associated with Var.
Devang Patelb549bcf2011-08-10 21:50:54 +00001051DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &DV,
Chris Lattnerde4845c2010-04-02 19:42:39 +00001052 DebugLoc ScopeLoc) {
Devang Patelb549bcf2011-08-10 21:50:54 +00001053 LLVMContext &Ctx = DV->getContext();
1054 // More then one inlined variable corresponds to one abstract variable.
1055 DIVariable Var = cleanseInlinedVariable(DV, Ctx);
Devang Patel2db49d72010-05-07 18:11:54 +00001056 DbgVariable *AbsDbgVariable = AbstractVariables.lookup(Var);
Devang Patel53bb5c92009-11-10 23:06:00 +00001057 if (AbsDbgVariable)
1058 return AbsDbgVariable;
1059
Devang Patelbf47fdb2011-08-10 20:55:27 +00001060 LexicalScope *Scope = LScopes.findAbstractScope(ScopeLoc.getScope(Ctx));
Devang Patel53bb5c92009-11-10 23:06:00 +00001061 if (!Scope)
1062 return NULL;
1063
Devang Patel5a1a67c2011-08-15 19:01:20 +00001064 AbsDbgVariable = new DbgVariable(Var, NULL);
Devang Patelbf47fdb2011-08-10 20:55:27 +00001065 addScopeVariable(Scope, AbsDbgVariable);
Devang Patel2db49d72010-05-07 18:11:54 +00001066 AbstractVariables[Var] = AbsDbgVariable;
Devang Patel53bb5c92009-11-10 23:06:00 +00001067 return AbsDbgVariable;
1068}
1069
Eric Christopherb6dc8652012-11-27 22:43:45 +00001070// If Var is a current function argument then add it to CurrentFnArguments list.
Devang Patel0478c152011-03-01 22:58:55 +00001071bool DwarfDebug::addCurrentFnArgument(const MachineFunction *MF,
Devang Patelbf47fdb2011-08-10 20:55:27 +00001072 DbgVariable *Var, LexicalScope *Scope) {
1073 if (!LScopes.isCurrentFunctionScope(Scope))
Devang Patel0478c152011-03-01 22:58:55 +00001074 return false;
1075 DIVariable DV = Var->getVariable();
1076 if (DV.getTag() != dwarf::DW_TAG_arg_variable)
1077 return false;
1078 unsigned ArgNo = DV.getArgNumber();
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001079 if (ArgNo == 0)
Devang Patel0478c152011-03-01 22:58:55 +00001080 return false;
1081
Devang Patelcb3a6572011-03-03 20:02:02 +00001082 size_t Size = CurrentFnArguments.size();
1083 if (Size == 0)
Devang Patel0478c152011-03-01 22:58:55 +00001084 CurrentFnArguments.resize(MF->getFunction()->arg_size());
Devang Patelbbd0f452011-03-03 21:49:41 +00001085 // llvm::Function argument size is not good indicator of how many
Devang Patel6f676be2011-03-03 20:08:10 +00001086 // arguments does the function have at source level.
1087 if (ArgNo > Size)
Devang Patelcb3a6572011-03-03 20:02:02 +00001088 CurrentFnArguments.resize(ArgNo * 2);
Devang Patel0478c152011-03-01 22:58:55 +00001089 CurrentFnArguments[ArgNo - 1] = Var;
1090 return true;
1091}
1092
Eric Christopherb6dc8652012-11-27 22:43:45 +00001093// Collect variable information from side table maintained by MMI.
Jim Grosbach1e20b962010-07-21 21:21:52 +00001094void
Nick Lewycky3bbb6f72011-07-29 03:49:23 +00001095DwarfDebug::collectVariableInfoFromMMITable(const MachineFunction *MF,
Devang Patelee432862010-05-20 19:57:06 +00001096 SmallPtrSet<const MDNode *, 16> &Processed) {
Devang Patele717faa2009-10-06 01:26:37 +00001097 MachineModuleInfo::VariableDbgInfoMapTy &VMap = MMI->getVariableDbgInfo();
1098 for (MachineModuleInfo::VariableDbgInfoMapTy::iterator VI = VMap.begin(),
1099 VE = VMap.end(); VI != VE; ++VI) {
Devang Patele9f8f5e2010-05-07 20:54:48 +00001100 const MDNode *Var = VI->first;
Devang Patel53bb5c92009-11-10 23:06:00 +00001101 if (!Var) continue;
Devang Patel98e1cac2010-05-14 21:01:35 +00001102 Processed.insert(Var);
Chris Lattnerde4845c2010-04-02 19:42:39 +00001103 DIVariable DV(Var);
1104 const std::pair<unsigned, DebugLoc> &VP = VI->second;
Devang Patel53bb5c92009-11-10 23:06:00 +00001105
Devang Patelbf47fdb2011-08-10 20:55:27 +00001106 LexicalScope *Scope = LScopes.findLexicalScope(VP.second);
Jim Grosbach1e20b962010-07-21 21:21:52 +00001107
Devang Patelfb0ee432009-11-10 23:20:04 +00001108 // If variable scope is not found then skip this variable.
Chris Lattnerde4845c2010-04-02 19:42:39 +00001109 if (Scope == 0)
Devang Patelfb0ee432009-11-10 23:20:04 +00001110 continue;
Devang Patel53bb5c92009-11-10 23:06:00 +00001111
Devang Patel26c1e562010-05-20 16:36:41 +00001112 DbgVariable *AbsDbgVariable = findAbstractVariable(DV, VP.second);
Devang Patel5a1a67c2011-08-15 19:01:20 +00001113 DbgVariable *RegVar = new DbgVariable(DV, AbsDbgVariable);
Devang Patelff9dd0a2011-08-15 21:24:36 +00001114 RegVar->setFrameIndex(VP.first);
Devang Patel0478c152011-03-01 22:58:55 +00001115 if (!addCurrentFnArgument(MF, RegVar, Scope))
Devang Patelbf47fdb2011-08-10 20:55:27 +00001116 addScopeVariable(Scope, RegVar);
Devang Patel5a1a67c2011-08-15 19:01:20 +00001117 if (AbsDbgVariable)
Devang Patelff9dd0a2011-08-15 21:24:36 +00001118 AbsDbgVariable->setFrameIndex(VP.first);
Devang Patele717faa2009-10-06 01:26:37 +00001119 }
Devang Patelee432862010-05-20 19:57:06 +00001120}
Devang Patel90a48ad2010-03-15 18:33:46 +00001121
Eric Christopherb6dc8652012-11-27 22:43:45 +00001122// Return true if debug value, encoded by DBG_VALUE instruction, is in a
1123// defined reg.
Devang Patelc3f5f782010-05-25 23:40:22 +00001124static bool isDbgValueInDefinedReg(const MachineInstr *MI) {
Nick Lewycky746cb672011-10-26 22:55:33 +00001125 assert(MI->isDebugValue() && "Invalid DBG_VALUE machine instruction!");
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001126 return MI->getNumOperands() == 3 &&
1127 MI->getOperand(0).isReg() && MI->getOperand(0).getReg() &&
1128 MI->getOperand(1).isImm() && MI->getOperand(1).getImm() == 0;
Devang Patelc3f5f782010-05-25 23:40:22 +00001129}
1130
Eric Christopherb6dc8652012-11-27 22:43:45 +00001131// Get .debug_loc entry for the instruction range starting at MI.
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001132static DotDebugLocEntry getDebugLocEntry(AsmPrinter *Asm,
1133 const MCSymbol *FLabel,
Devang Patel90b40412011-07-08 17:09:57 +00001134 const MCSymbol *SLabel,
1135 const MachineInstr *MI) {
1136 const MDNode *Var = MI->getOperand(MI->getNumOperands() - 1).getMetadata();
1137
1138 if (MI->getNumOperands() != 3) {
1139 MachineLocation MLoc = Asm->getDebugValueLocation(MI);
1140 return DotDebugLocEntry(FLabel, SLabel, MLoc, Var);
1141 }
1142 if (MI->getOperand(0).isReg() && MI->getOperand(1).isImm()) {
1143 MachineLocation MLoc;
1144 MLoc.set(MI->getOperand(0).getReg(), MI->getOperand(1).getImm());
1145 return DotDebugLocEntry(FLabel, SLabel, MLoc, Var);
1146 }
1147 if (MI->getOperand(0).isImm())
1148 return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getImm());
1149 if (MI->getOperand(0).isFPImm())
1150 return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getFPImm());
1151 if (MI->getOperand(0).isCImm())
1152 return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getCImm());
1153
Craig Topper5e25ee82012-02-05 08:31:47 +00001154 llvm_unreachable("Unexpected 3 operand DBG_VALUE instruction!");
Devang Patel90b40412011-07-08 17:09:57 +00001155}
1156
Eric Christopherb6dc8652012-11-27 22:43:45 +00001157// Find variables for each lexical scope.
Jim Grosbach1e20b962010-07-21 21:21:52 +00001158void
Devang Patel78e127d2010-06-25 22:07:34 +00001159DwarfDebug::collectVariableInfo(const MachineFunction *MF,
1160 SmallPtrSet<const MDNode *, 16> &Processed) {
Jim Grosbach1e20b962010-07-21 21:21:52 +00001161
Eric Christopherb6dc8652012-11-27 22:43:45 +00001162 // collection info from MMI table.
Devang Patelee432862010-05-20 19:57:06 +00001163 collectVariableInfoFromMMITable(MF, Processed);
1164
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001165 for (SmallVectorImpl<const MDNode*>::const_iterator
1166 UVI = UserVariables.begin(), UVE = UserVariables.end(); UVI != UVE;
1167 ++UVI) {
1168 const MDNode *Var = *UVI;
1169 if (Processed.count(Var))
Devang Patelee432862010-05-20 19:57:06 +00001170 continue;
1171
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001172 // History contains relevant DBG_VALUE instructions for Var and instructions
1173 // clobbering it.
1174 SmallVectorImpl<const MachineInstr*> &History = DbgValues[Var];
1175 if (History.empty())
1176 continue;
1177 const MachineInstr *MInsn = History.front();
Devang Patelc3f5f782010-05-25 23:40:22 +00001178
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001179 DIVariable DV(Var);
Devang Patelbf47fdb2011-08-10 20:55:27 +00001180 LexicalScope *Scope = NULL;
Devang Pateld8720f42010-05-27 20:25:04 +00001181 if (DV.getTag() == dwarf::DW_TAG_arg_variable &&
1182 DISubprogram(DV.getContext()).describes(MF->getFunction()))
Devang Patelbf47fdb2011-08-10 20:55:27 +00001183 Scope = LScopes.getCurrentFunctionScope();
Devang Patel40c7e412011-07-20 22:18:50 +00001184 else {
1185 if (DV.getVersion() <= LLVMDebugVersion9)
Devang Patelbf47fdb2011-08-10 20:55:27 +00001186 Scope = LScopes.findLexicalScope(MInsn->getDebugLoc());
Devang Patel40c7e412011-07-20 22:18:50 +00001187 else {
1188 if (MDNode *IA = DV.getInlinedAt())
Devang Patelbf47fdb2011-08-10 20:55:27 +00001189 Scope = LScopes.findInlinedScope(DebugLoc::getFromDILocation(IA));
Devang Patel40c7e412011-07-20 22:18:50 +00001190 else
Devang Patelbf47fdb2011-08-10 20:55:27 +00001191 Scope = LScopes.findLexicalScope(cast<MDNode>(DV->getOperand(1)));
Devang Patel40c7e412011-07-20 22:18:50 +00001192 }
1193 }
Devang Patelee432862010-05-20 19:57:06 +00001194 // If variable scope is not found then skip this variable.
Devang Patelc0c5a262010-05-21 00:10:20 +00001195 if (!Scope)
Devang Patelee432862010-05-20 19:57:06 +00001196 continue;
1197
1198 Processed.insert(DV);
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001199 assert(MInsn->isDebugValue() && "History must begin with debug value");
Devang Patel5a1a67c2011-08-15 19:01:20 +00001200 DbgVariable *AbsVar = findAbstractVariable(DV, MInsn->getDebugLoc());
1201 DbgVariable *RegVar = new DbgVariable(DV, AbsVar);
Devang Patel0478c152011-03-01 22:58:55 +00001202 if (!addCurrentFnArgument(MF, RegVar, Scope))
Devang Patelbf47fdb2011-08-10 20:55:27 +00001203 addScopeVariable(Scope, RegVar);
Devang Patel5a1a67c2011-08-15 19:01:20 +00001204 if (AbsVar)
Devang Patelff9dd0a2011-08-15 21:24:36 +00001205 AbsVar->setMInsn(MInsn);
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001206
Eric Christopherc56e3f02012-10-08 20:48:54 +00001207 // Simplify ranges that are fully coalesced.
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001208 if (History.size() <= 1 || (History.size() == 2 &&
1209 MInsn->isIdenticalTo(History.back()))) {
Devang Patelff9dd0a2011-08-15 21:24:36 +00001210 RegVar->setMInsn(MInsn);
Devang Patelc3f5f782010-05-25 23:40:22 +00001211 continue;
1212 }
1213
Eric Christopher498703b2013-01-28 17:33:26 +00001214 // Handle multiple DBG_VALUE instructions describing one variable.
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001215 RegVar->setDotDebugLocOffset(DotDebugLocEntries.size());
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001216
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001217 for (SmallVectorImpl<const MachineInstr*>::const_iterator
1218 HI = History.begin(), HE = History.end(); HI != HE; ++HI) {
1219 const MachineInstr *Begin = *HI;
1220 assert(Begin->isDebugValue() && "Invalid History entry");
Jakob Stoklund Olesene17232e2011-03-22 00:21:41 +00001221
Devang Patel4ada1d72011-06-01 23:00:17 +00001222 // Check if DBG_VALUE is truncating a range.
1223 if (Begin->getNumOperands() > 1 && Begin->getOperand(0).isReg()
1224 && !Begin->getOperand(0).getReg())
1225 continue;
1226
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001227 // Compute the range for a register location.
1228 const MCSymbol *FLabel = getLabelBeforeInsn(Begin);
1229 const MCSymbol *SLabel = 0;
1230
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001231 if (HI + 1 == HE)
1232 // If Begin is the last instruction in History then its value is valid
Chris Lattner7a2bdde2011-04-15 05:18:47 +00001233 // until the end of the function.
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001234 SLabel = FunctionEndSym;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001235 else {
1236 const MachineInstr *End = HI[1];
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001237 DEBUG(dbgs() << "DotDebugLoc Pair:\n"
Devang Patel476df5f2011-07-07 21:44:42 +00001238 << "\t" << *Begin << "\t" << *End << "\n");
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001239 if (End->isDebugValue())
1240 SLabel = getLabelBeforeInsn(End);
1241 else {
1242 // End is a normal instruction clobbering the range.
1243 SLabel = getLabelAfterInsn(End);
1244 assert(SLabel && "Forgot label after clobber instruction");
1245 ++HI;
1246 }
1247 }
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001248
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001249 // The value is valid until the next DBG_VALUE or clobber.
Eric Christopherabbb2002011-12-16 23:42:31 +00001250 DotDebugLocEntries.push_back(getDebugLocEntry(Asm, FLabel, SLabel,
1251 Begin));
Devang Patelc3f5f782010-05-25 23:40:22 +00001252 }
1253 DotDebugLocEntries.push_back(DotDebugLocEntry());
Devang Patel90a48ad2010-03-15 18:33:46 +00001254 }
Devang Patel98e1cac2010-05-14 21:01:35 +00001255
1256 // Collect info for variables that were optimized out.
Devang Patel93d39be2011-08-19 23:28:12 +00001257 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
1258 DIArray Variables = DISubprogram(FnScope->getScopeNode()).getVariables();
1259 for (unsigned i = 0, e = Variables.getNumElements(); i != e; ++i) {
1260 DIVariable DV(Variables.getElement(i));
1261 if (!DV || !DV.Verify() || !Processed.insert(DV))
1262 continue;
1263 if (LexicalScope *Scope = LScopes.findLexicalScope(DV.getContext()))
1264 addScopeVariable(Scope, new DbgVariable(DV, NULL));
Devang Patel98e1cac2010-05-14 21:01:35 +00001265 }
Devang Patelc3f5f782010-05-25 23:40:22 +00001266}
Devang Patel98e1cac2010-05-14 21:01:35 +00001267
Eric Christopherb6dc8652012-11-27 22:43:45 +00001268// Return Label preceding the instruction.
Eric Christopher72f7bfb2013-01-15 23:56:56 +00001269MCSymbol *DwarfDebug::getLabelBeforeInsn(const MachineInstr *MI) {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001270 MCSymbol *Label = LabelsBeforeInsn.lookup(MI);
1271 assert(Label && "Didn't insert label before instruction");
1272 return Label;
Devang Patelc3f5f782010-05-25 23:40:22 +00001273}
1274
Eric Christopherb6dc8652012-11-27 22:43:45 +00001275// Return Label immediately following the instruction.
Eric Christopher72f7bfb2013-01-15 23:56:56 +00001276MCSymbol *DwarfDebug::getLabelAfterInsn(const MachineInstr *MI) {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001277 return LabelsAfterInsn.lookup(MI);
Devang Patele717faa2009-10-06 01:26:37 +00001278}
1279
Eric Christopherb6dc8652012-11-27 22:43:45 +00001280// Process beginning of an instruction.
Devang Patelcbbe2872010-10-26 17:49:02 +00001281void DwarfDebug::beginInstruction(const MachineInstr *MI) {
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001282 // Check if source location changes, but ignore DBG_VALUE locations.
1283 if (!MI->isDebugValue()) {
1284 DebugLoc DL = MI->getDebugLoc();
1285 if (DL != PrevInstLoc && (!DL.isUnknown() || UnknownLocations)) {
Eric Christopher60b35f42012-04-05 20:39:05 +00001286 unsigned Flags = 0;
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001287 PrevInstLoc = DL;
Devang Patel4243e672011-05-11 19:22:19 +00001288 if (DL == PrologEndLoc) {
1289 Flags |= DWARF2_FLAG_PROLOGUE_END;
1290 PrologEndLoc = DebugLoc();
1291 }
Eric Christopher60b35f42012-04-05 20:39:05 +00001292 if (PrologEndLoc.isUnknown())
1293 Flags |= DWARF2_FLAG_IS_STMT;
1294
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001295 if (!DL.isUnknown()) {
1296 const MDNode *Scope = DL.getScope(Asm->MF->getFunction()->getContext());
Devang Patel4243e672011-05-11 19:22:19 +00001297 recordSourceLine(DL.getLine(), DL.getCol(), Scope, Flags);
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001298 } else
Devang Patel4243e672011-05-11 19:22:19 +00001299 recordSourceLine(0, 0, 0, 0);
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001300 }
Devang Patelc3f5f782010-05-25 23:40:22 +00001301 }
Devang Patelaead63c2010-03-29 22:59:58 +00001302
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001303 // Insert labels where requested.
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001304 DenseMap<const MachineInstr*, MCSymbol*>::iterator I =
1305 LabelsBeforeInsn.find(MI);
1306
1307 // No label needed.
1308 if (I == LabelsBeforeInsn.end())
1309 return;
1310
1311 // Label already assigned.
1312 if (I->second)
Devang Patelb2b31a62010-05-26 19:37:24 +00001313 return;
Devang Patel553881b2010-03-29 17:20:31 +00001314
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001315 if (!PrevLabel) {
Devang Patel77051f52010-05-26 21:23:46 +00001316 PrevLabel = MMI->getContext().CreateTempSymbol();
1317 Asm->OutStreamer.EmitLabel(PrevLabel);
Devang Patelb2b31a62010-05-26 19:37:24 +00001318 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001319 I->second = PrevLabel;
Devang Patel0d20ac82009-10-06 01:50:42 +00001320}
1321
Eric Christopherb6dc8652012-11-27 22:43:45 +00001322// Process end of an instruction.
Devang Patelcbbe2872010-10-26 17:49:02 +00001323void DwarfDebug::endInstruction(const MachineInstr *MI) {
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001324 // Don't create a new label after DBG_VALUE instructions.
1325 // They don't generate code.
1326 if (!MI->isDebugValue())
1327 PrevLabel = 0;
1328
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001329 DenseMap<const MachineInstr*, MCSymbol*>::iterator I =
1330 LabelsAfterInsn.find(MI);
1331
1332 // No label needed.
1333 if (I == LabelsAfterInsn.end())
1334 return;
1335
1336 // Label already assigned.
1337 if (I->second)
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001338 return;
1339
1340 // We need a label after this instruction.
1341 if (!PrevLabel) {
1342 PrevLabel = MMI->getContext().CreateTempSymbol();
1343 Asm->OutStreamer.EmitLabel(PrevLabel);
Devang Patel1c246352010-04-08 16:50:29 +00001344 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001345 I->second = PrevLabel;
Devang Patel53bb5c92009-11-10 23:06:00 +00001346}
1347
Eric Christopherb6dc8652012-11-27 22:43:45 +00001348// Each LexicalScope has first instruction and last instruction to mark
1349// beginning and end of a scope respectively. Create an inverse map that list
1350// scopes starts (and ends) with an instruction. One instruction may start (or
1351// end) multiple scopes. Ignore scopes that are not reachable.
Devang Patele37b0c62010-04-08 18:43:56 +00001352void DwarfDebug::identifyScopeMarkers() {
Devang Patelbf47fdb2011-08-10 20:55:27 +00001353 SmallVector<LexicalScope *, 4> WorkList;
1354 WorkList.push_back(LScopes.getCurrentFunctionScope());
Devang Patel42aafd72010-01-20 02:05:23 +00001355 while (!WorkList.empty()) {
Devang Patelbf47fdb2011-08-10 20:55:27 +00001356 LexicalScope *S = WorkList.pop_back_val();
Jim Grosbach1e20b962010-07-21 21:21:52 +00001357
Devang Patelbf47fdb2011-08-10 20:55:27 +00001358 const SmallVector<LexicalScope *, 4> &Children = S->getChildren();
Jim Grosbach1e20b962010-07-21 21:21:52 +00001359 if (!Children.empty())
Devang Patelbf47fdb2011-08-10 20:55:27 +00001360 for (SmallVector<LexicalScope *, 4>::const_iterator SI = Children.begin(),
Devang Patel42aafd72010-01-20 02:05:23 +00001361 SE = Children.end(); SI != SE; ++SI)
1362 WorkList.push_back(*SI);
1363
Devang Patel53bb5c92009-11-10 23:06:00 +00001364 if (S->isAbstractScope())
1365 continue;
Jim Grosbach1e20b962010-07-21 21:21:52 +00001366
Devang Patelbf47fdb2011-08-10 20:55:27 +00001367 const SmallVector<InsnRange, 4> &Ranges = S->getRanges();
Devang Pateleac9c072010-04-27 19:46:33 +00001368 if (Ranges.empty())
1369 continue;
Devang Patelbf47fdb2011-08-10 20:55:27 +00001370 for (SmallVector<InsnRange, 4>::const_iterator RI = Ranges.begin(),
Devang Pateleac9c072010-04-27 19:46:33 +00001371 RE = Ranges.end(); RI != RE; ++RI) {
Devang Patelbf47fdb2011-08-10 20:55:27 +00001372 assert(RI->first && "InsnRange does not have first instruction!");
1373 assert(RI->second && "InsnRange does not have second instruction!");
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001374 requestLabelBeforeInsn(RI->first);
1375 requestLabelAfterInsn(RI->second);
Devang Pateleac9c072010-04-27 19:46:33 +00001376 }
Devang Patelaf9e8472009-10-01 20:31:14 +00001377 }
Devang Patelaf9e8472009-10-01 20:31:14 +00001378}
1379
Eric Christopherb6dc8652012-11-27 22:43:45 +00001380// Get MDNode for DebugLoc's scope.
Devang Patela3f48672011-05-09 22:14:49 +00001381static MDNode *getScopeNode(DebugLoc DL, const LLVMContext &Ctx) {
1382 if (MDNode *InlinedAt = DL.getInlinedAt(Ctx))
1383 return getScopeNode(DebugLoc::getFromDILocation(InlinedAt), Ctx);
1384 return DL.getScope(Ctx);
1385}
1386
Eric Christopherb6dc8652012-11-27 22:43:45 +00001387// Walk up the scope chain of given debug loc and find line number info
1388// for the function.
Devang Patel4243e672011-05-11 19:22:19 +00001389static DebugLoc getFnDebugLoc(DebugLoc DL, const LLVMContext &Ctx) {
1390 const MDNode *Scope = getScopeNode(DL, Ctx);
1391 DISubprogram SP = getDISubprogram(Scope);
Eric Christopher6126a1e2012-04-03 00:43:49 +00001392 if (SP.Verify()) {
1393 // Check for number of operands since the compatibility is
1394 // cheap here.
Eric Christopherfa5b0502012-04-03 17:55:42 +00001395 if (SP->getNumOperands() > 19)
Eric Christopher6126a1e2012-04-03 00:43:49 +00001396 return DebugLoc::get(SP.getScopeLineNumber(), 0, SP);
1397 else
1398 return DebugLoc::get(SP.getLineNumber(), 0, SP);
1399 }
1400
Devang Patel4243e672011-05-11 19:22:19 +00001401 return DebugLoc();
1402}
1403
Eric Christopherb6dc8652012-11-27 22:43:45 +00001404// Gather pre-function debug information. Assumes being called immediately
1405// after the function entry point has been emitted.
Chris Lattnereec791a2010-01-26 23:18:02 +00001406void DwarfDebug::beginFunction(const MachineFunction *MF) {
Chris Lattner994cb122010-04-05 03:52:55 +00001407 if (!MMI->hasDebugInfo()) return;
Devang Patelbf47fdb2011-08-10 20:55:27 +00001408 LScopes.initialize(*MF);
1409 if (LScopes.empty()) return;
1410 identifyScopeMarkers();
Devang Patel60b35bd2009-10-06 18:37:31 +00001411
Manman Ren43213cf2013-02-05 21:52:47 +00001412 // Set DwarfCompileUnitID in MCContext to the Compile Unit this function
1413 // belongs to.
1414 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
1415 CompileUnit *TheCU = SPMap.lookup(FnScope->getScopeNode());
1416 assert(TheCU && "Unable to find compile unit!");
1417 Asm->OutStreamer.getContext().setDwarfCompileUnitID(TheCU->getUniqueID());
1418
Devang Pateleac9c072010-04-27 19:46:33 +00001419 FunctionBeginSym = Asm->GetTempSymbol("func_begin",
1420 Asm->getFunctionNumber());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001421 // Assumes in correct section after the entry point.
Devang Pateleac9c072010-04-27 19:46:33 +00001422 Asm->OutStreamer.EmitLabel(FunctionBeginSym);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001423
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001424 assert(UserVariables.empty() && DbgValues.empty() && "Maps weren't cleaned");
1425
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001426 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
Eric Christopherb6dc8652012-11-27 22:43:45 +00001427 // LiveUserVar - Map physreg numbers to the MDNode they contain.
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001428 std::vector<const MDNode*> LiveUserVar(TRI->getNumRegs());
1429
Devang Patelb2b31a62010-05-26 19:37:24 +00001430 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001431 I != E; ++I) {
1432 bool AtBlockEntry = true;
Devang Patelb2b31a62010-05-26 19:37:24 +00001433 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
1434 II != IE; ++II) {
1435 const MachineInstr *MI = II;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001436
Devang Patelb2b31a62010-05-26 19:37:24 +00001437 if (MI->isDebugValue()) {
Nick Lewycky746cb672011-10-26 22:55:33 +00001438 assert(MI->getNumOperands() > 1 && "Invalid machine instruction!");
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001439
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001440 // Keep track of user variables.
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001441 const MDNode *Var =
1442 MI->getOperand(MI->getNumOperands() - 1).getMetadata();
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001443
1444 // Variable is in a register, we need to check for clobbers.
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001445 if (isDbgValueInDefinedReg(MI))
1446 LiveUserVar[MI->getOperand(0).getReg()] = Var;
1447
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001448 // Check the history of this variable.
1449 SmallVectorImpl<const MachineInstr*> &History = DbgValues[Var];
1450 if (History.empty()) {
1451 UserVariables.push_back(Var);
1452 // The first mention of a function argument gets the FunctionBeginSym
1453 // label, so arguments are visible when breaking at function entry.
1454 DIVariable DV(Var);
1455 if (DV.Verify() && DV.getTag() == dwarf::DW_TAG_arg_variable &&
1456 DISubprogram(getDISubprogram(DV.getContext()))
1457 .describes(MF->getFunction()))
1458 LabelsBeforeInsn[MI] = FunctionBeginSym;
1459 } else {
1460 // We have seen this variable before. Try to coalesce DBG_VALUEs.
1461 const MachineInstr *Prev = History.back();
1462 if (Prev->isDebugValue()) {
1463 // Coalesce identical entries at the end of History.
1464 if (History.size() >= 2 &&
Devang Patel79862892011-07-07 00:14:27 +00001465 Prev->isIdenticalTo(History[History.size() - 2])) {
Eric Christopher02c1a642012-10-08 20:48:49 +00001466 DEBUG(dbgs() << "Coalescing identical DBG_VALUE entries:\n"
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001467 << "\t" << *Prev
Devang Patel79862892011-07-07 00:14:27 +00001468 << "\t" << *History[History.size() - 2] << "\n");
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001469 History.pop_back();
Devang Patel79862892011-07-07 00:14:27 +00001470 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001471
1472 // Terminate old register assignments that don't reach MI;
1473 MachineFunction::const_iterator PrevMBB = Prev->getParent();
1474 if (PrevMBB != I && (!AtBlockEntry || llvm::next(PrevMBB) != I) &&
1475 isDbgValueInDefinedReg(Prev)) {
1476 // Previous register assignment needs to terminate at the end of
1477 // its basic block.
1478 MachineBasicBlock::const_iterator LastMI =
1479 PrevMBB->getLastNonDebugInstr();
Devang Patel79862892011-07-07 00:14:27 +00001480 if (LastMI == PrevMBB->end()) {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001481 // Drop DBG_VALUE for empty range.
Eric Christopher02c1a642012-10-08 20:48:49 +00001482 DEBUG(dbgs() << "Dropping DBG_VALUE for empty range:\n"
Devang Patel79862892011-07-07 00:14:27 +00001483 << "\t" << *Prev << "\n");
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001484 History.pop_back();
Devang Patel79862892011-07-07 00:14:27 +00001485 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001486 else {
1487 // Terminate after LastMI.
1488 History.push_back(LastMI);
1489 }
1490 }
1491 }
1492 }
1493 History.push_back(MI);
Devang Patelb2b31a62010-05-26 19:37:24 +00001494 } else {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001495 // Not a DBG_VALUE instruction.
1496 if (!MI->isLabel())
1497 AtBlockEntry = false;
1498
Eric Christopher0313ced2012-10-04 20:46:14 +00001499 // First known non-DBG_VALUE and non-frame setup location marks
1500 // the beginning of the function body.
1501 if (!MI->getFlag(MachineInstr::FrameSetup) &&
1502 (PrologEndLoc.isUnknown() && !MI->getDebugLoc().isUnknown()))
Devang Patel4243e672011-05-11 19:22:19 +00001503 PrologEndLoc = MI->getDebugLoc();
1504
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001505 // Check if the instruction clobbers any registers with debug vars.
1506 for (MachineInstr::const_mop_iterator MOI = MI->operands_begin(),
1507 MOE = MI->operands_end(); MOI != MOE; ++MOI) {
1508 if (!MOI->isReg() || !MOI->isDef() || !MOI->getReg())
1509 continue;
Jakob Stoklund Olesen396618b2012-06-01 23:28:30 +00001510 for (MCRegAliasIterator AI(MOI->getReg(), TRI, true);
1511 AI.isValid(); ++AI) {
1512 unsigned Reg = *AI;
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001513 const MDNode *Var = LiveUserVar[Reg];
1514 if (!Var)
1515 continue;
1516 // Reg is now clobbered.
1517 LiveUserVar[Reg] = 0;
1518
1519 // Was MD last defined by a DBG_VALUE referring to Reg?
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001520 DbgValueHistoryMap::iterator HistI = DbgValues.find(Var);
1521 if (HistI == DbgValues.end())
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001522 continue;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001523 SmallVectorImpl<const MachineInstr*> &History = HistI->second;
1524 if (History.empty())
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001525 continue;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001526 const MachineInstr *Prev = History.back();
1527 // Sanity-check: Register assignments are terminated at the end of
1528 // their block.
1529 if (!Prev->isDebugValue() || Prev->getParent() != MI->getParent())
1530 continue;
1531 // Is the variable still in Reg?
1532 if (!isDbgValueInDefinedReg(Prev) ||
1533 Prev->getOperand(0).getReg() != Reg)
1534 continue;
1535 // Var is clobbered. Make sure the next instruction gets a label.
1536 History.push_back(MI);
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001537 }
1538 }
Devang Patelb2b31a62010-05-26 19:37:24 +00001539 }
Devang Patelb2b31a62010-05-26 19:37:24 +00001540 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001541 }
1542
1543 for (DbgValueHistoryMap::iterator I = DbgValues.begin(), E = DbgValues.end();
1544 I != E; ++I) {
1545 SmallVectorImpl<const MachineInstr*> &History = I->second;
1546 if (History.empty())
1547 continue;
1548
1549 // Make sure the final register assignments are terminated.
1550 const MachineInstr *Prev = History.back();
1551 if (Prev->isDebugValue() && isDbgValueInDefinedReg(Prev)) {
1552 const MachineBasicBlock *PrevMBB = Prev->getParent();
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001553 MachineBasicBlock::const_iterator LastMI =
Devang Patel5bc942c2011-08-10 23:58:09 +00001554 PrevMBB->getLastNonDebugInstr();
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001555 if (LastMI == PrevMBB->end())
1556 // Drop DBG_VALUE for empty range.
1557 History.pop_back();
1558 else {
1559 // Terminate after LastMI.
1560 History.push_back(LastMI);
1561 }
1562 }
1563 // Request labels for the full history.
1564 for (unsigned i = 0, e = History.size(); i != e; ++i) {
1565 const MachineInstr *MI = History[i];
1566 if (MI->isDebugValue())
1567 requestLabelBeforeInsn(MI);
1568 else
1569 requestLabelAfterInsn(MI);
1570 }
1571 }
Devang Patelb2b31a62010-05-26 19:37:24 +00001572
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001573 PrevInstLoc = DebugLoc();
Devang Patelb2b31a62010-05-26 19:37:24 +00001574 PrevLabel = FunctionBeginSym;
Devang Patel4243e672011-05-11 19:22:19 +00001575
1576 // Record beginning of function.
1577 if (!PrologEndLoc.isUnknown()) {
1578 DebugLoc FnStartDL = getFnDebugLoc(PrologEndLoc,
1579 MF->getFunction()->getContext());
1580 recordSourceLine(FnStartDL.getLine(), FnStartDL.getCol(),
1581 FnStartDL.getScope(MF->getFunction()->getContext()),
David Blaikie836cfc42012-12-04 22:02:33 +00001582 // We'd like to list the prologue as "not statements" but GDB behaves
1583 // poorly if we do that. Revisit this with caution/GDB (7.5+) testing.
David Blaikieb36c5312012-12-04 21:05:36 +00001584 DWARF2_FLAG_IS_STMT);
Devang Patel4243e672011-05-11 19:22:19 +00001585 }
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001586}
1587
Devang Patelbf47fdb2011-08-10 20:55:27 +00001588void DwarfDebug::addScopeVariable(LexicalScope *LS, DbgVariable *Var) {
1589// SmallVector<DbgVariable *, 8> &Vars = ScopeVariables.lookup(LS);
1590 ScopeVariables[LS].push_back(Var);
1591// Vars.push_back(Var);
1592}
1593
Eric Christopherb6dc8652012-11-27 22:43:45 +00001594// Gather and emit post-function debug information.
Chris Lattnereec791a2010-01-26 23:18:02 +00001595void DwarfDebug::endFunction(const MachineFunction *MF) {
Devang Patelbf47fdb2011-08-10 20:55:27 +00001596 if (!MMI->hasDebugInfo() || LScopes.empty()) return;
Devang Patel70d75ca2009-11-12 19:02:56 +00001597
Devang Patelbf47fdb2011-08-10 20:55:27 +00001598 // Define end label for subprogram.
1599 FunctionEndSym = Asm->GetTempSymbol("func_end",
1600 Asm->getFunctionNumber());
1601 // Assumes in correct section after the entry point.
1602 Asm->OutStreamer.EmitLabel(FunctionEndSym);
Manman Ren43213cf2013-02-05 21:52:47 +00001603 // Set DwarfCompileUnitID in MCContext to default value.
1604 Asm->OutStreamer.getContext().setDwarfCompileUnitID(0);
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001605
Devang Patelbf47fdb2011-08-10 20:55:27 +00001606 SmallPtrSet<const MDNode *, 16> ProcessedVars;
1607 collectVariableInfo(MF, ProcessedVars);
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001608
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001609 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
Devang Patel94c7ddb2011-08-16 22:09:43 +00001610 CompileUnit *TheCU = SPMap.lookup(FnScope->getScopeNode());
Nick Lewycky746cb672011-10-26 22:55:33 +00001611 assert(TheCU && "Unable to find compile unit!");
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001612
Devang Patelbf47fdb2011-08-10 20:55:27 +00001613 // Construct abstract scopes.
Devang Patelcd9f6c52011-08-12 18:10:19 +00001614 ArrayRef<LexicalScope *> AList = LScopes.getAbstractScopesList();
1615 for (unsigned i = 0, e = AList.size(); i != e; ++i) {
1616 LexicalScope *AScope = AList[i];
1617 DISubprogram SP(AScope->getScopeNode());
Devang Patelbf47fdb2011-08-10 20:55:27 +00001618 if (SP.Verify()) {
1619 // Collect info for variables that were optimized out.
Devang Patel93d39be2011-08-19 23:28:12 +00001620 DIArray Variables = SP.getVariables();
1621 for (unsigned i = 0, e = Variables.getNumElements(); i != e; ++i) {
1622 DIVariable DV(Variables.getElement(i));
1623 if (!DV || !DV.Verify() || !ProcessedVars.insert(DV))
1624 continue;
Alexey Samsonovb67bd332012-07-06 08:45:08 +00001625 // Check that DbgVariable for DV wasn't created earlier, when
1626 // findAbstractVariable() was called for inlined instance of DV.
1627 LLVMContext &Ctx = DV->getContext();
1628 DIVariable CleanDV = cleanseInlinedVariable(DV, Ctx);
1629 if (AbstractVariables.lookup(CleanDV))
1630 continue;
Devang Patel93d39be2011-08-19 23:28:12 +00001631 if (LexicalScope *Scope = LScopes.findAbstractScope(DV.getContext()))
1632 addScopeVariable(Scope, new DbgVariable(DV, NULL));
Devang Patel78e127d2010-06-25 22:07:34 +00001633 }
1634 }
Devang Patelcd9f6c52011-08-12 18:10:19 +00001635 if (ProcessedSPNodes.count(AScope->getScopeNode()) == 0)
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001636 constructScopeDIE(TheCU, AScope);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001637 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001638
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001639 DIE *CurFnDIE = constructScopeDIE(TheCU, FnScope);
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001640
Nick Lewycky8a8d4792011-12-02 22:16:29 +00001641 if (!MF->getTarget().Options.DisableFramePointerElim(*MF))
Eric Christopher873cf0a2012-08-24 01:14:27 +00001642 TheCU->addFlag(CurFnDIE, dwarf::DW_AT_APPLE_omit_frame_ptr);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001643
Devang Patelbf47fdb2011-08-10 20:55:27 +00001644 DebugFrames.push_back(FunctionDebugFrameInfo(Asm->getFunctionNumber(),
1645 MMI->getFrameMoves()));
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001646
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001647 // Clear debug info
Devang Patelbf47fdb2011-08-10 20:55:27 +00001648 for (DenseMap<LexicalScope *, SmallVector<DbgVariable *, 8> >::iterator
1649 I = ScopeVariables.begin(), E = ScopeVariables.end(); I != E; ++I)
1650 DeleteContainerPointers(I->second);
1651 ScopeVariables.clear();
Devang Pateleac0c9d2011-04-22 18:09:57 +00001652 DeleteContainerPointers(CurrentFnArguments);
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001653 UserVariables.clear();
1654 DbgValues.clear();
Jeffrey Yasskin5c213dc2010-03-12 17:45:06 +00001655 AbstractVariables.clear();
Devang Pateleac9c072010-04-27 19:46:33 +00001656 LabelsBeforeInsn.clear();
1657 LabelsAfterInsn.clear();
Devang Patelf2548ca2010-04-16 23:33:45 +00001658 PrevLabel = NULL;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001659}
1660
Eric Christopherb6dc8652012-11-27 22:43:45 +00001661// Register a source line with debug info. Returns the unique label that was
1662// emitted and which provides correspondence to the source line list.
Devang Patel4243e672011-05-11 19:22:19 +00001663void DwarfDebug::recordSourceLine(unsigned Line, unsigned Col, const MDNode *S,
1664 unsigned Flags) {
Devang Patel65dbc902009-11-25 17:36:49 +00001665 StringRef Fn;
Devang Patel23670e52011-03-24 20:30:50 +00001666 StringRef Dir;
Dan Gohman1cc0d622010-05-05 23:41:32 +00001667 unsigned Src = 1;
1668 if (S) {
1669 DIDescriptor Scope(S);
Devang Patelf84548d2009-10-05 18:03:19 +00001670
Dan Gohman1cc0d622010-05-05 23:41:32 +00001671 if (Scope.isCompileUnit()) {
1672 DICompileUnit CU(S);
Dan Gohman1cc0d622010-05-05 23:41:32 +00001673 Fn = CU.getFilename();
Devang Patel23670e52011-03-24 20:30:50 +00001674 Dir = CU.getDirectory();
Devang Patel3cabc9d2010-10-28 17:30:52 +00001675 } else if (Scope.isFile()) {
1676 DIFile F(S);
Devang Patel3cabc9d2010-10-28 17:30:52 +00001677 Fn = F.getFilename();
Devang Patel23670e52011-03-24 20:30:50 +00001678 Dir = F.getDirectory();
Dan Gohman1cc0d622010-05-05 23:41:32 +00001679 } else if (Scope.isSubprogram()) {
1680 DISubprogram SP(S);
Dan Gohman1cc0d622010-05-05 23:41:32 +00001681 Fn = SP.getFilename();
Devang Patel23670e52011-03-24 20:30:50 +00001682 Dir = SP.getDirectory();
Eric Christopher6618a242011-10-11 22:59:11 +00001683 } else if (Scope.isLexicalBlockFile()) {
1684 DILexicalBlockFile DBF(S);
1685 Fn = DBF.getFilename();
1686 Dir = DBF.getDirectory();
Dan Gohman1cc0d622010-05-05 23:41:32 +00001687 } else if (Scope.isLexicalBlock()) {
1688 DILexicalBlock DB(S);
Dan Gohman1cc0d622010-05-05 23:41:32 +00001689 Fn = DB.getFilename();
Devang Patel23670e52011-03-24 20:30:50 +00001690 Dir = DB.getDirectory();
Dan Gohman1cc0d622010-05-05 23:41:32 +00001691 } else
Craig Topper5e25ee82012-02-05 08:31:47 +00001692 llvm_unreachable("Unexpected scope info");
Dan Gohman1cc0d622010-05-05 23:41:32 +00001693
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001694 Src = getOrCreateSourceID(Fn, Dir);
Dan Gohman1cc0d622010-05-05 23:41:32 +00001695 }
Nick Lewycky3bbb6f72011-07-29 03:49:23 +00001696 Asm->OutStreamer.EmitDwarfLocDirective(Src, Line, Col, Flags, 0, 0, Fn);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001697}
1698
Bill Wendling829e67b2009-05-20 23:22:40 +00001699//===----------------------------------------------------------------------===//
1700// Emit Methods
1701//===----------------------------------------------------------------------===//
1702
Eric Christopherb6dc8652012-11-27 22:43:45 +00001703// Compute the size and offset of a DIE.
Jim Grosbach7ab38df2009-11-22 19:20:36 +00001704unsigned
Eric Christopher0e3e9b72012-12-10 23:34:43 +00001705DwarfUnits::computeSizeAndOffset(DIE *Die, unsigned Offset) {
Bill Wendling94d04b82009-05-20 23:21:38 +00001706 // Get the children.
1707 const std::vector<DIE *> &Children = Die->getChildren();
1708
Bill Wendling94d04b82009-05-20 23:21:38 +00001709 // Record the abbreviation.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001710 assignAbbrevNumber(Die->getAbbrev());
Bill Wendling94d04b82009-05-20 23:21:38 +00001711
1712 // Get the abbreviation for this DIE.
1713 unsigned AbbrevNumber = Die->getAbbrevNumber();
Eric Christopher0e3e9b72012-12-10 23:34:43 +00001714 const DIEAbbrev *Abbrev = Abbreviations->at(AbbrevNumber - 1);
Bill Wendling94d04b82009-05-20 23:21:38 +00001715
1716 // Set DIE offset
1717 Die->setOffset(Offset);
1718
1719 // Start the size with the size of abbreviation code.
Chris Lattneraf76e592009-08-22 20:48:53 +00001720 Offset += MCAsmInfo::getULEB128Size(AbbrevNumber);
Bill Wendling94d04b82009-05-20 23:21:38 +00001721
1722 const SmallVector<DIEValue*, 32> &Values = Die->getValues();
1723 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
1724
1725 // Size the DIE attribute values.
1726 for (unsigned i = 0, N = Values.size(); i < N; ++i)
1727 // Size attribute value.
Chris Lattnera37d5382010-04-05 00:18:22 +00001728 Offset += Values[i]->SizeOf(Asm, AbbrevData[i].getForm());
Bill Wendling94d04b82009-05-20 23:21:38 +00001729
1730 // Size the DIE children if any.
1731 if (!Children.empty()) {
1732 assert(Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes &&
1733 "Children flag not set");
1734
1735 for (unsigned j = 0, M = Children.size(); j < M; ++j)
Eric Christopherfbd19752012-11-20 22:14:13 +00001736 Offset = computeSizeAndOffset(Children[j], Offset);
Bill Wendling94d04b82009-05-20 23:21:38 +00001737
1738 // End of children marker.
1739 Offset += sizeof(int8_t);
1740 }
1741
1742 Die->setSize(Offset - Die->getOffset());
1743 return Offset;
1744}
1745
Eric Christopherb6dc8652012-11-27 22:43:45 +00001746// Compute the size and offset of all the DIEs.
Eric Christopher0e3e9b72012-12-10 23:34:43 +00001747void DwarfUnits::computeSizeAndOffsets() {
1748 for (SmallVector<CompileUnit *, 1>::iterator I = CUs.begin(),
1749 E = CUs.end(); I != E; ++I) {
Eric Christopher98e237f2012-11-30 23:59:06 +00001750 unsigned Offset =
1751 sizeof(int32_t) + // Length of Compilation Unit Info
1752 sizeof(int16_t) + // DWARF version number
1753 sizeof(int32_t) + // Offset Into Abbrev. Section
1754 sizeof(int8_t); // Pointer Size (in bytes)
1755
Eric Christopher0e3e9b72012-12-10 23:34:43 +00001756 computeSizeAndOffset((*I)->getCUDie(), Offset);
Devang Patel163a9f72010-05-10 22:49:55 +00001757 }
Bill Wendling94d04b82009-05-20 23:21:38 +00001758}
1759
Eric Christopherb6dc8652012-11-27 22:43:45 +00001760// Emit initial Dwarf sections with a label at the start of each one.
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001761void DwarfDebug::emitSectionLabels() {
Chris Lattner6c2f9e12009-08-19 05:49:37 +00001762 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
Daniel Dunbarf612ff62009-09-19 20:40:05 +00001763
Bill Wendling94d04b82009-05-20 23:21:38 +00001764 // Dwarf sections base addresses.
Jim Grosbach1e20b962010-07-21 21:21:52 +00001765 DwarfInfoSectionSym =
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001766 emitSectionSym(Asm, TLOF.getDwarfInfoSection(), "section_info");
Jim Grosbach1e20b962010-07-21 21:21:52 +00001767 DwarfAbbrevSectionSym =
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001768 emitSectionSym(Asm, TLOF.getDwarfAbbrevSection(), "section_abbrev");
Eric Christopher6eebe472012-12-19 22:02:53 +00001769 if (useSplitDwarf())
1770 DwarfAbbrevDWOSectionSym =
1771 emitSectionSym(Asm, TLOF.getDwarfAbbrevDWOSection(),
1772 "section_abbrev_dwo");
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001773 emitSectionSym(Asm, TLOF.getDwarfARangesSection());
Jim Grosbach1e20b962010-07-21 21:21:52 +00001774
Chris Lattner9c69e285532010-04-04 22:59:04 +00001775 if (const MCSection *MacroInfo = TLOF.getDwarfMacroInfoSection())
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001776 emitSectionSym(Asm, MacroInfo);
Bill Wendling94d04b82009-05-20 23:21:38 +00001777
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001778 emitSectionSym(Asm, TLOF.getDwarfLineSection(), "section_line");
1779 emitSectionSym(Asm, TLOF.getDwarfLocSection());
1780 emitSectionSym(Asm, TLOF.getDwarfPubTypesSection());
Jim Grosbach1e20b962010-07-21 21:21:52 +00001781 DwarfStrSectionSym =
Eric Christopher64f824c2012-12-27 02:14:01 +00001782 emitSectionSym(Asm, TLOF.getDwarfStrSection(), "info_string");
1783 if (useSplitDwarf())
1784 DwarfStrDWOSectionSym =
1785 emitSectionSym(Asm, TLOF.getDwarfStrDWOSection(), "skel_string");
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001786 DwarfDebugRangeSectionSym = emitSectionSym(Asm, TLOF.getDwarfRangesSection(),
Devang Patelf2548ca2010-04-16 23:33:45 +00001787 "debug_range");
Bill Wendling94d04b82009-05-20 23:21:38 +00001788
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001789 DwarfDebugLocSectionSym = emitSectionSym(Asm, TLOF.getDwarfLocSection(),
Devang Patelc3f5f782010-05-25 23:40:22 +00001790 "section_debug_loc");
1791
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001792 TextSectionSym = emitSectionSym(Asm, TLOF.getTextSection(), "text_begin");
1793 emitSectionSym(Asm, TLOF.getDataSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00001794}
1795
Eric Christopherb6dc8652012-11-27 22:43:45 +00001796// Recursively emits a debug information entry.
Eric Christopher6eebe472012-12-19 22:02:53 +00001797void DwarfDebug::emitDIE(DIE *Die, std::vector<DIEAbbrev *> *Abbrevs) {
Bill Wendling94d04b82009-05-20 23:21:38 +00001798 // Get the abbreviation for this DIE.
1799 unsigned AbbrevNumber = Die->getAbbrevNumber();
Eric Christopher6eebe472012-12-19 22:02:53 +00001800 const DIEAbbrev *Abbrev = Abbrevs->at(AbbrevNumber - 1);
Bill Wendling94d04b82009-05-20 23:21:38 +00001801
Bill Wendling94d04b82009-05-20 23:21:38 +00001802 // Emit the code (index) for the abbreviation.
Chris Lattner3f53c832010-04-04 18:52:31 +00001803 if (Asm->isVerbose())
Chris Lattner894d75a2010-01-22 23:18:42 +00001804 Asm->OutStreamer.AddComment("Abbrev [" + Twine(AbbrevNumber) + "] 0x" +
1805 Twine::utohexstr(Die->getOffset()) + ":0x" +
1806 Twine::utohexstr(Die->getSize()) + " " +
1807 dwarf::TagString(Abbrev->getTag()));
Chris Lattner7e1a8f82010-04-04 19:09:29 +00001808 Asm->EmitULEB128(AbbrevNumber);
Bill Wendling94d04b82009-05-20 23:21:38 +00001809
Jeffrey Yasskin638fe8d2010-03-22 18:47:14 +00001810 const SmallVector<DIEValue*, 32> &Values = Die->getValues();
Bill Wendling94d04b82009-05-20 23:21:38 +00001811 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
1812
1813 // Emit the DIE attribute values.
1814 for (unsigned i = 0, N = Values.size(); i < N; ++i) {
1815 unsigned Attr = AbbrevData[i].getAttribute();
1816 unsigned Form = AbbrevData[i].getForm();
1817 assert(Form && "Too many attributes for DIE (check abbreviation)");
1818
Chris Lattner3f53c832010-04-04 18:52:31 +00001819 if (Asm->isVerbose())
Chris Lattnera8013622010-01-24 18:54:17 +00001820 Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr));
Jim Grosbach1e20b962010-07-21 21:21:52 +00001821
Bill Wendling94d04b82009-05-20 23:21:38 +00001822 switch (Attr) {
Bill Wendling94d04b82009-05-20 23:21:38 +00001823 case dwarf::DW_AT_abstract_origin: {
1824 DIEEntry *E = cast<DIEEntry>(Values[i]);
1825 DIE *Origin = E->getEntry();
Devang Patel53bb5c92009-11-10 23:06:00 +00001826 unsigned Addr = Origin->getOffset();
Bill Wendling94d04b82009-05-20 23:21:38 +00001827 Asm->EmitInt32(Addr);
1828 break;
1829 }
Devang Patelf2548ca2010-04-16 23:33:45 +00001830 case dwarf::DW_AT_ranges: {
1831 // DW_AT_range Value encodes offset in debug_range section.
1832 DIEInteger *V = cast<DIEInteger>(Values[i]);
Devang Patelb1fcfbe2010-09-02 16:43:44 +00001833
Nick Lewyckyffccd922012-06-22 01:25:12 +00001834 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections()) {
Devang Patelb1fcfbe2010-09-02 16:43:44 +00001835 Asm->EmitLabelPlusOffset(DwarfDebugRangeSectionSym,
1836 V->getValue(),
1837 4);
1838 } else {
1839 Asm->EmitLabelOffsetDifference(DwarfDebugRangeSectionSym,
1840 V->getValue(),
1841 DwarfDebugRangeSectionSym,
1842 4);
1843 }
Devang Patelf2548ca2010-04-16 23:33:45 +00001844 break;
1845 }
Devang Patelc3f5f782010-05-25 23:40:22 +00001846 case dwarf::DW_AT_location: {
Nick Lewyckyffccd922012-06-22 01:25:12 +00001847 if (DIELabel *L = dyn_cast<DIELabel>(Values[i])) {
1848 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
1849 Asm->EmitLabelReference(L->getValue(), 4);
1850 else
1851 Asm->EmitLabelDifference(L->getValue(), DwarfDebugLocSectionSym, 4);
1852 } else {
Devang Patelc3f5f782010-05-25 23:40:22 +00001853 Values[i]->EmitValue(Asm, Form);
Nick Lewyckyffccd922012-06-22 01:25:12 +00001854 }
Devang Patelc3f5f782010-05-25 23:40:22 +00001855 break;
1856 }
Devang Patel2a361602010-09-29 19:08:08 +00001857 case dwarf::DW_AT_accessibility: {
1858 if (Asm->isVerbose()) {
1859 DIEInteger *V = cast<DIEInteger>(Values[i]);
1860 Asm->OutStreamer.AddComment(dwarf::AccessibilityString(V->getValue()));
1861 }
1862 Values[i]->EmitValue(Asm, Form);
1863 break;
1864 }
Bill Wendling94d04b82009-05-20 23:21:38 +00001865 default:
1866 // Emit an attribute using the defined form.
Chris Lattnerd38fee82010-04-05 00:13:49 +00001867 Values[i]->EmitValue(Asm, Form);
Bill Wendling94d04b82009-05-20 23:21:38 +00001868 break;
1869 }
Bill Wendling94d04b82009-05-20 23:21:38 +00001870 }
1871
1872 // Emit the DIE children if any.
1873 if (Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes) {
1874 const std::vector<DIE *> &Children = Die->getChildren();
1875
1876 for (unsigned j = 0, M = Children.size(); j < M; ++j)
Eric Christopher6eebe472012-12-19 22:02:53 +00001877 emitDIE(Children[j], Abbrevs);
Bill Wendling94d04b82009-05-20 23:21:38 +00001878
Chris Lattner3f53c832010-04-04 18:52:31 +00001879 if (Asm->isVerbose())
Chris Lattner233f52b2010-03-09 23:52:58 +00001880 Asm->OutStreamer.AddComment("End Of Children Mark");
1881 Asm->EmitInt8(0);
Bill Wendling94d04b82009-05-20 23:21:38 +00001882 }
1883}
1884
Eric Christopherb1e66d02012-12-15 00:04:07 +00001885// Emit the various dwarf units to the unit section USection with
1886// the abbreviations going into ASection.
1887void DwarfUnits::emitUnits(DwarfDebug *DD,
1888 const MCSection *USection,
1889 const MCSection *ASection,
1890 const MCSymbol *ASectionSym) {
1891 Asm->OutStreamer.SwitchSection(USection);
1892 for (SmallVector<CompileUnit *, 1>::iterator I = CUs.begin(),
1893 E = CUs.end(); I != E; ++I) {
1894 CompileUnit *TheCU = *I;
Devang Patel163a9f72010-05-10 22:49:55 +00001895 DIE *Die = TheCU->getCUDie();
Jim Grosbach1e20b962010-07-21 21:21:52 +00001896
Devang Patel163a9f72010-05-10 22:49:55 +00001897 // Emit the compile units header.
Eric Christopherb1e66d02012-12-15 00:04:07 +00001898 Asm->OutStreamer
1899 .EmitLabel(Asm->GetTempSymbol(USection->getLabelBeginName(),
1900 TheCU->getUniqueID()));
Jim Grosbach1e20b962010-07-21 21:21:52 +00001901
Devang Patel163a9f72010-05-10 22:49:55 +00001902 // Emit size of content not including length itself
1903 unsigned ContentSize = Die->getSize() +
1904 sizeof(int16_t) + // DWARF version number
1905 sizeof(int32_t) + // Offset Into Abbrev. Section
Devang Patel65705d52011-04-13 19:41:17 +00001906 sizeof(int8_t); // Pointer Size (in bytes)
Jim Grosbach1e20b962010-07-21 21:21:52 +00001907
Devang Patel163a9f72010-05-10 22:49:55 +00001908 Asm->OutStreamer.AddComment("Length of Compilation Unit Info");
1909 Asm->EmitInt32(ContentSize);
1910 Asm->OutStreamer.AddComment("DWARF version number");
1911 Asm->EmitInt16(dwarf::DWARF_VERSION);
1912 Asm->OutStreamer.AddComment("Offset Into Abbrev. Section");
Eric Christopherb1e66d02012-12-15 00:04:07 +00001913 Asm->EmitSectionOffset(Asm->GetTempSymbol(ASection->getLabelBeginName()),
1914 ASectionSym);
Devang Patel163a9f72010-05-10 22:49:55 +00001915 Asm->OutStreamer.AddComment("Address Size (in bytes)");
Chandler Carruth426c2bf2012-11-01 09:14:31 +00001916 Asm->EmitInt8(Asm->getDataLayout().getPointerSize());
Jim Grosbach1e20b962010-07-21 21:21:52 +00001917
Eric Christopher6eebe472012-12-19 22:02:53 +00001918 DD->emitDIE(Die, Abbreviations);
Eric Christopherb1e66d02012-12-15 00:04:07 +00001919 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol(USection->getLabelEndName(),
Eli Benderskyd4a05e02012-12-03 18:45:45 +00001920 TheCU->getUniqueID()));
Devang Patel163a9f72010-05-10 22:49:55 +00001921 }
Bill Wendling94d04b82009-05-20 23:21:38 +00001922}
1923
Eric Christopher98e237f2012-11-30 23:59:06 +00001924// Emit the debug info section.
1925void DwarfDebug::emitDebugInfo() {
Eric Christopherb1e66d02012-12-15 00:04:07 +00001926 DwarfUnits &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
1927
1928 Holder.emitUnits(this, Asm->getObjFileLowering().getDwarfInfoSection(),
1929 Asm->getObjFileLowering().getDwarfAbbrevSection(),
1930 DwarfAbbrevSectionSym);
Eric Christopher98e237f2012-11-30 23:59:06 +00001931}
1932
Eric Christopherb6dc8652012-11-27 22:43:45 +00001933// Emit the abbreviation section.
Eric Christopher7dc68db2012-11-20 23:30:11 +00001934void DwarfDebug::emitAbbreviations() {
Eric Christopher6eebe472012-12-19 22:02:53 +00001935 if (!useSplitDwarf())
1936 emitAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevSection(),
1937 &Abbreviations);
1938 else
1939 emitSkeletonAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevSection());
1940}
Bill Wendling94d04b82009-05-20 23:21:38 +00001941
Eric Christopher6eebe472012-12-19 22:02:53 +00001942void DwarfDebug::emitAbbrevs(const MCSection *Section,
1943 std::vector<DIEAbbrev *> *Abbrevs) {
1944 // Check to see if it is worth the effort.
1945 if (!Abbrevs->empty()) {
1946 // Start the debug abbrev section.
1947 Asm->OutStreamer.SwitchSection(Section);
1948
1949 MCSymbol *Begin = Asm->GetTempSymbol(Section->getLabelBeginName());
Eric Christopher44fedba2012-12-13 03:00:38 +00001950 Asm->OutStreamer.EmitLabel(Begin);
Bill Wendling94d04b82009-05-20 23:21:38 +00001951
1952 // For each abbrevation.
Eric Christopher6eebe472012-12-19 22:02:53 +00001953 for (unsigned i = 0, N = Abbrevs->size(); i < N; ++i) {
Bill Wendling94d04b82009-05-20 23:21:38 +00001954 // Get abbreviation data
Eric Christopher6eebe472012-12-19 22:02:53 +00001955 const DIEAbbrev *Abbrev = Abbrevs->at(i);
Bill Wendling94d04b82009-05-20 23:21:38 +00001956
1957 // Emit the abbrevations code (base 1 index.)
Chris Lattner7e1a8f82010-04-04 19:09:29 +00001958 Asm->EmitULEB128(Abbrev->getNumber(), "Abbreviation Code");
Bill Wendling94d04b82009-05-20 23:21:38 +00001959
1960 // Emit the abbreviations data.
Chris Lattnerd38fee82010-04-05 00:13:49 +00001961 Abbrev->Emit(Asm);
Bill Wendling94d04b82009-05-20 23:21:38 +00001962 }
1963
1964 // Mark end of abbreviations.
Chris Lattner7e1a8f82010-04-04 19:09:29 +00001965 Asm->EmitULEB128(0, "EOM(3)");
Bill Wendling94d04b82009-05-20 23:21:38 +00001966
Eric Christopher6eebe472012-12-19 22:02:53 +00001967 MCSymbol *End = Asm->GetTempSymbol(Section->getLabelEndName());
Eric Christopher44fedba2012-12-13 03:00:38 +00001968 Asm->OutStreamer.EmitLabel(End);
Bill Wendling94d04b82009-05-20 23:21:38 +00001969 }
1970}
1971
Eric Christopherb6dc8652012-11-27 22:43:45 +00001972// Emit the last address of the section and the end of the line matrix.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001973void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) {
Bill Wendling94d04b82009-05-20 23:21:38 +00001974 // Define last address of section.
Chris Lattner233f52b2010-03-09 23:52:58 +00001975 Asm->OutStreamer.AddComment("Extended Op");
1976 Asm->EmitInt8(0);
Jim Grosbach1e20b962010-07-21 21:21:52 +00001977
Chris Lattner233f52b2010-03-09 23:52:58 +00001978 Asm->OutStreamer.AddComment("Op size");
Chandler Carruth426c2bf2012-11-01 09:14:31 +00001979 Asm->EmitInt8(Asm->getDataLayout().getPointerSize() + 1);
Chris Lattner233f52b2010-03-09 23:52:58 +00001980 Asm->OutStreamer.AddComment("DW_LNE_set_address");
1981 Asm->EmitInt8(dwarf::DW_LNE_set_address);
1982
1983 Asm->OutStreamer.AddComment("Section end label");
Chris Lattnerd85fc6e2010-03-10 01:17:49 +00001984
Chris Lattnerc0215722010-04-04 19:25:43 +00001985 Asm->OutStreamer.EmitSymbolValue(Asm->GetTempSymbol("section_end",SectionEnd),
Eric Christopherca1dd052013-01-09 01:35:34 +00001986 Asm->getDataLayout().getPointerSize());
Bill Wendling94d04b82009-05-20 23:21:38 +00001987
1988 // Mark end of matrix.
Chris Lattner233f52b2010-03-09 23:52:58 +00001989 Asm->OutStreamer.AddComment("DW_LNE_end_sequence");
1990 Asm->EmitInt8(0);
Chris Lattner0ad9c912010-01-22 22:09:00 +00001991 Asm->EmitInt8(1);
Chris Lattner894d75a2010-01-22 23:18:42 +00001992 Asm->EmitInt8(1);
Bill Wendling94d04b82009-05-20 23:21:38 +00001993}
1994
Eric Christopherb6dc8652012-11-27 22:43:45 +00001995// Emit visible names into a hashed accelerator table section.
Eric Christopher09ac3d82011-11-07 09:24:32 +00001996void DwarfDebug::emitAccelNames() {
1997 DwarfAccelTable AT(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset,
1998 dwarf::DW_FORM_data4));
1999 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2000 E = CUMap.end(); I != E; ++I) {
2001 CompileUnit *TheCU = I->second;
Eric Christopher0ffe2b42011-11-10 19:25:34 +00002002 const StringMap<std::vector<DIE*> > &Names = TheCU->getAccelNames();
2003 for (StringMap<std::vector<DIE*> >::const_iterator
Eric Christopher09ac3d82011-11-07 09:24:32 +00002004 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
2005 const char *Name = GI->getKeyData();
Eric Christopherfa03db02012-01-06 23:03:34 +00002006 const std::vector<DIE *> &Entities = GI->second;
Eric Christopher0ffe2b42011-11-10 19:25:34 +00002007 for (std::vector<DIE *>::const_iterator DI = Entities.begin(),
2008 DE = Entities.end(); DI != DE; ++DI)
2009 AT.AddName(Name, (*DI));
Eric Christopher09ac3d82011-11-07 09:24:32 +00002010 }
2011 }
2012
2013 AT.FinalizeTable(Asm, "Names");
2014 Asm->OutStreamer.SwitchSection(
2015 Asm->getObjFileLowering().getDwarfAccelNamesSection());
2016 MCSymbol *SectionBegin = Asm->GetTempSymbol("names_begin");
2017 Asm->OutStreamer.EmitLabel(SectionBegin);
2018
2019 // Emit the full data.
Eric Christopher2e5d8702012-12-20 21:58:36 +00002020 AT.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher09ac3d82011-11-07 09:24:32 +00002021}
2022
Eric Christopher72c16552012-12-20 21:58:40 +00002023// Emit objective C classes and categories into a hashed accelerator table
2024// section.
Eric Christopher09ac3d82011-11-07 09:24:32 +00002025void DwarfDebug::emitAccelObjC() {
2026 DwarfAccelTable AT(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset,
2027 dwarf::DW_FORM_data4));
2028 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2029 E = CUMap.end(); I != E; ++I) {
2030 CompileUnit *TheCU = I->second;
2031 const StringMap<std::vector<DIE*> > &Names = TheCU->getAccelObjC();
2032 for (StringMap<std::vector<DIE*> >::const_iterator
2033 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
2034 const char *Name = GI->getKeyData();
Eric Christopherfa03db02012-01-06 23:03:34 +00002035 const std::vector<DIE *> &Entities = GI->second;
Eric Christopher09ac3d82011-11-07 09:24:32 +00002036 for (std::vector<DIE *>::const_iterator DI = Entities.begin(),
2037 DE = Entities.end(); DI != DE; ++DI)
2038 AT.AddName(Name, (*DI));
2039 }
2040 }
2041
2042 AT.FinalizeTable(Asm, "ObjC");
2043 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering()
2044 .getDwarfAccelObjCSection());
2045 MCSymbol *SectionBegin = Asm->GetTempSymbol("objc_begin");
2046 Asm->OutStreamer.EmitLabel(SectionBegin);
2047
2048 // Emit the full data.
Eric Christopher2e5d8702012-12-20 21:58:36 +00002049 AT.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher09ac3d82011-11-07 09:24:32 +00002050}
2051
Eric Christopherb6dc8652012-11-27 22:43:45 +00002052// Emit namespace dies into a hashed accelerator table.
Eric Christopher09ac3d82011-11-07 09:24:32 +00002053void DwarfDebug::emitAccelNamespaces() {
2054 DwarfAccelTable AT(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset,
2055 dwarf::DW_FORM_data4));
2056 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2057 E = CUMap.end(); I != E; ++I) {
2058 CompileUnit *TheCU = I->second;
Eric Christopher8bd36ea2011-11-10 21:47:55 +00002059 const StringMap<std::vector<DIE*> > &Names = TheCU->getAccelNamespace();
2060 for (StringMap<std::vector<DIE*> >::const_iterator
Eric Christopher09ac3d82011-11-07 09:24:32 +00002061 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
2062 const char *Name = GI->getKeyData();
Eric Christopherfa03db02012-01-06 23:03:34 +00002063 const std::vector<DIE *> &Entities = GI->second;
Eric Christopher8bd36ea2011-11-10 21:47:55 +00002064 for (std::vector<DIE *>::const_iterator DI = Entities.begin(),
2065 DE = Entities.end(); DI != DE; ++DI)
2066 AT.AddName(Name, (*DI));
Eric Christopher09ac3d82011-11-07 09:24:32 +00002067 }
2068 }
2069
2070 AT.FinalizeTable(Asm, "namespac");
2071 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering()
2072 .getDwarfAccelNamespaceSection());
2073 MCSymbol *SectionBegin = Asm->GetTempSymbol("namespac_begin");
2074 Asm->OutStreamer.EmitLabel(SectionBegin);
2075
2076 // Emit the full data.
Eric Christopher2e5d8702012-12-20 21:58:36 +00002077 AT.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher09ac3d82011-11-07 09:24:32 +00002078}
2079
Eric Christopherb6dc8652012-11-27 22:43:45 +00002080// Emit type dies into a hashed accelerator table.
Eric Christopher09ac3d82011-11-07 09:24:32 +00002081void DwarfDebug::emitAccelTypes() {
Eric Christopherc36145f2012-01-06 04:35:23 +00002082 std::vector<DwarfAccelTable::Atom> Atoms;
2083 Atoms.push_back(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset,
2084 dwarf::DW_FORM_data4));
2085 Atoms.push_back(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeTag,
2086 dwarf::DW_FORM_data2));
2087 Atoms.push_back(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeTypeFlags,
2088 dwarf::DW_FORM_data1));
2089 DwarfAccelTable AT(Atoms);
Eric Christopher09ac3d82011-11-07 09:24:32 +00002090 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2091 E = CUMap.end(); I != E; ++I) {
2092 CompileUnit *TheCU = I->second;
Eric Christopherc36145f2012-01-06 04:35:23 +00002093 const StringMap<std::vector<std::pair<DIE*, unsigned > > > &Names
2094 = TheCU->getAccelTypes();
2095 for (StringMap<std::vector<std::pair<DIE*, unsigned> > >::const_iterator
Eric Christopher09ac3d82011-11-07 09:24:32 +00002096 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
2097 const char *Name = GI->getKeyData();
Eric Christopherfa03db02012-01-06 23:03:34 +00002098 const std::vector<std::pair<DIE *, unsigned> > &Entities = GI->second;
Eric Christopherc36145f2012-01-06 04:35:23 +00002099 for (std::vector<std::pair<DIE *, unsigned> >::const_iterator DI
2100 = Entities.begin(), DE = Entities.end(); DI !=DE; ++DI)
2101 AT.AddName(Name, (*DI).first, (*DI).second);
Eric Christopher09ac3d82011-11-07 09:24:32 +00002102 }
2103 }
2104
2105 AT.FinalizeTable(Asm, "types");
2106 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering()
2107 .getDwarfAccelTypesSection());
2108 MCSymbol *SectionBegin = Asm->GetTempSymbol("types_begin");
2109 Asm->OutStreamer.EmitLabel(SectionBegin);
2110
2111 // Emit the full data.
Eric Christopher2e5d8702012-12-20 21:58:36 +00002112 AT.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher09ac3d82011-11-07 09:24:32 +00002113}
2114
Devang Patel193f7202009-11-24 01:14:22 +00002115void DwarfDebug::emitDebugPubTypes() {
Devang Patel163a9f72010-05-10 22:49:55 +00002116 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2117 E = CUMap.end(); I != E; ++I) {
2118 CompileUnit *TheCU = I->second;
Eric Christopher63701182011-11-07 09:18:35 +00002119 // Start the dwarf pubtypes section.
Devang Patel163a9f72010-05-10 22:49:55 +00002120 Asm->OutStreamer.SwitchSection(
2121 Asm->getObjFileLowering().getDwarfPubTypesSection());
2122 Asm->OutStreamer.AddComment("Length of Public Types Info");
2123 Asm->EmitLabelDifference(
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002124 Asm->GetTempSymbol("pubtypes_end", TheCU->getUniqueID()),
2125 Asm->GetTempSymbol("pubtypes_begin", TheCU->getUniqueID()), 4);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002126
Devang Patel163a9f72010-05-10 22:49:55 +00002127 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_begin",
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002128 TheCU->getUniqueID()));
Jim Grosbach1e20b962010-07-21 21:21:52 +00002129
Devang Patel163a9f72010-05-10 22:49:55 +00002130 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DWARF Version");
2131 Asm->EmitInt16(dwarf::DWARF_VERSION);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002132
Devang Patel163a9f72010-05-10 22:49:55 +00002133 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
Eric Christophercf6b8ad2012-12-15 00:04:04 +00002134 const MCSection *ISec = Asm->getObjFileLowering().getDwarfInfoSection();
2135 Asm->EmitSectionOffset(Asm->GetTempSymbol(ISec->getLabelBeginName(),
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002136 TheCU->getUniqueID()),
Devang Patel163a9f72010-05-10 22:49:55 +00002137 DwarfInfoSectionSym);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002138
Devang Patel163a9f72010-05-10 22:49:55 +00002139 Asm->OutStreamer.AddComment("Compilation Unit Length");
Eric Christophercf6b8ad2012-12-15 00:04:04 +00002140 Asm->EmitLabelDifference(Asm->GetTempSymbol(ISec->getLabelEndName(),
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002141 TheCU->getUniqueID()),
Eric Christophercf6b8ad2012-12-15 00:04:04 +00002142 Asm->GetTempSymbol(ISec->getLabelBeginName(),
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002143 TheCU->getUniqueID()),
Devang Patel163a9f72010-05-10 22:49:55 +00002144 4);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002145
Devang Patel163a9f72010-05-10 22:49:55 +00002146 const StringMap<DIE*> &Globals = TheCU->getGlobalTypes();
2147 for (StringMap<DIE*>::const_iterator
2148 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2149 const char *Name = GI->getKeyData();
Nick Lewycky3bbb6f72011-07-29 03:49:23 +00002150 DIE *Entity = GI->second;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002151
Devang Patel163a9f72010-05-10 22:49:55 +00002152 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
2153 Asm->EmitInt32(Entity->getOffset());
Jim Grosbach1e20b962010-07-21 21:21:52 +00002154
Devang Patel163a9f72010-05-10 22:49:55 +00002155 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("External Name");
Benjamin Kramer983c4572011-11-09 18:16:11 +00002156 // Emit the name with a terminating null byte.
Eric Christopher68ca5622013-01-09 01:57:54 +00002157 Asm->OutStreamer.EmitBytes(StringRef(Name, GI->getKeyLength()+1));
Devang Patel163a9f72010-05-10 22:49:55 +00002158 }
Jim Grosbach1e20b962010-07-21 21:21:52 +00002159
Devang Patel163a9f72010-05-10 22:49:55 +00002160 Asm->OutStreamer.AddComment("End Mark");
Jim Grosbach1e20b962010-07-21 21:21:52 +00002161 Asm->EmitInt32(0);
Devang Patel163a9f72010-05-10 22:49:55 +00002162 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_end",
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002163 TheCU->getUniqueID()));
Devang Patel193f7202009-11-24 01:14:22 +00002164 }
Devang Patel193f7202009-11-24 01:14:22 +00002165}
2166
Eric Christopher64f824c2012-12-27 02:14:01 +00002167// Emit strings into a string section.
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002168void DwarfUnits::emitStrings(const MCSection *StrSection,
2169 const MCSection *OffsetSection = NULL,
2170 const MCSymbol *StrSecSym = NULL) {
Eric Christopher64f824c2012-12-27 02:14:01 +00002171
Eric Christopherb6714222013-01-08 22:22:06 +00002172 if (StringPool.empty()) return;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002173
Chris Lattner0d9d70f2010-03-09 23:38:23 +00002174 // Start the dwarf str section.
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002175 Asm->OutStreamer.SwitchSection(StrSection);
Bill Wendling94d04b82009-05-20 23:21:38 +00002176
Chris Lattnerbc733f52010-03-13 02:17:42 +00002177 // Get all of the string pool entries and put them in an array by their ID so
2178 // we can sort them.
Jim Grosbach1e20b962010-07-21 21:21:52 +00002179 SmallVector<std::pair<unsigned,
Eric Christopherff348452013-01-07 22:40:45 +00002180 StringMapEntry<std::pair<MCSymbol*, unsigned> >*>, 64> Entries;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002181
Chris Lattnerbc733f52010-03-13 02:17:42 +00002182 for (StringMap<std::pair<MCSymbol*, unsigned> >::iterator
Eric Christopherb6714222013-01-08 22:22:06 +00002183 I = StringPool.begin(), E = StringPool.end();
Eric Christopher72c16552012-12-20 21:58:40 +00002184 I != E; ++I)
Chris Lattnerbc733f52010-03-13 02:17:42 +00002185 Entries.push_back(std::make_pair(I->second.second, &*I));
Jim Grosbach1e20b962010-07-21 21:21:52 +00002186
Chris Lattnerbc733f52010-03-13 02:17:42 +00002187 array_pod_sort(Entries.begin(), Entries.end());
Jim Grosbach1e20b962010-07-21 21:21:52 +00002188
Chris Lattnerbc733f52010-03-13 02:17:42 +00002189 for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
Chris Lattner0d9d70f2010-03-09 23:38:23 +00002190 // Emit a label for reference from debug information entries.
Chris Lattnerbc733f52010-03-13 02:17:42 +00002191 Asm->OutStreamer.EmitLabel(Entries[i].second->getValue().first);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002192
Benjamin Kramer983c4572011-11-09 18:16:11 +00002193 // Emit the string itself with a terminating null byte.
Benjamin Kramer0c45f7d2011-11-09 12:12:04 +00002194 Asm->OutStreamer.EmitBytes(StringRef(Entries[i].second->getKeyData(),
Eric Christopherca1dd052013-01-09 01:35:34 +00002195 Entries[i].second->getKeyLength()+1));
Bill Wendling94d04b82009-05-20 23:21:38 +00002196 }
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002197
2198 // If we've got an offset section go ahead and emit that now as well.
2199 if (OffsetSection) {
2200 Asm->OutStreamer.SwitchSection(OffsetSection);
2201 unsigned offset = 0;
Eric Christopher72f7bfb2013-01-15 23:56:56 +00002202 unsigned size = 4; // FIXME: DWARF64 is 8.
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002203 for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
Eric Christopher1ced2082013-01-09 03:52:05 +00002204 Asm->OutStreamer.EmitIntValue(offset, size);
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002205 offset += Entries[i].second->getKeyLength() + 1;
2206 }
2207 }
Bill Wendling94d04b82009-05-20 23:21:38 +00002208}
2209
Eric Christopher72f7bfb2013-01-15 23:56:56 +00002210// Emit strings into a string section.
2211void DwarfUnits::emitAddresses(const MCSection *AddrSection) {
2212
2213 if (AddressPool.empty()) return;
2214
2215 // Start the dwarf addr section.
2216 Asm->OutStreamer.SwitchSection(AddrSection);
2217
2218 // Get all of the string pool entries and put them in an array by their ID so
2219 // we can sort them.
2220 SmallVector<std::pair<unsigned,
2221 std::pair<MCSymbol*, unsigned>* >, 64> Entries;
2222
2223 for (DenseMap<MCSymbol*, std::pair<MCSymbol*, unsigned> >::iterator
2224 I = AddressPool.begin(), E = AddressPool.end();
2225 I != E; ++I)
2226 Entries.push_back(std::make_pair(I->second.second, &(I->second)));
2227
2228 array_pod_sort(Entries.begin(), Entries.end());
2229
2230 for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
2231 // Emit a label for reference from debug information entries.
2232 MCSymbol *Sym = Entries[i].second->first;
2233 if (Sym)
2234 Asm->EmitLabelReference(Entries[i].second->first,
2235 Asm->getDataLayout().getPointerSize());
2236 else
2237 Asm->OutStreamer.EmitIntValue(0, Asm->getDataLayout().getPointerSize());
2238 }
2239
2240}
2241
Eric Christopher64f824c2012-12-27 02:14:01 +00002242// Emit visible names into a debug str section.
2243void DwarfDebug::emitDebugStr() {
2244 DwarfUnits &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
2245 Holder.emitStrings(Asm->getObjFileLowering().getDwarfStrSection());
2246}
2247
Eric Christopherb6dc8652012-11-27 22:43:45 +00002248// Emit visible names into a debug loc section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002249void DwarfDebug::emitDebugLoc() {
Devang Patel80250682010-05-26 23:55:23 +00002250 if (DotDebugLocEntries.empty())
2251 return;
2252
Devang Patel6c3ea902011-02-04 22:57:18 +00002253 for (SmallVector<DotDebugLocEntry, 4>::iterator
2254 I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
2255 I != E; ++I) {
2256 DotDebugLocEntry &Entry = *I;
2257 if (I + 1 != DotDebugLocEntries.end())
2258 Entry.Merge(I+1);
2259 }
2260
Daniel Dunbar83320a02011-03-16 22:16:39 +00002261 // Start the dwarf loc section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002262 Asm->OutStreamer.SwitchSection(
Devang Patelc3f5f782010-05-25 23:40:22 +00002263 Asm->getObjFileLowering().getDwarfLocSection());
Chandler Carruth426c2bf2012-11-01 09:14:31 +00002264 unsigned char Size = Asm->getDataLayout().getPointerSize();
Devang Patel80250682010-05-26 23:55:23 +00002265 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", 0));
2266 unsigned index = 1;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002267 for (SmallVector<DotDebugLocEntry, 4>::iterator
2268 I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
Devang Patel61409622010-07-07 20:12:52 +00002269 I != E; ++I, ++index) {
Devang Patel6c3ea902011-02-04 22:57:18 +00002270 DotDebugLocEntry &Entry = *I;
2271 if (Entry.isMerged()) continue;
Devang Patelc3f5f782010-05-25 23:40:22 +00002272 if (Entry.isEmpty()) {
Eric Christopherca1dd052013-01-09 01:35:34 +00002273 Asm->OutStreamer.EmitIntValue(0, Size);
2274 Asm->OutStreamer.EmitIntValue(0, Size);
Devang Patel80250682010-05-26 23:55:23 +00002275 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", index));
Devang Patelc3f5f782010-05-25 23:40:22 +00002276 } else {
Eric Christopher1ced2082013-01-09 03:52:05 +00002277 Asm->OutStreamer.EmitSymbolValue(Entry.Begin, Size);
2278 Asm->OutStreamer.EmitSymbolValue(Entry.End, Size);
Devang Patelc26f5442011-04-28 02:22:40 +00002279 DIVariable DV(Entry.Variable);
Rafael Espindola5b23b7f2011-05-27 22:05:41 +00002280 Asm->OutStreamer.AddComment("Loc expr size");
2281 MCSymbol *begin = Asm->OutStreamer.getContext().CreateTempSymbol();
2282 MCSymbol *end = Asm->OutStreamer.getContext().CreateTempSymbol();
2283 Asm->EmitLabelDifference(end, begin, 2);
2284 Asm->OutStreamer.EmitLabel(begin);
Devang Patel80efd4e2011-07-08 16:49:43 +00002285 if (Entry.isInt()) {
Devang Patelc4329072011-06-01 22:03:25 +00002286 DIBasicType BTy(DV.getType());
2287 if (BTy.Verify() &&
Eric Christopher0f1c7f62012-11-19 22:42:10 +00002288 (BTy.getEncoding() == dwarf::DW_ATE_signed
Devang Patelc4329072011-06-01 22:03:25 +00002289 || BTy.getEncoding() == dwarf::DW_ATE_signed_char)) {
2290 Asm->OutStreamer.AddComment("DW_OP_consts");
2291 Asm->EmitInt8(dwarf::DW_OP_consts);
Devang Patel80efd4e2011-07-08 16:49:43 +00002292 Asm->EmitSLEB128(Entry.getInt());
Devang Patelc4329072011-06-01 22:03:25 +00002293 } else {
2294 Asm->OutStreamer.AddComment("DW_OP_constu");
2295 Asm->EmitInt8(dwarf::DW_OP_constu);
Devang Patel80efd4e2011-07-08 16:49:43 +00002296 Asm->EmitULEB128(Entry.getInt());
Devang Patelc4329072011-06-01 22:03:25 +00002297 }
Devang Patel80efd4e2011-07-08 16:49:43 +00002298 } else if (Entry.isLocation()) {
Eric Christopher0f1c7f62012-11-19 22:42:10 +00002299 if (!DV.hasComplexAddress())
Devang Patel80efd4e2011-07-08 16:49:43 +00002300 // Regular entry.
Devang Patelc26f5442011-04-28 02:22:40 +00002301 Asm->EmitDwarfRegOp(Entry.Loc);
Devang Patel80efd4e2011-07-08 16:49:43 +00002302 else {
2303 // Complex address entry.
2304 unsigned N = DV.getNumAddrElements();
2305 unsigned i = 0;
2306 if (N >= 2 && DV.getAddrElement(0) == DIBuilder::OpPlus) {
2307 if (Entry.Loc.getOffset()) {
2308 i = 2;
2309 Asm->EmitDwarfRegOp(Entry.Loc);
2310 Asm->OutStreamer.AddComment("DW_OP_deref");
2311 Asm->EmitInt8(dwarf::DW_OP_deref);
2312 Asm->OutStreamer.AddComment("DW_OP_plus_uconst");
2313 Asm->EmitInt8(dwarf::DW_OP_plus_uconst);
2314 Asm->EmitSLEB128(DV.getAddrElement(1));
2315 } else {
2316 // If first address element is OpPlus then emit
2317 // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
2318 MachineLocation Loc(Entry.Loc.getReg(), DV.getAddrElement(1));
2319 Asm->EmitDwarfRegOp(Loc);
2320 i = 2;
2321 }
2322 } else {
2323 Asm->EmitDwarfRegOp(Entry.Loc);
2324 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +00002325
Devang Patel80efd4e2011-07-08 16:49:43 +00002326 // Emit remaining complex address elements.
2327 for (; i < N; ++i) {
2328 uint64_t Element = DV.getAddrElement(i);
2329 if (Element == DIBuilder::OpPlus) {
2330 Asm->EmitInt8(dwarf::DW_OP_plus_uconst);
2331 Asm->EmitULEB128(DV.getAddrElement(++i));
Eric Christopher50120762012-05-08 18:56:00 +00002332 } else if (Element == DIBuilder::OpDeref) {
Eric Christophera80f2d12012-05-08 21:24:39 +00002333 if (!Entry.Loc.isReg())
Eric Christopher50120762012-05-08 18:56:00 +00002334 Asm->EmitInt8(dwarf::DW_OP_deref);
2335 } else
2336 llvm_unreachable("unknown Opcode found in complex address");
Devang Patel80efd4e2011-07-08 16:49:43 +00002337 }
Devang Patelc26f5442011-04-28 02:22:40 +00002338 }
Devang Patelc26f5442011-04-28 02:22:40 +00002339 }
Devang Patel80efd4e2011-07-08 16:49:43 +00002340 // else ... ignore constant fp. There is not any good way to
2341 // to represent them here in dwarf.
Rafael Espindola5b23b7f2011-05-27 22:05:41 +00002342 Asm->OutStreamer.EmitLabel(end);
Devang Patelc3f5f782010-05-25 23:40:22 +00002343 }
2344 }
Bill Wendling94d04b82009-05-20 23:21:38 +00002345}
2346
Eric Christopherb6dc8652012-11-27 22:43:45 +00002347// Emit visible names into a debug aranges section.
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00002348void DwarfDebug::emitDebugARanges() {
Bill Wendling94d04b82009-05-20 23:21:38 +00002349 // Start the dwarf aranges section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002350 Asm->OutStreamer.SwitchSection(
2351 Asm->getObjFileLowering().getDwarfARangesSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002352}
2353
Eric Christopherb6dc8652012-11-27 22:43:45 +00002354// Emit visible names into a debug ranges section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002355void DwarfDebug::emitDebugRanges() {
Bill Wendling94d04b82009-05-20 23:21:38 +00002356 // Start the dwarf ranges section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002357 Asm->OutStreamer.SwitchSection(
Devang Patelf2548ca2010-04-16 23:33:45 +00002358 Asm->getObjFileLowering().getDwarfRangesSection());
Chandler Carruth426c2bf2012-11-01 09:14:31 +00002359 unsigned char Size = Asm->getDataLayout().getPointerSize();
Devang Pateleac9c072010-04-27 19:46:33 +00002360 for (SmallVector<const MCSymbol *, 8>::iterator
Jim Grosbach1e20b962010-07-21 21:21:52 +00002361 I = DebugRangeSymbols.begin(), E = DebugRangeSymbols.end();
Devang Pateleac9c072010-04-27 19:46:33 +00002362 I != E; ++I) {
2363 if (*I)
Eric Christopher1ced2082013-01-09 03:52:05 +00002364 Asm->OutStreamer.EmitSymbolValue(const_cast<MCSymbol*>(*I), Size);
Devang Patelf2548ca2010-04-16 23:33:45 +00002365 else
Eric Christopherca1dd052013-01-09 01:35:34 +00002366 Asm->OutStreamer.EmitIntValue(0, Size);
Devang Patelf2548ca2010-04-16 23:33:45 +00002367 }
Bill Wendling94d04b82009-05-20 23:21:38 +00002368}
2369
Eric Christopherb6dc8652012-11-27 22:43:45 +00002370// Emit visible names into a debug macinfo section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002371void DwarfDebug::emitDebugMacInfo() {
Daniel Dunbarf612ff62009-09-19 20:40:05 +00002372 if (const MCSection *LineInfo =
Chris Lattner18a4c162009-08-02 07:24:22 +00002373 Asm->getObjFileLowering().getDwarfMacroInfoSection()) {
Bill Wendling94d04b82009-05-20 23:21:38 +00002374 // Start the dwarf macinfo section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002375 Asm->OutStreamer.SwitchSection(LineInfo);
Bill Wendling94d04b82009-05-20 23:21:38 +00002376 }
2377}
2378
Eric Christopherb6dc8652012-11-27 22:43:45 +00002379// Emit inline info using following format.
2380// Section Header:
2381// 1. length of section
2382// 2. Dwarf version number
2383// 3. address size.
2384//
2385// Entries (one "entry" for each function that was inlined):
2386//
2387// 1. offset into __debug_str section for MIPS linkage name, if exists;
2388// otherwise offset into __debug_str for regular function name.
2389// 2. offset into __debug_str section for regular function name.
2390// 3. an unsigned LEB128 number indicating the number of distinct inlining
2391// instances for the function.
2392//
2393// The rest of the entry consists of a {die_offset, low_pc} pair for each
2394// inlined instance; the die_offset points to the inlined_subroutine die in the
2395// __debug_info section, and the low_pc is the starting address for the
2396// inlining instance.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002397void DwarfDebug::emitDebugInlineInfo() {
Eric Christopherb83e2bb2012-03-02 02:11:47 +00002398 if (!Asm->MAI->doesDwarfUseInlineInfoSection())
Bill Wendling94d04b82009-05-20 23:21:38 +00002399 return;
2400
Devang Patel163a9f72010-05-10 22:49:55 +00002401 if (!FirstCU)
Bill Wendling94d04b82009-05-20 23:21:38 +00002402 return;
2403
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002404 Asm->OutStreamer.SwitchSection(
2405 Asm->getObjFileLowering().getDwarfDebugInlineSection());
Chris Lattner0ad9c912010-01-22 22:09:00 +00002406
Chris Lattner233f52b2010-03-09 23:52:58 +00002407 Asm->OutStreamer.AddComment("Length of Debug Inlined Information Entry");
Chris Lattnera6437182010-04-04 19:58:12 +00002408 Asm->EmitLabelDifference(Asm->GetTempSymbol("debug_inlined_end", 1),
2409 Asm->GetTempSymbol("debug_inlined_begin", 1), 4);
Bill Wendling94d04b82009-05-20 23:21:38 +00002410
Chris Lattnerc0215722010-04-04 19:25:43 +00002411 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_begin", 1));
Bill Wendling94d04b82009-05-20 23:21:38 +00002412
Chris Lattner233f52b2010-03-09 23:52:58 +00002413 Asm->OutStreamer.AddComment("Dwarf Version");
2414 Asm->EmitInt16(dwarf::DWARF_VERSION);
2415 Asm->OutStreamer.AddComment("Address Size (in bytes)");
Chandler Carruth426c2bf2012-11-01 09:14:31 +00002416 Asm->EmitInt8(Asm->getDataLayout().getPointerSize());
Bill Wendling94d04b82009-05-20 23:21:38 +00002417
Devang Patele9f8f5e2010-05-07 20:54:48 +00002418 for (SmallVector<const MDNode *, 4>::iterator I = InlinedSPNodes.begin(),
Devang Patel53bb5c92009-11-10 23:06:00 +00002419 E = InlinedSPNodes.end(); I != E; ++I) {
Jim Grosbach31ef40e2009-11-21 23:12:12 +00002420
Devang Patele9f8f5e2010-05-07 20:54:48 +00002421 const MDNode *Node = *I;
2422 DenseMap<const MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator II
Jim Grosbach7ab38df2009-11-22 19:20:36 +00002423 = InlineInfo.find(Node);
Devang Patel53bb5c92009-11-10 23:06:00 +00002424 SmallVector<InlineInfoLabels, 4> &Labels = II->second;
Devang Patele4b27562009-08-28 23:24:31 +00002425 DISubprogram SP(Node);
Devang Patel65dbc902009-11-25 17:36:49 +00002426 StringRef LName = SP.getLinkageName();
2427 StringRef Name = SP.getName();
Bill Wendling94d04b82009-05-20 23:21:38 +00002428
Chris Lattner233f52b2010-03-09 23:52:58 +00002429 Asm->OutStreamer.AddComment("MIPS linkage name");
Eric Christopher50e26612012-03-02 01:57:52 +00002430 if (LName.empty())
Eric Christopher2e5d8702012-12-20 21:58:36 +00002431 Asm->EmitSectionOffset(InfoHolder.getStringPoolEntry(Name),
2432 DwarfStrSectionSym);
Eric Christopher50e26612012-03-02 01:57:52 +00002433 else
Eric Christopher2e5d8702012-12-20 21:58:36 +00002434 Asm->EmitSectionOffset(InfoHolder
2435 .getStringPoolEntry(getRealLinkageName(LName)),
Chris Lattner6189ed12010-04-04 23:25:33 +00002436 DwarfStrSectionSym);
Devang Patel53bb5c92009-11-10 23:06:00 +00002437
Chris Lattner233f52b2010-03-09 23:52:58 +00002438 Asm->OutStreamer.AddComment("Function name");
Eric Christopher2e5d8702012-12-20 21:58:36 +00002439 Asm->EmitSectionOffset(InfoHolder.getStringPoolEntry(Name),
2440 DwarfStrSectionSym);
Chris Lattner7e1a8f82010-04-04 19:09:29 +00002441 Asm->EmitULEB128(Labels.size(), "Inline count");
Bill Wendling94d04b82009-05-20 23:21:38 +00002442
Devang Patel53bb5c92009-11-10 23:06:00 +00002443 for (SmallVector<InlineInfoLabels, 4>::iterator LI = Labels.begin(),
Bill Wendling94d04b82009-05-20 23:21:38 +00002444 LE = Labels.end(); LI != LE; ++LI) {
Chris Lattner3f53c832010-04-04 18:52:31 +00002445 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
Chris Lattner6ed0f902010-03-09 00:31:02 +00002446 Asm->EmitInt32(LI->second->getOffset());
Bill Wendling94d04b82009-05-20 23:21:38 +00002447
Chris Lattner3f53c832010-04-04 18:52:31 +00002448 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("low_pc");
Chris Lattnerd38fee82010-04-05 00:13:49 +00002449 Asm->OutStreamer.EmitSymbolValue(LI->first,
Eric Christopher1ced2082013-01-09 03:52:05 +00002450 Asm->getDataLayout().getPointerSize());
Bill Wendling94d04b82009-05-20 23:21:38 +00002451 }
2452 }
2453
Chris Lattnerc0215722010-04-04 19:25:43 +00002454 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_end", 1));
Bill Wendling94d04b82009-05-20 23:21:38 +00002455}
Eric Christopher98e237f2012-11-30 23:59:06 +00002456
Eric Christopher0b944ee2012-12-11 19:42:09 +00002457// DWARF5 Experimental Separate Dwarf emitters.
Eric Christopher98e237f2012-11-30 23:59:06 +00002458
2459// This DIE has the following attributes: DW_AT_comp_dir, DW_AT_stmt_list,
2460// DW_AT_low_pc, DW_AT_high_pc, DW_AT_ranges, DW_AT_dwo_name, DW_AT_dwo_id,
2461// DW_AT_ranges_base, DW_AT_addr_base. If DW_AT_ranges is present,
2462// DW_AT_low_pc and DW_AT_high_pc are not used, and vice versa.
Eric Christopher4daaed12012-12-10 19:51:21 +00002463CompileUnit *DwarfDebug::constructSkeletonCU(const MDNode *N) {
Eric Christopher98e237f2012-11-30 23:59:06 +00002464 DICompileUnit DIUnit(N);
Eric Christopher98e237f2012-11-30 23:59:06 +00002465 CompilationDir = DIUnit.getDirectory();
Eric Christopher98e237f2012-11-30 23:59:06 +00002466
2467 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002468 CompileUnit *NewCU = new CompileUnit(GlobalCUIndexCount++,
Eric Christopher2e5d8702012-12-20 21:58:36 +00002469 DIUnit.getLanguage(), Die, Asm,
Eric Christopher64f824c2012-12-27 02:14:01 +00002470 this, &SkeletonHolder);
Eric Christopher446b88f2013-01-17 03:00:04 +00002471
2472 SmallString<16> T(DIUnit.getFilename());
2473 sys::path::replace_extension(T, ".dwo");
2474 StringRef FN = sys::path::filename(T);
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002475 NewCU->addLocalString(Die, dwarf::DW_AT_GNU_dwo_name, FN);
Eric Christopher98e237f2012-11-30 23:59:06 +00002476
Eric Christopher208cc6f2013-02-05 07:31:55 +00002477 // This should be a unique identifier when we want to build .dwp files.
2478 NewCU->addUInt(Die, dwarf::DW_AT_GNU_dwo_id, dwarf::DW_FORM_data8, 0);
Eric Christopherd96c72a2013-01-17 02:59:59 +00002479
2480 // FIXME: The addr base should be relative for each compile unit, however,
2481 // this one is going to be 0 anyhow.
2482 NewCU->addUInt(Die, dwarf::DW_AT_GNU_addr_base, dwarf::DW_FORM_sec_offset, 0);
Eric Christopher98e237f2012-11-30 23:59:06 +00002483
2484 // 2.17.1 requires that we use DW_AT_low_pc for a single entry point
Eric Christopher72f7bfb2013-01-15 23:56:56 +00002485 // into an entity. We're using 0, or a NULL label for this.
Eric Christopher98e237f2012-11-30 23:59:06 +00002486 NewCU->addUInt(Die, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, 0);
Eric Christopher72f7bfb2013-01-15 23:56:56 +00002487
Eric Christopher98e237f2012-11-30 23:59:06 +00002488 // DW_AT_stmt_list is a offset of line number information for this
2489 // compile unit in debug_line section.
2490 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
Eric Christopher446b88f2013-01-17 03:00:04 +00002491 NewCU->addLabel(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_sec_offset,
Eric Christopher98e237f2012-11-30 23:59:06 +00002492 Asm->GetTempSymbol("section_line"));
2493 else
Eric Christopher446b88f2013-01-17 03:00:04 +00002494 NewCU->addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_sec_offset, 0);
Eric Christopher98e237f2012-11-30 23:59:06 +00002495
2496 if (!CompilationDir.empty())
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002497 NewCU->addLocalString(Die, dwarf::DW_AT_comp_dir, CompilationDir);
Eric Christopher98e237f2012-11-30 23:59:06 +00002498
Eric Christopher31fb5da2013-02-05 07:32:03 +00002499 if (!SkeletonCU)
2500 SkeletonCU = NewCU;
2501
Eric Christopher0e3e9b72012-12-10 23:34:43 +00002502 SkeletonHolder.addUnit(NewCU);
2503
Eric Christopher98e237f2012-11-30 23:59:06 +00002504 return NewCU;
2505}
2506
Eric Christopher4daaed12012-12-10 19:51:21 +00002507void DwarfDebug::emitSkeletonCU(const MCSection *Section) {
Eric Christopher98e237f2012-11-30 23:59:06 +00002508 Asm->OutStreamer.SwitchSection(Section);
Eric Christopher4daaed12012-12-10 19:51:21 +00002509 DIE *Die = SkeletonCU->getCUDie();
Eric Christopher98e237f2012-11-30 23:59:06 +00002510
2511 // Emit the compile units header.
Eric Christophercf6b8ad2012-12-15 00:04:04 +00002512 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol(Section->getLabelBeginName(),
Eric Christopher4daaed12012-12-10 19:51:21 +00002513 SkeletonCU->getUniqueID()));
Eric Christopher98e237f2012-11-30 23:59:06 +00002514
2515 // Emit size of content not including length itself
2516 unsigned ContentSize = Die->getSize() +
2517 sizeof(int16_t) + // DWARF version number
2518 sizeof(int32_t) + // Offset Into Abbrev. Section
2519 sizeof(int8_t); // Pointer Size (in bytes)
2520
2521 Asm->OutStreamer.AddComment("Length of Compilation Unit Info");
2522 Asm->EmitInt32(ContentSize);
2523 Asm->OutStreamer.AddComment("DWARF version number");
2524 Asm->EmitInt16(dwarf::DWARF_VERSION);
2525 Asm->OutStreamer.AddComment("Offset Into Abbrev. Section");
Eric Christopher6eebe472012-12-19 22:02:53 +00002526
2527 const MCSection *ASec = Asm->getObjFileLowering().getDwarfAbbrevSection();
2528 Asm->EmitSectionOffset(Asm->GetTempSymbol(ASec->getLabelBeginName()),
Eric Christopher98e237f2012-11-30 23:59:06 +00002529 DwarfAbbrevSectionSym);
2530 Asm->OutStreamer.AddComment("Address Size (in bytes)");
2531 Asm->EmitInt8(Asm->getDataLayout().getPointerSize());
2532
Eric Christopher6eebe472012-12-19 22:02:53 +00002533 emitDIE(Die, &SkeletonAbbrevs);
Eric Christophercf6b8ad2012-12-15 00:04:04 +00002534 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol(Section->getLabelEndName(),
Eric Christopher4daaed12012-12-10 19:51:21 +00002535 SkeletonCU->getUniqueID()));
Eric Christopher6eebe472012-12-19 22:02:53 +00002536}
Eric Christopher98e237f2012-11-30 23:59:06 +00002537
Eric Christopher6eebe472012-12-19 22:02:53 +00002538void DwarfDebug::emitSkeletonAbbrevs(const MCSection *Section) {
2539 assert(useSplitDwarf() && "No split dwarf debug info?");
2540 emitAbbrevs(Section, &SkeletonAbbrevs);
Eric Christopher98e237f2012-11-30 23:59:06 +00002541}
2542
Eric Christopher0b944ee2012-12-11 19:42:09 +00002543// Emit the .debug_info.dwo section for separated dwarf. This contains the
2544// compile units that would normally be in debug_info.
Eric Christopher98e237f2012-11-30 23:59:06 +00002545void DwarfDebug::emitDebugInfoDWO() {
Eric Christopher4daaed12012-12-10 19:51:21 +00002546 assert(useSplitDwarf() && "No split dwarf debug info?");
Eric Christopherb1e66d02012-12-15 00:04:07 +00002547 InfoHolder.emitUnits(this, Asm->getObjFileLowering().getDwarfInfoDWOSection(),
Eric Christopher6eebe472012-12-19 22:02:53 +00002548 Asm->getObjFileLowering().getDwarfAbbrevDWOSection(),
2549 DwarfAbbrevDWOSectionSym);
2550}
2551
2552// Emit the .debug_abbrev.dwo section for separated dwarf. This contains the
2553// abbreviations for the .debug_info.dwo section.
2554void DwarfDebug::emitDebugAbbrevDWO() {
2555 assert(useSplitDwarf() && "No split dwarf?");
Eric Christopher72c16552012-12-20 21:58:40 +00002556 emitAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevDWOSection(),
2557 &Abbreviations);
Eric Christopher98e237f2012-11-30 23:59:06 +00002558}
Eric Christopher64f824c2012-12-27 02:14:01 +00002559
2560// Emit the .debug_str.dwo section for separated dwarf. This contains the
2561// string section and is identical in format to traditional .debug_str
2562// sections.
2563void DwarfDebug::emitDebugStrDWO() {
2564 assert(useSplitDwarf() && "No split dwarf?");
Eric Christopherff348452013-01-07 22:40:45 +00002565 const MCSection *OffSec = Asm->getObjFileLowering()
2566 .getDwarfStrOffDWOSection();
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002567 const MCSymbol *StrSym = DwarfStrSectionSym;
2568 InfoHolder.emitStrings(Asm->getObjFileLowering().getDwarfStrDWOSection(),
2569 OffSec, StrSym);
Eric Christopher64f824c2012-12-27 02:14:01 +00002570}