blob: b169602b0ecb8f5ac8d4f368e4c16a2ba287c0cd [file] [log] [blame]
Bill Wendling0310d762009-05-15 09:23:25 +00001//===-- llvm/CodeGen/DwarfDebug.cpp - Dwarf Debug Framework ---------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file contains support for writing dwarf debug info into asm files.
11//
12//===----------------------------------------------------------------------===//
Chris Lattner6cde3e62010-03-09 00:39:24 +000013
Devang Patele4b27562009-08-28 23:24:31 +000014#define DEBUG_TYPE "dwarfdebug"
Bill Wendling0310d762009-05-15 09:23:25 +000015#include "DwarfDebug.h"
Chris Lattner74e41f92010-04-05 05:24:55 +000016#include "DIE.h"
Eric Christopher09ac3d82011-11-07 09:24:32 +000017#include "DwarfAccelTable.h"
Devang Patel8b9df622011-04-12 17:40:32 +000018#include "DwarfCompileUnit.h"
Chandler Carruthd04a8d42012-12-03 16:50:05 +000019#include "llvm/ADT/STLExtras.h"
20#include "llvm/ADT/Statistic.h"
21#include "llvm/ADT/StringExtras.h"
22#include "llvm/ADT/Triple.h"
David Greeneb2c66fc2009-08-19 21:52:55 +000023#include "llvm/CodeGen/MachineFunction.h"
Bill Wendling0310d762009-05-15 09:23:25 +000024#include "llvm/CodeGen/MachineModuleInfo.h"
Chandler Carruthd04a8d42012-12-03 16:50:05 +000025#include "llvm/DIBuilder.h"
Chandler Carruthd04a8d42012-12-03 16:50:05 +000026#include "llvm/DebugInfo.h"
Chandler Carruth0b8c9a82013-01-02 11:36:10 +000027#include "llvm/IR/Constants.h"
28#include "llvm/IR/DataLayout.h"
29#include "llvm/IR/Instructions.h"
30#include "llvm/IR/Module.h"
Chris Lattnerb7db7332010-03-09 01:58:53 +000031#include "llvm/MC/MCAsmInfo.h"
Chris Lattnera87dea42009-07-31 18:48:30 +000032#include "llvm/MC/MCSection.h"
Chris Lattner6c2f9e12009-08-19 05:49:37 +000033#include "llvm/MC/MCStreamer.h"
Chris Lattnerb7db7332010-03-09 01:58:53 +000034#include "llvm/MC/MCSymbol.h"
Devang Pateleac9c072010-04-27 19:46:33 +000035#include "llvm/Support/CommandLine.h"
Daniel Dunbar6e4bdfc2009-10-13 06:47:08 +000036#include "llvm/Support/Debug.h"
37#include "llvm/Support/ErrorHandling.h"
Chris Lattner0ad9c912010-01-22 22:09:00 +000038#include "llvm/Support/FormattedStream.h"
Michael J. Spencer1f6efa32010-11-29 18:16:10 +000039#include "llvm/Support/Path.h"
Chandler Carruthd04a8d42012-12-03 16:50:05 +000040#include "llvm/Support/Timer.h"
41#include "llvm/Support/ValueHandle.h"
42#include "llvm/Target/TargetFrameLowering.h"
43#include "llvm/Target/TargetLoweringObjectFile.h"
44#include "llvm/Target/TargetMachine.h"
45#include "llvm/Target/TargetOptions.h"
46#include "llvm/Target/TargetRegisterInfo.h"
Bill Wendling0310d762009-05-15 09:23:25 +000047using namespace llvm;
48
Jim Grosbach1e20b962010-07-21 21:21:52 +000049static cl::opt<bool> DisableDebugInfoPrinting("disable-debug-info-print",
Devang Patel61409622010-07-07 20:12:52 +000050 cl::Hidden,
Devang Pateleac9c072010-04-27 19:46:33 +000051 cl::desc("Disable debug info printing"));
52
Dan Gohman281d65d2010-05-07 01:08:53 +000053static cl::opt<bool> UnknownLocations("use-unknown-locations", cl::Hidden,
Chris Lattner7a2bdde2011-04-15 05:18:47 +000054 cl::desc("Make an absence of debug location information explicit."),
Dan Gohman281d65d2010-05-07 01:08:53 +000055 cl::init(false));
56
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +000057static cl::opt<bool> GenerateDwarfPubNamesSection("generate-dwarf-pubnames",
58 cl::Hidden, cl::ZeroOrMore, cl::init(false),
59 cl::desc("Generate DWARF pubnames section"));
60
Eric Christopher20f47ab2012-08-23 22:36:40 +000061namespace {
62 enum DefaultOnOff {
63 Default, Enable, Disable
64 };
65}
Eric Christopher09ac3d82011-11-07 09:24:32 +000066
Eric Christopher20f47ab2012-08-23 22:36:40 +000067static cl::opt<DefaultOnOff> DwarfAccelTables("dwarf-accel-tables", cl::Hidden,
68 cl::desc("Output prototype dwarf accelerator tables."),
69 cl::values(
70 clEnumVal(Default, "Default for platform"),
71 clEnumVal(Enable, "Enabled"),
72 clEnumVal(Disable, "Disabled"),
73 clEnumValEnd),
74 cl::init(Default));
75
76static cl::opt<DefaultOnOff> DarwinGDBCompat("darwin-gdb-compat", cl::Hidden,
Eric Christopher10cb7442012-08-23 07:10:46 +000077 cl::desc("Compatibility with Darwin gdb."),
Eric Christopher20f47ab2012-08-23 22:36:40 +000078 cl::values(
79 clEnumVal(Default, "Default for platform"),
80 clEnumVal(Enable, "Enabled"),
81 clEnumVal(Disable, "Disabled"),
82 clEnumValEnd),
83 cl::init(Default));
Eric Christopher10cb7442012-08-23 07:10:46 +000084
Eric Christopher4daaed12012-12-10 19:51:21 +000085static cl::opt<DefaultOnOff> SplitDwarf("split-dwarf", cl::Hidden,
86 cl::desc("Output prototype dwarf split debug info."),
Eric Christopherf5b6dcd2012-11-12 22:22:20 +000087 cl::values(
88 clEnumVal(Default, "Default for platform"),
89 clEnumVal(Enable, "Enabled"),
90 clEnumVal(Disable, "Disabled"),
91 clEnumValEnd),
92 cl::init(Default));
93
Bill Wendling5f017e82010-04-07 09:28:04 +000094namespace {
95 const char *DWARFGroupName = "DWARF Emission";
96 const char *DbgTimerName = "DWARF Debug Writer";
97} // end anonymous namespace
98
Bill Wendling0310d762009-05-15 09:23:25 +000099//===----------------------------------------------------------------------===//
100
Eric Christopherb6dc8652012-11-27 22:43:45 +0000101// Configuration values for initial hash set sizes (log2).
102//
Bill Wendling0310d762009-05-15 09:23:25 +0000103static const unsigned InitAbbreviationsSetSize = 9; // log2(512)
Bill Wendling0310d762009-05-15 09:23:25 +0000104
105namespace llvm {
106
Nick Lewycky3bbb6f72011-07-29 03:49:23 +0000107DIType DbgVariable::getType() const {
Devang Patel3cbee302011-04-12 22:53:02 +0000108 DIType Ty = Var.getType();
109 // FIXME: isBlockByrefVariable should be reformulated in terms of complex
110 // addresses instead.
111 if (Var.isBlockByrefVariable()) {
112 /* Byref variables, in Blocks, are declared by the programmer as
113 "SomeType VarName;", but the compiler creates a
114 __Block_byref_x_VarName struct, and gives the variable VarName
115 either the struct, or a pointer to the struct, as its type. This
116 is necessary for various behind-the-scenes things the compiler
117 needs to do with by-reference variables in blocks.
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000118
Devang Patel3cbee302011-04-12 22:53:02 +0000119 However, as far as the original *programmer* is concerned, the
120 variable should still have type 'SomeType', as originally declared.
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000121
Devang Patel3cbee302011-04-12 22:53:02 +0000122 The following function dives into the __Block_byref_x_VarName
123 struct to find the original type of the variable. This will be
124 passed back to the code generating the type for the Debug
125 Information Entry for the variable 'VarName'. 'VarName' will then
126 have the original type 'SomeType' in its debug information.
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000127
Devang Patel3cbee302011-04-12 22:53:02 +0000128 The original type 'SomeType' will be the type of the field named
129 'VarName' inside the __Block_byref_x_VarName struct.
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000130
Devang Patel3cbee302011-04-12 22:53:02 +0000131 NOTE: In order for this to not completely fail on the debugger
132 side, the Debug Information Entry for the variable VarName needs to
133 have a DW_AT_location that tells the debugger how to unwind through
134 the pointers and __Block_byref_x_VarName struct to find the actual
135 value of the variable. The function addBlockByrefType does this. */
136 DIType subType = Ty;
137 unsigned tag = Ty.getTag();
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000138
Devang Patel3cbee302011-04-12 22:53:02 +0000139 if (tag == dwarf::DW_TAG_pointer_type) {
140 DIDerivedType DTy = DIDerivedType(Ty);
141 subType = DTy.getTypeDerivedFrom();
142 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000143
Devang Patel3cbee302011-04-12 22:53:02 +0000144 DICompositeType blockStruct = DICompositeType(subType);
145 DIArray Elements = blockStruct.getTypeArray();
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000146
Devang Patel3cbee302011-04-12 22:53:02 +0000147 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
148 DIDescriptor Element = Elements.getElement(i);
149 DIDerivedType DT = DIDerivedType(Element);
150 if (getName() == DT.getName())
151 return (DT.getTypeDerivedFrom());
Devang Patel8bd11de2010-08-09 21:01:39 +0000152 }
Devang Patel8bd11de2010-08-09 21:01:39 +0000153 }
Devang Patel3cbee302011-04-12 22:53:02 +0000154 return Ty;
155}
Bill Wendling0310d762009-05-15 09:23:25 +0000156
Chris Lattnerea761862010-04-05 04:09:20 +0000157} // end llvm namespace
Bill Wendling0310d762009-05-15 09:23:25 +0000158
Chris Lattner49cd6642010-04-05 05:11:15 +0000159DwarfDebug::DwarfDebug(AsmPrinter *A, Module *M)
Eric Christopher28bd25a2012-12-10 19:51:13 +0000160 : Asm(A), MMI(Asm->MMI), FirstCU(0),
Jim Grosbach1e20b962010-07-21 21:21:52 +0000161 AbbreviationsSet(InitAbbreviationsSetSize),
Eric Christopherb6714222013-01-08 22:22:06 +0000162 SourceIdMap(DIEValueAllocator),
Eric Christopher0e3e9b72012-12-10 23:34:43 +0000163 PrevLabel(NULL), GlobalCUIndexCount(0),
Eric Christopherb6714222013-01-08 22:22:06 +0000164 InfoHolder(A, &AbbreviationsSet, &Abbreviations, "info_string",
165 DIEValueAllocator),
Eric Christopher6eebe472012-12-19 22:02:53 +0000166 SkeletonAbbrevSet(InitAbbreviationsSetSize),
Eric Christopherb6714222013-01-08 22:22:06 +0000167 SkeletonHolder(A, &SkeletonAbbrevSet, &SkeletonAbbrevs, "skel_string",
168 DIEValueAllocator) {
Jim Grosbach1e20b962010-07-21 21:21:52 +0000169
Rafael Espindolaf2b04232011-05-06 14:56:22 +0000170 DwarfInfoSectionSym = DwarfAbbrevSectionSym = 0;
Chris Lattner4ad1efe2010-04-04 23:10:38 +0000171 DwarfStrSectionSym = TextSectionSym = 0;
Eric Christopher7a0103c2013-02-07 21:19:50 +0000172 DwarfDebugRangeSectionSym = DwarfDebugLocSectionSym = DwarfLineSectionSym = 0;
Eric Christopher64f824c2012-12-27 02:14:01 +0000173 DwarfAbbrevDWOSectionSym = DwarfStrDWOSectionSym = 0;
Devang Patelc3f5f782010-05-25 23:40:22 +0000174 FunctionBeginSym = FunctionEndSym = 0;
Eric Christopher60777d82012-04-02 17:58:52 +0000175
Eric Christopher10cb7442012-08-23 07:10:46 +0000176 // Turn on accelerator tables and older gdb compatibility
177 // for Darwin.
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000178 bool IsDarwin = Triple(M->getTargetTriple()).isOSDarwin();
Eric Christopher20f47ab2012-08-23 22:36:40 +0000179 if (DarwinGDBCompat == Default) {
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000180 if (IsDarwin)
181 IsDarwinGDBCompat = true;
Eric Christopher20f47ab2012-08-23 22:36:40 +0000182 else
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000183 IsDarwinGDBCompat = false;
Eric Christopher20f47ab2012-08-23 22:36:40 +0000184 } else
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000185 IsDarwinGDBCompat = DarwinGDBCompat == Enable ? true : false;
Eric Christopherc1610fa2012-08-23 22:36:36 +0000186
Eric Christopher20f47ab2012-08-23 22:36:40 +0000187 if (DwarfAccelTables == Default) {
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000188 if (IsDarwin)
189 HasDwarfAccelTables = true;
Eric Christopher20f47ab2012-08-23 22:36:40 +0000190 else
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000191 HasDwarfAccelTables = false;
Eric Christopher20f47ab2012-08-23 22:36:40 +0000192 } else
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000193 HasDwarfAccelTables = DwarfAccelTables == Enable ? true : false;
Eric Christopher20f47ab2012-08-23 22:36:40 +0000194
Eric Christopher4daaed12012-12-10 19:51:21 +0000195 if (SplitDwarf == Default)
196 HasSplitDwarf = false;
Eric Christopherf5b6dcd2012-11-12 22:22:20 +0000197 else
Eric Christopher4daaed12012-12-10 19:51:21 +0000198 HasSplitDwarf = SplitDwarf == Enable ? true : false;
Eric Christopherf5b6dcd2012-11-12 22:22:20 +0000199
Dan Gohman03c3dc72010-06-18 15:56:31 +0000200 {
201 NamedRegionTimer T(DbgTimerName, DWARFGroupName, TimePassesIsEnabled);
Eric Christopherc4639d62012-11-19 22:42:15 +0000202 beginModule();
Torok Edwin9c421072010-04-07 10:44:46 +0000203 }
Bill Wendling0310d762009-05-15 09:23:25 +0000204}
205DwarfDebug::~DwarfDebug() {
Bill Wendling0310d762009-05-15 09:23:25 +0000206}
207
Eric Christopherb6dc8652012-11-27 22:43:45 +0000208// Switch to the specified MCSection and emit an assembler
209// temporary label to it if SymbolStem is specified.
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000210static MCSymbol *emitSectionSym(AsmPrinter *Asm, const MCSection *Section,
Eric Christopherd8a87522011-11-07 09:18:38 +0000211 const char *SymbolStem = 0) {
212 Asm->OutStreamer.SwitchSection(Section);
213 if (!SymbolStem) return 0;
214
215 MCSymbol *TmpSym = Asm->GetTempSymbol(SymbolStem);
216 Asm->OutStreamer.EmitLabel(TmpSym);
217 return TmpSym;
218}
219
Eric Christopher2e5d8702012-12-20 21:58:36 +0000220MCSymbol *DwarfUnits::getStringPoolSym() {
Eric Christopher64f824c2012-12-27 02:14:01 +0000221 return Asm->GetTempSymbol(StringPref);
Nick Lewycky390c40d2011-10-27 06:44:11 +0000222}
223
Eric Christopher2e5d8702012-12-20 21:58:36 +0000224MCSymbol *DwarfUnits::getStringPoolEntry(StringRef Str) {
225 std::pair<MCSymbol*, unsigned> &Entry =
Eric Christopherb6714222013-01-08 22:22:06 +0000226 StringPool.GetOrCreateValue(Str).getValue();
Chris Lattnerbc733f52010-03-13 02:17:42 +0000227 if (Entry.first) return Entry.first;
228
229 Entry.second = NextStringPoolNumber++;
Eric Christopher64f824c2012-12-27 02:14:01 +0000230 return Entry.first = Asm->GetTempSymbol(StringPref, Entry.second);
Chris Lattnerbc733f52010-03-13 02:17:42 +0000231}
232
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000233unsigned DwarfUnits::getStringPoolIndex(StringRef Str) {
234 std::pair<MCSymbol*, unsigned> &Entry =
Eric Christopherb6714222013-01-08 22:22:06 +0000235 StringPool.GetOrCreateValue(Str).getValue();
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000236 if (Entry.first) return Entry.second;
237
238 Entry.second = NextStringPoolNumber++;
239 Entry.first = Asm->GetTempSymbol(StringPref, Entry.second);
240 return Entry.second;
241}
242
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000243unsigned DwarfUnits::getAddrPoolIndex(MCSymbol *Sym) {
244 std::pair<MCSymbol*, unsigned> &Entry = AddressPool[Sym];
245 if (Entry.first) return Entry.second;
246
247 Entry.second = NextAddrPoolNumber++;
248 Entry.first = Sym;
249 return Entry.second;
250}
251
Eric Christopherb6dc8652012-11-27 22:43:45 +0000252// Define a unique number for the abbreviation.
253//
Eric Christopher0e3e9b72012-12-10 23:34:43 +0000254void DwarfUnits::assignAbbrevNumber(DIEAbbrev &Abbrev) {
Bill Wendling0310d762009-05-15 09:23:25 +0000255 // Profile the node so that we can make it unique.
256 FoldingSetNodeID ID;
257 Abbrev.Profile(ID);
258
259 // Check the set for priors.
Eric Christopher0e3e9b72012-12-10 23:34:43 +0000260 DIEAbbrev *InSet = AbbreviationsSet->GetOrInsertNode(&Abbrev);
Bill Wendling0310d762009-05-15 09:23:25 +0000261
262 // If it's newly added.
263 if (InSet == &Abbrev) {
264 // Add to abbreviation list.
Eric Christopher0e3e9b72012-12-10 23:34:43 +0000265 Abbreviations->push_back(&Abbrev);
Bill Wendling0310d762009-05-15 09:23:25 +0000266
267 // Assign the vector position + 1 as its number.
Eric Christopher0e3e9b72012-12-10 23:34:43 +0000268 Abbrev.setNumber(Abbreviations->size());
Bill Wendling0310d762009-05-15 09:23:25 +0000269 } else {
270 // Assign existing abbreviation number.
271 Abbrev.setNumber(InSet->getNumber());
272 }
273}
274
Eric Christopherb6dc8652012-11-27 22:43:45 +0000275// If special LLVM prefix that is used to inform the asm
276// printer to not emit usual symbol prefix before the symbol name is used then
277// return linkage name after skipping this special LLVM prefix.
Devang Patel351ca332010-01-05 01:46:14 +0000278static StringRef getRealLinkageName(StringRef LinkageName) {
279 char One = '\1';
280 if (LinkageName.startswith(StringRef(&One, 1)))
281 return LinkageName.substr(1);
282 return LinkageName;
283}
284
Eric Christopher0ffe2b42011-11-10 19:25:34 +0000285static bool isObjCClass(StringRef Name) {
286 return Name.startswith("+") || Name.startswith("-");
287}
288
289static bool hasObjCCategory(StringRef Name) {
290 if (!isObjCClass(Name)) return false;
291
292 size_t pos = Name.find(')');
293 if (pos != std::string::npos) {
294 if (Name[pos+1] != ' ') return false;
295 return true;
296 }
297 return false;
298}
299
300static void getObjCClassCategory(StringRef In, StringRef &Class,
301 StringRef &Category) {
302 if (!hasObjCCategory(In)) {
303 Class = In.slice(In.find('[') + 1, In.find(' '));
304 Category = "";
305 return;
306 }
307
308 Class = In.slice(In.find('[') + 1, In.find('('));
309 Category = In.slice(In.find('[') + 1, In.find(' '));
310 return;
311}
312
313static StringRef getObjCMethodName(StringRef In) {
314 return In.slice(In.find(' ') + 1, In.find(']'));
315}
316
317// Add the various names to the Dwarf accelerator table names.
318static void addSubprogramNames(CompileUnit *TheCU, DISubprogram SP,
319 DIE* Die) {
320 if (!SP.isDefinition()) return;
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000321
Eric Christopher0ffe2b42011-11-10 19:25:34 +0000322 TheCU->addAccelName(SP.getName(), Die);
323
324 // If the linkage name is different than the name, go ahead and output
325 // that as well into the name table.
326 if (SP.getLinkageName() != "" && SP.getName() != SP.getLinkageName())
327 TheCU->addAccelName(SP.getLinkageName(), Die);
328
329 // If this is an Objective-C selector name add it to the ObjC accelerator
330 // too.
331 if (isObjCClass(SP.getName())) {
332 StringRef Class, Category;
333 getObjCClassCategory(SP.getName(), Class, Category);
334 TheCU->addAccelObjC(Class, Die);
335 if (Category != "")
336 TheCU->addAccelObjC(Category, Die);
337 // Also add the base method name to the name table.
338 TheCU->addAccelName(getObjCMethodName(SP.getName()), Die);
339 }
340}
341
Eric Christopherb6dc8652012-11-27 22:43:45 +0000342// Find DIE for the given subprogram and attach appropriate DW_AT_low_pc
343// and DW_AT_high_pc attributes. If there are global variables in this
344// scope then create and insert DIEs for these variables.
Devang Pateld3024342011-08-15 22:24:32 +0000345DIE *DwarfDebug::updateSubprogramScopeDIE(CompileUnit *SPCU,
346 const MDNode *SPNode) {
Devang Patel163a9f72010-05-10 22:49:55 +0000347 DIE *SPDie = SPCU->getDIE(SPNode);
Devang Patel8aa61472010-07-07 22:20:57 +0000348
Chris Lattnerd38fee82010-04-05 00:13:49 +0000349 assert(SPDie && "Unable to find subprogram DIE!");
350 DISubprogram SP(SPNode);
Jim Grosbach1e20b962010-07-21 21:21:52 +0000351
Bill Wendling168c1902012-11-07 05:19:04 +0000352 // If we're updating an abstract DIE, then we will be adding the children and
353 // object pointer later on. But what we don't want to do is process the
354 // concrete DIE twice.
Manman Renbc3e96f2013-03-12 18:27:15 +0000355 DIE *AbsSPDIE = AbstractSPDies.lookup(SPNode);
356 if (AbsSPDIE) {
357 bool InSameCU = (AbsSPDIE->getCompileUnit() == SPCU->getCUDie());
Bill Wendling168c1902012-11-07 05:19:04 +0000358 // Pick up abstract subprogram DIE.
Devang Patel8aa61472010-07-07 22:20:57 +0000359 SPDie = new DIE(dwarf::DW_TAG_subprogram);
Manman Renbc3e96f2013-03-12 18:27:15 +0000360 // If AbsSPDIE belongs to a different CU, use DW_FORM_ref_addr instead of
361 // DW_FORM_ref4.
Devang Patel3cbee302011-04-12 22:53:02 +0000362 SPCU->addDIEEntry(SPDie, dwarf::DW_AT_abstract_origin,
Manman Renbc3e96f2013-03-12 18:27:15 +0000363 InSameCU ? dwarf::DW_FORM_ref4 : dwarf::DW_FORM_ref_addr,
364 AbsSPDIE);
Devang Patel8aa61472010-07-07 22:20:57 +0000365 SPCU->addDie(SPDie);
Bill Wendlinga4c76932012-11-07 04:42:18 +0000366 } else {
367 DISubprogram SPDecl = SP.getFunctionDeclaration();
368 if (!SPDecl.isSubprogram()) {
369 // There is not any need to generate specification DIE for a function
370 // defined at compile unit level. If a function is defined inside another
371 // function then gdb prefers the definition at top level and but does not
372 // expect specification DIE in parent function. So avoid creating
373 // specification DIE for a function defined inside a function.
374 if (SP.isDefinition() && !SP.getContext().isCompileUnit() &&
375 !SP.getContext().isFile() &&
376 !isSubprogramContext(SP.getContext())) {
377 SPCU->addFlag(SPDie, dwarf::DW_AT_declaration);
378
379 // Add arguments.
380 DICompositeType SPTy = SP.getType();
381 DIArray Args = SPTy.getTypeArray();
382 unsigned SPTag = SPTy.getTag();
383 if (SPTag == dwarf::DW_TAG_subroutine_type)
384 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
385 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
386 DIType ATy = DIType(Args.getElement(i));
387 SPCU->addType(Arg, ATy);
388 if (ATy.isArtificial())
389 SPCU->addFlag(Arg, dwarf::DW_AT_artificial);
390 if (ATy.isObjectPointer())
391 SPCU->addDIEEntry(SPDie, dwarf::DW_AT_object_pointer,
392 dwarf::DW_FORM_ref4, Arg);
393 SPDie->addChild(Arg);
394 }
395 DIE *SPDeclDie = SPDie;
396 SPDie = new DIE(dwarf::DW_TAG_subprogram);
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000397 SPCU->addDIEEntry(SPDie, dwarf::DW_AT_specification,
398 dwarf::DW_FORM_ref4, SPDeclDie);
Bill Wendlinga4c76932012-11-07 04:42:18 +0000399 SPCU->addDie(SPDie);
400 }
401 }
Devang Patel8aa61472010-07-07 22:20:57 +0000402 }
403
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000404 SPCU->addLabelAddress(SPDie, dwarf::DW_AT_low_pc,
405 Asm->GetTempSymbol("func_begin",
406 Asm->getFunctionNumber()));
407 SPCU->addLabelAddress(SPDie, dwarf::DW_AT_high_pc,
408 Asm->GetTempSymbol("func_end",
409 Asm->getFunctionNumber()));
Chris Lattnerd38fee82010-04-05 00:13:49 +0000410 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
411 MachineLocation Location(RI->getFrameRegister(*Asm->MF));
Devang Patel3cbee302011-04-12 22:53:02 +0000412 SPCU->addAddress(SPDie, dwarf::DW_AT_frame_base, Location);
Devang Patelb4645642010-02-06 01:02:37 +0000413
Eric Christopher0ffe2b42011-11-10 19:25:34 +0000414 // Add name to the name table, we do this here because we're guaranteed
415 // to have concrete versions of our DW_TAG_subprogram nodes.
416 addSubprogramNames(SPCU, SP, SPDie);
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000417
Chris Lattnerd38fee82010-04-05 00:13:49 +0000418 return SPDie;
Devang Patel53bb5c92009-11-10 23:06:00 +0000419}
420
Eric Christopherb6dc8652012-11-27 22:43:45 +0000421// Construct new DW_TAG_lexical_block for this scope and attach
422// DW_AT_low_pc/DW_AT_high_pc labels.
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000423DIE *DwarfDebug::constructLexicalScopeDIE(CompileUnit *TheCU,
Devang Pateld3024342011-08-15 22:24:32 +0000424 LexicalScope *Scope) {
Devang Pateleac9c072010-04-27 19:46:33 +0000425 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_lexical_block);
426 if (Scope->isAbstractScope())
427 return ScopeDIE;
428
Devang Patelbf47fdb2011-08-10 20:55:27 +0000429 const SmallVector<InsnRange, 4> &Ranges = Scope->getRanges();
Devang Pateleac9c072010-04-27 19:46:33 +0000430 if (Ranges.empty())
431 return 0;
432
Devang Patelbf47fdb2011-08-10 20:55:27 +0000433 SmallVector<InsnRange, 4>::const_iterator RI = Ranges.begin();
Devang Pateleac9c072010-04-27 19:46:33 +0000434 if (Ranges.size() > 1) {
435 // .debug_range section has not been laid out yet. Emit offset in
Jim Grosbach1e20b962010-07-21 21:21:52 +0000436 // .debug_range as a uint, size 4, for now. emitDIE will handle
Devang Pateleac9c072010-04-27 19:46:33 +0000437 // DW_AT_ranges appropriately.
Devang Patel3cbee302011-04-12 22:53:02 +0000438 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_ranges, dwarf::DW_FORM_data4,
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000439 DebugRangeSymbols.size()
Chandler Carruth426c2bf2012-11-01 09:14:31 +0000440 * Asm->getDataLayout().getPointerSize());
Devang Patelbf47fdb2011-08-10 20:55:27 +0000441 for (SmallVector<InsnRange, 4>::const_iterator RI = Ranges.begin(),
Devang Pateleac9c072010-04-27 19:46:33 +0000442 RE = Ranges.end(); RI != RE; ++RI) {
Devang Patelc3f5f782010-05-25 23:40:22 +0000443 DebugRangeSymbols.push_back(getLabelBeforeInsn(RI->first));
444 DebugRangeSymbols.push_back(getLabelAfterInsn(RI->second));
Devang Pateleac9c072010-04-27 19:46:33 +0000445 }
446 DebugRangeSymbols.push_back(NULL);
447 DebugRangeSymbols.push_back(NULL);
448 return ScopeDIE;
449 }
450
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000451 MCSymbol *Start = getLabelBeforeInsn(RI->first);
452 MCSymbol *End = getLabelAfterInsn(RI->second);
Devang Pateleac9c072010-04-27 19:46:33 +0000453
Devang Patelc3f5f782010-05-25 23:40:22 +0000454 if (End == 0) return 0;
Devang Patel53bb5c92009-11-10 23:06:00 +0000455
Chris Lattnerb7db7332010-03-09 01:58:53 +0000456 assert(Start->isDefined() && "Invalid starting label for an inlined scope!");
457 assert(End->isDefined() && "Invalid end label for an inlined scope!");
Jim Grosbach1e20b962010-07-21 21:21:52 +0000458
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000459 TheCU->addLabelAddress(ScopeDIE, dwarf::DW_AT_low_pc, Start);
460 TheCU->addLabelAddress(ScopeDIE, dwarf::DW_AT_high_pc, End);
Devang Patel53bb5c92009-11-10 23:06:00 +0000461
462 return ScopeDIE;
463}
464
Eric Christopherb6dc8652012-11-27 22:43:45 +0000465// This scope represents inlined body of a function. Construct DIE to
466// represent this concrete inlined copy of the function.
Devang Pateld3024342011-08-15 22:24:32 +0000467DIE *DwarfDebug::constructInlinedScopeDIE(CompileUnit *TheCU,
468 LexicalScope *Scope) {
Devang Patelbf47fdb2011-08-10 20:55:27 +0000469 const SmallVector<InsnRange, 4> &Ranges = Scope->getRanges();
Nick Lewycky746cb672011-10-26 22:55:33 +0000470 assert(Ranges.empty() == false &&
471 "LexicalScope does not have instruction markers!");
Devang Pateleac9c072010-04-27 19:46:33 +0000472
Devang Patel26a92002011-07-27 00:34:13 +0000473 if (!Scope->getScopeNode())
474 return NULL;
475 DIScope DS(Scope->getScopeNode());
476 DISubprogram InlinedSP = getDISubprogram(DS);
Devang Patel26a92002011-07-27 00:34:13 +0000477 DIE *OriginDIE = TheCU->getDIE(InlinedSP);
478 if (!OriginDIE) {
Bill Wendlinge0aae5b2012-10-30 17:51:02 +0000479 DEBUG(dbgs() << "Unable to find original DIE for an inlined subprogram.");
Devang Patel26a92002011-07-27 00:34:13 +0000480 return NULL;
481 }
482
Devang Patelbf47fdb2011-08-10 20:55:27 +0000483 SmallVector<InsnRange, 4>::const_iterator RI = Ranges.begin();
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000484 MCSymbol *StartLabel = getLabelBeforeInsn(RI->first);
485 MCSymbol *EndLabel = getLabelAfterInsn(RI->second);
Devang Pateleac9c072010-04-27 19:46:33 +0000486
Devang Patel0afbf232010-07-08 22:39:20 +0000487 if (StartLabel == 0 || EndLabel == 0) {
Bill Wendlinge0aae5b2012-10-30 17:51:02 +0000488 llvm_unreachable("Unexpected Start and End labels for an inlined scope!");
Devang Pateleac9c072010-04-27 19:46:33 +0000489 }
Chris Lattnerb7db7332010-03-09 01:58:53 +0000490 assert(StartLabel->isDefined() &&
Chris Lattnera34ec2292010-03-09 01:51:43 +0000491 "Invalid starting label for an inlined scope!");
Chris Lattnerb7db7332010-03-09 01:58:53 +0000492 assert(EndLabel->isDefined() &&
Chris Lattnera34ec2292010-03-09 01:51:43 +0000493 "Invalid end label for an inlined scope!");
Devang Pateleac9c072010-04-27 19:46:33 +0000494
Devang Pateld96efb82011-05-05 17:54:26 +0000495 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_inlined_subroutine);
Devang Patel3cbee302011-04-12 22:53:02 +0000496 TheCU->addDIEEntry(ScopeDIE, dwarf::DW_AT_abstract_origin,
497 dwarf::DW_FORM_ref4, OriginDIE);
Devang Patel53bb5c92009-11-10 23:06:00 +0000498
Devang Patel26a92002011-07-27 00:34:13 +0000499 if (Ranges.size() > 1) {
500 // .debug_range section has not been laid out yet. Emit offset in
501 // .debug_range as a uint, size 4, for now. emitDIE will handle
502 // DW_AT_ranges appropriately.
503 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_ranges, dwarf::DW_FORM_data4,
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000504 DebugRangeSymbols.size()
Chandler Carruth426c2bf2012-11-01 09:14:31 +0000505 * Asm->getDataLayout().getPointerSize());
Devang Patelbf47fdb2011-08-10 20:55:27 +0000506 for (SmallVector<InsnRange, 4>::const_iterator RI = Ranges.begin(),
Devang Patel26a92002011-07-27 00:34:13 +0000507 RE = Ranges.end(); RI != RE; ++RI) {
508 DebugRangeSymbols.push_back(getLabelBeforeInsn(RI->first));
509 DebugRangeSymbols.push_back(getLabelAfterInsn(RI->second));
510 }
511 DebugRangeSymbols.push_back(NULL);
512 DebugRangeSymbols.push_back(NULL);
513 } else {
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000514 TheCU->addLabelAddress(ScopeDIE, dwarf::DW_AT_low_pc, StartLabel);
515 TheCU->addLabelAddress(ScopeDIE, dwarf::DW_AT_high_pc, EndLabel);
Devang Patel26a92002011-07-27 00:34:13 +0000516 }
Devang Patel53bb5c92009-11-10 23:06:00 +0000517
518 InlinedSubprogramDIEs.insert(OriginDIE);
519
520 // Track the start label for this inlined function.
Devang Patel26a92002011-07-27 00:34:13 +0000521 //.debug_inlined section specification does not clearly state how
522 // to emit inlined scope that is split into multiple instruction ranges.
523 // For now, use first instruction range and emit low_pc/high_pc pair and
524 // corresponding .debug_inlined section entry for this pair.
Devang Patele9f8f5e2010-05-07 20:54:48 +0000525 DenseMap<const MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator
Devang Patel2db49d72010-05-07 18:11:54 +0000526 I = InlineInfo.find(InlinedSP);
Devang Patel53bb5c92009-11-10 23:06:00 +0000527
528 if (I == InlineInfo.end()) {
Nick Lewycky746cb672011-10-26 22:55:33 +0000529 InlineInfo[InlinedSP].push_back(std::make_pair(StartLabel, ScopeDIE));
Devang Patel2db49d72010-05-07 18:11:54 +0000530 InlinedSPNodes.push_back(InlinedSP);
Devang Patel53bb5c92009-11-10 23:06:00 +0000531 } else
Chris Lattner6ed0f902010-03-09 00:31:02 +0000532 I->second.push_back(std::make_pair(StartLabel, ScopeDIE));
Devang Patel53bb5c92009-11-10 23:06:00 +0000533
Devang Patel53bb5c92009-11-10 23:06:00 +0000534 DILocation DL(Scope->getInlinedAt());
Eric Christopher08212002012-03-26 21:38:38 +0000535 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_call_file, 0,
Manman Ren3de61b42013-03-07 01:42:00 +0000536 getOrCreateSourceID(DL.getFilename(), DL.getDirectory(),
537 TheCU->getUniqueID()));
Devang Patel3cbee302011-04-12 22:53:02 +0000538 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_call_line, 0, DL.getLineNumber());
Devang Patel53bb5c92009-11-10 23:06:00 +0000539
Eric Christopher309bedd2011-12-04 06:02:38 +0000540 // Add name to the name table, we do this here because we're guaranteed
541 // to have concrete versions of our DW_TAG_inlined_subprogram nodes.
542 addSubprogramNames(TheCU, InlinedSP, ScopeDIE);
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000543
Devang Patel53bb5c92009-11-10 23:06:00 +0000544 return ScopeDIE;
545}
546
Eric Christopherb6dc8652012-11-27 22:43:45 +0000547// Construct a DIE for this scope.
Devang Pateld0b5a5e2011-08-15 22:04:40 +0000548DIE *DwarfDebug::constructScopeDIE(CompileUnit *TheCU, LexicalScope *Scope) {
Devang Patel3c91b052010-03-08 20:52:55 +0000549 if (!Scope || !Scope->getScopeNode())
550 return NULL;
Jim Grosbach1e20b962010-07-21 21:21:52 +0000551
Manman Ren8b15d742013-01-31 20:05:14 +0000552 DIScope DS(Scope->getScopeNode());
553 // Early return to avoid creating dangling variable|scope DIEs.
554 if (!Scope->getInlinedAt() && DS.isSubprogram() && Scope->isAbstractScope() &&
555 !TheCU->getDIE(DS))
556 return NULL;
557
Nick Lewycky746cb672011-10-26 22:55:33 +0000558 SmallVector<DIE *, 8> Children;
Eric Christophere5212782012-09-12 23:36:19 +0000559 DIE *ObjectPointer = NULL;
Devang Patel0478c152011-03-01 22:58:55 +0000560
561 // Collect arguments for current function.
Devang Patelbf47fdb2011-08-10 20:55:27 +0000562 if (LScopes.isCurrentFunctionScope(Scope))
Devang Patel0478c152011-03-01 22:58:55 +0000563 for (unsigned i = 0, N = CurrentFnArguments.size(); i < N; ++i)
564 if (DbgVariable *ArgDV = CurrentFnArguments[i])
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000565 if (DIE *Arg =
Eric Christophere5212782012-09-12 23:36:19 +0000566 TheCU->constructVariableDIE(ArgDV, Scope->isAbstractScope())) {
Devang Patel0478c152011-03-01 22:58:55 +0000567 Children.push_back(Arg);
Eric Christophere5212782012-09-12 23:36:19 +0000568 if (ArgDV->isObjectPointer()) ObjectPointer = Arg;
569 }
Devang Patel0478c152011-03-01 22:58:55 +0000570
Eric Christopher1aeb7ac2011-10-03 15:49:16 +0000571 // Collect lexical scope children first.
Devang Patelbf47fdb2011-08-10 20:55:27 +0000572 const SmallVector<DbgVariable *, 8> &Variables = ScopeVariables.lookup(Scope);
Devang Patel5bc9fec2011-02-19 01:31:27 +0000573 for (unsigned i = 0, N = Variables.size(); i < N; ++i)
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000574 if (DIE *Variable =
Eric Christopher7b451cf2012-09-21 22:18:52 +0000575 TheCU->constructVariableDIE(Variables[i], Scope->isAbstractScope())) {
Devang Patel5bc9fec2011-02-19 01:31:27 +0000576 Children.push_back(Variable);
Eric Christopher7b451cf2012-09-21 22:18:52 +0000577 if (Variables[i]->isObjectPointer()) ObjectPointer = Variable;
578 }
Devang Patelbf47fdb2011-08-10 20:55:27 +0000579 const SmallVector<LexicalScope *, 4> &Scopes = Scope->getChildren();
Devang Patel5bc9fec2011-02-19 01:31:27 +0000580 for (unsigned j = 0, M = Scopes.size(); j < M; ++j)
Devang Pateld0b5a5e2011-08-15 22:04:40 +0000581 if (DIE *Nested = constructScopeDIE(TheCU, Scopes[j]))
Devang Patel5bc9fec2011-02-19 01:31:27 +0000582 Children.push_back(Nested);
Devang Patel3c91b052010-03-08 20:52:55 +0000583 DIE *ScopeDIE = NULL;
584 if (Scope->getInlinedAt())
Devang Pateld3024342011-08-15 22:24:32 +0000585 ScopeDIE = constructInlinedScopeDIE(TheCU, Scope);
Devang Patel3c91b052010-03-08 20:52:55 +0000586 else if (DS.isSubprogram()) {
Devang Patel0dd45582010-06-28 20:53:04 +0000587 ProcessedSPNodes.insert(DS);
Devang Patel8aa61472010-07-07 22:20:57 +0000588 if (Scope->isAbstractScope()) {
Devang Pateld3024342011-08-15 22:24:32 +0000589 ScopeDIE = TheCU->getDIE(DS);
Devang Patel8aa61472010-07-07 22:20:57 +0000590 // Note down abstract DIE.
591 if (ScopeDIE)
592 AbstractSPDies.insert(std::make_pair(DS, ScopeDIE));
593 }
Devang Patel3c91b052010-03-08 20:52:55 +0000594 else
Devang Pateld3024342011-08-15 22:24:32 +0000595 ScopeDIE = updateSubprogramScopeDIE(TheCU, DS);
Devang Patel3c91b052010-03-08 20:52:55 +0000596 }
Devang Patel5bc9fec2011-02-19 01:31:27 +0000597 else {
598 // There is no need to emit empty lexical block DIE.
599 if (Children.empty())
600 return NULL;
Devang Pateld3024342011-08-15 22:24:32 +0000601 ScopeDIE = constructLexicalScopeDIE(TheCU, Scope);
Devang Patel5bc9fec2011-02-19 01:31:27 +0000602 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000603
Devang Patelaead63c2010-03-29 22:59:58 +0000604 if (!ScopeDIE) return NULL;
Jim Grosbach1e20b962010-07-21 21:21:52 +0000605
Devang Patel5bc9fec2011-02-19 01:31:27 +0000606 // Add children
607 for (SmallVector<DIE *, 8>::iterator I = Children.begin(),
608 E = Children.end(); I != E; ++I)
609 ScopeDIE->addChild(*I);
Devang Patel193f7202009-11-24 01:14:22 +0000610
Eric Christophere5212782012-09-12 23:36:19 +0000611 if (DS.isSubprogram() && ObjectPointer != NULL)
612 TheCU->addDIEEntry(ScopeDIE, dwarf::DW_AT_object_pointer,
613 dwarf::DW_FORM_ref4, ObjectPointer);
614
Jim Grosbach1e20b962010-07-21 21:21:52 +0000615 if (DS.isSubprogram())
Eric Christopher0ffe2b42011-11-10 19:25:34 +0000616 TheCU->addPubTypes(DISubprogram(DS));
Jim Grosbach1e20b962010-07-21 21:21:52 +0000617
Eric Christopher0ffe2b42011-11-10 19:25:34 +0000618 return ScopeDIE;
Devang Patel53bb5c92009-11-10 23:06:00 +0000619}
620
Eric Christopherb6dc8652012-11-27 22:43:45 +0000621// Look up the source id with the given directory and source file names.
622// If none currently exists, create a new id and insert it in the
623// SourceIds map. This can update DirectoryNames and SourceFileNames maps
624// as well.
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000625unsigned DwarfDebug::getOrCreateSourceID(StringRef FileName,
Manman Ren3de61b42013-03-07 01:42:00 +0000626 StringRef DirName, unsigned CUID) {
627 // If we use .loc in assembly, we can't separate .file entries according to
628 // compile units. Thus all files will belong to the default compile unit.
629 if (Asm->TM.hasMCUseLoc() &&
630 Asm->OutStreamer.getKind() == MCStreamer::SK_AsmStreamer)
631 CUID = 0;
632
Devang Patel1905a182010-09-16 20:57:49 +0000633 // If FE did not provide a file name, then assume stdin.
634 if (FileName.empty())
Manman Ren3de61b42013-03-07 01:42:00 +0000635 return getOrCreateSourceID("<stdin>", StringRef(), CUID);
Devang Patel23670e52011-03-24 20:30:50 +0000636
Nick Lewycky6c1a7032011-11-02 20:55:33 +0000637 // TODO: this might not belong here. See if we can factor this better.
638 if (DirName == CompilationDir)
639 DirName = "";
640
Manman Ren3de61b42013-03-07 01:42:00 +0000641 // FileIDCUMap stores the current ID for the given compile unit.
642 unsigned SrcId = FileIDCUMap[CUID] + 1;
Devang Patel1905a182010-09-16 20:57:49 +0000643
Manman Ren3de61b42013-03-07 01:42:00 +0000644 // We look up the CUID/file/dir by concatenating them with a zero byte.
Benjamin Kramer74612c22012-03-11 14:56:26 +0000645 SmallString<128> NamePair;
Manman Ren3de61b42013-03-07 01:42:00 +0000646 NamePair += CUID;
647 NamePair += '\0';
Benjamin Kramer74612c22012-03-11 14:56:26 +0000648 NamePair += DirName;
649 NamePair += '\0'; // Zero bytes are not allowed in paths.
650 NamePair += FileName;
651
652 StringMapEntry<unsigned> &Ent = SourceIdMap.GetOrCreateValue(NamePair, SrcId);
653 if (Ent.getValue() != SrcId)
654 return Ent.getValue();
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000655
Manman Ren3de61b42013-03-07 01:42:00 +0000656 FileIDCUMap[CUID] = SrcId;
Rafael Espindola5c055632010-11-18 02:04:25 +0000657 // Print out a .file directive to specify files for .loc directives.
Manman Ren3de61b42013-03-07 01:42:00 +0000658 Asm->OutStreamer.EmitDwarfFileDirective(SrcId, DirName, FileName, CUID);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000659
660 return SrcId;
661}
662
Eric Christopher72c16552012-12-20 21:58:40 +0000663// Create new CompileUnit for the given metadata node with tag
664// DW_TAG_compile_unit.
Devang Patel94c7ddb2011-08-16 22:09:43 +0000665CompileUnit *DwarfDebug::constructCompileUnit(const MDNode *N) {
Devang Patele4b27562009-08-28 23:24:31 +0000666 DICompileUnit DIUnit(N);
Devang Patel65dbc902009-11-25 17:36:49 +0000667 StringRef FN = DIUnit.getFilename();
Nick Lewycky6c1a7032011-11-02 20:55:33 +0000668 CompilationDir = DIUnit.getDirectory();
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000669
670 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
Eli Benderskyd4a05e02012-12-03 18:45:45 +0000671 CompileUnit *NewCU = new CompileUnit(GlobalCUIndexCount++,
Eric Christopher2e5d8702012-12-20 21:58:36 +0000672 DIUnit.getLanguage(), Die, Asm,
673 this, &InfoHolder);
Manman Ren3de61b42013-03-07 01:42:00 +0000674
675 FileIDCUMap[NewCU->getUniqueID()] = 0;
676 // Call this to emit a .file directive if it wasn't emitted for the source
677 // file this CU comes from yet.
678 getOrCreateSourceID(FN, CompilationDir, NewCU->getUniqueID());
679
Nick Lewycky390c40d2011-10-27 06:44:11 +0000680 NewCU->addString(Die, dwarf::DW_AT_producer, DIUnit.getProducer());
Devang Patel3cbee302011-04-12 22:53:02 +0000681 NewCU->addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data2,
682 DIUnit.getLanguage());
Nick Lewycky390c40d2011-10-27 06:44:11 +0000683 NewCU->addString(Die, dwarf::DW_AT_name, FN);
Eric Christopher6635cad2012-08-01 18:19:01 +0000684 // 2.17.1 requires that we use DW_AT_low_pc for a single entry point
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000685 // into an entity. We're using 0 (or a NULL label) for this.
686 NewCU->addLabelAddress(Die, dwarf::DW_AT_low_pc, NULL);
Manman Ren43213cf2013-02-05 21:52:47 +0000687
688 // Define start line table label for each Compile Unit.
689 MCSymbol *LineTableStartSym = Asm->GetTempSymbol("line_table_start",
690 NewCU->getUniqueID());
691 Asm->OutStreamer.getContext().setMCLineTableSymbol(LineTableStartSym,
692 NewCU->getUniqueID());
693
Devang Patel4a602ca2010-03-22 23:11:36 +0000694 // DW_AT_stmt_list is a offset of line number information for this
Devang Patelaf608bd2010-08-24 00:06:12 +0000695 // compile unit in debug_line section.
Manman Renf2d89ff2013-02-09 00:41:44 +0000696 // The line table entries are not always emitted in assembly, so it
697 // is not okay to use line_table_start here.
Rafael Espindola2241e512012-06-22 13:24:07 +0000698 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
Rafael Espindola597a7662011-05-04 17:44:06 +0000699 NewCU->addLabel(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4,
Manman Renf2d89ff2013-02-09 00:41:44 +0000700 NewCU->getUniqueID() == 0 ?
701 Asm->GetTempSymbol("section_line") : LineTableStartSym);
Manman Ren9c5861f2013-02-06 00:59:41 +0000702 else if (NewCU->getUniqueID() == 0)
703 NewCU->addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4, 0);
Devang Patelae84d5b2010-08-31 23:50:19 +0000704 else
Manman Ren43213cf2013-02-05 21:52:47 +0000705 NewCU->addDelta(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4,
Eric Christopher7a0103c2013-02-07 21:19:50 +0000706 LineTableStartSym, DwarfLineSectionSym);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000707
Nick Lewycky6c1a7032011-11-02 20:55:33 +0000708 if (!CompilationDir.empty())
709 NewCU->addString(Die, dwarf::DW_AT_comp_dir, CompilationDir);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000710 if (DIUnit.isOptimized())
Eric Christopher873cf0a2012-08-24 01:14:27 +0000711 NewCU->addFlag(Die, dwarf::DW_AT_APPLE_optimized);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000712
Devang Patel65dbc902009-11-25 17:36:49 +0000713 StringRef Flags = DIUnit.getFlags();
714 if (!Flags.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +0000715 NewCU->addString(Die, dwarf::DW_AT_APPLE_flags, Flags);
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000716
Nick Lewyckyd5d52132011-10-17 23:27:36 +0000717 if (unsigned RVer = DIUnit.getRunTimeVersion())
Devang Patel3cbee302011-04-12 22:53:02 +0000718 NewCU->addUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers,
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000719 dwarf::DW_FORM_data1, RVer);
720
Devang Patel163a9f72010-05-10 22:49:55 +0000721 if (!FirstCU)
722 FirstCU = NewCU;
Eric Christopher208cc6f2013-02-05 07:31:55 +0000723
Eric Christopher31fb5da2013-02-05 07:32:03 +0000724 if (useSplitDwarf()) {
725 // This should be a unique identifier when we want to build .dwp files.
Eric Christopher208cc6f2013-02-05 07:31:55 +0000726 NewCU->addUInt(Die, dwarf::DW_AT_GNU_dwo_id, dwarf::DW_FORM_data8, 0);
Eric Christopher31fb5da2013-02-05 07:32:03 +0000727 // Now construct the skeleton CU associated.
728 constructSkeletonCU(N);
729 }
Eric Christopher98e237f2012-11-30 23:59:06 +0000730
Eric Christopher0e3e9b72012-12-10 23:34:43 +0000731 InfoHolder.addUnit(NewCU);
732
Devang Patel163a9f72010-05-10 22:49:55 +0000733 CUMap.insert(std::make_pair(N, NewCU));
Devang Patel94c7ddb2011-08-16 22:09:43 +0000734 return NewCU;
Devang Patel163a9f72010-05-10 22:49:55 +0000735}
736
Eric Christopherb6dc8652012-11-27 22:43:45 +0000737// Construct subprogram DIE.
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000738void DwarfDebug::constructSubprogramDIE(CompileUnit *TheCU,
Devang Patel3655a212011-08-15 23:36:40 +0000739 const MDNode *N) {
Rafael Espindolab0527282011-11-04 19:00:29 +0000740 CompileUnit *&CURef = SPMap[N];
741 if (CURef)
742 return;
743 CURef = TheCU;
744
Devang Patele4b27562009-08-28 23:24:31 +0000745 DISubprogram SP(N);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000746 if (!SP.isDefinition())
747 // This is a method declaration which will be handled while constructing
748 // class type.
Devang Patel13e16b62009-06-26 01:49:18 +0000749 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000750
Devang Pateldbc64af2011-08-15 17:24:54 +0000751 DIE *SubprogramDie = TheCU->getOrCreateSubprogramDIE(SP);
Stuart Hastings639336e2010-04-06 21:38:29 +0000752
753 // Add to map.
Devang Patel163a9f72010-05-10 22:49:55 +0000754 TheCU->insertDIE(N, SubprogramDie);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000755
756 // Add to context owner.
Devang Patel3cbee302011-04-12 22:53:02 +0000757 TheCU->addToContextOwner(SubprogramDie, SP.getContext());
Devang Patel0000fad2009-12-08 23:21:45 +0000758
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +0000759 // Expose as global, if requested.
760 if (GenerateDwarfPubNamesSection)
761 TheCU->addGlobalName(SP.getName(), SubprogramDie);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000762}
763
Eric Christopherb6dc8652012-11-27 22:43:45 +0000764// Emit all Dwarf sections that should come prior to the content. Create
765// global DIEs and emit initial debug info sections. This is invoked by
766// the target AsmPrinter.
Eric Christopherc4639d62012-11-19 22:42:15 +0000767void DwarfDebug::beginModule() {
Devang Pateleac9c072010-04-27 19:46:33 +0000768 if (DisableDebugInfoPrinting)
769 return;
770
Eric Christopherc4639d62012-11-19 22:42:15 +0000771 const Module *M = MMI->getModule();
772
Nick Lewycky3bbb6f72011-07-29 03:49:23 +0000773 // If module has named metadata anchors then use them, otherwise scan the
774 // module using debug info finder to collect debug info.
Devang Patel30692ab2011-05-03 16:45:22 +0000775 NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu");
David Blaikiec0ec8a42013-03-11 23:39:23 +0000776 if (!CU_Nodes)
Devang Patel02e603f2011-08-15 23:47:24 +0000777 return;
Devang Patel30692ab2011-05-03 16:45:22 +0000778
David Blaikiec0ec8a42013-03-11 23:39:23 +0000779 // Emit initial sections so we can reference labels later.
780 emitSectionLabels();
781
782 for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i) {
783 DICompileUnit CUNode(CU_Nodes->getOperand(i));
784 CompileUnit *CU = constructCompileUnit(CUNode);
785 DIArray GVs = CUNode.getGlobalVariables();
786 for (unsigned i = 0, e = GVs.getNumElements(); i != e; ++i)
787 CU->createGlobalVariableDIE(GVs.getElement(i));
788 DIArray SPs = CUNode.getSubprograms();
789 for (unsigned i = 0, e = SPs.getNumElements(); i != e; ++i)
790 constructSubprogramDIE(CU, SPs.getElement(i));
791 DIArray EnumTypes = CUNode.getEnumTypes();
792 for (unsigned i = 0, e = EnumTypes.getNumElements(); i != e; ++i)
793 CU->getOrCreateTypeDIE(EnumTypes.getElement(i));
794 DIArray RetainedTypes = CUNode.getRetainedTypes();
795 for (unsigned i = 0, e = RetainedTypes.getNumElements(); i != e; ++i)
796 CU->getOrCreateTypeDIE(RetainedTypes.getElement(i));
797 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000798
Chris Lattnerd850ac72010-04-05 02:19:28 +0000799 // Tell MMI that we have debug info.
800 MMI->setDebugInfoAvailability(true);
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000801
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000802 // Prime section data.
Chris Lattnerf0144122009-07-28 03:13:23 +0000803 SectionMap.insert(Asm->getObjFileLowering().getTextSection());
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000804}
805
Eric Christopher4117bec2012-11-22 00:59:49 +0000806// Attach DW_AT_inline attribute with inlined subprogram DIEs.
807void DwarfDebug::computeInlinedDIEs() {
Devang Patel53bb5c92009-11-10 23:06:00 +0000808 // Attach DW_AT_inline attribute with inlined subprogram DIEs.
809 for (SmallPtrSet<DIE *, 4>::iterator AI = InlinedSubprogramDIEs.begin(),
Eric Christopherbdab8002012-11-27 00:13:51 +0000810 AE = InlinedSubprogramDIEs.end(); AI != AE; ++AI) {
Devang Patel53bb5c92009-11-10 23:06:00 +0000811 DIE *ISP = *AI;
Devang Patel3cbee302011-04-12 22:53:02 +0000812 FirstCU->addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
Devang Patel53bb5c92009-11-10 23:06:00 +0000813 }
Rafael Espindolad1ac3a42011-11-12 01:57:54 +0000814 for (DenseMap<const MDNode *, DIE *>::iterator AI = AbstractSPDies.begin(),
Eric Christopherbdab8002012-11-27 00:13:51 +0000815 AE = AbstractSPDies.end(); AI != AE; ++AI) {
Rafael Espindolad1ac3a42011-11-12 01:57:54 +0000816 DIE *ISP = AI->second;
817 if (InlinedSubprogramDIEs.count(ISP))
818 continue;
819 FirstCU->addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
820 }
Eric Christopher4117bec2012-11-22 00:59:49 +0000821}
822
823// Collect info for variables that were optimized out.
824void DwarfDebug::collectDeadVariables() {
825 const Module *M = MMI->getModule();
826 DenseMap<const MDNode *, LexicalScope *> DeadFnScopeMap;
827
828 if (NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu")) {
829 for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i) {
830 DICompileUnit TheCU(CU_Nodes->getOperand(i));
831 DIArray Subprograms = TheCU.getSubprograms();
832 for (unsigned i = 0, e = Subprograms.getNumElements(); i != e; ++i) {
Eric Christopherbdab8002012-11-27 00:13:51 +0000833 DISubprogram SP(Subprograms.getElement(i));
834 if (ProcessedSPNodes.count(SP) != 0) continue;
835 if (!SP.Verify()) continue;
836 if (!SP.isDefinition()) continue;
837 DIArray Variables = SP.getVariables();
838 if (Variables.getNumElements() == 0) continue;
Eric Christopher4117bec2012-11-22 00:59:49 +0000839
Eric Christopherbdab8002012-11-27 00:13:51 +0000840 LexicalScope *Scope =
841 new LexicalScope(NULL, DIDescriptor(SP), NULL, false);
842 DeadFnScopeMap[SP] = Scope;
Eric Christopher4117bec2012-11-22 00:59:49 +0000843
Eric Christopherbdab8002012-11-27 00:13:51 +0000844 // Construct subprogram DIE and add variables DIEs.
845 CompileUnit *SPCU = CUMap.lookup(TheCU);
846 assert(SPCU && "Unable to find Compile Unit!");
847 constructSubprogramDIE(SPCU, SP);
848 DIE *ScopeDIE = SPCU->getDIE(SP);
849 for (unsigned vi = 0, ve = Variables.getNumElements(); vi != ve; ++vi) {
850 DIVariable DV(Variables.getElement(vi));
851 if (!DV.Verify()) continue;
852 DbgVariable *NewVar = new DbgVariable(DV, NULL);
853 if (DIE *VariableDIE =
854 SPCU->constructVariableDIE(NewVar, Scope->isAbstractScope()))
855 ScopeDIE->addChild(VariableDIE);
856 }
Eric Christopher4117bec2012-11-22 00:59:49 +0000857 }
858 }
859 }
860 DeleteContainerSeconds(DeadFnScopeMap);
861}
862
863void DwarfDebug::finalizeModuleInfo() {
864 // Collect info for variables that were optimized out.
865 collectDeadVariables();
866
867 // Attach DW_AT_inline attribute with inlined subprogram DIEs.
868 computeInlinedDIEs();
Devang Patel53bb5c92009-11-10 23:06:00 +0000869
Eric Christopher6635cad2012-08-01 18:19:01 +0000870 // Emit DW_AT_containing_type attribute to connect types with their
871 // vtable holding type.
Devang Pateldbc64af2011-08-15 17:24:54 +0000872 for (DenseMap<const MDNode *, CompileUnit *>::iterator CUI = CUMap.begin(),
Eric Christopherbdab8002012-11-27 00:13:51 +0000873 CUE = CUMap.end(); CUI != CUE; ++CUI) {
Devang Pateldbc64af2011-08-15 17:24:54 +0000874 CompileUnit *TheCU = CUI->second;
875 TheCU->constructContainingTypeDIEs();
Devang Patel5d11eb02009-12-03 19:11:07 +0000876 }
877
Eric Christopher4117bec2012-11-22 00:59:49 +0000878 // Compute DIE offsets and sizes.
Eric Christopher0e3e9b72012-12-10 23:34:43 +0000879 InfoHolder.computeSizeAndOffsets();
880 if (useSplitDwarf())
881 SkeletonHolder.computeSizeAndOffsets();
Eric Christopher4117bec2012-11-22 00:59:49 +0000882}
883
884void DwarfDebug::endSections() {
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000885 // Standard sections final addresses.
Chris Lattner6c2f9e12009-08-19 05:49:37 +0000886 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getTextSection());
Chris Lattnerc0215722010-04-04 19:25:43 +0000887 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("text_end"));
Chris Lattner6c2f9e12009-08-19 05:49:37 +0000888 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getDataSection());
Chris Lattnerc0215722010-04-04 19:25:43 +0000889 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("data_end"));
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000890
891 // End text sections.
Benjamin Kramerb4c9d9c2012-10-31 13:45:49 +0000892 for (unsigned I = 0, E = SectionMap.size(); I != E; ++I) {
893 Asm->OutStreamer.SwitchSection(SectionMap[I]);
894 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("section_end", I+1));
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000895 }
Eric Christopher4117bec2012-11-22 00:59:49 +0000896}
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000897
Eric Christopherb6dc8652012-11-27 22:43:45 +0000898// Emit all Dwarf sections that should come after the content.
Eric Christopher4117bec2012-11-22 00:59:49 +0000899void DwarfDebug::endModule() {
900
901 if (!FirstCU) return;
902
903 // End any existing sections.
904 // TODO: Does this need to happen?
905 endSections();
906
907 // Finalize the debug info for the module.
908 finalizeModuleInfo();
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000909
Eric Christopher4daaed12012-12-10 19:51:21 +0000910 if (!useSplitDwarf()) {
Eric Christopher42885022012-11-27 22:43:42 +0000911 // Emit all the DIEs into a debug info section.
912 emitDebugInfo();
Eric Christopher74802f72012-11-27 00:41:54 +0000913
Eric Christopher42885022012-11-27 22:43:42 +0000914 // Corresponding abbreviations into a abbrev section.
915 emitAbbreviations();
916
917 // Emit info into a debug loc section.
918 emitDebugLoc();
919
920 // Emit info into a debug aranges section.
921 emitDebugARanges();
922
923 // Emit info into a debug ranges section.
924 emitDebugRanges();
925
926 // Emit info into a debug macinfo section.
927 emitDebugMacInfo();
928
929 // Emit inline info.
930 // TODO: When we don't need the option anymore we
931 // can remove all of the code that this section
932 // depends upon.
933 if (useDarwinGDBCompat())
934 emitDebugInlineInfo();
935 } else {
Eric Christopher0b944ee2012-12-11 19:42:09 +0000936 // TODO: Fill this in for separated debug sections and separate
Eric Christopher42885022012-11-27 22:43:42 +0000937 // out information into new sections.
938
Eric Christopher98e237f2012-11-30 23:59:06 +0000939 // Emit the debug info section and compile units.
Eric Christopher42885022012-11-27 22:43:42 +0000940 emitDebugInfo();
Eric Christopher98e237f2012-11-30 23:59:06 +0000941 emitDebugInfoDWO();
Eric Christopher42885022012-11-27 22:43:42 +0000942
943 // Corresponding abbreviations into a abbrev section.
944 emitAbbreviations();
Eric Christopher6eebe472012-12-19 22:02:53 +0000945 emitDebugAbbrevDWO();
Eric Christopher42885022012-11-27 22:43:42 +0000946
947 // Emit info into a debug loc section.
948 emitDebugLoc();
949
950 // Emit info into a debug aranges section.
951 emitDebugARanges();
952
953 // Emit info into a debug ranges section.
954 emitDebugRanges();
955
956 // Emit info into a debug macinfo section.
957 emitDebugMacInfo();
958
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000959 // Emit DWO addresses.
960 InfoHolder.emitAddresses(Asm->getObjFileLowering().getDwarfAddrSection());
961
Eric Christopher42885022012-11-27 22:43:42 +0000962 // Emit inline info.
963 // TODO: When we don't need the option anymore we
964 // can remove all of the code that this section
965 // depends upon.
966 if (useDarwinGDBCompat())
967 emitDebugInlineInfo();
968 }
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000969
Eric Christopher9d9f5a52012-08-23 07:32:06 +0000970 // Emit info into the dwarf accelerator table sections.
Eric Christopher20f47ab2012-08-23 22:36:40 +0000971 if (useDwarfAccelTables()) {
Eric Christopher09ac3d82011-11-07 09:24:32 +0000972 emitAccelNames();
973 emitAccelObjC();
974 emitAccelNamespaces();
975 emitAccelTypes();
976 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000977
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +0000978 // Emit info into a debug pubnames section, if requested.
979 if (GenerateDwarfPubNamesSection)
980 emitDebugPubnames();
981
Devang Patel193f7202009-11-24 01:14:22 +0000982 // Emit info into a debug pubtypes section.
Eric Christopher360f0062012-08-23 07:10:56 +0000983 // TODO: When we don't need the option anymore we can
984 // remove all of the code that adds to the table.
Eric Christopher20f47ab2012-08-23 22:36:40 +0000985 if (useDarwinGDBCompat())
Eric Christopher360f0062012-08-23 07:10:56 +0000986 emitDebugPubTypes();
Devang Patel193f7202009-11-24 01:14:22 +0000987
Eric Christopher42885022012-11-27 22:43:42 +0000988 // Finally emit string information into a string table.
Eric Christopherfcdbecb2012-11-27 06:49:23 +0000989 emitDebugStr();
Eric Christopher64f824c2012-12-27 02:14:01 +0000990 if (useSplitDwarf())
991 emitDebugStrDWO();
Eric Christopherfcdbecb2012-11-27 06:49:23 +0000992
Devang Patele9a1cca2010-08-02 17:32:15 +0000993 // clean up.
Devang Patel94c7ddb2011-08-16 22:09:43 +0000994 SPMap.clear();
Devang Patel163a9f72010-05-10 22:49:55 +0000995 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
996 E = CUMap.end(); I != E; ++I)
997 delete I->second;
Eric Christopher9ec87b32012-12-10 19:51:18 +0000998
Eric Christopher01776a52013-02-06 21:53:56 +0000999 for (SmallVector<CompileUnit *, 1>::iterator I = SkeletonCUs.begin(),
1000 E = SkeletonCUs.end(); I != E; ++I)
1001 delete *I;
Eric Christopher9ec87b32012-12-10 19:51:18 +00001002
Eric Christopher98e237f2012-11-30 23:59:06 +00001003 // Reset these for the next Module if we have one.
1004 FirstCU = NULL;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001005}
1006
Eric Christopherb6dc8652012-11-27 22:43:45 +00001007// Find abstract variable, if any, associated with Var.
Devang Patelb549bcf2011-08-10 21:50:54 +00001008DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &DV,
Chris Lattnerde4845c2010-04-02 19:42:39 +00001009 DebugLoc ScopeLoc) {
Devang Patelb549bcf2011-08-10 21:50:54 +00001010 LLVMContext &Ctx = DV->getContext();
1011 // More then one inlined variable corresponds to one abstract variable.
1012 DIVariable Var = cleanseInlinedVariable(DV, Ctx);
Devang Patel2db49d72010-05-07 18:11:54 +00001013 DbgVariable *AbsDbgVariable = AbstractVariables.lookup(Var);
Devang Patel53bb5c92009-11-10 23:06:00 +00001014 if (AbsDbgVariable)
1015 return AbsDbgVariable;
1016
Devang Patelbf47fdb2011-08-10 20:55:27 +00001017 LexicalScope *Scope = LScopes.findAbstractScope(ScopeLoc.getScope(Ctx));
Devang Patel53bb5c92009-11-10 23:06:00 +00001018 if (!Scope)
1019 return NULL;
1020
Devang Patel5a1a67c2011-08-15 19:01:20 +00001021 AbsDbgVariable = new DbgVariable(Var, NULL);
Devang Patelbf47fdb2011-08-10 20:55:27 +00001022 addScopeVariable(Scope, AbsDbgVariable);
Devang Patel2db49d72010-05-07 18:11:54 +00001023 AbstractVariables[Var] = AbsDbgVariable;
Devang Patel53bb5c92009-11-10 23:06:00 +00001024 return AbsDbgVariable;
1025}
1026
Eric Christopherb6dc8652012-11-27 22:43:45 +00001027// If Var is a current function argument then add it to CurrentFnArguments list.
Devang Patel0478c152011-03-01 22:58:55 +00001028bool DwarfDebug::addCurrentFnArgument(const MachineFunction *MF,
Devang Patelbf47fdb2011-08-10 20:55:27 +00001029 DbgVariable *Var, LexicalScope *Scope) {
1030 if (!LScopes.isCurrentFunctionScope(Scope))
Devang Patel0478c152011-03-01 22:58:55 +00001031 return false;
1032 DIVariable DV = Var->getVariable();
1033 if (DV.getTag() != dwarf::DW_TAG_arg_variable)
1034 return false;
1035 unsigned ArgNo = DV.getArgNumber();
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001036 if (ArgNo == 0)
Devang Patel0478c152011-03-01 22:58:55 +00001037 return false;
1038
Devang Patelcb3a6572011-03-03 20:02:02 +00001039 size_t Size = CurrentFnArguments.size();
1040 if (Size == 0)
Devang Patel0478c152011-03-01 22:58:55 +00001041 CurrentFnArguments.resize(MF->getFunction()->arg_size());
Devang Patelbbd0f452011-03-03 21:49:41 +00001042 // llvm::Function argument size is not good indicator of how many
Devang Patel6f676be2011-03-03 20:08:10 +00001043 // arguments does the function have at source level.
1044 if (ArgNo > Size)
Devang Patelcb3a6572011-03-03 20:02:02 +00001045 CurrentFnArguments.resize(ArgNo * 2);
Devang Patel0478c152011-03-01 22:58:55 +00001046 CurrentFnArguments[ArgNo - 1] = Var;
1047 return true;
1048}
1049
Eric Christopherb6dc8652012-11-27 22:43:45 +00001050// Collect variable information from side table maintained by MMI.
Jim Grosbach1e20b962010-07-21 21:21:52 +00001051void
Nick Lewycky3bbb6f72011-07-29 03:49:23 +00001052DwarfDebug::collectVariableInfoFromMMITable(const MachineFunction *MF,
Devang Patelee432862010-05-20 19:57:06 +00001053 SmallPtrSet<const MDNode *, 16> &Processed) {
Devang Patele717faa2009-10-06 01:26:37 +00001054 MachineModuleInfo::VariableDbgInfoMapTy &VMap = MMI->getVariableDbgInfo();
1055 for (MachineModuleInfo::VariableDbgInfoMapTy::iterator VI = VMap.begin(),
1056 VE = VMap.end(); VI != VE; ++VI) {
Devang Patele9f8f5e2010-05-07 20:54:48 +00001057 const MDNode *Var = VI->first;
Devang Patel53bb5c92009-11-10 23:06:00 +00001058 if (!Var) continue;
Devang Patel98e1cac2010-05-14 21:01:35 +00001059 Processed.insert(Var);
Chris Lattnerde4845c2010-04-02 19:42:39 +00001060 DIVariable DV(Var);
1061 const std::pair<unsigned, DebugLoc> &VP = VI->second;
Devang Patel53bb5c92009-11-10 23:06:00 +00001062
Devang Patelbf47fdb2011-08-10 20:55:27 +00001063 LexicalScope *Scope = LScopes.findLexicalScope(VP.second);
Jim Grosbach1e20b962010-07-21 21:21:52 +00001064
Devang Patelfb0ee432009-11-10 23:20:04 +00001065 // If variable scope is not found then skip this variable.
Chris Lattnerde4845c2010-04-02 19:42:39 +00001066 if (Scope == 0)
Devang Patelfb0ee432009-11-10 23:20:04 +00001067 continue;
Devang Patel53bb5c92009-11-10 23:06:00 +00001068
Devang Patel26c1e562010-05-20 16:36:41 +00001069 DbgVariable *AbsDbgVariable = findAbstractVariable(DV, VP.second);
Devang Patel5a1a67c2011-08-15 19:01:20 +00001070 DbgVariable *RegVar = new DbgVariable(DV, AbsDbgVariable);
Devang Patelff9dd0a2011-08-15 21:24:36 +00001071 RegVar->setFrameIndex(VP.first);
Devang Patel0478c152011-03-01 22:58:55 +00001072 if (!addCurrentFnArgument(MF, RegVar, Scope))
Devang Patelbf47fdb2011-08-10 20:55:27 +00001073 addScopeVariable(Scope, RegVar);
Devang Patel5a1a67c2011-08-15 19:01:20 +00001074 if (AbsDbgVariable)
Devang Patelff9dd0a2011-08-15 21:24:36 +00001075 AbsDbgVariable->setFrameIndex(VP.first);
Devang Patele717faa2009-10-06 01:26:37 +00001076 }
Devang Patelee432862010-05-20 19:57:06 +00001077}
Devang Patel90a48ad2010-03-15 18:33:46 +00001078
Eric Christopherb6dc8652012-11-27 22:43:45 +00001079// Return true if debug value, encoded by DBG_VALUE instruction, is in a
1080// defined reg.
Devang Patelc3f5f782010-05-25 23:40:22 +00001081static bool isDbgValueInDefinedReg(const MachineInstr *MI) {
Nick Lewycky746cb672011-10-26 22:55:33 +00001082 assert(MI->isDebugValue() && "Invalid DBG_VALUE machine instruction!");
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001083 return MI->getNumOperands() == 3 &&
1084 MI->getOperand(0).isReg() && MI->getOperand(0).getReg() &&
1085 MI->getOperand(1).isImm() && MI->getOperand(1).getImm() == 0;
Devang Patelc3f5f782010-05-25 23:40:22 +00001086}
1087
Eric Christopherb6dc8652012-11-27 22:43:45 +00001088// Get .debug_loc entry for the instruction range starting at MI.
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001089static DotDebugLocEntry getDebugLocEntry(AsmPrinter *Asm,
1090 const MCSymbol *FLabel,
Devang Patel90b40412011-07-08 17:09:57 +00001091 const MCSymbol *SLabel,
1092 const MachineInstr *MI) {
1093 const MDNode *Var = MI->getOperand(MI->getNumOperands() - 1).getMetadata();
1094
1095 if (MI->getNumOperands() != 3) {
1096 MachineLocation MLoc = Asm->getDebugValueLocation(MI);
1097 return DotDebugLocEntry(FLabel, SLabel, MLoc, Var);
1098 }
1099 if (MI->getOperand(0).isReg() && MI->getOperand(1).isImm()) {
1100 MachineLocation MLoc;
1101 MLoc.set(MI->getOperand(0).getReg(), MI->getOperand(1).getImm());
1102 return DotDebugLocEntry(FLabel, SLabel, MLoc, Var);
1103 }
1104 if (MI->getOperand(0).isImm())
1105 return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getImm());
1106 if (MI->getOperand(0).isFPImm())
1107 return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getFPImm());
1108 if (MI->getOperand(0).isCImm())
1109 return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getCImm());
1110
Craig Topper5e25ee82012-02-05 08:31:47 +00001111 llvm_unreachable("Unexpected 3 operand DBG_VALUE instruction!");
Devang Patel90b40412011-07-08 17:09:57 +00001112}
1113
Eric Christopherb6dc8652012-11-27 22:43:45 +00001114// Find variables for each lexical scope.
Jim Grosbach1e20b962010-07-21 21:21:52 +00001115void
Devang Patel78e127d2010-06-25 22:07:34 +00001116DwarfDebug::collectVariableInfo(const MachineFunction *MF,
1117 SmallPtrSet<const MDNode *, 16> &Processed) {
Jim Grosbach1e20b962010-07-21 21:21:52 +00001118
Eric Christopherb6dc8652012-11-27 22:43:45 +00001119 // collection info from MMI table.
Devang Patelee432862010-05-20 19:57:06 +00001120 collectVariableInfoFromMMITable(MF, Processed);
1121
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001122 for (SmallVectorImpl<const MDNode*>::const_iterator
1123 UVI = UserVariables.begin(), UVE = UserVariables.end(); UVI != UVE;
1124 ++UVI) {
1125 const MDNode *Var = *UVI;
1126 if (Processed.count(Var))
Devang Patelee432862010-05-20 19:57:06 +00001127 continue;
1128
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001129 // History contains relevant DBG_VALUE instructions for Var and instructions
1130 // clobbering it.
1131 SmallVectorImpl<const MachineInstr*> &History = DbgValues[Var];
1132 if (History.empty())
1133 continue;
1134 const MachineInstr *MInsn = History.front();
Devang Patelc3f5f782010-05-25 23:40:22 +00001135
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001136 DIVariable DV(Var);
Devang Patelbf47fdb2011-08-10 20:55:27 +00001137 LexicalScope *Scope = NULL;
Devang Pateld8720f42010-05-27 20:25:04 +00001138 if (DV.getTag() == dwarf::DW_TAG_arg_variable &&
1139 DISubprogram(DV.getContext()).describes(MF->getFunction()))
Devang Patelbf47fdb2011-08-10 20:55:27 +00001140 Scope = LScopes.getCurrentFunctionScope();
David Blaikiec0ec8a42013-03-11 23:39:23 +00001141 else if (MDNode *IA = DV.getInlinedAt())
1142 Scope = LScopes.findInlinedScope(DebugLoc::getFromDILocation(IA));
1143 else
1144 Scope = LScopes.findLexicalScope(cast<MDNode>(DV->getOperand(1)));
Devang Patelee432862010-05-20 19:57:06 +00001145 // If variable scope is not found then skip this variable.
Devang Patelc0c5a262010-05-21 00:10:20 +00001146 if (!Scope)
Devang Patelee432862010-05-20 19:57:06 +00001147 continue;
1148
1149 Processed.insert(DV);
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001150 assert(MInsn->isDebugValue() && "History must begin with debug value");
Devang Patel5a1a67c2011-08-15 19:01:20 +00001151 DbgVariable *AbsVar = findAbstractVariable(DV, MInsn->getDebugLoc());
1152 DbgVariable *RegVar = new DbgVariable(DV, AbsVar);
Devang Patel0478c152011-03-01 22:58:55 +00001153 if (!addCurrentFnArgument(MF, RegVar, Scope))
Devang Patelbf47fdb2011-08-10 20:55:27 +00001154 addScopeVariable(Scope, RegVar);
Devang Patel5a1a67c2011-08-15 19:01:20 +00001155 if (AbsVar)
Devang Patelff9dd0a2011-08-15 21:24:36 +00001156 AbsVar->setMInsn(MInsn);
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001157
Eric Christopherc56e3f02012-10-08 20:48:54 +00001158 // Simplify ranges that are fully coalesced.
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001159 if (History.size() <= 1 || (History.size() == 2 &&
1160 MInsn->isIdenticalTo(History.back()))) {
Devang Patelff9dd0a2011-08-15 21:24:36 +00001161 RegVar->setMInsn(MInsn);
Devang Patelc3f5f782010-05-25 23:40:22 +00001162 continue;
1163 }
1164
Eric Christopher498703b2013-01-28 17:33:26 +00001165 // Handle multiple DBG_VALUE instructions describing one variable.
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001166 RegVar->setDotDebugLocOffset(DotDebugLocEntries.size());
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001167
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001168 for (SmallVectorImpl<const MachineInstr*>::const_iterator
1169 HI = History.begin(), HE = History.end(); HI != HE; ++HI) {
1170 const MachineInstr *Begin = *HI;
1171 assert(Begin->isDebugValue() && "Invalid History entry");
Jakob Stoklund Olesene17232e2011-03-22 00:21:41 +00001172
Devang Patel4ada1d72011-06-01 23:00:17 +00001173 // Check if DBG_VALUE is truncating a range.
1174 if (Begin->getNumOperands() > 1 && Begin->getOperand(0).isReg()
1175 && !Begin->getOperand(0).getReg())
1176 continue;
1177
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001178 // Compute the range for a register location.
1179 const MCSymbol *FLabel = getLabelBeforeInsn(Begin);
1180 const MCSymbol *SLabel = 0;
1181
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001182 if (HI + 1 == HE)
1183 // If Begin is the last instruction in History then its value is valid
Chris Lattner7a2bdde2011-04-15 05:18:47 +00001184 // until the end of the function.
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001185 SLabel = FunctionEndSym;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001186 else {
1187 const MachineInstr *End = HI[1];
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001188 DEBUG(dbgs() << "DotDebugLoc Pair:\n"
Devang Patel476df5f2011-07-07 21:44:42 +00001189 << "\t" << *Begin << "\t" << *End << "\n");
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001190 if (End->isDebugValue())
1191 SLabel = getLabelBeforeInsn(End);
1192 else {
1193 // End is a normal instruction clobbering the range.
1194 SLabel = getLabelAfterInsn(End);
1195 assert(SLabel && "Forgot label after clobber instruction");
1196 ++HI;
1197 }
1198 }
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001199
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001200 // The value is valid until the next DBG_VALUE or clobber.
Eric Christopherabbb2002011-12-16 23:42:31 +00001201 DotDebugLocEntries.push_back(getDebugLocEntry(Asm, FLabel, SLabel,
1202 Begin));
Devang Patelc3f5f782010-05-25 23:40:22 +00001203 }
1204 DotDebugLocEntries.push_back(DotDebugLocEntry());
Devang Patel90a48ad2010-03-15 18:33:46 +00001205 }
Devang Patel98e1cac2010-05-14 21:01:35 +00001206
1207 // Collect info for variables that were optimized out.
Devang Patel93d39be2011-08-19 23:28:12 +00001208 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
1209 DIArray Variables = DISubprogram(FnScope->getScopeNode()).getVariables();
1210 for (unsigned i = 0, e = Variables.getNumElements(); i != e; ++i) {
1211 DIVariable DV(Variables.getElement(i));
1212 if (!DV || !DV.Verify() || !Processed.insert(DV))
1213 continue;
1214 if (LexicalScope *Scope = LScopes.findLexicalScope(DV.getContext()))
1215 addScopeVariable(Scope, new DbgVariable(DV, NULL));
Devang Patel98e1cac2010-05-14 21:01:35 +00001216 }
Devang Patelc3f5f782010-05-25 23:40:22 +00001217}
Devang Patel98e1cac2010-05-14 21:01:35 +00001218
Eric Christopherb6dc8652012-11-27 22:43:45 +00001219// Return Label preceding the instruction.
Eric Christopher72f7bfb2013-01-15 23:56:56 +00001220MCSymbol *DwarfDebug::getLabelBeforeInsn(const MachineInstr *MI) {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001221 MCSymbol *Label = LabelsBeforeInsn.lookup(MI);
1222 assert(Label && "Didn't insert label before instruction");
1223 return Label;
Devang Patelc3f5f782010-05-25 23:40:22 +00001224}
1225
Eric Christopherb6dc8652012-11-27 22:43:45 +00001226// Return Label immediately following the instruction.
Eric Christopher72f7bfb2013-01-15 23:56:56 +00001227MCSymbol *DwarfDebug::getLabelAfterInsn(const MachineInstr *MI) {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001228 return LabelsAfterInsn.lookup(MI);
Devang Patele717faa2009-10-06 01:26:37 +00001229}
1230
Eric Christopherb6dc8652012-11-27 22:43:45 +00001231// Process beginning of an instruction.
Devang Patelcbbe2872010-10-26 17:49:02 +00001232void DwarfDebug::beginInstruction(const MachineInstr *MI) {
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001233 // Check if source location changes, but ignore DBG_VALUE locations.
1234 if (!MI->isDebugValue()) {
1235 DebugLoc DL = MI->getDebugLoc();
1236 if (DL != PrevInstLoc && (!DL.isUnknown() || UnknownLocations)) {
Eric Christopher60b35f42012-04-05 20:39:05 +00001237 unsigned Flags = 0;
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001238 PrevInstLoc = DL;
Devang Patel4243e672011-05-11 19:22:19 +00001239 if (DL == PrologEndLoc) {
1240 Flags |= DWARF2_FLAG_PROLOGUE_END;
1241 PrologEndLoc = DebugLoc();
1242 }
Eric Christopher60b35f42012-04-05 20:39:05 +00001243 if (PrologEndLoc.isUnknown())
1244 Flags |= DWARF2_FLAG_IS_STMT;
1245
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001246 if (!DL.isUnknown()) {
1247 const MDNode *Scope = DL.getScope(Asm->MF->getFunction()->getContext());
Devang Patel4243e672011-05-11 19:22:19 +00001248 recordSourceLine(DL.getLine(), DL.getCol(), Scope, Flags);
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001249 } else
Devang Patel4243e672011-05-11 19:22:19 +00001250 recordSourceLine(0, 0, 0, 0);
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001251 }
Devang Patelc3f5f782010-05-25 23:40:22 +00001252 }
Devang Patelaead63c2010-03-29 22:59:58 +00001253
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001254 // Insert labels where requested.
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001255 DenseMap<const MachineInstr*, MCSymbol*>::iterator I =
1256 LabelsBeforeInsn.find(MI);
1257
1258 // No label needed.
1259 if (I == LabelsBeforeInsn.end())
1260 return;
1261
1262 // Label already assigned.
1263 if (I->second)
Devang Patelb2b31a62010-05-26 19:37:24 +00001264 return;
Devang Patel553881b2010-03-29 17:20:31 +00001265
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001266 if (!PrevLabel) {
Devang Patel77051f52010-05-26 21:23:46 +00001267 PrevLabel = MMI->getContext().CreateTempSymbol();
1268 Asm->OutStreamer.EmitLabel(PrevLabel);
Devang Patelb2b31a62010-05-26 19:37:24 +00001269 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001270 I->second = PrevLabel;
Devang Patel0d20ac82009-10-06 01:50:42 +00001271}
1272
Eric Christopherb6dc8652012-11-27 22:43:45 +00001273// Process end of an instruction.
Devang Patelcbbe2872010-10-26 17:49:02 +00001274void DwarfDebug::endInstruction(const MachineInstr *MI) {
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001275 // Don't create a new label after DBG_VALUE instructions.
1276 // They don't generate code.
1277 if (!MI->isDebugValue())
1278 PrevLabel = 0;
1279
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001280 DenseMap<const MachineInstr*, MCSymbol*>::iterator I =
1281 LabelsAfterInsn.find(MI);
1282
1283 // No label needed.
1284 if (I == LabelsAfterInsn.end())
1285 return;
1286
1287 // Label already assigned.
1288 if (I->second)
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001289 return;
1290
1291 // We need a label after this instruction.
1292 if (!PrevLabel) {
1293 PrevLabel = MMI->getContext().CreateTempSymbol();
1294 Asm->OutStreamer.EmitLabel(PrevLabel);
Devang Patel1c246352010-04-08 16:50:29 +00001295 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001296 I->second = PrevLabel;
Devang Patel53bb5c92009-11-10 23:06:00 +00001297}
1298
Eric Christopherb6dc8652012-11-27 22:43:45 +00001299// Each LexicalScope has first instruction and last instruction to mark
1300// beginning and end of a scope respectively. Create an inverse map that list
1301// scopes starts (and ends) with an instruction. One instruction may start (or
1302// end) multiple scopes. Ignore scopes that are not reachable.
Devang Patele37b0c62010-04-08 18:43:56 +00001303void DwarfDebug::identifyScopeMarkers() {
Devang Patelbf47fdb2011-08-10 20:55:27 +00001304 SmallVector<LexicalScope *, 4> WorkList;
1305 WorkList.push_back(LScopes.getCurrentFunctionScope());
Devang Patel42aafd72010-01-20 02:05:23 +00001306 while (!WorkList.empty()) {
Devang Patelbf47fdb2011-08-10 20:55:27 +00001307 LexicalScope *S = WorkList.pop_back_val();
Jim Grosbach1e20b962010-07-21 21:21:52 +00001308
Devang Patelbf47fdb2011-08-10 20:55:27 +00001309 const SmallVector<LexicalScope *, 4> &Children = S->getChildren();
Jim Grosbach1e20b962010-07-21 21:21:52 +00001310 if (!Children.empty())
Devang Patelbf47fdb2011-08-10 20:55:27 +00001311 for (SmallVector<LexicalScope *, 4>::const_iterator SI = Children.begin(),
Devang Patel42aafd72010-01-20 02:05:23 +00001312 SE = Children.end(); SI != SE; ++SI)
1313 WorkList.push_back(*SI);
1314
Devang Patel53bb5c92009-11-10 23:06:00 +00001315 if (S->isAbstractScope())
1316 continue;
Jim Grosbach1e20b962010-07-21 21:21:52 +00001317
Devang Patelbf47fdb2011-08-10 20:55:27 +00001318 const SmallVector<InsnRange, 4> &Ranges = S->getRanges();
Devang Pateleac9c072010-04-27 19:46:33 +00001319 if (Ranges.empty())
1320 continue;
Devang Patelbf47fdb2011-08-10 20:55:27 +00001321 for (SmallVector<InsnRange, 4>::const_iterator RI = Ranges.begin(),
Devang Pateleac9c072010-04-27 19:46:33 +00001322 RE = Ranges.end(); RI != RE; ++RI) {
Devang Patelbf47fdb2011-08-10 20:55:27 +00001323 assert(RI->first && "InsnRange does not have first instruction!");
1324 assert(RI->second && "InsnRange does not have second instruction!");
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001325 requestLabelBeforeInsn(RI->first);
1326 requestLabelAfterInsn(RI->second);
Devang Pateleac9c072010-04-27 19:46:33 +00001327 }
Devang Patelaf9e8472009-10-01 20:31:14 +00001328 }
Devang Patelaf9e8472009-10-01 20:31:14 +00001329}
1330
Eric Christopherb6dc8652012-11-27 22:43:45 +00001331// Get MDNode for DebugLoc's scope.
Devang Patela3f48672011-05-09 22:14:49 +00001332static MDNode *getScopeNode(DebugLoc DL, const LLVMContext &Ctx) {
1333 if (MDNode *InlinedAt = DL.getInlinedAt(Ctx))
1334 return getScopeNode(DebugLoc::getFromDILocation(InlinedAt), Ctx);
1335 return DL.getScope(Ctx);
1336}
1337
Eric Christopherb6dc8652012-11-27 22:43:45 +00001338// Walk up the scope chain of given debug loc and find line number info
1339// for the function.
Devang Patel4243e672011-05-11 19:22:19 +00001340static DebugLoc getFnDebugLoc(DebugLoc DL, const LLVMContext &Ctx) {
1341 const MDNode *Scope = getScopeNode(DL, Ctx);
1342 DISubprogram SP = getDISubprogram(Scope);
Eric Christopher6126a1e2012-04-03 00:43:49 +00001343 if (SP.Verify()) {
1344 // Check for number of operands since the compatibility is
1345 // cheap here.
Eric Christopherfa5b0502012-04-03 17:55:42 +00001346 if (SP->getNumOperands() > 19)
Eric Christopher6126a1e2012-04-03 00:43:49 +00001347 return DebugLoc::get(SP.getScopeLineNumber(), 0, SP);
1348 else
1349 return DebugLoc::get(SP.getLineNumber(), 0, SP);
1350 }
1351
Devang Patel4243e672011-05-11 19:22:19 +00001352 return DebugLoc();
1353}
1354
Eric Christopherb6dc8652012-11-27 22:43:45 +00001355// Gather pre-function debug information. Assumes being called immediately
1356// after the function entry point has been emitted.
Chris Lattnereec791a2010-01-26 23:18:02 +00001357void DwarfDebug::beginFunction(const MachineFunction *MF) {
Chris Lattner994cb122010-04-05 03:52:55 +00001358 if (!MMI->hasDebugInfo()) return;
Devang Patelbf47fdb2011-08-10 20:55:27 +00001359 LScopes.initialize(*MF);
1360 if (LScopes.empty()) return;
1361 identifyScopeMarkers();
Devang Patel60b35bd2009-10-06 18:37:31 +00001362
Manman Ren43213cf2013-02-05 21:52:47 +00001363 // Set DwarfCompileUnitID in MCContext to the Compile Unit this function
1364 // belongs to.
1365 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
1366 CompileUnit *TheCU = SPMap.lookup(FnScope->getScopeNode());
1367 assert(TheCU && "Unable to find compile unit!");
1368 Asm->OutStreamer.getContext().setDwarfCompileUnitID(TheCU->getUniqueID());
1369
Devang Pateleac9c072010-04-27 19:46:33 +00001370 FunctionBeginSym = Asm->GetTempSymbol("func_begin",
1371 Asm->getFunctionNumber());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001372 // Assumes in correct section after the entry point.
Devang Pateleac9c072010-04-27 19:46:33 +00001373 Asm->OutStreamer.EmitLabel(FunctionBeginSym);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001374
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001375 assert(UserVariables.empty() && DbgValues.empty() && "Maps weren't cleaned");
1376
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001377 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
Eric Christopherb6dc8652012-11-27 22:43:45 +00001378 // LiveUserVar - Map physreg numbers to the MDNode they contain.
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001379 std::vector<const MDNode*> LiveUserVar(TRI->getNumRegs());
1380
Devang Patelb2b31a62010-05-26 19:37:24 +00001381 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001382 I != E; ++I) {
1383 bool AtBlockEntry = true;
Devang Patelb2b31a62010-05-26 19:37:24 +00001384 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
1385 II != IE; ++II) {
1386 const MachineInstr *MI = II;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001387
Devang Patelb2b31a62010-05-26 19:37:24 +00001388 if (MI->isDebugValue()) {
Nick Lewycky746cb672011-10-26 22:55:33 +00001389 assert(MI->getNumOperands() > 1 && "Invalid machine instruction!");
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001390
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001391 // Keep track of user variables.
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001392 const MDNode *Var =
1393 MI->getOperand(MI->getNumOperands() - 1).getMetadata();
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001394
1395 // Variable is in a register, we need to check for clobbers.
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001396 if (isDbgValueInDefinedReg(MI))
1397 LiveUserVar[MI->getOperand(0).getReg()] = Var;
1398
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001399 // Check the history of this variable.
1400 SmallVectorImpl<const MachineInstr*> &History = DbgValues[Var];
1401 if (History.empty()) {
1402 UserVariables.push_back(Var);
1403 // The first mention of a function argument gets the FunctionBeginSym
1404 // label, so arguments are visible when breaking at function entry.
1405 DIVariable DV(Var);
1406 if (DV.Verify() && DV.getTag() == dwarf::DW_TAG_arg_variable &&
1407 DISubprogram(getDISubprogram(DV.getContext()))
1408 .describes(MF->getFunction()))
1409 LabelsBeforeInsn[MI] = FunctionBeginSym;
1410 } else {
1411 // We have seen this variable before. Try to coalesce DBG_VALUEs.
1412 const MachineInstr *Prev = History.back();
1413 if (Prev->isDebugValue()) {
1414 // Coalesce identical entries at the end of History.
1415 if (History.size() >= 2 &&
Devang Patel79862892011-07-07 00:14:27 +00001416 Prev->isIdenticalTo(History[History.size() - 2])) {
Eric Christopher02c1a642012-10-08 20:48:49 +00001417 DEBUG(dbgs() << "Coalescing identical DBG_VALUE entries:\n"
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001418 << "\t" << *Prev
Devang Patel79862892011-07-07 00:14:27 +00001419 << "\t" << *History[History.size() - 2] << "\n");
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001420 History.pop_back();
Devang Patel79862892011-07-07 00:14:27 +00001421 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001422
1423 // Terminate old register assignments that don't reach MI;
1424 MachineFunction::const_iterator PrevMBB = Prev->getParent();
1425 if (PrevMBB != I && (!AtBlockEntry || llvm::next(PrevMBB) != I) &&
1426 isDbgValueInDefinedReg(Prev)) {
1427 // Previous register assignment needs to terminate at the end of
1428 // its basic block.
1429 MachineBasicBlock::const_iterator LastMI =
1430 PrevMBB->getLastNonDebugInstr();
Devang Patel79862892011-07-07 00:14:27 +00001431 if (LastMI == PrevMBB->end()) {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001432 // Drop DBG_VALUE for empty range.
Eric Christopher02c1a642012-10-08 20:48:49 +00001433 DEBUG(dbgs() << "Dropping DBG_VALUE for empty range:\n"
Devang Patel79862892011-07-07 00:14:27 +00001434 << "\t" << *Prev << "\n");
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001435 History.pop_back();
Devang Patel79862892011-07-07 00:14:27 +00001436 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001437 else {
1438 // Terminate after LastMI.
1439 History.push_back(LastMI);
1440 }
1441 }
1442 }
1443 }
1444 History.push_back(MI);
Devang Patelb2b31a62010-05-26 19:37:24 +00001445 } else {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001446 // Not a DBG_VALUE instruction.
1447 if (!MI->isLabel())
1448 AtBlockEntry = false;
1449
Eric Christopher0313ced2012-10-04 20:46:14 +00001450 // First known non-DBG_VALUE and non-frame setup location marks
1451 // the beginning of the function body.
1452 if (!MI->getFlag(MachineInstr::FrameSetup) &&
1453 (PrologEndLoc.isUnknown() && !MI->getDebugLoc().isUnknown()))
Devang Patel4243e672011-05-11 19:22:19 +00001454 PrologEndLoc = MI->getDebugLoc();
1455
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001456 // Check if the instruction clobbers any registers with debug vars.
1457 for (MachineInstr::const_mop_iterator MOI = MI->operands_begin(),
1458 MOE = MI->operands_end(); MOI != MOE; ++MOI) {
1459 if (!MOI->isReg() || !MOI->isDef() || !MOI->getReg())
1460 continue;
Jakob Stoklund Olesen396618b2012-06-01 23:28:30 +00001461 for (MCRegAliasIterator AI(MOI->getReg(), TRI, true);
1462 AI.isValid(); ++AI) {
1463 unsigned Reg = *AI;
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001464 const MDNode *Var = LiveUserVar[Reg];
1465 if (!Var)
1466 continue;
1467 // Reg is now clobbered.
1468 LiveUserVar[Reg] = 0;
1469
1470 // Was MD last defined by a DBG_VALUE referring to Reg?
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001471 DbgValueHistoryMap::iterator HistI = DbgValues.find(Var);
1472 if (HistI == DbgValues.end())
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001473 continue;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001474 SmallVectorImpl<const MachineInstr*> &History = HistI->second;
1475 if (History.empty())
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001476 continue;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001477 const MachineInstr *Prev = History.back();
1478 // Sanity-check: Register assignments are terminated at the end of
1479 // their block.
1480 if (!Prev->isDebugValue() || Prev->getParent() != MI->getParent())
1481 continue;
1482 // Is the variable still in Reg?
1483 if (!isDbgValueInDefinedReg(Prev) ||
1484 Prev->getOperand(0).getReg() != Reg)
1485 continue;
1486 // Var is clobbered. Make sure the next instruction gets a label.
1487 History.push_back(MI);
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001488 }
1489 }
Devang Patelb2b31a62010-05-26 19:37:24 +00001490 }
Devang Patelb2b31a62010-05-26 19:37:24 +00001491 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001492 }
1493
1494 for (DbgValueHistoryMap::iterator I = DbgValues.begin(), E = DbgValues.end();
1495 I != E; ++I) {
1496 SmallVectorImpl<const MachineInstr*> &History = I->second;
1497 if (History.empty())
1498 continue;
1499
1500 // Make sure the final register assignments are terminated.
1501 const MachineInstr *Prev = History.back();
1502 if (Prev->isDebugValue() && isDbgValueInDefinedReg(Prev)) {
1503 const MachineBasicBlock *PrevMBB = Prev->getParent();
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001504 MachineBasicBlock::const_iterator LastMI =
Devang Patel5bc942c2011-08-10 23:58:09 +00001505 PrevMBB->getLastNonDebugInstr();
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001506 if (LastMI == PrevMBB->end())
1507 // Drop DBG_VALUE for empty range.
1508 History.pop_back();
1509 else {
1510 // Terminate after LastMI.
1511 History.push_back(LastMI);
1512 }
1513 }
1514 // Request labels for the full history.
1515 for (unsigned i = 0, e = History.size(); i != e; ++i) {
1516 const MachineInstr *MI = History[i];
1517 if (MI->isDebugValue())
1518 requestLabelBeforeInsn(MI);
1519 else
1520 requestLabelAfterInsn(MI);
1521 }
1522 }
Devang Patelb2b31a62010-05-26 19:37:24 +00001523
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001524 PrevInstLoc = DebugLoc();
Devang Patelb2b31a62010-05-26 19:37:24 +00001525 PrevLabel = FunctionBeginSym;
Devang Patel4243e672011-05-11 19:22:19 +00001526
1527 // Record beginning of function.
1528 if (!PrologEndLoc.isUnknown()) {
1529 DebugLoc FnStartDL = getFnDebugLoc(PrologEndLoc,
1530 MF->getFunction()->getContext());
1531 recordSourceLine(FnStartDL.getLine(), FnStartDL.getCol(),
1532 FnStartDL.getScope(MF->getFunction()->getContext()),
David Blaikie836cfc42012-12-04 22:02:33 +00001533 // We'd like to list the prologue as "not statements" but GDB behaves
1534 // poorly if we do that. Revisit this with caution/GDB (7.5+) testing.
David Blaikieb36c5312012-12-04 21:05:36 +00001535 DWARF2_FLAG_IS_STMT);
Devang Patel4243e672011-05-11 19:22:19 +00001536 }
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001537}
1538
Devang Patelbf47fdb2011-08-10 20:55:27 +00001539void DwarfDebug::addScopeVariable(LexicalScope *LS, DbgVariable *Var) {
1540// SmallVector<DbgVariable *, 8> &Vars = ScopeVariables.lookup(LS);
1541 ScopeVariables[LS].push_back(Var);
1542// Vars.push_back(Var);
1543}
1544
Eric Christopherb6dc8652012-11-27 22:43:45 +00001545// Gather and emit post-function debug information.
Chris Lattnereec791a2010-01-26 23:18:02 +00001546void DwarfDebug::endFunction(const MachineFunction *MF) {
Devang Patelbf47fdb2011-08-10 20:55:27 +00001547 if (!MMI->hasDebugInfo() || LScopes.empty()) return;
Devang Patel70d75ca2009-11-12 19:02:56 +00001548
Devang Patelbf47fdb2011-08-10 20:55:27 +00001549 // Define end label for subprogram.
1550 FunctionEndSym = Asm->GetTempSymbol("func_end",
1551 Asm->getFunctionNumber());
1552 // Assumes in correct section after the entry point.
1553 Asm->OutStreamer.EmitLabel(FunctionEndSym);
Manman Ren43213cf2013-02-05 21:52:47 +00001554 // Set DwarfCompileUnitID in MCContext to default value.
1555 Asm->OutStreamer.getContext().setDwarfCompileUnitID(0);
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001556
Devang Patelbf47fdb2011-08-10 20:55:27 +00001557 SmallPtrSet<const MDNode *, 16> ProcessedVars;
1558 collectVariableInfo(MF, ProcessedVars);
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001559
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001560 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
Devang Patel94c7ddb2011-08-16 22:09:43 +00001561 CompileUnit *TheCU = SPMap.lookup(FnScope->getScopeNode());
Nick Lewycky746cb672011-10-26 22:55:33 +00001562 assert(TheCU && "Unable to find compile unit!");
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001563
Devang Patelbf47fdb2011-08-10 20:55:27 +00001564 // Construct abstract scopes.
Devang Patelcd9f6c52011-08-12 18:10:19 +00001565 ArrayRef<LexicalScope *> AList = LScopes.getAbstractScopesList();
1566 for (unsigned i = 0, e = AList.size(); i != e; ++i) {
1567 LexicalScope *AScope = AList[i];
1568 DISubprogram SP(AScope->getScopeNode());
Devang Patelbf47fdb2011-08-10 20:55:27 +00001569 if (SP.Verify()) {
1570 // Collect info for variables that were optimized out.
Devang Patel93d39be2011-08-19 23:28:12 +00001571 DIArray Variables = SP.getVariables();
1572 for (unsigned i = 0, e = Variables.getNumElements(); i != e; ++i) {
1573 DIVariable DV(Variables.getElement(i));
1574 if (!DV || !DV.Verify() || !ProcessedVars.insert(DV))
1575 continue;
Alexey Samsonovb67bd332012-07-06 08:45:08 +00001576 // Check that DbgVariable for DV wasn't created earlier, when
1577 // findAbstractVariable() was called for inlined instance of DV.
1578 LLVMContext &Ctx = DV->getContext();
1579 DIVariable CleanDV = cleanseInlinedVariable(DV, Ctx);
1580 if (AbstractVariables.lookup(CleanDV))
1581 continue;
Devang Patel93d39be2011-08-19 23:28:12 +00001582 if (LexicalScope *Scope = LScopes.findAbstractScope(DV.getContext()))
1583 addScopeVariable(Scope, new DbgVariable(DV, NULL));
Devang Patel78e127d2010-06-25 22:07:34 +00001584 }
1585 }
Devang Patelcd9f6c52011-08-12 18:10:19 +00001586 if (ProcessedSPNodes.count(AScope->getScopeNode()) == 0)
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001587 constructScopeDIE(TheCU, AScope);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001588 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001589
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001590 DIE *CurFnDIE = constructScopeDIE(TheCU, FnScope);
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001591
Nick Lewycky8a8d4792011-12-02 22:16:29 +00001592 if (!MF->getTarget().Options.DisableFramePointerElim(*MF))
Eric Christopher873cf0a2012-08-24 01:14:27 +00001593 TheCU->addFlag(CurFnDIE, dwarf::DW_AT_APPLE_omit_frame_ptr);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001594
Devang Patelbf47fdb2011-08-10 20:55:27 +00001595 DebugFrames.push_back(FunctionDebugFrameInfo(Asm->getFunctionNumber(),
1596 MMI->getFrameMoves()));
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001597
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001598 // Clear debug info
Devang Patelbf47fdb2011-08-10 20:55:27 +00001599 for (DenseMap<LexicalScope *, SmallVector<DbgVariable *, 8> >::iterator
1600 I = ScopeVariables.begin(), E = ScopeVariables.end(); I != E; ++I)
1601 DeleteContainerPointers(I->second);
1602 ScopeVariables.clear();
Devang Pateleac0c9d2011-04-22 18:09:57 +00001603 DeleteContainerPointers(CurrentFnArguments);
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001604 UserVariables.clear();
1605 DbgValues.clear();
Jeffrey Yasskin5c213dc2010-03-12 17:45:06 +00001606 AbstractVariables.clear();
Devang Pateleac9c072010-04-27 19:46:33 +00001607 LabelsBeforeInsn.clear();
1608 LabelsAfterInsn.clear();
Devang Patelf2548ca2010-04-16 23:33:45 +00001609 PrevLabel = NULL;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001610}
1611
Eric Christopherb6dc8652012-11-27 22:43:45 +00001612// Register a source line with debug info. Returns the unique label that was
1613// emitted and which provides correspondence to the source line list.
Devang Patel4243e672011-05-11 19:22:19 +00001614void DwarfDebug::recordSourceLine(unsigned Line, unsigned Col, const MDNode *S,
1615 unsigned Flags) {
Devang Patel65dbc902009-11-25 17:36:49 +00001616 StringRef Fn;
Devang Patel23670e52011-03-24 20:30:50 +00001617 StringRef Dir;
Dan Gohman1cc0d622010-05-05 23:41:32 +00001618 unsigned Src = 1;
1619 if (S) {
1620 DIDescriptor Scope(S);
Devang Patelf84548d2009-10-05 18:03:19 +00001621
Dan Gohman1cc0d622010-05-05 23:41:32 +00001622 if (Scope.isCompileUnit()) {
1623 DICompileUnit CU(S);
Dan Gohman1cc0d622010-05-05 23:41:32 +00001624 Fn = CU.getFilename();
Devang Patel23670e52011-03-24 20:30:50 +00001625 Dir = CU.getDirectory();
Devang Patel3cabc9d2010-10-28 17:30:52 +00001626 } else if (Scope.isFile()) {
1627 DIFile F(S);
Devang Patel3cabc9d2010-10-28 17:30:52 +00001628 Fn = F.getFilename();
Devang Patel23670e52011-03-24 20:30:50 +00001629 Dir = F.getDirectory();
Dan Gohman1cc0d622010-05-05 23:41:32 +00001630 } else if (Scope.isSubprogram()) {
1631 DISubprogram SP(S);
Dan Gohman1cc0d622010-05-05 23:41:32 +00001632 Fn = SP.getFilename();
Devang Patel23670e52011-03-24 20:30:50 +00001633 Dir = SP.getDirectory();
Eric Christopher6618a242011-10-11 22:59:11 +00001634 } else if (Scope.isLexicalBlockFile()) {
1635 DILexicalBlockFile DBF(S);
1636 Fn = DBF.getFilename();
1637 Dir = DBF.getDirectory();
Dan Gohman1cc0d622010-05-05 23:41:32 +00001638 } else if (Scope.isLexicalBlock()) {
1639 DILexicalBlock DB(S);
Dan Gohman1cc0d622010-05-05 23:41:32 +00001640 Fn = DB.getFilename();
Devang Patel23670e52011-03-24 20:30:50 +00001641 Dir = DB.getDirectory();
Dan Gohman1cc0d622010-05-05 23:41:32 +00001642 } else
Craig Topper5e25ee82012-02-05 08:31:47 +00001643 llvm_unreachable("Unexpected scope info");
Dan Gohman1cc0d622010-05-05 23:41:32 +00001644
Manman Ren3de61b42013-03-07 01:42:00 +00001645 Src = getOrCreateSourceID(Fn, Dir,
1646 Asm->OutStreamer.getContext().getDwarfCompileUnitID());
Dan Gohman1cc0d622010-05-05 23:41:32 +00001647 }
Nick Lewycky3bbb6f72011-07-29 03:49:23 +00001648 Asm->OutStreamer.EmitDwarfLocDirective(Src, Line, Col, Flags, 0, 0, Fn);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001649}
1650
Bill Wendling829e67b2009-05-20 23:22:40 +00001651//===----------------------------------------------------------------------===//
1652// Emit Methods
1653//===----------------------------------------------------------------------===//
1654
Eric Christopherb6dc8652012-11-27 22:43:45 +00001655// Compute the size and offset of a DIE.
Jim Grosbach7ab38df2009-11-22 19:20:36 +00001656unsigned
Eric Christopher0e3e9b72012-12-10 23:34:43 +00001657DwarfUnits::computeSizeAndOffset(DIE *Die, unsigned Offset) {
Bill Wendling94d04b82009-05-20 23:21:38 +00001658 // Get the children.
1659 const std::vector<DIE *> &Children = Die->getChildren();
1660
Bill Wendling94d04b82009-05-20 23:21:38 +00001661 // Record the abbreviation.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001662 assignAbbrevNumber(Die->getAbbrev());
Bill Wendling94d04b82009-05-20 23:21:38 +00001663
1664 // Get the abbreviation for this DIE.
1665 unsigned AbbrevNumber = Die->getAbbrevNumber();
Eric Christopher0e3e9b72012-12-10 23:34:43 +00001666 const DIEAbbrev *Abbrev = Abbreviations->at(AbbrevNumber - 1);
Bill Wendling94d04b82009-05-20 23:21:38 +00001667
1668 // Set DIE offset
1669 Die->setOffset(Offset);
1670
1671 // Start the size with the size of abbreviation code.
Chris Lattneraf76e592009-08-22 20:48:53 +00001672 Offset += MCAsmInfo::getULEB128Size(AbbrevNumber);
Bill Wendling94d04b82009-05-20 23:21:38 +00001673
1674 const SmallVector<DIEValue*, 32> &Values = Die->getValues();
1675 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
1676
1677 // Size the DIE attribute values.
1678 for (unsigned i = 0, N = Values.size(); i < N; ++i)
1679 // Size attribute value.
Chris Lattnera37d5382010-04-05 00:18:22 +00001680 Offset += Values[i]->SizeOf(Asm, AbbrevData[i].getForm());
Bill Wendling94d04b82009-05-20 23:21:38 +00001681
1682 // Size the DIE children if any.
1683 if (!Children.empty()) {
1684 assert(Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes &&
1685 "Children flag not set");
1686
1687 for (unsigned j = 0, M = Children.size(); j < M; ++j)
Eric Christopherfbd19752012-11-20 22:14:13 +00001688 Offset = computeSizeAndOffset(Children[j], Offset);
Bill Wendling94d04b82009-05-20 23:21:38 +00001689
1690 // End of children marker.
1691 Offset += sizeof(int8_t);
1692 }
1693
1694 Die->setSize(Offset - Die->getOffset());
1695 return Offset;
1696}
1697
Eric Christopherb6dc8652012-11-27 22:43:45 +00001698// Compute the size and offset of all the DIEs.
Eric Christopher0e3e9b72012-12-10 23:34:43 +00001699void DwarfUnits::computeSizeAndOffsets() {
Manman Renbc3e96f2013-03-12 18:27:15 +00001700 // Offset from the beginning of debug info section.
1701 unsigned AccuOffset = 0;
Eric Christopher0e3e9b72012-12-10 23:34:43 +00001702 for (SmallVector<CompileUnit *, 1>::iterator I = CUs.begin(),
1703 E = CUs.end(); I != E; ++I) {
Manman Renbc3e96f2013-03-12 18:27:15 +00001704 (*I)->setDebugInfoOffset(AccuOffset);
Eric Christopher98e237f2012-11-30 23:59:06 +00001705 unsigned Offset =
1706 sizeof(int32_t) + // Length of Compilation Unit Info
1707 sizeof(int16_t) + // DWARF version number
1708 sizeof(int32_t) + // Offset Into Abbrev. Section
1709 sizeof(int8_t); // Pointer Size (in bytes)
1710
Manman Renbc3e96f2013-03-12 18:27:15 +00001711 unsigned EndOffset = computeSizeAndOffset((*I)->getCUDie(), Offset);
1712 AccuOffset += EndOffset;
Devang Patel163a9f72010-05-10 22:49:55 +00001713 }
Bill Wendling94d04b82009-05-20 23:21:38 +00001714}
1715
Eric Christopherb6dc8652012-11-27 22:43:45 +00001716// Emit initial Dwarf sections with a label at the start of each one.
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001717void DwarfDebug::emitSectionLabels() {
Chris Lattner6c2f9e12009-08-19 05:49:37 +00001718 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
Daniel Dunbarf612ff62009-09-19 20:40:05 +00001719
Bill Wendling94d04b82009-05-20 23:21:38 +00001720 // Dwarf sections base addresses.
Jim Grosbach1e20b962010-07-21 21:21:52 +00001721 DwarfInfoSectionSym =
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001722 emitSectionSym(Asm, TLOF.getDwarfInfoSection(), "section_info");
Jim Grosbach1e20b962010-07-21 21:21:52 +00001723 DwarfAbbrevSectionSym =
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001724 emitSectionSym(Asm, TLOF.getDwarfAbbrevSection(), "section_abbrev");
Eric Christopher6eebe472012-12-19 22:02:53 +00001725 if (useSplitDwarf())
1726 DwarfAbbrevDWOSectionSym =
1727 emitSectionSym(Asm, TLOF.getDwarfAbbrevDWOSection(),
1728 "section_abbrev_dwo");
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001729 emitSectionSym(Asm, TLOF.getDwarfARangesSection());
Jim Grosbach1e20b962010-07-21 21:21:52 +00001730
Chris Lattner9c69e285532010-04-04 22:59:04 +00001731 if (const MCSection *MacroInfo = TLOF.getDwarfMacroInfoSection())
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001732 emitSectionSym(Asm, MacroInfo);
Bill Wendling94d04b82009-05-20 23:21:38 +00001733
Eric Christopher7a0103c2013-02-07 21:19:50 +00001734 DwarfLineSectionSym =
1735 emitSectionSym(Asm, TLOF.getDwarfLineSection(), "section_line");
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001736 emitSectionSym(Asm, TLOF.getDwarfLocSection());
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00001737 if (GenerateDwarfPubNamesSection)
1738 emitSectionSym(Asm, TLOF.getDwarfPubNamesSection());
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001739 emitSectionSym(Asm, TLOF.getDwarfPubTypesSection());
Jim Grosbach1e20b962010-07-21 21:21:52 +00001740 DwarfStrSectionSym =
Eric Christopher64f824c2012-12-27 02:14:01 +00001741 emitSectionSym(Asm, TLOF.getDwarfStrSection(), "info_string");
1742 if (useSplitDwarf())
1743 DwarfStrDWOSectionSym =
1744 emitSectionSym(Asm, TLOF.getDwarfStrDWOSection(), "skel_string");
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001745 DwarfDebugRangeSectionSym = emitSectionSym(Asm, TLOF.getDwarfRangesSection(),
Devang Patelf2548ca2010-04-16 23:33:45 +00001746 "debug_range");
Bill Wendling94d04b82009-05-20 23:21:38 +00001747
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001748 DwarfDebugLocSectionSym = emitSectionSym(Asm, TLOF.getDwarfLocSection(),
Devang Patelc3f5f782010-05-25 23:40:22 +00001749 "section_debug_loc");
1750
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001751 TextSectionSym = emitSectionSym(Asm, TLOF.getTextSection(), "text_begin");
1752 emitSectionSym(Asm, TLOF.getDataSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00001753}
1754
Eric Christopherb6dc8652012-11-27 22:43:45 +00001755// Recursively emits a debug information entry.
Eric Christopher6eebe472012-12-19 22:02:53 +00001756void DwarfDebug::emitDIE(DIE *Die, std::vector<DIEAbbrev *> *Abbrevs) {
Bill Wendling94d04b82009-05-20 23:21:38 +00001757 // Get the abbreviation for this DIE.
1758 unsigned AbbrevNumber = Die->getAbbrevNumber();
Eric Christopher6eebe472012-12-19 22:02:53 +00001759 const DIEAbbrev *Abbrev = Abbrevs->at(AbbrevNumber - 1);
Bill Wendling94d04b82009-05-20 23:21:38 +00001760
Bill Wendling94d04b82009-05-20 23:21:38 +00001761 // Emit the code (index) for the abbreviation.
Chris Lattner3f53c832010-04-04 18:52:31 +00001762 if (Asm->isVerbose())
Chris Lattner894d75a2010-01-22 23:18:42 +00001763 Asm->OutStreamer.AddComment("Abbrev [" + Twine(AbbrevNumber) + "] 0x" +
1764 Twine::utohexstr(Die->getOffset()) + ":0x" +
1765 Twine::utohexstr(Die->getSize()) + " " +
1766 dwarf::TagString(Abbrev->getTag()));
Chris Lattner7e1a8f82010-04-04 19:09:29 +00001767 Asm->EmitULEB128(AbbrevNumber);
Bill Wendling94d04b82009-05-20 23:21:38 +00001768
Jeffrey Yasskin638fe8d2010-03-22 18:47:14 +00001769 const SmallVector<DIEValue*, 32> &Values = Die->getValues();
Bill Wendling94d04b82009-05-20 23:21:38 +00001770 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
1771
1772 // Emit the DIE attribute values.
1773 for (unsigned i = 0, N = Values.size(); i < N; ++i) {
1774 unsigned Attr = AbbrevData[i].getAttribute();
1775 unsigned Form = AbbrevData[i].getForm();
1776 assert(Form && "Too many attributes for DIE (check abbreviation)");
1777
Chris Lattner3f53c832010-04-04 18:52:31 +00001778 if (Asm->isVerbose())
Chris Lattnera8013622010-01-24 18:54:17 +00001779 Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr));
Jim Grosbach1e20b962010-07-21 21:21:52 +00001780
Bill Wendling94d04b82009-05-20 23:21:38 +00001781 switch (Attr) {
Bill Wendling94d04b82009-05-20 23:21:38 +00001782 case dwarf::DW_AT_abstract_origin: {
1783 DIEEntry *E = cast<DIEEntry>(Values[i]);
1784 DIE *Origin = E->getEntry();
Devang Patel53bb5c92009-11-10 23:06:00 +00001785 unsigned Addr = Origin->getOffset();
Manman Renbc3e96f2013-03-12 18:27:15 +00001786 if (Form == dwarf::DW_FORM_ref_addr) {
1787 // For DW_FORM_ref_addr, output the offset from beginning of debug info
1788 // section. Origin->getOffset() returns the offset from start of the
1789 // compile unit.
1790 DwarfUnits &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
1791 Addr += Holder.getCUOffset(Origin->getCompileUnit());
1792 }
Bill Wendling94d04b82009-05-20 23:21:38 +00001793 Asm->EmitInt32(Addr);
1794 break;
1795 }
Devang Patelf2548ca2010-04-16 23:33:45 +00001796 case dwarf::DW_AT_ranges: {
1797 // DW_AT_range Value encodes offset in debug_range section.
1798 DIEInteger *V = cast<DIEInteger>(Values[i]);
Devang Patelb1fcfbe2010-09-02 16:43:44 +00001799
Nick Lewyckyffccd922012-06-22 01:25:12 +00001800 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections()) {
Devang Patelb1fcfbe2010-09-02 16:43:44 +00001801 Asm->EmitLabelPlusOffset(DwarfDebugRangeSectionSym,
1802 V->getValue(),
1803 4);
1804 } else {
1805 Asm->EmitLabelOffsetDifference(DwarfDebugRangeSectionSym,
1806 V->getValue(),
1807 DwarfDebugRangeSectionSym,
1808 4);
1809 }
Devang Patelf2548ca2010-04-16 23:33:45 +00001810 break;
1811 }
Devang Patelc3f5f782010-05-25 23:40:22 +00001812 case dwarf::DW_AT_location: {
Nick Lewyckyffccd922012-06-22 01:25:12 +00001813 if (DIELabel *L = dyn_cast<DIELabel>(Values[i])) {
1814 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
1815 Asm->EmitLabelReference(L->getValue(), 4);
1816 else
1817 Asm->EmitLabelDifference(L->getValue(), DwarfDebugLocSectionSym, 4);
1818 } else {
Devang Patelc3f5f782010-05-25 23:40:22 +00001819 Values[i]->EmitValue(Asm, Form);
Nick Lewyckyffccd922012-06-22 01:25:12 +00001820 }
Devang Patelc3f5f782010-05-25 23:40:22 +00001821 break;
1822 }
Devang Patel2a361602010-09-29 19:08:08 +00001823 case dwarf::DW_AT_accessibility: {
1824 if (Asm->isVerbose()) {
1825 DIEInteger *V = cast<DIEInteger>(Values[i]);
1826 Asm->OutStreamer.AddComment(dwarf::AccessibilityString(V->getValue()));
1827 }
1828 Values[i]->EmitValue(Asm, Form);
1829 break;
1830 }
Bill Wendling94d04b82009-05-20 23:21:38 +00001831 default:
1832 // Emit an attribute using the defined form.
Chris Lattnerd38fee82010-04-05 00:13:49 +00001833 Values[i]->EmitValue(Asm, Form);
Bill Wendling94d04b82009-05-20 23:21:38 +00001834 break;
1835 }
Bill Wendling94d04b82009-05-20 23:21:38 +00001836 }
1837
1838 // Emit the DIE children if any.
1839 if (Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes) {
1840 const std::vector<DIE *> &Children = Die->getChildren();
1841
1842 for (unsigned j = 0, M = Children.size(); j < M; ++j)
Eric Christopher6eebe472012-12-19 22:02:53 +00001843 emitDIE(Children[j], Abbrevs);
Bill Wendling94d04b82009-05-20 23:21:38 +00001844
Chris Lattner3f53c832010-04-04 18:52:31 +00001845 if (Asm->isVerbose())
Chris Lattner233f52b2010-03-09 23:52:58 +00001846 Asm->OutStreamer.AddComment("End Of Children Mark");
1847 Asm->EmitInt8(0);
Bill Wendling94d04b82009-05-20 23:21:38 +00001848 }
1849}
1850
Eric Christopherb1e66d02012-12-15 00:04:07 +00001851// Emit the various dwarf units to the unit section USection with
1852// the abbreviations going into ASection.
1853void DwarfUnits::emitUnits(DwarfDebug *DD,
1854 const MCSection *USection,
1855 const MCSection *ASection,
1856 const MCSymbol *ASectionSym) {
1857 Asm->OutStreamer.SwitchSection(USection);
1858 for (SmallVector<CompileUnit *, 1>::iterator I = CUs.begin(),
1859 E = CUs.end(); I != E; ++I) {
1860 CompileUnit *TheCU = *I;
Devang Patel163a9f72010-05-10 22:49:55 +00001861 DIE *Die = TheCU->getCUDie();
Jim Grosbach1e20b962010-07-21 21:21:52 +00001862
Devang Patel163a9f72010-05-10 22:49:55 +00001863 // Emit the compile units header.
Eric Christopherb1e66d02012-12-15 00:04:07 +00001864 Asm->OutStreamer
1865 .EmitLabel(Asm->GetTempSymbol(USection->getLabelBeginName(),
1866 TheCU->getUniqueID()));
Jim Grosbach1e20b962010-07-21 21:21:52 +00001867
Devang Patel163a9f72010-05-10 22:49:55 +00001868 // Emit size of content not including length itself
1869 unsigned ContentSize = Die->getSize() +
1870 sizeof(int16_t) + // DWARF version number
1871 sizeof(int32_t) + // Offset Into Abbrev. Section
Devang Patel65705d52011-04-13 19:41:17 +00001872 sizeof(int8_t); // Pointer Size (in bytes)
Jim Grosbach1e20b962010-07-21 21:21:52 +00001873
Devang Patel163a9f72010-05-10 22:49:55 +00001874 Asm->OutStreamer.AddComment("Length of Compilation Unit Info");
1875 Asm->EmitInt32(ContentSize);
1876 Asm->OutStreamer.AddComment("DWARF version number");
1877 Asm->EmitInt16(dwarf::DWARF_VERSION);
1878 Asm->OutStreamer.AddComment("Offset Into Abbrev. Section");
Eric Christopherb1e66d02012-12-15 00:04:07 +00001879 Asm->EmitSectionOffset(Asm->GetTempSymbol(ASection->getLabelBeginName()),
1880 ASectionSym);
Devang Patel163a9f72010-05-10 22:49:55 +00001881 Asm->OutStreamer.AddComment("Address Size (in bytes)");
Chandler Carruth426c2bf2012-11-01 09:14:31 +00001882 Asm->EmitInt8(Asm->getDataLayout().getPointerSize());
Jim Grosbach1e20b962010-07-21 21:21:52 +00001883
Eric Christopher6eebe472012-12-19 22:02:53 +00001884 DD->emitDIE(Die, Abbreviations);
Eric Christopherb1e66d02012-12-15 00:04:07 +00001885 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol(USection->getLabelEndName(),
Eli Benderskyd4a05e02012-12-03 18:45:45 +00001886 TheCU->getUniqueID()));
Devang Patel163a9f72010-05-10 22:49:55 +00001887 }
Bill Wendling94d04b82009-05-20 23:21:38 +00001888}
1889
Manman Renbc3e96f2013-03-12 18:27:15 +00001890/// For a given compile unit DIE, returns offset from beginning of debug info.
1891unsigned DwarfUnits::getCUOffset(DIE *Die) {
Manman Ren4c6f8952013-03-13 18:41:27 +00001892 assert(Die->getTag() == dwarf::DW_TAG_compile_unit &&
1893 "Input DIE should be compile unit in getCUOffset.");
Manman Renbc3e96f2013-03-12 18:27:15 +00001894 for (SmallVector<CompileUnit *, 1>::iterator I = CUs.begin(),
1895 E = CUs.end(); I != E; ++I) {
1896 CompileUnit *TheCU = *I;
1897 if (TheCU->getCUDie() == Die)
1898 return TheCU->getDebugInfoOffset();
1899 }
Manman Ren4c6f8952013-03-13 18:41:27 +00001900 llvm_unreachable("The compile unit DIE should belong to CUs in DwarfUnits.");
Manman Renbc3e96f2013-03-12 18:27:15 +00001901}
1902
Eric Christopher98e237f2012-11-30 23:59:06 +00001903// Emit the debug info section.
1904void DwarfDebug::emitDebugInfo() {
Eric Christopherb1e66d02012-12-15 00:04:07 +00001905 DwarfUnits &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
1906
1907 Holder.emitUnits(this, Asm->getObjFileLowering().getDwarfInfoSection(),
1908 Asm->getObjFileLowering().getDwarfAbbrevSection(),
1909 DwarfAbbrevSectionSym);
Eric Christopher98e237f2012-11-30 23:59:06 +00001910}
1911
Eric Christopherb6dc8652012-11-27 22:43:45 +00001912// Emit the abbreviation section.
Eric Christopher7dc68db2012-11-20 23:30:11 +00001913void DwarfDebug::emitAbbreviations() {
Eric Christopher6eebe472012-12-19 22:02:53 +00001914 if (!useSplitDwarf())
1915 emitAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevSection(),
1916 &Abbreviations);
1917 else
1918 emitSkeletonAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevSection());
1919}
Bill Wendling94d04b82009-05-20 23:21:38 +00001920
Eric Christopher6eebe472012-12-19 22:02:53 +00001921void DwarfDebug::emitAbbrevs(const MCSection *Section,
1922 std::vector<DIEAbbrev *> *Abbrevs) {
1923 // Check to see if it is worth the effort.
1924 if (!Abbrevs->empty()) {
1925 // Start the debug abbrev section.
1926 Asm->OutStreamer.SwitchSection(Section);
1927
1928 MCSymbol *Begin = Asm->GetTempSymbol(Section->getLabelBeginName());
Eric Christopher44fedba2012-12-13 03:00:38 +00001929 Asm->OutStreamer.EmitLabel(Begin);
Bill Wendling94d04b82009-05-20 23:21:38 +00001930
1931 // For each abbrevation.
Eric Christopher6eebe472012-12-19 22:02:53 +00001932 for (unsigned i = 0, N = Abbrevs->size(); i < N; ++i) {
Bill Wendling94d04b82009-05-20 23:21:38 +00001933 // Get abbreviation data
Eric Christopher6eebe472012-12-19 22:02:53 +00001934 const DIEAbbrev *Abbrev = Abbrevs->at(i);
Bill Wendling94d04b82009-05-20 23:21:38 +00001935
1936 // Emit the abbrevations code (base 1 index.)
Chris Lattner7e1a8f82010-04-04 19:09:29 +00001937 Asm->EmitULEB128(Abbrev->getNumber(), "Abbreviation Code");
Bill Wendling94d04b82009-05-20 23:21:38 +00001938
1939 // Emit the abbreviations data.
Chris Lattnerd38fee82010-04-05 00:13:49 +00001940 Abbrev->Emit(Asm);
Bill Wendling94d04b82009-05-20 23:21:38 +00001941 }
1942
1943 // Mark end of abbreviations.
Chris Lattner7e1a8f82010-04-04 19:09:29 +00001944 Asm->EmitULEB128(0, "EOM(3)");
Bill Wendling94d04b82009-05-20 23:21:38 +00001945
Eric Christopher6eebe472012-12-19 22:02:53 +00001946 MCSymbol *End = Asm->GetTempSymbol(Section->getLabelEndName());
Eric Christopher44fedba2012-12-13 03:00:38 +00001947 Asm->OutStreamer.EmitLabel(End);
Bill Wendling94d04b82009-05-20 23:21:38 +00001948 }
1949}
1950
Eric Christopherb6dc8652012-11-27 22:43:45 +00001951// Emit the last address of the section and the end of the line matrix.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001952void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) {
Bill Wendling94d04b82009-05-20 23:21:38 +00001953 // Define last address of section.
Chris Lattner233f52b2010-03-09 23:52:58 +00001954 Asm->OutStreamer.AddComment("Extended Op");
1955 Asm->EmitInt8(0);
Jim Grosbach1e20b962010-07-21 21:21:52 +00001956
Chris Lattner233f52b2010-03-09 23:52:58 +00001957 Asm->OutStreamer.AddComment("Op size");
Chandler Carruth426c2bf2012-11-01 09:14:31 +00001958 Asm->EmitInt8(Asm->getDataLayout().getPointerSize() + 1);
Chris Lattner233f52b2010-03-09 23:52:58 +00001959 Asm->OutStreamer.AddComment("DW_LNE_set_address");
1960 Asm->EmitInt8(dwarf::DW_LNE_set_address);
1961
1962 Asm->OutStreamer.AddComment("Section end label");
Chris Lattnerd85fc6e2010-03-10 01:17:49 +00001963
Chris Lattnerc0215722010-04-04 19:25:43 +00001964 Asm->OutStreamer.EmitSymbolValue(Asm->GetTempSymbol("section_end",SectionEnd),
Eric Christopherca1dd052013-01-09 01:35:34 +00001965 Asm->getDataLayout().getPointerSize());
Bill Wendling94d04b82009-05-20 23:21:38 +00001966
1967 // Mark end of matrix.
Chris Lattner233f52b2010-03-09 23:52:58 +00001968 Asm->OutStreamer.AddComment("DW_LNE_end_sequence");
1969 Asm->EmitInt8(0);
Chris Lattner0ad9c912010-01-22 22:09:00 +00001970 Asm->EmitInt8(1);
Chris Lattner894d75a2010-01-22 23:18:42 +00001971 Asm->EmitInt8(1);
Bill Wendling94d04b82009-05-20 23:21:38 +00001972}
1973
Eric Christopherb6dc8652012-11-27 22:43:45 +00001974// Emit visible names into a hashed accelerator table section.
Eric Christopher09ac3d82011-11-07 09:24:32 +00001975void DwarfDebug::emitAccelNames() {
1976 DwarfAccelTable AT(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset,
1977 dwarf::DW_FORM_data4));
1978 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
1979 E = CUMap.end(); I != E; ++I) {
1980 CompileUnit *TheCU = I->second;
Eric Christopher0ffe2b42011-11-10 19:25:34 +00001981 const StringMap<std::vector<DIE*> > &Names = TheCU->getAccelNames();
1982 for (StringMap<std::vector<DIE*> >::const_iterator
Eric Christopher09ac3d82011-11-07 09:24:32 +00001983 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
1984 const char *Name = GI->getKeyData();
Eric Christopherfa03db02012-01-06 23:03:34 +00001985 const std::vector<DIE *> &Entities = GI->second;
Eric Christopher0ffe2b42011-11-10 19:25:34 +00001986 for (std::vector<DIE *>::const_iterator DI = Entities.begin(),
1987 DE = Entities.end(); DI != DE; ++DI)
1988 AT.AddName(Name, (*DI));
Eric Christopher09ac3d82011-11-07 09:24:32 +00001989 }
1990 }
1991
1992 AT.FinalizeTable(Asm, "Names");
1993 Asm->OutStreamer.SwitchSection(
1994 Asm->getObjFileLowering().getDwarfAccelNamesSection());
1995 MCSymbol *SectionBegin = Asm->GetTempSymbol("names_begin");
1996 Asm->OutStreamer.EmitLabel(SectionBegin);
1997
1998 // Emit the full data.
Eric Christopher2e5d8702012-12-20 21:58:36 +00001999 AT.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher09ac3d82011-11-07 09:24:32 +00002000}
2001
Eric Christopher72c16552012-12-20 21:58:40 +00002002// Emit objective C classes and categories into a hashed accelerator table
2003// section.
Eric Christopher09ac3d82011-11-07 09:24:32 +00002004void DwarfDebug::emitAccelObjC() {
2005 DwarfAccelTable AT(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset,
2006 dwarf::DW_FORM_data4));
2007 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2008 E = CUMap.end(); I != E; ++I) {
2009 CompileUnit *TheCU = I->second;
2010 const StringMap<std::vector<DIE*> > &Names = TheCU->getAccelObjC();
2011 for (StringMap<std::vector<DIE*> >::const_iterator
2012 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
2013 const char *Name = GI->getKeyData();
Eric Christopherfa03db02012-01-06 23:03:34 +00002014 const std::vector<DIE *> &Entities = GI->second;
Eric Christopher09ac3d82011-11-07 09:24:32 +00002015 for (std::vector<DIE *>::const_iterator DI = Entities.begin(),
2016 DE = Entities.end(); DI != DE; ++DI)
2017 AT.AddName(Name, (*DI));
2018 }
2019 }
2020
2021 AT.FinalizeTable(Asm, "ObjC");
2022 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering()
2023 .getDwarfAccelObjCSection());
2024 MCSymbol *SectionBegin = Asm->GetTempSymbol("objc_begin");
2025 Asm->OutStreamer.EmitLabel(SectionBegin);
2026
2027 // Emit the full data.
Eric Christopher2e5d8702012-12-20 21:58:36 +00002028 AT.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher09ac3d82011-11-07 09:24:32 +00002029}
2030
Eric Christopherb6dc8652012-11-27 22:43:45 +00002031// Emit namespace dies into a hashed accelerator table.
Eric Christopher09ac3d82011-11-07 09:24:32 +00002032void DwarfDebug::emitAccelNamespaces() {
2033 DwarfAccelTable AT(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset,
2034 dwarf::DW_FORM_data4));
2035 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2036 E = CUMap.end(); I != E; ++I) {
2037 CompileUnit *TheCU = I->second;
Eric Christopher8bd36ea2011-11-10 21:47:55 +00002038 const StringMap<std::vector<DIE*> > &Names = TheCU->getAccelNamespace();
2039 for (StringMap<std::vector<DIE*> >::const_iterator
Eric Christopher09ac3d82011-11-07 09:24:32 +00002040 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
2041 const char *Name = GI->getKeyData();
Eric Christopherfa03db02012-01-06 23:03:34 +00002042 const std::vector<DIE *> &Entities = GI->second;
Eric Christopher8bd36ea2011-11-10 21:47:55 +00002043 for (std::vector<DIE *>::const_iterator DI = Entities.begin(),
2044 DE = Entities.end(); DI != DE; ++DI)
2045 AT.AddName(Name, (*DI));
Eric Christopher09ac3d82011-11-07 09:24:32 +00002046 }
2047 }
2048
2049 AT.FinalizeTable(Asm, "namespac");
2050 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering()
2051 .getDwarfAccelNamespaceSection());
2052 MCSymbol *SectionBegin = Asm->GetTempSymbol("namespac_begin");
2053 Asm->OutStreamer.EmitLabel(SectionBegin);
2054
2055 // Emit the full data.
Eric Christopher2e5d8702012-12-20 21:58:36 +00002056 AT.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher09ac3d82011-11-07 09:24:32 +00002057}
2058
Eric Christopherb6dc8652012-11-27 22:43:45 +00002059// Emit type dies into a hashed accelerator table.
Eric Christopher09ac3d82011-11-07 09:24:32 +00002060void DwarfDebug::emitAccelTypes() {
Eric Christopherc36145f2012-01-06 04:35:23 +00002061 std::vector<DwarfAccelTable::Atom> Atoms;
2062 Atoms.push_back(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset,
2063 dwarf::DW_FORM_data4));
2064 Atoms.push_back(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeTag,
2065 dwarf::DW_FORM_data2));
2066 Atoms.push_back(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeTypeFlags,
2067 dwarf::DW_FORM_data1));
2068 DwarfAccelTable AT(Atoms);
Eric Christopher09ac3d82011-11-07 09:24:32 +00002069 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2070 E = CUMap.end(); I != E; ++I) {
2071 CompileUnit *TheCU = I->second;
Eric Christopherc36145f2012-01-06 04:35:23 +00002072 const StringMap<std::vector<std::pair<DIE*, unsigned > > > &Names
2073 = TheCU->getAccelTypes();
2074 for (StringMap<std::vector<std::pair<DIE*, unsigned> > >::const_iterator
Eric Christopher09ac3d82011-11-07 09:24:32 +00002075 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
2076 const char *Name = GI->getKeyData();
Eric Christopherfa03db02012-01-06 23:03:34 +00002077 const std::vector<std::pair<DIE *, unsigned> > &Entities = GI->second;
Eric Christopherc36145f2012-01-06 04:35:23 +00002078 for (std::vector<std::pair<DIE *, unsigned> >::const_iterator DI
2079 = Entities.begin(), DE = Entities.end(); DI !=DE; ++DI)
2080 AT.AddName(Name, (*DI).first, (*DI).second);
Eric Christopher09ac3d82011-11-07 09:24:32 +00002081 }
2082 }
2083
2084 AT.FinalizeTable(Asm, "types");
2085 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering()
2086 .getDwarfAccelTypesSection());
2087 MCSymbol *SectionBegin = Asm->GetTempSymbol("types_begin");
2088 Asm->OutStreamer.EmitLabel(SectionBegin);
2089
2090 // Emit the full data.
Eric Christopher2e5d8702012-12-20 21:58:36 +00002091 AT.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher09ac3d82011-11-07 09:24:32 +00002092}
2093
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00002094/// emitDebugPubnames - Emit visible names into a debug pubnames section.
2095///
2096void DwarfDebug::emitDebugPubnames() {
2097 const MCSection *ISec = Asm->getObjFileLowering().getDwarfInfoSection();
2098
2099 typedef DenseMap<const MDNode*, CompileUnit*> CUMapType;
2100 for (CUMapType::iterator I = CUMap.begin(), E = CUMap.end(); I != E; ++I) {
2101 CompileUnit *TheCU = I->second;
2102 unsigned ID = TheCU->getUniqueID();
2103
2104 if (TheCU->getGlobalNames().empty())
2105 continue;
2106
2107 // Start the dwarf pubnames section.
2108 Asm->OutStreamer.SwitchSection(
2109 Asm->getObjFileLowering().getDwarfPubNamesSection());
2110
2111 Asm->OutStreamer.AddComment("Length of Public Names Info");
2112 Asm->EmitLabelDifference(Asm->GetTempSymbol("pubnames_end", ID),
2113 Asm->GetTempSymbol("pubnames_begin", ID), 4);
2114
2115 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_begin", ID));
2116
2117 Asm->OutStreamer.AddComment("DWARF Version");
2118 Asm->EmitInt16(dwarf::DWARF_VERSION);
2119
2120 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
2121 Asm->EmitSectionOffset(Asm->GetTempSymbol(ISec->getLabelBeginName(), ID),
2122 DwarfInfoSectionSym);
2123
2124 Asm->OutStreamer.AddComment("Compilation Unit Length");
2125 Asm->EmitLabelDifference(Asm->GetTempSymbol(ISec->getLabelEndName(), ID),
2126 Asm->GetTempSymbol(ISec->getLabelBeginName(), ID),
2127 4);
2128
2129 const StringMap<DIE*> &Globals = TheCU->getGlobalNames();
2130 for (StringMap<DIE*>::const_iterator
2131 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2132 const char *Name = GI->getKeyData();
2133 const DIE *Entity = GI->second;
2134
2135 Asm->OutStreamer.AddComment("DIE offset");
2136 Asm->EmitInt32(Entity->getOffset());
2137
2138 if (Asm->isVerbose())
2139 Asm->OutStreamer.AddComment("External Name");
2140 Asm->OutStreamer.EmitBytes(StringRef(Name, strlen(Name)+1), 0);
2141 }
2142
2143 Asm->OutStreamer.AddComment("End Mark");
2144 Asm->EmitInt32(0);
2145 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_end", ID));
2146 }
2147}
2148
Devang Patel193f7202009-11-24 01:14:22 +00002149void DwarfDebug::emitDebugPubTypes() {
Devang Patel163a9f72010-05-10 22:49:55 +00002150 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2151 E = CUMap.end(); I != E; ++I) {
2152 CompileUnit *TheCU = I->second;
Eric Christopher63701182011-11-07 09:18:35 +00002153 // Start the dwarf pubtypes section.
Devang Patel163a9f72010-05-10 22:49:55 +00002154 Asm->OutStreamer.SwitchSection(
2155 Asm->getObjFileLowering().getDwarfPubTypesSection());
2156 Asm->OutStreamer.AddComment("Length of Public Types Info");
2157 Asm->EmitLabelDifference(
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002158 Asm->GetTempSymbol("pubtypes_end", TheCU->getUniqueID()),
2159 Asm->GetTempSymbol("pubtypes_begin", TheCU->getUniqueID()), 4);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002160
Devang Patel163a9f72010-05-10 22:49:55 +00002161 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_begin",
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002162 TheCU->getUniqueID()));
Jim Grosbach1e20b962010-07-21 21:21:52 +00002163
Devang Patel163a9f72010-05-10 22:49:55 +00002164 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DWARF Version");
2165 Asm->EmitInt16(dwarf::DWARF_VERSION);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002166
Devang Patel163a9f72010-05-10 22:49:55 +00002167 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
Eric Christophercf6b8ad2012-12-15 00:04:04 +00002168 const MCSection *ISec = Asm->getObjFileLowering().getDwarfInfoSection();
2169 Asm->EmitSectionOffset(Asm->GetTempSymbol(ISec->getLabelBeginName(),
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002170 TheCU->getUniqueID()),
Devang Patel163a9f72010-05-10 22:49:55 +00002171 DwarfInfoSectionSym);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002172
Devang Patel163a9f72010-05-10 22:49:55 +00002173 Asm->OutStreamer.AddComment("Compilation Unit Length");
Eric Christophercf6b8ad2012-12-15 00:04:04 +00002174 Asm->EmitLabelDifference(Asm->GetTempSymbol(ISec->getLabelEndName(),
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002175 TheCU->getUniqueID()),
Eric Christophercf6b8ad2012-12-15 00:04:04 +00002176 Asm->GetTempSymbol(ISec->getLabelBeginName(),
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002177 TheCU->getUniqueID()),
Devang Patel163a9f72010-05-10 22:49:55 +00002178 4);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002179
Devang Patel163a9f72010-05-10 22:49:55 +00002180 const StringMap<DIE*> &Globals = TheCU->getGlobalTypes();
2181 for (StringMap<DIE*>::const_iterator
2182 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2183 const char *Name = GI->getKeyData();
Nick Lewycky3bbb6f72011-07-29 03:49:23 +00002184 DIE *Entity = GI->second;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002185
Devang Patel163a9f72010-05-10 22:49:55 +00002186 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
2187 Asm->EmitInt32(Entity->getOffset());
Jim Grosbach1e20b962010-07-21 21:21:52 +00002188
Devang Patel163a9f72010-05-10 22:49:55 +00002189 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("External Name");
Benjamin Kramer983c4572011-11-09 18:16:11 +00002190 // Emit the name with a terminating null byte.
Eric Christopher68ca5622013-01-09 01:57:54 +00002191 Asm->OutStreamer.EmitBytes(StringRef(Name, GI->getKeyLength()+1));
Devang Patel163a9f72010-05-10 22:49:55 +00002192 }
Jim Grosbach1e20b962010-07-21 21:21:52 +00002193
Devang Patel163a9f72010-05-10 22:49:55 +00002194 Asm->OutStreamer.AddComment("End Mark");
Jim Grosbach1e20b962010-07-21 21:21:52 +00002195 Asm->EmitInt32(0);
Devang Patel163a9f72010-05-10 22:49:55 +00002196 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_end",
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002197 TheCU->getUniqueID()));
Devang Patel193f7202009-11-24 01:14:22 +00002198 }
Devang Patel193f7202009-11-24 01:14:22 +00002199}
2200
Eric Christopher64f824c2012-12-27 02:14:01 +00002201// Emit strings into a string section.
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002202void DwarfUnits::emitStrings(const MCSection *StrSection,
2203 const MCSection *OffsetSection = NULL,
2204 const MCSymbol *StrSecSym = NULL) {
Eric Christopher64f824c2012-12-27 02:14:01 +00002205
Eric Christopherb6714222013-01-08 22:22:06 +00002206 if (StringPool.empty()) return;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002207
Chris Lattner0d9d70f2010-03-09 23:38:23 +00002208 // Start the dwarf str section.
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002209 Asm->OutStreamer.SwitchSection(StrSection);
Bill Wendling94d04b82009-05-20 23:21:38 +00002210
Chris Lattnerbc733f52010-03-13 02:17:42 +00002211 // Get all of the string pool entries and put them in an array by their ID so
2212 // we can sort them.
Jim Grosbach1e20b962010-07-21 21:21:52 +00002213 SmallVector<std::pair<unsigned,
Eric Christopherff348452013-01-07 22:40:45 +00002214 StringMapEntry<std::pair<MCSymbol*, unsigned> >*>, 64> Entries;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002215
Chris Lattnerbc733f52010-03-13 02:17:42 +00002216 for (StringMap<std::pair<MCSymbol*, unsigned> >::iterator
Eric Christopherb6714222013-01-08 22:22:06 +00002217 I = StringPool.begin(), E = StringPool.end();
Eric Christopher72c16552012-12-20 21:58:40 +00002218 I != E; ++I)
Chris Lattnerbc733f52010-03-13 02:17:42 +00002219 Entries.push_back(std::make_pair(I->second.second, &*I));
Jim Grosbach1e20b962010-07-21 21:21:52 +00002220
Chris Lattnerbc733f52010-03-13 02:17:42 +00002221 array_pod_sort(Entries.begin(), Entries.end());
Jim Grosbach1e20b962010-07-21 21:21:52 +00002222
Chris Lattnerbc733f52010-03-13 02:17:42 +00002223 for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
Chris Lattner0d9d70f2010-03-09 23:38:23 +00002224 // Emit a label for reference from debug information entries.
Chris Lattnerbc733f52010-03-13 02:17:42 +00002225 Asm->OutStreamer.EmitLabel(Entries[i].second->getValue().first);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002226
Benjamin Kramer983c4572011-11-09 18:16:11 +00002227 // Emit the string itself with a terminating null byte.
Benjamin Kramer0c45f7d2011-11-09 12:12:04 +00002228 Asm->OutStreamer.EmitBytes(StringRef(Entries[i].second->getKeyData(),
Eric Christopherca1dd052013-01-09 01:35:34 +00002229 Entries[i].second->getKeyLength()+1));
Bill Wendling94d04b82009-05-20 23:21:38 +00002230 }
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002231
2232 // If we've got an offset section go ahead and emit that now as well.
2233 if (OffsetSection) {
2234 Asm->OutStreamer.SwitchSection(OffsetSection);
2235 unsigned offset = 0;
Eric Christopher72f7bfb2013-01-15 23:56:56 +00002236 unsigned size = 4; // FIXME: DWARF64 is 8.
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002237 for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
Eric Christopher1ced2082013-01-09 03:52:05 +00002238 Asm->OutStreamer.EmitIntValue(offset, size);
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002239 offset += Entries[i].second->getKeyLength() + 1;
2240 }
2241 }
Bill Wendling94d04b82009-05-20 23:21:38 +00002242}
2243
Eric Christopher72f7bfb2013-01-15 23:56:56 +00002244// Emit strings into a string section.
2245void DwarfUnits::emitAddresses(const MCSection *AddrSection) {
2246
2247 if (AddressPool.empty()) return;
2248
2249 // Start the dwarf addr section.
2250 Asm->OutStreamer.SwitchSection(AddrSection);
2251
2252 // Get all of the string pool entries and put them in an array by their ID so
2253 // we can sort them.
2254 SmallVector<std::pair<unsigned,
2255 std::pair<MCSymbol*, unsigned>* >, 64> Entries;
2256
2257 for (DenseMap<MCSymbol*, std::pair<MCSymbol*, unsigned> >::iterator
2258 I = AddressPool.begin(), E = AddressPool.end();
2259 I != E; ++I)
2260 Entries.push_back(std::make_pair(I->second.second, &(I->second)));
2261
2262 array_pod_sort(Entries.begin(), Entries.end());
2263
2264 for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
2265 // Emit a label for reference from debug information entries.
2266 MCSymbol *Sym = Entries[i].second->first;
2267 if (Sym)
2268 Asm->EmitLabelReference(Entries[i].second->first,
2269 Asm->getDataLayout().getPointerSize());
2270 else
2271 Asm->OutStreamer.EmitIntValue(0, Asm->getDataLayout().getPointerSize());
2272 }
2273
2274}
2275
Eric Christopher64f824c2012-12-27 02:14:01 +00002276// Emit visible names into a debug str section.
2277void DwarfDebug::emitDebugStr() {
2278 DwarfUnits &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
2279 Holder.emitStrings(Asm->getObjFileLowering().getDwarfStrSection());
2280}
2281
Eric Christopherb6dc8652012-11-27 22:43:45 +00002282// Emit visible names into a debug loc section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002283void DwarfDebug::emitDebugLoc() {
Devang Patel80250682010-05-26 23:55:23 +00002284 if (DotDebugLocEntries.empty())
2285 return;
2286
Devang Patel6c3ea902011-02-04 22:57:18 +00002287 for (SmallVector<DotDebugLocEntry, 4>::iterator
2288 I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
2289 I != E; ++I) {
2290 DotDebugLocEntry &Entry = *I;
2291 if (I + 1 != DotDebugLocEntries.end())
2292 Entry.Merge(I+1);
2293 }
2294
Daniel Dunbar83320a02011-03-16 22:16:39 +00002295 // Start the dwarf loc section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002296 Asm->OutStreamer.SwitchSection(
Devang Patelc3f5f782010-05-25 23:40:22 +00002297 Asm->getObjFileLowering().getDwarfLocSection());
Chandler Carruth426c2bf2012-11-01 09:14:31 +00002298 unsigned char Size = Asm->getDataLayout().getPointerSize();
Devang Patel80250682010-05-26 23:55:23 +00002299 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", 0));
2300 unsigned index = 1;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002301 for (SmallVector<DotDebugLocEntry, 4>::iterator
2302 I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
Devang Patel61409622010-07-07 20:12:52 +00002303 I != E; ++I, ++index) {
Devang Patel6c3ea902011-02-04 22:57:18 +00002304 DotDebugLocEntry &Entry = *I;
2305 if (Entry.isMerged()) continue;
Devang Patelc3f5f782010-05-25 23:40:22 +00002306 if (Entry.isEmpty()) {
Eric Christopherca1dd052013-01-09 01:35:34 +00002307 Asm->OutStreamer.EmitIntValue(0, Size);
2308 Asm->OutStreamer.EmitIntValue(0, Size);
Devang Patel80250682010-05-26 23:55:23 +00002309 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", index));
Devang Patelc3f5f782010-05-25 23:40:22 +00002310 } else {
Eric Christopher1ced2082013-01-09 03:52:05 +00002311 Asm->OutStreamer.EmitSymbolValue(Entry.Begin, Size);
2312 Asm->OutStreamer.EmitSymbolValue(Entry.End, Size);
Devang Patelc26f5442011-04-28 02:22:40 +00002313 DIVariable DV(Entry.Variable);
Rafael Espindola5b23b7f2011-05-27 22:05:41 +00002314 Asm->OutStreamer.AddComment("Loc expr size");
2315 MCSymbol *begin = Asm->OutStreamer.getContext().CreateTempSymbol();
2316 MCSymbol *end = Asm->OutStreamer.getContext().CreateTempSymbol();
2317 Asm->EmitLabelDifference(end, begin, 2);
2318 Asm->OutStreamer.EmitLabel(begin);
Devang Patel80efd4e2011-07-08 16:49:43 +00002319 if (Entry.isInt()) {
Devang Patelc4329072011-06-01 22:03:25 +00002320 DIBasicType BTy(DV.getType());
2321 if (BTy.Verify() &&
Eric Christopher0f1c7f62012-11-19 22:42:10 +00002322 (BTy.getEncoding() == dwarf::DW_ATE_signed
Devang Patelc4329072011-06-01 22:03:25 +00002323 || BTy.getEncoding() == dwarf::DW_ATE_signed_char)) {
2324 Asm->OutStreamer.AddComment("DW_OP_consts");
2325 Asm->EmitInt8(dwarf::DW_OP_consts);
Devang Patel80efd4e2011-07-08 16:49:43 +00002326 Asm->EmitSLEB128(Entry.getInt());
Devang Patelc4329072011-06-01 22:03:25 +00002327 } else {
2328 Asm->OutStreamer.AddComment("DW_OP_constu");
2329 Asm->EmitInt8(dwarf::DW_OP_constu);
Devang Patel80efd4e2011-07-08 16:49:43 +00002330 Asm->EmitULEB128(Entry.getInt());
Devang Patelc4329072011-06-01 22:03:25 +00002331 }
Devang Patel80efd4e2011-07-08 16:49:43 +00002332 } else if (Entry.isLocation()) {
Eric Christopher0f1c7f62012-11-19 22:42:10 +00002333 if (!DV.hasComplexAddress())
Devang Patel80efd4e2011-07-08 16:49:43 +00002334 // Regular entry.
Devang Patelc26f5442011-04-28 02:22:40 +00002335 Asm->EmitDwarfRegOp(Entry.Loc);
Devang Patel80efd4e2011-07-08 16:49:43 +00002336 else {
2337 // Complex address entry.
2338 unsigned N = DV.getNumAddrElements();
2339 unsigned i = 0;
2340 if (N >= 2 && DV.getAddrElement(0) == DIBuilder::OpPlus) {
2341 if (Entry.Loc.getOffset()) {
2342 i = 2;
2343 Asm->EmitDwarfRegOp(Entry.Loc);
2344 Asm->OutStreamer.AddComment("DW_OP_deref");
2345 Asm->EmitInt8(dwarf::DW_OP_deref);
2346 Asm->OutStreamer.AddComment("DW_OP_plus_uconst");
2347 Asm->EmitInt8(dwarf::DW_OP_plus_uconst);
2348 Asm->EmitSLEB128(DV.getAddrElement(1));
2349 } else {
2350 // If first address element is OpPlus then emit
2351 // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
2352 MachineLocation Loc(Entry.Loc.getReg(), DV.getAddrElement(1));
2353 Asm->EmitDwarfRegOp(Loc);
2354 i = 2;
2355 }
2356 } else {
2357 Asm->EmitDwarfRegOp(Entry.Loc);
2358 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +00002359
Devang Patel80efd4e2011-07-08 16:49:43 +00002360 // Emit remaining complex address elements.
2361 for (; i < N; ++i) {
2362 uint64_t Element = DV.getAddrElement(i);
2363 if (Element == DIBuilder::OpPlus) {
2364 Asm->EmitInt8(dwarf::DW_OP_plus_uconst);
2365 Asm->EmitULEB128(DV.getAddrElement(++i));
Eric Christopher50120762012-05-08 18:56:00 +00002366 } else if (Element == DIBuilder::OpDeref) {
Eric Christophera80f2d12012-05-08 21:24:39 +00002367 if (!Entry.Loc.isReg())
Eric Christopher50120762012-05-08 18:56:00 +00002368 Asm->EmitInt8(dwarf::DW_OP_deref);
2369 } else
2370 llvm_unreachable("unknown Opcode found in complex address");
Devang Patel80efd4e2011-07-08 16:49:43 +00002371 }
Devang Patelc26f5442011-04-28 02:22:40 +00002372 }
Devang Patelc26f5442011-04-28 02:22:40 +00002373 }
Devang Patel80efd4e2011-07-08 16:49:43 +00002374 // else ... ignore constant fp. There is not any good way to
2375 // to represent them here in dwarf.
Rafael Espindola5b23b7f2011-05-27 22:05:41 +00002376 Asm->OutStreamer.EmitLabel(end);
Devang Patelc3f5f782010-05-25 23:40:22 +00002377 }
2378 }
Bill Wendling94d04b82009-05-20 23:21:38 +00002379}
2380
Eric Christopherb6dc8652012-11-27 22:43:45 +00002381// Emit visible names into a debug aranges section.
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00002382void DwarfDebug::emitDebugARanges() {
Bill Wendling94d04b82009-05-20 23:21:38 +00002383 // Start the dwarf aranges section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002384 Asm->OutStreamer.SwitchSection(
2385 Asm->getObjFileLowering().getDwarfARangesSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002386}
2387
Eric Christopherb6dc8652012-11-27 22:43:45 +00002388// Emit visible names into a debug ranges section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002389void DwarfDebug::emitDebugRanges() {
Bill Wendling94d04b82009-05-20 23:21:38 +00002390 // Start the dwarf ranges section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002391 Asm->OutStreamer.SwitchSection(
Devang Patelf2548ca2010-04-16 23:33:45 +00002392 Asm->getObjFileLowering().getDwarfRangesSection());
Chandler Carruth426c2bf2012-11-01 09:14:31 +00002393 unsigned char Size = Asm->getDataLayout().getPointerSize();
Devang Pateleac9c072010-04-27 19:46:33 +00002394 for (SmallVector<const MCSymbol *, 8>::iterator
Jim Grosbach1e20b962010-07-21 21:21:52 +00002395 I = DebugRangeSymbols.begin(), E = DebugRangeSymbols.end();
Devang Pateleac9c072010-04-27 19:46:33 +00002396 I != E; ++I) {
2397 if (*I)
Eric Christopher1ced2082013-01-09 03:52:05 +00002398 Asm->OutStreamer.EmitSymbolValue(const_cast<MCSymbol*>(*I), Size);
Devang Patelf2548ca2010-04-16 23:33:45 +00002399 else
Eric Christopherca1dd052013-01-09 01:35:34 +00002400 Asm->OutStreamer.EmitIntValue(0, Size);
Devang Patelf2548ca2010-04-16 23:33:45 +00002401 }
Bill Wendling94d04b82009-05-20 23:21:38 +00002402}
2403
Eric Christopherb6dc8652012-11-27 22:43:45 +00002404// Emit visible names into a debug macinfo section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002405void DwarfDebug::emitDebugMacInfo() {
Daniel Dunbarf612ff62009-09-19 20:40:05 +00002406 if (const MCSection *LineInfo =
Chris Lattner18a4c162009-08-02 07:24:22 +00002407 Asm->getObjFileLowering().getDwarfMacroInfoSection()) {
Bill Wendling94d04b82009-05-20 23:21:38 +00002408 // Start the dwarf macinfo section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002409 Asm->OutStreamer.SwitchSection(LineInfo);
Bill Wendling94d04b82009-05-20 23:21:38 +00002410 }
2411}
2412
Eric Christopherb6dc8652012-11-27 22:43:45 +00002413// Emit inline info using following format.
2414// Section Header:
2415// 1. length of section
2416// 2. Dwarf version number
2417// 3. address size.
2418//
2419// Entries (one "entry" for each function that was inlined):
2420//
2421// 1. offset into __debug_str section for MIPS linkage name, if exists;
2422// otherwise offset into __debug_str for regular function name.
2423// 2. offset into __debug_str section for regular function name.
2424// 3. an unsigned LEB128 number indicating the number of distinct inlining
2425// instances for the function.
2426//
2427// The rest of the entry consists of a {die_offset, low_pc} pair for each
2428// inlined instance; the die_offset points to the inlined_subroutine die in the
2429// __debug_info section, and the low_pc is the starting address for the
2430// inlining instance.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002431void DwarfDebug::emitDebugInlineInfo() {
Eric Christopherb83e2bb2012-03-02 02:11:47 +00002432 if (!Asm->MAI->doesDwarfUseInlineInfoSection())
Bill Wendling94d04b82009-05-20 23:21:38 +00002433 return;
2434
Devang Patel163a9f72010-05-10 22:49:55 +00002435 if (!FirstCU)
Bill Wendling94d04b82009-05-20 23:21:38 +00002436 return;
2437
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002438 Asm->OutStreamer.SwitchSection(
2439 Asm->getObjFileLowering().getDwarfDebugInlineSection());
Chris Lattner0ad9c912010-01-22 22:09:00 +00002440
Chris Lattner233f52b2010-03-09 23:52:58 +00002441 Asm->OutStreamer.AddComment("Length of Debug Inlined Information Entry");
Chris Lattnera6437182010-04-04 19:58:12 +00002442 Asm->EmitLabelDifference(Asm->GetTempSymbol("debug_inlined_end", 1),
2443 Asm->GetTempSymbol("debug_inlined_begin", 1), 4);
Bill Wendling94d04b82009-05-20 23:21:38 +00002444
Chris Lattnerc0215722010-04-04 19:25:43 +00002445 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_begin", 1));
Bill Wendling94d04b82009-05-20 23:21:38 +00002446
Chris Lattner233f52b2010-03-09 23:52:58 +00002447 Asm->OutStreamer.AddComment("Dwarf Version");
2448 Asm->EmitInt16(dwarf::DWARF_VERSION);
2449 Asm->OutStreamer.AddComment("Address Size (in bytes)");
Chandler Carruth426c2bf2012-11-01 09:14:31 +00002450 Asm->EmitInt8(Asm->getDataLayout().getPointerSize());
Bill Wendling94d04b82009-05-20 23:21:38 +00002451
Devang Patele9f8f5e2010-05-07 20:54:48 +00002452 for (SmallVector<const MDNode *, 4>::iterator I = InlinedSPNodes.begin(),
Devang Patel53bb5c92009-11-10 23:06:00 +00002453 E = InlinedSPNodes.end(); I != E; ++I) {
Jim Grosbach31ef40e2009-11-21 23:12:12 +00002454
Devang Patele9f8f5e2010-05-07 20:54:48 +00002455 const MDNode *Node = *I;
2456 DenseMap<const MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator II
Jim Grosbach7ab38df2009-11-22 19:20:36 +00002457 = InlineInfo.find(Node);
Devang Patel53bb5c92009-11-10 23:06:00 +00002458 SmallVector<InlineInfoLabels, 4> &Labels = II->second;
Devang Patele4b27562009-08-28 23:24:31 +00002459 DISubprogram SP(Node);
Devang Patel65dbc902009-11-25 17:36:49 +00002460 StringRef LName = SP.getLinkageName();
2461 StringRef Name = SP.getName();
Bill Wendling94d04b82009-05-20 23:21:38 +00002462
Chris Lattner233f52b2010-03-09 23:52:58 +00002463 Asm->OutStreamer.AddComment("MIPS linkage name");
Eric Christopher50e26612012-03-02 01:57:52 +00002464 if (LName.empty())
Eric Christopher2e5d8702012-12-20 21:58:36 +00002465 Asm->EmitSectionOffset(InfoHolder.getStringPoolEntry(Name),
2466 DwarfStrSectionSym);
Eric Christopher50e26612012-03-02 01:57:52 +00002467 else
Eric Christopher2e5d8702012-12-20 21:58:36 +00002468 Asm->EmitSectionOffset(InfoHolder
2469 .getStringPoolEntry(getRealLinkageName(LName)),
Chris Lattner6189ed12010-04-04 23:25:33 +00002470 DwarfStrSectionSym);
Devang Patel53bb5c92009-11-10 23:06:00 +00002471
Chris Lattner233f52b2010-03-09 23:52:58 +00002472 Asm->OutStreamer.AddComment("Function name");
Eric Christopher2e5d8702012-12-20 21:58:36 +00002473 Asm->EmitSectionOffset(InfoHolder.getStringPoolEntry(Name),
2474 DwarfStrSectionSym);
Chris Lattner7e1a8f82010-04-04 19:09:29 +00002475 Asm->EmitULEB128(Labels.size(), "Inline count");
Bill Wendling94d04b82009-05-20 23:21:38 +00002476
Devang Patel53bb5c92009-11-10 23:06:00 +00002477 for (SmallVector<InlineInfoLabels, 4>::iterator LI = Labels.begin(),
Bill Wendling94d04b82009-05-20 23:21:38 +00002478 LE = Labels.end(); LI != LE; ++LI) {
Chris Lattner3f53c832010-04-04 18:52:31 +00002479 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
Chris Lattner6ed0f902010-03-09 00:31:02 +00002480 Asm->EmitInt32(LI->second->getOffset());
Bill Wendling94d04b82009-05-20 23:21:38 +00002481
Chris Lattner3f53c832010-04-04 18:52:31 +00002482 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("low_pc");
Chris Lattnerd38fee82010-04-05 00:13:49 +00002483 Asm->OutStreamer.EmitSymbolValue(LI->first,
Eric Christopher1ced2082013-01-09 03:52:05 +00002484 Asm->getDataLayout().getPointerSize());
Bill Wendling94d04b82009-05-20 23:21:38 +00002485 }
2486 }
2487
Chris Lattnerc0215722010-04-04 19:25:43 +00002488 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_end", 1));
Bill Wendling94d04b82009-05-20 23:21:38 +00002489}
Eric Christopher98e237f2012-11-30 23:59:06 +00002490
Eric Christopher0b944ee2012-12-11 19:42:09 +00002491// DWARF5 Experimental Separate Dwarf emitters.
Eric Christopher98e237f2012-11-30 23:59:06 +00002492
2493// This DIE has the following attributes: DW_AT_comp_dir, DW_AT_stmt_list,
2494// DW_AT_low_pc, DW_AT_high_pc, DW_AT_ranges, DW_AT_dwo_name, DW_AT_dwo_id,
2495// DW_AT_ranges_base, DW_AT_addr_base. If DW_AT_ranges is present,
2496// DW_AT_low_pc and DW_AT_high_pc are not used, and vice versa.
Eric Christopher4daaed12012-12-10 19:51:21 +00002497CompileUnit *DwarfDebug::constructSkeletonCU(const MDNode *N) {
Eric Christopher98e237f2012-11-30 23:59:06 +00002498 DICompileUnit DIUnit(N);
Eric Christopher98e237f2012-11-30 23:59:06 +00002499 CompilationDir = DIUnit.getDirectory();
Eric Christopher98e237f2012-11-30 23:59:06 +00002500
2501 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002502 CompileUnit *NewCU = new CompileUnit(GlobalCUIndexCount++,
Eric Christopher2e5d8702012-12-20 21:58:36 +00002503 DIUnit.getLanguage(), Die, Asm,
Eric Christopher64f824c2012-12-27 02:14:01 +00002504 this, &SkeletonHolder);
Eric Christopher446b88f2013-01-17 03:00:04 +00002505
Eric Christopher3ce51a92013-02-22 23:50:08 +00002506 NewCU->addLocalString(Die, dwarf::DW_AT_GNU_dwo_name,
2507 DIUnit.getSplitDebugFilename());
Eric Christopher98e237f2012-11-30 23:59:06 +00002508
Eric Christopher208cc6f2013-02-05 07:31:55 +00002509 // This should be a unique identifier when we want to build .dwp files.
2510 NewCU->addUInt(Die, dwarf::DW_AT_GNU_dwo_id, dwarf::DW_FORM_data8, 0);
Eric Christopherd96c72a2013-01-17 02:59:59 +00002511
2512 // FIXME: The addr base should be relative for each compile unit, however,
2513 // this one is going to be 0 anyhow.
2514 NewCU->addUInt(Die, dwarf::DW_AT_GNU_addr_base, dwarf::DW_FORM_sec_offset, 0);
Eric Christopher98e237f2012-11-30 23:59:06 +00002515
2516 // 2.17.1 requires that we use DW_AT_low_pc for a single entry point
Eric Christopher72f7bfb2013-01-15 23:56:56 +00002517 // into an entity. We're using 0, or a NULL label for this.
Eric Christopher98e237f2012-11-30 23:59:06 +00002518 NewCU->addUInt(Die, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, 0);
Eric Christopher72f7bfb2013-01-15 23:56:56 +00002519
Eric Christopher98e237f2012-11-30 23:59:06 +00002520 // DW_AT_stmt_list is a offset of line number information for this
2521 // compile unit in debug_line section.
2522 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
Eric Christopher446b88f2013-01-17 03:00:04 +00002523 NewCU->addLabel(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_sec_offset,
Eric Christopher7a0103c2013-02-07 21:19:50 +00002524 DwarfLineSectionSym);
Eric Christopher98e237f2012-11-30 23:59:06 +00002525 else
Eric Christopher446b88f2013-01-17 03:00:04 +00002526 NewCU->addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_sec_offset, 0);
Eric Christopher98e237f2012-11-30 23:59:06 +00002527
2528 if (!CompilationDir.empty())
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002529 NewCU->addLocalString(Die, dwarf::DW_AT_comp_dir, CompilationDir);
Eric Christopher98e237f2012-11-30 23:59:06 +00002530
Eric Christopher0e3e9b72012-12-10 23:34:43 +00002531 SkeletonHolder.addUnit(NewCU);
Eric Christopher01776a52013-02-06 21:53:56 +00002532 SkeletonCUs.push_back(NewCU);
Eric Christopher0e3e9b72012-12-10 23:34:43 +00002533
Eric Christopher98e237f2012-11-30 23:59:06 +00002534 return NewCU;
2535}
2536
Eric Christopher6eebe472012-12-19 22:02:53 +00002537void DwarfDebug::emitSkeletonAbbrevs(const MCSection *Section) {
2538 assert(useSplitDwarf() && "No split dwarf debug info?");
2539 emitAbbrevs(Section, &SkeletonAbbrevs);
Eric Christopher98e237f2012-11-30 23:59:06 +00002540}
2541
Eric Christopher0b944ee2012-12-11 19:42:09 +00002542// Emit the .debug_info.dwo section for separated dwarf. This contains the
2543// compile units that would normally be in debug_info.
Eric Christopher98e237f2012-11-30 23:59:06 +00002544void DwarfDebug::emitDebugInfoDWO() {
Eric Christopher4daaed12012-12-10 19:51:21 +00002545 assert(useSplitDwarf() && "No split dwarf debug info?");
Eric Christopherb1e66d02012-12-15 00:04:07 +00002546 InfoHolder.emitUnits(this, Asm->getObjFileLowering().getDwarfInfoDWOSection(),
Eric Christopher6eebe472012-12-19 22:02:53 +00002547 Asm->getObjFileLowering().getDwarfAbbrevDWOSection(),
2548 DwarfAbbrevDWOSectionSym);
2549}
2550
2551// Emit the .debug_abbrev.dwo section for separated dwarf. This contains the
2552// abbreviations for the .debug_info.dwo section.
2553void DwarfDebug::emitDebugAbbrevDWO() {
2554 assert(useSplitDwarf() && "No split dwarf?");
Eric Christopher72c16552012-12-20 21:58:40 +00002555 emitAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevDWOSection(),
2556 &Abbreviations);
Eric Christopher98e237f2012-11-30 23:59:06 +00002557}
Eric Christopher64f824c2012-12-27 02:14:01 +00002558
2559// Emit the .debug_str.dwo section for separated dwarf. This contains the
2560// string section and is identical in format to traditional .debug_str
2561// sections.
2562void DwarfDebug::emitDebugStrDWO() {
2563 assert(useSplitDwarf() && "No split dwarf?");
Eric Christopherff348452013-01-07 22:40:45 +00002564 const MCSection *OffSec = Asm->getObjFileLowering()
2565 .getDwarfStrOffDWOSection();
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002566 const MCSymbol *StrSym = DwarfStrSectionSym;
2567 InfoHolder.emitStrings(Asm->getObjFileLowering().getDwarfStrDWOSection(),
2568 OffSec, StrSym);
Eric Christopher64f824c2012-12-27 02:14:01 +00002569}