blob: dd233eaa1bcc98e523ea0451f7dcd197b0839278 [file] [log] [blame]
Bill Wendling2f921f82009-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 Lattnerb14490d2010-03-09 00:39:24 +000013
Devang Patel80ae3492009-08-28 23:24:31 +000014#define DEBUG_TYPE "dwarfdebug"
Bill Wendling2f921f82009-05-15 09:23:25 +000015#include "DwarfDebug.h"
Chris Lattner3f3fb972010-04-05 05:24:55 +000016#include "DIE.h"
Eric Christopher4996c702011-11-07 09:24:32 +000017#include "DwarfAccelTable.h"
Devang Patel5eb43192011-04-12 17:40:32 +000018#include "DwarfCompileUnit.h"
Chandler Carruthed0881b2012-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 Greene829b3e82009-08-19 21:52:55 +000023#include "llvm/CodeGen/MachineFunction.h"
Bill Wendling2f921f82009-05-15 09:23:25 +000024#include "llvm/CodeGen/MachineModuleInfo.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000025#include "llvm/DIBuilder.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000026#include "llvm/DebugInfo.h"
Chandler Carruth9fb823b2013-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 Lattnere13c3722010-03-09 01:58:53 +000031#include "llvm/MC/MCAsmInfo.h"
Chris Lattner4d2c0f92009-07-31 18:48:30 +000032#include "llvm/MC/MCSection.h"
Chris Lattner4b7dadb2009-08-19 05:49:37 +000033#include "llvm/MC/MCStreamer.h"
Chris Lattnere13c3722010-03-09 01:58:53 +000034#include "llvm/MC/MCSymbol.h"
Devang Patel6c74a872010-04-27 19:46:33 +000035#include "llvm/Support/CommandLine.h"
Daniel Dunbarcdf01b52009-10-13 06:47:08 +000036#include "llvm/Support/Debug.h"
37#include "llvm/Support/ErrorHandling.h"
Chris Lattnerf5c834f2010-01-22 22:09:00 +000038#include "llvm/Support/FormattedStream.h"
Michael J. Spencer447762d2010-11-29 18:16:10 +000039#include "llvm/Support/Path.h"
Chandler Carruthed0881b2012-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 Wendling2f921f82009-05-15 09:23:25 +000047using namespace llvm;
48
Jim Grosbacha8683bb2010-07-21 21:21:52 +000049static cl::opt<bool> DisableDebugInfoPrinting("disable-debug-info-print",
Devang Patel30265c42010-07-07 20:12:52 +000050 cl::Hidden,
Devang Patel6c74a872010-04-27 19:46:33 +000051 cl::desc("Disable debug info printing"));
52
Dan Gohman7421ae42010-05-07 01:08:53 +000053static cl::opt<bool> UnknownLocations("use-unknown-locations", cl::Hidden,
Chris Lattner0ab5e2c2011-04-15 05:18:47 +000054 cl::desc("Make an absence of debug location information explicit."),
Dan Gohman7421ae42010-05-07 01:08:53 +000055 cl::init(false));
56
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +000057static cl::opt<bool> GenerateDwarfPubNamesSection("generate-dwarf-pubnames",
Eric Christopher55909492013-04-03 05:26:07 +000058 cl::Hidden, cl::init(false),
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +000059 cl::desc("Generate DWARF pubnames section"));
60
Eric Christopher20b76a72012-08-23 22:36:40 +000061namespace {
62 enum DefaultOnOff {
63 Default, Enable, Disable
64 };
65}
Eric Christopher4996c702011-11-07 09:24:32 +000066
Eric Christopher20b76a72012-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 Christopher978fbff2012-08-23 07:10:46 +000077 cl::desc("Compatibility with Darwin gdb."),
Eric Christopher20b76a72012-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 Christopher978fbff2012-08-23 07:10:46 +000084
Eric Christophercdf218d2012-12-10 19:51:21 +000085static cl::opt<DefaultOnOff> SplitDwarf("split-dwarf", cl::Hidden,
86 cl::desc("Output prototype dwarf split debug info."),
Eric Christopher29424312012-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 Wendlingfcc14142010-04-07 09:28:04 +000094namespace {
95 const char *DWARFGroupName = "DWARF Emission";
96 const char *DbgTimerName = "DWARF Debug Writer";
David Blaikie684fc532013-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 Wendlingfcc14142010-04-07 09:28:04 +0000103} // end anonymous namespace
104
Bill Wendling2f921f82009-05-15 09:23:25 +0000105//===----------------------------------------------------------------------===//
106
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000107// Configuration values for initial hash set sizes (log2).
108//
Bill Wendling2f921f82009-05-15 09:23:25 +0000109static const unsigned InitAbbreviationsSetSize = 9; // log2(512)
Bill Wendling2f921f82009-05-15 09:23:25 +0000110
111namespace llvm {
112
Nick Lewycky019d2552011-07-29 03:49:23 +0000113DIType DbgVariable::getType() const {
Devang Patelf20c4f72011-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 Christopher6a841382012-11-19 22:42:10 +0000124
Devang Patelf20c4f72011-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 Christopher6a841382012-11-19 22:42:10 +0000127
Devang Patelf20c4f72011-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 Christopher6a841382012-11-19 22:42:10 +0000133
Devang Patelf20c4f72011-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 Christopher6a841382012-11-19 22:42:10 +0000136
Devang Patelf20c4f72011-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 Christopher6a841382012-11-19 22:42:10 +0000144
Devang Patelf20c4f72011-04-12 22:53:02 +0000145 if (tag == dwarf::DW_TAG_pointer_type) {
146 DIDerivedType DTy = DIDerivedType(Ty);
147 subType = DTy.getTypeDerivedFrom();
148 }
Eric Christopher6a841382012-11-19 22:42:10 +0000149
Devang Patelf20c4f72011-04-12 22:53:02 +0000150 DICompositeType blockStruct = DICompositeType(subType);
151 DIArray Elements = blockStruct.getTypeArray();
Eric Christopher6a841382012-11-19 22:42:10 +0000152
Devang Patelf20c4f72011-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 Patel6d9f9fe2010-08-09 21:01:39 +0000158 }
Devang Patel6d9f9fe2010-08-09 21:01:39 +0000159 }
Devang Patelf20c4f72011-04-12 22:53:02 +0000160 return Ty;
161}
Bill Wendling2f921f82009-05-15 09:23:25 +0000162
Chris Lattnerf5d06362010-04-05 04:09:20 +0000163} // end llvm namespace
Bill Wendling2f921f82009-05-15 09:23:25 +0000164
Chris Lattnerf0d6bd32010-04-05 05:11:15 +0000165DwarfDebug::DwarfDebug(AsmPrinter *A, Module *M)
Eric Christopherd79f5482012-12-10 19:51:13 +0000166 : Asm(A), MMI(Asm->MMI), FirstCU(0),
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000167 AbbreviationsSet(InitAbbreviationsSetSize),
Eric Christopher27614582013-01-08 22:22:06 +0000168 SourceIdMap(DIEValueAllocator),
Eric Christopherc8a310e2012-12-10 23:34:43 +0000169 PrevLabel(NULL), GlobalCUIndexCount(0),
Eric Christopher27614582013-01-08 22:22:06 +0000170 InfoHolder(A, &AbbreviationsSet, &Abbreviations, "info_string",
171 DIEValueAllocator),
Eric Christopher3c5a1912012-12-19 22:02:53 +0000172 SkeletonAbbrevSet(InitAbbreviationsSetSize),
Eric Christopher27614582013-01-08 22:22:06 +0000173 SkeletonHolder(A, &SkeletonAbbrevSet, &SkeletonAbbrevs, "skel_string",
174 DIEValueAllocator) {
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000175
Rafael Espindolaa7160962011-05-06 14:56:22 +0000176 DwarfInfoSectionSym = DwarfAbbrevSectionSym = 0;
Chris Lattnere58b5472010-04-04 23:10:38 +0000177 DwarfStrSectionSym = TextSectionSym = 0;
Eric Christopher74804332013-02-07 21:19:50 +0000178 DwarfDebugRangeSectionSym = DwarfDebugLocSectionSym = DwarfLineSectionSym = 0;
Eric Christopher55863be2013-04-07 03:43:09 +0000179 DwarfAddrSectionSym = 0;
Eric Christopher3bf29fd2012-12-27 02:14:01 +0000180 DwarfAbbrevDWOSectionSym = DwarfStrDWOSectionSym = 0;
Devang Patel9fc11702010-05-25 23:40:22 +0000181 FunctionBeginSym = FunctionEndSym = 0;
Eric Christopherad9fe892012-04-02 17:58:52 +0000182
Eric Christopher978fbff2012-08-23 07:10:46 +0000183 // Turn on accelerator tables and older gdb compatibility
184 // for Darwin.
Eric Christopher203e12b2013-04-27 01:07:52 +0000185 bool IsDarwin = Triple(A->getTargetTriple()).isOSDarwin();
Eric Christopher20b76a72012-08-23 22:36:40 +0000186 if (DarwinGDBCompat == Default) {
Eric Christopher7b30f2e42012-11-21 00:34:35 +0000187 if (IsDarwin)
188 IsDarwinGDBCompat = true;
Eric Christopher20b76a72012-08-23 22:36:40 +0000189 else
Eric Christopher7b30f2e42012-11-21 00:34:35 +0000190 IsDarwinGDBCompat = false;
Eric Christopher20b76a72012-08-23 22:36:40 +0000191 } else
Eric Christopher7b30f2e42012-11-21 00:34:35 +0000192 IsDarwinGDBCompat = DarwinGDBCompat == Enable ? true : false;
Eric Christopher4977f212012-08-23 22:36:36 +0000193
Eric Christopher20b76a72012-08-23 22:36:40 +0000194 if (DwarfAccelTables == Default) {
Eric Christopher7b30f2e42012-11-21 00:34:35 +0000195 if (IsDarwin)
196 HasDwarfAccelTables = true;
Eric Christopher20b76a72012-08-23 22:36:40 +0000197 else
Eric Christopher7b30f2e42012-11-21 00:34:35 +0000198 HasDwarfAccelTables = false;
Eric Christopher20b76a72012-08-23 22:36:40 +0000199 } else
Eric Christopher7b30f2e42012-11-21 00:34:35 +0000200 HasDwarfAccelTables = DwarfAccelTables == Enable ? true : false;
Eric Christopher20b76a72012-08-23 22:36:40 +0000201
Eric Christophercdf218d2012-12-10 19:51:21 +0000202 if (SplitDwarf == Default)
203 HasSplitDwarf = false;
Eric Christopher29424312012-11-12 22:22:20 +0000204 else
Eric Christophercdf218d2012-12-10 19:51:21 +0000205 HasSplitDwarf = SplitDwarf == Enable ? true : false;
Eric Christopher29424312012-11-12 22:22:20 +0000206
Dan Gohman6e681a52010-06-18 15:56:31 +0000207 {
208 NamedRegionTimer T(DbgTimerName, DWARFGroupName, TimePassesIsEnabled);
Eric Christopher58f41952012-11-19 22:42:15 +0000209 beginModule();
Torok Edwinf8dba242010-04-07 10:44:46 +0000210 }
Bill Wendling2f921f82009-05-15 09:23:25 +0000211}
212DwarfDebug::~DwarfDebug() {
Bill Wendling2f921f82009-05-15 09:23:25 +0000213}
214
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000215// Switch to the specified MCSection and emit an assembler
216// temporary label to it if SymbolStem is specified.
Eric Christopher7b30f2e42012-11-21 00:34:35 +0000217static MCSymbol *emitSectionSym(AsmPrinter *Asm, const MCSection *Section,
Eric Christophera7b61892011-11-07 09:18:38 +0000218 const char *SymbolStem = 0) {
219 Asm->OutStreamer.SwitchSection(Section);
220 if (!SymbolStem) return 0;
221
222 MCSymbol *TmpSym = Asm->GetTempSymbol(SymbolStem);
223 Asm->OutStreamer.EmitLabel(TmpSym);
224 return TmpSym;
225}
226
Eric Christophere698f532012-12-20 21:58:36 +0000227MCSymbol *DwarfUnits::getStringPoolSym() {
Eric Christopher3bf29fd2012-12-27 02:14:01 +0000228 return Asm->GetTempSymbol(StringPref);
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +0000229}
230
Eric Christophere698f532012-12-20 21:58:36 +0000231MCSymbol *DwarfUnits::getStringPoolEntry(StringRef Str) {
232 std::pair<MCSymbol*, unsigned> &Entry =
Eric Christopher27614582013-01-08 22:22:06 +0000233 StringPool.GetOrCreateValue(Str).getValue();
Chris Lattnerb7aa9522010-03-13 02:17:42 +0000234 if (Entry.first) return Entry.first;
235
236 Entry.second = NextStringPoolNumber++;
Eric Christopher3bf29fd2012-12-27 02:14:01 +0000237 return Entry.first = Asm->GetTempSymbol(StringPref, Entry.second);
Chris Lattnerb7aa9522010-03-13 02:17:42 +0000238}
239
Eric Christopher2cbd5762013-01-07 19:32:41 +0000240unsigned DwarfUnits::getStringPoolIndex(StringRef Str) {
241 std::pair<MCSymbol*, unsigned> &Entry =
Eric Christopher27614582013-01-08 22:22:06 +0000242 StringPool.GetOrCreateValue(Str).getValue();
Eric Christopher2cbd5762013-01-07 19:32:41 +0000243 if (Entry.first) return Entry.second;
244
245 Entry.second = NextStringPoolNumber++;
246 Entry.first = Asm->GetTempSymbol(StringPref, Entry.second);
247 return Entry.second;
248}
249
Eric Christopher962c9082013-01-15 23:56:56 +0000250unsigned DwarfUnits::getAddrPoolIndex(MCSymbol *Sym) {
251 std::pair<MCSymbol*, unsigned> &Entry = AddressPool[Sym];
252 if (Entry.first) return Entry.second;
253
254 Entry.second = NextAddrPoolNumber++;
255 Entry.first = Sym;
256 return Entry.second;
257}
258
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000259// Define a unique number for the abbreviation.
260//
Eric Christopherc8a310e2012-12-10 23:34:43 +0000261void DwarfUnits::assignAbbrevNumber(DIEAbbrev &Abbrev) {
Bill Wendling2f921f82009-05-15 09:23:25 +0000262 // Profile the node so that we can make it unique.
263 FoldingSetNodeID ID;
264 Abbrev.Profile(ID);
265
266 // Check the set for priors.
Eric Christopherc8a310e2012-12-10 23:34:43 +0000267 DIEAbbrev *InSet = AbbreviationsSet->GetOrInsertNode(&Abbrev);
Bill Wendling2f921f82009-05-15 09:23:25 +0000268
269 // If it's newly added.
270 if (InSet == &Abbrev) {
271 // Add to abbreviation list.
Eric Christopherc8a310e2012-12-10 23:34:43 +0000272 Abbreviations->push_back(&Abbrev);
Bill Wendling2f921f82009-05-15 09:23:25 +0000273
274 // Assign the vector position + 1 as its number.
Eric Christopherc8a310e2012-12-10 23:34:43 +0000275 Abbrev.setNumber(Abbreviations->size());
Bill Wendling2f921f82009-05-15 09:23:25 +0000276 } else {
277 // Assign existing abbreviation number.
278 Abbrev.setNumber(InSet->getNumber());
279 }
280}
281
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000282// If special LLVM prefix that is used to inform the asm
283// printer to not emit usual symbol prefix before the symbol name is used then
284// return linkage name after skipping this special LLVM prefix.
Devang Patel43ef34d2010-01-05 01:46:14 +0000285static StringRef getRealLinkageName(StringRef LinkageName) {
286 char One = '\1';
287 if (LinkageName.startswith(StringRef(&One, 1)))
288 return LinkageName.substr(1);
289 return LinkageName;
290}
291
Eric Christopherd9843b32011-11-10 19:25:34 +0000292static bool isObjCClass(StringRef Name) {
293 return Name.startswith("+") || Name.startswith("-");
294}
295
296static bool hasObjCCategory(StringRef Name) {
297 if (!isObjCClass(Name)) return false;
298
299 size_t pos = Name.find(')');
300 if (pos != std::string::npos) {
301 if (Name[pos+1] != ' ') return false;
302 return true;
303 }
304 return false;
305}
306
307static void getObjCClassCategory(StringRef In, StringRef &Class,
308 StringRef &Category) {
309 if (!hasObjCCategory(In)) {
310 Class = In.slice(In.find('[') + 1, In.find(' '));
311 Category = "";
312 return;
313 }
314
315 Class = In.slice(In.find('[') + 1, In.find('('));
316 Category = In.slice(In.find('[') + 1, In.find(' '));
317 return;
318}
319
320static StringRef getObjCMethodName(StringRef In) {
321 return In.slice(In.find(' ') + 1, In.find(']'));
322}
323
324// Add the various names to the Dwarf accelerator table names.
325static void addSubprogramNames(CompileUnit *TheCU, DISubprogram SP,
326 DIE* Die) {
327 if (!SP.isDefinition()) return;
Eric Christopher6a841382012-11-19 22:42:10 +0000328
Eric Christopherd9843b32011-11-10 19:25:34 +0000329 TheCU->addAccelName(SP.getName(), Die);
330
331 // If the linkage name is different than the name, go ahead and output
332 // that as well into the name table.
333 if (SP.getLinkageName() != "" && SP.getName() != SP.getLinkageName())
334 TheCU->addAccelName(SP.getLinkageName(), Die);
335
336 // If this is an Objective-C selector name add it to the ObjC accelerator
337 // too.
338 if (isObjCClass(SP.getName())) {
339 StringRef Class, Category;
340 getObjCClassCategory(SP.getName(), Class, Category);
341 TheCU->addAccelObjC(Class, Die);
342 if (Category != "")
343 TheCU->addAccelObjC(Category, Die);
344 // Also add the base method name to the name table.
345 TheCU->addAccelName(getObjCMethodName(SP.getName()), Die);
346 }
347}
348
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000349// Find DIE for the given subprogram and attach appropriate DW_AT_low_pc
350// and DW_AT_high_pc attributes. If there are global variables in this
351// scope then create and insert DIEs for these variables.
Devang Pateld2dfc5e2011-08-15 22:24:32 +0000352DIE *DwarfDebug::updateSubprogramScopeDIE(CompileUnit *SPCU,
353 const MDNode *SPNode) {
Devang Patel1a0df9a2010-05-10 22:49:55 +0000354 DIE *SPDie = SPCU->getDIE(SPNode);
Devang Patela37a95e2010-07-07 22:20:57 +0000355
Chris Lattner3a383cb2010-04-05 00:13:49 +0000356 assert(SPDie && "Unable to find subprogram DIE!");
357 DISubprogram SP(SPNode);
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000358
Bill Wendlingf720bf62012-11-07 05:19:04 +0000359 // If we're updating an abstract DIE, then we will be adding the children and
360 // object pointer later on. But what we don't want to do is process the
361 // concrete DIE twice.
Manman Ren14a029d2013-03-12 18:27:15 +0000362 DIE *AbsSPDIE = AbstractSPDies.lookup(SPNode);
363 if (AbsSPDIE) {
364 bool InSameCU = (AbsSPDIE->getCompileUnit() == SPCU->getCUDie());
Bill Wendlingf720bf62012-11-07 05:19:04 +0000365 // Pick up abstract subprogram DIE.
Devang Patela37a95e2010-07-07 22:20:57 +0000366 SPDie = new DIE(dwarf::DW_TAG_subprogram);
Manman Ren14a029d2013-03-12 18:27:15 +0000367 // If AbsSPDIE belongs to a different CU, use DW_FORM_ref_addr instead of
368 // DW_FORM_ref4.
Devang Patelf20c4f72011-04-12 22:53:02 +0000369 SPCU->addDIEEntry(SPDie, dwarf::DW_AT_abstract_origin,
Manman Ren14a029d2013-03-12 18:27:15 +0000370 InSameCU ? dwarf::DW_FORM_ref4 : dwarf::DW_FORM_ref_addr,
371 AbsSPDIE);
Devang Patela37a95e2010-07-07 22:20:57 +0000372 SPCU->addDie(SPDie);
Bill Wendlingd9bb9b62012-11-07 04:42:18 +0000373 } else {
374 DISubprogram SPDecl = SP.getFunctionDeclaration();
375 if (!SPDecl.isSubprogram()) {
376 // There is not any need to generate specification DIE for a function
377 // defined at compile unit level. If a function is defined inside another
378 // function then gdb prefers the definition at top level and but does not
379 // expect specification DIE in parent function. So avoid creating
380 // specification DIE for a function defined inside a function.
381 if (SP.isDefinition() && !SP.getContext().isCompileUnit() &&
382 !SP.getContext().isFile() &&
383 !isSubprogramContext(SP.getContext())) {
384 SPCU->addFlag(SPDie, dwarf::DW_AT_declaration);
385
386 // Add arguments.
387 DICompositeType SPTy = SP.getType();
388 DIArray Args = SPTy.getTypeArray();
389 unsigned SPTag = SPTy.getTag();
390 if (SPTag == dwarf::DW_TAG_subroutine_type)
391 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
392 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
393 DIType ATy = DIType(Args.getElement(i));
394 SPCU->addType(Arg, ATy);
395 if (ATy.isArtificial())
396 SPCU->addFlag(Arg, dwarf::DW_AT_artificial);
397 if (ATy.isObjectPointer())
398 SPCU->addDIEEntry(SPDie, dwarf::DW_AT_object_pointer,
399 dwarf::DW_FORM_ref4, Arg);
400 SPDie->addChild(Arg);
401 }
402 DIE *SPDeclDie = SPDie;
403 SPDie = new DIE(dwarf::DW_TAG_subprogram);
Eric Christopher6a841382012-11-19 22:42:10 +0000404 SPCU->addDIEEntry(SPDie, dwarf::DW_AT_specification,
405 dwarf::DW_FORM_ref4, SPDeclDie);
Bill Wendlingd9bb9b62012-11-07 04:42:18 +0000406 SPCU->addDie(SPDie);
407 }
408 }
Devang Patela37a95e2010-07-07 22:20:57 +0000409 }
410
Eric Christopher962c9082013-01-15 23:56:56 +0000411 SPCU->addLabelAddress(SPDie, dwarf::DW_AT_low_pc,
412 Asm->GetTempSymbol("func_begin",
413 Asm->getFunctionNumber()));
414 SPCU->addLabelAddress(SPDie, dwarf::DW_AT_high_pc,
415 Asm->GetTempSymbol("func_end",
416 Asm->getFunctionNumber()));
Chris Lattner3a383cb2010-04-05 00:13:49 +0000417 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
418 MachineLocation Location(RI->getFrameRegister(*Asm->MF));
Devang Patelf20c4f72011-04-12 22:53:02 +0000419 SPCU->addAddress(SPDie, dwarf::DW_AT_frame_base, Location);
Devang Patel6efc8e52010-02-06 01:02:37 +0000420
Eric Christopherd9843b32011-11-10 19:25:34 +0000421 // Add name to the name table, we do this here because we're guaranteed
422 // to have concrete versions of our DW_TAG_subprogram nodes.
423 addSubprogramNames(SPCU, SP, SPDie);
Eric Christopher6a841382012-11-19 22:42:10 +0000424
Chris Lattner3a383cb2010-04-05 00:13:49 +0000425 return SPDie;
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000426}
427
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000428// Construct new DW_TAG_lexical_block for this scope and attach
429// DW_AT_low_pc/DW_AT_high_pc labels.
Eric Christopher6a841382012-11-19 22:42:10 +0000430DIE *DwarfDebug::constructLexicalScopeDIE(CompileUnit *TheCU,
Devang Pateld2dfc5e2011-08-15 22:24:32 +0000431 LexicalScope *Scope) {
Devang Patel6c74a872010-04-27 19:46:33 +0000432 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_lexical_block);
433 if (Scope->isAbstractScope())
434 return ScopeDIE;
435
Devang Patel7e623022011-08-10 20:55:27 +0000436 const SmallVector<InsnRange, 4> &Ranges = Scope->getRanges();
Devang Patel6c74a872010-04-27 19:46:33 +0000437 if (Ranges.empty())
438 return 0;
439
Devang Patel7e623022011-08-10 20:55:27 +0000440 SmallVector<InsnRange, 4>::const_iterator RI = Ranges.begin();
Devang Patel6c74a872010-04-27 19:46:33 +0000441 if (Ranges.size() > 1) {
442 // .debug_range section has not been laid out yet. Emit offset in
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000443 // .debug_range as a uint, size 4, for now. emitDIE will handle
Devang Patel6c74a872010-04-27 19:46:33 +0000444 // DW_AT_ranges appropriately.
Devang Patelf20c4f72011-04-12 22:53:02 +0000445 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_ranges, dwarf::DW_FORM_data4,
Eric Christopher6a841382012-11-19 22:42:10 +0000446 DebugRangeSymbols.size()
Chandler Carruth5da3f052012-11-01 09:14:31 +0000447 * Asm->getDataLayout().getPointerSize());
Devang Patel7e623022011-08-10 20:55:27 +0000448 for (SmallVector<InsnRange, 4>::const_iterator RI = Ranges.begin(),
Devang Patel6c74a872010-04-27 19:46:33 +0000449 RE = Ranges.end(); RI != RE; ++RI) {
Devang Patel9fc11702010-05-25 23:40:22 +0000450 DebugRangeSymbols.push_back(getLabelBeforeInsn(RI->first));
451 DebugRangeSymbols.push_back(getLabelAfterInsn(RI->second));
Devang Patel6c74a872010-04-27 19:46:33 +0000452 }
453 DebugRangeSymbols.push_back(NULL);
454 DebugRangeSymbols.push_back(NULL);
455 return ScopeDIE;
456 }
457
Eric Christopher962c9082013-01-15 23:56:56 +0000458 MCSymbol *Start = getLabelBeforeInsn(RI->first);
459 MCSymbol *End = getLabelAfterInsn(RI->second);
Devang Patel6c74a872010-04-27 19:46:33 +0000460
Devang Patel9fc11702010-05-25 23:40:22 +0000461 if (End == 0) return 0;
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000462
Chris Lattnere13c3722010-03-09 01:58:53 +0000463 assert(Start->isDefined() && "Invalid starting label for an inlined scope!");
464 assert(End->isDefined() && "Invalid end label for an inlined scope!");
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000465
Eric Christopher962c9082013-01-15 23:56:56 +0000466 TheCU->addLabelAddress(ScopeDIE, dwarf::DW_AT_low_pc, Start);
467 TheCU->addLabelAddress(ScopeDIE, dwarf::DW_AT_high_pc, End);
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000468
469 return ScopeDIE;
470}
471
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000472// This scope represents inlined body of a function. Construct DIE to
473// represent this concrete inlined copy of the function.
Devang Pateld2dfc5e2011-08-15 22:24:32 +0000474DIE *DwarfDebug::constructInlinedScopeDIE(CompileUnit *TheCU,
475 LexicalScope *Scope) {
Devang Patel7e623022011-08-10 20:55:27 +0000476 const SmallVector<InsnRange, 4> &Ranges = Scope->getRanges();
Nick Lewycky654f5ce2011-10-26 22:55:33 +0000477 assert(Ranges.empty() == false &&
478 "LexicalScope does not have instruction markers!");
Devang Patel6c74a872010-04-27 19:46:33 +0000479
Devang Patelf098ce22011-07-27 00:34:13 +0000480 if (!Scope->getScopeNode())
481 return NULL;
482 DIScope DS(Scope->getScopeNode());
483 DISubprogram InlinedSP = getDISubprogram(DS);
Devang Patelf098ce22011-07-27 00:34:13 +0000484 DIE *OriginDIE = TheCU->getDIE(InlinedSP);
485 if (!OriginDIE) {
Bill Wendling10e0e2e2012-10-30 17:51:02 +0000486 DEBUG(dbgs() << "Unable to find original DIE for an inlined subprogram.");
Devang Patelf098ce22011-07-27 00:34:13 +0000487 return NULL;
488 }
489
Devang Patel7e623022011-08-10 20:55:27 +0000490 SmallVector<InsnRange, 4>::const_iterator RI = Ranges.begin();
Eric Christopher962c9082013-01-15 23:56:56 +0000491 MCSymbol *StartLabel = getLabelBeforeInsn(RI->first);
492 MCSymbol *EndLabel = getLabelAfterInsn(RI->second);
Devang Patel6c74a872010-04-27 19:46:33 +0000493
Devang Patel4c6bd662010-07-08 22:39:20 +0000494 if (StartLabel == 0 || EndLabel == 0) {
Bill Wendling10e0e2e2012-10-30 17:51:02 +0000495 llvm_unreachable("Unexpected Start and End labels for an inlined scope!");
Devang Patel6c74a872010-04-27 19:46:33 +0000496 }
Chris Lattnere13c3722010-03-09 01:58:53 +0000497 assert(StartLabel->isDefined() &&
Chris Lattnerc3b70f62010-03-09 01:51:43 +0000498 "Invalid starting label for an inlined scope!");
Chris Lattnere13c3722010-03-09 01:58:53 +0000499 assert(EndLabel->isDefined() &&
Chris Lattnerc3b70f62010-03-09 01:51:43 +0000500 "Invalid end label for an inlined scope!");
Devang Patel6c74a872010-04-27 19:46:33 +0000501
Devang Patel73bc1722011-05-05 17:54:26 +0000502 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_inlined_subroutine);
Devang Patelf20c4f72011-04-12 22:53:02 +0000503 TheCU->addDIEEntry(ScopeDIE, dwarf::DW_AT_abstract_origin,
504 dwarf::DW_FORM_ref4, OriginDIE);
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000505
Devang Patelf098ce22011-07-27 00:34:13 +0000506 if (Ranges.size() > 1) {
507 // .debug_range section has not been laid out yet. Emit offset in
508 // .debug_range as a uint, size 4, for now. emitDIE will handle
509 // DW_AT_ranges appropriately.
510 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_ranges, dwarf::DW_FORM_data4,
Eric Christopher6a841382012-11-19 22:42:10 +0000511 DebugRangeSymbols.size()
Chandler Carruth5da3f052012-11-01 09:14:31 +0000512 * Asm->getDataLayout().getPointerSize());
Devang Patel7e623022011-08-10 20:55:27 +0000513 for (SmallVector<InsnRange, 4>::const_iterator RI = Ranges.begin(),
Devang Patelf098ce22011-07-27 00:34:13 +0000514 RE = Ranges.end(); RI != RE; ++RI) {
515 DebugRangeSymbols.push_back(getLabelBeforeInsn(RI->first));
516 DebugRangeSymbols.push_back(getLabelAfterInsn(RI->second));
517 }
518 DebugRangeSymbols.push_back(NULL);
519 DebugRangeSymbols.push_back(NULL);
520 } else {
Eric Christopher962c9082013-01-15 23:56:56 +0000521 TheCU->addLabelAddress(ScopeDIE, dwarf::DW_AT_low_pc, StartLabel);
522 TheCU->addLabelAddress(ScopeDIE, dwarf::DW_AT_high_pc, EndLabel);
Devang Patelf098ce22011-07-27 00:34:13 +0000523 }
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000524
525 InlinedSubprogramDIEs.insert(OriginDIE);
526
527 // Track the start label for this inlined function.
Devang Patelf098ce22011-07-27 00:34:13 +0000528 //.debug_inlined section specification does not clearly state how
529 // to emit inlined scope that is split into multiple instruction ranges.
530 // For now, use first instruction range and emit low_pc/high_pc pair and
531 // corresponding .debug_inlined section entry for this pair.
Devang Patel32cc43c2010-05-07 20:54:48 +0000532 DenseMap<const MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator
Devang Patelcfa8e9d2010-05-07 18:11:54 +0000533 I = InlineInfo.find(InlinedSP);
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000534
535 if (I == InlineInfo.end()) {
Nick Lewycky654f5ce2011-10-26 22:55:33 +0000536 InlineInfo[InlinedSP].push_back(std::make_pair(StartLabel, ScopeDIE));
Devang Patelcfa8e9d2010-05-07 18:11:54 +0000537 InlinedSPNodes.push_back(InlinedSP);
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000538 } else
Chris Lattner085b6522010-03-09 00:31:02 +0000539 I->second.push_back(std::make_pair(StartLabel, ScopeDIE));
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000540
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000541 DILocation DL(Scope->getInlinedAt());
Eric Christopher0925c622012-03-26 21:38:38 +0000542 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_call_file, 0,
Manman Ren1e427202013-03-07 01:42:00 +0000543 getOrCreateSourceID(DL.getFilename(), DL.getDirectory(),
544 TheCU->getUniqueID()));
Devang Patelf20c4f72011-04-12 22:53:02 +0000545 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_call_line, 0, DL.getLineNumber());
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000546
Eric Christopher8dda5d02011-12-04 06:02:38 +0000547 // Add name to the name table, we do this here because we're guaranteed
548 // to have concrete versions of our DW_TAG_inlined_subprogram nodes.
549 addSubprogramNames(TheCU, InlinedSP, ScopeDIE);
Eric Christopher6a841382012-11-19 22:42:10 +0000550
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000551 return ScopeDIE;
552}
553
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000554// Construct a DIE for this scope.
Devang Patel3acc70e2011-08-15 22:04:40 +0000555DIE *DwarfDebug::constructScopeDIE(CompileUnit *TheCU, LexicalScope *Scope) {
Devang Patel3b548aa2010-03-08 20:52:55 +0000556 if (!Scope || !Scope->getScopeNode())
557 return NULL;
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000558
Manman Ren53f3f9f2013-01-31 20:05:14 +0000559 DIScope DS(Scope->getScopeNode());
560 // Early return to avoid creating dangling variable|scope DIEs.
561 if (!Scope->getInlinedAt() && DS.isSubprogram() && Scope->isAbstractScope() &&
562 !TheCU->getDIE(DS))
563 return NULL;
564
Nick Lewycky654f5ce2011-10-26 22:55:33 +0000565 SmallVector<DIE *, 8> Children;
Eric Christophere3417762012-09-12 23:36:19 +0000566 DIE *ObjectPointer = NULL;
Devang Patel6c622ef2011-03-01 22:58:55 +0000567
568 // Collect arguments for current function.
Devang Patel7e623022011-08-10 20:55:27 +0000569 if (LScopes.isCurrentFunctionScope(Scope))
Devang Patel6c622ef2011-03-01 22:58:55 +0000570 for (unsigned i = 0, N = CurrentFnArguments.size(); i < N; ++i)
571 if (DbgVariable *ArgDV = CurrentFnArguments[i])
Eric Christopher6a841382012-11-19 22:42:10 +0000572 if (DIE *Arg =
Eric Christophere3417762012-09-12 23:36:19 +0000573 TheCU->constructVariableDIE(ArgDV, Scope->isAbstractScope())) {
Devang Patel6c622ef2011-03-01 22:58:55 +0000574 Children.push_back(Arg);
Eric Christophere3417762012-09-12 23:36:19 +0000575 if (ArgDV->isObjectPointer()) ObjectPointer = Arg;
576 }
Devang Patel6c622ef2011-03-01 22:58:55 +0000577
Eric Christopherf84354b2011-10-03 15:49:16 +0000578 // Collect lexical scope children first.
Devang Patel7e623022011-08-10 20:55:27 +0000579 const SmallVector<DbgVariable *, 8> &Variables = ScopeVariables.lookup(Scope);
Devang Patel5f1b4cd2011-02-19 01:31:27 +0000580 for (unsigned i = 0, N = Variables.size(); i < N; ++i)
Eric Christopher6a841382012-11-19 22:42:10 +0000581 if (DIE *Variable =
Eric Christopherc1c8a1b2012-09-21 22:18:52 +0000582 TheCU->constructVariableDIE(Variables[i], Scope->isAbstractScope())) {
Devang Patel5f1b4cd2011-02-19 01:31:27 +0000583 Children.push_back(Variable);
Eric Christopherc1c8a1b2012-09-21 22:18:52 +0000584 if (Variables[i]->isObjectPointer()) ObjectPointer = Variable;
585 }
Devang Patel7e623022011-08-10 20:55:27 +0000586 const SmallVector<LexicalScope *, 4> &Scopes = Scope->getChildren();
Devang Patel5f1b4cd2011-02-19 01:31:27 +0000587 for (unsigned j = 0, M = Scopes.size(); j < M; ++j)
Devang Patel3acc70e2011-08-15 22:04:40 +0000588 if (DIE *Nested = constructScopeDIE(TheCU, Scopes[j]))
Devang Patel5f1b4cd2011-02-19 01:31:27 +0000589 Children.push_back(Nested);
Devang Patel3b548aa2010-03-08 20:52:55 +0000590 DIE *ScopeDIE = NULL;
591 if (Scope->getInlinedAt())
Devang Pateld2dfc5e2011-08-15 22:24:32 +0000592 ScopeDIE = constructInlinedScopeDIE(TheCU, Scope);
Devang Patel3b548aa2010-03-08 20:52:55 +0000593 else if (DS.isSubprogram()) {
Devang Pateld10b2af2010-06-28 20:53:04 +0000594 ProcessedSPNodes.insert(DS);
Devang Patela37a95e2010-07-07 22:20:57 +0000595 if (Scope->isAbstractScope()) {
Devang Pateld2dfc5e2011-08-15 22:24:32 +0000596 ScopeDIE = TheCU->getDIE(DS);
Devang Patela37a95e2010-07-07 22:20:57 +0000597 // Note down abstract DIE.
598 if (ScopeDIE)
599 AbstractSPDies.insert(std::make_pair(DS, ScopeDIE));
600 }
Devang Patel3b548aa2010-03-08 20:52:55 +0000601 else
Devang Pateld2dfc5e2011-08-15 22:24:32 +0000602 ScopeDIE = updateSubprogramScopeDIE(TheCU, DS);
Devang Patel3b548aa2010-03-08 20:52:55 +0000603 }
Devang Patel5f1b4cd2011-02-19 01:31:27 +0000604 else {
605 // There is no need to emit empty lexical block DIE.
David Blaikie684fc532013-05-06 23:33:07 +0000606 std::pair<ImportedEntityMap::const_iterator,
607 ImportedEntityMap::const_iterator> Range = std::equal_range(
608 ScopesWithImportedEntities.begin(), ScopesWithImportedEntities.end(),
609 std::pair<const MDNode *, const MDNode *>(DS, 0), CompareFirst());
610 if (Children.empty() && Range.first == Range.second)
Devang Patel5f1b4cd2011-02-19 01:31:27 +0000611 return NULL;
Devang Pateld2dfc5e2011-08-15 22:24:32 +0000612 ScopeDIE = constructLexicalScopeDIE(TheCU, Scope);
David Blaikie684fc532013-05-06 23:33:07 +0000613 for (ImportedEntityMap::const_iterator i = Range.first; i != Range.second; ++i)
614 constructImportedModuleDIE(TheCU, i->second, ScopeDIE);
Devang Patel5f1b4cd2011-02-19 01:31:27 +0000615 }
Eric Christopher6a841382012-11-19 22:42:10 +0000616
Devang Patel23b2ae62010-03-29 22:59:58 +0000617 if (!ScopeDIE) return NULL;
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000618
Devang Patel5f1b4cd2011-02-19 01:31:27 +0000619 // Add children
620 for (SmallVector<DIE *, 8>::iterator I = Children.begin(),
621 E = Children.end(); I != E; ++I)
622 ScopeDIE->addChild(*I);
Devang Patel04d2f2d2009-11-24 01:14:22 +0000623
Eric Christophere3417762012-09-12 23:36:19 +0000624 if (DS.isSubprogram() && ObjectPointer != NULL)
625 TheCU->addDIEEntry(ScopeDIE, dwarf::DW_AT_object_pointer,
626 dwarf::DW_FORM_ref4, ObjectPointer);
627
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000628 if (DS.isSubprogram())
Eric Christopherd9843b32011-11-10 19:25:34 +0000629 TheCU->addPubTypes(DISubprogram(DS));
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000630
Eric Christopherd9843b32011-11-10 19:25:34 +0000631 return ScopeDIE;
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000632}
633
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000634// Look up the source id with the given directory and source file names.
635// If none currently exists, create a new id and insert it in the
636// SourceIds map. This can update DirectoryNames and SourceFileNames maps
637// as well.
Eric Christopher7b30f2e42012-11-21 00:34:35 +0000638unsigned DwarfDebug::getOrCreateSourceID(StringRef FileName,
Manman Ren1e427202013-03-07 01:42:00 +0000639 StringRef DirName, unsigned CUID) {
640 // If we use .loc in assembly, we can't separate .file entries according to
641 // compile units. Thus all files will belong to the default compile unit.
642 if (Asm->TM.hasMCUseLoc() &&
643 Asm->OutStreamer.getKind() == MCStreamer::SK_AsmStreamer)
644 CUID = 0;
645
Devang Patel871d0b12010-09-16 20:57:49 +0000646 // If FE did not provide a file name, then assume stdin.
647 if (FileName.empty())
Manman Ren1e427202013-03-07 01:42:00 +0000648 return getOrCreateSourceID("<stdin>", StringRef(), CUID);
Devang Patele01b75c2011-03-24 20:30:50 +0000649
Nick Lewyckyd1ee7f82011-11-02 20:55:33 +0000650 // TODO: this might not belong here. See if we can factor this better.
651 if (DirName == CompilationDir)
652 DirName = "";
653
Manman Ren1e427202013-03-07 01:42:00 +0000654 // FileIDCUMap stores the current ID for the given compile unit.
655 unsigned SrcId = FileIDCUMap[CUID] + 1;
Devang Patel871d0b12010-09-16 20:57:49 +0000656
Manman Ren1e427202013-03-07 01:42:00 +0000657 // We look up the CUID/file/dir by concatenating them with a zero byte.
Benjamin Kramer71b19732012-03-11 14:56:26 +0000658 SmallString<128> NamePair;
Manman Ren5b22f9f2013-04-06 01:02:38 +0000659 NamePair += utostr(CUID);
Manman Ren1e427202013-03-07 01:42:00 +0000660 NamePair += '\0';
Benjamin Kramer71b19732012-03-11 14:56:26 +0000661 NamePair += DirName;
662 NamePair += '\0'; // Zero bytes are not allowed in paths.
663 NamePair += FileName;
664
665 StringMapEntry<unsigned> &Ent = SourceIdMap.GetOrCreateValue(NamePair, SrcId);
666 if (Ent.getValue() != SrcId)
667 return Ent.getValue();
Bill Wendling2b128d72009-05-20 23:19:06 +0000668
Manman Ren1e427202013-03-07 01:42:00 +0000669 FileIDCUMap[CUID] = SrcId;
Rafael Espindola67c6ab82010-11-18 02:04:25 +0000670 // Print out a .file directive to specify files for .loc directives.
Manman Ren1e427202013-03-07 01:42:00 +0000671 Asm->OutStreamer.EmitDwarfFileDirective(SrcId, DirName, FileName, CUID);
Bill Wendling2b128d72009-05-20 23:19:06 +0000672
673 return SrcId;
674}
675
Eric Christopher48fef592012-12-20 21:58:40 +0000676// Create new CompileUnit for the given metadata node with tag
677// DW_TAG_compile_unit.
Devang Pateleb1bb4e2011-08-16 22:09:43 +0000678CompileUnit *DwarfDebug::constructCompileUnit(const MDNode *N) {
Devang Patel80ae3492009-08-28 23:24:31 +0000679 DICompileUnit DIUnit(N);
Devang Patel2d9caf92009-11-25 17:36:49 +0000680 StringRef FN = DIUnit.getFilename();
Nick Lewyckyd1ee7f82011-11-02 20:55:33 +0000681 CompilationDir = DIUnit.getDirectory();
Bill Wendling2b128d72009-05-20 23:19:06 +0000682
683 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
Eli Benderskyb42d1462012-12-03 18:45:45 +0000684 CompileUnit *NewCU = new CompileUnit(GlobalCUIndexCount++,
Eric Christophere698f532012-12-20 21:58:36 +0000685 DIUnit.getLanguage(), Die, Asm,
686 this, &InfoHolder);
Manman Ren1e427202013-03-07 01:42:00 +0000687
688 FileIDCUMap[NewCU->getUniqueID()] = 0;
689 // Call this to emit a .file directive if it wasn't emitted for the source
690 // file this CU comes from yet.
691 getOrCreateSourceID(FN, CompilationDir, NewCU->getUniqueID());
692
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +0000693 NewCU->addString(Die, dwarf::DW_AT_producer, DIUnit.getProducer());
Devang Patelf20c4f72011-04-12 22:53:02 +0000694 NewCU->addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data2,
695 DIUnit.getLanguage());
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +0000696 NewCU->addString(Die, dwarf::DW_AT_name, FN);
Eric Christopher52ce7182013-04-09 19:23:15 +0000697
Eric Christopherb1b94512012-08-01 18:19:01 +0000698 // 2.17.1 requires that we use DW_AT_low_pc for a single entry point
Eric Christopher52ce7182013-04-09 19:23:15 +0000699 // into an entity. We're using 0 (or a NULL label) for this. For
700 // split dwarf it's in the skeleton CU so omit it here.
701 if (!useSplitDwarf())
702 NewCU->addLabelAddress(Die, dwarf::DW_AT_low_pc, NULL);
Manman Ren4e042a62013-02-05 21:52:47 +0000703
704 // Define start line table label for each Compile Unit.
705 MCSymbol *LineTableStartSym = Asm->GetTempSymbol("line_table_start",
706 NewCU->getUniqueID());
707 Asm->OutStreamer.getContext().setMCLineTableSymbol(LineTableStartSym,
708 NewCU->getUniqueID());
709
Devang Pateld22ed622010-03-22 23:11:36 +0000710 // DW_AT_stmt_list is a offset of line number information for this
Eric Christopher52ce7182013-04-09 19:23:15 +0000711 // compile unit in debug_line section. For split dwarf this is
712 // left in the skeleton CU and so not included.
Manman Rend2c95eb2013-02-09 00:41:44 +0000713 // The line table entries are not always emitted in assembly, so it
714 // is not okay to use line_table_start here.
Eric Christopher52ce7182013-04-09 19:23:15 +0000715 if (!useSplitDwarf()) {
716 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
717 NewCU->addLabel(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4,
718 NewCU->getUniqueID() == 0 ?
719 Asm->GetTempSymbol("section_line") : LineTableStartSym);
720 else if (NewCU->getUniqueID() == 0)
721 NewCU->addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4, 0);
722 else
723 NewCU->addDelta(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4,
724 LineTableStartSym, DwarfLineSectionSym);
725 }
Bill Wendling2b128d72009-05-20 23:19:06 +0000726
Eric Christopher52ce7182013-04-09 19:23:15 +0000727 // If we're using split dwarf the compilation dir is going to be in the
728 // skeleton CU and so we don't need to duplicate it here.
729 if (!useSplitDwarf() && !CompilationDir.empty())
Nick Lewyckyd1ee7f82011-11-02 20:55:33 +0000730 NewCU->addString(Die, dwarf::DW_AT_comp_dir, CompilationDir);
Bill Wendling2b128d72009-05-20 23:19:06 +0000731 if (DIUnit.isOptimized())
Eric Christopherbb69a272012-08-24 01:14:27 +0000732 NewCU->addFlag(Die, dwarf::DW_AT_APPLE_optimized);
Bill Wendling2b128d72009-05-20 23:19:06 +0000733
Devang Patel2d9caf92009-11-25 17:36:49 +0000734 StringRef Flags = DIUnit.getFlags();
735 if (!Flags.empty())
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +0000736 NewCU->addString(Die, dwarf::DW_AT_APPLE_flags, Flags);
Eric Christopher6a841382012-11-19 22:42:10 +0000737
Nick Lewycky479a8fe2011-10-17 23:27:36 +0000738 if (unsigned RVer = DIUnit.getRunTimeVersion())
Devang Patelf20c4f72011-04-12 22:53:02 +0000739 NewCU->addUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers,
Bill Wendling2b128d72009-05-20 23:19:06 +0000740 dwarf::DW_FORM_data1, RVer);
741
Devang Patel1a0df9a2010-05-10 22:49:55 +0000742 if (!FirstCU)
743 FirstCU = NewCU;
Eric Christopher7a2cdf72013-02-05 07:31:55 +0000744
Eric Christopherc8a310e2012-12-10 23:34:43 +0000745 InfoHolder.addUnit(NewCU);
746
Devang Patel1a0df9a2010-05-10 22:49:55 +0000747 CUMap.insert(std::make_pair(N, NewCU));
Devang Pateleb1bb4e2011-08-16 22:09:43 +0000748 return NewCU;
Devang Patel1a0df9a2010-05-10 22:49:55 +0000749}
750
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000751// Construct subprogram DIE.
Eric Christopher6a841382012-11-19 22:42:10 +0000752void DwarfDebug::constructSubprogramDIE(CompileUnit *TheCU,
Devang Patel1f4f98d2011-08-15 23:36:40 +0000753 const MDNode *N) {
Rafael Espindola6cf4e832011-11-04 19:00:29 +0000754 CompileUnit *&CURef = SPMap[N];
755 if (CURef)
756 return;
757 CURef = TheCU;
758
Devang Patel80ae3492009-08-28 23:24:31 +0000759 DISubprogram SP(N);
Bill Wendling2b128d72009-05-20 23:19:06 +0000760 if (!SP.isDefinition())
761 // This is a method declaration which will be handled while constructing
762 // class type.
Devang Patel0751a282009-06-26 01:49:18 +0000763 return;
Bill Wendling2b128d72009-05-20 23:19:06 +0000764
Devang Patel89543712011-08-15 17:24:54 +0000765 DIE *SubprogramDie = TheCU->getOrCreateSubprogramDIE(SP);
Stuart Hastings4bd3dd92010-04-06 21:38:29 +0000766
767 // Add to map.
Devang Patel1a0df9a2010-05-10 22:49:55 +0000768 TheCU->insertDIE(N, SubprogramDie);
Bill Wendling2b128d72009-05-20 23:19:06 +0000769
770 // Add to context owner.
Devang Patelf20c4f72011-04-12 22:53:02 +0000771 TheCU->addToContextOwner(SubprogramDie, SP.getContext());
Devang Patel512001a2009-12-08 23:21:45 +0000772
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +0000773 // Expose as global, if requested.
774 if (GenerateDwarfPubNamesSection)
775 TheCU->addGlobalName(SP.getName(), SubprogramDie);
Bill Wendling2b128d72009-05-20 23:19:06 +0000776}
777
David Blaikief55abea2013-04-22 06:12:31 +0000778void DwarfDebug::constructImportedModuleDIE(CompileUnit *TheCU,
779 const MDNode *N) {
780 DIImportedModule Module(N);
781 if (!Module.Verify())
782 return;
David Blaikie684fc532013-05-06 23:33:07 +0000783 if (DIE *D = TheCU->getOrCreateContextDIE(Module.getContext()))
784 constructImportedModuleDIE(TheCU, Module, D);
785}
786
787void DwarfDebug::constructImportedModuleDIE(CompileUnit *TheCU, const MDNode *N,
788 DIE *Context) {
789 DIImportedModule Module(N);
790 if (!Module.Verify())
791 return;
792 return constructImportedModuleDIE(TheCU, Module, Context);
793}
794
795void DwarfDebug::constructImportedModuleDIE(CompileUnit *TheCU,
796 const DIImportedModule &Module,
797 DIE *Context) {
798 assert(Module.Verify() &&
799 "Use one of the MDNode * overloads to handle invalid metadata");
800 assert(Context && "Should always have a context for an imported_module");
David Blaikief55abea2013-04-22 06:12:31 +0000801 DIE *IMDie = new DIE(dwarf::DW_TAG_imported_module);
802 TheCU->insertDIE(Module, IMDie);
803 DIE *NSDie = TheCU->getOrCreateNameSpace(Module.getNameSpace());
804 unsigned FileID = getOrCreateSourceID(Module.getContext().getFilename(),
805 Module.getContext().getDirectory(),
806 TheCU->getUniqueID());
807 TheCU->addUInt(IMDie, dwarf::DW_AT_decl_file, 0, FileID);
808 TheCU->addUInt(IMDie, dwarf::DW_AT_decl_line, 0, Module.getLineNumber());
809 TheCU->addDIEEntry(IMDie, dwarf::DW_AT_import, dwarf::DW_FORM_ref4, NSDie);
David Blaikie684fc532013-05-06 23:33:07 +0000810 Context->addChild(IMDie);
David Blaikief55abea2013-04-22 06:12:31 +0000811}
812
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000813// Emit all Dwarf sections that should come prior to the content. Create
814// global DIEs and emit initial debug info sections. This is invoked by
815// the target AsmPrinter.
Eric Christopher58f41952012-11-19 22:42:15 +0000816void DwarfDebug::beginModule() {
Devang Patel6c74a872010-04-27 19:46:33 +0000817 if (DisableDebugInfoPrinting)
818 return;
819
Eric Christopher58f41952012-11-19 22:42:15 +0000820 const Module *M = MMI->getModule();
821
Nick Lewycky019d2552011-07-29 03:49:23 +0000822 // If module has named metadata anchors then use them, otherwise scan the
823 // module using debug info finder to collect debug info.
Devang Patele02e5852011-05-03 16:45:22 +0000824 NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu");
David Blaikiedc69ebb2013-03-11 23:39:23 +0000825 if (!CU_Nodes)
Devang Patel07bb9ee2011-08-15 23:47:24 +0000826 return;
Devang Patele02e5852011-05-03 16:45:22 +0000827
David Blaikiedc69ebb2013-03-11 23:39:23 +0000828 // Emit initial sections so we can reference labels later.
829 emitSectionLabels();
830
831 for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i) {
832 DICompileUnit CUNode(CU_Nodes->getOperand(i));
833 CompileUnit *CU = constructCompileUnit(CUNode);
David Blaikie684fc532013-05-06 23:33:07 +0000834 DIArray ImportedModules = CUNode.getImportedModules();
835 for (unsigned i = 0, e = ImportedModules.getNumElements(); i != e; ++i)
836 ScopesWithImportedEntities.push_back(std::make_pair(
837 DIImportedModule(ImportedModules.getElement(i)).getContext(),
838 ImportedModules.getElement(i)));
839 std::sort(ScopesWithImportedEntities.begin(),
840 ScopesWithImportedEntities.end(), CompareFirst());
David Blaikiedc69ebb2013-03-11 23:39:23 +0000841 DIArray GVs = CUNode.getGlobalVariables();
842 for (unsigned i = 0, e = GVs.getNumElements(); i != e; ++i)
843 CU->createGlobalVariableDIE(GVs.getElement(i));
844 DIArray SPs = CUNode.getSubprograms();
845 for (unsigned i = 0, e = SPs.getNumElements(); i != e; ++i)
846 constructSubprogramDIE(CU, SPs.getElement(i));
847 DIArray EnumTypes = CUNode.getEnumTypes();
848 for (unsigned i = 0, e = EnumTypes.getNumElements(); i != e; ++i)
849 CU->getOrCreateTypeDIE(EnumTypes.getElement(i));
850 DIArray RetainedTypes = CUNode.getRetainedTypes();
851 for (unsigned i = 0, e = RetainedTypes.getNumElements(); i != e; ++i)
852 CU->getOrCreateTypeDIE(RetainedTypes.getElement(i));
David Blaikief55abea2013-04-22 06:12:31 +0000853 // Emit imported_modules last so that the relevant context is already
854 // available.
David Blaikief55abea2013-04-22 06:12:31 +0000855 for (unsigned i = 0, e = ImportedModules.getNumElements(); i != e; ++i)
856 constructImportedModuleDIE(CU, ImportedModules.getElement(i));
Eric Christopher6be35032013-03-29 20:23:02 +0000857 // If we're splitting the dwarf out now that we've got the entire
858 // CU then construct a skeleton CU based upon it.
859 if (useSplitDwarf()) {
Eric Christopher4eb5eb52013-04-24 12:56:18 +0000860 // This should be a unique identifier when we want to build .dwp files.
Eric Christopher44c6aa62013-04-22 07:51:08 +0000861 CU->addUInt(CU->getCUDie(), dwarf::DW_AT_GNU_dwo_id,
862 dwarf::DW_FORM_data8, 0);
Eric Christopher6be35032013-03-29 20:23:02 +0000863 // Now construct the skeleton CU associated.
864 constructSkeletonCU(CUNode);
865 }
David Blaikiedc69ebb2013-03-11 23:39:23 +0000866 }
Eric Christopher6a841382012-11-19 22:42:10 +0000867
Chris Lattner7cfa70e2010-04-05 02:19:28 +0000868 // Tell MMI that we have debug info.
869 MMI->setDebugInfoAvailability(true);
Eric Christopher6a841382012-11-19 22:42:10 +0000870
Bill Wendling2b128d72009-05-20 23:19:06 +0000871 // Prime section data.
Chris Lattner5e693ed2009-07-28 03:13:23 +0000872 SectionMap.insert(Asm->getObjFileLowering().getTextSection());
Bill Wendling2b128d72009-05-20 23:19:06 +0000873}
874
Eric Christopher960ac372012-11-22 00:59:49 +0000875// Attach DW_AT_inline attribute with inlined subprogram DIEs.
876void DwarfDebug::computeInlinedDIEs() {
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000877 // Attach DW_AT_inline attribute with inlined subprogram DIEs.
878 for (SmallPtrSet<DIE *, 4>::iterator AI = InlinedSubprogramDIEs.begin(),
Eric Christopher735401c2012-11-27 00:13:51 +0000879 AE = InlinedSubprogramDIEs.end(); AI != AE; ++AI) {
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000880 DIE *ISP = *AI;
Devang Patelf20c4f72011-04-12 22:53:02 +0000881 FirstCU->addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000882 }
Rafael Espindolae7cc8bf2011-11-12 01:57:54 +0000883 for (DenseMap<const MDNode *, DIE *>::iterator AI = AbstractSPDies.begin(),
Eric Christopher735401c2012-11-27 00:13:51 +0000884 AE = AbstractSPDies.end(); AI != AE; ++AI) {
Rafael Espindolae7cc8bf2011-11-12 01:57:54 +0000885 DIE *ISP = AI->second;
886 if (InlinedSubprogramDIEs.count(ISP))
887 continue;
888 FirstCU->addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
889 }
Eric Christopher960ac372012-11-22 00:59:49 +0000890}
891
892// Collect info for variables that were optimized out.
893void DwarfDebug::collectDeadVariables() {
894 const Module *M = MMI->getModule();
895 DenseMap<const MDNode *, LexicalScope *> DeadFnScopeMap;
896
897 if (NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu")) {
898 for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i) {
899 DICompileUnit TheCU(CU_Nodes->getOperand(i));
900 DIArray Subprograms = TheCU.getSubprograms();
901 for (unsigned i = 0, e = Subprograms.getNumElements(); i != e; ++i) {
Eric Christopher735401c2012-11-27 00:13:51 +0000902 DISubprogram SP(Subprograms.getElement(i));
903 if (ProcessedSPNodes.count(SP) != 0) continue;
904 if (!SP.Verify()) continue;
905 if (!SP.isDefinition()) continue;
906 DIArray Variables = SP.getVariables();
907 if (Variables.getNumElements() == 0) continue;
Eric Christopher960ac372012-11-22 00:59:49 +0000908
Eric Christopher735401c2012-11-27 00:13:51 +0000909 LexicalScope *Scope =
910 new LexicalScope(NULL, DIDescriptor(SP), NULL, false);
911 DeadFnScopeMap[SP] = Scope;
Eric Christopher960ac372012-11-22 00:59:49 +0000912
Eric Christopher735401c2012-11-27 00:13:51 +0000913 // Construct subprogram DIE and add variables DIEs.
914 CompileUnit *SPCU = CUMap.lookup(TheCU);
915 assert(SPCU && "Unable to find Compile Unit!");
916 constructSubprogramDIE(SPCU, SP);
917 DIE *ScopeDIE = SPCU->getDIE(SP);
918 for (unsigned vi = 0, ve = Variables.getNumElements(); vi != ve; ++vi) {
919 DIVariable DV(Variables.getElement(vi));
920 if (!DV.Verify()) continue;
921 DbgVariable *NewVar = new DbgVariable(DV, NULL);
922 if (DIE *VariableDIE =
923 SPCU->constructVariableDIE(NewVar, Scope->isAbstractScope()))
924 ScopeDIE->addChild(VariableDIE);
925 }
Eric Christopher960ac372012-11-22 00:59:49 +0000926 }
927 }
928 }
929 DeleteContainerSeconds(DeadFnScopeMap);
930}
931
932void DwarfDebug::finalizeModuleInfo() {
933 // Collect info for variables that were optimized out.
934 collectDeadVariables();
935
936 // Attach DW_AT_inline attribute with inlined subprogram DIEs.
937 computeInlinedDIEs();
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000938
Eric Christopherb1b94512012-08-01 18:19:01 +0000939 // Emit DW_AT_containing_type attribute to connect types with their
940 // vtable holding type.
Devang Patel89543712011-08-15 17:24:54 +0000941 for (DenseMap<const MDNode *, CompileUnit *>::iterator CUI = CUMap.begin(),
Eric Christopher735401c2012-11-27 00:13:51 +0000942 CUE = CUMap.end(); CUI != CUE; ++CUI) {
Devang Patel89543712011-08-15 17:24:54 +0000943 CompileUnit *TheCU = CUI->second;
944 TheCU->constructContainingTypeDIEs();
Devang Pateleb57c592009-12-03 19:11:07 +0000945 }
946
Eric Christopher960ac372012-11-22 00:59:49 +0000947 // Compute DIE offsets and sizes.
Eric Christopherc8a310e2012-12-10 23:34:43 +0000948 InfoHolder.computeSizeAndOffsets();
949 if (useSplitDwarf())
950 SkeletonHolder.computeSizeAndOffsets();
Eric Christopher960ac372012-11-22 00:59:49 +0000951}
952
953void DwarfDebug::endSections() {
Bill Wendling2b128d72009-05-20 23:19:06 +0000954 // Standard sections final addresses.
Chris Lattner4b7dadb2009-08-19 05:49:37 +0000955 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getTextSection());
Chris Lattnera179b522010-04-04 19:25:43 +0000956 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("text_end"));
Chris Lattner4b7dadb2009-08-19 05:49:37 +0000957 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getDataSection());
Chris Lattnera179b522010-04-04 19:25:43 +0000958 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("data_end"));
Bill Wendling2b128d72009-05-20 23:19:06 +0000959
960 // End text sections.
Benjamin Kramer15591272012-10-31 13:45:49 +0000961 for (unsigned I = 0, E = SectionMap.size(); I != E; ++I) {
962 Asm->OutStreamer.SwitchSection(SectionMap[I]);
963 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("section_end", I+1));
Bill Wendling2b128d72009-05-20 23:19:06 +0000964 }
Eric Christopher960ac372012-11-22 00:59:49 +0000965}
Bill Wendling2b128d72009-05-20 23:19:06 +0000966
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000967// Emit all Dwarf sections that should come after the content.
Eric Christopher960ac372012-11-22 00:59:49 +0000968void DwarfDebug::endModule() {
969
970 if (!FirstCU) return;
971
972 // End any existing sections.
973 // TODO: Does this need to happen?
974 endSections();
975
976 // Finalize the debug info for the module.
977 finalizeModuleInfo();
Bill Wendling2b128d72009-05-20 23:19:06 +0000978
Eric Christophercdf218d2012-12-10 19:51:21 +0000979 if (!useSplitDwarf()) {
Eric Christopher95198f502012-11-27 22:43:42 +0000980 // Emit all the DIEs into a debug info section.
981 emitDebugInfo();
Eric Christopher4c9b1192012-11-27 00:41:54 +0000982
Eric Christopher95198f502012-11-27 22:43:42 +0000983 // Corresponding abbreviations into a abbrev section.
984 emitAbbreviations();
985
986 // Emit info into a debug loc section.
987 emitDebugLoc();
988
989 // Emit info into a debug aranges section.
990 emitDebugARanges();
991
992 // Emit info into a debug ranges section.
993 emitDebugRanges();
994
995 // Emit info into a debug macinfo section.
996 emitDebugMacInfo();
997
998 // Emit inline info.
999 // TODO: When we don't need the option anymore we
1000 // can remove all of the code that this section
1001 // depends upon.
1002 if (useDarwinGDBCompat())
1003 emitDebugInlineInfo();
1004 } else {
Eric Christopherd692c1d2012-12-11 19:42:09 +00001005 // TODO: Fill this in for separated debug sections and separate
Eric Christopher95198f502012-11-27 22:43:42 +00001006 // out information into new sections.
1007
Eric Christopher9c2ecd92012-11-30 23:59:06 +00001008 // Emit the debug info section and compile units.
Eric Christopher95198f502012-11-27 22:43:42 +00001009 emitDebugInfo();
Eric Christopher9c2ecd92012-11-30 23:59:06 +00001010 emitDebugInfoDWO();
Eric Christopher95198f502012-11-27 22:43:42 +00001011
1012 // Corresponding abbreviations into a abbrev section.
1013 emitAbbreviations();
Eric Christopher3c5a1912012-12-19 22:02:53 +00001014 emitDebugAbbrevDWO();
Eric Christopher95198f502012-11-27 22:43:42 +00001015
1016 // Emit info into a debug loc section.
1017 emitDebugLoc();
1018
1019 // Emit info into a debug aranges section.
1020 emitDebugARanges();
1021
1022 // Emit info into a debug ranges section.
1023 emitDebugRanges();
1024
1025 // Emit info into a debug macinfo section.
1026 emitDebugMacInfo();
1027
Eric Christopher962c9082013-01-15 23:56:56 +00001028 // Emit DWO addresses.
1029 InfoHolder.emitAddresses(Asm->getObjFileLowering().getDwarfAddrSection());
1030
Eric Christopher95198f502012-11-27 22:43:42 +00001031 // Emit inline info.
1032 // TODO: When we don't need the option anymore we
1033 // can remove all of the code that this section
1034 // depends upon.
1035 if (useDarwinGDBCompat())
1036 emitDebugInlineInfo();
1037 }
Bill Wendling2b128d72009-05-20 23:19:06 +00001038
Eric Christophera876b822012-08-23 07:32:06 +00001039 // Emit info into the dwarf accelerator table sections.
Eric Christopher20b76a72012-08-23 22:36:40 +00001040 if (useDwarfAccelTables()) {
Eric Christopher4996c702011-11-07 09:24:32 +00001041 emitAccelNames();
1042 emitAccelObjC();
1043 emitAccelNamespaces();
1044 emitAccelTypes();
1045 }
Eric Christopher6a841382012-11-19 22:42:10 +00001046
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00001047 // Emit info into a debug pubnames section, if requested.
1048 if (GenerateDwarfPubNamesSection)
1049 emitDebugPubnames();
1050
Devang Patel04d2f2d2009-11-24 01:14:22 +00001051 // Emit info into a debug pubtypes section.
Eric Christopher77826182012-08-23 07:10:56 +00001052 // TODO: When we don't need the option anymore we can
1053 // remove all of the code that adds to the table.
Eric Christopher20b76a72012-08-23 22:36:40 +00001054 if (useDarwinGDBCompat())
Eric Christopher77826182012-08-23 07:10:56 +00001055 emitDebugPubTypes();
Devang Patel04d2f2d2009-11-24 01:14:22 +00001056
Eric Christopher95198f502012-11-27 22:43:42 +00001057 // Finally emit string information into a string table.
Eric Christopher6e20a162012-11-27 06:49:23 +00001058 emitDebugStr();
Eric Christopher3bf29fd2012-12-27 02:14:01 +00001059 if (useSplitDwarf())
1060 emitDebugStrDWO();
Eric Christopher6e20a162012-11-27 06:49:23 +00001061
Devang Pateld0701282010-08-02 17:32:15 +00001062 // clean up.
Devang Pateleb1bb4e2011-08-16 22:09:43 +00001063 SPMap.clear();
Devang Patel1a0df9a2010-05-10 22:49:55 +00001064 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
1065 E = CUMap.end(); I != E; ++I)
1066 delete I->second;
Eric Christopher8afd7b62012-12-10 19:51:18 +00001067
Eric Christopher5b33b3c2013-02-06 21:53:56 +00001068 for (SmallVector<CompileUnit *, 1>::iterator I = SkeletonCUs.begin(),
1069 E = SkeletonCUs.end(); I != E; ++I)
1070 delete *I;
Eric Christopher8afd7b62012-12-10 19:51:18 +00001071
Eric Christopher9c2ecd92012-11-30 23:59:06 +00001072 // Reset these for the next Module if we have one.
1073 FirstCU = NULL;
Bill Wendling2b128d72009-05-20 23:19:06 +00001074}
1075
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001076// Find abstract variable, if any, associated with Var.
Devang Patelbb23a4a2011-08-10 21:50:54 +00001077DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &DV,
Chris Lattner915c5f92010-04-02 19:42:39 +00001078 DebugLoc ScopeLoc) {
Devang Patelbb23a4a2011-08-10 21:50:54 +00001079 LLVMContext &Ctx = DV->getContext();
1080 // More then one inlined variable corresponds to one abstract variable.
1081 DIVariable Var = cleanseInlinedVariable(DV, Ctx);
Devang Patelcfa8e9d2010-05-07 18:11:54 +00001082 DbgVariable *AbsDbgVariable = AbstractVariables.lookup(Var);
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001083 if (AbsDbgVariable)
1084 return AbsDbgVariable;
1085
Devang Patel7e623022011-08-10 20:55:27 +00001086 LexicalScope *Scope = LScopes.findAbstractScope(ScopeLoc.getScope(Ctx));
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001087 if (!Scope)
1088 return NULL;
1089
Devang Patel99819b52011-08-15 19:01:20 +00001090 AbsDbgVariable = new DbgVariable(Var, NULL);
Devang Patel7e623022011-08-10 20:55:27 +00001091 addScopeVariable(Scope, AbsDbgVariable);
Devang Patelcfa8e9d2010-05-07 18:11:54 +00001092 AbstractVariables[Var] = AbsDbgVariable;
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001093 return AbsDbgVariable;
1094}
1095
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001096// If Var is a current function argument then add it to CurrentFnArguments list.
Devang Patel6c622ef2011-03-01 22:58:55 +00001097bool DwarfDebug::addCurrentFnArgument(const MachineFunction *MF,
Devang Patel7e623022011-08-10 20:55:27 +00001098 DbgVariable *Var, LexicalScope *Scope) {
1099 if (!LScopes.isCurrentFunctionScope(Scope))
Devang Patel6c622ef2011-03-01 22:58:55 +00001100 return false;
1101 DIVariable DV = Var->getVariable();
1102 if (DV.getTag() != dwarf::DW_TAG_arg_variable)
1103 return false;
1104 unsigned ArgNo = DV.getArgNumber();
Eric Christopher6a841382012-11-19 22:42:10 +00001105 if (ArgNo == 0)
Devang Patel6c622ef2011-03-01 22:58:55 +00001106 return false;
1107
Devang Patel4ab660b2011-03-03 20:02:02 +00001108 size_t Size = CurrentFnArguments.size();
1109 if (Size == 0)
Devang Patel6c622ef2011-03-01 22:58:55 +00001110 CurrentFnArguments.resize(MF->getFunction()->arg_size());
Devang Patel63b3e762011-03-03 21:49:41 +00001111 // llvm::Function argument size is not good indicator of how many
Devang Patel34a7ab42011-03-03 20:08:10 +00001112 // arguments does the function have at source level.
1113 if (ArgNo > Size)
Devang Patel4ab660b2011-03-03 20:02:02 +00001114 CurrentFnArguments.resize(ArgNo * 2);
Devang Patel6c622ef2011-03-01 22:58:55 +00001115 CurrentFnArguments[ArgNo - 1] = Var;
1116 return true;
1117}
1118
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001119// Collect variable information from side table maintained by MMI.
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001120void
Nick Lewycky019d2552011-07-29 03:49:23 +00001121DwarfDebug::collectVariableInfoFromMMITable(const MachineFunction *MF,
Devang Patel490c8ab2010-05-20 19:57:06 +00001122 SmallPtrSet<const MDNode *, 16> &Processed) {
Devang Patel475d32a2009-10-06 01:26:37 +00001123 MachineModuleInfo::VariableDbgInfoMapTy &VMap = MMI->getVariableDbgInfo();
1124 for (MachineModuleInfo::VariableDbgInfoMapTy::iterator VI = VMap.begin(),
1125 VE = VMap.end(); VI != VE; ++VI) {
Devang Patel32cc43c2010-05-07 20:54:48 +00001126 const MDNode *Var = VI->first;
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001127 if (!Var) continue;
Devang Patele0a94bf2010-05-14 21:01:35 +00001128 Processed.insert(Var);
Chris Lattner915c5f92010-04-02 19:42:39 +00001129 DIVariable DV(Var);
1130 const std::pair<unsigned, DebugLoc> &VP = VI->second;
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001131
Devang Patel7e623022011-08-10 20:55:27 +00001132 LexicalScope *Scope = LScopes.findLexicalScope(VP.second);
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001133
Devang Patelcdb7d442009-11-10 23:20:04 +00001134 // If variable scope is not found then skip this variable.
Chris Lattner915c5f92010-04-02 19:42:39 +00001135 if (Scope == 0)
Devang Patelcdb7d442009-11-10 23:20:04 +00001136 continue;
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001137
Devang Patele1c53f22010-05-20 16:36:41 +00001138 DbgVariable *AbsDbgVariable = findAbstractVariable(DV, VP.second);
Devang Patel99819b52011-08-15 19:01:20 +00001139 DbgVariable *RegVar = new DbgVariable(DV, AbsDbgVariable);
Devang Patel3e4a9652011-08-15 21:24:36 +00001140 RegVar->setFrameIndex(VP.first);
Devang Patel6c622ef2011-03-01 22:58:55 +00001141 if (!addCurrentFnArgument(MF, RegVar, Scope))
Devang Patel7e623022011-08-10 20:55:27 +00001142 addScopeVariable(Scope, RegVar);
Devang Patel99819b52011-08-15 19:01:20 +00001143 if (AbsDbgVariable)
Devang Patel3e4a9652011-08-15 21:24:36 +00001144 AbsDbgVariable->setFrameIndex(VP.first);
Devang Patel475d32a2009-10-06 01:26:37 +00001145 }
Devang Patel490c8ab2010-05-20 19:57:06 +00001146}
Devang Patela3e9c9c2010-03-15 18:33:46 +00001147
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001148// Return true if debug value, encoded by DBG_VALUE instruction, is in a
1149// defined reg.
Devang Patel9fc11702010-05-25 23:40:22 +00001150static bool isDbgValueInDefinedReg(const MachineInstr *MI) {
Nick Lewycky654f5ce2011-10-26 22:55:33 +00001151 assert(MI->isDebugValue() && "Invalid DBG_VALUE machine instruction!");
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001152 return MI->getNumOperands() == 3 &&
1153 MI->getOperand(0).isReg() && MI->getOperand(0).getReg() &&
Adrian Prantla2888e72013-04-30 22:35:14 +00001154 MI->getOperand(1).isImm() && MI->getOperand(1).getImm() == 0;
Devang Patel9fc11702010-05-25 23:40:22 +00001155}
1156
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001157// Get .debug_loc entry for the instruction range starting at MI.
Eric Christopher6a841382012-11-19 22:42:10 +00001158static DotDebugLocEntry getDebugLocEntry(AsmPrinter *Asm,
1159 const MCSymbol *FLabel,
Devang Patel2442a892011-07-08 17:09:57 +00001160 const MCSymbol *SLabel,
1161 const MachineInstr *MI) {
1162 const MDNode *Var = MI->getOperand(MI->getNumOperands() - 1).getMetadata();
1163
1164 if (MI->getNumOperands() != 3) {
1165 MachineLocation MLoc = Asm->getDebugValueLocation(MI);
1166 return DotDebugLocEntry(FLabel, SLabel, MLoc, Var);
1167 }
Adrian Prantla2888e72013-04-30 22:35:14 +00001168 if (MI->getOperand(0).isReg() && MI->getOperand(1).isImm()) {
Devang Patel2442a892011-07-08 17:09:57 +00001169 MachineLocation MLoc;
Adrian Prantla2888e72013-04-30 22:35:14 +00001170 // TODO: Currently an offset of 0 in a DBG_VALUE means
1171 // we need to generate a direct register value.
1172 // There is no way to specify an indirect value with offset 0.
1173 if (MI->getOperand(1).getImm() == 0)
Adrian Prantld4c0dd42013-04-26 21:57:17 +00001174 MLoc.set(MI->getOperand(0).getReg());
1175 else
1176 MLoc.set(MI->getOperand(0).getReg(), MI->getOperand(1).getImm());
Devang Patel2442a892011-07-08 17:09:57 +00001177 return DotDebugLocEntry(FLabel, SLabel, MLoc, Var);
1178 }
1179 if (MI->getOperand(0).isImm())
1180 return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getImm());
1181 if (MI->getOperand(0).isFPImm())
1182 return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getFPImm());
1183 if (MI->getOperand(0).isCImm())
1184 return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getCImm());
1185
Craig Topperee4dab52012-02-05 08:31:47 +00001186 llvm_unreachable("Unexpected 3 operand DBG_VALUE instruction!");
Devang Patel2442a892011-07-08 17:09:57 +00001187}
1188
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001189// Find variables for each lexical scope.
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001190void
Devang Patel5c0f85c2010-06-25 22:07:34 +00001191DwarfDebug::collectVariableInfo(const MachineFunction *MF,
1192 SmallPtrSet<const MDNode *, 16> &Processed) {
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001193
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001194 // collection info from MMI table.
Devang Patel490c8ab2010-05-20 19:57:06 +00001195 collectVariableInfoFromMMITable(MF, Processed);
1196
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001197 for (SmallVectorImpl<const MDNode*>::const_iterator
1198 UVI = UserVariables.begin(), UVE = UserVariables.end(); UVI != UVE;
1199 ++UVI) {
1200 const MDNode *Var = *UVI;
1201 if (Processed.count(Var))
Devang Patel490c8ab2010-05-20 19:57:06 +00001202 continue;
1203
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001204 // History contains relevant DBG_VALUE instructions for Var and instructions
1205 // clobbering it.
1206 SmallVectorImpl<const MachineInstr*> &History = DbgValues[Var];
1207 if (History.empty())
1208 continue;
1209 const MachineInstr *MInsn = History.front();
Devang Patel9fc11702010-05-25 23:40:22 +00001210
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001211 DIVariable DV(Var);
Devang Patel7e623022011-08-10 20:55:27 +00001212 LexicalScope *Scope = NULL;
Devang Patel7a9dedf2010-05-27 20:25:04 +00001213 if (DV.getTag() == dwarf::DW_TAG_arg_variable &&
1214 DISubprogram(DV.getContext()).describes(MF->getFunction()))
Devang Patel7e623022011-08-10 20:55:27 +00001215 Scope = LScopes.getCurrentFunctionScope();
David Blaikiedc69ebb2013-03-11 23:39:23 +00001216 else if (MDNode *IA = DV.getInlinedAt())
1217 Scope = LScopes.findInlinedScope(DebugLoc::getFromDILocation(IA));
1218 else
1219 Scope = LScopes.findLexicalScope(cast<MDNode>(DV->getOperand(1)));
Devang Patel490c8ab2010-05-20 19:57:06 +00001220 // If variable scope is not found then skip this variable.
Devang Patelfbd6c452010-05-21 00:10:20 +00001221 if (!Scope)
Devang Patel490c8ab2010-05-20 19:57:06 +00001222 continue;
1223
1224 Processed.insert(DV);
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001225 assert(MInsn->isDebugValue() && "History must begin with debug value");
Devang Patel99819b52011-08-15 19:01:20 +00001226 DbgVariable *AbsVar = findAbstractVariable(DV, MInsn->getDebugLoc());
1227 DbgVariable *RegVar = new DbgVariable(DV, AbsVar);
Devang Patel6c622ef2011-03-01 22:58:55 +00001228 if (!addCurrentFnArgument(MF, RegVar, Scope))
Devang Patel7e623022011-08-10 20:55:27 +00001229 addScopeVariable(Scope, RegVar);
Devang Patel99819b52011-08-15 19:01:20 +00001230 if (AbsVar)
Devang Patel3e4a9652011-08-15 21:24:36 +00001231 AbsVar->setMInsn(MInsn);
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001232
Eric Christophercc10d202012-10-08 20:48:54 +00001233 // Simplify ranges that are fully coalesced.
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001234 if (History.size() <= 1 || (History.size() == 2 &&
1235 MInsn->isIdenticalTo(History.back()))) {
Devang Patel3e4a9652011-08-15 21:24:36 +00001236 RegVar->setMInsn(MInsn);
Devang Patel9fc11702010-05-25 23:40:22 +00001237 continue;
1238 }
1239
Eric Christopher59cc0712013-01-28 17:33:26 +00001240 // Handle multiple DBG_VALUE instructions describing one variable.
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001241 RegVar->setDotDebugLocOffset(DotDebugLocEntries.size());
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001242
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001243 for (SmallVectorImpl<const MachineInstr*>::const_iterator
1244 HI = History.begin(), HE = History.end(); HI != HE; ++HI) {
1245 const MachineInstr *Begin = *HI;
1246 assert(Begin->isDebugValue() && "Invalid History entry");
Jakob Stoklund Olesen9c057ee2011-03-22 00:21:41 +00001247
Devang Patele7181b52011-06-01 23:00:17 +00001248 // Check if DBG_VALUE is truncating a range.
1249 if (Begin->getNumOperands() > 1 && Begin->getOperand(0).isReg()
1250 && !Begin->getOperand(0).getReg())
1251 continue;
1252
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001253 // Compute the range for a register location.
1254 const MCSymbol *FLabel = getLabelBeforeInsn(Begin);
1255 const MCSymbol *SLabel = 0;
1256
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001257 if (HI + 1 == HE)
1258 // If Begin is the last instruction in History then its value is valid
Chris Lattner0ab5e2c2011-04-15 05:18:47 +00001259 // until the end of the function.
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001260 SLabel = FunctionEndSym;
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001261 else {
1262 const MachineInstr *End = HI[1];
Eric Christopher6a841382012-11-19 22:42:10 +00001263 DEBUG(dbgs() << "DotDebugLoc Pair:\n"
Devang Patel53b050a2011-07-07 21:44:42 +00001264 << "\t" << *Begin << "\t" << *End << "\n");
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001265 if (End->isDebugValue())
1266 SLabel = getLabelBeforeInsn(End);
1267 else {
1268 // End is a normal instruction clobbering the range.
1269 SLabel = getLabelAfterInsn(End);
1270 assert(SLabel && "Forgot label after clobber instruction");
1271 ++HI;
1272 }
1273 }
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001274
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001275 // The value is valid until the next DBG_VALUE or clobber.
Eric Christopher365d0832011-12-16 23:42:31 +00001276 DotDebugLocEntries.push_back(getDebugLocEntry(Asm, FLabel, SLabel,
1277 Begin));
Devang Patel9fc11702010-05-25 23:40:22 +00001278 }
1279 DotDebugLocEntries.push_back(DotDebugLocEntry());
Devang Patela3e9c9c2010-03-15 18:33:46 +00001280 }
Devang Patele0a94bf2010-05-14 21:01:35 +00001281
1282 // Collect info for variables that were optimized out.
Devang Patel59e27c52011-08-19 23:28:12 +00001283 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
1284 DIArray Variables = DISubprogram(FnScope->getScopeNode()).getVariables();
1285 for (unsigned i = 0, e = Variables.getNumElements(); i != e; ++i) {
1286 DIVariable DV(Variables.getElement(i));
1287 if (!DV || !DV.Verify() || !Processed.insert(DV))
1288 continue;
1289 if (LexicalScope *Scope = LScopes.findLexicalScope(DV.getContext()))
1290 addScopeVariable(Scope, new DbgVariable(DV, NULL));
Devang Patele0a94bf2010-05-14 21:01:35 +00001291 }
Devang Patel9fc11702010-05-25 23:40:22 +00001292}
Devang Patele0a94bf2010-05-14 21:01:35 +00001293
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001294// Return Label preceding the instruction.
Eric Christopher962c9082013-01-15 23:56:56 +00001295MCSymbol *DwarfDebug::getLabelBeforeInsn(const MachineInstr *MI) {
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001296 MCSymbol *Label = LabelsBeforeInsn.lookup(MI);
1297 assert(Label && "Didn't insert label before instruction");
1298 return Label;
Devang Patel9fc11702010-05-25 23:40:22 +00001299}
1300
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001301// Return Label immediately following the instruction.
Eric Christopher962c9082013-01-15 23:56:56 +00001302MCSymbol *DwarfDebug::getLabelAfterInsn(const MachineInstr *MI) {
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001303 return LabelsAfterInsn.lookup(MI);
Devang Patel475d32a2009-10-06 01:26:37 +00001304}
1305
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001306// Process beginning of an instruction.
Devang Patelb5694e72010-10-26 17:49:02 +00001307void DwarfDebug::beginInstruction(const MachineInstr *MI) {
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001308 // Check if source location changes, but ignore DBG_VALUE locations.
1309 if (!MI->isDebugValue()) {
1310 DebugLoc DL = MI->getDebugLoc();
1311 if (DL != PrevInstLoc && (!DL.isUnknown() || UnknownLocations)) {
Eric Christopheraec8a822012-04-05 20:39:05 +00001312 unsigned Flags = 0;
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001313 PrevInstLoc = DL;
Devang Patel34a66202011-05-11 19:22:19 +00001314 if (DL == PrologEndLoc) {
1315 Flags |= DWARF2_FLAG_PROLOGUE_END;
1316 PrologEndLoc = DebugLoc();
1317 }
Eric Christopheraec8a822012-04-05 20:39:05 +00001318 if (PrologEndLoc.isUnknown())
1319 Flags |= DWARF2_FLAG_IS_STMT;
1320
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001321 if (!DL.isUnknown()) {
1322 const MDNode *Scope = DL.getScope(Asm->MF->getFunction()->getContext());
Devang Patel34a66202011-05-11 19:22:19 +00001323 recordSourceLine(DL.getLine(), DL.getCol(), Scope, Flags);
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001324 } else
Devang Patel34a66202011-05-11 19:22:19 +00001325 recordSourceLine(0, 0, 0, 0);
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001326 }
Devang Patel9fc11702010-05-25 23:40:22 +00001327 }
Devang Patel23b2ae62010-03-29 22:59:58 +00001328
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001329 // Insert labels where requested.
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001330 DenseMap<const MachineInstr*, MCSymbol*>::iterator I =
1331 LabelsBeforeInsn.find(MI);
1332
1333 // No label needed.
1334 if (I == LabelsBeforeInsn.end())
1335 return;
1336
1337 // Label already assigned.
1338 if (I->second)
Devang Patel002d54d2010-05-26 19:37:24 +00001339 return;
Devang Patelbd477be2010-03-29 17:20:31 +00001340
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001341 if (!PrevLabel) {
Devang Patelacc32a52010-05-26 21:23:46 +00001342 PrevLabel = MMI->getContext().CreateTempSymbol();
1343 Asm->OutStreamer.EmitLabel(PrevLabel);
Devang Patel002d54d2010-05-26 19:37:24 +00001344 }
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001345 I->second = PrevLabel;
Devang Patel8db360d2009-10-06 01:50:42 +00001346}
1347
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001348// Process end of an instruction.
Devang Patelb5694e72010-10-26 17:49:02 +00001349void DwarfDebug::endInstruction(const MachineInstr *MI) {
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001350 // Don't create a new label after DBG_VALUE instructions.
1351 // They don't generate code.
1352 if (!MI->isDebugValue())
1353 PrevLabel = 0;
1354
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001355 DenseMap<const MachineInstr*, MCSymbol*>::iterator I =
1356 LabelsAfterInsn.find(MI);
1357
1358 // No label needed.
1359 if (I == LabelsAfterInsn.end())
1360 return;
1361
1362 // Label already assigned.
1363 if (I->second)
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001364 return;
1365
1366 // We need a label after this instruction.
1367 if (!PrevLabel) {
1368 PrevLabel = MMI->getContext().CreateTempSymbol();
1369 Asm->OutStreamer.EmitLabel(PrevLabel);
Devang Patel3ebd8932010-04-08 16:50:29 +00001370 }
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001371 I->second = PrevLabel;
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001372}
1373
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001374// Each LexicalScope has first instruction and last instruction to mark
1375// beginning and end of a scope respectively. Create an inverse map that list
1376// scopes starts (and ends) with an instruction. One instruction may start (or
1377// end) multiple scopes. Ignore scopes that are not reachable.
Devang Patel359b0132010-04-08 18:43:56 +00001378void DwarfDebug::identifyScopeMarkers() {
Devang Patel7e623022011-08-10 20:55:27 +00001379 SmallVector<LexicalScope *, 4> WorkList;
1380 WorkList.push_back(LScopes.getCurrentFunctionScope());
Devang Patel7771b7c2010-01-20 02:05:23 +00001381 while (!WorkList.empty()) {
Devang Patel7e623022011-08-10 20:55:27 +00001382 LexicalScope *S = WorkList.pop_back_val();
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001383
Devang Patel7e623022011-08-10 20:55:27 +00001384 const SmallVector<LexicalScope *, 4> &Children = S->getChildren();
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001385 if (!Children.empty())
Devang Patel7e623022011-08-10 20:55:27 +00001386 for (SmallVector<LexicalScope *, 4>::const_iterator SI = Children.begin(),
Devang Patel7771b7c2010-01-20 02:05:23 +00001387 SE = Children.end(); SI != SE; ++SI)
1388 WorkList.push_back(*SI);
1389
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001390 if (S->isAbstractScope())
1391 continue;
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001392
Devang Patel7e623022011-08-10 20:55:27 +00001393 const SmallVector<InsnRange, 4> &Ranges = S->getRanges();
Devang Patel6c74a872010-04-27 19:46:33 +00001394 if (Ranges.empty())
1395 continue;
Devang Patel7e623022011-08-10 20:55:27 +00001396 for (SmallVector<InsnRange, 4>::const_iterator RI = Ranges.begin(),
Devang Patel6c74a872010-04-27 19:46:33 +00001397 RE = Ranges.end(); RI != RE; ++RI) {
Devang Patel7e623022011-08-10 20:55:27 +00001398 assert(RI->first && "InsnRange does not have first instruction!");
1399 assert(RI->second && "InsnRange does not have second instruction!");
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001400 requestLabelBeforeInsn(RI->first);
1401 requestLabelAfterInsn(RI->second);
Devang Patel6c74a872010-04-27 19:46:33 +00001402 }
Devang Patel75cc16c2009-10-01 20:31:14 +00001403 }
Devang Patel75cc16c2009-10-01 20:31:14 +00001404}
1405
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001406// Get MDNode for DebugLoc's scope.
Devang Patel589845d2011-05-09 22:14:49 +00001407static MDNode *getScopeNode(DebugLoc DL, const LLVMContext &Ctx) {
1408 if (MDNode *InlinedAt = DL.getInlinedAt(Ctx))
1409 return getScopeNode(DebugLoc::getFromDILocation(InlinedAt), Ctx);
1410 return DL.getScope(Ctx);
1411}
1412
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001413// Walk up the scope chain of given debug loc and find line number info
1414// for the function.
Devang Patel34a66202011-05-11 19:22:19 +00001415static DebugLoc getFnDebugLoc(DebugLoc DL, const LLVMContext &Ctx) {
1416 const MDNode *Scope = getScopeNode(DL, Ctx);
1417 DISubprogram SP = getDISubprogram(Scope);
Eric Christopher34164192012-04-03 00:43:49 +00001418 if (SP.Verify()) {
1419 // Check for number of operands since the compatibility is
1420 // cheap here.
Eric Christopherb81e2b42012-04-03 17:55:42 +00001421 if (SP->getNumOperands() > 19)
Eric Christopher34164192012-04-03 00:43:49 +00001422 return DebugLoc::get(SP.getScopeLineNumber(), 0, SP);
1423 else
1424 return DebugLoc::get(SP.getLineNumber(), 0, SP);
1425 }
1426
Devang Patel34a66202011-05-11 19:22:19 +00001427 return DebugLoc();
1428}
1429
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001430// Gather pre-function debug information. Assumes being called immediately
1431// after the function entry point has been emitted.
Chris Lattner76555b52010-01-26 23:18:02 +00001432void DwarfDebug::beginFunction(const MachineFunction *MF) {
Chris Lattner196dbdc2010-04-05 03:52:55 +00001433 if (!MMI->hasDebugInfo()) return;
Devang Patel7e623022011-08-10 20:55:27 +00001434 LScopes.initialize(*MF);
1435 if (LScopes.empty()) return;
1436 identifyScopeMarkers();
Devang Patel4598eb62009-10-06 18:37:31 +00001437
Manman Ren4e042a62013-02-05 21:52:47 +00001438 // Set DwarfCompileUnitID in MCContext to the Compile Unit this function
1439 // belongs to.
1440 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
1441 CompileUnit *TheCU = SPMap.lookup(FnScope->getScopeNode());
1442 assert(TheCU && "Unable to find compile unit!");
1443 Asm->OutStreamer.getContext().setDwarfCompileUnitID(TheCU->getUniqueID());
1444
Devang Patel6c74a872010-04-27 19:46:33 +00001445 FunctionBeginSym = Asm->GetTempSymbol("func_begin",
1446 Asm->getFunctionNumber());
Bill Wendling2b128d72009-05-20 23:19:06 +00001447 // Assumes in correct section after the entry point.
Devang Patel6c74a872010-04-27 19:46:33 +00001448 Asm->OutStreamer.EmitLabel(FunctionBeginSym);
Bill Wendling2b128d72009-05-20 23:19:06 +00001449
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001450 assert(UserVariables.empty() && DbgValues.empty() && "Maps weren't cleaned");
1451
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001452 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001453 // LiveUserVar - Map physreg numbers to the MDNode they contain.
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001454 std::vector<const MDNode*> LiveUserVar(TRI->getNumRegs());
1455
Devang Patel002d54d2010-05-26 19:37:24 +00001456 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001457 I != E; ++I) {
1458 bool AtBlockEntry = true;
Devang Patel002d54d2010-05-26 19:37:24 +00001459 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
1460 II != IE; ++II) {
1461 const MachineInstr *MI = II;
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001462
Devang Patel002d54d2010-05-26 19:37:24 +00001463 if (MI->isDebugValue()) {
Nick Lewycky654f5ce2011-10-26 22:55:33 +00001464 assert(MI->getNumOperands() > 1 && "Invalid machine instruction!");
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001465
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001466 // Keep track of user variables.
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001467 const MDNode *Var =
1468 MI->getOperand(MI->getNumOperands() - 1).getMetadata();
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001469
1470 // Variable is in a register, we need to check for clobbers.
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001471 if (isDbgValueInDefinedReg(MI))
1472 LiveUserVar[MI->getOperand(0).getReg()] = Var;
1473
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001474 // Check the history of this variable.
1475 SmallVectorImpl<const MachineInstr*> &History = DbgValues[Var];
1476 if (History.empty()) {
1477 UserVariables.push_back(Var);
1478 // The first mention of a function argument gets the FunctionBeginSym
1479 // label, so arguments are visible when breaking at function entry.
1480 DIVariable DV(Var);
1481 if (DV.Verify() && DV.getTag() == dwarf::DW_TAG_arg_variable &&
1482 DISubprogram(getDISubprogram(DV.getContext()))
1483 .describes(MF->getFunction()))
1484 LabelsBeforeInsn[MI] = FunctionBeginSym;
1485 } else {
1486 // We have seen this variable before. Try to coalesce DBG_VALUEs.
1487 const MachineInstr *Prev = History.back();
1488 if (Prev->isDebugValue()) {
1489 // Coalesce identical entries at the end of History.
1490 if (History.size() >= 2 &&
Devang Patelb7a328e2011-07-07 00:14:27 +00001491 Prev->isIdenticalTo(History[History.size() - 2])) {
Eric Christopher85a495e2012-10-08 20:48:49 +00001492 DEBUG(dbgs() << "Coalescing identical DBG_VALUE entries:\n"
Eric Christopher6a841382012-11-19 22:42:10 +00001493 << "\t" << *Prev
Devang Patelb7a328e2011-07-07 00:14:27 +00001494 << "\t" << *History[History.size() - 2] << "\n");
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001495 History.pop_back();
Devang Patelb7a328e2011-07-07 00:14:27 +00001496 }
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001497
1498 // Terminate old register assignments that don't reach MI;
1499 MachineFunction::const_iterator PrevMBB = Prev->getParent();
1500 if (PrevMBB != I && (!AtBlockEntry || llvm::next(PrevMBB) != I) &&
1501 isDbgValueInDefinedReg(Prev)) {
1502 // Previous register assignment needs to terminate at the end of
1503 // its basic block.
1504 MachineBasicBlock::const_iterator LastMI =
1505 PrevMBB->getLastNonDebugInstr();
Devang Patelb7a328e2011-07-07 00:14:27 +00001506 if (LastMI == PrevMBB->end()) {
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001507 // Drop DBG_VALUE for empty range.
Eric Christopher85a495e2012-10-08 20:48:49 +00001508 DEBUG(dbgs() << "Dropping DBG_VALUE for empty range:\n"
Devang Patelb7a328e2011-07-07 00:14:27 +00001509 << "\t" << *Prev << "\n");
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001510 History.pop_back();
Devang Patelb7a328e2011-07-07 00:14:27 +00001511 }
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001512 else {
1513 // Terminate after LastMI.
1514 History.push_back(LastMI);
1515 }
1516 }
1517 }
1518 }
1519 History.push_back(MI);
Devang Patel002d54d2010-05-26 19:37:24 +00001520 } else {
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001521 // Not a DBG_VALUE instruction.
1522 if (!MI->isLabel())
1523 AtBlockEntry = false;
1524
Eric Christopher133195782012-10-04 20:46:14 +00001525 // First known non-DBG_VALUE and non-frame setup location marks
1526 // the beginning of the function body.
1527 if (!MI->getFlag(MachineInstr::FrameSetup) &&
1528 (PrologEndLoc.isUnknown() && !MI->getDebugLoc().isUnknown()))
Devang Patel34a66202011-05-11 19:22:19 +00001529 PrologEndLoc = MI->getDebugLoc();
1530
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001531 // Check if the instruction clobbers any registers with debug vars.
1532 for (MachineInstr::const_mop_iterator MOI = MI->operands_begin(),
1533 MOE = MI->operands_end(); MOI != MOE; ++MOI) {
1534 if (!MOI->isReg() || !MOI->isDef() || !MOI->getReg())
1535 continue;
Jakob Stoklund Olesen54038d72012-06-01 23:28:30 +00001536 for (MCRegAliasIterator AI(MOI->getReg(), TRI, true);
1537 AI.isValid(); ++AI) {
1538 unsigned Reg = *AI;
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001539 const MDNode *Var = LiveUserVar[Reg];
1540 if (!Var)
1541 continue;
1542 // Reg is now clobbered.
1543 LiveUserVar[Reg] = 0;
1544
1545 // Was MD last defined by a DBG_VALUE referring to Reg?
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001546 DbgValueHistoryMap::iterator HistI = DbgValues.find(Var);
1547 if (HistI == DbgValues.end())
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001548 continue;
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001549 SmallVectorImpl<const MachineInstr*> &History = HistI->second;
1550 if (History.empty())
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001551 continue;
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001552 const MachineInstr *Prev = History.back();
1553 // Sanity-check: Register assignments are terminated at the end of
1554 // their block.
1555 if (!Prev->isDebugValue() || Prev->getParent() != MI->getParent())
1556 continue;
1557 // Is the variable still in Reg?
1558 if (!isDbgValueInDefinedReg(Prev) ||
1559 Prev->getOperand(0).getReg() != Reg)
1560 continue;
1561 // Var is clobbered. Make sure the next instruction gets a label.
1562 History.push_back(MI);
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001563 }
1564 }
Devang Patel002d54d2010-05-26 19:37:24 +00001565 }
Devang Patel002d54d2010-05-26 19:37:24 +00001566 }
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001567 }
1568
1569 for (DbgValueHistoryMap::iterator I = DbgValues.begin(), E = DbgValues.end();
1570 I != E; ++I) {
1571 SmallVectorImpl<const MachineInstr*> &History = I->second;
1572 if (History.empty())
1573 continue;
1574
1575 // Make sure the final register assignments are terminated.
1576 const MachineInstr *Prev = History.back();
1577 if (Prev->isDebugValue() && isDbgValueInDefinedReg(Prev)) {
1578 const MachineBasicBlock *PrevMBB = Prev->getParent();
Eric Christopher6a841382012-11-19 22:42:10 +00001579 MachineBasicBlock::const_iterator LastMI =
Devang Patel784077e2011-08-10 23:58:09 +00001580 PrevMBB->getLastNonDebugInstr();
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001581 if (LastMI == PrevMBB->end())
1582 // Drop DBG_VALUE for empty range.
1583 History.pop_back();
1584 else {
1585 // Terminate after LastMI.
1586 History.push_back(LastMI);
1587 }
1588 }
1589 // Request labels for the full history.
1590 for (unsigned i = 0, e = History.size(); i != e; ++i) {
1591 const MachineInstr *MI = History[i];
1592 if (MI->isDebugValue())
1593 requestLabelBeforeInsn(MI);
1594 else
1595 requestLabelAfterInsn(MI);
1596 }
1597 }
Devang Patel002d54d2010-05-26 19:37:24 +00001598
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001599 PrevInstLoc = DebugLoc();
Devang Patel002d54d2010-05-26 19:37:24 +00001600 PrevLabel = FunctionBeginSym;
Devang Patel34a66202011-05-11 19:22:19 +00001601
1602 // Record beginning of function.
1603 if (!PrologEndLoc.isUnknown()) {
1604 DebugLoc FnStartDL = getFnDebugLoc(PrologEndLoc,
1605 MF->getFunction()->getContext());
1606 recordSourceLine(FnStartDL.getLine(), FnStartDL.getCol(),
1607 FnStartDL.getScope(MF->getFunction()->getContext()),
David Blaikie67cb31e2012-12-04 22:02:33 +00001608 // We'd like to list the prologue as "not statements" but GDB behaves
1609 // poorly if we do that. Revisit this with caution/GDB (7.5+) testing.
David Blaikie5a773bb2012-12-04 21:05:36 +00001610 DWARF2_FLAG_IS_STMT);
Devang Patel34a66202011-05-11 19:22:19 +00001611 }
Bill Wendling2b128d72009-05-20 23:19:06 +00001612}
1613
Devang Patel7e623022011-08-10 20:55:27 +00001614void DwarfDebug::addScopeVariable(LexicalScope *LS, DbgVariable *Var) {
1615// SmallVector<DbgVariable *, 8> &Vars = ScopeVariables.lookup(LS);
1616 ScopeVariables[LS].push_back(Var);
1617// Vars.push_back(Var);
1618}
1619
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001620// Gather and emit post-function debug information.
Chris Lattner76555b52010-01-26 23:18:02 +00001621void DwarfDebug::endFunction(const MachineFunction *MF) {
Devang Patel7e623022011-08-10 20:55:27 +00001622 if (!MMI->hasDebugInfo() || LScopes.empty()) return;
Devang Patel2904aa92009-11-12 19:02:56 +00001623
Devang Patel7e623022011-08-10 20:55:27 +00001624 // Define end label for subprogram.
1625 FunctionEndSym = Asm->GetTempSymbol("func_end",
1626 Asm->getFunctionNumber());
1627 // Assumes in correct section after the entry point.
1628 Asm->OutStreamer.EmitLabel(FunctionEndSym);
Manman Ren4e042a62013-02-05 21:52:47 +00001629 // Set DwarfCompileUnitID in MCContext to default value.
1630 Asm->OutStreamer.getContext().setDwarfCompileUnitID(0);
Eric Christopher6a841382012-11-19 22:42:10 +00001631
Devang Patel7e623022011-08-10 20:55:27 +00001632 SmallPtrSet<const MDNode *, 16> ProcessedVars;
1633 collectVariableInfo(MF, ProcessedVars);
Eric Christopher6a841382012-11-19 22:42:10 +00001634
Devang Patel3acc70e2011-08-15 22:04:40 +00001635 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
Devang Pateleb1bb4e2011-08-16 22:09:43 +00001636 CompileUnit *TheCU = SPMap.lookup(FnScope->getScopeNode());
Nick Lewycky654f5ce2011-10-26 22:55:33 +00001637 assert(TheCU && "Unable to find compile unit!");
Devang Patel3acc70e2011-08-15 22:04:40 +00001638
Devang Patel7e623022011-08-10 20:55:27 +00001639 // Construct abstract scopes.
Devang Patel44403472011-08-12 18:10:19 +00001640 ArrayRef<LexicalScope *> AList = LScopes.getAbstractScopesList();
1641 for (unsigned i = 0, e = AList.size(); i != e; ++i) {
1642 LexicalScope *AScope = AList[i];
1643 DISubprogram SP(AScope->getScopeNode());
Devang Patel7e623022011-08-10 20:55:27 +00001644 if (SP.Verify()) {
1645 // Collect info for variables that were optimized out.
Devang Patel59e27c52011-08-19 23:28:12 +00001646 DIArray Variables = SP.getVariables();
1647 for (unsigned i = 0, e = Variables.getNumElements(); i != e; ++i) {
1648 DIVariable DV(Variables.getElement(i));
1649 if (!DV || !DV.Verify() || !ProcessedVars.insert(DV))
1650 continue;
Alexey Samsonov39602782012-07-06 08:45:08 +00001651 // Check that DbgVariable for DV wasn't created earlier, when
1652 // findAbstractVariable() was called for inlined instance of DV.
1653 LLVMContext &Ctx = DV->getContext();
1654 DIVariable CleanDV = cleanseInlinedVariable(DV, Ctx);
1655 if (AbstractVariables.lookup(CleanDV))
1656 continue;
Devang Patel59e27c52011-08-19 23:28:12 +00001657 if (LexicalScope *Scope = LScopes.findAbstractScope(DV.getContext()))
1658 addScopeVariable(Scope, new DbgVariable(DV, NULL));
Devang Patel5c0f85c2010-06-25 22:07:34 +00001659 }
1660 }
Devang Patel44403472011-08-12 18:10:19 +00001661 if (ProcessedSPNodes.count(AScope->getScopeNode()) == 0)
Devang Patel3acc70e2011-08-15 22:04:40 +00001662 constructScopeDIE(TheCU, AScope);
Bill Wendling2b128d72009-05-20 23:19:06 +00001663 }
Eric Christopher6a841382012-11-19 22:42:10 +00001664
Devang Patel3acc70e2011-08-15 22:04:40 +00001665 DIE *CurFnDIE = constructScopeDIE(TheCU, FnScope);
Eric Christopher6a841382012-11-19 22:42:10 +00001666
Nick Lewycky50f02cb2011-12-02 22:16:29 +00001667 if (!MF->getTarget().Options.DisableFramePointerElim(*MF))
Eric Christopherbb69a272012-08-24 01:14:27 +00001668 TheCU->addFlag(CurFnDIE, dwarf::DW_AT_APPLE_omit_frame_ptr);
Devang Patel3acc70e2011-08-15 22:04:40 +00001669
Devang Patel7e623022011-08-10 20:55:27 +00001670 DebugFrames.push_back(FunctionDebugFrameInfo(Asm->getFunctionNumber(),
1671 MMI->getFrameMoves()));
Bill Wendling2b128d72009-05-20 23:19:06 +00001672
Bill Wendling2b128d72009-05-20 23:19:06 +00001673 // Clear debug info
Devang Patel7e623022011-08-10 20:55:27 +00001674 for (DenseMap<LexicalScope *, SmallVector<DbgVariable *, 8> >::iterator
1675 I = ScopeVariables.begin(), E = ScopeVariables.end(); I != E; ++I)
1676 DeleteContainerPointers(I->second);
1677 ScopeVariables.clear();
Devang Patelad45d912011-04-22 18:09:57 +00001678 DeleteContainerPointers(CurrentFnArguments);
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001679 UserVariables.clear();
1680 DbgValues.clear();
Jeffrey Yasskin35b4e4f2010-03-12 17:45:06 +00001681 AbstractVariables.clear();
Devang Patel6c74a872010-04-27 19:46:33 +00001682 LabelsBeforeInsn.clear();
1683 LabelsAfterInsn.clear();
Devang Patel12563b32010-04-16 23:33:45 +00001684 PrevLabel = NULL;
Bill Wendling2b128d72009-05-20 23:19:06 +00001685}
1686
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001687// Register a source line with debug info. Returns the unique label that was
1688// emitted and which provides correspondence to the source line list.
Devang Patel34a66202011-05-11 19:22:19 +00001689void DwarfDebug::recordSourceLine(unsigned Line, unsigned Col, const MDNode *S,
1690 unsigned Flags) {
Devang Patel2d9caf92009-11-25 17:36:49 +00001691 StringRef Fn;
Devang Patele01b75c2011-03-24 20:30:50 +00001692 StringRef Dir;
Dan Gohman50849c62010-05-05 23:41:32 +00001693 unsigned Src = 1;
1694 if (S) {
1695 DIDescriptor Scope(S);
Devang Patel2089d162009-10-05 18:03:19 +00001696
Dan Gohman50849c62010-05-05 23:41:32 +00001697 if (Scope.isCompileUnit()) {
1698 DICompileUnit CU(S);
Dan Gohman50849c62010-05-05 23:41:32 +00001699 Fn = CU.getFilename();
Devang Patele01b75c2011-03-24 20:30:50 +00001700 Dir = CU.getDirectory();
Devang Patelc4b69052010-10-28 17:30:52 +00001701 } else if (Scope.isFile()) {
1702 DIFile F(S);
Devang Patelc4b69052010-10-28 17:30:52 +00001703 Fn = F.getFilename();
Devang Patele01b75c2011-03-24 20:30:50 +00001704 Dir = F.getDirectory();
Dan Gohman50849c62010-05-05 23:41:32 +00001705 } else if (Scope.isSubprogram()) {
1706 DISubprogram SP(S);
Dan Gohman50849c62010-05-05 23:41:32 +00001707 Fn = SP.getFilename();
Devang Patele01b75c2011-03-24 20:30:50 +00001708 Dir = SP.getDirectory();
Eric Christopher6647b832011-10-11 22:59:11 +00001709 } else if (Scope.isLexicalBlockFile()) {
1710 DILexicalBlockFile DBF(S);
1711 Fn = DBF.getFilename();
1712 Dir = DBF.getDirectory();
Dan Gohman50849c62010-05-05 23:41:32 +00001713 } else if (Scope.isLexicalBlock()) {
1714 DILexicalBlock DB(S);
Dan Gohman50849c62010-05-05 23:41:32 +00001715 Fn = DB.getFilename();
Devang Patele01b75c2011-03-24 20:30:50 +00001716 Dir = DB.getDirectory();
Dan Gohman50849c62010-05-05 23:41:32 +00001717 } else
Craig Topperee4dab52012-02-05 08:31:47 +00001718 llvm_unreachable("Unexpected scope info");
Dan Gohman50849c62010-05-05 23:41:32 +00001719
Manman Ren1e427202013-03-07 01:42:00 +00001720 Src = getOrCreateSourceID(Fn, Dir,
1721 Asm->OutStreamer.getContext().getDwarfCompileUnitID());
Dan Gohman50849c62010-05-05 23:41:32 +00001722 }
Nick Lewycky019d2552011-07-29 03:49:23 +00001723 Asm->OutStreamer.EmitDwarfLocDirective(Src, Line, Col, Flags, 0, 0, Fn);
Bill Wendling2b128d72009-05-20 23:19:06 +00001724}
1725
Bill Wendling806535f2009-05-20 23:22:40 +00001726//===----------------------------------------------------------------------===//
1727// Emit Methods
1728//===----------------------------------------------------------------------===//
1729
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001730// Compute the size and offset of a DIE.
Jim Grosbach00e9c612009-11-22 19:20:36 +00001731unsigned
Eric Christopherc8a310e2012-12-10 23:34:43 +00001732DwarfUnits::computeSizeAndOffset(DIE *Die, unsigned Offset) {
Bill Wendling480ff322009-05-20 23:21:38 +00001733 // Get the children.
1734 const std::vector<DIE *> &Children = Die->getChildren();
1735
Bill Wendling480ff322009-05-20 23:21:38 +00001736 // Record the abbreviation.
Devang Patel930143b2009-11-21 02:48:08 +00001737 assignAbbrevNumber(Die->getAbbrev());
Bill Wendling480ff322009-05-20 23:21:38 +00001738
1739 // Get the abbreviation for this DIE.
1740 unsigned AbbrevNumber = Die->getAbbrevNumber();
Eric Christopherc8a310e2012-12-10 23:34:43 +00001741 const DIEAbbrev *Abbrev = Abbreviations->at(AbbrevNumber - 1);
Bill Wendling480ff322009-05-20 23:21:38 +00001742
1743 // Set DIE offset
1744 Die->setOffset(Offset);
1745
1746 // Start the size with the size of abbreviation code.
Chris Lattner7b26fce2009-08-22 20:48:53 +00001747 Offset += MCAsmInfo::getULEB128Size(AbbrevNumber);
Bill Wendling480ff322009-05-20 23:21:38 +00001748
Eric Christopher4887c8f2013-03-29 23:34:06 +00001749 const SmallVectorImpl<DIEValue*> &Values = Die->getValues();
1750 const SmallVectorImpl<DIEAbbrevData> &AbbrevData = Abbrev->getData();
Bill Wendling480ff322009-05-20 23:21:38 +00001751
1752 // Size the DIE attribute values.
1753 for (unsigned i = 0, N = Values.size(); i < N; ++i)
1754 // Size attribute value.
Chris Lattner5a00dea2010-04-05 00:18:22 +00001755 Offset += Values[i]->SizeOf(Asm, AbbrevData[i].getForm());
Bill Wendling480ff322009-05-20 23:21:38 +00001756
1757 // Size the DIE children if any.
1758 if (!Children.empty()) {
1759 assert(Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes &&
1760 "Children flag not set");
1761
1762 for (unsigned j = 0, M = Children.size(); j < M; ++j)
Eric Christopher1f0cbb82012-11-20 22:14:13 +00001763 Offset = computeSizeAndOffset(Children[j], Offset);
Bill Wendling480ff322009-05-20 23:21:38 +00001764
1765 // End of children marker.
1766 Offset += sizeof(int8_t);
1767 }
1768
1769 Die->setSize(Offset - Die->getOffset());
1770 return Offset;
1771}
1772
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001773// Compute the size and offset of all the DIEs.
Eric Christopherc8a310e2012-12-10 23:34:43 +00001774void DwarfUnits::computeSizeAndOffsets() {
Manman Ren14a029d2013-03-12 18:27:15 +00001775 // Offset from the beginning of debug info section.
1776 unsigned AccuOffset = 0;
Eric Christopher4887c8f2013-03-29 23:34:06 +00001777 for (SmallVectorImpl<CompileUnit *>::iterator I = CUs.begin(),
Eric Christopherc8a310e2012-12-10 23:34:43 +00001778 E = CUs.end(); I != E; ++I) {
Manman Ren14a029d2013-03-12 18:27:15 +00001779 (*I)->setDebugInfoOffset(AccuOffset);
Eric Christopher9c2ecd92012-11-30 23:59:06 +00001780 unsigned Offset =
1781 sizeof(int32_t) + // Length of Compilation Unit Info
1782 sizeof(int16_t) + // DWARF version number
1783 sizeof(int32_t) + // Offset Into Abbrev. Section
1784 sizeof(int8_t); // Pointer Size (in bytes)
1785
Manman Ren14a029d2013-03-12 18:27:15 +00001786 unsigned EndOffset = computeSizeAndOffset((*I)->getCUDie(), Offset);
1787 AccuOffset += EndOffset;
Devang Patel1a0df9a2010-05-10 22:49:55 +00001788 }
Bill Wendling480ff322009-05-20 23:21:38 +00001789}
1790
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001791// Emit initial Dwarf sections with a label at the start of each one.
Eric Christopher7b30f2e42012-11-21 00:34:35 +00001792void DwarfDebug::emitSectionLabels() {
Chris Lattner4b7dadb2009-08-19 05:49:37 +00001793 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
Daniel Dunbarc418d6b2009-09-19 20:40:05 +00001794
Bill Wendling480ff322009-05-20 23:21:38 +00001795 // Dwarf sections base addresses.
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001796 DwarfInfoSectionSym =
Eric Christopher7b30f2e42012-11-21 00:34:35 +00001797 emitSectionSym(Asm, TLOF.getDwarfInfoSection(), "section_info");
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001798 DwarfAbbrevSectionSym =
Eric Christopher7b30f2e42012-11-21 00:34:35 +00001799 emitSectionSym(Asm, TLOF.getDwarfAbbrevSection(), "section_abbrev");
Eric Christopher3c5a1912012-12-19 22:02:53 +00001800 if (useSplitDwarf())
1801 DwarfAbbrevDWOSectionSym =
1802 emitSectionSym(Asm, TLOF.getDwarfAbbrevDWOSection(),
1803 "section_abbrev_dwo");
Eric Christopher7b30f2e42012-11-21 00:34:35 +00001804 emitSectionSym(Asm, TLOF.getDwarfARangesSection());
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001805
Chris Lattner6629ca92010-04-04 22:59:04 +00001806 if (const MCSection *MacroInfo = TLOF.getDwarfMacroInfoSection())
Eric Christopher7b30f2e42012-11-21 00:34:35 +00001807 emitSectionSym(Asm, MacroInfo);
Bill Wendling480ff322009-05-20 23:21:38 +00001808
Eric Christopher74804332013-02-07 21:19:50 +00001809 DwarfLineSectionSym =
1810 emitSectionSym(Asm, TLOF.getDwarfLineSection(), "section_line");
Eric Christopher7b30f2e42012-11-21 00:34:35 +00001811 emitSectionSym(Asm, TLOF.getDwarfLocSection());
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00001812 if (GenerateDwarfPubNamesSection)
1813 emitSectionSym(Asm, TLOF.getDwarfPubNamesSection());
Eric Christopher7b30f2e42012-11-21 00:34:35 +00001814 emitSectionSym(Asm, TLOF.getDwarfPubTypesSection());
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001815 DwarfStrSectionSym =
Eric Christopher3bf29fd2012-12-27 02:14:01 +00001816 emitSectionSym(Asm, TLOF.getDwarfStrSection(), "info_string");
Eric Christopher55863be2013-04-07 03:43:09 +00001817 if (useSplitDwarf()) {
Eric Christopher3bf29fd2012-12-27 02:14:01 +00001818 DwarfStrDWOSectionSym =
1819 emitSectionSym(Asm, TLOF.getDwarfStrDWOSection(), "skel_string");
Eric Christopher55863be2013-04-07 03:43:09 +00001820 DwarfAddrSectionSym =
1821 emitSectionSym(Asm, TLOF.getDwarfAddrSection(), "addr_sec");
1822 }
Eric Christopher7b30f2e42012-11-21 00:34:35 +00001823 DwarfDebugRangeSectionSym = emitSectionSym(Asm, TLOF.getDwarfRangesSection(),
Devang Patel12563b32010-04-16 23:33:45 +00001824 "debug_range");
Bill Wendling480ff322009-05-20 23:21:38 +00001825
Eric Christopher7b30f2e42012-11-21 00:34:35 +00001826 DwarfDebugLocSectionSym = emitSectionSym(Asm, TLOF.getDwarfLocSection(),
Devang Patel9fc11702010-05-25 23:40:22 +00001827 "section_debug_loc");
1828
Eric Christopher7b30f2e42012-11-21 00:34:35 +00001829 TextSectionSym = emitSectionSym(Asm, TLOF.getTextSection(), "text_begin");
1830 emitSectionSym(Asm, TLOF.getDataSection());
Bill Wendling480ff322009-05-20 23:21:38 +00001831}
1832
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001833// Recursively emits a debug information entry.
Eric Christopher3c5a1912012-12-19 22:02:53 +00001834void DwarfDebug::emitDIE(DIE *Die, std::vector<DIEAbbrev *> *Abbrevs) {
Bill Wendling480ff322009-05-20 23:21:38 +00001835 // Get the abbreviation for this DIE.
1836 unsigned AbbrevNumber = Die->getAbbrevNumber();
Eric Christopher3c5a1912012-12-19 22:02:53 +00001837 const DIEAbbrev *Abbrev = Abbrevs->at(AbbrevNumber - 1);
Bill Wendling480ff322009-05-20 23:21:38 +00001838
Bill Wendling480ff322009-05-20 23:21:38 +00001839 // Emit the code (index) for the abbreviation.
Chris Lattner7bde8c02010-04-04 18:52:31 +00001840 if (Asm->isVerbose())
Chris Lattnerfa823552010-01-22 23:18:42 +00001841 Asm->OutStreamer.AddComment("Abbrev [" + Twine(AbbrevNumber) + "] 0x" +
1842 Twine::utohexstr(Die->getOffset()) + ":0x" +
1843 Twine::utohexstr(Die->getSize()) + " " +
1844 dwarf::TagString(Abbrev->getTag()));
Chris Lattner9efd1182010-04-04 19:09:29 +00001845 Asm->EmitULEB128(AbbrevNumber);
Bill Wendling480ff322009-05-20 23:21:38 +00001846
Eric Christopher4887c8f2013-03-29 23:34:06 +00001847 const SmallVectorImpl<DIEValue*> &Values = Die->getValues();
1848 const SmallVectorImpl<DIEAbbrevData> &AbbrevData = Abbrev->getData();
Bill Wendling480ff322009-05-20 23:21:38 +00001849
1850 // Emit the DIE attribute values.
1851 for (unsigned i = 0, N = Values.size(); i < N; ++i) {
1852 unsigned Attr = AbbrevData[i].getAttribute();
1853 unsigned Form = AbbrevData[i].getForm();
1854 assert(Form && "Too many attributes for DIE (check abbreviation)");
1855
Chris Lattner7bde8c02010-04-04 18:52:31 +00001856 if (Asm->isVerbose())
Chris Lattner5adf9872010-01-24 18:54:17 +00001857 Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr));
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001858
Bill Wendling480ff322009-05-20 23:21:38 +00001859 switch (Attr) {
Bill Wendling480ff322009-05-20 23:21:38 +00001860 case dwarf::DW_AT_abstract_origin: {
1861 DIEEntry *E = cast<DIEEntry>(Values[i]);
1862 DIE *Origin = E->getEntry();
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001863 unsigned Addr = Origin->getOffset();
Manman Ren14a029d2013-03-12 18:27:15 +00001864 if (Form == dwarf::DW_FORM_ref_addr) {
1865 // For DW_FORM_ref_addr, output the offset from beginning of debug info
1866 // section. Origin->getOffset() returns the offset from start of the
1867 // compile unit.
1868 DwarfUnits &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
1869 Addr += Holder.getCUOffset(Origin->getCompileUnit());
1870 }
Manman Renbdcb4462013-04-04 23:13:11 +00001871 Asm->EmitInt32(Addr);
Bill Wendling480ff322009-05-20 23:21:38 +00001872 break;
1873 }
Devang Patel12563b32010-04-16 23:33:45 +00001874 case dwarf::DW_AT_ranges: {
1875 // DW_AT_range Value encodes offset in debug_range section.
1876 DIEInteger *V = cast<DIEInteger>(Values[i]);
Devang Patelda3ef852010-09-02 16:43:44 +00001877
Nick Lewycky33da3362012-06-22 01:25:12 +00001878 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections()) {
Devang Patelda3ef852010-09-02 16:43:44 +00001879 Asm->EmitLabelPlusOffset(DwarfDebugRangeSectionSym,
1880 V->getValue(),
1881 4);
1882 } else {
1883 Asm->EmitLabelOffsetDifference(DwarfDebugRangeSectionSym,
1884 V->getValue(),
1885 DwarfDebugRangeSectionSym,
1886 4);
1887 }
Devang Patel12563b32010-04-16 23:33:45 +00001888 break;
1889 }
Devang Patel9fc11702010-05-25 23:40:22 +00001890 case dwarf::DW_AT_location: {
Nick Lewycky33da3362012-06-22 01:25:12 +00001891 if (DIELabel *L = dyn_cast<DIELabel>(Values[i])) {
1892 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
1893 Asm->EmitLabelReference(L->getValue(), 4);
1894 else
1895 Asm->EmitLabelDifference(L->getValue(), DwarfDebugLocSectionSym, 4);
1896 } else {
Devang Patel9fc11702010-05-25 23:40:22 +00001897 Values[i]->EmitValue(Asm, Form);
Nick Lewycky33da3362012-06-22 01:25:12 +00001898 }
Devang Patel9fc11702010-05-25 23:40:22 +00001899 break;
1900 }
Devang Patela1bd5a12010-09-29 19:08:08 +00001901 case dwarf::DW_AT_accessibility: {
1902 if (Asm->isVerbose()) {
1903 DIEInteger *V = cast<DIEInteger>(Values[i]);
1904 Asm->OutStreamer.AddComment(dwarf::AccessibilityString(V->getValue()));
1905 }
1906 Values[i]->EmitValue(Asm, Form);
1907 break;
1908 }
Bill Wendling480ff322009-05-20 23:21:38 +00001909 default:
1910 // Emit an attribute using the defined form.
Chris Lattner3a383cb2010-04-05 00:13:49 +00001911 Values[i]->EmitValue(Asm, Form);
Bill Wendling480ff322009-05-20 23:21:38 +00001912 break;
1913 }
Bill Wendling480ff322009-05-20 23:21:38 +00001914 }
1915
1916 // Emit the DIE children if any.
1917 if (Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes) {
1918 const std::vector<DIE *> &Children = Die->getChildren();
1919
1920 for (unsigned j = 0, M = Children.size(); j < M; ++j)
Eric Christopher3c5a1912012-12-19 22:02:53 +00001921 emitDIE(Children[j], Abbrevs);
Bill Wendling480ff322009-05-20 23:21:38 +00001922
Chris Lattner7bde8c02010-04-04 18:52:31 +00001923 if (Asm->isVerbose())
Chris Lattner566cae92010-03-09 23:52:58 +00001924 Asm->OutStreamer.AddComment("End Of Children Mark");
1925 Asm->EmitInt8(0);
Bill Wendling480ff322009-05-20 23:21:38 +00001926 }
1927}
1928
Eric Christophera2de8262012-12-15 00:04:07 +00001929// Emit the various dwarf units to the unit section USection with
1930// the abbreviations going into ASection.
1931void DwarfUnits::emitUnits(DwarfDebug *DD,
1932 const MCSection *USection,
1933 const MCSection *ASection,
1934 const MCSymbol *ASectionSym) {
1935 Asm->OutStreamer.SwitchSection(USection);
Eric Christopher4887c8f2013-03-29 23:34:06 +00001936 for (SmallVectorImpl<CompileUnit *>::iterator I = CUs.begin(),
Eric Christophera2de8262012-12-15 00:04:07 +00001937 E = CUs.end(); I != E; ++I) {
1938 CompileUnit *TheCU = *I;
Devang Patel1a0df9a2010-05-10 22:49:55 +00001939 DIE *Die = TheCU->getCUDie();
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001940
Devang Patel1a0df9a2010-05-10 22:49:55 +00001941 // Emit the compile units header.
Eric Christophera2de8262012-12-15 00:04:07 +00001942 Asm->OutStreamer
1943 .EmitLabel(Asm->GetTempSymbol(USection->getLabelBeginName(),
1944 TheCU->getUniqueID()));
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001945
Devang Patel1a0df9a2010-05-10 22:49:55 +00001946 // Emit size of content not including length itself
1947 unsigned ContentSize = Die->getSize() +
1948 sizeof(int16_t) + // DWARF version number
1949 sizeof(int32_t) + // Offset Into Abbrev. Section
Devang Patele141234942011-04-13 19:41:17 +00001950 sizeof(int8_t); // Pointer Size (in bytes)
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001951
Devang Patel1a0df9a2010-05-10 22:49:55 +00001952 Asm->OutStreamer.AddComment("Length of Compilation Unit Info");
1953 Asm->EmitInt32(ContentSize);
1954 Asm->OutStreamer.AddComment("DWARF version number");
1955 Asm->EmitInt16(dwarf::DWARF_VERSION);
1956 Asm->OutStreamer.AddComment("Offset Into Abbrev. Section");
Eric Christophera2de8262012-12-15 00:04:07 +00001957 Asm->EmitSectionOffset(Asm->GetTempSymbol(ASection->getLabelBeginName()),
1958 ASectionSym);
Devang Patel1a0df9a2010-05-10 22:49:55 +00001959 Asm->OutStreamer.AddComment("Address Size (in bytes)");
Chandler Carruth5da3f052012-11-01 09:14:31 +00001960 Asm->EmitInt8(Asm->getDataLayout().getPointerSize());
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001961
Eric Christopher3c5a1912012-12-19 22:02:53 +00001962 DD->emitDIE(Die, Abbreviations);
Eric Christophera2de8262012-12-15 00:04:07 +00001963 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol(USection->getLabelEndName(),
Eli Benderskyb42d1462012-12-03 18:45:45 +00001964 TheCU->getUniqueID()));
Devang Patel1a0df9a2010-05-10 22:49:55 +00001965 }
Bill Wendling480ff322009-05-20 23:21:38 +00001966}
1967
Manman Ren14a029d2013-03-12 18:27:15 +00001968/// For a given compile unit DIE, returns offset from beginning of debug info.
1969unsigned DwarfUnits::getCUOffset(DIE *Die) {
Manman Ren11fec382013-03-13 18:41:27 +00001970 assert(Die->getTag() == dwarf::DW_TAG_compile_unit &&
1971 "Input DIE should be compile unit in getCUOffset.");
Eric Christopher4887c8f2013-03-29 23:34:06 +00001972 for (SmallVectorImpl<CompileUnit *>::iterator I = CUs.begin(),
Manman Ren14a029d2013-03-12 18:27:15 +00001973 E = CUs.end(); I != E; ++I) {
1974 CompileUnit *TheCU = *I;
1975 if (TheCU->getCUDie() == Die)
1976 return TheCU->getDebugInfoOffset();
1977 }
Manman Ren11fec382013-03-13 18:41:27 +00001978 llvm_unreachable("The compile unit DIE should belong to CUs in DwarfUnits.");
Manman Ren14a029d2013-03-12 18:27:15 +00001979}
1980
Eric Christopher9c2ecd92012-11-30 23:59:06 +00001981// Emit the debug info section.
1982void DwarfDebug::emitDebugInfo() {
Eric Christophera2de8262012-12-15 00:04:07 +00001983 DwarfUnits &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
1984
1985 Holder.emitUnits(this, Asm->getObjFileLowering().getDwarfInfoSection(),
1986 Asm->getObjFileLowering().getDwarfAbbrevSection(),
1987 DwarfAbbrevSectionSym);
Eric Christopher9c2ecd92012-11-30 23:59:06 +00001988}
1989
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001990// Emit the abbreviation section.
Eric Christopher38371952012-11-20 23:30:11 +00001991void DwarfDebug::emitAbbreviations() {
Eric Christopher3c5a1912012-12-19 22:02:53 +00001992 if (!useSplitDwarf())
1993 emitAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevSection(),
1994 &Abbreviations);
1995 else
1996 emitSkeletonAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevSection());
1997}
Bill Wendling480ff322009-05-20 23:21:38 +00001998
Eric Christopher3c5a1912012-12-19 22:02:53 +00001999void DwarfDebug::emitAbbrevs(const MCSection *Section,
2000 std::vector<DIEAbbrev *> *Abbrevs) {
2001 // Check to see if it is worth the effort.
2002 if (!Abbrevs->empty()) {
2003 // Start the debug abbrev section.
2004 Asm->OutStreamer.SwitchSection(Section);
2005
2006 MCSymbol *Begin = Asm->GetTempSymbol(Section->getLabelBeginName());
Eric Christopher996b2b72012-12-13 03:00:38 +00002007 Asm->OutStreamer.EmitLabel(Begin);
Bill Wendling480ff322009-05-20 23:21:38 +00002008
2009 // For each abbrevation.
Eric Christopher3c5a1912012-12-19 22:02:53 +00002010 for (unsigned i = 0, N = Abbrevs->size(); i < N; ++i) {
Bill Wendling480ff322009-05-20 23:21:38 +00002011 // Get abbreviation data
Eric Christopher3c5a1912012-12-19 22:02:53 +00002012 const DIEAbbrev *Abbrev = Abbrevs->at(i);
Bill Wendling480ff322009-05-20 23:21:38 +00002013
2014 // Emit the abbrevations code (base 1 index.)
Chris Lattner9efd1182010-04-04 19:09:29 +00002015 Asm->EmitULEB128(Abbrev->getNumber(), "Abbreviation Code");
Bill Wendling480ff322009-05-20 23:21:38 +00002016
2017 // Emit the abbreviations data.
Chris Lattner3a383cb2010-04-05 00:13:49 +00002018 Abbrev->Emit(Asm);
Bill Wendling480ff322009-05-20 23:21:38 +00002019 }
2020
2021 // Mark end of abbreviations.
Chris Lattner9efd1182010-04-04 19:09:29 +00002022 Asm->EmitULEB128(0, "EOM(3)");
Bill Wendling480ff322009-05-20 23:21:38 +00002023
Eric Christopher3c5a1912012-12-19 22:02:53 +00002024 MCSymbol *End = Asm->GetTempSymbol(Section->getLabelEndName());
Eric Christopher996b2b72012-12-13 03:00:38 +00002025 Asm->OutStreamer.EmitLabel(End);
Bill Wendling480ff322009-05-20 23:21:38 +00002026 }
2027}
2028
Eric Christopheracdcbdb2012-11-27 22:43:45 +00002029// Emit the last address of the section and the end of the line matrix.
Devang Patel930143b2009-11-21 02:48:08 +00002030void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) {
Bill Wendling480ff322009-05-20 23:21:38 +00002031 // Define last address of section.
Chris Lattner566cae92010-03-09 23:52:58 +00002032 Asm->OutStreamer.AddComment("Extended Op");
2033 Asm->EmitInt8(0);
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002034
Chris Lattner566cae92010-03-09 23:52:58 +00002035 Asm->OutStreamer.AddComment("Op size");
Chandler Carruth5da3f052012-11-01 09:14:31 +00002036 Asm->EmitInt8(Asm->getDataLayout().getPointerSize() + 1);
Chris Lattner566cae92010-03-09 23:52:58 +00002037 Asm->OutStreamer.AddComment("DW_LNE_set_address");
2038 Asm->EmitInt8(dwarf::DW_LNE_set_address);
2039
2040 Asm->OutStreamer.AddComment("Section end label");
Chris Lattnerb245dfb2010-03-10 01:17:49 +00002041
Chris Lattnera179b522010-04-04 19:25:43 +00002042 Asm->OutStreamer.EmitSymbolValue(Asm->GetTempSymbol("section_end",SectionEnd),
Eric Christopherce0cfce2013-01-09 01:35:34 +00002043 Asm->getDataLayout().getPointerSize());
Bill Wendling480ff322009-05-20 23:21:38 +00002044
2045 // Mark end of matrix.
Chris Lattner566cae92010-03-09 23:52:58 +00002046 Asm->OutStreamer.AddComment("DW_LNE_end_sequence");
2047 Asm->EmitInt8(0);
Chris Lattnerf5c834f2010-01-22 22:09:00 +00002048 Asm->EmitInt8(1);
Chris Lattnerfa823552010-01-22 23:18:42 +00002049 Asm->EmitInt8(1);
Bill Wendling480ff322009-05-20 23:21:38 +00002050}
2051
Eric Christopheracdcbdb2012-11-27 22:43:45 +00002052// Emit visible names into a hashed accelerator table section.
Eric Christopher4996c702011-11-07 09:24:32 +00002053void DwarfDebug::emitAccelNames() {
2054 DwarfAccelTable AT(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset,
2055 dwarf::DW_FORM_data4));
2056 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2057 E = CUMap.end(); I != E; ++I) {
2058 CompileUnit *TheCU = I->second;
Eric Christopherd9843b32011-11-10 19:25:34 +00002059 const StringMap<std::vector<DIE*> > &Names = TheCU->getAccelNames();
2060 for (StringMap<std::vector<DIE*> >::const_iterator
Eric Christopher4996c702011-11-07 09:24:32 +00002061 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
2062 const char *Name = GI->getKeyData();
Eric Christopher090fcc12012-01-06 23:03:34 +00002063 const std::vector<DIE *> &Entities = GI->second;
Eric Christopherd9843b32011-11-10 19:25:34 +00002064 for (std::vector<DIE *>::const_iterator DI = Entities.begin(),
2065 DE = Entities.end(); DI != DE; ++DI)
2066 AT.AddName(Name, (*DI));
Eric Christopher4996c702011-11-07 09:24:32 +00002067 }
2068 }
2069
2070 AT.FinalizeTable(Asm, "Names");
2071 Asm->OutStreamer.SwitchSection(
2072 Asm->getObjFileLowering().getDwarfAccelNamesSection());
2073 MCSymbol *SectionBegin = Asm->GetTempSymbol("names_begin");
2074 Asm->OutStreamer.EmitLabel(SectionBegin);
2075
2076 // Emit the full data.
Eric Christophere698f532012-12-20 21:58:36 +00002077 AT.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher4996c702011-11-07 09:24:32 +00002078}
2079
Eric Christopher48fef592012-12-20 21:58:40 +00002080// Emit objective C classes and categories into a hashed accelerator table
2081// section.
Eric Christopher4996c702011-11-07 09:24:32 +00002082void DwarfDebug::emitAccelObjC() {
2083 DwarfAccelTable AT(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset,
2084 dwarf::DW_FORM_data4));
2085 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2086 E = CUMap.end(); I != E; ++I) {
2087 CompileUnit *TheCU = I->second;
2088 const StringMap<std::vector<DIE*> > &Names = TheCU->getAccelObjC();
2089 for (StringMap<std::vector<DIE*> >::const_iterator
2090 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
2091 const char *Name = GI->getKeyData();
Eric Christopher090fcc12012-01-06 23:03:34 +00002092 const std::vector<DIE *> &Entities = GI->second;
Eric Christopher4996c702011-11-07 09:24:32 +00002093 for (std::vector<DIE *>::const_iterator DI = Entities.begin(),
2094 DE = Entities.end(); DI != DE; ++DI)
2095 AT.AddName(Name, (*DI));
2096 }
2097 }
2098
2099 AT.FinalizeTable(Asm, "ObjC");
2100 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering()
2101 .getDwarfAccelObjCSection());
2102 MCSymbol *SectionBegin = Asm->GetTempSymbol("objc_begin");
2103 Asm->OutStreamer.EmitLabel(SectionBegin);
2104
2105 // Emit the full data.
Eric Christophere698f532012-12-20 21:58:36 +00002106 AT.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher4996c702011-11-07 09:24:32 +00002107}
2108
Eric Christopheracdcbdb2012-11-27 22:43:45 +00002109// Emit namespace dies into a hashed accelerator table.
Eric Christopher4996c702011-11-07 09:24:32 +00002110void DwarfDebug::emitAccelNamespaces() {
2111 DwarfAccelTable AT(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset,
2112 dwarf::DW_FORM_data4));
2113 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2114 E = CUMap.end(); I != E; ++I) {
2115 CompileUnit *TheCU = I->second;
Eric Christopher66b37db2011-11-10 21:47:55 +00002116 const StringMap<std::vector<DIE*> > &Names = TheCU->getAccelNamespace();
2117 for (StringMap<std::vector<DIE*> >::const_iterator
Eric Christopher4996c702011-11-07 09:24:32 +00002118 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
2119 const char *Name = GI->getKeyData();
Eric Christopher090fcc12012-01-06 23:03:34 +00002120 const std::vector<DIE *> &Entities = GI->second;
Eric Christopher66b37db2011-11-10 21:47:55 +00002121 for (std::vector<DIE *>::const_iterator DI = Entities.begin(),
2122 DE = Entities.end(); DI != DE; ++DI)
2123 AT.AddName(Name, (*DI));
Eric Christopher4996c702011-11-07 09:24:32 +00002124 }
2125 }
2126
2127 AT.FinalizeTable(Asm, "namespac");
2128 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering()
2129 .getDwarfAccelNamespaceSection());
2130 MCSymbol *SectionBegin = Asm->GetTempSymbol("namespac_begin");
2131 Asm->OutStreamer.EmitLabel(SectionBegin);
2132
2133 // Emit the full data.
Eric Christophere698f532012-12-20 21:58:36 +00002134 AT.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher4996c702011-11-07 09:24:32 +00002135}
2136
Eric Christopheracdcbdb2012-11-27 22:43:45 +00002137// Emit type dies into a hashed accelerator table.
Eric Christopher4996c702011-11-07 09:24:32 +00002138void DwarfDebug::emitAccelTypes() {
Eric Christopher21bde872012-01-06 04:35:23 +00002139 std::vector<DwarfAccelTable::Atom> Atoms;
2140 Atoms.push_back(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset,
2141 dwarf::DW_FORM_data4));
2142 Atoms.push_back(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeTag,
2143 dwarf::DW_FORM_data2));
2144 Atoms.push_back(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeTypeFlags,
2145 dwarf::DW_FORM_data1));
2146 DwarfAccelTable AT(Atoms);
Eric Christopher4996c702011-11-07 09:24:32 +00002147 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2148 E = CUMap.end(); I != E; ++I) {
2149 CompileUnit *TheCU = I->second;
Eric Christopher21bde872012-01-06 04:35:23 +00002150 const StringMap<std::vector<std::pair<DIE*, unsigned > > > &Names
2151 = TheCU->getAccelTypes();
2152 for (StringMap<std::vector<std::pair<DIE*, unsigned> > >::const_iterator
Eric Christopher4996c702011-11-07 09:24:32 +00002153 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
2154 const char *Name = GI->getKeyData();
Eric Christopher090fcc12012-01-06 23:03:34 +00002155 const std::vector<std::pair<DIE *, unsigned> > &Entities = GI->second;
Eric Christopher21bde872012-01-06 04:35:23 +00002156 for (std::vector<std::pair<DIE *, unsigned> >::const_iterator DI
2157 = Entities.begin(), DE = Entities.end(); DI !=DE; ++DI)
2158 AT.AddName(Name, (*DI).first, (*DI).second);
Eric Christopher4996c702011-11-07 09:24:32 +00002159 }
2160 }
2161
2162 AT.FinalizeTable(Asm, "types");
2163 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering()
2164 .getDwarfAccelTypesSection());
2165 MCSymbol *SectionBegin = Asm->GetTempSymbol("types_begin");
2166 Asm->OutStreamer.EmitLabel(SectionBegin);
2167
2168 // Emit the full data.
Eric Christophere698f532012-12-20 21:58:36 +00002169 AT.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher4996c702011-11-07 09:24:32 +00002170}
2171
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00002172/// emitDebugPubnames - Emit visible names into a debug pubnames section.
2173///
2174void DwarfDebug::emitDebugPubnames() {
2175 const MCSection *ISec = Asm->getObjFileLowering().getDwarfInfoSection();
2176
2177 typedef DenseMap<const MDNode*, CompileUnit*> CUMapType;
2178 for (CUMapType::iterator I = CUMap.begin(), E = CUMap.end(); I != E; ++I) {
2179 CompileUnit *TheCU = I->second;
2180 unsigned ID = TheCU->getUniqueID();
2181
2182 if (TheCU->getGlobalNames().empty())
2183 continue;
2184
2185 // Start the dwarf pubnames section.
2186 Asm->OutStreamer.SwitchSection(
2187 Asm->getObjFileLowering().getDwarfPubNamesSection());
2188
2189 Asm->OutStreamer.AddComment("Length of Public Names Info");
2190 Asm->EmitLabelDifference(Asm->GetTempSymbol("pubnames_end", ID),
2191 Asm->GetTempSymbol("pubnames_begin", ID), 4);
2192
2193 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_begin", ID));
2194
2195 Asm->OutStreamer.AddComment("DWARF Version");
2196 Asm->EmitInt16(dwarf::DWARF_VERSION);
2197
2198 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
2199 Asm->EmitSectionOffset(Asm->GetTempSymbol(ISec->getLabelBeginName(), ID),
2200 DwarfInfoSectionSym);
2201
2202 Asm->OutStreamer.AddComment("Compilation Unit Length");
2203 Asm->EmitLabelDifference(Asm->GetTempSymbol(ISec->getLabelEndName(), ID),
2204 Asm->GetTempSymbol(ISec->getLabelBeginName(), ID),
2205 4);
2206
2207 const StringMap<DIE*> &Globals = TheCU->getGlobalNames();
2208 for (StringMap<DIE*>::const_iterator
2209 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2210 const char *Name = GI->getKeyData();
2211 const DIE *Entity = GI->second;
2212
2213 Asm->OutStreamer.AddComment("DIE offset");
2214 Asm->EmitInt32(Entity->getOffset());
2215
2216 if (Asm->isVerbose())
2217 Asm->OutStreamer.AddComment("External Name");
2218 Asm->OutStreamer.EmitBytes(StringRef(Name, strlen(Name)+1), 0);
2219 }
2220
2221 Asm->OutStreamer.AddComment("End Mark");
2222 Asm->EmitInt32(0);
2223 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_end", ID));
2224 }
2225}
2226
Devang Patel04d2f2d2009-11-24 01:14:22 +00002227void DwarfDebug::emitDebugPubTypes() {
Devang Patel1a0df9a2010-05-10 22:49:55 +00002228 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2229 E = CUMap.end(); I != E; ++I) {
2230 CompileUnit *TheCU = I->second;
Eric Christopher6abc9c52011-11-07 09:18:35 +00002231 // Start the dwarf pubtypes section.
Devang Patel1a0df9a2010-05-10 22:49:55 +00002232 Asm->OutStreamer.SwitchSection(
2233 Asm->getObjFileLowering().getDwarfPubTypesSection());
2234 Asm->OutStreamer.AddComment("Length of Public Types Info");
2235 Asm->EmitLabelDifference(
Eli Benderskyb42d1462012-12-03 18:45:45 +00002236 Asm->GetTempSymbol("pubtypes_end", TheCU->getUniqueID()),
2237 Asm->GetTempSymbol("pubtypes_begin", TheCU->getUniqueID()), 4);
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002238
Devang Patel1a0df9a2010-05-10 22:49:55 +00002239 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_begin",
Eli Benderskyb42d1462012-12-03 18:45:45 +00002240 TheCU->getUniqueID()));
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002241
Devang Patel1a0df9a2010-05-10 22:49:55 +00002242 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DWARF Version");
2243 Asm->EmitInt16(dwarf::DWARF_VERSION);
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002244
Devang Patel1a0df9a2010-05-10 22:49:55 +00002245 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
Eric Christopher16485a52012-12-15 00:04:04 +00002246 const MCSection *ISec = Asm->getObjFileLowering().getDwarfInfoSection();
2247 Asm->EmitSectionOffset(Asm->GetTempSymbol(ISec->getLabelBeginName(),
Eli Benderskyb42d1462012-12-03 18:45:45 +00002248 TheCU->getUniqueID()),
Devang Patel1a0df9a2010-05-10 22:49:55 +00002249 DwarfInfoSectionSym);
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002250
Devang Patel1a0df9a2010-05-10 22:49:55 +00002251 Asm->OutStreamer.AddComment("Compilation Unit Length");
Eric Christopher16485a52012-12-15 00:04:04 +00002252 Asm->EmitLabelDifference(Asm->GetTempSymbol(ISec->getLabelEndName(),
Eli Benderskyb42d1462012-12-03 18:45:45 +00002253 TheCU->getUniqueID()),
Eric Christopher16485a52012-12-15 00:04:04 +00002254 Asm->GetTempSymbol(ISec->getLabelBeginName(),
Eli Benderskyb42d1462012-12-03 18:45:45 +00002255 TheCU->getUniqueID()),
Devang Patel1a0df9a2010-05-10 22:49:55 +00002256 4);
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002257
Devang Patel1a0df9a2010-05-10 22:49:55 +00002258 const StringMap<DIE*> &Globals = TheCU->getGlobalTypes();
2259 for (StringMap<DIE*>::const_iterator
2260 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2261 const char *Name = GI->getKeyData();
Nick Lewycky019d2552011-07-29 03:49:23 +00002262 DIE *Entity = GI->second;
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002263
Devang Patel1a0df9a2010-05-10 22:49:55 +00002264 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
2265 Asm->EmitInt32(Entity->getOffset());
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002266
Devang Patel1a0df9a2010-05-10 22:49:55 +00002267 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("External Name");
Benjamin Kramer966ed1b2011-11-09 18:16:11 +00002268 // Emit the name with a terminating null byte.
Eric Christophere3ab3d02013-01-09 01:57:54 +00002269 Asm->OutStreamer.EmitBytes(StringRef(Name, GI->getKeyLength()+1));
Devang Patel1a0df9a2010-05-10 22:49:55 +00002270 }
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002271
Devang Patel1a0df9a2010-05-10 22:49:55 +00002272 Asm->OutStreamer.AddComment("End Mark");
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002273 Asm->EmitInt32(0);
Devang Patel1a0df9a2010-05-10 22:49:55 +00002274 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_end",
Eli Benderskyb42d1462012-12-03 18:45:45 +00002275 TheCU->getUniqueID()));
Devang Patel04d2f2d2009-11-24 01:14:22 +00002276 }
Devang Patel04d2f2d2009-11-24 01:14:22 +00002277}
2278
Eric Christopher3bf29fd2012-12-27 02:14:01 +00002279// Emit strings into a string section.
Eric Christopher2cbd5762013-01-07 19:32:41 +00002280void DwarfUnits::emitStrings(const MCSection *StrSection,
2281 const MCSection *OffsetSection = NULL,
2282 const MCSymbol *StrSecSym = NULL) {
Eric Christopher3bf29fd2012-12-27 02:14:01 +00002283
Eric Christopher27614582013-01-08 22:22:06 +00002284 if (StringPool.empty()) return;
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002285
Chris Lattner3d72a672010-03-09 23:38:23 +00002286 // Start the dwarf str section.
Eric Christopher2cbd5762013-01-07 19:32:41 +00002287 Asm->OutStreamer.SwitchSection(StrSection);
Bill Wendling480ff322009-05-20 23:21:38 +00002288
Chris Lattnerb7aa9522010-03-13 02:17:42 +00002289 // Get all of the string pool entries and put them in an array by their ID so
2290 // we can sort them.
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002291 SmallVector<std::pair<unsigned,
Eric Christopherb800ff72013-01-07 22:40:45 +00002292 StringMapEntry<std::pair<MCSymbol*, unsigned> >*>, 64> Entries;
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002293
Chris Lattnerb7aa9522010-03-13 02:17:42 +00002294 for (StringMap<std::pair<MCSymbol*, unsigned> >::iterator
Eric Christopher27614582013-01-08 22:22:06 +00002295 I = StringPool.begin(), E = StringPool.end();
Eric Christopher48fef592012-12-20 21:58:40 +00002296 I != E; ++I)
Chris Lattnerb7aa9522010-03-13 02:17:42 +00002297 Entries.push_back(std::make_pair(I->second.second, &*I));
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002298
Chris Lattnerb7aa9522010-03-13 02:17:42 +00002299 array_pod_sort(Entries.begin(), Entries.end());
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002300
Chris Lattnerb7aa9522010-03-13 02:17:42 +00002301 for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
Chris Lattner3d72a672010-03-09 23:38:23 +00002302 // Emit a label for reference from debug information entries.
Chris Lattnerb7aa9522010-03-13 02:17:42 +00002303 Asm->OutStreamer.EmitLabel(Entries[i].second->getValue().first);
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002304
Benjamin Kramer966ed1b2011-11-09 18:16:11 +00002305 // Emit the string itself with a terminating null byte.
Benjamin Kramer148db362011-11-09 12:12:04 +00002306 Asm->OutStreamer.EmitBytes(StringRef(Entries[i].second->getKeyData(),
Eric Christopherce0cfce2013-01-09 01:35:34 +00002307 Entries[i].second->getKeyLength()+1));
Bill Wendling480ff322009-05-20 23:21:38 +00002308 }
Eric Christopher2cbd5762013-01-07 19:32:41 +00002309
2310 // If we've got an offset section go ahead and emit that now as well.
2311 if (OffsetSection) {
2312 Asm->OutStreamer.SwitchSection(OffsetSection);
2313 unsigned offset = 0;
Eric Christopher962c9082013-01-15 23:56:56 +00002314 unsigned size = 4; // FIXME: DWARF64 is 8.
Eric Christopher2cbd5762013-01-07 19:32:41 +00002315 for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
Eric Christopherbf7bc492013-01-09 03:52:05 +00002316 Asm->OutStreamer.EmitIntValue(offset, size);
Eric Christopher2cbd5762013-01-07 19:32:41 +00002317 offset += Entries[i].second->getKeyLength() + 1;
2318 }
2319 }
Bill Wendling480ff322009-05-20 23:21:38 +00002320}
2321
Eric Christopher962c9082013-01-15 23:56:56 +00002322// Emit strings into a string section.
2323void DwarfUnits::emitAddresses(const MCSection *AddrSection) {
2324
2325 if (AddressPool.empty()) return;
2326
2327 // Start the dwarf addr section.
2328 Asm->OutStreamer.SwitchSection(AddrSection);
2329
2330 // Get all of the string pool entries and put them in an array by their ID so
2331 // we can sort them.
2332 SmallVector<std::pair<unsigned,
2333 std::pair<MCSymbol*, unsigned>* >, 64> Entries;
2334
2335 for (DenseMap<MCSymbol*, std::pair<MCSymbol*, unsigned> >::iterator
2336 I = AddressPool.begin(), E = AddressPool.end();
2337 I != E; ++I)
2338 Entries.push_back(std::make_pair(I->second.second, &(I->second)));
2339
2340 array_pod_sort(Entries.begin(), Entries.end());
2341
2342 for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
2343 // Emit a label for reference from debug information entries.
2344 MCSymbol *Sym = Entries[i].second->first;
2345 if (Sym)
2346 Asm->EmitLabelReference(Entries[i].second->first,
2347 Asm->getDataLayout().getPointerSize());
2348 else
2349 Asm->OutStreamer.EmitIntValue(0, Asm->getDataLayout().getPointerSize());
2350 }
2351
2352}
2353
Eric Christopher3bf29fd2012-12-27 02:14:01 +00002354// Emit visible names into a debug str section.
2355void DwarfDebug::emitDebugStr() {
2356 DwarfUnits &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
2357 Holder.emitStrings(Asm->getObjFileLowering().getDwarfStrSection());
2358}
2359
Eric Christopheracdcbdb2012-11-27 22:43:45 +00002360// Emit visible names into a debug loc section.
Devang Patel930143b2009-11-21 02:48:08 +00002361void DwarfDebug::emitDebugLoc() {
Devang Patel6b9a9fe2010-05-26 23:55:23 +00002362 if (DotDebugLocEntries.empty())
2363 return;
2364
Eric Christopher4887c8f2013-03-29 23:34:06 +00002365 for (SmallVectorImpl<DotDebugLocEntry>::iterator
Devang Patel116a9d72011-02-04 22:57:18 +00002366 I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
2367 I != E; ++I) {
2368 DotDebugLocEntry &Entry = *I;
2369 if (I + 1 != DotDebugLocEntries.end())
2370 Entry.Merge(I+1);
2371 }
2372
Daniel Dunbarfd95b012011-03-16 22:16:39 +00002373 // Start the dwarf loc section.
Chris Lattner4b7dadb2009-08-19 05:49:37 +00002374 Asm->OutStreamer.SwitchSection(
Devang Patel9fc11702010-05-25 23:40:22 +00002375 Asm->getObjFileLowering().getDwarfLocSection());
Chandler Carruth5da3f052012-11-01 09:14:31 +00002376 unsigned char Size = Asm->getDataLayout().getPointerSize();
Devang Patel6b9a9fe2010-05-26 23:55:23 +00002377 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", 0));
2378 unsigned index = 1;
Eric Christopher4887c8f2013-03-29 23:34:06 +00002379 for (SmallVectorImpl<DotDebugLocEntry>::iterator
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002380 I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
Devang Patel30265c42010-07-07 20:12:52 +00002381 I != E; ++I, ++index) {
Devang Patel116a9d72011-02-04 22:57:18 +00002382 DotDebugLocEntry &Entry = *I;
2383 if (Entry.isMerged()) continue;
Devang Patel9fc11702010-05-25 23:40:22 +00002384 if (Entry.isEmpty()) {
Eric Christopherce0cfce2013-01-09 01:35:34 +00002385 Asm->OutStreamer.EmitIntValue(0, Size);
2386 Asm->OutStreamer.EmitIntValue(0, Size);
Devang Patel6b9a9fe2010-05-26 23:55:23 +00002387 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", index));
Devang Patel9fc11702010-05-25 23:40:22 +00002388 } else {
Eric Christopherbf7bc492013-01-09 03:52:05 +00002389 Asm->OutStreamer.EmitSymbolValue(Entry.Begin, Size);
2390 Asm->OutStreamer.EmitSymbolValue(Entry.End, Size);
Devang Patel3e021532011-04-28 02:22:40 +00002391 DIVariable DV(Entry.Variable);
Rafael Espindolad23bfb82011-05-27 22:05:41 +00002392 Asm->OutStreamer.AddComment("Loc expr size");
2393 MCSymbol *begin = Asm->OutStreamer.getContext().CreateTempSymbol();
2394 MCSymbol *end = Asm->OutStreamer.getContext().CreateTempSymbol();
2395 Asm->EmitLabelDifference(end, begin, 2);
2396 Asm->OutStreamer.EmitLabel(begin);
Devang Pateled9fd452011-07-08 16:49:43 +00002397 if (Entry.isInt()) {
Devang Patel324f8432011-06-01 22:03:25 +00002398 DIBasicType BTy(DV.getType());
2399 if (BTy.Verify() &&
Eric Christopher6a841382012-11-19 22:42:10 +00002400 (BTy.getEncoding() == dwarf::DW_ATE_signed
Devang Patel324f8432011-06-01 22:03:25 +00002401 || BTy.getEncoding() == dwarf::DW_ATE_signed_char)) {
2402 Asm->OutStreamer.AddComment("DW_OP_consts");
2403 Asm->EmitInt8(dwarf::DW_OP_consts);
Devang Pateled9fd452011-07-08 16:49:43 +00002404 Asm->EmitSLEB128(Entry.getInt());
Devang Patel324f8432011-06-01 22:03:25 +00002405 } else {
2406 Asm->OutStreamer.AddComment("DW_OP_constu");
2407 Asm->EmitInt8(dwarf::DW_OP_constu);
Devang Pateled9fd452011-07-08 16:49:43 +00002408 Asm->EmitULEB128(Entry.getInt());
Devang Patel324f8432011-06-01 22:03:25 +00002409 }
Devang Pateled9fd452011-07-08 16:49:43 +00002410 } else if (Entry.isLocation()) {
Eric Christopher6a841382012-11-19 22:42:10 +00002411 if (!DV.hasComplexAddress())
Devang Pateled9fd452011-07-08 16:49:43 +00002412 // Regular entry.
Devang Patel3e021532011-04-28 02:22:40 +00002413 Asm->EmitDwarfRegOp(Entry.Loc);
Devang Pateled9fd452011-07-08 16:49:43 +00002414 else {
2415 // Complex address entry.
2416 unsigned N = DV.getNumAddrElements();
2417 unsigned i = 0;
2418 if (N >= 2 && DV.getAddrElement(0) == DIBuilder::OpPlus) {
2419 if (Entry.Loc.getOffset()) {
2420 i = 2;
2421 Asm->EmitDwarfRegOp(Entry.Loc);
2422 Asm->OutStreamer.AddComment("DW_OP_deref");
2423 Asm->EmitInt8(dwarf::DW_OP_deref);
2424 Asm->OutStreamer.AddComment("DW_OP_plus_uconst");
2425 Asm->EmitInt8(dwarf::DW_OP_plus_uconst);
2426 Asm->EmitSLEB128(DV.getAddrElement(1));
2427 } else {
2428 // If first address element is OpPlus then emit
2429 // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
2430 MachineLocation Loc(Entry.Loc.getReg(), DV.getAddrElement(1));
2431 Asm->EmitDwarfRegOp(Loc);
2432 i = 2;
2433 }
2434 } else {
2435 Asm->EmitDwarfRegOp(Entry.Loc);
2436 }
Eric Christopher6a841382012-11-19 22:42:10 +00002437
Devang Pateled9fd452011-07-08 16:49:43 +00002438 // Emit remaining complex address elements.
2439 for (; i < N; ++i) {
2440 uint64_t Element = DV.getAddrElement(i);
2441 if (Element == DIBuilder::OpPlus) {
2442 Asm->EmitInt8(dwarf::DW_OP_plus_uconst);
2443 Asm->EmitULEB128(DV.getAddrElement(++i));
Eric Christopher4d250522012-05-08 18:56:00 +00002444 } else if (Element == DIBuilder::OpDeref) {
Eric Christopher8d2a77d2012-05-08 21:24:39 +00002445 if (!Entry.Loc.isReg())
Eric Christopher4d250522012-05-08 18:56:00 +00002446 Asm->EmitInt8(dwarf::DW_OP_deref);
2447 } else
2448 llvm_unreachable("unknown Opcode found in complex address");
Devang Pateled9fd452011-07-08 16:49:43 +00002449 }
Devang Patel3e021532011-04-28 02:22:40 +00002450 }
Devang Patel3e021532011-04-28 02:22:40 +00002451 }
Devang Pateled9fd452011-07-08 16:49:43 +00002452 // else ... ignore constant fp. There is not any good way to
2453 // to represent them here in dwarf.
Rafael Espindolad23bfb82011-05-27 22:05:41 +00002454 Asm->OutStreamer.EmitLabel(end);
Devang Patel9fc11702010-05-25 23:40:22 +00002455 }
2456 }
Bill Wendling480ff322009-05-20 23:21:38 +00002457}
2458
Eric Christopheracdcbdb2012-11-27 22:43:45 +00002459// Emit visible names into a debug aranges section.
Eric Christopher7b30f2e42012-11-21 00:34:35 +00002460void DwarfDebug::emitDebugARanges() {
Bill Wendling480ff322009-05-20 23:21:38 +00002461 // Start the dwarf aranges section.
Chris Lattner4b7dadb2009-08-19 05:49:37 +00002462 Asm->OutStreamer.SwitchSection(
2463 Asm->getObjFileLowering().getDwarfARangesSection());
Bill Wendling480ff322009-05-20 23:21:38 +00002464}
2465
Eric Christopheracdcbdb2012-11-27 22:43:45 +00002466// Emit visible names into a debug ranges section.
Devang Patel930143b2009-11-21 02:48:08 +00002467void DwarfDebug::emitDebugRanges() {
Bill Wendling480ff322009-05-20 23:21:38 +00002468 // Start the dwarf ranges section.
Chris Lattner4b7dadb2009-08-19 05:49:37 +00002469 Asm->OutStreamer.SwitchSection(
Devang Patel12563b32010-04-16 23:33:45 +00002470 Asm->getObjFileLowering().getDwarfRangesSection());
Chandler Carruth5da3f052012-11-01 09:14:31 +00002471 unsigned char Size = Asm->getDataLayout().getPointerSize();
Eric Christopher4887c8f2013-03-29 23:34:06 +00002472 for (SmallVectorImpl<const MCSymbol *>::iterator
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002473 I = DebugRangeSymbols.begin(), E = DebugRangeSymbols.end();
Devang Patel6c74a872010-04-27 19:46:33 +00002474 I != E; ++I) {
2475 if (*I)
Eric Christopherbf7bc492013-01-09 03:52:05 +00002476 Asm->OutStreamer.EmitSymbolValue(const_cast<MCSymbol*>(*I), Size);
Devang Patel12563b32010-04-16 23:33:45 +00002477 else
Eric Christopherce0cfce2013-01-09 01:35:34 +00002478 Asm->OutStreamer.EmitIntValue(0, Size);
Devang Patel12563b32010-04-16 23:33:45 +00002479 }
Bill Wendling480ff322009-05-20 23:21:38 +00002480}
2481
Eric Christopheracdcbdb2012-11-27 22:43:45 +00002482// Emit visible names into a debug macinfo section.
Devang Patel930143b2009-11-21 02:48:08 +00002483void DwarfDebug::emitDebugMacInfo() {
Daniel Dunbarc418d6b2009-09-19 20:40:05 +00002484 if (const MCSection *LineInfo =
Chris Lattner1472cf52009-08-02 07:24:22 +00002485 Asm->getObjFileLowering().getDwarfMacroInfoSection()) {
Bill Wendling480ff322009-05-20 23:21:38 +00002486 // Start the dwarf macinfo section.
Chris Lattner4b7dadb2009-08-19 05:49:37 +00002487 Asm->OutStreamer.SwitchSection(LineInfo);
Bill Wendling480ff322009-05-20 23:21:38 +00002488 }
2489}
2490
Eric Christopheracdcbdb2012-11-27 22:43:45 +00002491// Emit inline info using following format.
2492// Section Header:
2493// 1. length of section
2494// 2. Dwarf version number
2495// 3. address size.
2496//
2497// Entries (one "entry" for each function that was inlined):
2498//
2499// 1. offset into __debug_str section for MIPS linkage name, if exists;
2500// otherwise offset into __debug_str for regular function name.
2501// 2. offset into __debug_str section for regular function name.
2502// 3. an unsigned LEB128 number indicating the number of distinct inlining
2503// instances for the function.
2504//
2505// The rest of the entry consists of a {die_offset, low_pc} pair for each
2506// inlined instance; the die_offset points to the inlined_subroutine die in the
2507// __debug_info section, and the low_pc is the starting address for the
2508// inlining instance.
Devang Patel930143b2009-11-21 02:48:08 +00002509void DwarfDebug::emitDebugInlineInfo() {
Eric Christopher1df94bf2012-03-02 02:11:47 +00002510 if (!Asm->MAI->doesDwarfUseInlineInfoSection())
Bill Wendling480ff322009-05-20 23:21:38 +00002511 return;
2512
Devang Patel1a0df9a2010-05-10 22:49:55 +00002513 if (!FirstCU)
Bill Wendling480ff322009-05-20 23:21:38 +00002514 return;
2515
Chris Lattner4b7dadb2009-08-19 05:49:37 +00002516 Asm->OutStreamer.SwitchSection(
2517 Asm->getObjFileLowering().getDwarfDebugInlineSection());
Chris Lattnerf5c834f2010-01-22 22:09:00 +00002518
Chris Lattner566cae92010-03-09 23:52:58 +00002519 Asm->OutStreamer.AddComment("Length of Debug Inlined Information Entry");
Chris Lattnerf1429f12010-04-04 19:58:12 +00002520 Asm->EmitLabelDifference(Asm->GetTempSymbol("debug_inlined_end", 1),
2521 Asm->GetTempSymbol("debug_inlined_begin", 1), 4);
Bill Wendling480ff322009-05-20 23:21:38 +00002522
Chris Lattnera179b522010-04-04 19:25:43 +00002523 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_begin", 1));
Bill Wendling480ff322009-05-20 23:21:38 +00002524
Chris Lattner566cae92010-03-09 23:52:58 +00002525 Asm->OutStreamer.AddComment("Dwarf Version");
2526 Asm->EmitInt16(dwarf::DWARF_VERSION);
2527 Asm->OutStreamer.AddComment("Address Size (in bytes)");
Chandler Carruth5da3f052012-11-01 09:14:31 +00002528 Asm->EmitInt8(Asm->getDataLayout().getPointerSize());
Bill Wendling480ff322009-05-20 23:21:38 +00002529
Eric Christopher4887c8f2013-03-29 23:34:06 +00002530 for (SmallVectorImpl<const MDNode *>::iterator I = InlinedSPNodes.begin(),
Devang Patelf6eeaeb2009-11-10 23:06:00 +00002531 E = InlinedSPNodes.end(); I != E; ++I) {
Jim Grosbach042483e2009-11-21 23:12:12 +00002532
Devang Patel32cc43c2010-05-07 20:54:48 +00002533 const MDNode *Node = *I;
2534 DenseMap<const MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator II
Jim Grosbach00e9c612009-11-22 19:20:36 +00002535 = InlineInfo.find(Node);
Eric Christopher4887c8f2013-03-29 23:34:06 +00002536 SmallVectorImpl<InlineInfoLabels> &Labels = II->second;
Devang Patel80ae3492009-08-28 23:24:31 +00002537 DISubprogram SP(Node);
Devang Patel2d9caf92009-11-25 17:36:49 +00002538 StringRef LName = SP.getLinkageName();
2539 StringRef Name = SP.getName();
Bill Wendling480ff322009-05-20 23:21:38 +00002540
Chris Lattner566cae92010-03-09 23:52:58 +00002541 Asm->OutStreamer.AddComment("MIPS linkage name");
Eric Christopher77725312012-03-02 01:57:52 +00002542 if (LName.empty())
Eric Christophere698f532012-12-20 21:58:36 +00002543 Asm->EmitSectionOffset(InfoHolder.getStringPoolEntry(Name),
2544 DwarfStrSectionSym);
Eric Christopher77725312012-03-02 01:57:52 +00002545 else
Eric Christophere698f532012-12-20 21:58:36 +00002546 Asm->EmitSectionOffset(InfoHolder
2547 .getStringPoolEntry(getRealLinkageName(LName)),
Chris Lattner70a4fce2010-04-04 23:25:33 +00002548 DwarfStrSectionSym);
Devang Patelf6eeaeb2009-11-10 23:06:00 +00002549
Chris Lattner566cae92010-03-09 23:52:58 +00002550 Asm->OutStreamer.AddComment("Function name");
Eric Christophere698f532012-12-20 21:58:36 +00002551 Asm->EmitSectionOffset(InfoHolder.getStringPoolEntry(Name),
2552 DwarfStrSectionSym);
Chris Lattner9efd1182010-04-04 19:09:29 +00002553 Asm->EmitULEB128(Labels.size(), "Inline count");
Bill Wendling480ff322009-05-20 23:21:38 +00002554
Eric Christopher4887c8f2013-03-29 23:34:06 +00002555 for (SmallVectorImpl<InlineInfoLabels>::iterator LI = Labels.begin(),
Bill Wendling480ff322009-05-20 23:21:38 +00002556 LE = Labels.end(); LI != LE; ++LI) {
Chris Lattner7bde8c02010-04-04 18:52:31 +00002557 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
Chris Lattner085b6522010-03-09 00:31:02 +00002558 Asm->EmitInt32(LI->second->getOffset());
Bill Wendling480ff322009-05-20 23:21:38 +00002559
Chris Lattner7bde8c02010-04-04 18:52:31 +00002560 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("low_pc");
Chris Lattner3a383cb2010-04-05 00:13:49 +00002561 Asm->OutStreamer.EmitSymbolValue(LI->first,
Eric Christopherbf7bc492013-01-09 03:52:05 +00002562 Asm->getDataLayout().getPointerSize());
Bill Wendling480ff322009-05-20 23:21:38 +00002563 }
2564 }
2565
Chris Lattnera179b522010-04-04 19:25:43 +00002566 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_end", 1));
Bill Wendling480ff322009-05-20 23:21:38 +00002567}
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002568
Eric Christopherd692c1d2012-12-11 19:42:09 +00002569// DWARF5 Experimental Separate Dwarf emitters.
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002570
2571// This DIE has the following attributes: DW_AT_comp_dir, DW_AT_stmt_list,
2572// DW_AT_low_pc, DW_AT_high_pc, DW_AT_ranges, DW_AT_dwo_name, DW_AT_dwo_id,
2573// DW_AT_ranges_base, DW_AT_addr_base. If DW_AT_ranges is present,
2574// DW_AT_low_pc and DW_AT_high_pc are not used, and vice versa.
Eric Christophercdf218d2012-12-10 19:51:21 +00002575CompileUnit *DwarfDebug::constructSkeletonCU(const MDNode *N) {
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002576 DICompileUnit DIUnit(N);
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002577 CompilationDir = DIUnit.getDirectory();
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002578
2579 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
Eli Benderskyb42d1462012-12-03 18:45:45 +00002580 CompileUnit *NewCU = new CompileUnit(GlobalCUIndexCount++,
Eric Christophere698f532012-12-20 21:58:36 +00002581 DIUnit.getLanguage(), Die, Asm,
Eric Christopher3bf29fd2012-12-27 02:14:01 +00002582 this, &SkeletonHolder);
Eric Christopher4c7765f2013-01-17 03:00:04 +00002583
Eric Christopherdae389b2013-02-22 23:50:08 +00002584 NewCU->addLocalString(Die, dwarf::DW_AT_GNU_dwo_name,
2585 DIUnit.getSplitDebugFilename());
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002586
Eric Christopher7a2cdf72013-02-05 07:31:55 +00002587 // This should be a unique identifier when we want to build .dwp files.
2588 NewCU->addUInt(Die, dwarf::DW_AT_GNU_dwo_id, dwarf::DW_FORM_data8, 0);
Eric Christopher18266172013-01-17 02:59:59 +00002589
Eric Christopher44c6aa62013-04-22 07:51:08 +00002590 // Relocate to the beginning of the addr_base section, else 0 for the
2591 // beginning of the one for this compile unit.
Eric Christopher55863be2013-04-07 03:43:09 +00002592 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
2593 NewCU->addLabel(Die, dwarf::DW_AT_GNU_addr_base, dwarf::DW_FORM_sec_offset,
2594 DwarfAddrSectionSym);
2595 else
Eric Christopher44c6aa62013-04-22 07:51:08 +00002596 NewCU->addUInt(Die, dwarf::DW_AT_GNU_addr_base,
2597 dwarf::DW_FORM_sec_offset, 0);
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002598
2599 // 2.17.1 requires that we use DW_AT_low_pc for a single entry point
Eric Christopher962c9082013-01-15 23:56:56 +00002600 // into an entity. We're using 0, or a NULL label for this.
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002601 NewCU->addUInt(Die, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, 0);
Eric Christopher962c9082013-01-15 23:56:56 +00002602
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002603 // DW_AT_stmt_list is a offset of line number information for this
2604 // compile unit in debug_line section.
Eric Christopher55863be2013-04-07 03:43:09 +00002605 // FIXME: Should handle multiple compile units.
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002606 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
Eric Christopher4c7765f2013-01-17 03:00:04 +00002607 NewCU->addLabel(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_sec_offset,
Eric Christopher74804332013-02-07 21:19:50 +00002608 DwarfLineSectionSym);
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002609 else
Eric Christopher4c7765f2013-01-17 03:00:04 +00002610 NewCU->addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_sec_offset, 0);
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002611
2612 if (!CompilationDir.empty())
Eric Christopher2cbd5762013-01-07 19:32:41 +00002613 NewCU->addLocalString(Die, dwarf::DW_AT_comp_dir, CompilationDir);
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002614
Eric Christopherc8a310e2012-12-10 23:34:43 +00002615 SkeletonHolder.addUnit(NewCU);
Eric Christopher5b33b3c2013-02-06 21:53:56 +00002616 SkeletonCUs.push_back(NewCU);
Eric Christopherc8a310e2012-12-10 23:34:43 +00002617
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002618 return NewCU;
2619}
2620
Eric Christopher3c5a1912012-12-19 22:02:53 +00002621void DwarfDebug::emitSkeletonAbbrevs(const MCSection *Section) {
2622 assert(useSplitDwarf() && "No split dwarf debug info?");
2623 emitAbbrevs(Section, &SkeletonAbbrevs);
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002624}
2625
Eric Christopherd692c1d2012-12-11 19:42:09 +00002626// Emit the .debug_info.dwo section for separated dwarf. This contains the
2627// compile units that would normally be in debug_info.
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002628void DwarfDebug::emitDebugInfoDWO() {
Eric Christophercdf218d2012-12-10 19:51:21 +00002629 assert(useSplitDwarf() && "No split dwarf debug info?");
Eric Christophera2de8262012-12-15 00:04:07 +00002630 InfoHolder.emitUnits(this, Asm->getObjFileLowering().getDwarfInfoDWOSection(),
Eric Christopher3c5a1912012-12-19 22:02:53 +00002631 Asm->getObjFileLowering().getDwarfAbbrevDWOSection(),
2632 DwarfAbbrevDWOSectionSym);
2633}
2634
2635// Emit the .debug_abbrev.dwo section for separated dwarf. This contains the
2636// abbreviations for the .debug_info.dwo section.
2637void DwarfDebug::emitDebugAbbrevDWO() {
2638 assert(useSplitDwarf() && "No split dwarf?");
Eric Christopher48fef592012-12-20 21:58:40 +00002639 emitAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevDWOSection(),
2640 &Abbreviations);
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002641}
Eric Christopher3bf29fd2012-12-27 02:14:01 +00002642
2643// Emit the .debug_str.dwo section for separated dwarf. This contains the
2644// string section and is identical in format to traditional .debug_str
2645// sections.
2646void DwarfDebug::emitDebugStrDWO() {
2647 assert(useSplitDwarf() && "No split dwarf?");
Eric Christopherb800ff72013-01-07 22:40:45 +00002648 const MCSection *OffSec = Asm->getObjFileLowering()
2649 .getDwarfStrOffDWOSection();
Eric Christopher2cbd5762013-01-07 19:32:41 +00002650 const MCSymbol *StrSym = DwarfStrSectionSym;
2651 InfoHolder.emitStrings(Asm->getObjFileLowering().getDwarfStrDWOSection(),
2652 OffSec, StrSym);
Eric Christopher3bf29fd2012-12-27 02:14:01 +00002653}