blob: e764e36f058cb3f12f64d1fedba79e7e2bcb6694 [file] [log] [blame]
Bill Wendling0310d762009-05-15 09:23:25 +00001//===-- llvm/CodeGen/DwarfDebug.cpp - Dwarf Debug Framework ---------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file contains support for writing dwarf debug info into asm files.
11//
12//===----------------------------------------------------------------------===//
Chris Lattner6cde3e62010-03-09 00:39:24 +000013
Devang Patele4b27562009-08-28 23:24:31 +000014#define DEBUG_TYPE "dwarfdebug"
Bill Wendling0310d762009-05-15 09:23:25 +000015#include "DwarfDebug.h"
Chris Lattner74e41f92010-04-05 05:24:55 +000016#include "DIE.h"
Eric Christopher09ac3d82011-11-07 09:24:32 +000017#include "DwarfAccelTable.h"
Devang Patel8b9df622011-04-12 17:40:32 +000018#include "DwarfCompileUnit.h"
Chandler Carruthd04a8d42012-12-03 16:50:05 +000019#include "llvm/ADT/STLExtras.h"
20#include "llvm/ADT/Statistic.h"
21#include "llvm/ADT/StringExtras.h"
22#include "llvm/ADT/Triple.h"
David Greeneb2c66fc2009-08-19 21:52:55 +000023#include "llvm/CodeGen/MachineFunction.h"
Bill Wendling0310d762009-05-15 09:23:25 +000024#include "llvm/CodeGen/MachineModuleInfo.h"
Chandler Carruthd04a8d42012-12-03 16:50:05 +000025#include "llvm/DIBuilder.h"
Chandler Carruthd04a8d42012-12-03 16:50:05 +000026#include "llvm/DebugInfo.h"
Chandler Carruth0b8c9a82013-01-02 11:36:10 +000027#include "llvm/IR/Constants.h"
28#include "llvm/IR/DataLayout.h"
29#include "llvm/IR/Instructions.h"
30#include "llvm/IR/Module.h"
Chris Lattnerb7db7332010-03-09 01:58:53 +000031#include "llvm/MC/MCAsmInfo.h"
Chris Lattnera87dea42009-07-31 18:48:30 +000032#include "llvm/MC/MCSection.h"
Chris Lattner6c2f9e12009-08-19 05:49:37 +000033#include "llvm/MC/MCStreamer.h"
Chris Lattnerb7db7332010-03-09 01:58:53 +000034#include "llvm/MC/MCSymbol.h"
Devang Pateleac9c072010-04-27 19:46:33 +000035#include "llvm/Support/CommandLine.h"
Daniel Dunbar6e4bdfc2009-10-13 06:47:08 +000036#include "llvm/Support/Debug.h"
37#include "llvm/Support/ErrorHandling.h"
Chris Lattner0ad9c912010-01-22 22:09:00 +000038#include "llvm/Support/FormattedStream.h"
Michael J. Spencer1f6efa32010-11-29 18:16:10 +000039#include "llvm/Support/Path.h"
Chandler Carruthd04a8d42012-12-03 16:50:05 +000040#include "llvm/Support/Timer.h"
41#include "llvm/Support/ValueHandle.h"
42#include "llvm/Target/TargetFrameLowering.h"
43#include "llvm/Target/TargetLoweringObjectFile.h"
44#include "llvm/Target/TargetMachine.h"
45#include "llvm/Target/TargetOptions.h"
46#include "llvm/Target/TargetRegisterInfo.h"
Bill Wendling0310d762009-05-15 09:23:25 +000047using namespace llvm;
48
Jim Grosbach1e20b962010-07-21 21:21:52 +000049static cl::opt<bool> DisableDebugInfoPrinting("disable-debug-info-print",
Devang Patel61409622010-07-07 20:12:52 +000050 cl::Hidden,
Devang Pateleac9c072010-04-27 19:46:33 +000051 cl::desc("Disable debug info printing"));
52
Dan Gohman281d65d2010-05-07 01:08:53 +000053static cl::opt<bool> UnknownLocations("use-unknown-locations", cl::Hidden,
Chris Lattner7a2bdde2011-04-15 05:18:47 +000054 cl::desc("Make an absence of debug location information explicit."),
Dan Gohman281d65d2010-05-07 01:08:53 +000055 cl::init(false));
56
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +000057static cl::opt<bool> GenerateDwarfPubNamesSection("generate-dwarf-pubnames",
Eric Christopher3dcb5382013-04-03 05:26:07 +000058 cl::Hidden, cl::init(false),
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +000059 cl::desc("Generate DWARF pubnames section"));
60
Eric Christopher20f47ab2012-08-23 22:36:40 +000061namespace {
62 enum DefaultOnOff {
63 Default, Enable, Disable
64 };
65}
Eric Christopher09ac3d82011-11-07 09:24:32 +000066
Eric Christopher20f47ab2012-08-23 22:36:40 +000067static cl::opt<DefaultOnOff> DwarfAccelTables("dwarf-accel-tables", cl::Hidden,
68 cl::desc("Output prototype dwarf accelerator tables."),
69 cl::values(
70 clEnumVal(Default, "Default for platform"),
71 clEnumVal(Enable, "Enabled"),
72 clEnumVal(Disable, "Disabled"),
73 clEnumValEnd),
74 cl::init(Default));
75
76static cl::opt<DefaultOnOff> DarwinGDBCompat("darwin-gdb-compat", cl::Hidden,
Eric Christopher10cb7442012-08-23 07:10:46 +000077 cl::desc("Compatibility with Darwin gdb."),
Eric Christopher20f47ab2012-08-23 22:36:40 +000078 cl::values(
79 clEnumVal(Default, "Default for platform"),
80 clEnumVal(Enable, "Enabled"),
81 clEnumVal(Disable, "Disabled"),
82 clEnumValEnd),
83 cl::init(Default));
Eric Christopher10cb7442012-08-23 07:10:46 +000084
Eric Christopher4daaed12012-12-10 19:51:21 +000085static cl::opt<DefaultOnOff> SplitDwarf("split-dwarf", cl::Hidden,
86 cl::desc("Output prototype dwarf split debug info."),
Eric Christopherf5b6dcd2012-11-12 22:22:20 +000087 cl::values(
88 clEnumVal(Default, "Default for platform"),
89 clEnumVal(Enable, "Enabled"),
90 clEnumVal(Disable, "Disabled"),
91 clEnumValEnd),
92 cl::init(Default));
93
Bill Wendling5f017e82010-04-07 09:28:04 +000094namespace {
95 const char *DWARFGroupName = "DWARF Emission";
96 const char *DbgTimerName = "DWARF Debug Writer";
David Blaikied2e0f7e2013-05-06 23:33:07 +000097
98 struct CompareFirst {
99 template <typename T> bool operator()(const T &lhs, const T &rhs) const {
100 return lhs.first < rhs.first;
101 }
102 };
Bill Wendling5f017e82010-04-07 09:28:04 +0000103} // end anonymous namespace
104
Bill Wendling0310d762009-05-15 09:23:25 +0000105//===----------------------------------------------------------------------===//
106
Eric Christopherb6dc8652012-11-27 22:43:45 +0000107// Configuration values for initial hash set sizes (log2).
108//
Bill Wendling0310d762009-05-15 09:23:25 +0000109static const unsigned InitAbbreviationsSetSize = 9; // log2(512)
Bill Wendling0310d762009-05-15 09:23:25 +0000110
111namespace llvm {
112
Nick Lewycky3bbb6f72011-07-29 03:49:23 +0000113DIType DbgVariable::getType() const {
Devang Patel3cbee302011-04-12 22:53:02 +0000114 DIType Ty = Var.getType();
115 // FIXME: isBlockByrefVariable should be reformulated in terms of complex
116 // addresses instead.
117 if (Var.isBlockByrefVariable()) {
118 /* Byref variables, in Blocks, are declared by the programmer as
119 "SomeType VarName;", but the compiler creates a
120 __Block_byref_x_VarName struct, and gives the variable VarName
121 either the struct, or a pointer to the struct, as its type. This
122 is necessary for various behind-the-scenes things the compiler
123 needs to do with by-reference variables in blocks.
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000124
Devang Patel3cbee302011-04-12 22:53:02 +0000125 However, as far as the original *programmer* is concerned, the
126 variable should still have type 'SomeType', as originally declared.
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000127
Devang Patel3cbee302011-04-12 22:53:02 +0000128 The following function dives into the __Block_byref_x_VarName
129 struct to find the original type of the variable. This will be
130 passed back to the code generating the type for the Debug
131 Information Entry for the variable 'VarName'. 'VarName' will then
132 have the original type 'SomeType' in its debug information.
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000133
Devang Patel3cbee302011-04-12 22:53:02 +0000134 The original type 'SomeType' will be the type of the field named
135 'VarName' inside the __Block_byref_x_VarName struct.
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000136
Devang Patel3cbee302011-04-12 22:53:02 +0000137 NOTE: In order for this to not completely fail on the debugger
138 side, the Debug Information Entry for the variable VarName needs to
139 have a DW_AT_location that tells the debugger how to unwind through
140 the pointers and __Block_byref_x_VarName struct to find the actual
141 value of the variable. The function addBlockByrefType does this. */
142 DIType subType = Ty;
143 unsigned tag = Ty.getTag();
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000144
Devang Patel3cbee302011-04-12 22:53:02 +0000145 if (tag == dwarf::DW_TAG_pointer_type) {
146 DIDerivedType DTy = DIDerivedType(Ty);
147 subType = DTy.getTypeDerivedFrom();
148 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000149
Devang Patel3cbee302011-04-12 22:53:02 +0000150 DICompositeType blockStruct = DICompositeType(subType);
151 DIArray Elements = blockStruct.getTypeArray();
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000152
Devang Patel3cbee302011-04-12 22:53:02 +0000153 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
154 DIDescriptor Element = Elements.getElement(i);
155 DIDerivedType DT = DIDerivedType(Element);
156 if (getName() == DT.getName())
157 return (DT.getTypeDerivedFrom());
Devang Patel8bd11de2010-08-09 21:01:39 +0000158 }
Devang Patel8bd11de2010-08-09 21:01:39 +0000159 }
Devang Patel3cbee302011-04-12 22:53:02 +0000160 return Ty;
161}
Bill Wendling0310d762009-05-15 09:23:25 +0000162
Chris Lattnerea761862010-04-05 04:09:20 +0000163} // end llvm namespace
Bill Wendling0310d762009-05-15 09:23:25 +0000164
Chris Lattner49cd6642010-04-05 05:11:15 +0000165DwarfDebug::DwarfDebug(AsmPrinter *A, Module *M)
Eric Christopher28bd25a2012-12-10 19:51:13 +0000166 : Asm(A), MMI(Asm->MMI), FirstCU(0),
Jim Grosbach1e20b962010-07-21 21:21:52 +0000167 AbbreviationsSet(InitAbbreviationsSetSize),
Eric Christopherb6714222013-01-08 22:22:06 +0000168 SourceIdMap(DIEValueAllocator),
Eric Christopher0e3e9b72012-12-10 23:34:43 +0000169 PrevLabel(NULL), GlobalCUIndexCount(0),
Eric Christopherb6714222013-01-08 22:22:06 +0000170 InfoHolder(A, &AbbreviationsSet, &Abbreviations, "info_string",
171 DIEValueAllocator),
Eric Christopher6eebe472012-12-19 22:02:53 +0000172 SkeletonAbbrevSet(InitAbbreviationsSetSize),
Eric Christopherb6714222013-01-08 22:22:06 +0000173 SkeletonHolder(A, &SkeletonAbbrevSet, &SkeletonAbbrevs, "skel_string",
174 DIEValueAllocator) {
Jim Grosbach1e20b962010-07-21 21:21:52 +0000175
Rafael Espindolaf2b04232011-05-06 14:56:22 +0000176 DwarfInfoSectionSym = DwarfAbbrevSectionSym = 0;
Chris Lattner4ad1efe2010-04-04 23:10:38 +0000177 DwarfStrSectionSym = TextSectionSym = 0;
Eric Christopher7a0103c2013-02-07 21:19:50 +0000178 DwarfDebugRangeSectionSym = DwarfDebugLocSectionSym = DwarfLineSectionSym = 0;
Eric Christopher9a9e73b2013-04-07 03:43:09 +0000179 DwarfAddrSectionSym = 0;
Eric Christopher64f824c2012-12-27 02:14:01 +0000180 DwarfAbbrevDWOSectionSym = DwarfStrDWOSectionSym = 0;
Devang Patelc3f5f782010-05-25 23:40:22 +0000181 FunctionBeginSym = FunctionEndSym = 0;
Eric Christopher60777d82012-04-02 17:58:52 +0000182
Eric Christopher10cb7442012-08-23 07:10:46 +0000183 // Turn on accelerator tables and older gdb compatibility
184 // for Darwin.
Eric Christopher00297ba2013-04-27 01:07:52 +0000185 bool IsDarwin = Triple(A->getTargetTriple()).isOSDarwin();
Eric Christopher20f47ab2012-08-23 22:36:40 +0000186 if (DarwinGDBCompat == Default) {
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000187 if (IsDarwin)
188 IsDarwinGDBCompat = true;
Eric Christopher20f47ab2012-08-23 22:36:40 +0000189 else
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000190 IsDarwinGDBCompat = false;
Eric Christopher20f47ab2012-08-23 22:36:40 +0000191 } else
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000192 IsDarwinGDBCompat = DarwinGDBCompat == Enable ? true : false;
Manman Ren9174fd72013-05-28 19:01:58 +0000193 UseRefAddr = false;
Eric Christopherc1610fa2012-08-23 22:36:36 +0000194
Eric Christopher20f47ab2012-08-23 22:36:40 +0000195 if (DwarfAccelTables == Default) {
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000196 if (IsDarwin)
197 HasDwarfAccelTables = true;
Eric Christopher20f47ab2012-08-23 22:36:40 +0000198 else
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000199 HasDwarfAccelTables = false;
Eric Christopher20f47ab2012-08-23 22:36:40 +0000200 } else
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000201 HasDwarfAccelTables = DwarfAccelTables == Enable ? true : false;
Eric Christopher20f47ab2012-08-23 22:36:40 +0000202
Eric Christopher4daaed12012-12-10 19:51:21 +0000203 if (SplitDwarf == Default)
204 HasSplitDwarf = false;
Eric Christopherf5b6dcd2012-11-12 22:22:20 +0000205 else
Eric Christopher4daaed12012-12-10 19:51:21 +0000206 HasSplitDwarf = SplitDwarf == Enable ? true : false;
Eric Christopherf5b6dcd2012-11-12 22:22:20 +0000207
Dan Gohman03c3dc72010-06-18 15:56:31 +0000208 {
209 NamedRegionTimer T(DbgTimerName, DWARFGroupName, TimePassesIsEnabled);
Eric Christopherc4639d62012-11-19 22:42:15 +0000210 beginModule();
Torok Edwin9c421072010-04-07 10:44:46 +0000211 }
Bill Wendling0310d762009-05-15 09:23:25 +0000212}
213DwarfDebug::~DwarfDebug() {
Bill Wendling0310d762009-05-15 09:23:25 +0000214}
215
Eric Christopherb6dc8652012-11-27 22:43:45 +0000216// Switch to the specified MCSection and emit an assembler
217// temporary label to it if SymbolStem is specified.
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000218static MCSymbol *emitSectionSym(AsmPrinter *Asm, const MCSection *Section,
Eric Christopherd8a87522011-11-07 09:18:38 +0000219 const char *SymbolStem = 0) {
220 Asm->OutStreamer.SwitchSection(Section);
221 if (!SymbolStem) return 0;
222
223 MCSymbol *TmpSym = Asm->GetTempSymbol(SymbolStem);
224 Asm->OutStreamer.EmitLabel(TmpSym);
225 return TmpSym;
226}
227
Eric Christopher2e5d8702012-12-20 21:58:36 +0000228MCSymbol *DwarfUnits::getStringPoolSym() {
Eric Christopher64f824c2012-12-27 02:14:01 +0000229 return Asm->GetTempSymbol(StringPref);
Nick Lewycky390c40d2011-10-27 06:44:11 +0000230}
231
Eric Christopher2e5d8702012-12-20 21:58:36 +0000232MCSymbol *DwarfUnits::getStringPoolEntry(StringRef Str) {
233 std::pair<MCSymbol*, unsigned> &Entry =
Eric Christopherb6714222013-01-08 22:22:06 +0000234 StringPool.GetOrCreateValue(Str).getValue();
Chris Lattnerbc733f52010-03-13 02:17:42 +0000235 if (Entry.first) return Entry.first;
236
237 Entry.second = NextStringPoolNumber++;
Eric Christopher64f824c2012-12-27 02:14:01 +0000238 return Entry.first = Asm->GetTempSymbol(StringPref, Entry.second);
Chris Lattnerbc733f52010-03-13 02:17:42 +0000239}
240
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000241unsigned DwarfUnits::getStringPoolIndex(StringRef Str) {
242 std::pair<MCSymbol*, unsigned> &Entry =
Eric Christopherb6714222013-01-08 22:22:06 +0000243 StringPool.GetOrCreateValue(Str).getValue();
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000244 if (Entry.first) return Entry.second;
245
246 Entry.second = NextStringPoolNumber++;
247 Entry.first = Asm->GetTempSymbol(StringPref, Entry.second);
248 return Entry.second;
249}
250
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000251unsigned DwarfUnits::getAddrPoolIndex(MCSymbol *Sym) {
252 std::pair<MCSymbol*, unsigned> &Entry = AddressPool[Sym];
253 if (Entry.first) return Entry.second;
254
255 Entry.second = NextAddrPoolNumber++;
256 Entry.first = Sym;
257 return Entry.second;
258}
259
Eric Christopherb6dc8652012-11-27 22:43:45 +0000260// Define a unique number for the abbreviation.
261//
Eric Christopher0e3e9b72012-12-10 23:34:43 +0000262void DwarfUnits::assignAbbrevNumber(DIEAbbrev &Abbrev) {
Bill Wendling0310d762009-05-15 09:23:25 +0000263 // Profile the node so that we can make it unique.
264 FoldingSetNodeID ID;
265 Abbrev.Profile(ID);
266
267 // Check the set for priors.
Eric Christopher0e3e9b72012-12-10 23:34:43 +0000268 DIEAbbrev *InSet = AbbreviationsSet->GetOrInsertNode(&Abbrev);
Bill Wendling0310d762009-05-15 09:23:25 +0000269
270 // If it's newly added.
271 if (InSet == &Abbrev) {
272 // Add to abbreviation list.
Eric Christopher0e3e9b72012-12-10 23:34:43 +0000273 Abbreviations->push_back(&Abbrev);
Bill Wendling0310d762009-05-15 09:23:25 +0000274
275 // Assign the vector position + 1 as its number.
Eric Christopher0e3e9b72012-12-10 23:34:43 +0000276 Abbrev.setNumber(Abbreviations->size());
Bill Wendling0310d762009-05-15 09:23:25 +0000277 } else {
278 // Assign existing abbreviation number.
279 Abbrev.setNumber(InSet->getNumber());
280 }
281}
282
Eric Christopherb6dc8652012-11-27 22:43:45 +0000283// If special LLVM prefix that is used to inform the asm
284// printer to not emit usual symbol prefix before the symbol name is used then
285// return linkage name after skipping this special LLVM prefix.
Devang Patel351ca332010-01-05 01:46:14 +0000286static StringRef getRealLinkageName(StringRef LinkageName) {
287 char One = '\1';
288 if (LinkageName.startswith(StringRef(&One, 1)))
289 return LinkageName.substr(1);
290 return LinkageName;
291}
292
Eric Christopher0ffe2b42011-11-10 19:25:34 +0000293static bool isObjCClass(StringRef Name) {
294 return Name.startswith("+") || Name.startswith("-");
295}
296
297static bool hasObjCCategory(StringRef Name) {
298 if (!isObjCClass(Name)) return false;
299
300 size_t pos = Name.find(')');
301 if (pos != std::string::npos) {
302 if (Name[pos+1] != ' ') return false;
303 return true;
304 }
305 return false;
306}
307
308static void getObjCClassCategory(StringRef In, StringRef &Class,
309 StringRef &Category) {
310 if (!hasObjCCategory(In)) {
311 Class = In.slice(In.find('[') + 1, In.find(' '));
312 Category = "";
313 return;
314 }
315
316 Class = In.slice(In.find('[') + 1, In.find('('));
317 Category = In.slice(In.find('[') + 1, In.find(' '));
318 return;
319}
320
321static StringRef getObjCMethodName(StringRef In) {
322 return In.slice(In.find(' ') + 1, In.find(']'));
323}
324
325// Add the various names to the Dwarf accelerator table names.
326static void addSubprogramNames(CompileUnit *TheCU, DISubprogram SP,
327 DIE* Die) {
328 if (!SP.isDefinition()) return;
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000329
Eric Christopher0ffe2b42011-11-10 19:25:34 +0000330 TheCU->addAccelName(SP.getName(), Die);
331
332 // If the linkage name is different than the name, go ahead and output
333 // that as well into the name table.
334 if (SP.getLinkageName() != "" && SP.getName() != SP.getLinkageName())
335 TheCU->addAccelName(SP.getLinkageName(), Die);
336
337 // If this is an Objective-C selector name add it to the ObjC accelerator
338 // too.
339 if (isObjCClass(SP.getName())) {
340 StringRef Class, Category;
341 getObjCClassCategory(SP.getName(), Class, Category);
342 TheCU->addAccelObjC(Class, Die);
343 if (Category != "")
344 TheCU->addAccelObjC(Category, Die);
345 // Also add the base method name to the name table.
346 TheCU->addAccelName(getObjCMethodName(SP.getName()), Die);
347 }
348}
349
Eric Christopherb6dc8652012-11-27 22:43:45 +0000350// Find DIE for the given subprogram and attach appropriate DW_AT_low_pc
351// and DW_AT_high_pc attributes. If there are global variables in this
352// scope then create and insert DIEs for these variables.
Devang Pateld3024342011-08-15 22:24:32 +0000353DIE *DwarfDebug::updateSubprogramScopeDIE(CompileUnit *SPCU,
354 const MDNode *SPNode) {
Devang Patel163a9f72010-05-10 22:49:55 +0000355 DIE *SPDie = SPCU->getDIE(SPNode);
Devang Patel8aa61472010-07-07 22:20:57 +0000356
Chris Lattnerd38fee82010-04-05 00:13:49 +0000357 assert(SPDie && "Unable to find subprogram DIE!");
358 DISubprogram SP(SPNode);
Jim Grosbach1e20b962010-07-21 21:21:52 +0000359
Bill Wendling168c1902012-11-07 05:19:04 +0000360 // If we're updating an abstract DIE, then we will be adding the children and
361 // object pointer later on. But what we don't want to do is process the
362 // concrete DIE twice.
Manman Renbc3e96f2013-03-12 18:27:15 +0000363 DIE *AbsSPDIE = AbstractSPDies.lookup(SPNode);
364 if (AbsSPDIE) {
365 bool InSameCU = (AbsSPDIE->getCompileUnit() == SPCU->getCUDie());
Bill Wendling168c1902012-11-07 05:19:04 +0000366 // Pick up abstract subprogram DIE.
Devang Patel8aa61472010-07-07 22:20:57 +0000367 SPDie = new DIE(dwarf::DW_TAG_subprogram);
Manman Renbc3e96f2013-03-12 18:27:15 +0000368 // If AbsSPDIE belongs to a different CU, use DW_FORM_ref_addr instead of
369 // DW_FORM_ref4.
Devang Patel3cbee302011-04-12 22:53:02 +0000370 SPCU->addDIEEntry(SPDie, dwarf::DW_AT_abstract_origin,
Manman Renbc3e96f2013-03-12 18:27:15 +0000371 InSameCU ? dwarf::DW_FORM_ref4 : dwarf::DW_FORM_ref_addr,
372 AbsSPDIE);
Manman Ren9174fd72013-05-28 19:01:58 +0000373 if (!InSameCU)
374 UseRefAddr = true;
Devang Patel8aa61472010-07-07 22:20:57 +0000375 SPCU->addDie(SPDie);
Bill Wendlinga4c76932012-11-07 04:42:18 +0000376 } else {
377 DISubprogram SPDecl = SP.getFunctionDeclaration();
378 if (!SPDecl.isSubprogram()) {
379 // There is not any need to generate specification DIE for a function
380 // defined at compile unit level. If a function is defined inside another
381 // function then gdb prefers the definition at top level and but does not
382 // expect specification DIE in parent function. So avoid creating
383 // specification DIE for a function defined inside a function.
384 if (SP.isDefinition() && !SP.getContext().isCompileUnit() &&
385 !SP.getContext().isFile() &&
386 !isSubprogramContext(SP.getContext())) {
387 SPCU->addFlag(SPDie, dwarf::DW_AT_declaration);
388
389 // Add arguments.
390 DICompositeType SPTy = SP.getType();
391 DIArray Args = SPTy.getTypeArray();
392 unsigned SPTag = SPTy.getTag();
393 if (SPTag == dwarf::DW_TAG_subroutine_type)
394 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
395 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
396 DIType ATy = DIType(Args.getElement(i));
397 SPCU->addType(Arg, ATy);
398 if (ATy.isArtificial())
399 SPCU->addFlag(Arg, dwarf::DW_AT_artificial);
400 if (ATy.isObjectPointer())
401 SPCU->addDIEEntry(SPDie, dwarf::DW_AT_object_pointer,
402 dwarf::DW_FORM_ref4, Arg);
403 SPDie->addChild(Arg);
404 }
405 DIE *SPDeclDie = SPDie;
406 SPDie = new DIE(dwarf::DW_TAG_subprogram);
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000407 SPCU->addDIEEntry(SPDie, dwarf::DW_AT_specification,
408 dwarf::DW_FORM_ref4, SPDeclDie);
Bill Wendlinga4c76932012-11-07 04:42:18 +0000409 SPCU->addDie(SPDie);
410 }
411 }
Devang Patel8aa61472010-07-07 22:20:57 +0000412 }
413
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000414 SPCU->addLabelAddress(SPDie, dwarf::DW_AT_low_pc,
415 Asm->GetTempSymbol("func_begin",
416 Asm->getFunctionNumber()));
417 SPCU->addLabelAddress(SPDie, dwarf::DW_AT_high_pc,
418 Asm->GetTempSymbol("func_end",
419 Asm->getFunctionNumber()));
Chris Lattnerd38fee82010-04-05 00:13:49 +0000420 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
421 MachineLocation Location(RI->getFrameRegister(*Asm->MF));
Devang Patel3cbee302011-04-12 22:53:02 +0000422 SPCU->addAddress(SPDie, dwarf::DW_AT_frame_base, Location);
Devang Patelb4645642010-02-06 01:02:37 +0000423
Eric Christopher0ffe2b42011-11-10 19:25:34 +0000424 // Add name to the name table, we do this here because we're guaranteed
425 // to have concrete versions of our DW_TAG_subprogram nodes.
426 addSubprogramNames(SPCU, SP, SPDie);
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000427
Chris Lattnerd38fee82010-04-05 00:13:49 +0000428 return SPDie;
Devang Patel53bb5c92009-11-10 23:06:00 +0000429}
430
Eric Christopherb6dc8652012-11-27 22:43:45 +0000431// Construct new DW_TAG_lexical_block for this scope and attach
432// DW_AT_low_pc/DW_AT_high_pc labels.
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000433DIE *DwarfDebug::constructLexicalScopeDIE(CompileUnit *TheCU,
Devang Pateld3024342011-08-15 22:24:32 +0000434 LexicalScope *Scope) {
Devang Pateleac9c072010-04-27 19:46:33 +0000435 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_lexical_block);
436 if (Scope->isAbstractScope())
437 return ScopeDIE;
438
Devang Patelbf47fdb2011-08-10 20:55:27 +0000439 const SmallVector<InsnRange, 4> &Ranges = Scope->getRanges();
Devang Pateleac9c072010-04-27 19:46:33 +0000440 if (Ranges.empty())
441 return 0;
442
Devang Patelbf47fdb2011-08-10 20:55:27 +0000443 SmallVector<InsnRange, 4>::const_iterator RI = Ranges.begin();
Devang Pateleac9c072010-04-27 19:46:33 +0000444 if (Ranges.size() > 1) {
445 // .debug_range section has not been laid out yet. Emit offset in
Jim Grosbach1e20b962010-07-21 21:21:52 +0000446 // .debug_range as a uint, size 4, for now. emitDIE will handle
Devang Pateleac9c072010-04-27 19:46:33 +0000447 // DW_AT_ranges appropriately.
Devang Patel3cbee302011-04-12 22:53:02 +0000448 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_ranges, dwarf::DW_FORM_data4,
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000449 DebugRangeSymbols.size()
Chandler Carruth426c2bf2012-11-01 09:14:31 +0000450 * Asm->getDataLayout().getPointerSize());
Devang Patelbf47fdb2011-08-10 20:55:27 +0000451 for (SmallVector<InsnRange, 4>::const_iterator RI = Ranges.begin(),
Devang Pateleac9c072010-04-27 19:46:33 +0000452 RE = Ranges.end(); RI != RE; ++RI) {
Devang Patelc3f5f782010-05-25 23:40:22 +0000453 DebugRangeSymbols.push_back(getLabelBeforeInsn(RI->first));
454 DebugRangeSymbols.push_back(getLabelAfterInsn(RI->second));
Devang Pateleac9c072010-04-27 19:46:33 +0000455 }
456 DebugRangeSymbols.push_back(NULL);
457 DebugRangeSymbols.push_back(NULL);
458 return ScopeDIE;
459 }
460
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000461 MCSymbol *Start = getLabelBeforeInsn(RI->first);
462 MCSymbol *End = getLabelAfterInsn(RI->second);
Devang Pateleac9c072010-04-27 19:46:33 +0000463
Devang Patelc3f5f782010-05-25 23:40:22 +0000464 if (End == 0) return 0;
Devang Patel53bb5c92009-11-10 23:06:00 +0000465
Chris Lattnerb7db7332010-03-09 01:58:53 +0000466 assert(Start->isDefined() && "Invalid starting label for an inlined scope!");
467 assert(End->isDefined() && "Invalid end label for an inlined scope!");
Jim Grosbach1e20b962010-07-21 21:21:52 +0000468
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000469 TheCU->addLabelAddress(ScopeDIE, dwarf::DW_AT_low_pc, Start);
470 TheCU->addLabelAddress(ScopeDIE, dwarf::DW_AT_high_pc, End);
Devang Patel53bb5c92009-11-10 23:06:00 +0000471
472 return ScopeDIE;
473}
474
Manman Ren9174fd72013-05-28 19:01:58 +0000475DIE *DwarfDebug::findSPDieInAllCUs(const MDNode *N) {
476 for (DenseMap<const MDNode *, CompileUnit *>::iterator CUI = CUMap.begin(),
477 CUE = CUMap.end(); CUI != CUE; ++CUI) {
478 CompileUnit *TheCU = CUI->second;
479 DIE *SPDie = TheCU->getDIE(N);
480 if (SPDie)
481 return SPDie;
482 }
483 return 0;
484}
485
Eric Christopherb6dc8652012-11-27 22:43:45 +0000486// This scope represents inlined body of a function. Construct DIE to
487// represent this concrete inlined copy of the function.
Devang Pateld3024342011-08-15 22:24:32 +0000488DIE *DwarfDebug::constructInlinedScopeDIE(CompileUnit *TheCU,
489 LexicalScope *Scope) {
Devang Patelbf47fdb2011-08-10 20:55:27 +0000490 const SmallVector<InsnRange, 4> &Ranges = Scope->getRanges();
Nick Lewycky746cb672011-10-26 22:55:33 +0000491 assert(Ranges.empty() == false &&
492 "LexicalScope does not have instruction markers!");
Devang Pateleac9c072010-04-27 19:46:33 +0000493
Devang Patel26a92002011-07-27 00:34:13 +0000494 if (!Scope->getScopeNode())
495 return NULL;
496 DIScope DS(Scope->getScopeNode());
497 DISubprogram InlinedSP = getDISubprogram(DS);
Manman Ren9174fd72013-05-28 19:01:58 +0000498 DIE *OriginDIE = findSPDieInAllCUs(InlinedSP);
Devang Patel26a92002011-07-27 00:34:13 +0000499 if (!OriginDIE) {
Bill Wendlinge0aae5b2012-10-30 17:51:02 +0000500 DEBUG(dbgs() << "Unable to find original DIE for an inlined subprogram.");
Devang Patel26a92002011-07-27 00:34:13 +0000501 return NULL;
502 }
503
Devang Patelbf47fdb2011-08-10 20:55:27 +0000504 SmallVector<InsnRange, 4>::const_iterator RI = Ranges.begin();
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000505 MCSymbol *StartLabel = getLabelBeforeInsn(RI->first);
506 MCSymbol *EndLabel = getLabelAfterInsn(RI->second);
Devang Pateleac9c072010-04-27 19:46:33 +0000507
Devang Patel0afbf232010-07-08 22:39:20 +0000508 if (StartLabel == 0 || EndLabel == 0) {
Bill Wendlinge0aae5b2012-10-30 17:51:02 +0000509 llvm_unreachable("Unexpected Start and End labels for an inlined scope!");
Devang Pateleac9c072010-04-27 19:46:33 +0000510 }
Chris Lattnerb7db7332010-03-09 01:58:53 +0000511 assert(StartLabel->isDefined() &&
Chris Lattnera34ec2292010-03-09 01:51:43 +0000512 "Invalid starting label for an inlined scope!");
Chris Lattnerb7db7332010-03-09 01:58:53 +0000513 assert(EndLabel->isDefined() &&
Chris Lattnera34ec2292010-03-09 01:51:43 +0000514 "Invalid end label for an inlined scope!");
Devang Pateleac9c072010-04-27 19:46:33 +0000515
Devang Pateld96efb82011-05-05 17:54:26 +0000516 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_inlined_subroutine);
Manman Ren9174fd72013-05-28 19:01:58 +0000517 bool InSameCU = OriginDIE->getCompileUnit() == TheCU->getCUDie();
Devang Patel3cbee302011-04-12 22:53:02 +0000518 TheCU->addDIEEntry(ScopeDIE, dwarf::DW_AT_abstract_origin,
Manman Ren9174fd72013-05-28 19:01:58 +0000519 InSameCU ? dwarf::DW_FORM_ref4 : dwarf::DW_FORM_ref_addr,
520 OriginDIE);
521 if (!InSameCU)
522 UseRefAddr = true;
Devang Patel53bb5c92009-11-10 23:06:00 +0000523
Devang Patel26a92002011-07-27 00:34:13 +0000524 if (Ranges.size() > 1) {
525 // .debug_range section has not been laid out yet. Emit offset in
526 // .debug_range as a uint, size 4, for now. emitDIE will handle
527 // DW_AT_ranges appropriately.
528 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_ranges, dwarf::DW_FORM_data4,
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000529 DebugRangeSymbols.size()
Chandler Carruth426c2bf2012-11-01 09:14:31 +0000530 * Asm->getDataLayout().getPointerSize());
Devang Patelbf47fdb2011-08-10 20:55:27 +0000531 for (SmallVector<InsnRange, 4>::const_iterator RI = Ranges.begin(),
Devang Patel26a92002011-07-27 00:34:13 +0000532 RE = Ranges.end(); RI != RE; ++RI) {
533 DebugRangeSymbols.push_back(getLabelBeforeInsn(RI->first));
534 DebugRangeSymbols.push_back(getLabelAfterInsn(RI->second));
535 }
536 DebugRangeSymbols.push_back(NULL);
537 DebugRangeSymbols.push_back(NULL);
538 } else {
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000539 TheCU->addLabelAddress(ScopeDIE, dwarf::DW_AT_low_pc, StartLabel);
540 TheCU->addLabelAddress(ScopeDIE, dwarf::DW_AT_high_pc, EndLabel);
Devang Patel26a92002011-07-27 00:34:13 +0000541 }
Devang Patel53bb5c92009-11-10 23:06:00 +0000542
543 InlinedSubprogramDIEs.insert(OriginDIE);
544
545 // Track the start label for this inlined function.
Devang Patel26a92002011-07-27 00:34:13 +0000546 //.debug_inlined section specification does not clearly state how
547 // to emit inlined scope that is split into multiple instruction ranges.
548 // For now, use first instruction range and emit low_pc/high_pc pair and
549 // corresponding .debug_inlined section entry for this pair.
Devang Patele9f8f5e2010-05-07 20:54:48 +0000550 DenseMap<const MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator
Devang Patel2db49d72010-05-07 18:11:54 +0000551 I = InlineInfo.find(InlinedSP);
Devang Patel53bb5c92009-11-10 23:06:00 +0000552
553 if (I == InlineInfo.end()) {
Nick Lewycky746cb672011-10-26 22:55:33 +0000554 InlineInfo[InlinedSP].push_back(std::make_pair(StartLabel, ScopeDIE));
Devang Patel2db49d72010-05-07 18:11:54 +0000555 InlinedSPNodes.push_back(InlinedSP);
Devang Patel53bb5c92009-11-10 23:06:00 +0000556 } else
Chris Lattner6ed0f902010-03-09 00:31:02 +0000557 I->second.push_back(std::make_pair(StartLabel, ScopeDIE));
Devang Patel53bb5c92009-11-10 23:06:00 +0000558
Devang Patel53bb5c92009-11-10 23:06:00 +0000559 DILocation DL(Scope->getInlinedAt());
Eric Christopher08212002012-03-26 21:38:38 +0000560 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_call_file, 0,
Manman Ren3de61b42013-03-07 01:42:00 +0000561 getOrCreateSourceID(DL.getFilename(), DL.getDirectory(),
562 TheCU->getUniqueID()));
Devang Patel3cbee302011-04-12 22:53:02 +0000563 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_call_line, 0, DL.getLineNumber());
Devang Patel53bb5c92009-11-10 23:06:00 +0000564
Eric Christopher309bedd2011-12-04 06:02:38 +0000565 // Add name to the name table, we do this here because we're guaranteed
566 // to have concrete versions of our DW_TAG_inlined_subprogram nodes.
567 addSubprogramNames(TheCU, InlinedSP, ScopeDIE);
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000568
Devang Patel53bb5c92009-11-10 23:06:00 +0000569 return ScopeDIE;
570}
571
Eric Christopherb6dc8652012-11-27 22:43:45 +0000572// Construct a DIE for this scope.
Devang Pateld0b5a5e2011-08-15 22:04:40 +0000573DIE *DwarfDebug::constructScopeDIE(CompileUnit *TheCU, LexicalScope *Scope) {
Devang Patel3c91b052010-03-08 20:52:55 +0000574 if (!Scope || !Scope->getScopeNode())
575 return NULL;
Jim Grosbach1e20b962010-07-21 21:21:52 +0000576
Manman Ren8b15d742013-01-31 20:05:14 +0000577 DIScope DS(Scope->getScopeNode());
578 // Early return to avoid creating dangling variable|scope DIEs.
Manman Ren9174fd72013-05-28 19:01:58 +0000579 DIE *AbstractSPDie = 0;
580 if (!Scope->getInlinedAt() && DS.isSubprogram() && Scope->isAbstractScope()) {
581 AbstractSPDie = findSPDieInAllCUs(DS);
582 if (!AbstractSPDie)
583 return NULL;
584 }
Manman Ren8b15d742013-01-31 20:05:14 +0000585
Nick Lewycky746cb672011-10-26 22:55:33 +0000586 SmallVector<DIE *, 8> Children;
Eric Christophere5212782012-09-12 23:36:19 +0000587 DIE *ObjectPointer = NULL;
Devang Patel0478c152011-03-01 22:58:55 +0000588
589 // Collect arguments for current function.
Devang Patelbf47fdb2011-08-10 20:55:27 +0000590 if (LScopes.isCurrentFunctionScope(Scope))
Devang Patel0478c152011-03-01 22:58:55 +0000591 for (unsigned i = 0, N = CurrentFnArguments.size(); i < N; ++i)
592 if (DbgVariable *ArgDV = CurrentFnArguments[i])
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000593 if (DIE *Arg =
Eric Christophere5212782012-09-12 23:36:19 +0000594 TheCU->constructVariableDIE(ArgDV, Scope->isAbstractScope())) {
Devang Patel0478c152011-03-01 22:58:55 +0000595 Children.push_back(Arg);
Eric Christophere5212782012-09-12 23:36:19 +0000596 if (ArgDV->isObjectPointer()) ObjectPointer = Arg;
597 }
Devang Patel0478c152011-03-01 22:58:55 +0000598
Eric Christopher1aeb7ac2011-10-03 15:49:16 +0000599 // Collect lexical scope children first.
Devang Patelbf47fdb2011-08-10 20:55:27 +0000600 const SmallVector<DbgVariable *, 8> &Variables = ScopeVariables.lookup(Scope);
Devang Patel5bc9fec2011-02-19 01:31:27 +0000601 for (unsigned i = 0, N = Variables.size(); i < N; ++i)
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000602 if (DIE *Variable =
Eric Christopher7b451cf2012-09-21 22:18:52 +0000603 TheCU->constructVariableDIE(Variables[i], Scope->isAbstractScope())) {
Devang Patel5bc9fec2011-02-19 01:31:27 +0000604 Children.push_back(Variable);
Eric Christopher7b451cf2012-09-21 22:18:52 +0000605 if (Variables[i]->isObjectPointer()) ObjectPointer = Variable;
606 }
Devang Patelbf47fdb2011-08-10 20:55:27 +0000607 const SmallVector<LexicalScope *, 4> &Scopes = Scope->getChildren();
Devang Patel5bc9fec2011-02-19 01:31:27 +0000608 for (unsigned j = 0, M = Scopes.size(); j < M; ++j)
Devang Pateld0b5a5e2011-08-15 22:04:40 +0000609 if (DIE *Nested = constructScopeDIE(TheCU, Scopes[j]))
Devang Patel5bc9fec2011-02-19 01:31:27 +0000610 Children.push_back(Nested);
Devang Patel3c91b052010-03-08 20:52:55 +0000611 DIE *ScopeDIE = NULL;
612 if (Scope->getInlinedAt())
Devang Pateld3024342011-08-15 22:24:32 +0000613 ScopeDIE = constructInlinedScopeDIE(TheCU, Scope);
Devang Patel3c91b052010-03-08 20:52:55 +0000614 else if (DS.isSubprogram()) {
Devang Patel0dd45582010-06-28 20:53:04 +0000615 ProcessedSPNodes.insert(DS);
Devang Patel8aa61472010-07-07 22:20:57 +0000616 if (Scope->isAbstractScope()) {
Manman Ren9174fd72013-05-28 19:01:58 +0000617 ScopeDIE = AbstractSPDie;
Devang Patel8aa61472010-07-07 22:20:57 +0000618 // Note down abstract DIE.
619 if (ScopeDIE)
620 AbstractSPDies.insert(std::make_pair(DS, ScopeDIE));
621 }
Devang Patel3c91b052010-03-08 20:52:55 +0000622 else
Devang Pateld3024342011-08-15 22:24:32 +0000623 ScopeDIE = updateSubprogramScopeDIE(TheCU, DS);
Devang Patel3c91b052010-03-08 20:52:55 +0000624 }
Devang Patel5bc9fec2011-02-19 01:31:27 +0000625 else {
626 // There is no need to emit empty lexical block DIE.
David Blaikied2e0f7e2013-05-06 23:33:07 +0000627 std::pair<ImportedEntityMap::const_iterator,
628 ImportedEntityMap::const_iterator> Range = std::equal_range(
629 ScopesWithImportedEntities.begin(), ScopesWithImportedEntities.end(),
Timur Iskhodzhanov664fbee2013-05-07 07:47:47 +0000630 std::pair<const MDNode *, const MDNode *>(DS, (const MDNode*)0),
631 CompareFirst());
David Blaikied2e0f7e2013-05-06 23:33:07 +0000632 if (Children.empty() && Range.first == Range.second)
Devang Patel5bc9fec2011-02-19 01:31:27 +0000633 return NULL;
Devang Pateld3024342011-08-15 22:24:32 +0000634 ScopeDIE = constructLexicalScopeDIE(TheCU, Scope);
David Blaikied2e0f7e2013-05-06 23:33:07 +0000635 for (ImportedEntityMap::const_iterator i = Range.first; i != Range.second; ++i)
David Blaikied1221e32013-05-08 06:01:38 +0000636 constructImportedEntityDIE(TheCU, i->second, ScopeDIE);
Devang Patel5bc9fec2011-02-19 01:31:27 +0000637 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000638
Devang Patelaead63c2010-03-29 22:59:58 +0000639 if (!ScopeDIE) return NULL;
Jim Grosbach1e20b962010-07-21 21:21:52 +0000640
Devang Patel5bc9fec2011-02-19 01:31:27 +0000641 // Add children
642 for (SmallVector<DIE *, 8>::iterator I = Children.begin(),
643 E = Children.end(); I != E; ++I)
644 ScopeDIE->addChild(*I);
Devang Patel193f7202009-11-24 01:14:22 +0000645
Eric Christophere5212782012-09-12 23:36:19 +0000646 if (DS.isSubprogram() && ObjectPointer != NULL)
647 TheCU->addDIEEntry(ScopeDIE, dwarf::DW_AT_object_pointer,
648 dwarf::DW_FORM_ref4, ObjectPointer);
649
Jim Grosbach1e20b962010-07-21 21:21:52 +0000650 if (DS.isSubprogram())
Eric Christopher0ffe2b42011-11-10 19:25:34 +0000651 TheCU->addPubTypes(DISubprogram(DS));
Jim Grosbach1e20b962010-07-21 21:21:52 +0000652
Eric Christopher0ffe2b42011-11-10 19:25:34 +0000653 return ScopeDIE;
Devang Patel53bb5c92009-11-10 23:06:00 +0000654}
655
Eric Christopherb6dc8652012-11-27 22:43:45 +0000656// Look up the source id with the given directory and source file names.
657// If none currently exists, create a new id and insert it in the
658// SourceIds map. This can update DirectoryNames and SourceFileNames maps
659// as well.
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000660unsigned DwarfDebug::getOrCreateSourceID(StringRef FileName,
Manman Ren3de61b42013-03-07 01:42:00 +0000661 StringRef DirName, unsigned CUID) {
662 // If we use .loc in assembly, we can't separate .file entries according to
663 // compile units. Thus all files will belong to the default compile unit.
664 if (Asm->TM.hasMCUseLoc() &&
665 Asm->OutStreamer.getKind() == MCStreamer::SK_AsmStreamer)
666 CUID = 0;
667
Devang Patel1905a182010-09-16 20:57:49 +0000668 // If FE did not provide a file name, then assume stdin.
669 if (FileName.empty())
Manman Ren3de61b42013-03-07 01:42:00 +0000670 return getOrCreateSourceID("<stdin>", StringRef(), CUID);
Devang Patel23670e52011-03-24 20:30:50 +0000671
Nick Lewycky6c1a7032011-11-02 20:55:33 +0000672 // TODO: this might not belong here. See if we can factor this better.
673 if (DirName == CompilationDir)
674 DirName = "";
675
Manman Ren3de61b42013-03-07 01:42:00 +0000676 // FileIDCUMap stores the current ID for the given compile unit.
677 unsigned SrcId = FileIDCUMap[CUID] + 1;
Devang Patel1905a182010-09-16 20:57:49 +0000678
Manman Ren3de61b42013-03-07 01:42:00 +0000679 // We look up the CUID/file/dir by concatenating them with a zero byte.
Benjamin Kramer74612c22012-03-11 14:56:26 +0000680 SmallString<128> NamePair;
Manman Ren5044a932013-04-06 01:02:38 +0000681 NamePair += utostr(CUID);
Manman Ren3de61b42013-03-07 01:42:00 +0000682 NamePair += '\0';
Benjamin Kramer74612c22012-03-11 14:56:26 +0000683 NamePair += DirName;
684 NamePair += '\0'; // Zero bytes are not allowed in paths.
685 NamePair += FileName;
686
687 StringMapEntry<unsigned> &Ent = SourceIdMap.GetOrCreateValue(NamePair, SrcId);
688 if (Ent.getValue() != SrcId)
689 return Ent.getValue();
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000690
Manman Ren3de61b42013-03-07 01:42:00 +0000691 FileIDCUMap[CUID] = SrcId;
Rafael Espindola5c055632010-11-18 02:04:25 +0000692 // Print out a .file directive to specify files for .loc directives.
Manman Ren3de61b42013-03-07 01:42:00 +0000693 Asm->OutStreamer.EmitDwarfFileDirective(SrcId, DirName, FileName, CUID);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000694
695 return SrcId;
696}
697
Eric Christopher72c16552012-12-20 21:58:40 +0000698// Create new CompileUnit for the given metadata node with tag
699// DW_TAG_compile_unit.
Devang Patel94c7ddb2011-08-16 22:09:43 +0000700CompileUnit *DwarfDebug::constructCompileUnit(const MDNode *N) {
Devang Patele4b27562009-08-28 23:24:31 +0000701 DICompileUnit DIUnit(N);
Devang Patel65dbc902009-11-25 17:36:49 +0000702 StringRef FN = DIUnit.getFilename();
Nick Lewycky6c1a7032011-11-02 20:55:33 +0000703 CompilationDir = DIUnit.getDirectory();
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000704
705 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
Eli Benderskyd4a05e02012-12-03 18:45:45 +0000706 CompileUnit *NewCU = new CompileUnit(GlobalCUIndexCount++,
Eric Christopher9c57ad22013-05-08 00:58:51 +0000707 DIUnit.getLanguage(), Die, N, Asm,
Eric Christopher2e5d8702012-12-20 21:58:36 +0000708 this, &InfoHolder);
Manman Ren3de61b42013-03-07 01:42:00 +0000709
710 FileIDCUMap[NewCU->getUniqueID()] = 0;
711 // Call this to emit a .file directive if it wasn't emitted for the source
712 // file this CU comes from yet.
713 getOrCreateSourceID(FN, CompilationDir, NewCU->getUniqueID());
714
Nick Lewycky390c40d2011-10-27 06:44:11 +0000715 NewCU->addString(Die, dwarf::DW_AT_producer, DIUnit.getProducer());
Devang Patel3cbee302011-04-12 22:53:02 +0000716 NewCU->addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data2,
717 DIUnit.getLanguage());
Nick Lewycky390c40d2011-10-27 06:44:11 +0000718 NewCU->addString(Die, dwarf::DW_AT_name, FN);
Eric Christophere0828ec2013-04-09 19:23:15 +0000719
Eric Christopher6635cad2012-08-01 18:19:01 +0000720 // 2.17.1 requires that we use DW_AT_low_pc for a single entry point
Eric Christophere0828ec2013-04-09 19:23:15 +0000721 // into an entity. We're using 0 (or a NULL label) for this. For
722 // split dwarf it's in the skeleton CU so omit it here.
723 if (!useSplitDwarf())
724 NewCU->addLabelAddress(Die, dwarf::DW_AT_low_pc, NULL);
Manman Ren43213cf2013-02-05 21:52:47 +0000725
726 // Define start line table label for each Compile Unit.
727 MCSymbol *LineTableStartSym = Asm->GetTempSymbol("line_table_start",
728 NewCU->getUniqueID());
729 Asm->OutStreamer.getContext().setMCLineTableSymbol(LineTableStartSym,
730 NewCU->getUniqueID());
731
Manman Ren01cb18e2013-05-21 00:57:22 +0000732 // Use a single line table if we are using .loc and generating assembly.
733 bool UseTheFirstCU =
734 (Asm->TM.hasMCUseLoc() &&
735 Asm->OutStreamer.getKind() == MCStreamer::SK_AsmStreamer) ||
736 (NewCU->getUniqueID() == 0);
737
Devang Patel4a602ca2010-03-22 23:11:36 +0000738 // DW_AT_stmt_list is a offset of line number information for this
Eric Christophere0828ec2013-04-09 19:23:15 +0000739 // compile unit in debug_line section. For split dwarf this is
740 // left in the skeleton CU and so not included.
Manman Renf2d89ff2013-02-09 00:41:44 +0000741 // The line table entries are not always emitted in assembly, so it
742 // is not okay to use line_table_start here.
Eric Christophere0828ec2013-04-09 19:23:15 +0000743 if (!useSplitDwarf()) {
744 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
745 NewCU->addLabel(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4,
Manman Ren01cb18e2013-05-21 00:57:22 +0000746 UseTheFirstCU ?
Eric Christophere0828ec2013-04-09 19:23:15 +0000747 Asm->GetTempSymbol("section_line") : LineTableStartSym);
Manman Ren01cb18e2013-05-21 00:57:22 +0000748 else if (UseTheFirstCU)
Eric Christophere0828ec2013-04-09 19:23:15 +0000749 NewCU->addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4, 0);
750 else
751 NewCU->addDelta(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4,
752 LineTableStartSym, DwarfLineSectionSym);
753 }
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000754
Eric Christophere0828ec2013-04-09 19:23:15 +0000755 // If we're using split dwarf the compilation dir is going to be in the
756 // skeleton CU and so we don't need to duplicate it here.
757 if (!useSplitDwarf() && !CompilationDir.empty())
Nick Lewycky6c1a7032011-11-02 20:55:33 +0000758 NewCU->addString(Die, dwarf::DW_AT_comp_dir, CompilationDir);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000759 if (DIUnit.isOptimized())
Eric Christopher873cf0a2012-08-24 01:14:27 +0000760 NewCU->addFlag(Die, dwarf::DW_AT_APPLE_optimized);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000761
Devang Patel65dbc902009-11-25 17:36:49 +0000762 StringRef Flags = DIUnit.getFlags();
763 if (!Flags.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +0000764 NewCU->addString(Die, dwarf::DW_AT_APPLE_flags, Flags);
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000765
Nick Lewyckyd5d52132011-10-17 23:27:36 +0000766 if (unsigned RVer = DIUnit.getRunTimeVersion())
Devang Patel3cbee302011-04-12 22:53:02 +0000767 NewCU->addUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers,
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000768 dwarf::DW_FORM_data1, RVer);
769
Devang Patel163a9f72010-05-10 22:49:55 +0000770 if (!FirstCU)
771 FirstCU = NewCU;
Eric Christopher208cc6f2013-02-05 07:31:55 +0000772
Eric Christopher0e3e9b72012-12-10 23:34:43 +0000773 InfoHolder.addUnit(NewCU);
774
Devang Patel163a9f72010-05-10 22:49:55 +0000775 CUMap.insert(std::make_pair(N, NewCU));
Devang Patel94c7ddb2011-08-16 22:09:43 +0000776 return NewCU;
Devang Patel163a9f72010-05-10 22:49:55 +0000777}
778
Eric Christopherb6dc8652012-11-27 22:43:45 +0000779// Construct subprogram DIE.
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000780void DwarfDebug::constructSubprogramDIE(CompileUnit *TheCU,
Devang Patel3655a212011-08-15 23:36:40 +0000781 const MDNode *N) {
Rafael Espindolab0527282011-11-04 19:00:29 +0000782 CompileUnit *&CURef = SPMap[N];
783 if (CURef)
784 return;
785 CURef = TheCU;
786
Devang Patele4b27562009-08-28 23:24:31 +0000787 DISubprogram SP(N);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000788 if (!SP.isDefinition())
789 // This is a method declaration which will be handled while constructing
790 // class type.
Devang Patel13e16b62009-06-26 01:49:18 +0000791 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000792
Devang Pateldbc64af2011-08-15 17:24:54 +0000793 DIE *SubprogramDie = TheCU->getOrCreateSubprogramDIE(SP);
Stuart Hastings639336e2010-04-06 21:38:29 +0000794
795 // Add to map.
Devang Patel163a9f72010-05-10 22:49:55 +0000796 TheCU->insertDIE(N, SubprogramDie);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000797
798 // Add to context owner.
Devang Patel3cbee302011-04-12 22:53:02 +0000799 TheCU->addToContextOwner(SubprogramDie, SP.getContext());
Devang Patel0000fad2009-12-08 23:21:45 +0000800
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +0000801 // Expose as global, if requested.
802 if (GenerateDwarfPubNamesSection)
803 TheCU->addGlobalName(SP.getName(), SubprogramDie);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000804}
805
David Blaikie20d9e412013-05-07 21:35:53 +0000806void DwarfDebug::constructImportedEntityDIE(CompileUnit *TheCU,
David Blaikiec462db62013-04-22 06:12:31 +0000807 const MDNode *N) {
David Blaikie20d9e412013-05-07 21:35:53 +0000808 DIImportedEntity Module(N);
David Blaikiec462db62013-04-22 06:12:31 +0000809 if (!Module.Verify())
810 return;
David Blaikied2e0f7e2013-05-06 23:33:07 +0000811 if (DIE *D = TheCU->getOrCreateContextDIE(Module.getContext()))
David Blaikied1221e32013-05-08 06:01:38 +0000812 constructImportedEntityDIE(TheCU, Module, D);
David Blaikied2e0f7e2013-05-06 23:33:07 +0000813}
814
David Blaikied1221e32013-05-08 06:01:38 +0000815void DwarfDebug::constructImportedEntityDIE(CompileUnit *TheCU, const MDNode *N,
David Blaikied2e0f7e2013-05-06 23:33:07 +0000816 DIE *Context) {
David Blaikie20d9e412013-05-07 21:35:53 +0000817 DIImportedEntity Module(N);
David Blaikied2e0f7e2013-05-06 23:33:07 +0000818 if (!Module.Verify())
819 return;
David Blaikied1221e32013-05-08 06:01:38 +0000820 return constructImportedEntityDIE(TheCU, Module, Context);
David Blaikied2e0f7e2013-05-06 23:33:07 +0000821}
822
David Blaikied1221e32013-05-08 06:01:38 +0000823void DwarfDebug::constructImportedEntityDIE(CompileUnit *TheCU,
David Blaikie20d9e412013-05-07 21:35:53 +0000824 const DIImportedEntity &Module,
David Blaikied2e0f7e2013-05-06 23:33:07 +0000825 DIE *Context) {
826 assert(Module.Verify() &&
827 "Use one of the MDNode * overloads to handle invalid metadata");
828 assert(Context && "Should always have a context for an imported_module");
David Blaikie20d9e412013-05-07 21:35:53 +0000829 DIE *IMDie = new DIE(Module.getTag());
David Blaikiec462db62013-04-22 06:12:31 +0000830 TheCU->insertDIE(Module, IMDie);
David Blaikie20d9e412013-05-07 21:35:53 +0000831 DIE *EntityDie;
832 DIDescriptor Entity = Module.getEntity();
833 if (Entity.isNameSpace())
834 EntityDie = TheCU->getOrCreateNameSpace(DINameSpace(Entity));
835 else if (Entity.isSubprogram())
836 EntityDie = TheCU->getOrCreateSubprogramDIE(DISubprogram(Entity));
David Blaikieaa76a932013-05-08 06:01:41 +0000837 else if (Entity.isType())
838 EntityDie = TheCU->getOrCreateTypeDIE(DIType(Entity));
David Blaikie20d9e412013-05-07 21:35:53 +0000839 else
David Blaikieaa76a932013-05-08 06:01:41 +0000840 EntityDie = TheCU->getDIE(Entity);
David Blaikiec462db62013-04-22 06:12:31 +0000841 unsigned FileID = getOrCreateSourceID(Module.getContext().getFilename(),
842 Module.getContext().getDirectory(),
843 TheCU->getUniqueID());
844 TheCU->addUInt(IMDie, dwarf::DW_AT_decl_file, 0, FileID);
845 TheCU->addUInt(IMDie, dwarf::DW_AT_decl_line, 0, Module.getLineNumber());
David Blaikie20d9e412013-05-07 21:35:53 +0000846 TheCU->addDIEEntry(IMDie, dwarf::DW_AT_import, dwarf::DW_FORM_ref4, EntityDie);
David Blaikie7b72cc72013-05-20 22:50:35 +0000847 StringRef Name = Module.getName();
848 if (!Name.empty())
849 TheCU->addString(IMDie, dwarf::DW_AT_name, Name);
David Blaikied2e0f7e2013-05-06 23:33:07 +0000850 Context->addChild(IMDie);
David Blaikiec462db62013-04-22 06:12:31 +0000851}
852
Eric Christopherb6dc8652012-11-27 22:43:45 +0000853// Emit all Dwarf sections that should come prior to the content. Create
854// global DIEs and emit initial debug info sections. This is invoked by
855// the target AsmPrinter.
Eric Christopherc4639d62012-11-19 22:42:15 +0000856void DwarfDebug::beginModule() {
Devang Pateleac9c072010-04-27 19:46:33 +0000857 if (DisableDebugInfoPrinting)
858 return;
859
Eric Christopherc4639d62012-11-19 22:42:15 +0000860 const Module *M = MMI->getModule();
861
Nick Lewycky3bbb6f72011-07-29 03:49:23 +0000862 // If module has named metadata anchors then use them, otherwise scan the
863 // module using debug info finder to collect debug info.
Devang Patel30692ab2011-05-03 16:45:22 +0000864 NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu");
David Blaikiec0ec8a42013-03-11 23:39:23 +0000865 if (!CU_Nodes)
Devang Patel02e603f2011-08-15 23:47:24 +0000866 return;
Devang Patel30692ab2011-05-03 16:45:22 +0000867
David Blaikiec0ec8a42013-03-11 23:39:23 +0000868 // Emit initial sections so we can reference labels later.
869 emitSectionLabels();
870
871 for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i) {
872 DICompileUnit CUNode(CU_Nodes->getOperand(i));
873 CompileUnit *CU = constructCompileUnit(CUNode);
David Blaikie20d9e412013-05-07 21:35:53 +0000874 DIArray ImportedEntities = CUNode.getImportedEntities();
875 for (unsigned i = 0, e = ImportedEntities.getNumElements(); i != e; ++i)
David Blaikied2e0f7e2013-05-06 23:33:07 +0000876 ScopesWithImportedEntities.push_back(std::make_pair(
David Blaikie20d9e412013-05-07 21:35:53 +0000877 DIImportedEntity(ImportedEntities.getElement(i)).getContext(),
878 ImportedEntities.getElement(i)));
David Blaikied2e0f7e2013-05-06 23:33:07 +0000879 std::sort(ScopesWithImportedEntities.begin(),
880 ScopesWithImportedEntities.end(), CompareFirst());
David Blaikiec0ec8a42013-03-11 23:39:23 +0000881 DIArray GVs = CUNode.getGlobalVariables();
882 for (unsigned i = 0, e = GVs.getNumElements(); i != e; ++i)
883 CU->createGlobalVariableDIE(GVs.getElement(i));
884 DIArray SPs = CUNode.getSubprograms();
885 for (unsigned i = 0, e = SPs.getNumElements(); i != e; ++i)
886 constructSubprogramDIE(CU, SPs.getElement(i));
887 DIArray EnumTypes = CUNode.getEnumTypes();
888 for (unsigned i = 0, e = EnumTypes.getNumElements(); i != e; ++i)
889 CU->getOrCreateTypeDIE(EnumTypes.getElement(i));
890 DIArray RetainedTypes = CUNode.getRetainedTypes();
891 for (unsigned i = 0, e = RetainedTypes.getNumElements(); i != e; ++i)
892 CU->getOrCreateTypeDIE(RetainedTypes.getElement(i));
David Blaikiec462db62013-04-22 06:12:31 +0000893 // Emit imported_modules last so that the relevant context is already
894 // available.
David Blaikie20d9e412013-05-07 21:35:53 +0000895 for (unsigned i = 0, e = ImportedEntities.getNumElements(); i != e; ++i)
896 constructImportedEntityDIE(CU, ImportedEntities.getElement(i));
Eric Christopherc126c322013-03-29 20:23:02 +0000897 // If we're splitting the dwarf out now that we've got the entire
898 // CU then construct a skeleton CU based upon it.
899 if (useSplitDwarf()) {
Eric Christopher13367122013-04-24 12:56:18 +0000900 // This should be a unique identifier when we want to build .dwp files.
Eric Christopher1b0cd2f2013-04-22 07:51:08 +0000901 CU->addUInt(CU->getCUDie(), dwarf::DW_AT_GNU_dwo_id,
902 dwarf::DW_FORM_data8, 0);
Eric Christopherc126c322013-03-29 20:23:02 +0000903 // Now construct the skeleton CU associated.
904 constructSkeletonCU(CUNode);
905 }
David Blaikiec0ec8a42013-03-11 23:39:23 +0000906 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000907
Chris Lattnerd850ac72010-04-05 02:19:28 +0000908 // Tell MMI that we have debug info.
909 MMI->setDebugInfoAvailability(true);
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000910
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000911 // Prime section data.
Chris Lattnerf0144122009-07-28 03:13:23 +0000912 SectionMap.insert(Asm->getObjFileLowering().getTextSection());
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000913}
914
Eric Christopher4117bec2012-11-22 00:59:49 +0000915// Attach DW_AT_inline attribute with inlined subprogram DIEs.
916void DwarfDebug::computeInlinedDIEs() {
Devang Patel53bb5c92009-11-10 23:06:00 +0000917 // Attach DW_AT_inline attribute with inlined subprogram DIEs.
918 for (SmallPtrSet<DIE *, 4>::iterator AI = InlinedSubprogramDIEs.begin(),
Eric Christopherbdab8002012-11-27 00:13:51 +0000919 AE = InlinedSubprogramDIEs.end(); AI != AE; ++AI) {
Devang Patel53bb5c92009-11-10 23:06:00 +0000920 DIE *ISP = *AI;
Devang Patel3cbee302011-04-12 22:53:02 +0000921 FirstCU->addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
Devang Patel53bb5c92009-11-10 23:06:00 +0000922 }
Rafael Espindolad1ac3a42011-11-12 01:57:54 +0000923 for (DenseMap<const MDNode *, DIE *>::iterator AI = AbstractSPDies.begin(),
Eric Christopherbdab8002012-11-27 00:13:51 +0000924 AE = AbstractSPDies.end(); AI != AE; ++AI) {
Rafael Espindolad1ac3a42011-11-12 01:57:54 +0000925 DIE *ISP = AI->second;
926 if (InlinedSubprogramDIEs.count(ISP))
927 continue;
928 FirstCU->addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
929 }
Eric Christopher4117bec2012-11-22 00:59:49 +0000930}
931
932// Collect info for variables that were optimized out.
933void DwarfDebug::collectDeadVariables() {
934 const Module *M = MMI->getModule();
935 DenseMap<const MDNode *, LexicalScope *> DeadFnScopeMap;
936
937 if (NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu")) {
938 for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i) {
939 DICompileUnit TheCU(CU_Nodes->getOperand(i));
940 DIArray Subprograms = TheCU.getSubprograms();
941 for (unsigned i = 0, e = Subprograms.getNumElements(); i != e; ++i) {
Eric Christopherbdab8002012-11-27 00:13:51 +0000942 DISubprogram SP(Subprograms.getElement(i));
943 if (ProcessedSPNodes.count(SP) != 0) continue;
944 if (!SP.Verify()) continue;
945 if (!SP.isDefinition()) continue;
946 DIArray Variables = SP.getVariables();
947 if (Variables.getNumElements() == 0) continue;
Eric Christopher4117bec2012-11-22 00:59:49 +0000948
Eric Christopherbdab8002012-11-27 00:13:51 +0000949 LexicalScope *Scope =
950 new LexicalScope(NULL, DIDescriptor(SP), NULL, false);
951 DeadFnScopeMap[SP] = Scope;
Eric Christopher4117bec2012-11-22 00:59:49 +0000952
Eric Christopherbdab8002012-11-27 00:13:51 +0000953 // Construct subprogram DIE and add variables DIEs.
954 CompileUnit *SPCU = CUMap.lookup(TheCU);
955 assert(SPCU && "Unable to find Compile Unit!");
956 constructSubprogramDIE(SPCU, SP);
957 DIE *ScopeDIE = SPCU->getDIE(SP);
958 for (unsigned vi = 0, ve = Variables.getNumElements(); vi != ve; ++vi) {
959 DIVariable DV(Variables.getElement(vi));
960 if (!DV.Verify()) continue;
961 DbgVariable *NewVar = new DbgVariable(DV, NULL);
962 if (DIE *VariableDIE =
963 SPCU->constructVariableDIE(NewVar, Scope->isAbstractScope()))
964 ScopeDIE->addChild(VariableDIE);
965 }
Eric Christopher4117bec2012-11-22 00:59:49 +0000966 }
967 }
968 }
969 DeleteContainerSeconds(DeadFnScopeMap);
970}
971
972void DwarfDebug::finalizeModuleInfo() {
973 // Collect info for variables that were optimized out.
974 collectDeadVariables();
975
976 // Attach DW_AT_inline attribute with inlined subprogram DIEs.
977 computeInlinedDIEs();
Devang Patel53bb5c92009-11-10 23:06:00 +0000978
Eric Christopher6635cad2012-08-01 18:19:01 +0000979 // Emit DW_AT_containing_type attribute to connect types with their
980 // vtable holding type.
Devang Pateldbc64af2011-08-15 17:24:54 +0000981 for (DenseMap<const MDNode *, CompileUnit *>::iterator CUI = CUMap.begin(),
Eric Christopherbdab8002012-11-27 00:13:51 +0000982 CUE = CUMap.end(); CUI != CUE; ++CUI) {
Devang Pateldbc64af2011-08-15 17:24:54 +0000983 CompileUnit *TheCU = CUI->second;
984 TheCU->constructContainingTypeDIEs();
Devang Patel5d11eb02009-12-03 19:11:07 +0000985 }
986
Eric Christopher4117bec2012-11-22 00:59:49 +0000987 // Compute DIE offsets and sizes.
Eric Christopher0e3e9b72012-12-10 23:34:43 +0000988 InfoHolder.computeSizeAndOffsets();
989 if (useSplitDwarf())
990 SkeletonHolder.computeSizeAndOffsets();
Eric Christopher4117bec2012-11-22 00:59:49 +0000991}
992
993void DwarfDebug::endSections() {
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000994 // Standard sections final addresses.
Chris Lattner6c2f9e12009-08-19 05:49:37 +0000995 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getTextSection());
Chris Lattnerc0215722010-04-04 19:25:43 +0000996 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("text_end"));
Chris Lattner6c2f9e12009-08-19 05:49:37 +0000997 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getDataSection());
Chris Lattnerc0215722010-04-04 19:25:43 +0000998 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("data_end"));
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000999
1000 // End text sections.
Benjamin Kramerb4c9d9c2012-10-31 13:45:49 +00001001 for (unsigned I = 0, E = SectionMap.size(); I != E; ++I) {
1002 Asm->OutStreamer.SwitchSection(SectionMap[I]);
1003 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("section_end", I+1));
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001004 }
Eric Christopher4117bec2012-11-22 00:59:49 +00001005}
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001006
Eric Christopherb6dc8652012-11-27 22:43:45 +00001007// Emit all Dwarf sections that should come after the content.
Eric Christopher4117bec2012-11-22 00:59:49 +00001008void DwarfDebug::endModule() {
1009
1010 if (!FirstCU) return;
1011
1012 // End any existing sections.
1013 // TODO: Does this need to happen?
1014 endSections();
1015
1016 // Finalize the debug info for the module.
1017 finalizeModuleInfo();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001018
Eric Christopher4daaed12012-12-10 19:51:21 +00001019 if (!useSplitDwarf()) {
Eric Christopher42885022012-11-27 22:43:42 +00001020 // Emit all the DIEs into a debug info section.
1021 emitDebugInfo();
Eric Christopher74802f72012-11-27 00:41:54 +00001022
Eric Christopher42885022012-11-27 22:43:42 +00001023 // Corresponding abbreviations into a abbrev section.
1024 emitAbbreviations();
1025
1026 // Emit info into a debug loc section.
1027 emitDebugLoc();
1028
1029 // Emit info into a debug aranges section.
1030 emitDebugARanges();
1031
1032 // Emit info into a debug ranges section.
1033 emitDebugRanges();
1034
1035 // Emit info into a debug macinfo section.
1036 emitDebugMacInfo();
1037
1038 // Emit inline info.
1039 // TODO: When we don't need the option anymore we
1040 // can remove all of the code that this section
1041 // depends upon.
1042 if (useDarwinGDBCompat())
1043 emitDebugInlineInfo();
1044 } else {
Eric Christopher0b944ee2012-12-11 19:42:09 +00001045 // TODO: Fill this in for separated debug sections and separate
Eric Christopher42885022012-11-27 22:43:42 +00001046 // out information into new sections.
1047
Eric Christopher98e237f2012-11-30 23:59:06 +00001048 // Emit the debug info section and compile units.
Eric Christopher42885022012-11-27 22:43:42 +00001049 emitDebugInfo();
Eric Christopher98e237f2012-11-30 23:59:06 +00001050 emitDebugInfoDWO();
Eric Christopher42885022012-11-27 22:43:42 +00001051
1052 // Corresponding abbreviations into a abbrev section.
1053 emitAbbreviations();
Eric Christopher6eebe472012-12-19 22:02:53 +00001054 emitDebugAbbrevDWO();
Eric Christopher42885022012-11-27 22:43:42 +00001055
1056 // Emit info into a debug loc section.
1057 emitDebugLoc();
1058
1059 // Emit info into a debug aranges section.
1060 emitDebugARanges();
1061
1062 // Emit info into a debug ranges section.
1063 emitDebugRanges();
1064
1065 // Emit info into a debug macinfo section.
1066 emitDebugMacInfo();
1067
Eric Christopher72f7bfb2013-01-15 23:56:56 +00001068 // Emit DWO addresses.
1069 InfoHolder.emitAddresses(Asm->getObjFileLowering().getDwarfAddrSection());
1070
Eric Christopher42885022012-11-27 22:43:42 +00001071 // Emit inline info.
1072 // TODO: When we don't need the option anymore we
1073 // can remove all of the code that this section
1074 // depends upon.
1075 if (useDarwinGDBCompat())
1076 emitDebugInlineInfo();
1077 }
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001078
Eric Christopher9d9f5a52012-08-23 07:32:06 +00001079 // Emit info into the dwarf accelerator table sections.
Eric Christopher20f47ab2012-08-23 22:36:40 +00001080 if (useDwarfAccelTables()) {
Eric Christopher09ac3d82011-11-07 09:24:32 +00001081 emitAccelNames();
1082 emitAccelObjC();
1083 emitAccelNamespaces();
1084 emitAccelTypes();
1085 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001086
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00001087 // Emit info into a debug pubnames section, if requested.
1088 if (GenerateDwarfPubNamesSection)
1089 emitDebugPubnames();
1090
Devang Patel193f7202009-11-24 01:14:22 +00001091 // Emit info into a debug pubtypes section.
Eric Christopher360f0062012-08-23 07:10:56 +00001092 // TODO: When we don't need the option anymore we can
1093 // remove all of the code that adds to the table.
Eric Christopher20f47ab2012-08-23 22:36:40 +00001094 if (useDarwinGDBCompat())
Eric Christopher360f0062012-08-23 07:10:56 +00001095 emitDebugPubTypes();
Devang Patel193f7202009-11-24 01:14:22 +00001096
Eric Christopher42885022012-11-27 22:43:42 +00001097 // Finally emit string information into a string table.
Eric Christopherfcdbecb2012-11-27 06:49:23 +00001098 emitDebugStr();
Eric Christopher64f824c2012-12-27 02:14:01 +00001099 if (useSplitDwarf())
1100 emitDebugStrDWO();
Eric Christopherfcdbecb2012-11-27 06:49:23 +00001101
Devang Patele9a1cca2010-08-02 17:32:15 +00001102 // clean up.
Devang Patel94c7ddb2011-08-16 22:09:43 +00001103 SPMap.clear();
Devang Patel163a9f72010-05-10 22:49:55 +00001104 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
1105 E = CUMap.end(); I != E; ++I)
1106 delete I->second;
Eric Christopher9ec87b32012-12-10 19:51:18 +00001107
Eric Christopher01776a52013-02-06 21:53:56 +00001108 for (SmallVector<CompileUnit *, 1>::iterator I = SkeletonCUs.begin(),
1109 E = SkeletonCUs.end(); I != E; ++I)
1110 delete *I;
Eric Christopher9ec87b32012-12-10 19:51:18 +00001111
Eric Christopher98e237f2012-11-30 23:59:06 +00001112 // Reset these for the next Module if we have one.
1113 FirstCU = NULL;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001114}
1115
Eric Christopherb6dc8652012-11-27 22:43:45 +00001116// Find abstract variable, if any, associated with Var.
Devang Patelb549bcf2011-08-10 21:50:54 +00001117DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &DV,
Chris Lattnerde4845c2010-04-02 19:42:39 +00001118 DebugLoc ScopeLoc) {
Devang Patelb549bcf2011-08-10 21:50:54 +00001119 LLVMContext &Ctx = DV->getContext();
1120 // More then one inlined variable corresponds to one abstract variable.
1121 DIVariable Var = cleanseInlinedVariable(DV, Ctx);
Devang Patel2db49d72010-05-07 18:11:54 +00001122 DbgVariable *AbsDbgVariable = AbstractVariables.lookup(Var);
Devang Patel53bb5c92009-11-10 23:06:00 +00001123 if (AbsDbgVariable)
1124 return AbsDbgVariable;
1125
Devang Patelbf47fdb2011-08-10 20:55:27 +00001126 LexicalScope *Scope = LScopes.findAbstractScope(ScopeLoc.getScope(Ctx));
Devang Patel53bb5c92009-11-10 23:06:00 +00001127 if (!Scope)
1128 return NULL;
1129
Devang Patel5a1a67c2011-08-15 19:01:20 +00001130 AbsDbgVariable = new DbgVariable(Var, NULL);
Devang Patelbf47fdb2011-08-10 20:55:27 +00001131 addScopeVariable(Scope, AbsDbgVariable);
Devang Patel2db49d72010-05-07 18:11:54 +00001132 AbstractVariables[Var] = AbsDbgVariable;
Devang Patel53bb5c92009-11-10 23:06:00 +00001133 return AbsDbgVariable;
1134}
1135
Eric Christopherb6dc8652012-11-27 22:43:45 +00001136// If Var is a current function argument then add it to CurrentFnArguments list.
Devang Patel0478c152011-03-01 22:58:55 +00001137bool DwarfDebug::addCurrentFnArgument(const MachineFunction *MF,
Devang Patelbf47fdb2011-08-10 20:55:27 +00001138 DbgVariable *Var, LexicalScope *Scope) {
1139 if (!LScopes.isCurrentFunctionScope(Scope))
Devang Patel0478c152011-03-01 22:58:55 +00001140 return false;
1141 DIVariable DV = Var->getVariable();
1142 if (DV.getTag() != dwarf::DW_TAG_arg_variable)
1143 return false;
1144 unsigned ArgNo = DV.getArgNumber();
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001145 if (ArgNo == 0)
Devang Patel0478c152011-03-01 22:58:55 +00001146 return false;
1147
Devang Patelcb3a6572011-03-03 20:02:02 +00001148 size_t Size = CurrentFnArguments.size();
1149 if (Size == 0)
Devang Patel0478c152011-03-01 22:58:55 +00001150 CurrentFnArguments.resize(MF->getFunction()->arg_size());
Devang Patelbbd0f452011-03-03 21:49:41 +00001151 // llvm::Function argument size is not good indicator of how many
Devang Patel6f676be2011-03-03 20:08:10 +00001152 // arguments does the function have at source level.
1153 if (ArgNo > Size)
Devang Patelcb3a6572011-03-03 20:02:02 +00001154 CurrentFnArguments.resize(ArgNo * 2);
Devang Patel0478c152011-03-01 22:58:55 +00001155 CurrentFnArguments[ArgNo - 1] = Var;
1156 return true;
1157}
1158
Eric Christopherb6dc8652012-11-27 22:43:45 +00001159// Collect variable information from side table maintained by MMI.
Jim Grosbach1e20b962010-07-21 21:21:52 +00001160void
Nick Lewycky3bbb6f72011-07-29 03:49:23 +00001161DwarfDebug::collectVariableInfoFromMMITable(const MachineFunction *MF,
Devang Patelee432862010-05-20 19:57:06 +00001162 SmallPtrSet<const MDNode *, 16> &Processed) {
Devang Patele717faa2009-10-06 01:26:37 +00001163 MachineModuleInfo::VariableDbgInfoMapTy &VMap = MMI->getVariableDbgInfo();
1164 for (MachineModuleInfo::VariableDbgInfoMapTy::iterator VI = VMap.begin(),
1165 VE = VMap.end(); VI != VE; ++VI) {
Devang Patele9f8f5e2010-05-07 20:54:48 +00001166 const MDNode *Var = VI->first;
Devang Patel53bb5c92009-11-10 23:06:00 +00001167 if (!Var) continue;
Devang Patel98e1cac2010-05-14 21:01:35 +00001168 Processed.insert(Var);
Chris Lattnerde4845c2010-04-02 19:42:39 +00001169 DIVariable DV(Var);
1170 const std::pair<unsigned, DebugLoc> &VP = VI->second;
Devang Patel53bb5c92009-11-10 23:06:00 +00001171
Devang Patelbf47fdb2011-08-10 20:55:27 +00001172 LexicalScope *Scope = LScopes.findLexicalScope(VP.second);
Jim Grosbach1e20b962010-07-21 21:21:52 +00001173
Devang Patelfb0ee432009-11-10 23:20:04 +00001174 // If variable scope is not found then skip this variable.
Chris Lattnerde4845c2010-04-02 19:42:39 +00001175 if (Scope == 0)
Devang Patelfb0ee432009-11-10 23:20:04 +00001176 continue;
Devang Patel53bb5c92009-11-10 23:06:00 +00001177
Devang Patel26c1e562010-05-20 16:36:41 +00001178 DbgVariable *AbsDbgVariable = findAbstractVariable(DV, VP.second);
Devang Patel5a1a67c2011-08-15 19:01:20 +00001179 DbgVariable *RegVar = new DbgVariable(DV, AbsDbgVariable);
Devang Patelff9dd0a2011-08-15 21:24:36 +00001180 RegVar->setFrameIndex(VP.first);
Devang Patel0478c152011-03-01 22:58:55 +00001181 if (!addCurrentFnArgument(MF, RegVar, Scope))
Devang Patelbf47fdb2011-08-10 20:55:27 +00001182 addScopeVariable(Scope, RegVar);
Devang Patel5a1a67c2011-08-15 19:01:20 +00001183 if (AbsDbgVariable)
Devang Patelff9dd0a2011-08-15 21:24:36 +00001184 AbsDbgVariable->setFrameIndex(VP.first);
Devang Patele717faa2009-10-06 01:26:37 +00001185 }
Devang Patelee432862010-05-20 19:57:06 +00001186}
Devang Patel90a48ad2010-03-15 18:33:46 +00001187
Eric Christopherb6dc8652012-11-27 22:43:45 +00001188// Return true if debug value, encoded by DBG_VALUE instruction, is in a
1189// defined reg.
Devang Patelc3f5f782010-05-25 23:40:22 +00001190static bool isDbgValueInDefinedReg(const MachineInstr *MI) {
Nick Lewycky746cb672011-10-26 22:55:33 +00001191 assert(MI->isDebugValue() && "Invalid DBG_VALUE machine instruction!");
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001192 return MI->getNumOperands() == 3 &&
1193 MI->getOperand(0).isReg() && MI->getOperand(0).getReg() &&
Adrian Prantl86a87d92013-04-30 22:35:14 +00001194 MI->getOperand(1).isImm() && MI->getOperand(1).getImm() == 0;
Devang Patelc3f5f782010-05-25 23:40:22 +00001195}
1196
Eric Christopherb6dc8652012-11-27 22:43:45 +00001197// Get .debug_loc entry for the instruction range starting at MI.
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001198static DotDebugLocEntry getDebugLocEntry(AsmPrinter *Asm,
1199 const MCSymbol *FLabel,
Devang Patel90b40412011-07-08 17:09:57 +00001200 const MCSymbol *SLabel,
1201 const MachineInstr *MI) {
1202 const MDNode *Var = MI->getOperand(MI->getNumOperands() - 1).getMetadata();
1203
1204 if (MI->getNumOperands() != 3) {
1205 MachineLocation MLoc = Asm->getDebugValueLocation(MI);
1206 return DotDebugLocEntry(FLabel, SLabel, MLoc, Var);
1207 }
Adrian Prantl86a87d92013-04-30 22:35:14 +00001208 if (MI->getOperand(0).isReg() && MI->getOperand(1).isImm()) {
Devang Patel90b40412011-07-08 17:09:57 +00001209 MachineLocation MLoc;
Adrian Prantl86a87d92013-04-30 22:35:14 +00001210 // TODO: Currently an offset of 0 in a DBG_VALUE means
1211 // we need to generate a direct register value.
1212 // There is no way to specify an indirect value with offset 0.
1213 if (MI->getOperand(1).getImm() == 0)
Adrian Prantl13131e62013-04-26 21:57:17 +00001214 MLoc.set(MI->getOperand(0).getReg());
1215 else
1216 MLoc.set(MI->getOperand(0).getReg(), MI->getOperand(1).getImm());
Devang Patel90b40412011-07-08 17:09:57 +00001217 return DotDebugLocEntry(FLabel, SLabel, MLoc, Var);
1218 }
1219 if (MI->getOperand(0).isImm())
1220 return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getImm());
1221 if (MI->getOperand(0).isFPImm())
1222 return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getFPImm());
1223 if (MI->getOperand(0).isCImm())
1224 return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getCImm());
1225
Craig Topper5e25ee82012-02-05 08:31:47 +00001226 llvm_unreachable("Unexpected 3 operand DBG_VALUE instruction!");
Devang Patel90b40412011-07-08 17:09:57 +00001227}
1228
Eric Christopherb6dc8652012-11-27 22:43:45 +00001229// Find variables for each lexical scope.
Jim Grosbach1e20b962010-07-21 21:21:52 +00001230void
Devang Patel78e127d2010-06-25 22:07:34 +00001231DwarfDebug::collectVariableInfo(const MachineFunction *MF,
1232 SmallPtrSet<const MDNode *, 16> &Processed) {
Jim Grosbach1e20b962010-07-21 21:21:52 +00001233
Eric Christopherb6dc8652012-11-27 22:43:45 +00001234 // collection info from MMI table.
Devang Patelee432862010-05-20 19:57:06 +00001235 collectVariableInfoFromMMITable(MF, Processed);
1236
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001237 for (SmallVectorImpl<const MDNode*>::const_iterator
1238 UVI = UserVariables.begin(), UVE = UserVariables.end(); UVI != UVE;
1239 ++UVI) {
1240 const MDNode *Var = *UVI;
1241 if (Processed.count(Var))
Devang Patelee432862010-05-20 19:57:06 +00001242 continue;
1243
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001244 // History contains relevant DBG_VALUE instructions for Var and instructions
1245 // clobbering it.
1246 SmallVectorImpl<const MachineInstr*> &History = DbgValues[Var];
1247 if (History.empty())
1248 continue;
1249 const MachineInstr *MInsn = History.front();
Devang Patelc3f5f782010-05-25 23:40:22 +00001250
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001251 DIVariable DV(Var);
Devang Patelbf47fdb2011-08-10 20:55:27 +00001252 LexicalScope *Scope = NULL;
Devang Pateld8720f42010-05-27 20:25:04 +00001253 if (DV.getTag() == dwarf::DW_TAG_arg_variable &&
1254 DISubprogram(DV.getContext()).describes(MF->getFunction()))
Devang Patelbf47fdb2011-08-10 20:55:27 +00001255 Scope = LScopes.getCurrentFunctionScope();
David Blaikiec0ec8a42013-03-11 23:39:23 +00001256 else if (MDNode *IA = DV.getInlinedAt())
1257 Scope = LScopes.findInlinedScope(DebugLoc::getFromDILocation(IA));
1258 else
1259 Scope = LScopes.findLexicalScope(cast<MDNode>(DV->getOperand(1)));
Devang Patelee432862010-05-20 19:57:06 +00001260 // If variable scope is not found then skip this variable.
Devang Patelc0c5a262010-05-21 00:10:20 +00001261 if (!Scope)
Devang Patelee432862010-05-20 19:57:06 +00001262 continue;
1263
1264 Processed.insert(DV);
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001265 assert(MInsn->isDebugValue() && "History must begin with debug value");
Devang Patel5a1a67c2011-08-15 19:01:20 +00001266 DbgVariable *AbsVar = findAbstractVariable(DV, MInsn->getDebugLoc());
1267 DbgVariable *RegVar = new DbgVariable(DV, AbsVar);
Devang Patel0478c152011-03-01 22:58:55 +00001268 if (!addCurrentFnArgument(MF, RegVar, Scope))
Devang Patelbf47fdb2011-08-10 20:55:27 +00001269 addScopeVariable(Scope, RegVar);
Devang Patel5a1a67c2011-08-15 19:01:20 +00001270 if (AbsVar)
Devang Patelff9dd0a2011-08-15 21:24:36 +00001271 AbsVar->setMInsn(MInsn);
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001272
Eric Christopherc56e3f02012-10-08 20:48:54 +00001273 // Simplify ranges that are fully coalesced.
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001274 if (History.size() <= 1 || (History.size() == 2 &&
1275 MInsn->isIdenticalTo(History.back()))) {
Devang Patelff9dd0a2011-08-15 21:24:36 +00001276 RegVar->setMInsn(MInsn);
Devang Patelc3f5f782010-05-25 23:40:22 +00001277 continue;
1278 }
1279
Eric Christopher498703b2013-01-28 17:33:26 +00001280 // Handle multiple DBG_VALUE instructions describing one variable.
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001281 RegVar->setDotDebugLocOffset(DotDebugLocEntries.size());
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001282
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001283 for (SmallVectorImpl<const MachineInstr*>::const_iterator
1284 HI = History.begin(), HE = History.end(); HI != HE; ++HI) {
1285 const MachineInstr *Begin = *HI;
1286 assert(Begin->isDebugValue() && "Invalid History entry");
Jakob Stoklund Olesene17232e2011-03-22 00:21:41 +00001287
Devang Patel4ada1d72011-06-01 23:00:17 +00001288 // Check if DBG_VALUE is truncating a range.
1289 if (Begin->getNumOperands() > 1 && Begin->getOperand(0).isReg()
1290 && !Begin->getOperand(0).getReg())
1291 continue;
1292
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001293 // Compute the range for a register location.
1294 const MCSymbol *FLabel = getLabelBeforeInsn(Begin);
1295 const MCSymbol *SLabel = 0;
1296
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001297 if (HI + 1 == HE)
1298 // If Begin is the last instruction in History then its value is valid
Chris Lattner7a2bdde2011-04-15 05:18:47 +00001299 // until the end of the function.
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001300 SLabel = FunctionEndSym;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001301 else {
1302 const MachineInstr *End = HI[1];
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001303 DEBUG(dbgs() << "DotDebugLoc Pair:\n"
Devang Patel476df5f2011-07-07 21:44:42 +00001304 << "\t" << *Begin << "\t" << *End << "\n");
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001305 if (End->isDebugValue())
1306 SLabel = getLabelBeforeInsn(End);
1307 else {
1308 // End is a normal instruction clobbering the range.
1309 SLabel = getLabelAfterInsn(End);
1310 assert(SLabel && "Forgot label after clobber instruction");
1311 ++HI;
1312 }
1313 }
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001314
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001315 // The value is valid until the next DBG_VALUE or clobber.
Eric Christopherabbb2002011-12-16 23:42:31 +00001316 DotDebugLocEntries.push_back(getDebugLocEntry(Asm, FLabel, SLabel,
1317 Begin));
Devang Patelc3f5f782010-05-25 23:40:22 +00001318 }
1319 DotDebugLocEntries.push_back(DotDebugLocEntry());
Devang Patel90a48ad2010-03-15 18:33:46 +00001320 }
Devang Patel98e1cac2010-05-14 21:01:35 +00001321
1322 // Collect info for variables that were optimized out.
Devang Patel93d39be2011-08-19 23:28:12 +00001323 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
1324 DIArray Variables = DISubprogram(FnScope->getScopeNode()).getVariables();
1325 for (unsigned i = 0, e = Variables.getNumElements(); i != e; ++i) {
1326 DIVariable DV(Variables.getElement(i));
1327 if (!DV || !DV.Verify() || !Processed.insert(DV))
1328 continue;
1329 if (LexicalScope *Scope = LScopes.findLexicalScope(DV.getContext()))
1330 addScopeVariable(Scope, new DbgVariable(DV, NULL));
Devang Patel98e1cac2010-05-14 21:01:35 +00001331 }
Devang Patelc3f5f782010-05-25 23:40:22 +00001332}
Devang Patel98e1cac2010-05-14 21:01:35 +00001333
Eric Christopherb6dc8652012-11-27 22:43:45 +00001334// Return Label preceding the instruction.
Eric Christopher72f7bfb2013-01-15 23:56:56 +00001335MCSymbol *DwarfDebug::getLabelBeforeInsn(const MachineInstr *MI) {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001336 MCSymbol *Label = LabelsBeforeInsn.lookup(MI);
1337 assert(Label && "Didn't insert label before instruction");
1338 return Label;
Devang Patelc3f5f782010-05-25 23:40:22 +00001339}
1340
Eric Christopherb6dc8652012-11-27 22:43:45 +00001341// Return Label immediately following the instruction.
Eric Christopher72f7bfb2013-01-15 23:56:56 +00001342MCSymbol *DwarfDebug::getLabelAfterInsn(const MachineInstr *MI) {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001343 return LabelsAfterInsn.lookup(MI);
Devang Patele717faa2009-10-06 01:26:37 +00001344}
1345
Eric Christopherb6dc8652012-11-27 22:43:45 +00001346// Process beginning of an instruction.
Devang Patelcbbe2872010-10-26 17:49:02 +00001347void DwarfDebug::beginInstruction(const MachineInstr *MI) {
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001348 // Check if source location changes, but ignore DBG_VALUE locations.
1349 if (!MI->isDebugValue()) {
1350 DebugLoc DL = MI->getDebugLoc();
1351 if (DL != PrevInstLoc && (!DL.isUnknown() || UnknownLocations)) {
Eric Christopher60b35f42012-04-05 20:39:05 +00001352 unsigned Flags = 0;
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001353 PrevInstLoc = DL;
Devang Patel4243e672011-05-11 19:22:19 +00001354 if (DL == PrologEndLoc) {
1355 Flags |= DWARF2_FLAG_PROLOGUE_END;
1356 PrologEndLoc = DebugLoc();
1357 }
Eric Christopher60b35f42012-04-05 20:39:05 +00001358 if (PrologEndLoc.isUnknown())
1359 Flags |= DWARF2_FLAG_IS_STMT;
1360
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001361 if (!DL.isUnknown()) {
1362 const MDNode *Scope = DL.getScope(Asm->MF->getFunction()->getContext());
Devang Patel4243e672011-05-11 19:22:19 +00001363 recordSourceLine(DL.getLine(), DL.getCol(), Scope, Flags);
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001364 } else
Devang Patel4243e672011-05-11 19:22:19 +00001365 recordSourceLine(0, 0, 0, 0);
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001366 }
Devang Patelc3f5f782010-05-25 23:40:22 +00001367 }
Devang Patelaead63c2010-03-29 22:59:58 +00001368
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001369 // Insert labels where requested.
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001370 DenseMap<const MachineInstr*, MCSymbol*>::iterator I =
1371 LabelsBeforeInsn.find(MI);
1372
1373 // No label needed.
1374 if (I == LabelsBeforeInsn.end())
1375 return;
1376
1377 // Label already assigned.
1378 if (I->second)
Devang Patelb2b31a62010-05-26 19:37:24 +00001379 return;
Devang Patel553881b2010-03-29 17:20:31 +00001380
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001381 if (!PrevLabel) {
Devang Patel77051f52010-05-26 21:23:46 +00001382 PrevLabel = MMI->getContext().CreateTempSymbol();
1383 Asm->OutStreamer.EmitLabel(PrevLabel);
Devang Patelb2b31a62010-05-26 19:37:24 +00001384 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001385 I->second = PrevLabel;
Devang Patel0d20ac82009-10-06 01:50:42 +00001386}
1387
Eric Christopherb6dc8652012-11-27 22:43:45 +00001388// Process end of an instruction.
Devang Patelcbbe2872010-10-26 17:49:02 +00001389void DwarfDebug::endInstruction(const MachineInstr *MI) {
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001390 // Don't create a new label after DBG_VALUE instructions.
1391 // They don't generate code.
1392 if (!MI->isDebugValue())
1393 PrevLabel = 0;
1394
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001395 DenseMap<const MachineInstr*, MCSymbol*>::iterator I =
1396 LabelsAfterInsn.find(MI);
1397
1398 // No label needed.
1399 if (I == LabelsAfterInsn.end())
1400 return;
1401
1402 // Label already assigned.
1403 if (I->second)
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001404 return;
1405
1406 // We need a label after this instruction.
1407 if (!PrevLabel) {
1408 PrevLabel = MMI->getContext().CreateTempSymbol();
1409 Asm->OutStreamer.EmitLabel(PrevLabel);
Devang Patel1c246352010-04-08 16:50:29 +00001410 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001411 I->second = PrevLabel;
Devang Patel53bb5c92009-11-10 23:06:00 +00001412}
1413
Eric Christopherb6dc8652012-11-27 22:43:45 +00001414// Each LexicalScope has first instruction and last instruction to mark
1415// beginning and end of a scope respectively. Create an inverse map that list
1416// scopes starts (and ends) with an instruction. One instruction may start (or
1417// end) multiple scopes. Ignore scopes that are not reachable.
Devang Patele37b0c62010-04-08 18:43:56 +00001418void DwarfDebug::identifyScopeMarkers() {
Devang Patelbf47fdb2011-08-10 20:55:27 +00001419 SmallVector<LexicalScope *, 4> WorkList;
1420 WorkList.push_back(LScopes.getCurrentFunctionScope());
Devang Patel42aafd72010-01-20 02:05:23 +00001421 while (!WorkList.empty()) {
Devang Patelbf47fdb2011-08-10 20:55:27 +00001422 LexicalScope *S = WorkList.pop_back_val();
Jim Grosbach1e20b962010-07-21 21:21:52 +00001423
Devang Patelbf47fdb2011-08-10 20:55:27 +00001424 const SmallVector<LexicalScope *, 4> &Children = S->getChildren();
Jim Grosbach1e20b962010-07-21 21:21:52 +00001425 if (!Children.empty())
Devang Patelbf47fdb2011-08-10 20:55:27 +00001426 for (SmallVector<LexicalScope *, 4>::const_iterator SI = Children.begin(),
Devang Patel42aafd72010-01-20 02:05:23 +00001427 SE = Children.end(); SI != SE; ++SI)
1428 WorkList.push_back(*SI);
1429
Devang Patel53bb5c92009-11-10 23:06:00 +00001430 if (S->isAbstractScope())
1431 continue;
Jim Grosbach1e20b962010-07-21 21:21:52 +00001432
Devang Patelbf47fdb2011-08-10 20:55:27 +00001433 const SmallVector<InsnRange, 4> &Ranges = S->getRanges();
Devang Pateleac9c072010-04-27 19:46:33 +00001434 if (Ranges.empty())
1435 continue;
Devang Patelbf47fdb2011-08-10 20:55:27 +00001436 for (SmallVector<InsnRange, 4>::const_iterator RI = Ranges.begin(),
Devang Pateleac9c072010-04-27 19:46:33 +00001437 RE = Ranges.end(); RI != RE; ++RI) {
Devang Patelbf47fdb2011-08-10 20:55:27 +00001438 assert(RI->first && "InsnRange does not have first instruction!");
1439 assert(RI->second && "InsnRange does not have second instruction!");
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001440 requestLabelBeforeInsn(RI->first);
1441 requestLabelAfterInsn(RI->second);
Devang Pateleac9c072010-04-27 19:46:33 +00001442 }
Devang Patelaf9e8472009-10-01 20:31:14 +00001443 }
Devang Patelaf9e8472009-10-01 20:31:14 +00001444}
1445
Eric Christopherb6dc8652012-11-27 22:43:45 +00001446// Get MDNode for DebugLoc's scope.
Devang Patela3f48672011-05-09 22:14:49 +00001447static MDNode *getScopeNode(DebugLoc DL, const LLVMContext &Ctx) {
1448 if (MDNode *InlinedAt = DL.getInlinedAt(Ctx))
1449 return getScopeNode(DebugLoc::getFromDILocation(InlinedAt), Ctx);
1450 return DL.getScope(Ctx);
1451}
1452
Eric Christopherb6dc8652012-11-27 22:43:45 +00001453// Walk up the scope chain of given debug loc and find line number info
1454// for the function.
Devang Patel4243e672011-05-11 19:22:19 +00001455static DebugLoc getFnDebugLoc(DebugLoc DL, const LLVMContext &Ctx) {
1456 const MDNode *Scope = getScopeNode(DL, Ctx);
1457 DISubprogram SP = getDISubprogram(Scope);
Eric Christopher6126a1e2012-04-03 00:43:49 +00001458 if (SP.Verify()) {
1459 // Check for number of operands since the compatibility is
1460 // cheap here.
Eric Christopherfa5b0502012-04-03 17:55:42 +00001461 if (SP->getNumOperands() > 19)
Eric Christopher6126a1e2012-04-03 00:43:49 +00001462 return DebugLoc::get(SP.getScopeLineNumber(), 0, SP);
1463 else
1464 return DebugLoc::get(SP.getLineNumber(), 0, SP);
1465 }
1466
Devang Patel4243e672011-05-11 19:22:19 +00001467 return DebugLoc();
1468}
1469
Eric Christopherb6dc8652012-11-27 22:43:45 +00001470// Gather pre-function debug information. Assumes being called immediately
1471// after the function entry point has been emitted.
Chris Lattnereec791a2010-01-26 23:18:02 +00001472void DwarfDebug::beginFunction(const MachineFunction *MF) {
Chris Lattner994cb122010-04-05 03:52:55 +00001473 if (!MMI->hasDebugInfo()) return;
Devang Patelbf47fdb2011-08-10 20:55:27 +00001474 LScopes.initialize(*MF);
1475 if (LScopes.empty()) return;
1476 identifyScopeMarkers();
Devang Patel60b35bd2009-10-06 18:37:31 +00001477
Manman Ren43213cf2013-02-05 21:52:47 +00001478 // Set DwarfCompileUnitID in MCContext to the Compile Unit this function
1479 // belongs to.
1480 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
1481 CompileUnit *TheCU = SPMap.lookup(FnScope->getScopeNode());
1482 assert(TheCU && "Unable to find compile unit!");
Manman Ren01cb18e2013-05-21 00:57:22 +00001483 if (Asm->TM.hasMCUseLoc() &&
1484 Asm->OutStreamer.getKind() == MCStreamer::SK_AsmStreamer)
1485 // Use a single line table if we are using .loc and generating assembly.
1486 Asm->OutStreamer.getContext().setDwarfCompileUnitID(0);
1487 else
1488 Asm->OutStreamer.getContext().setDwarfCompileUnitID(TheCU->getUniqueID());
Manman Ren43213cf2013-02-05 21:52:47 +00001489
Devang Pateleac9c072010-04-27 19:46:33 +00001490 FunctionBeginSym = Asm->GetTempSymbol("func_begin",
1491 Asm->getFunctionNumber());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001492 // Assumes in correct section after the entry point.
Devang Pateleac9c072010-04-27 19:46:33 +00001493 Asm->OutStreamer.EmitLabel(FunctionBeginSym);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001494
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001495 assert(UserVariables.empty() && DbgValues.empty() && "Maps weren't cleaned");
1496
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001497 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
Eric Christopherb6dc8652012-11-27 22:43:45 +00001498 // LiveUserVar - Map physreg numbers to the MDNode they contain.
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001499 std::vector<const MDNode*> LiveUserVar(TRI->getNumRegs());
1500
Devang Patelb2b31a62010-05-26 19:37:24 +00001501 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001502 I != E; ++I) {
1503 bool AtBlockEntry = true;
Devang Patelb2b31a62010-05-26 19:37:24 +00001504 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
1505 II != IE; ++II) {
1506 const MachineInstr *MI = II;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001507
Devang Patelb2b31a62010-05-26 19:37:24 +00001508 if (MI->isDebugValue()) {
Nick Lewycky746cb672011-10-26 22:55:33 +00001509 assert(MI->getNumOperands() > 1 && "Invalid machine instruction!");
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001510
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001511 // Keep track of user variables.
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001512 const MDNode *Var =
1513 MI->getOperand(MI->getNumOperands() - 1).getMetadata();
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001514
1515 // Variable is in a register, we need to check for clobbers.
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001516 if (isDbgValueInDefinedReg(MI))
1517 LiveUserVar[MI->getOperand(0).getReg()] = Var;
1518
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001519 // Check the history of this variable.
1520 SmallVectorImpl<const MachineInstr*> &History = DbgValues[Var];
1521 if (History.empty()) {
1522 UserVariables.push_back(Var);
1523 // The first mention of a function argument gets the FunctionBeginSym
1524 // label, so arguments are visible when breaking at function entry.
1525 DIVariable DV(Var);
1526 if (DV.Verify() && DV.getTag() == dwarf::DW_TAG_arg_variable &&
1527 DISubprogram(getDISubprogram(DV.getContext()))
1528 .describes(MF->getFunction()))
1529 LabelsBeforeInsn[MI] = FunctionBeginSym;
1530 } else {
1531 // We have seen this variable before. Try to coalesce DBG_VALUEs.
1532 const MachineInstr *Prev = History.back();
1533 if (Prev->isDebugValue()) {
1534 // Coalesce identical entries at the end of History.
1535 if (History.size() >= 2 &&
Devang Patel79862892011-07-07 00:14:27 +00001536 Prev->isIdenticalTo(History[History.size() - 2])) {
Eric Christopher02c1a642012-10-08 20:48:49 +00001537 DEBUG(dbgs() << "Coalescing identical DBG_VALUE entries:\n"
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001538 << "\t" << *Prev
Devang Patel79862892011-07-07 00:14:27 +00001539 << "\t" << *History[History.size() - 2] << "\n");
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001540 History.pop_back();
Devang Patel79862892011-07-07 00:14:27 +00001541 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001542
1543 // Terminate old register assignments that don't reach MI;
1544 MachineFunction::const_iterator PrevMBB = Prev->getParent();
1545 if (PrevMBB != I && (!AtBlockEntry || llvm::next(PrevMBB) != I) &&
1546 isDbgValueInDefinedReg(Prev)) {
1547 // Previous register assignment needs to terminate at the end of
1548 // its basic block.
1549 MachineBasicBlock::const_iterator LastMI =
1550 PrevMBB->getLastNonDebugInstr();
Devang Patel79862892011-07-07 00:14:27 +00001551 if (LastMI == PrevMBB->end()) {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001552 // Drop DBG_VALUE for empty range.
Eric Christopher02c1a642012-10-08 20:48:49 +00001553 DEBUG(dbgs() << "Dropping DBG_VALUE for empty range:\n"
Devang Patel79862892011-07-07 00:14:27 +00001554 << "\t" << *Prev << "\n");
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001555 History.pop_back();
Devang Patel79862892011-07-07 00:14:27 +00001556 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001557 else {
1558 // Terminate after LastMI.
1559 History.push_back(LastMI);
1560 }
1561 }
1562 }
1563 }
1564 History.push_back(MI);
Devang Patelb2b31a62010-05-26 19:37:24 +00001565 } else {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001566 // Not a DBG_VALUE instruction.
1567 if (!MI->isLabel())
1568 AtBlockEntry = false;
1569
Eric Christopher0313ced2012-10-04 20:46:14 +00001570 // First known non-DBG_VALUE and non-frame setup location marks
1571 // the beginning of the function body.
1572 if (!MI->getFlag(MachineInstr::FrameSetup) &&
1573 (PrologEndLoc.isUnknown() && !MI->getDebugLoc().isUnknown()))
Devang Patel4243e672011-05-11 19:22:19 +00001574 PrologEndLoc = MI->getDebugLoc();
1575
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001576 // Check if the instruction clobbers any registers with debug vars.
1577 for (MachineInstr::const_mop_iterator MOI = MI->operands_begin(),
1578 MOE = MI->operands_end(); MOI != MOE; ++MOI) {
1579 if (!MOI->isReg() || !MOI->isDef() || !MOI->getReg())
1580 continue;
Jakob Stoklund Olesen396618b2012-06-01 23:28:30 +00001581 for (MCRegAliasIterator AI(MOI->getReg(), TRI, true);
1582 AI.isValid(); ++AI) {
1583 unsigned Reg = *AI;
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001584 const MDNode *Var = LiveUserVar[Reg];
1585 if (!Var)
1586 continue;
1587 // Reg is now clobbered.
1588 LiveUserVar[Reg] = 0;
1589
1590 // Was MD last defined by a DBG_VALUE referring to Reg?
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001591 DbgValueHistoryMap::iterator HistI = DbgValues.find(Var);
1592 if (HistI == DbgValues.end())
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001593 continue;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001594 SmallVectorImpl<const MachineInstr*> &History = HistI->second;
1595 if (History.empty())
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001596 continue;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001597 const MachineInstr *Prev = History.back();
1598 // Sanity-check: Register assignments are terminated at the end of
1599 // their block.
1600 if (!Prev->isDebugValue() || Prev->getParent() != MI->getParent())
1601 continue;
1602 // Is the variable still in Reg?
1603 if (!isDbgValueInDefinedReg(Prev) ||
1604 Prev->getOperand(0).getReg() != Reg)
1605 continue;
1606 // Var is clobbered. Make sure the next instruction gets a label.
1607 History.push_back(MI);
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001608 }
1609 }
Devang Patelb2b31a62010-05-26 19:37:24 +00001610 }
Devang Patelb2b31a62010-05-26 19:37:24 +00001611 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001612 }
1613
1614 for (DbgValueHistoryMap::iterator I = DbgValues.begin(), E = DbgValues.end();
1615 I != E; ++I) {
1616 SmallVectorImpl<const MachineInstr*> &History = I->second;
1617 if (History.empty())
1618 continue;
1619
1620 // Make sure the final register assignments are terminated.
1621 const MachineInstr *Prev = History.back();
1622 if (Prev->isDebugValue() && isDbgValueInDefinedReg(Prev)) {
1623 const MachineBasicBlock *PrevMBB = Prev->getParent();
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001624 MachineBasicBlock::const_iterator LastMI =
Devang Patel5bc942c2011-08-10 23:58:09 +00001625 PrevMBB->getLastNonDebugInstr();
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001626 if (LastMI == PrevMBB->end())
1627 // Drop DBG_VALUE for empty range.
1628 History.pop_back();
1629 else {
1630 // Terminate after LastMI.
1631 History.push_back(LastMI);
1632 }
1633 }
1634 // Request labels for the full history.
1635 for (unsigned i = 0, e = History.size(); i != e; ++i) {
1636 const MachineInstr *MI = History[i];
1637 if (MI->isDebugValue())
1638 requestLabelBeforeInsn(MI);
1639 else
1640 requestLabelAfterInsn(MI);
1641 }
1642 }
Devang Patelb2b31a62010-05-26 19:37:24 +00001643
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001644 PrevInstLoc = DebugLoc();
Devang Patelb2b31a62010-05-26 19:37:24 +00001645 PrevLabel = FunctionBeginSym;
Devang Patel4243e672011-05-11 19:22:19 +00001646
1647 // Record beginning of function.
1648 if (!PrologEndLoc.isUnknown()) {
1649 DebugLoc FnStartDL = getFnDebugLoc(PrologEndLoc,
1650 MF->getFunction()->getContext());
1651 recordSourceLine(FnStartDL.getLine(), FnStartDL.getCol(),
1652 FnStartDL.getScope(MF->getFunction()->getContext()),
David Blaikie836cfc42012-12-04 22:02:33 +00001653 // We'd like to list the prologue as "not statements" but GDB behaves
1654 // poorly if we do that. Revisit this with caution/GDB (7.5+) testing.
David Blaikieb36c5312012-12-04 21:05:36 +00001655 DWARF2_FLAG_IS_STMT);
Devang Patel4243e672011-05-11 19:22:19 +00001656 }
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001657}
1658
Devang Patelbf47fdb2011-08-10 20:55:27 +00001659void DwarfDebug::addScopeVariable(LexicalScope *LS, DbgVariable *Var) {
1660// SmallVector<DbgVariable *, 8> &Vars = ScopeVariables.lookup(LS);
1661 ScopeVariables[LS].push_back(Var);
1662// Vars.push_back(Var);
1663}
1664
Eric Christopherb6dc8652012-11-27 22:43:45 +00001665// Gather and emit post-function debug information.
Chris Lattnereec791a2010-01-26 23:18:02 +00001666void DwarfDebug::endFunction(const MachineFunction *MF) {
Devang Patelbf47fdb2011-08-10 20:55:27 +00001667 if (!MMI->hasDebugInfo() || LScopes.empty()) return;
Devang Patel70d75ca2009-11-12 19:02:56 +00001668
Devang Patelbf47fdb2011-08-10 20:55:27 +00001669 // Define end label for subprogram.
1670 FunctionEndSym = Asm->GetTempSymbol("func_end",
1671 Asm->getFunctionNumber());
1672 // Assumes in correct section after the entry point.
1673 Asm->OutStreamer.EmitLabel(FunctionEndSym);
Manman Ren43213cf2013-02-05 21:52:47 +00001674 // Set DwarfCompileUnitID in MCContext to default value.
1675 Asm->OutStreamer.getContext().setDwarfCompileUnitID(0);
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001676
Devang Patelbf47fdb2011-08-10 20:55:27 +00001677 SmallPtrSet<const MDNode *, 16> ProcessedVars;
1678 collectVariableInfo(MF, ProcessedVars);
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001679
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001680 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
Devang Patel94c7ddb2011-08-16 22:09:43 +00001681 CompileUnit *TheCU = SPMap.lookup(FnScope->getScopeNode());
Nick Lewycky746cb672011-10-26 22:55:33 +00001682 assert(TheCU && "Unable to find compile unit!");
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001683
Devang Patelbf47fdb2011-08-10 20:55:27 +00001684 // Construct abstract scopes.
Devang Patelcd9f6c52011-08-12 18:10:19 +00001685 ArrayRef<LexicalScope *> AList = LScopes.getAbstractScopesList();
1686 for (unsigned i = 0, e = AList.size(); i != e; ++i) {
1687 LexicalScope *AScope = AList[i];
1688 DISubprogram SP(AScope->getScopeNode());
Devang Patelbf47fdb2011-08-10 20:55:27 +00001689 if (SP.Verify()) {
1690 // Collect info for variables that were optimized out.
Devang Patel93d39be2011-08-19 23:28:12 +00001691 DIArray Variables = SP.getVariables();
1692 for (unsigned i = 0, e = Variables.getNumElements(); i != e; ++i) {
1693 DIVariable DV(Variables.getElement(i));
1694 if (!DV || !DV.Verify() || !ProcessedVars.insert(DV))
1695 continue;
Alexey Samsonovb67bd332012-07-06 08:45:08 +00001696 // Check that DbgVariable for DV wasn't created earlier, when
1697 // findAbstractVariable() was called for inlined instance of DV.
1698 LLVMContext &Ctx = DV->getContext();
1699 DIVariable CleanDV = cleanseInlinedVariable(DV, Ctx);
1700 if (AbstractVariables.lookup(CleanDV))
1701 continue;
Devang Patel93d39be2011-08-19 23:28:12 +00001702 if (LexicalScope *Scope = LScopes.findAbstractScope(DV.getContext()))
1703 addScopeVariable(Scope, new DbgVariable(DV, NULL));
Devang Patel78e127d2010-06-25 22:07:34 +00001704 }
1705 }
Devang Patelcd9f6c52011-08-12 18:10:19 +00001706 if (ProcessedSPNodes.count(AScope->getScopeNode()) == 0)
Manman Ren9174fd72013-05-28 19:01:58 +00001707 // Use the compile unit for the abstract scope to create scope DIEs and
1708 // variable DIEs.
1709 constructScopeDIE(SPMap.lookup(AScope->getScopeNode()), AScope);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001710 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001711
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001712 DIE *CurFnDIE = constructScopeDIE(TheCU, FnScope);
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001713
Nick Lewycky8a8d4792011-12-02 22:16:29 +00001714 if (!MF->getTarget().Options.DisableFramePointerElim(*MF))
Eric Christopher873cf0a2012-08-24 01:14:27 +00001715 TheCU->addFlag(CurFnDIE, dwarf::DW_AT_APPLE_omit_frame_ptr);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001716
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001717 // Clear debug info
Devang Patelbf47fdb2011-08-10 20:55:27 +00001718 for (DenseMap<LexicalScope *, SmallVector<DbgVariable *, 8> >::iterator
1719 I = ScopeVariables.begin(), E = ScopeVariables.end(); I != E; ++I)
1720 DeleteContainerPointers(I->second);
1721 ScopeVariables.clear();
Devang Pateleac0c9d2011-04-22 18:09:57 +00001722 DeleteContainerPointers(CurrentFnArguments);
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001723 UserVariables.clear();
1724 DbgValues.clear();
Jeffrey Yasskin5c213dc2010-03-12 17:45:06 +00001725 AbstractVariables.clear();
Devang Pateleac9c072010-04-27 19:46:33 +00001726 LabelsBeforeInsn.clear();
1727 LabelsAfterInsn.clear();
Devang Patelf2548ca2010-04-16 23:33:45 +00001728 PrevLabel = NULL;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001729}
1730
Eric Christopherb6dc8652012-11-27 22:43:45 +00001731// Register a source line with debug info. Returns the unique label that was
1732// emitted and which provides correspondence to the source line list.
Devang Patel4243e672011-05-11 19:22:19 +00001733void DwarfDebug::recordSourceLine(unsigned Line, unsigned Col, const MDNode *S,
1734 unsigned Flags) {
Devang Patel65dbc902009-11-25 17:36:49 +00001735 StringRef Fn;
Devang Patel23670e52011-03-24 20:30:50 +00001736 StringRef Dir;
Dan Gohman1cc0d622010-05-05 23:41:32 +00001737 unsigned Src = 1;
1738 if (S) {
1739 DIDescriptor Scope(S);
Devang Patelf84548d2009-10-05 18:03:19 +00001740
Dan Gohman1cc0d622010-05-05 23:41:32 +00001741 if (Scope.isCompileUnit()) {
1742 DICompileUnit CU(S);
Dan Gohman1cc0d622010-05-05 23:41:32 +00001743 Fn = CU.getFilename();
Devang Patel23670e52011-03-24 20:30:50 +00001744 Dir = CU.getDirectory();
Devang Patel3cabc9d2010-10-28 17:30:52 +00001745 } else if (Scope.isFile()) {
1746 DIFile F(S);
Devang Patel3cabc9d2010-10-28 17:30:52 +00001747 Fn = F.getFilename();
Devang Patel23670e52011-03-24 20:30:50 +00001748 Dir = F.getDirectory();
Dan Gohman1cc0d622010-05-05 23:41:32 +00001749 } else if (Scope.isSubprogram()) {
1750 DISubprogram SP(S);
Dan Gohman1cc0d622010-05-05 23:41:32 +00001751 Fn = SP.getFilename();
Devang Patel23670e52011-03-24 20:30:50 +00001752 Dir = SP.getDirectory();
Eric Christopher6618a242011-10-11 22:59:11 +00001753 } else if (Scope.isLexicalBlockFile()) {
1754 DILexicalBlockFile DBF(S);
1755 Fn = DBF.getFilename();
1756 Dir = DBF.getDirectory();
Dan Gohman1cc0d622010-05-05 23:41:32 +00001757 } else if (Scope.isLexicalBlock()) {
1758 DILexicalBlock DB(S);
Dan Gohman1cc0d622010-05-05 23:41:32 +00001759 Fn = DB.getFilename();
Devang Patel23670e52011-03-24 20:30:50 +00001760 Dir = DB.getDirectory();
Dan Gohman1cc0d622010-05-05 23:41:32 +00001761 } else
Craig Topper5e25ee82012-02-05 08:31:47 +00001762 llvm_unreachable("Unexpected scope info");
Dan Gohman1cc0d622010-05-05 23:41:32 +00001763
Manman Ren3de61b42013-03-07 01:42:00 +00001764 Src = getOrCreateSourceID(Fn, Dir,
1765 Asm->OutStreamer.getContext().getDwarfCompileUnitID());
Dan Gohman1cc0d622010-05-05 23:41:32 +00001766 }
Nick Lewycky3bbb6f72011-07-29 03:49:23 +00001767 Asm->OutStreamer.EmitDwarfLocDirective(Src, Line, Col, Flags, 0, 0, Fn);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001768}
1769
Bill Wendling829e67b2009-05-20 23:22:40 +00001770//===----------------------------------------------------------------------===//
1771// Emit Methods
1772//===----------------------------------------------------------------------===//
1773
Eric Christopherb6dc8652012-11-27 22:43:45 +00001774// Compute the size and offset of a DIE.
Jim Grosbach7ab38df2009-11-22 19:20:36 +00001775unsigned
Eric Christopher0e3e9b72012-12-10 23:34:43 +00001776DwarfUnits::computeSizeAndOffset(DIE *Die, unsigned Offset) {
Bill Wendling94d04b82009-05-20 23:21:38 +00001777 // Get the children.
1778 const std::vector<DIE *> &Children = Die->getChildren();
1779
Bill Wendling94d04b82009-05-20 23:21:38 +00001780 // Record the abbreviation.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001781 assignAbbrevNumber(Die->getAbbrev());
Bill Wendling94d04b82009-05-20 23:21:38 +00001782
1783 // Get the abbreviation for this DIE.
1784 unsigned AbbrevNumber = Die->getAbbrevNumber();
Eric Christopher0e3e9b72012-12-10 23:34:43 +00001785 const DIEAbbrev *Abbrev = Abbreviations->at(AbbrevNumber - 1);
Bill Wendling94d04b82009-05-20 23:21:38 +00001786
1787 // Set DIE offset
1788 Die->setOffset(Offset);
1789
1790 // Start the size with the size of abbreviation code.
Chris Lattneraf76e592009-08-22 20:48:53 +00001791 Offset += MCAsmInfo::getULEB128Size(AbbrevNumber);
Bill Wendling94d04b82009-05-20 23:21:38 +00001792
Eric Christopherf7cef702013-03-29 23:34:06 +00001793 const SmallVectorImpl<DIEValue*> &Values = Die->getValues();
1794 const SmallVectorImpl<DIEAbbrevData> &AbbrevData = Abbrev->getData();
Bill Wendling94d04b82009-05-20 23:21:38 +00001795
1796 // Size the DIE attribute values.
1797 for (unsigned i = 0, N = Values.size(); i < N; ++i)
1798 // Size attribute value.
Chris Lattnera37d5382010-04-05 00:18:22 +00001799 Offset += Values[i]->SizeOf(Asm, AbbrevData[i].getForm());
Bill Wendling94d04b82009-05-20 23:21:38 +00001800
1801 // Size the DIE children if any.
1802 if (!Children.empty()) {
1803 assert(Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes &&
1804 "Children flag not set");
1805
1806 for (unsigned j = 0, M = Children.size(); j < M; ++j)
Eric Christopherfbd19752012-11-20 22:14:13 +00001807 Offset = computeSizeAndOffset(Children[j], Offset);
Bill Wendling94d04b82009-05-20 23:21:38 +00001808
1809 // End of children marker.
1810 Offset += sizeof(int8_t);
1811 }
1812
1813 Die->setSize(Offset - Die->getOffset());
1814 return Offset;
1815}
1816
Eric Christopherb6dc8652012-11-27 22:43:45 +00001817// Compute the size and offset of all the DIEs.
Eric Christopher0e3e9b72012-12-10 23:34:43 +00001818void DwarfUnits::computeSizeAndOffsets() {
Manman Renbc3e96f2013-03-12 18:27:15 +00001819 // Offset from the beginning of debug info section.
1820 unsigned AccuOffset = 0;
Eric Christopherf7cef702013-03-29 23:34:06 +00001821 for (SmallVectorImpl<CompileUnit *>::iterator I = CUs.begin(),
Eric Christopher0e3e9b72012-12-10 23:34:43 +00001822 E = CUs.end(); I != E; ++I) {
Manman Renbc3e96f2013-03-12 18:27:15 +00001823 (*I)->setDebugInfoOffset(AccuOffset);
Eric Christopher98e237f2012-11-30 23:59:06 +00001824 unsigned Offset =
1825 sizeof(int32_t) + // Length of Compilation Unit Info
1826 sizeof(int16_t) + // DWARF version number
1827 sizeof(int32_t) + // Offset Into Abbrev. Section
1828 sizeof(int8_t); // Pointer Size (in bytes)
1829
Manman Renbc3e96f2013-03-12 18:27:15 +00001830 unsigned EndOffset = computeSizeAndOffset((*I)->getCUDie(), Offset);
1831 AccuOffset += EndOffset;
Devang Patel163a9f72010-05-10 22:49:55 +00001832 }
Bill Wendling94d04b82009-05-20 23:21:38 +00001833}
1834
Eric Christopherb6dc8652012-11-27 22:43:45 +00001835// Emit initial Dwarf sections with a label at the start of each one.
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001836void DwarfDebug::emitSectionLabels() {
Chris Lattner6c2f9e12009-08-19 05:49:37 +00001837 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
Daniel Dunbarf612ff62009-09-19 20:40:05 +00001838
Bill Wendling94d04b82009-05-20 23:21:38 +00001839 // Dwarf sections base addresses.
Jim Grosbach1e20b962010-07-21 21:21:52 +00001840 DwarfInfoSectionSym =
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001841 emitSectionSym(Asm, TLOF.getDwarfInfoSection(), "section_info");
Jim Grosbach1e20b962010-07-21 21:21:52 +00001842 DwarfAbbrevSectionSym =
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001843 emitSectionSym(Asm, TLOF.getDwarfAbbrevSection(), "section_abbrev");
Eric Christopher6eebe472012-12-19 22:02:53 +00001844 if (useSplitDwarf())
1845 DwarfAbbrevDWOSectionSym =
1846 emitSectionSym(Asm, TLOF.getDwarfAbbrevDWOSection(),
1847 "section_abbrev_dwo");
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001848 emitSectionSym(Asm, TLOF.getDwarfARangesSection());
Jim Grosbach1e20b962010-07-21 21:21:52 +00001849
Chris Lattner9c69e285532010-04-04 22:59:04 +00001850 if (const MCSection *MacroInfo = TLOF.getDwarfMacroInfoSection())
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001851 emitSectionSym(Asm, MacroInfo);
Bill Wendling94d04b82009-05-20 23:21:38 +00001852
Eric Christopher7a0103c2013-02-07 21:19:50 +00001853 DwarfLineSectionSym =
1854 emitSectionSym(Asm, TLOF.getDwarfLineSection(), "section_line");
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001855 emitSectionSym(Asm, TLOF.getDwarfLocSection());
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00001856 if (GenerateDwarfPubNamesSection)
1857 emitSectionSym(Asm, TLOF.getDwarfPubNamesSection());
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001858 emitSectionSym(Asm, TLOF.getDwarfPubTypesSection());
Jim Grosbach1e20b962010-07-21 21:21:52 +00001859 DwarfStrSectionSym =
Eric Christopher64f824c2012-12-27 02:14:01 +00001860 emitSectionSym(Asm, TLOF.getDwarfStrSection(), "info_string");
Eric Christopher9a9e73b2013-04-07 03:43:09 +00001861 if (useSplitDwarf()) {
Eric Christopher64f824c2012-12-27 02:14:01 +00001862 DwarfStrDWOSectionSym =
1863 emitSectionSym(Asm, TLOF.getDwarfStrDWOSection(), "skel_string");
Eric Christopher9a9e73b2013-04-07 03:43:09 +00001864 DwarfAddrSectionSym =
1865 emitSectionSym(Asm, TLOF.getDwarfAddrSection(), "addr_sec");
1866 }
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001867 DwarfDebugRangeSectionSym = emitSectionSym(Asm, TLOF.getDwarfRangesSection(),
Devang Patelf2548ca2010-04-16 23:33:45 +00001868 "debug_range");
Bill Wendling94d04b82009-05-20 23:21:38 +00001869
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001870 DwarfDebugLocSectionSym = emitSectionSym(Asm, TLOF.getDwarfLocSection(),
Devang Patelc3f5f782010-05-25 23:40:22 +00001871 "section_debug_loc");
1872
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001873 TextSectionSym = emitSectionSym(Asm, TLOF.getTextSection(), "text_begin");
1874 emitSectionSym(Asm, TLOF.getDataSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00001875}
1876
Eric Christopherb6dc8652012-11-27 22:43:45 +00001877// Recursively emits a debug information entry.
Eric Christopher6eebe472012-12-19 22:02:53 +00001878void DwarfDebug::emitDIE(DIE *Die, std::vector<DIEAbbrev *> *Abbrevs) {
Bill Wendling94d04b82009-05-20 23:21:38 +00001879 // Get the abbreviation for this DIE.
1880 unsigned AbbrevNumber = Die->getAbbrevNumber();
Eric Christopher6eebe472012-12-19 22:02:53 +00001881 const DIEAbbrev *Abbrev = Abbrevs->at(AbbrevNumber - 1);
Bill Wendling94d04b82009-05-20 23:21:38 +00001882
Bill Wendling94d04b82009-05-20 23:21:38 +00001883 // Emit the code (index) for the abbreviation.
Chris Lattner3f53c832010-04-04 18:52:31 +00001884 if (Asm->isVerbose())
Chris Lattner894d75a2010-01-22 23:18:42 +00001885 Asm->OutStreamer.AddComment("Abbrev [" + Twine(AbbrevNumber) + "] 0x" +
1886 Twine::utohexstr(Die->getOffset()) + ":0x" +
1887 Twine::utohexstr(Die->getSize()) + " " +
1888 dwarf::TagString(Abbrev->getTag()));
Chris Lattner7e1a8f82010-04-04 19:09:29 +00001889 Asm->EmitULEB128(AbbrevNumber);
Bill Wendling94d04b82009-05-20 23:21:38 +00001890
Eric Christopherf7cef702013-03-29 23:34:06 +00001891 const SmallVectorImpl<DIEValue*> &Values = Die->getValues();
1892 const SmallVectorImpl<DIEAbbrevData> &AbbrevData = Abbrev->getData();
Bill Wendling94d04b82009-05-20 23:21:38 +00001893
1894 // Emit the DIE attribute values.
1895 for (unsigned i = 0, N = Values.size(); i < N; ++i) {
1896 unsigned Attr = AbbrevData[i].getAttribute();
1897 unsigned Form = AbbrevData[i].getForm();
1898 assert(Form && "Too many attributes for DIE (check abbreviation)");
1899
Chris Lattner3f53c832010-04-04 18:52:31 +00001900 if (Asm->isVerbose())
Chris Lattnera8013622010-01-24 18:54:17 +00001901 Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr));
Jim Grosbach1e20b962010-07-21 21:21:52 +00001902
Bill Wendling94d04b82009-05-20 23:21:38 +00001903 switch (Attr) {
Bill Wendling94d04b82009-05-20 23:21:38 +00001904 case dwarf::DW_AT_abstract_origin: {
1905 DIEEntry *E = cast<DIEEntry>(Values[i]);
1906 DIE *Origin = E->getEntry();
Devang Patel53bb5c92009-11-10 23:06:00 +00001907 unsigned Addr = Origin->getOffset();
Manman Renbc3e96f2013-03-12 18:27:15 +00001908 if (Form == dwarf::DW_FORM_ref_addr) {
1909 // For DW_FORM_ref_addr, output the offset from beginning of debug info
1910 // section. Origin->getOffset() returns the offset from start of the
1911 // compile unit.
1912 DwarfUnits &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
1913 Addr += Holder.getCUOffset(Origin->getCompileUnit());
1914 }
Manman Ren624a93e2013-04-04 23:13:11 +00001915 Asm->EmitInt32(Addr);
Bill Wendling94d04b82009-05-20 23:21:38 +00001916 break;
1917 }
Devang Patelf2548ca2010-04-16 23:33:45 +00001918 case dwarf::DW_AT_ranges: {
1919 // DW_AT_range Value encodes offset in debug_range section.
1920 DIEInteger *V = cast<DIEInteger>(Values[i]);
Devang Patelb1fcfbe2010-09-02 16:43:44 +00001921
Nick Lewyckyffccd922012-06-22 01:25:12 +00001922 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections()) {
Devang Patelb1fcfbe2010-09-02 16:43:44 +00001923 Asm->EmitLabelPlusOffset(DwarfDebugRangeSectionSym,
1924 V->getValue(),
1925 4);
1926 } else {
1927 Asm->EmitLabelOffsetDifference(DwarfDebugRangeSectionSym,
1928 V->getValue(),
1929 DwarfDebugRangeSectionSym,
1930 4);
1931 }
Devang Patelf2548ca2010-04-16 23:33:45 +00001932 break;
1933 }
Devang Patelc3f5f782010-05-25 23:40:22 +00001934 case dwarf::DW_AT_location: {
Nick Lewyckyffccd922012-06-22 01:25:12 +00001935 if (DIELabel *L = dyn_cast<DIELabel>(Values[i])) {
1936 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
1937 Asm->EmitLabelReference(L->getValue(), 4);
1938 else
1939 Asm->EmitLabelDifference(L->getValue(), DwarfDebugLocSectionSym, 4);
1940 } else {
Devang Patelc3f5f782010-05-25 23:40:22 +00001941 Values[i]->EmitValue(Asm, Form);
Nick Lewyckyffccd922012-06-22 01:25:12 +00001942 }
Devang Patelc3f5f782010-05-25 23:40:22 +00001943 break;
1944 }
Devang Patel2a361602010-09-29 19:08:08 +00001945 case dwarf::DW_AT_accessibility: {
1946 if (Asm->isVerbose()) {
1947 DIEInteger *V = cast<DIEInteger>(Values[i]);
1948 Asm->OutStreamer.AddComment(dwarf::AccessibilityString(V->getValue()));
1949 }
1950 Values[i]->EmitValue(Asm, Form);
1951 break;
1952 }
Bill Wendling94d04b82009-05-20 23:21:38 +00001953 default:
1954 // Emit an attribute using the defined form.
Chris Lattnerd38fee82010-04-05 00:13:49 +00001955 Values[i]->EmitValue(Asm, Form);
Bill Wendling94d04b82009-05-20 23:21:38 +00001956 break;
1957 }
Bill Wendling94d04b82009-05-20 23:21:38 +00001958 }
1959
1960 // Emit the DIE children if any.
1961 if (Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes) {
1962 const std::vector<DIE *> &Children = Die->getChildren();
1963
1964 for (unsigned j = 0, M = Children.size(); j < M; ++j)
Eric Christopher6eebe472012-12-19 22:02:53 +00001965 emitDIE(Children[j], Abbrevs);
Bill Wendling94d04b82009-05-20 23:21:38 +00001966
Chris Lattner3f53c832010-04-04 18:52:31 +00001967 if (Asm->isVerbose())
Chris Lattner233f52b2010-03-09 23:52:58 +00001968 Asm->OutStreamer.AddComment("End Of Children Mark");
1969 Asm->EmitInt8(0);
Bill Wendling94d04b82009-05-20 23:21:38 +00001970 }
1971}
1972
Eric Christopherb1e66d02012-12-15 00:04:07 +00001973// Emit the various dwarf units to the unit section USection with
1974// the abbreviations going into ASection.
1975void DwarfUnits::emitUnits(DwarfDebug *DD,
1976 const MCSection *USection,
1977 const MCSection *ASection,
1978 const MCSymbol *ASectionSym) {
1979 Asm->OutStreamer.SwitchSection(USection);
Eric Christopherf7cef702013-03-29 23:34:06 +00001980 for (SmallVectorImpl<CompileUnit *>::iterator I = CUs.begin(),
Eric Christopherb1e66d02012-12-15 00:04:07 +00001981 E = CUs.end(); I != E; ++I) {
1982 CompileUnit *TheCU = *I;
Devang Patel163a9f72010-05-10 22:49:55 +00001983 DIE *Die = TheCU->getCUDie();
Jim Grosbach1e20b962010-07-21 21:21:52 +00001984
Devang Patel163a9f72010-05-10 22:49:55 +00001985 // Emit the compile units header.
Eric Christopherb1e66d02012-12-15 00:04:07 +00001986 Asm->OutStreamer
1987 .EmitLabel(Asm->GetTempSymbol(USection->getLabelBeginName(),
1988 TheCU->getUniqueID()));
Jim Grosbach1e20b962010-07-21 21:21:52 +00001989
Devang Patel163a9f72010-05-10 22:49:55 +00001990 // Emit size of content not including length itself
1991 unsigned ContentSize = Die->getSize() +
1992 sizeof(int16_t) + // DWARF version number
1993 sizeof(int32_t) + // Offset Into Abbrev. Section
Devang Patel65705d52011-04-13 19:41:17 +00001994 sizeof(int8_t); // Pointer Size (in bytes)
Jim Grosbach1e20b962010-07-21 21:21:52 +00001995
Devang Patel163a9f72010-05-10 22:49:55 +00001996 Asm->OutStreamer.AddComment("Length of Compilation Unit Info");
1997 Asm->EmitInt32(ContentSize);
1998 Asm->OutStreamer.AddComment("DWARF version number");
Manman Ren9174fd72013-05-28 19:01:58 +00001999 Asm->EmitInt16((DD->getUseRefAddr() && dwarf::DWARF_VERSION < 3) ?
2000 3 : dwarf::DWARF_VERSION);
Devang Patel163a9f72010-05-10 22:49:55 +00002001 Asm->OutStreamer.AddComment("Offset Into Abbrev. Section");
Eric Christopherb1e66d02012-12-15 00:04:07 +00002002 Asm->EmitSectionOffset(Asm->GetTempSymbol(ASection->getLabelBeginName()),
2003 ASectionSym);
Devang Patel163a9f72010-05-10 22:49:55 +00002004 Asm->OutStreamer.AddComment("Address Size (in bytes)");
Chandler Carruth426c2bf2012-11-01 09:14:31 +00002005 Asm->EmitInt8(Asm->getDataLayout().getPointerSize());
Jim Grosbach1e20b962010-07-21 21:21:52 +00002006
Eric Christopher6eebe472012-12-19 22:02:53 +00002007 DD->emitDIE(Die, Abbreviations);
Eric Christopherb1e66d02012-12-15 00:04:07 +00002008 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol(USection->getLabelEndName(),
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002009 TheCU->getUniqueID()));
Devang Patel163a9f72010-05-10 22:49:55 +00002010 }
Bill Wendling94d04b82009-05-20 23:21:38 +00002011}
2012
Manman Renbc3e96f2013-03-12 18:27:15 +00002013/// For a given compile unit DIE, returns offset from beginning of debug info.
2014unsigned DwarfUnits::getCUOffset(DIE *Die) {
Manman Ren4c6f8952013-03-13 18:41:27 +00002015 assert(Die->getTag() == dwarf::DW_TAG_compile_unit &&
2016 "Input DIE should be compile unit in getCUOffset.");
Eric Christopherf7cef702013-03-29 23:34:06 +00002017 for (SmallVectorImpl<CompileUnit *>::iterator I = CUs.begin(),
Manman Renbc3e96f2013-03-12 18:27:15 +00002018 E = CUs.end(); I != E; ++I) {
2019 CompileUnit *TheCU = *I;
2020 if (TheCU->getCUDie() == Die)
2021 return TheCU->getDebugInfoOffset();
2022 }
Manman Ren4c6f8952013-03-13 18:41:27 +00002023 llvm_unreachable("The compile unit DIE should belong to CUs in DwarfUnits.");
Manman Renbc3e96f2013-03-12 18:27:15 +00002024}
2025
Eric Christopher98e237f2012-11-30 23:59:06 +00002026// Emit the debug info section.
2027void DwarfDebug::emitDebugInfo() {
Eric Christopherb1e66d02012-12-15 00:04:07 +00002028 DwarfUnits &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
2029
2030 Holder.emitUnits(this, Asm->getObjFileLowering().getDwarfInfoSection(),
2031 Asm->getObjFileLowering().getDwarfAbbrevSection(),
2032 DwarfAbbrevSectionSym);
Eric Christopher98e237f2012-11-30 23:59:06 +00002033}
2034
Eric Christopherb6dc8652012-11-27 22:43:45 +00002035// Emit the abbreviation section.
Eric Christopher7dc68db2012-11-20 23:30:11 +00002036void DwarfDebug::emitAbbreviations() {
Eric Christopher6eebe472012-12-19 22:02:53 +00002037 if (!useSplitDwarf())
2038 emitAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevSection(),
2039 &Abbreviations);
2040 else
2041 emitSkeletonAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevSection());
2042}
Bill Wendling94d04b82009-05-20 23:21:38 +00002043
Eric Christopher6eebe472012-12-19 22:02:53 +00002044void DwarfDebug::emitAbbrevs(const MCSection *Section,
2045 std::vector<DIEAbbrev *> *Abbrevs) {
2046 // Check to see if it is worth the effort.
2047 if (!Abbrevs->empty()) {
2048 // Start the debug abbrev section.
2049 Asm->OutStreamer.SwitchSection(Section);
2050
2051 MCSymbol *Begin = Asm->GetTempSymbol(Section->getLabelBeginName());
Eric Christopher44fedba2012-12-13 03:00:38 +00002052 Asm->OutStreamer.EmitLabel(Begin);
Bill Wendling94d04b82009-05-20 23:21:38 +00002053
2054 // For each abbrevation.
Eric Christopher6eebe472012-12-19 22:02:53 +00002055 for (unsigned i = 0, N = Abbrevs->size(); i < N; ++i) {
Bill Wendling94d04b82009-05-20 23:21:38 +00002056 // Get abbreviation data
Eric Christopher6eebe472012-12-19 22:02:53 +00002057 const DIEAbbrev *Abbrev = Abbrevs->at(i);
Bill Wendling94d04b82009-05-20 23:21:38 +00002058
2059 // Emit the abbrevations code (base 1 index.)
Chris Lattner7e1a8f82010-04-04 19:09:29 +00002060 Asm->EmitULEB128(Abbrev->getNumber(), "Abbreviation Code");
Bill Wendling94d04b82009-05-20 23:21:38 +00002061
2062 // Emit the abbreviations data.
Chris Lattnerd38fee82010-04-05 00:13:49 +00002063 Abbrev->Emit(Asm);
Bill Wendling94d04b82009-05-20 23:21:38 +00002064 }
2065
2066 // Mark end of abbreviations.
Chris Lattner7e1a8f82010-04-04 19:09:29 +00002067 Asm->EmitULEB128(0, "EOM(3)");
Bill Wendling94d04b82009-05-20 23:21:38 +00002068
Eric Christopher6eebe472012-12-19 22:02:53 +00002069 MCSymbol *End = Asm->GetTempSymbol(Section->getLabelEndName());
Eric Christopher44fedba2012-12-13 03:00:38 +00002070 Asm->OutStreamer.EmitLabel(End);
Bill Wendling94d04b82009-05-20 23:21:38 +00002071 }
2072}
2073
Eric Christopherb6dc8652012-11-27 22:43:45 +00002074// Emit the last address of the section and the end of the line matrix.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002075void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) {
Bill Wendling94d04b82009-05-20 23:21:38 +00002076 // Define last address of section.
Chris Lattner233f52b2010-03-09 23:52:58 +00002077 Asm->OutStreamer.AddComment("Extended Op");
2078 Asm->EmitInt8(0);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002079
Chris Lattner233f52b2010-03-09 23:52:58 +00002080 Asm->OutStreamer.AddComment("Op size");
Chandler Carruth426c2bf2012-11-01 09:14:31 +00002081 Asm->EmitInt8(Asm->getDataLayout().getPointerSize() + 1);
Chris Lattner233f52b2010-03-09 23:52:58 +00002082 Asm->OutStreamer.AddComment("DW_LNE_set_address");
2083 Asm->EmitInt8(dwarf::DW_LNE_set_address);
2084
2085 Asm->OutStreamer.AddComment("Section end label");
Chris Lattnerd85fc6e2010-03-10 01:17:49 +00002086
Chris Lattnerc0215722010-04-04 19:25:43 +00002087 Asm->OutStreamer.EmitSymbolValue(Asm->GetTempSymbol("section_end",SectionEnd),
Eric Christopherca1dd052013-01-09 01:35:34 +00002088 Asm->getDataLayout().getPointerSize());
Bill Wendling94d04b82009-05-20 23:21:38 +00002089
2090 // Mark end of matrix.
Chris Lattner233f52b2010-03-09 23:52:58 +00002091 Asm->OutStreamer.AddComment("DW_LNE_end_sequence");
2092 Asm->EmitInt8(0);
Chris Lattner0ad9c912010-01-22 22:09:00 +00002093 Asm->EmitInt8(1);
Chris Lattner894d75a2010-01-22 23:18:42 +00002094 Asm->EmitInt8(1);
Bill Wendling94d04b82009-05-20 23:21:38 +00002095}
2096
Eric Christopherb6dc8652012-11-27 22:43:45 +00002097// Emit visible names into a hashed accelerator table section.
Eric Christopher09ac3d82011-11-07 09:24:32 +00002098void DwarfDebug::emitAccelNames() {
2099 DwarfAccelTable AT(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset,
2100 dwarf::DW_FORM_data4));
2101 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2102 E = CUMap.end(); I != E; ++I) {
2103 CompileUnit *TheCU = I->second;
Eric Christopher0ffe2b42011-11-10 19:25:34 +00002104 const StringMap<std::vector<DIE*> > &Names = TheCU->getAccelNames();
2105 for (StringMap<std::vector<DIE*> >::const_iterator
Eric Christopher09ac3d82011-11-07 09:24:32 +00002106 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
Benjamin Kramer03406c42013-05-11 18:24:28 +00002107 StringRef Name = GI->getKey();
Eric Christopherfa03db02012-01-06 23:03:34 +00002108 const std::vector<DIE *> &Entities = GI->second;
Eric Christopher0ffe2b42011-11-10 19:25:34 +00002109 for (std::vector<DIE *>::const_iterator DI = Entities.begin(),
2110 DE = Entities.end(); DI != DE; ++DI)
2111 AT.AddName(Name, (*DI));
Eric Christopher09ac3d82011-11-07 09:24:32 +00002112 }
2113 }
2114
2115 AT.FinalizeTable(Asm, "Names");
2116 Asm->OutStreamer.SwitchSection(
2117 Asm->getObjFileLowering().getDwarfAccelNamesSection());
2118 MCSymbol *SectionBegin = Asm->GetTempSymbol("names_begin");
2119 Asm->OutStreamer.EmitLabel(SectionBegin);
2120
2121 // Emit the full data.
Eric Christopher2e5d8702012-12-20 21:58:36 +00002122 AT.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher09ac3d82011-11-07 09:24:32 +00002123}
2124
Eric Christopher72c16552012-12-20 21:58:40 +00002125// Emit objective C classes and categories into a hashed accelerator table
2126// section.
Eric Christopher09ac3d82011-11-07 09:24:32 +00002127void DwarfDebug::emitAccelObjC() {
2128 DwarfAccelTable AT(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset,
2129 dwarf::DW_FORM_data4));
2130 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2131 E = CUMap.end(); I != E; ++I) {
2132 CompileUnit *TheCU = I->second;
2133 const StringMap<std::vector<DIE*> > &Names = TheCU->getAccelObjC();
2134 for (StringMap<std::vector<DIE*> >::const_iterator
2135 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
Benjamin Kramer03406c42013-05-11 18:24:28 +00002136 StringRef Name = GI->getKey();
Eric Christopherfa03db02012-01-06 23:03:34 +00002137 const std::vector<DIE *> &Entities = GI->second;
Eric Christopher09ac3d82011-11-07 09:24:32 +00002138 for (std::vector<DIE *>::const_iterator DI = Entities.begin(),
2139 DE = Entities.end(); DI != DE; ++DI)
2140 AT.AddName(Name, (*DI));
2141 }
2142 }
2143
2144 AT.FinalizeTable(Asm, "ObjC");
2145 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering()
2146 .getDwarfAccelObjCSection());
2147 MCSymbol *SectionBegin = Asm->GetTempSymbol("objc_begin");
2148 Asm->OutStreamer.EmitLabel(SectionBegin);
2149
2150 // Emit the full data.
Eric Christopher2e5d8702012-12-20 21:58:36 +00002151 AT.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher09ac3d82011-11-07 09:24:32 +00002152}
2153
Eric Christopherb6dc8652012-11-27 22:43:45 +00002154// Emit namespace dies into a hashed accelerator table.
Eric Christopher09ac3d82011-11-07 09:24:32 +00002155void DwarfDebug::emitAccelNamespaces() {
2156 DwarfAccelTable AT(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset,
2157 dwarf::DW_FORM_data4));
2158 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2159 E = CUMap.end(); I != E; ++I) {
2160 CompileUnit *TheCU = I->second;
Eric Christopher8bd36ea2011-11-10 21:47:55 +00002161 const StringMap<std::vector<DIE*> > &Names = TheCU->getAccelNamespace();
2162 for (StringMap<std::vector<DIE*> >::const_iterator
Eric Christopher09ac3d82011-11-07 09:24:32 +00002163 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
Benjamin Kramer03406c42013-05-11 18:24:28 +00002164 StringRef Name = GI->getKey();
Eric Christopherfa03db02012-01-06 23:03:34 +00002165 const std::vector<DIE *> &Entities = GI->second;
Eric Christopher8bd36ea2011-11-10 21:47:55 +00002166 for (std::vector<DIE *>::const_iterator DI = Entities.begin(),
2167 DE = Entities.end(); DI != DE; ++DI)
2168 AT.AddName(Name, (*DI));
Eric Christopher09ac3d82011-11-07 09:24:32 +00002169 }
2170 }
2171
2172 AT.FinalizeTable(Asm, "namespac");
2173 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering()
2174 .getDwarfAccelNamespaceSection());
2175 MCSymbol *SectionBegin = Asm->GetTempSymbol("namespac_begin");
2176 Asm->OutStreamer.EmitLabel(SectionBegin);
2177
2178 // Emit the full data.
Eric Christopher2e5d8702012-12-20 21:58:36 +00002179 AT.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher09ac3d82011-11-07 09:24:32 +00002180}
2181
Eric Christopherb6dc8652012-11-27 22:43:45 +00002182// Emit type dies into a hashed accelerator table.
Eric Christopher09ac3d82011-11-07 09:24:32 +00002183void DwarfDebug::emitAccelTypes() {
Eric Christopherc36145f2012-01-06 04:35:23 +00002184 std::vector<DwarfAccelTable::Atom> Atoms;
2185 Atoms.push_back(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset,
2186 dwarf::DW_FORM_data4));
2187 Atoms.push_back(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeTag,
2188 dwarf::DW_FORM_data2));
2189 Atoms.push_back(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeTypeFlags,
2190 dwarf::DW_FORM_data1));
2191 DwarfAccelTable AT(Atoms);
Eric Christopher09ac3d82011-11-07 09:24:32 +00002192 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2193 E = CUMap.end(); I != E; ++I) {
2194 CompileUnit *TheCU = I->second;
Eric Christopherc36145f2012-01-06 04:35:23 +00002195 const StringMap<std::vector<std::pair<DIE*, unsigned > > > &Names
2196 = TheCU->getAccelTypes();
2197 for (StringMap<std::vector<std::pair<DIE*, unsigned> > >::const_iterator
Eric Christopher09ac3d82011-11-07 09:24:32 +00002198 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
Benjamin Kramer03406c42013-05-11 18:24:28 +00002199 StringRef Name = GI->getKey();
Eric Christopherfa03db02012-01-06 23:03:34 +00002200 const std::vector<std::pair<DIE *, unsigned> > &Entities = GI->second;
Eric Christopherc36145f2012-01-06 04:35:23 +00002201 for (std::vector<std::pair<DIE *, unsigned> >::const_iterator DI
2202 = Entities.begin(), DE = Entities.end(); DI !=DE; ++DI)
2203 AT.AddName(Name, (*DI).first, (*DI).second);
Eric Christopher09ac3d82011-11-07 09:24:32 +00002204 }
2205 }
2206
2207 AT.FinalizeTable(Asm, "types");
2208 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering()
2209 .getDwarfAccelTypesSection());
2210 MCSymbol *SectionBegin = Asm->GetTempSymbol("types_begin");
2211 Asm->OutStreamer.EmitLabel(SectionBegin);
2212
2213 // Emit the full data.
Eric Christopher2e5d8702012-12-20 21:58:36 +00002214 AT.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher09ac3d82011-11-07 09:24:32 +00002215}
2216
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00002217/// emitDebugPubnames - Emit visible names into a debug pubnames section.
2218///
2219void DwarfDebug::emitDebugPubnames() {
2220 const MCSection *ISec = Asm->getObjFileLowering().getDwarfInfoSection();
2221
2222 typedef DenseMap<const MDNode*, CompileUnit*> CUMapType;
2223 for (CUMapType::iterator I = CUMap.begin(), E = CUMap.end(); I != E; ++I) {
2224 CompileUnit *TheCU = I->second;
2225 unsigned ID = TheCU->getUniqueID();
2226
2227 if (TheCU->getGlobalNames().empty())
2228 continue;
2229
2230 // Start the dwarf pubnames section.
2231 Asm->OutStreamer.SwitchSection(
2232 Asm->getObjFileLowering().getDwarfPubNamesSection());
2233
2234 Asm->OutStreamer.AddComment("Length of Public Names Info");
2235 Asm->EmitLabelDifference(Asm->GetTempSymbol("pubnames_end", ID),
2236 Asm->GetTempSymbol("pubnames_begin", ID), 4);
2237
2238 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_begin", ID));
2239
2240 Asm->OutStreamer.AddComment("DWARF Version");
Manman Ren9174fd72013-05-28 19:01:58 +00002241 Asm->EmitInt16((UseRefAddr && dwarf::DWARF_VERSION < 3) ?
2242 3 : dwarf::DWARF_VERSION);
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00002243
2244 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
2245 Asm->EmitSectionOffset(Asm->GetTempSymbol(ISec->getLabelBeginName(), ID),
2246 DwarfInfoSectionSym);
2247
2248 Asm->OutStreamer.AddComment("Compilation Unit Length");
2249 Asm->EmitLabelDifference(Asm->GetTempSymbol(ISec->getLabelEndName(), ID),
2250 Asm->GetTempSymbol(ISec->getLabelBeginName(), ID),
2251 4);
2252
2253 const StringMap<DIE*> &Globals = TheCU->getGlobalNames();
2254 for (StringMap<DIE*>::const_iterator
2255 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2256 const char *Name = GI->getKeyData();
2257 const DIE *Entity = GI->second;
2258
2259 Asm->OutStreamer.AddComment("DIE offset");
2260 Asm->EmitInt32(Entity->getOffset());
2261
2262 if (Asm->isVerbose())
2263 Asm->OutStreamer.AddComment("External Name");
Benjamin Kramer03406c42013-05-11 18:24:28 +00002264 Asm->OutStreamer.EmitBytes(StringRef(Name, GI->getKeyLength()+1), 0);
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00002265 }
2266
2267 Asm->OutStreamer.AddComment("End Mark");
2268 Asm->EmitInt32(0);
2269 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_end", ID));
2270 }
2271}
2272
Devang Patel193f7202009-11-24 01:14:22 +00002273void DwarfDebug::emitDebugPubTypes() {
Devang Patel163a9f72010-05-10 22:49:55 +00002274 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2275 E = CUMap.end(); I != E; ++I) {
2276 CompileUnit *TheCU = I->second;
Eric Christopher63701182011-11-07 09:18:35 +00002277 // Start the dwarf pubtypes section.
Devang Patel163a9f72010-05-10 22:49:55 +00002278 Asm->OutStreamer.SwitchSection(
2279 Asm->getObjFileLowering().getDwarfPubTypesSection());
2280 Asm->OutStreamer.AddComment("Length of Public Types Info");
2281 Asm->EmitLabelDifference(
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002282 Asm->GetTempSymbol("pubtypes_end", TheCU->getUniqueID()),
2283 Asm->GetTempSymbol("pubtypes_begin", TheCU->getUniqueID()), 4);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002284
Devang Patel163a9f72010-05-10 22:49:55 +00002285 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_begin",
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002286 TheCU->getUniqueID()));
Jim Grosbach1e20b962010-07-21 21:21:52 +00002287
Devang Patel163a9f72010-05-10 22:49:55 +00002288 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DWARF Version");
Manman Ren9174fd72013-05-28 19:01:58 +00002289 Asm->EmitInt16((UseRefAddr && dwarf::DWARF_VERSION < 3) ?
2290 3 : dwarf::DWARF_VERSION);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002291
Devang Patel163a9f72010-05-10 22:49:55 +00002292 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
Eric Christophercf6b8ad2012-12-15 00:04:04 +00002293 const MCSection *ISec = Asm->getObjFileLowering().getDwarfInfoSection();
2294 Asm->EmitSectionOffset(Asm->GetTempSymbol(ISec->getLabelBeginName(),
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002295 TheCU->getUniqueID()),
Devang Patel163a9f72010-05-10 22:49:55 +00002296 DwarfInfoSectionSym);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002297
Devang Patel163a9f72010-05-10 22:49:55 +00002298 Asm->OutStreamer.AddComment("Compilation Unit Length");
Eric Christophercf6b8ad2012-12-15 00:04:04 +00002299 Asm->EmitLabelDifference(Asm->GetTempSymbol(ISec->getLabelEndName(),
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002300 TheCU->getUniqueID()),
Eric Christophercf6b8ad2012-12-15 00:04:04 +00002301 Asm->GetTempSymbol(ISec->getLabelBeginName(),
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002302 TheCU->getUniqueID()),
Devang Patel163a9f72010-05-10 22:49:55 +00002303 4);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002304
Devang Patel163a9f72010-05-10 22:49:55 +00002305 const StringMap<DIE*> &Globals = TheCU->getGlobalTypes();
2306 for (StringMap<DIE*>::const_iterator
2307 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2308 const char *Name = GI->getKeyData();
Nick Lewycky3bbb6f72011-07-29 03:49:23 +00002309 DIE *Entity = GI->second;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002310
Devang Patel163a9f72010-05-10 22:49:55 +00002311 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
2312 Asm->EmitInt32(Entity->getOffset());
Jim Grosbach1e20b962010-07-21 21:21:52 +00002313
Devang Patel163a9f72010-05-10 22:49:55 +00002314 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("External Name");
Benjamin Kramer983c4572011-11-09 18:16:11 +00002315 // Emit the name with a terminating null byte.
Eric Christopher68ca5622013-01-09 01:57:54 +00002316 Asm->OutStreamer.EmitBytes(StringRef(Name, GI->getKeyLength()+1));
Devang Patel163a9f72010-05-10 22:49:55 +00002317 }
Jim Grosbach1e20b962010-07-21 21:21:52 +00002318
Devang Patel163a9f72010-05-10 22:49:55 +00002319 Asm->OutStreamer.AddComment("End Mark");
Jim Grosbach1e20b962010-07-21 21:21:52 +00002320 Asm->EmitInt32(0);
Devang Patel163a9f72010-05-10 22:49:55 +00002321 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_end",
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002322 TheCU->getUniqueID()));
Devang Patel193f7202009-11-24 01:14:22 +00002323 }
Devang Patel193f7202009-11-24 01:14:22 +00002324}
2325
Eric Christopher64f824c2012-12-27 02:14:01 +00002326// Emit strings into a string section.
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002327void DwarfUnits::emitStrings(const MCSection *StrSection,
2328 const MCSection *OffsetSection = NULL,
2329 const MCSymbol *StrSecSym = NULL) {
Eric Christopher64f824c2012-12-27 02:14:01 +00002330
Eric Christopherb6714222013-01-08 22:22:06 +00002331 if (StringPool.empty()) return;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002332
Chris Lattner0d9d70f2010-03-09 23:38:23 +00002333 // Start the dwarf str section.
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002334 Asm->OutStreamer.SwitchSection(StrSection);
Bill Wendling94d04b82009-05-20 23:21:38 +00002335
Chris Lattnerbc733f52010-03-13 02:17:42 +00002336 // Get all of the string pool entries and put them in an array by their ID so
2337 // we can sort them.
Jim Grosbach1e20b962010-07-21 21:21:52 +00002338 SmallVector<std::pair<unsigned,
Eric Christopherff348452013-01-07 22:40:45 +00002339 StringMapEntry<std::pair<MCSymbol*, unsigned> >*>, 64> Entries;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002340
Chris Lattnerbc733f52010-03-13 02:17:42 +00002341 for (StringMap<std::pair<MCSymbol*, unsigned> >::iterator
Eric Christopherb6714222013-01-08 22:22:06 +00002342 I = StringPool.begin(), E = StringPool.end();
Eric Christopher72c16552012-12-20 21:58:40 +00002343 I != E; ++I)
Chris Lattnerbc733f52010-03-13 02:17:42 +00002344 Entries.push_back(std::make_pair(I->second.second, &*I));
Jim Grosbach1e20b962010-07-21 21:21:52 +00002345
Chris Lattnerbc733f52010-03-13 02:17:42 +00002346 array_pod_sort(Entries.begin(), Entries.end());
Jim Grosbach1e20b962010-07-21 21:21:52 +00002347
Chris Lattnerbc733f52010-03-13 02:17:42 +00002348 for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
Chris Lattner0d9d70f2010-03-09 23:38:23 +00002349 // Emit a label for reference from debug information entries.
Chris Lattnerbc733f52010-03-13 02:17:42 +00002350 Asm->OutStreamer.EmitLabel(Entries[i].second->getValue().first);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002351
Benjamin Kramer983c4572011-11-09 18:16:11 +00002352 // Emit the string itself with a terminating null byte.
Benjamin Kramer0c45f7d2011-11-09 12:12:04 +00002353 Asm->OutStreamer.EmitBytes(StringRef(Entries[i].second->getKeyData(),
Eric Christopherca1dd052013-01-09 01:35:34 +00002354 Entries[i].second->getKeyLength()+1));
Bill Wendling94d04b82009-05-20 23:21:38 +00002355 }
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002356
2357 // If we've got an offset section go ahead and emit that now as well.
2358 if (OffsetSection) {
2359 Asm->OutStreamer.SwitchSection(OffsetSection);
2360 unsigned offset = 0;
Eric Christopher72f7bfb2013-01-15 23:56:56 +00002361 unsigned size = 4; // FIXME: DWARF64 is 8.
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002362 for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
Eric Christopher1ced2082013-01-09 03:52:05 +00002363 Asm->OutStreamer.EmitIntValue(offset, size);
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002364 offset += Entries[i].second->getKeyLength() + 1;
2365 }
2366 }
Bill Wendling94d04b82009-05-20 23:21:38 +00002367}
2368
Eric Christopher72f7bfb2013-01-15 23:56:56 +00002369// Emit strings into a string section.
2370void DwarfUnits::emitAddresses(const MCSection *AddrSection) {
2371
2372 if (AddressPool.empty()) return;
2373
2374 // Start the dwarf addr section.
2375 Asm->OutStreamer.SwitchSection(AddrSection);
2376
2377 // Get all of the string pool entries and put them in an array by their ID so
2378 // we can sort them.
2379 SmallVector<std::pair<unsigned,
2380 std::pair<MCSymbol*, unsigned>* >, 64> Entries;
2381
2382 for (DenseMap<MCSymbol*, std::pair<MCSymbol*, unsigned> >::iterator
2383 I = AddressPool.begin(), E = AddressPool.end();
2384 I != E; ++I)
2385 Entries.push_back(std::make_pair(I->second.second, &(I->second)));
2386
2387 array_pod_sort(Entries.begin(), Entries.end());
2388
2389 for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
2390 // Emit a label for reference from debug information entries.
2391 MCSymbol *Sym = Entries[i].second->first;
2392 if (Sym)
2393 Asm->EmitLabelReference(Entries[i].second->first,
2394 Asm->getDataLayout().getPointerSize());
2395 else
2396 Asm->OutStreamer.EmitIntValue(0, Asm->getDataLayout().getPointerSize());
2397 }
2398
2399}
2400
Eric Christopher64f824c2012-12-27 02:14:01 +00002401// Emit visible names into a debug str section.
2402void DwarfDebug::emitDebugStr() {
2403 DwarfUnits &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
2404 Holder.emitStrings(Asm->getObjFileLowering().getDwarfStrSection());
2405}
2406
Eric Christopherb6dc8652012-11-27 22:43:45 +00002407// Emit visible names into a debug loc section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002408void DwarfDebug::emitDebugLoc() {
Devang Patel80250682010-05-26 23:55:23 +00002409 if (DotDebugLocEntries.empty())
2410 return;
2411
Eric Christopherf7cef702013-03-29 23:34:06 +00002412 for (SmallVectorImpl<DotDebugLocEntry>::iterator
Devang Patel6c3ea902011-02-04 22:57:18 +00002413 I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
2414 I != E; ++I) {
2415 DotDebugLocEntry &Entry = *I;
2416 if (I + 1 != DotDebugLocEntries.end())
2417 Entry.Merge(I+1);
2418 }
2419
Daniel Dunbar83320a02011-03-16 22:16:39 +00002420 // Start the dwarf loc section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002421 Asm->OutStreamer.SwitchSection(
Devang Patelc3f5f782010-05-25 23:40:22 +00002422 Asm->getObjFileLowering().getDwarfLocSection());
Chandler Carruth426c2bf2012-11-01 09:14:31 +00002423 unsigned char Size = Asm->getDataLayout().getPointerSize();
Devang Patel80250682010-05-26 23:55:23 +00002424 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", 0));
2425 unsigned index = 1;
Eric Christopherf7cef702013-03-29 23:34:06 +00002426 for (SmallVectorImpl<DotDebugLocEntry>::iterator
Jim Grosbach1e20b962010-07-21 21:21:52 +00002427 I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
Devang Patel61409622010-07-07 20:12:52 +00002428 I != E; ++I, ++index) {
Devang Patel6c3ea902011-02-04 22:57:18 +00002429 DotDebugLocEntry &Entry = *I;
2430 if (Entry.isMerged()) continue;
Devang Patelc3f5f782010-05-25 23:40:22 +00002431 if (Entry.isEmpty()) {
Eric Christopherca1dd052013-01-09 01:35:34 +00002432 Asm->OutStreamer.EmitIntValue(0, Size);
2433 Asm->OutStreamer.EmitIntValue(0, Size);
Devang Patel80250682010-05-26 23:55:23 +00002434 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", index));
Devang Patelc3f5f782010-05-25 23:40:22 +00002435 } else {
Eric Christopher1ced2082013-01-09 03:52:05 +00002436 Asm->OutStreamer.EmitSymbolValue(Entry.Begin, Size);
2437 Asm->OutStreamer.EmitSymbolValue(Entry.End, Size);
Devang Patelc26f5442011-04-28 02:22:40 +00002438 DIVariable DV(Entry.Variable);
Rafael Espindola5b23b7f2011-05-27 22:05:41 +00002439 Asm->OutStreamer.AddComment("Loc expr size");
2440 MCSymbol *begin = Asm->OutStreamer.getContext().CreateTempSymbol();
2441 MCSymbol *end = Asm->OutStreamer.getContext().CreateTempSymbol();
2442 Asm->EmitLabelDifference(end, begin, 2);
2443 Asm->OutStreamer.EmitLabel(begin);
Devang Patel80efd4e2011-07-08 16:49:43 +00002444 if (Entry.isInt()) {
Devang Patelc4329072011-06-01 22:03:25 +00002445 DIBasicType BTy(DV.getType());
2446 if (BTy.Verify() &&
Eric Christopher0f1c7f62012-11-19 22:42:10 +00002447 (BTy.getEncoding() == dwarf::DW_ATE_signed
Devang Patelc4329072011-06-01 22:03:25 +00002448 || BTy.getEncoding() == dwarf::DW_ATE_signed_char)) {
2449 Asm->OutStreamer.AddComment("DW_OP_consts");
2450 Asm->EmitInt8(dwarf::DW_OP_consts);
Devang Patel80efd4e2011-07-08 16:49:43 +00002451 Asm->EmitSLEB128(Entry.getInt());
Devang Patelc4329072011-06-01 22:03:25 +00002452 } else {
2453 Asm->OutStreamer.AddComment("DW_OP_constu");
2454 Asm->EmitInt8(dwarf::DW_OP_constu);
Devang Patel80efd4e2011-07-08 16:49:43 +00002455 Asm->EmitULEB128(Entry.getInt());
Devang Patelc4329072011-06-01 22:03:25 +00002456 }
Devang Patel80efd4e2011-07-08 16:49:43 +00002457 } else if (Entry.isLocation()) {
Eric Christopher0f1c7f62012-11-19 22:42:10 +00002458 if (!DV.hasComplexAddress())
Devang Patel80efd4e2011-07-08 16:49:43 +00002459 // Regular entry.
Devang Patelc26f5442011-04-28 02:22:40 +00002460 Asm->EmitDwarfRegOp(Entry.Loc);
Devang Patel80efd4e2011-07-08 16:49:43 +00002461 else {
2462 // Complex address entry.
2463 unsigned N = DV.getNumAddrElements();
2464 unsigned i = 0;
2465 if (N >= 2 && DV.getAddrElement(0) == DIBuilder::OpPlus) {
2466 if (Entry.Loc.getOffset()) {
2467 i = 2;
2468 Asm->EmitDwarfRegOp(Entry.Loc);
2469 Asm->OutStreamer.AddComment("DW_OP_deref");
2470 Asm->EmitInt8(dwarf::DW_OP_deref);
2471 Asm->OutStreamer.AddComment("DW_OP_plus_uconst");
2472 Asm->EmitInt8(dwarf::DW_OP_plus_uconst);
2473 Asm->EmitSLEB128(DV.getAddrElement(1));
2474 } else {
2475 // If first address element is OpPlus then emit
2476 // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
2477 MachineLocation Loc(Entry.Loc.getReg(), DV.getAddrElement(1));
2478 Asm->EmitDwarfRegOp(Loc);
2479 i = 2;
2480 }
2481 } else {
2482 Asm->EmitDwarfRegOp(Entry.Loc);
2483 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +00002484
Devang Patel80efd4e2011-07-08 16:49:43 +00002485 // Emit remaining complex address elements.
2486 for (; i < N; ++i) {
2487 uint64_t Element = DV.getAddrElement(i);
2488 if (Element == DIBuilder::OpPlus) {
2489 Asm->EmitInt8(dwarf::DW_OP_plus_uconst);
2490 Asm->EmitULEB128(DV.getAddrElement(++i));
Eric Christopher50120762012-05-08 18:56:00 +00002491 } else if (Element == DIBuilder::OpDeref) {
Eric Christophera80f2d12012-05-08 21:24:39 +00002492 if (!Entry.Loc.isReg())
Eric Christopher50120762012-05-08 18:56:00 +00002493 Asm->EmitInt8(dwarf::DW_OP_deref);
2494 } else
2495 llvm_unreachable("unknown Opcode found in complex address");
Devang Patel80efd4e2011-07-08 16:49:43 +00002496 }
Devang Patelc26f5442011-04-28 02:22:40 +00002497 }
Devang Patelc26f5442011-04-28 02:22:40 +00002498 }
Devang Patel80efd4e2011-07-08 16:49:43 +00002499 // else ... ignore constant fp. There is not any good way to
2500 // to represent them here in dwarf.
Rafael Espindola5b23b7f2011-05-27 22:05:41 +00002501 Asm->OutStreamer.EmitLabel(end);
Devang Patelc3f5f782010-05-25 23:40:22 +00002502 }
2503 }
Bill Wendling94d04b82009-05-20 23:21:38 +00002504}
2505
Eric Christopherb6dc8652012-11-27 22:43:45 +00002506// Emit visible names into a debug aranges section.
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00002507void DwarfDebug::emitDebugARanges() {
Bill Wendling94d04b82009-05-20 23:21:38 +00002508 // Start the dwarf aranges section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002509 Asm->OutStreamer.SwitchSection(
2510 Asm->getObjFileLowering().getDwarfARangesSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002511}
2512
Eric Christopherb6dc8652012-11-27 22:43:45 +00002513// Emit visible names into a debug ranges section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002514void DwarfDebug::emitDebugRanges() {
Bill Wendling94d04b82009-05-20 23:21:38 +00002515 // Start the dwarf ranges section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002516 Asm->OutStreamer.SwitchSection(
Devang Patelf2548ca2010-04-16 23:33:45 +00002517 Asm->getObjFileLowering().getDwarfRangesSection());
Chandler Carruth426c2bf2012-11-01 09:14:31 +00002518 unsigned char Size = Asm->getDataLayout().getPointerSize();
Eric Christopherf7cef702013-03-29 23:34:06 +00002519 for (SmallVectorImpl<const MCSymbol *>::iterator
Jim Grosbach1e20b962010-07-21 21:21:52 +00002520 I = DebugRangeSymbols.begin(), E = DebugRangeSymbols.end();
Devang Pateleac9c072010-04-27 19:46:33 +00002521 I != E; ++I) {
2522 if (*I)
Eric Christopher1ced2082013-01-09 03:52:05 +00002523 Asm->OutStreamer.EmitSymbolValue(const_cast<MCSymbol*>(*I), Size);
Devang Patelf2548ca2010-04-16 23:33:45 +00002524 else
Eric Christopherca1dd052013-01-09 01:35:34 +00002525 Asm->OutStreamer.EmitIntValue(0, Size);
Devang Patelf2548ca2010-04-16 23:33:45 +00002526 }
Bill Wendling94d04b82009-05-20 23:21:38 +00002527}
2528
Eric Christopherb6dc8652012-11-27 22:43:45 +00002529// Emit visible names into a debug macinfo section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002530void DwarfDebug::emitDebugMacInfo() {
Daniel Dunbarf612ff62009-09-19 20:40:05 +00002531 if (const MCSection *LineInfo =
Chris Lattner18a4c162009-08-02 07:24:22 +00002532 Asm->getObjFileLowering().getDwarfMacroInfoSection()) {
Bill Wendling94d04b82009-05-20 23:21:38 +00002533 // Start the dwarf macinfo section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002534 Asm->OutStreamer.SwitchSection(LineInfo);
Bill Wendling94d04b82009-05-20 23:21:38 +00002535 }
2536}
2537
Eric Christopherb6dc8652012-11-27 22:43:45 +00002538// Emit inline info using following format.
2539// Section Header:
2540// 1. length of section
2541// 2. Dwarf version number
2542// 3. address size.
2543//
2544// Entries (one "entry" for each function that was inlined):
2545//
2546// 1. offset into __debug_str section for MIPS linkage name, if exists;
2547// otherwise offset into __debug_str for regular function name.
2548// 2. offset into __debug_str section for regular function name.
2549// 3. an unsigned LEB128 number indicating the number of distinct inlining
2550// instances for the function.
2551//
2552// The rest of the entry consists of a {die_offset, low_pc} pair for each
2553// inlined instance; the die_offset points to the inlined_subroutine die in the
2554// __debug_info section, and the low_pc is the starting address for the
2555// inlining instance.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002556void DwarfDebug::emitDebugInlineInfo() {
Eric Christopherb83e2bb2012-03-02 02:11:47 +00002557 if (!Asm->MAI->doesDwarfUseInlineInfoSection())
Bill Wendling94d04b82009-05-20 23:21:38 +00002558 return;
2559
Devang Patel163a9f72010-05-10 22:49:55 +00002560 if (!FirstCU)
Bill Wendling94d04b82009-05-20 23:21:38 +00002561 return;
2562
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002563 Asm->OutStreamer.SwitchSection(
2564 Asm->getObjFileLowering().getDwarfDebugInlineSection());
Chris Lattner0ad9c912010-01-22 22:09:00 +00002565
Chris Lattner233f52b2010-03-09 23:52:58 +00002566 Asm->OutStreamer.AddComment("Length of Debug Inlined Information Entry");
Chris Lattnera6437182010-04-04 19:58:12 +00002567 Asm->EmitLabelDifference(Asm->GetTempSymbol("debug_inlined_end", 1),
2568 Asm->GetTempSymbol("debug_inlined_begin", 1), 4);
Bill Wendling94d04b82009-05-20 23:21:38 +00002569
Chris Lattnerc0215722010-04-04 19:25:43 +00002570 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_begin", 1));
Bill Wendling94d04b82009-05-20 23:21:38 +00002571
Chris Lattner233f52b2010-03-09 23:52:58 +00002572 Asm->OutStreamer.AddComment("Dwarf Version");
Manman Ren9174fd72013-05-28 19:01:58 +00002573 Asm->EmitInt16((UseRefAddr && dwarf::DWARF_VERSION < 3) ?
2574 3 : dwarf::DWARF_VERSION);
Chris Lattner233f52b2010-03-09 23:52:58 +00002575 Asm->OutStreamer.AddComment("Address Size (in bytes)");
Chandler Carruth426c2bf2012-11-01 09:14:31 +00002576 Asm->EmitInt8(Asm->getDataLayout().getPointerSize());
Bill Wendling94d04b82009-05-20 23:21:38 +00002577
Eric Christopherf7cef702013-03-29 23:34:06 +00002578 for (SmallVectorImpl<const MDNode *>::iterator I = InlinedSPNodes.begin(),
Devang Patel53bb5c92009-11-10 23:06:00 +00002579 E = InlinedSPNodes.end(); I != E; ++I) {
Jim Grosbach31ef40e2009-11-21 23:12:12 +00002580
Devang Patele9f8f5e2010-05-07 20:54:48 +00002581 const MDNode *Node = *I;
2582 DenseMap<const MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator II
Jim Grosbach7ab38df2009-11-22 19:20:36 +00002583 = InlineInfo.find(Node);
Eric Christopherf7cef702013-03-29 23:34:06 +00002584 SmallVectorImpl<InlineInfoLabels> &Labels = II->second;
Devang Patele4b27562009-08-28 23:24:31 +00002585 DISubprogram SP(Node);
Devang Patel65dbc902009-11-25 17:36:49 +00002586 StringRef LName = SP.getLinkageName();
2587 StringRef Name = SP.getName();
Bill Wendling94d04b82009-05-20 23:21:38 +00002588
Chris Lattner233f52b2010-03-09 23:52:58 +00002589 Asm->OutStreamer.AddComment("MIPS linkage name");
Eric Christopher50e26612012-03-02 01:57:52 +00002590 if (LName.empty())
Eric Christopher2e5d8702012-12-20 21:58:36 +00002591 Asm->EmitSectionOffset(InfoHolder.getStringPoolEntry(Name),
2592 DwarfStrSectionSym);
Eric Christopher50e26612012-03-02 01:57:52 +00002593 else
Eric Christopher2e5d8702012-12-20 21:58:36 +00002594 Asm->EmitSectionOffset(InfoHolder
2595 .getStringPoolEntry(getRealLinkageName(LName)),
Chris Lattner6189ed12010-04-04 23:25:33 +00002596 DwarfStrSectionSym);
Devang Patel53bb5c92009-11-10 23:06:00 +00002597
Chris Lattner233f52b2010-03-09 23:52:58 +00002598 Asm->OutStreamer.AddComment("Function name");
Eric Christopher2e5d8702012-12-20 21:58:36 +00002599 Asm->EmitSectionOffset(InfoHolder.getStringPoolEntry(Name),
2600 DwarfStrSectionSym);
Chris Lattner7e1a8f82010-04-04 19:09:29 +00002601 Asm->EmitULEB128(Labels.size(), "Inline count");
Bill Wendling94d04b82009-05-20 23:21:38 +00002602
Eric Christopherf7cef702013-03-29 23:34:06 +00002603 for (SmallVectorImpl<InlineInfoLabels>::iterator LI = Labels.begin(),
Bill Wendling94d04b82009-05-20 23:21:38 +00002604 LE = Labels.end(); LI != LE; ++LI) {
Chris Lattner3f53c832010-04-04 18:52:31 +00002605 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
Chris Lattner6ed0f902010-03-09 00:31:02 +00002606 Asm->EmitInt32(LI->second->getOffset());
Bill Wendling94d04b82009-05-20 23:21:38 +00002607
Chris Lattner3f53c832010-04-04 18:52:31 +00002608 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("low_pc");
Chris Lattnerd38fee82010-04-05 00:13:49 +00002609 Asm->OutStreamer.EmitSymbolValue(LI->first,
Eric Christopher1ced2082013-01-09 03:52:05 +00002610 Asm->getDataLayout().getPointerSize());
Bill Wendling94d04b82009-05-20 23:21:38 +00002611 }
2612 }
2613
Chris Lattnerc0215722010-04-04 19:25:43 +00002614 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_end", 1));
Bill Wendling94d04b82009-05-20 23:21:38 +00002615}
Eric Christopher98e237f2012-11-30 23:59:06 +00002616
Eric Christopher0b944ee2012-12-11 19:42:09 +00002617// DWARF5 Experimental Separate Dwarf emitters.
Eric Christopher98e237f2012-11-30 23:59:06 +00002618
2619// This DIE has the following attributes: DW_AT_comp_dir, DW_AT_stmt_list,
2620// DW_AT_low_pc, DW_AT_high_pc, DW_AT_ranges, DW_AT_dwo_name, DW_AT_dwo_id,
2621// DW_AT_ranges_base, DW_AT_addr_base. If DW_AT_ranges is present,
2622// DW_AT_low_pc and DW_AT_high_pc are not used, and vice versa.
Eric Christopher4daaed12012-12-10 19:51:21 +00002623CompileUnit *DwarfDebug::constructSkeletonCU(const MDNode *N) {
Eric Christopher98e237f2012-11-30 23:59:06 +00002624 DICompileUnit DIUnit(N);
Eric Christopher98e237f2012-11-30 23:59:06 +00002625 CompilationDir = DIUnit.getDirectory();
Eric Christopher98e237f2012-11-30 23:59:06 +00002626
2627 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002628 CompileUnit *NewCU = new CompileUnit(GlobalCUIndexCount++,
Eric Christopher9c57ad22013-05-08 00:58:51 +00002629 DIUnit.getLanguage(), Die, N, Asm,
Eric Christopher64f824c2012-12-27 02:14:01 +00002630 this, &SkeletonHolder);
Eric Christopher446b88f2013-01-17 03:00:04 +00002631
Eric Christopher3ce51a92013-02-22 23:50:08 +00002632 NewCU->addLocalString(Die, dwarf::DW_AT_GNU_dwo_name,
2633 DIUnit.getSplitDebugFilename());
Eric Christopher98e237f2012-11-30 23:59:06 +00002634
Eric Christopher208cc6f2013-02-05 07:31:55 +00002635 // This should be a unique identifier when we want to build .dwp files.
2636 NewCU->addUInt(Die, dwarf::DW_AT_GNU_dwo_id, dwarf::DW_FORM_data8, 0);
Eric Christopherd96c72a2013-01-17 02:59:59 +00002637
Eric Christopher1b0cd2f2013-04-22 07:51:08 +00002638 // Relocate to the beginning of the addr_base section, else 0 for the
2639 // beginning of the one for this compile unit.
Eric Christopher9a9e73b2013-04-07 03:43:09 +00002640 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
2641 NewCU->addLabel(Die, dwarf::DW_AT_GNU_addr_base, dwarf::DW_FORM_sec_offset,
2642 DwarfAddrSectionSym);
2643 else
Eric Christopher1b0cd2f2013-04-22 07:51:08 +00002644 NewCU->addUInt(Die, dwarf::DW_AT_GNU_addr_base,
2645 dwarf::DW_FORM_sec_offset, 0);
Eric Christopher98e237f2012-11-30 23:59:06 +00002646
2647 // 2.17.1 requires that we use DW_AT_low_pc for a single entry point
Eric Christopher72f7bfb2013-01-15 23:56:56 +00002648 // into an entity. We're using 0, or a NULL label for this.
Eric Christopher98e237f2012-11-30 23:59:06 +00002649 NewCU->addUInt(Die, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, 0);
Eric Christopher72f7bfb2013-01-15 23:56:56 +00002650
Eric Christopher98e237f2012-11-30 23:59:06 +00002651 // DW_AT_stmt_list is a offset of line number information for this
2652 // compile unit in debug_line section.
Eric Christopher9a9e73b2013-04-07 03:43:09 +00002653 // FIXME: Should handle multiple compile units.
Eric Christopher98e237f2012-11-30 23:59:06 +00002654 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
Eric Christopher446b88f2013-01-17 03:00:04 +00002655 NewCU->addLabel(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_sec_offset,
Eric Christopher7a0103c2013-02-07 21:19:50 +00002656 DwarfLineSectionSym);
Eric Christopher98e237f2012-11-30 23:59:06 +00002657 else
Eric Christopher446b88f2013-01-17 03:00:04 +00002658 NewCU->addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_sec_offset, 0);
Eric Christopher98e237f2012-11-30 23:59:06 +00002659
2660 if (!CompilationDir.empty())
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002661 NewCU->addLocalString(Die, dwarf::DW_AT_comp_dir, CompilationDir);
Eric Christopher98e237f2012-11-30 23:59:06 +00002662
Eric Christopher0e3e9b72012-12-10 23:34:43 +00002663 SkeletonHolder.addUnit(NewCU);
Eric Christopher01776a52013-02-06 21:53:56 +00002664 SkeletonCUs.push_back(NewCU);
Eric Christopher0e3e9b72012-12-10 23:34:43 +00002665
Eric Christopher98e237f2012-11-30 23:59:06 +00002666 return NewCU;
2667}
2668
Eric Christopher6eebe472012-12-19 22:02:53 +00002669void DwarfDebug::emitSkeletonAbbrevs(const MCSection *Section) {
2670 assert(useSplitDwarf() && "No split dwarf debug info?");
2671 emitAbbrevs(Section, &SkeletonAbbrevs);
Eric Christopher98e237f2012-11-30 23:59:06 +00002672}
2673
Eric Christopher0b944ee2012-12-11 19:42:09 +00002674// Emit the .debug_info.dwo section for separated dwarf. This contains the
2675// compile units that would normally be in debug_info.
Eric Christopher98e237f2012-11-30 23:59:06 +00002676void DwarfDebug::emitDebugInfoDWO() {
Eric Christopher4daaed12012-12-10 19:51:21 +00002677 assert(useSplitDwarf() && "No split dwarf debug info?");
Eric Christopherb1e66d02012-12-15 00:04:07 +00002678 InfoHolder.emitUnits(this, Asm->getObjFileLowering().getDwarfInfoDWOSection(),
Eric Christopher6eebe472012-12-19 22:02:53 +00002679 Asm->getObjFileLowering().getDwarfAbbrevDWOSection(),
2680 DwarfAbbrevDWOSectionSym);
2681}
2682
2683// Emit the .debug_abbrev.dwo section for separated dwarf. This contains the
2684// abbreviations for the .debug_info.dwo section.
2685void DwarfDebug::emitDebugAbbrevDWO() {
2686 assert(useSplitDwarf() && "No split dwarf?");
Eric Christopher72c16552012-12-20 21:58:40 +00002687 emitAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevDWOSection(),
2688 &Abbreviations);
Eric Christopher98e237f2012-11-30 23:59:06 +00002689}
Eric Christopher64f824c2012-12-27 02:14:01 +00002690
2691// Emit the .debug_str.dwo section for separated dwarf. This contains the
2692// string section and is identical in format to traditional .debug_str
2693// sections.
2694void DwarfDebug::emitDebugStrDWO() {
2695 assert(useSplitDwarf() && "No split dwarf?");
Eric Christopherff348452013-01-07 22:40:45 +00002696 const MCSection *OffSec = Asm->getObjFileLowering()
2697 .getDwarfStrOffDWOSection();
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002698 const MCSymbol *StrSym = DwarfStrSectionSym;
2699 InfoHolder.emitStrings(Asm->getObjFileLowering().getDwarfStrDWOSection(),
2700 OffSec, StrSym);
Eric Christopher64f824c2012-12-27 02:14:01 +00002701}