blob: 3b8bebea16a6f5c3cfb00ade24ec51fdd5eb90c0 [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
Eric Christopher20b76a72012-08-23 22:36:40 +000057namespace {
58 enum DefaultOnOff {
59 Default, Enable, Disable
60 };
61}
Eric Christopher4996c702011-11-07 09:24:32 +000062
Eric Christopher20b76a72012-08-23 22:36:40 +000063static cl::opt<DefaultOnOff> DwarfAccelTables("dwarf-accel-tables", cl::Hidden,
64 cl::desc("Output prototype dwarf accelerator tables."),
65 cl::values(
66 clEnumVal(Default, "Default for platform"),
67 clEnumVal(Enable, "Enabled"),
68 clEnumVal(Disable, "Disabled"),
69 clEnumValEnd),
70 cl::init(Default));
71
72static cl::opt<DefaultOnOff> DarwinGDBCompat("darwin-gdb-compat", cl::Hidden,
Eric Christopher978fbff2012-08-23 07:10:46 +000073 cl::desc("Compatibility with Darwin gdb."),
Eric Christopher20b76a72012-08-23 22:36:40 +000074 cl::values(
75 clEnumVal(Default, "Default for platform"),
76 clEnumVal(Enable, "Enabled"),
77 clEnumVal(Disable, "Disabled"),
78 clEnumValEnd),
79 cl::init(Default));
Eric Christopher978fbff2012-08-23 07:10:46 +000080
Eric Christophercdf218d2012-12-10 19:51:21 +000081static cl::opt<DefaultOnOff> SplitDwarf("split-dwarf", cl::Hidden,
82 cl::desc("Output prototype dwarf split debug info."),
Eric Christopher29424312012-11-12 22:22:20 +000083 cl::values(
84 clEnumVal(Default, "Default for platform"),
85 clEnumVal(Enable, "Enabled"),
86 clEnumVal(Disable, "Disabled"),
87 clEnumValEnd),
88 cl::init(Default));
89
Bill Wendlingfcc14142010-04-07 09:28:04 +000090namespace {
91 const char *DWARFGroupName = "DWARF Emission";
92 const char *DbgTimerName = "DWARF Debug Writer";
93} // end anonymous namespace
94
Bill Wendling2f921f82009-05-15 09:23:25 +000095//===----------------------------------------------------------------------===//
96
Eric Christopheracdcbdb2012-11-27 22:43:45 +000097// Configuration values for initial hash set sizes (log2).
98//
Bill Wendling2f921f82009-05-15 09:23:25 +000099static const unsigned InitAbbreviationsSetSize = 9; // log2(512)
Bill Wendling2f921f82009-05-15 09:23:25 +0000100
101namespace llvm {
102
Nick Lewycky019d2552011-07-29 03:49:23 +0000103DIType DbgVariable::getType() const {
Devang Patelf20c4f72011-04-12 22:53:02 +0000104 DIType Ty = Var.getType();
105 // FIXME: isBlockByrefVariable should be reformulated in terms of complex
106 // addresses instead.
107 if (Var.isBlockByrefVariable()) {
108 /* Byref variables, in Blocks, are declared by the programmer as
109 "SomeType VarName;", but the compiler creates a
110 __Block_byref_x_VarName struct, and gives the variable VarName
111 either the struct, or a pointer to the struct, as its type. This
112 is necessary for various behind-the-scenes things the compiler
113 needs to do with by-reference variables in blocks.
Eric Christopher6a841382012-11-19 22:42:10 +0000114
Devang Patelf20c4f72011-04-12 22:53:02 +0000115 However, as far as the original *programmer* is concerned, the
116 variable should still have type 'SomeType', as originally declared.
Eric Christopher6a841382012-11-19 22:42:10 +0000117
Devang Patelf20c4f72011-04-12 22:53:02 +0000118 The following function dives into the __Block_byref_x_VarName
119 struct to find the original type of the variable. This will be
120 passed back to the code generating the type for the Debug
121 Information Entry for the variable 'VarName'. 'VarName' will then
122 have the original type 'SomeType' in its debug information.
Eric Christopher6a841382012-11-19 22:42:10 +0000123
Devang Patelf20c4f72011-04-12 22:53:02 +0000124 The original type 'SomeType' will be the type of the field named
125 'VarName' inside the __Block_byref_x_VarName struct.
Eric Christopher6a841382012-11-19 22:42:10 +0000126
Devang Patelf20c4f72011-04-12 22:53:02 +0000127 NOTE: In order for this to not completely fail on the debugger
128 side, the Debug Information Entry for the variable VarName needs to
129 have a DW_AT_location that tells the debugger how to unwind through
130 the pointers and __Block_byref_x_VarName struct to find the actual
131 value of the variable. The function addBlockByrefType does this. */
132 DIType subType = Ty;
133 unsigned tag = Ty.getTag();
Eric Christopher6a841382012-11-19 22:42:10 +0000134
Devang Patelf20c4f72011-04-12 22:53:02 +0000135 if (tag == dwarf::DW_TAG_pointer_type) {
136 DIDerivedType DTy = DIDerivedType(Ty);
137 subType = DTy.getTypeDerivedFrom();
138 }
Eric Christopher6a841382012-11-19 22:42:10 +0000139
Devang Patelf20c4f72011-04-12 22:53:02 +0000140 DICompositeType blockStruct = DICompositeType(subType);
141 DIArray Elements = blockStruct.getTypeArray();
Eric Christopher6a841382012-11-19 22:42:10 +0000142
Devang Patelf20c4f72011-04-12 22:53:02 +0000143 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
144 DIDescriptor Element = Elements.getElement(i);
145 DIDerivedType DT = DIDerivedType(Element);
146 if (getName() == DT.getName())
147 return (DT.getTypeDerivedFrom());
Devang Patel6d9f9fe2010-08-09 21:01:39 +0000148 }
Devang Patel6d9f9fe2010-08-09 21:01:39 +0000149 }
Devang Patelf20c4f72011-04-12 22:53:02 +0000150 return Ty;
151}
Bill Wendling2f921f82009-05-15 09:23:25 +0000152
Chris Lattnerf5d06362010-04-05 04:09:20 +0000153} // end llvm namespace
Bill Wendling2f921f82009-05-15 09:23:25 +0000154
Chris Lattnerf0d6bd32010-04-05 05:11:15 +0000155DwarfDebug::DwarfDebug(AsmPrinter *A, Module *M)
Eric Christopherd79f5482012-12-10 19:51:13 +0000156 : Asm(A), MMI(Asm->MMI), FirstCU(0),
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000157 AbbreviationsSet(InitAbbreviationsSetSize),
Eric Christopher27614582013-01-08 22:22:06 +0000158 SourceIdMap(DIEValueAllocator),
Eric Christopherc8a310e2012-12-10 23:34:43 +0000159 PrevLabel(NULL), GlobalCUIndexCount(0),
Eric Christopher27614582013-01-08 22:22:06 +0000160 InfoHolder(A, &AbbreviationsSet, &Abbreviations, "info_string",
161 DIEValueAllocator),
Eric Christopher3c5a1912012-12-19 22:02:53 +0000162 SkeletonAbbrevSet(InitAbbreviationsSetSize),
Eric Christopher27614582013-01-08 22:22:06 +0000163 SkeletonHolder(A, &SkeletonAbbrevSet, &SkeletonAbbrevs, "skel_string",
164 DIEValueAllocator) {
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000165
Rafael Espindolaa7160962011-05-06 14:56:22 +0000166 DwarfInfoSectionSym = DwarfAbbrevSectionSym = 0;
Chris Lattnere58b5472010-04-04 23:10:38 +0000167 DwarfStrSectionSym = TextSectionSym = 0;
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000168 DwarfDebugRangeSectionSym = DwarfDebugLocSectionSym = 0;
Eric Christopher3bf29fd2012-12-27 02:14:01 +0000169 DwarfAbbrevDWOSectionSym = DwarfStrDWOSectionSym = 0;
Devang Patel9fc11702010-05-25 23:40:22 +0000170 FunctionBeginSym = FunctionEndSym = 0;
Eric Christopherad9fe892012-04-02 17:58:52 +0000171
Eric Christopher978fbff2012-08-23 07:10:46 +0000172 // Turn on accelerator tables and older gdb compatibility
173 // for Darwin.
Eric Christopher7b30f2e42012-11-21 00:34:35 +0000174 bool IsDarwin = Triple(M->getTargetTriple()).isOSDarwin();
Eric Christopher20b76a72012-08-23 22:36:40 +0000175 if (DarwinGDBCompat == Default) {
Eric Christopher7b30f2e42012-11-21 00:34:35 +0000176 if (IsDarwin)
177 IsDarwinGDBCompat = true;
Eric Christopher20b76a72012-08-23 22:36:40 +0000178 else
Eric Christopher7b30f2e42012-11-21 00:34:35 +0000179 IsDarwinGDBCompat = false;
Eric Christopher20b76a72012-08-23 22:36:40 +0000180 } else
Eric Christopher7b30f2e42012-11-21 00:34:35 +0000181 IsDarwinGDBCompat = DarwinGDBCompat == Enable ? true : false;
Eric Christopher4977f212012-08-23 22:36:36 +0000182
Eric Christopher20b76a72012-08-23 22:36:40 +0000183 if (DwarfAccelTables == Default) {
Eric Christopher7b30f2e42012-11-21 00:34:35 +0000184 if (IsDarwin)
185 HasDwarfAccelTables = true;
Eric Christopher20b76a72012-08-23 22:36:40 +0000186 else
Eric Christopher7b30f2e42012-11-21 00:34:35 +0000187 HasDwarfAccelTables = false;
Eric Christopher20b76a72012-08-23 22:36:40 +0000188 } else
Eric Christopher7b30f2e42012-11-21 00:34:35 +0000189 HasDwarfAccelTables = DwarfAccelTables == Enable ? true : false;
Eric Christopher20b76a72012-08-23 22:36:40 +0000190
Eric Christophercdf218d2012-12-10 19:51:21 +0000191 if (SplitDwarf == Default)
192 HasSplitDwarf = false;
Eric Christopher29424312012-11-12 22:22:20 +0000193 else
Eric Christophercdf218d2012-12-10 19:51:21 +0000194 HasSplitDwarf = SplitDwarf == Enable ? true : false;
Eric Christopher29424312012-11-12 22:22:20 +0000195
Dan Gohman6e681a52010-06-18 15:56:31 +0000196 {
197 NamedRegionTimer T(DbgTimerName, DWARFGroupName, TimePassesIsEnabled);
Eric Christopher58f41952012-11-19 22:42:15 +0000198 beginModule();
Torok Edwinf8dba242010-04-07 10:44:46 +0000199 }
Bill Wendling2f921f82009-05-15 09:23:25 +0000200}
201DwarfDebug::~DwarfDebug() {
Bill Wendling2f921f82009-05-15 09:23:25 +0000202}
203
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000204// Switch to the specified MCSection and emit an assembler
205// temporary label to it if SymbolStem is specified.
Eric Christopher7b30f2e42012-11-21 00:34:35 +0000206static MCSymbol *emitSectionSym(AsmPrinter *Asm, const MCSection *Section,
Eric Christophera7b61892011-11-07 09:18:38 +0000207 const char *SymbolStem = 0) {
208 Asm->OutStreamer.SwitchSection(Section);
209 if (!SymbolStem) return 0;
210
211 MCSymbol *TmpSym = Asm->GetTempSymbol(SymbolStem);
212 Asm->OutStreamer.EmitLabel(TmpSym);
213 return TmpSym;
214}
215
Eric Christophere698f532012-12-20 21:58:36 +0000216MCSymbol *DwarfUnits::getStringPoolSym() {
Eric Christopher3bf29fd2012-12-27 02:14:01 +0000217 return Asm->GetTempSymbol(StringPref);
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +0000218}
219
Eric Christophere698f532012-12-20 21:58:36 +0000220MCSymbol *DwarfUnits::getStringPoolEntry(StringRef Str) {
221 std::pair<MCSymbol*, unsigned> &Entry =
Eric Christopher27614582013-01-08 22:22:06 +0000222 StringPool.GetOrCreateValue(Str).getValue();
Chris Lattnerb7aa9522010-03-13 02:17:42 +0000223 if (Entry.first) return Entry.first;
224
225 Entry.second = NextStringPoolNumber++;
Eric Christopher3bf29fd2012-12-27 02:14:01 +0000226 return Entry.first = Asm->GetTempSymbol(StringPref, Entry.second);
Chris Lattnerb7aa9522010-03-13 02:17:42 +0000227}
228
Eric Christopher2cbd5762013-01-07 19:32:41 +0000229unsigned DwarfUnits::getStringPoolIndex(StringRef Str) {
230 std::pair<MCSymbol*, unsigned> &Entry =
Eric Christopher27614582013-01-08 22:22:06 +0000231 StringPool.GetOrCreateValue(Str).getValue();
Eric Christopher2cbd5762013-01-07 19:32:41 +0000232 if (Entry.first) return Entry.second;
233
234 Entry.second = NextStringPoolNumber++;
235 Entry.first = Asm->GetTempSymbol(StringPref, Entry.second);
236 return Entry.second;
237}
238
Eric Christopher962c9082013-01-15 23:56:56 +0000239unsigned DwarfUnits::getAddrPoolIndex(MCSymbol *Sym) {
240 std::pair<MCSymbol*, unsigned> &Entry = AddressPool[Sym];
241 if (Entry.first) return Entry.second;
242
243 Entry.second = NextAddrPoolNumber++;
244 Entry.first = Sym;
245 return Entry.second;
246}
247
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000248// Define a unique number for the abbreviation.
249//
Eric Christopherc8a310e2012-12-10 23:34:43 +0000250void DwarfUnits::assignAbbrevNumber(DIEAbbrev &Abbrev) {
Bill Wendling2f921f82009-05-15 09:23:25 +0000251 // Profile the node so that we can make it unique.
252 FoldingSetNodeID ID;
253 Abbrev.Profile(ID);
254
255 // Check the set for priors.
Eric Christopherc8a310e2012-12-10 23:34:43 +0000256 DIEAbbrev *InSet = AbbreviationsSet->GetOrInsertNode(&Abbrev);
Bill Wendling2f921f82009-05-15 09:23:25 +0000257
258 // If it's newly added.
259 if (InSet == &Abbrev) {
260 // Add to abbreviation list.
Eric Christopherc8a310e2012-12-10 23:34:43 +0000261 Abbreviations->push_back(&Abbrev);
Bill Wendling2f921f82009-05-15 09:23:25 +0000262
263 // Assign the vector position + 1 as its number.
Eric Christopherc8a310e2012-12-10 23:34:43 +0000264 Abbrev.setNumber(Abbreviations->size());
Bill Wendling2f921f82009-05-15 09:23:25 +0000265 } else {
266 // Assign existing abbreviation number.
267 Abbrev.setNumber(InSet->getNumber());
268 }
269}
270
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000271// If special LLVM prefix that is used to inform the asm
272// printer to not emit usual symbol prefix before the symbol name is used then
273// return linkage name after skipping this special LLVM prefix.
Devang Patel43ef34d2010-01-05 01:46:14 +0000274static StringRef getRealLinkageName(StringRef LinkageName) {
275 char One = '\1';
276 if (LinkageName.startswith(StringRef(&One, 1)))
277 return LinkageName.substr(1);
278 return LinkageName;
279}
280
Eric Christopherd9843b32011-11-10 19:25:34 +0000281static bool isObjCClass(StringRef Name) {
282 return Name.startswith("+") || Name.startswith("-");
283}
284
285static bool hasObjCCategory(StringRef Name) {
286 if (!isObjCClass(Name)) return false;
287
288 size_t pos = Name.find(')');
289 if (pos != std::string::npos) {
290 if (Name[pos+1] != ' ') return false;
291 return true;
292 }
293 return false;
294}
295
296static void getObjCClassCategory(StringRef In, StringRef &Class,
297 StringRef &Category) {
298 if (!hasObjCCategory(In)) {
299 Class = In.slice(In.find('[') + 1, In.find(' '));
300 Category = "";
301 return;
302 }
303
304 Class = In.slice(In.find('[') + 1, In.find('('));
305 Category = In.slice(In.find('[') + 1, In.find(' '));
306 return;
307}
308
309static StringRef getObjCMethodName(StringRef In) {
310 return In.slice(In.find(' ') + 1, In.find(']'));
311}
312
313// Add the various names to the Dwarf accelerator table names.
314static void addSubprogramNames(CompileUnit *TheCU, DISubprogram SP,
315 DIE* Die) {
316 if (!SP.isDefinition()) return;
Eric Christopher6a841382012-11-19 22:42:10 +0000317
Eric Christopherd9843b32011-11-10 19:25:34 +0000318 TheCU->addAccelName(SP.getName(), Die);
319
320 // If the linkage name is different than the name, go ahead and output
321 // that as well into the name table.
322 if (SP.getLinkageName() != "" && SP.getName() != SP.getLinkageName())
323 TheCU->addAccelName(SP.getLinkageName(), Die);
324
325 // If this is an Objective-C selector name add it to the ObjC accelerator
326 // too.
327 if (isObjCClass(SP.getName())) {
328 StringRef Class, Category;
329 getObjCClassCategory(SP.getName(), Class, Category);
330 TheCU->addAccelObjC(Class, Die);
331 if (Category != "")
332 TheCU->addAccelObjC(Category, Die);
333 // Also add the base method name to the name table.
334 TheCU->addAccelName(getObjCMethodName(SP.getName()), Die);
335 }
336}
337
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000338// Find DIE for the given subprogram and attach appropriate DW_AT_low_pc
339// and DW_AT_high_pc attributes. If there are global variables in this
340// scope then create and insert DIEs for these variables.
Devang Pateld2dfc5e2011-08-15 22:24:32 +0000341DIE *DwarfDebug::updateSubprogramScopeDIE(CompileUnit *SPCU,
342 const MDNode *SPNode) {
Devang Patel1a0df9a2010-05-10 22:49:55 +0000343 DIE *SPDie = SPCU->getDIE(SPNode);
Devang Patela37a95e2010-07-07 22:20:57 +0000344
Chris Lattner3a383cb2010-04-05 00:13:49 +0000345 assert(SPDie && "Unable to find subprogram DIE!");
346 DISubprogram SP(SPNode);
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000347
Bill Wendlingf720bf62012-11-07 05:19:04 +0000348 // If we're updating an abstract DIE, then we will be adding the children and
349 // object pointer later on. But what we don't want to do is process the
350 // concrete DIE twice.
Devang Patela37a95e2010-07-07 22:20:57 +0000351 if (DIE *AbsSPDIE = AbstractSPDies.lookup(SPNode)) {
Bill Wendlingf720bf62012-11-07 05:19:04 +0000352 // Pick up abstract subprogram DIE.
Devang Patela37a95e2010-07-07 22:20:57 +0000353 SPDie = new DIE(dwarf::DW_TAG_subprogram);
Devang Patelf20c4f72011-04-12 22:53:02 +0000354 SPCU->addDIEEntry(SPDie, dwarf::DW_AT_abstract_origin,
355 dwarf::DW_FORM_ref4, AbsSPDIE);
Devang Patela37a95e2010-07-07 22:20:57 +0000356 SPCU->addDie(SPDie);
Bill Wendlingd9bb9b62012-11-07 04:42:18 +0000357 } else {
358 DISubprogram SPDecl = SP.getFunctionDeclaration();
359 if (!SPDecl.isSubprogram()) {
360 // There is not any need to generate specification DIE for a function
361 // defined at compile unit level. If a function is defined inside another
362 // function then gdb prefers the definition at top level and but does not
363 // expect specification DIE in parent function. So avoid creating
364 // specification DIE for a function defined inside a function.
365 if (SP.isDefinition() && !SP.getContext().isCompileUnit() &&
366 !SP.getContext().isFile() &&
367 !isSubprogramContext(SP.getContext())) {
368 SPCU->addFlag(SPDie, dwarf::DW_AT_declaration);
369
370 // Add arguments.
371 DICompositeType SPTy = SP.getType();
372 DIArray Args = SPTy.getTypeArray();
373 unsigned SPTag = SPTy.getTag();
374 if (SPTag == dwarf::DW_TAG_subroutine_type)
375 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
376 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
377 DIType ATy = DIType(Args.getElement(i));
378 SPCU->addType(Arg, ATy);
379 if (ATy.isArtificial())
380 SPCU->addFlag(Arg, dwarf::DW_AT_artificial);
381 if (ATy.isObjectPointer())
382 SPCU->addDIEEntry(SPDie, dwarf::DW_AT_object_pointer,
383 dwarf::DW_FORM_ref4, Arg);
384 SPDie->addChild(Arg);
385 }
386 DIE *SPDeclDie = SPDie;
387 SPDie = new DIE(dwarf::DW_TAG_subprogram);
Eric Christopher6a841382012-11-19 22:42:10 +0000388 SPCU->addDIEEntry(SPDie, dwarf::DW_AT_specification,
389 dwarf::DW_FORM_ref4, SPDeclDie);
Bill Wendlingd9bb9b62012-11-07 04:42:18 +0000390 SPCU->addDie(SPDie);
391 }
392 }
Devang Patela37a95e2010-07-07 22:20:57 +0000393 }
394
Eric Christopher962c9082013-01-15 23:56:56 +0000395 SPCU->addLabelAddress(SPDie, dwarf::DW_AT_low_pc,
396 Asm->GetTempSymbol("func_begin",
397 Asm->getFunctionNumber()));
398 SPCU->addLabelAddress(SPDie, dwarf::DW_AT_high_pc,
399 Asm->GetTempSymbol("func_end",
400 Asm->getFunctionNumber()));
Chris Lattner3a383cb2010-04-05 00:13:49 +0000401 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
402 MachineLocation Location(RI->getFrameRegister(*Asm->MF));
Devang Patelf20c4f72011-04-12 22:53:02 +0000403 SPCU->addAddress(SPDie, dwarf::DW_AT_frame_base, Location);
Devang Patel6efc8e52010-02-06 01:02:37 +0000404
Eric Christopherd9843b32011-11-10 19:25:34 +0000405 // Add name to the name table, we do this here because we're guaranteed
406 // to have concrete versions of our DW_TAG_subprogram nodes.
407 addSubprogramNames(SPCU, SP, SPDie);
Eric Christopher6a841382012-11-19 22:42:10 +0000408
Chris Lattner3a383cb2010-04-05 00:13:49 +0000409 return SPDie;
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000410}
411
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000412// Construct new DW_TAG_lexical_block for this scope and attach
413// DW_AT_low_pc/DW_AT_high_pc labels.
Eric Christopher6a841382012-11-19 22:42:10 +0000414DIE *DwarfDebug::constructLexicalScopeDIE(CompileUnit *TheCU,
Devang Pateld2dfc5e2011-08-15 22:24:32 +0000415 LexicalScope *Scope) {
Devang Patel6c74a872010-04-27 19:46:33 +0000416 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_lexical_block);
417 if (Scope->isAbstractScope())
418 return ScopeDIE;
419
Devang Patel7e623022011-08-10 20:55:27 +0000420 const SmallVector<InsnRange, 4> &Ranges = Scope->getRanges();
Devang Patel6c74a872010-04-27 19:46:33 +0000421 if (Ranges.empty())
422 return 0;
423
Devang Patel7e623022011-08-10 20:55:27 +0000424 SmallVector<InsnRange, 4>::const_iterator RI = Ranges.begin();
Devang Patel6c74a872010-04-27 19:46:33 +0000425 if (Ranges.size() > 1) {
426 // .debug_range section has not been laid out yet. Emit offset in
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000427 // .debug_range as a uint, size 4, for now. emitDIE will handle
Devang Patel6c74a872010-04-27 19:46:33 +0000428 // DW_AT_ranges appropriately.
Devang Patelf20c4f72011-04-12 22:53:02 +0000429 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_ranges, dwarf::DW_FORM_data4,
Eric Christopher6a841382012-11-19 22:42:10 +0000430 DebugRangeSymbols.size()
Chandler Carruth5da3f052012-11-01 09:14:31 +0000431 * Asm->getDataLayout().getPointerSize());
Devang Patel7e623022011-08-10 20:55:27 +0000432 for (SmallVector<InsnRange, 4>::const_iterator RI = Ranges.begin(),
Devang Patel6c74a872010-04-27 19:46:33 +0000433 RE = Ranges.end(); RI != RE; ++RI) {
Devang Patel9fc11702010-05-25 23:40:22 +0000434 DebugRangeSymbols.push_back(getLabelBeforeInsn(RI->first));
435 DebugRangeSymbols.push_back(getLabelAfterInsn(RI->second));
Devang Patel6c74a872010-04-27 19:46:33 +0000436 }
437 DebugRangeSymbols.push_back(NULL);
438 DebugRangeSymbols.push_back(NULL);
439 return ScopeDIE;
440 }
441
Eric Christopher962c9082013-01-15 23:56:56 +0000442 MCSymbol *Start = getLabelBeforeInsn(RI->first);
443 MCSymbol *End = getLabelAfterInsn(RI->second);
Devang Patel6c74a872010-04-27 19:46:33 +0000444
Devang Patel9fc11702010-05-25 23:40:22 +0000445 if (End == 0) return 0;
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000446
Chris Lattnere13c3722010-03-09 01:58:53 +0000447 assert(Start->isDefined() && "Invalid starting label for an inlined scope!");
448 assert(End->isDefined() && "Invalid end label for an inlined scope!");
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000449
Eric Christopher962c9082013-01-15 23:56:56 +0000450 TheCU->addLabelAddress(ScopeDIE, dwarf::DW_AT_low_pc, Start);
451 TheCU->addLabelAddress(ScopeDIE, dwarf::DW_AT_high_pc, End);
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000452
453 return ScopeDIE;
454}
455
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000456// This scope represents inlined body of a function. Construct DIE to
457// represent this concrete inlined copy of the function.
Devang Pateld2dfc5e2011-08-15 22:24:32 +0000458DIE *DwarfDebug::constructInlinedScopeDIE(CompileUnit *TheCU,
459 LexicalScope *Scope) {
Devang Patel7e623022011-08-10 20:55:27 +0000460 const SmallVector<InsnRange, 4> &Ranges = Scope->getRanges();
Nick Lewycky654f5ce2011-10-26 22:55:33 +0000461 assert(Ranges.empty() == false &&
462 "LexicalScope does not have instruction markers!");
Devang Patel6c74a872010-04-27 19:46:33 +0000463
Devang Patelf098ce22011-07-27 00:34:13 +0000464 if (!Scope->getScopeNode())
465 return NULL;
466 DIScope DS(Scope->getScopeNode());
467 DISubprogram InlinedSP = getDISubprogram(DS);
Devang Patelf098ce22011-07-27 00:34:13 +0000468 DIE *OriginDIE = TheCU->getDIE(InlinedSP);
469 if (!OriginDIE) {
Bill Wendling10e0e2e2012-10-30 17:51:02 +0000470 DEBUG(dbgs() << "Unable to find original DIE for an inlined subprogram.");
Devang Patelf098ce22011-07-27 00:34:13 +0000471 return NULL;
472 }
473
Devang Patel7e623022011-08-10 20:55:27 +0000474 SmallVector<InsnRange, 4>::const_iterator RI = Ranges.begin();
Eric Christopher962c9082013-01-15 23:56:56 +0000475 MCSymbol *StartLabel = getLabelBeforeInsn(RI->first);
476 MCSymbol *EndLabel = getLabelAfterInsn(RI->second);
Devang Patel6c74a872010-04-27 19:46:33 +0000477
Devang Patel4c6bd662010-07-08 22:39:20 +0000478 if (StartLabel == 0 || EndLabel == 0) {
Bill Wendling10e0e2e2012-10-30 17:51:02 +0000479 llvm_unreachable("Unexpected Start and End labels for an inlined scope!");
Devang Patel6c74a872010-04-27 19:46:33 +0000480 }
Chris Lattnere13c3722010-03-09 01:58:53 +0000481 assert(StartLabel->isDefined() &&
Chris Lattnerc3b70f62010-03-09 01:51:43 +0000482 "Invalid starting label for an inlined scope!");
Chris Lattnere13c3722010-03-09 01:58:53 +0000483 assert(EndLabel->isDefined() &&
Chris Lattnerc3b70f62010-03-09 01:51:43 +0000484 "Invalid end label for an inlined scope!");
Devang Patel6c74a872010-04-27 19:46:33 +0000485
Devang Patel73bc1722011-05-05 17:54:26 +0000486 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_inlined_subroutine);
Devang Patelf20c4f72011-04-12 22:53:02 +0000487 TheCU->addDIEEntry(ScopeDIE, dwarf::DW_AT_abstract_origin,
488 dwarf::DW_FORM_ref4, OriginDIE);
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000489
Devang Patelf098ce22011-07-27 00:34:13 +0000490 if (Ranges.size() > 1) {
491 // .debug_range section has not been laid out yet. Emit offset in
492 // .debug_range as a uint, size 4, for now. emitDIE will handle
493 // DW_AT_ranges appropriately.
494 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_ranges, dwarf::DW_FORM_data4,
Eric Christopher6a841382012-11-19 22:42:10 +0000495 DebugRangeSymbols.size()
Chandler Carruth5da3f052012-11-01 09:14:31 +0000496 * Asm->getDataLayout().getPointerSize());
Devang Patel7e623022011-08-10 20:55:27 +0000497 for (SmallVector<InsnRange, 4>::const_iterator RI = Ranges.begin(),
Devang Patelf098ce22011-07-27 00:34:13 +0000498 RE = Ranges.end(); RI != RE; ++RI) {
499 DebugRangeSymbols.push_back(getLabelBeforeInsn(RI->first));
500 DebugRangeSymbols.push_back(getLabelAfterInsn(RI->second));
501 }
502 DebugRangeSymbols.push_back(NULL);
503 DebugRangeSymbols.push_back(NULL);
504 } else {
Eric Christopher962c9082013-01-15 23:56:56 +0000505 TheCU->addLabelAddress(ScopeDIE, dwarf::DW_AT_low_pc, StartLabel);
506 TheCU->addLabelAddress(ScopeDIE, dwarf::DW_AT_high_pc, EndLabel);
Devang Patelf098ce22011-07-27 00:34:13 +0000507 }
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000508
509 InlinedSubprogramDIEs.insert(OriginDIE);
510
511 // Track the start label for this inlined function.
Devang Patelf098ce22011-07-27 00:34:13 +0000512 //.debug_inlined section specification does not clearly state how
513 // to emit inlined scope that is split into multiple instruction ranges.
514 // For now, use first instruction range and emit low_pc/high_pc pair and
515 // corresponding .debug_inlined section entry for this pair.
Devang Patel32cc43c2010-05-07 20:54:48 +0000516 DenseMap<const MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator
Devang Patelcfa8e9d2010-05-07 18:11:54 +0000517 I = InlineInfo.find(InlinedSP);
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000518
519 if (I == InlineInfo.end()) {
Nick Lewycky654f5ce2011-10-26 22:55:33 +0000520 InlineInfo[InlinedSP].push_back(std::make_pair(StartLabel, ScopeDIE));
Devang Patelcfa8e9d2010-05-07 18:11:54 +0000521 InlinedSPNodes.push_back(InlinedSP);
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000522 } else
Chris Lattner085b6522010-03-09 00:31:02 +0000523 I->second.push_back(std::make_pair(StartLabel, ScopeDIE));
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000524
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000525 DILocation DL(Scope->getInlinedAt());
Eric Christopher0925c622012-03-26 21:38:38 +0000526 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_call_file, 0,
Eric Christopher7b30f2e42012-11-21 00:34:35 +0000527 getOrCreateSourceID(DL.getFilename(), DL.getDirectory()));
Devang Patelf20c4f72011-04-12 22:53:02 +0000528 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_call_line, 0, DL.getLineNumber());
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000529
Eric Christopher8dda5d02011-12-04 06:02:38 +0000530 // Add name to the name table, we do this here because we're guaranteed
531 // to have concrete versions of our DW_TAG_inlined_subprogram nodes.
532 addSubprogramNames(TheCU, InlinedSP, ScopeDIE);
Eric Christopher6a841382012-11-19 22:42:10 +0000533
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000534 return ScopeDIE;
535}
536
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000537// Construct a DIE for this scope.
Devang Patel3acc70e2011-08-15 22:04:40 +0000538DIE *DwarfDebug::constructScopeDIE(CompileUnit *TheCU, LexicalScope *Scope) {
Devang Patel3b548aa2010-03-08 20:52:55 +0000539 if (!Scope || !Scope->getScopeNode())
540 return NULL;
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000541
Manman Ren53f3f9f2013-01-31 20:05:14 +0000542 DIScope DS(Scope->getScopeNode());
543 // Early return to avoid creating dangling variable|scope DIEs.
544 if (!Scope->getInlinedAt() && DS.isSubprogram() && Scope->isAbstractScope() &&
545 !TheCU->getDIE(DS))
546 return NULL;
547
Nick Lewycky654f5ce2011-10-26 22:55:33 +0000548 SmallVector<DIE *, 8> Children;
Eric Christophere3417762012-09-12 23:36:19 +0000549 DIE *ObjectPointer = NULL;
Devang Patel6c622ef2011-03-01 22:58:55 +0000550
551 // Collect arguments for current function.
Devang Patel7e623022011-08-10 20:55:27 +0000552 if (LScopes.isCurrentFunctionScope(Scope))
Devang Patel6c622ef2011-03-01 22:58:55 +0000553 for (unsigned i = 0, N = CurrentFnArguments.size(); i < N; ++i)
554 if (DbgVariable *ArgDV = CurrentFnArguments[i])
Eric Christopher6a841382012-11-19 22:42:10 +0000555 if (DIE *Arg =
Eric Christophere3417762012-09-12 23:36:19 +0000556 TheCU->constructVariableDIE(ArgDV, Scope->isAbstractScope())) {
Devang Patel6c622ef2011-03-01 22:58:55 +0000557 Children.push_back(Arg);
Eric Christophere3417762012-09-12 23:36:19 +0000558 if (ArgDV->isObjectPointer()) ObjectPointer = Arg;
559 }
Devang Patel6c622ef2011-03-01 22:58:55 +0000560
Eric Christopherf84354b2011-10-03 15:49:16 +0000561 // Collect lexical scope children first.
Devang Patel7e623022011-08-10 20:55:27 +0000562 const SmallVector<DbgVariable *, 8> &Variables = ScopeVariables.lookup(Scope);
Devang Patel5f1b4cd2011-02-19 01:31:27 +0000563 for (unsigned i = 0, N = Variables.size(); i < N; ++i)
Eric Christopher6a841382012-11-19 22:42:10 +0000564 if (DIE *Variable =
Eric Christopherc1c8a1b2012-09-21 22:18:52 +0000565 TheCU->constructVariableDIE(Variables[i], Scope->isAbstractScope())) {
Devang Patel5f1b4cd2011-02-19 01:31:27 +0000566 Children.push_back(Variable);
Eric Christopherc1c8a1b2012-09-21 22:18:52 +0000567 if (Variables[i]->isObjectPointer()) ObjectPointer = Variable;
568 }
Devang Patel7e623022011-08-10 20:55:27 +0000569 const SmallVector<LexicalScope *, 4> &Scopes = Scope->getChildren();
Devang Patel5f1b4cd2011-02-19 01:31:27 +0000570 for (unsigned j = 0, M = Scopes.size(); j < M; ++j)
Devang Patel3acc70e2011-08-15 22:04:40 +0000571 if (DIE *Nested = constructScopeDIE(TheCU, Scopes[j]))
Devang Patel5f1b4cd2011-02-19 01:31:27 +0000572 Children.push_back(Nested);
Devang Patel3b548aa2010-03-08 20:52:55 +0000573 DIE *ScopeDIE = NULL;
574 if (Scope->getInlinedAt())
Devang Pateld2dfc5e2011-08-15 22:24:32 +0000575 ScopeDIE = constructInlinedScopeDIE(TheCU, Scope);
Devang Patel3b548aa2010-03-08 20:52:55 +0000576 else if (DS.isSubprogram()) {
Devang Pateld10b2af2010-06-28 20:53:04 +0000577 ProcessedSPNodes.insert(DS);
Devang Patela37a95e2010-07-07 22:20:57 +0000578 if (Scope->isAbstractScope()) {
Devang Pateld2dfc5e2011-08-15 22:24:32 +0000579 ScopeDIE = TheCU->getDIE(DS);
Devang Patela37a95e2010-07-07 22:20:57 +0000580 // Note down abstract DIE.
581 if (ScopeDIE)
582 AbstractSPDies.insert(std::make_pair(DS, ScopeDIE));
583 }
Devang Patel3b548aa2010-03-08 20:52:55 +0000584 else
Devang Pateld2dfc5e2011-08-15 22:24:32 +0000585 ScopeDIE = updateSubprogramScopeDIE(TheCU, DS);
Devang Patel3b548aa2010-03-08 20:52:55 +0000586 }
Devang Patel5f1b4cd2011-02-19 01:31:27 +0000587 else {
588 // There is no need to emit empty lexical block DIE.
589 if (Children.empty())
590 return NULL;
Devang Pateld2dfc5e2011-08-15 22:24:32 +0000591 ScopeDIE = constructLexicalScopeDIE(TheCU, Scope);
Devang Patel5f1b4cd2011-02-19 01:31:27 +0000592 }
Eric Christopher6a841382012-11-19 22:42:10 +0000593
Devang Patel23b2ae62010-03-29 22:59:58 +0000594 if (!ScopeDIE) return NULL;
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000595
Devang Patel5f1b4cd2011-02-19 01:31:27 +0000596 // Add children
597 for (SmallVector<DIE *, 8>::iterator I = Children.begin(),
598 E = Children.end(); I != E; ++I)
599 ScopeDIE->addChild(*I);
Devang Patel04d2f2d2009-11-24 01:14:22 +0000600
Eric Christophere3417762012-09-12 23:36:19 +0000601 if (DS.isSubprogram() && ObjectPointer != NULL)
602 TheCU->addDIEEntry(ScopeDIE, dwarf::DW_AT_object_pointer,
603 dwarf::DW_FORM_ref4, ObjectPointer);
604
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000605 if (DS.isSubprogram())
Eric Christopherd9843b32011-11-10 19:25:34 +0000606 TheCU->addPubTypes(DISubprogram(DS));
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000607
Eric Christopherd9843b32011-11-10 19:25:34 +0000608 return ScopeDIE;
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000609}
610
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000611// Look up the source id with the given directory and source file names.
612// If none currently exists, create a new id and insert it in the
613// SourceIds map. This can update DirectoryNames and SourceFileNames maps
614// as well.
Eric Christopher7b30f2e42012-11-21 00:34:35 +0000615unsigned DwarfDebug::getOrCreateSourceID(StringRef FileName,
Devang Patele01b75c2011-03-24 20:30:50 +0000616 StringRef DirName) {
Devang Patel871d0b12010-09-16 20:57:49 +0000617 // If FE did not provide a file name, then assume stdin.
618 if (FileName.empty())
Eric Christopher7b30f2e42012-11-21 00:34:35 +0000619 return getOrCreateSourceID("<stdin>", StringRef());
Devang Patele01b75c2011-03-24 20:30:50 +0000620
Nick Lewyckyd1ee7f82011-11-02 20:55:33 +0000621 // TODO: this might not belong here. See if we can factor this better.
622 if (DirName == CompilationDir)
623 DirName = "";
624
Nick Lewycky40f8f2f2011-10-17 23:05:28 +0000625 unsigned SrcId = SourceIdMap.size()+1;
Devang Patel871d0b12010-09-16 20:57:49 +0000626
Benjamin Kramer71b19732012-03-11 14:56:26 +0000627 // We look up the file/dir pair by concatenating them with a zero byte.
628 SmallString<128> NamePair;
629 NamePair += DirName;
630 NamePair += '\0'; // Zero bytes are not allowed in paths.
631 NamePair += FileName;
632
633 StringMapEntry<unsigned> &Ent = SourceIdMap.GetOrCreateValue(NamePair, SrcId);
634 if (Ent.getValue() != SrcId)
635 return Ent.getValue();
Bill Wendling2b128d72009-05-20 23:19:06 +0000636
Rafael Espindola67c6ab82010-11-18 02:04:25 +0000637 // Print out a .file directive to specify files for .loc directives.
Benjamin Kramer71b19732012-03-11 14:56:26 +0000638 Asm->OutStreamer.EmitDwarfFileDirective(SrcId, DirName, FileName);
Bill Wendling2b128d72009-05-20 23:19:06 +0000639
640 return SrcId;
641}
642
Eric Christopher48fef592012-12-20 21:58:40 +0000643// Create new CompileUnit for the given metadata node with tag
644// DW_TAG_compile_unit.
Devang Pateleb1bb4e2011-08-16 22:09:43 +0000645CompileUnit *DwarfDebug::constructCompileUnit(const MDNode *N) {
Devang Patel80ae3492009-08-28 23:24:31 +0000646 DICompileUnit DIUnit(N);
Devang Patel2d9caf92009-11-25 17:36:49 +0000647 StringRef FN = DIUnit.getFilename();
Nick Lewyckyd1ee7f82011-11-02 20:55:33 +0000648 CompilationDir = DIUnit.getDirectory();
Eli Benderskyb42d1462012-12-03 18:45:45 +0000649 // Call this to emit a .file directive if it wasn't emitted for the source
650 // file this CU comes from yet.
651 getOrCreateSourceID(FN, CompilationDir);
Bill Wendling2b128d72009-05-20 23:19:06 +0000652
653 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
Eli Benderskyb42d1462012-12-03 18:45:45 +0000654 CompileUnit *NewCU = new CompileUnit(GlobalCUIndexCount++,
Eric Christophere698f532012-12-20 21:58:36 +0000655 DIUnit.getLanguage(), Die, Asm,
656 this, &InfoHolder);
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +0000657 NewCU->addString(Die, dwarf::DW_AT_producer, DIUnit.getProducer());
Devang Patelf20c4f72011-04-12 22:53:02 +0000658 NewCU->addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data2,
659 DIUnit.getLanguage());
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +0000660 NewCU->addString(Die, dwarf::DW_AT_name, FN);
Eric Christopherb1b94512012-08-01 18:19:01 +0000661 // 2.17.1 requires that we use DW_AT_low_pc for a single entry point
Eric Christopher962c9082013-01-15 23:56:56 +0000662 // into an entity. We're using 0 (or a NULL label) for this.
663 NewCU->addLabelAddress(Die, dwarf::DW_AT_low_pc, NULL);
Manman Ren4e042a62013-02-05 21:52:47 +0000664
665 // Define start line table label for each Compile Unit.
666 MCSymbol *LineTableStartSym = Asm->GetTempSymbol("line_table_start",
667 NewCU->getUniqueID());
668 Asm->OutStreamer.getContext().setMCLineTableSymbol(LineTableStartSym,
669 NewCU->getUniqueID());
670
Devang Pateld22ed622010-03-22 23:11:36 +0000671 // DW_AT_stmt_list is a offset of line number information for this
Devang Patel4a213872010-08-24 00:06:12 +0000672 // compile unit in debug_line section.
Rafael Espindolad7bdaf52012-06-22 13:24:07 +0000673 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
Rafael Espindolaa7558912011-05-04 17:44:06 +0000674 NewCU->addLabel(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4,
Manman Ren4e042a62013-02-05 21:52:47 +0000675 LineTableStartSym);
Manman Rend2c38d62013-02-06 00:59:41 +0000676 else if (NewCU->getUniqueID() == 0)
677 NewCU->addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4, 0);
Devang Patelea636392010-08-31 23:50:19 +0000678 else
Manman Ren4e042a62013-02-05 21:52:47 +0000679 NewCU->addDelta(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4,
680 LineTableStartSym, Asm->GetTempSymbol("section_line"));
Bill Wendling2b128d72009-05-20 23:19:06 +0000681
Nick Lewyckyd1ee7f82011-11-02 20:55:33 +0000682 if (!CompilationDir.empty())
683 NewCU->addString(Die, dwarf::DW_AT_comp_dir, CompilationDir);
Bill Wendling2b128d72009-05-20 23:19:06 +0000684 if (DIUnit.isOptimized())
Eric Christopherbb69a272012-08-24 01:14:27 +0000685 NewCU->addFlag(Die, dwarf::DW_AT_APPLE_optimized);
Bill Wendling2b128d72009-05-20 23:19:06 +0000686
Devang Patel2d9caf92009-11-25 17:36:49 +0000687 StringRef Flags = DIUnit.getFlags();
688 if (!Flags.empty())
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +0000689 NewCU->addString(Die, dwarf::DW_AT_APPLE_flags, Flags);
Eric Christopher6a841382012-11-19 22:42:10 +0000690
Nick Lewycky479a8fe2011-10-17 23:27:36 +0000691 if (unsigned RVer = DIUnit.getRunTimeVersion())
Devang Patelf20c4f72011-04-12 22:53:02 +0000692 NewCU->addUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers,
Bill Wendling2b128d72009-05-20 23:19:06 +0000693 dwarf::DW_FORM_data1, RVer);
694
Devang Patel1a0df9a2010-05-10 22:49:55 +0000695 if (!FirstCU)
696 FirstCU = NewCU;
Eric Christopher7a2cdf72013-02-05 07:31:55 +0000697
Eric Christopher411e6742013-02-05 07:32:03 +0000698 if (useSplitDwarf()) {
699 // This should be a unique identifier when we want to build .dwp files.
Eric Christopher7a2cdf72013-02-05 07:31:55 +0000700 NewCU->addUInt(Die, dwarf::DW_AT_GNU_dwo_id, dwarf::DW_FORM_data8, 0);
Eric Christopher411e6742013-02-05 07:32:03 +0000701 // Now construct the skeleton CU associated.
702 constructSkeletonCU(N);
703 }
Eric Christopher9c2ecd92012-11-30 23:59:06 +0000704
Eric Christopherc8a310e2012-12-10 23:34:43 +0000705 InfoHolder.addUnit(NewCU);
706
Devang Patel1a0df9a2010-05-10 22:49:55 +0000707 CUMap.insert(std::make_pair(N, NewCU));
Devang Pateleb1bb4e2011-08-16 22:09:43 +0000708 return NewCU;
Devang Patel1a0df9a2010-05-10 22:49:55 +0000709}
710
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000711// Construct subprogram DIE.
Eric Christopher6a841382012-11-19 22:42:10 +0000712void DwarfDebug::constructSubprogramDIE(CompileUnit *TheCU,
Devang Patel1f4f98d2011-08-15 23:36:40 +0000713 const MDNode *N) {
Rafael Espindola6cf4e832011-11-04 19:00:29 +0000714 CompileUnit *&CURef = SPMap[N];
715 if (CURef)
716 return;
717 CURef = TheCU;
718
Devang Patel80ae3492009-08-28 23:24:31 +0000719 DISubprogram SP(N);
Bill Wendling2b128d72009-05-20 23:19:06 +0000720 if (!SP.isDefinition())
721 // This is a method declaration which will be handled while constructing
722 // class type.
Devang Patel0751a282009-06-26 01:49:18 +0000723 return;
Bill Wendling2b128d72009-05-20 23:19:06 +0000724
Devang Patel89543712011-08-15 17:24:54 +0000725 DIE *SubprogramDie = TheCU->getOrCreateSubprogramDIE(SP);
Stuart Hastings4bd3dd92010-04-06 21:38:29 +0000726
727 // Add to map.
Devang Patel1a0df9a2010-05-10 22:49:55 +0000728 TheCU->insertDIE(N, SubprogramDie);
Bill Wendling2b128d72009-05-20 23:19:06 +0000729
730 // Add to context owner.
Devang Patelf20c4f72011-04-12 22:53:02 +0000731 TheCU->addToContextOwner(SubprogramDie, SP.getContext());
Devang Patel512001a2009-12-08 23:21:45 +0000732
Devang Patel0751a282009-06-26 01:49:18 +0000733 return;
Bill Wendling2b128d72009-05-20 23:19:06 +0000734}
735
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000736// Collect debug info from named mdnodes such as llvm.dbg.enum and llvm.dbg.ty.
Eric Christopher58f41952012-11-19 22:42:15 +0000737void DwarfDebug::collectInfoFromNamedMDNodes(const Module *M) {
Devang Pateleb1bb4e2011-08-16 22:09:43 +0000738 if (NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.sp"))
739 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
740 const MDNode *N = NMD->getOperand(i);
741 if (CompileUnit *CU = CUMap.lookup(DISubprogram(N).getCompileUnit()))
742 constructSubprogramDIE(CU, N);
743 }
Eric Christopher6a841382012-11-19 22:42:10 +0000744
Devang Pateleb1bb4e2011-08-16 22:09:43 +0000745 if (NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.gv"))
746 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
747 const MDNode *N = NMD->getOperand(i);
748 if (CompileUnit *CU = CUMap.lookup(DIGlobalVariable(N).getCompileUnit()))
Devang Patel0ecbcbd2011-08-18 23:17:55 +0000749 CU->createGlobalVariableDIE(N);
Devang Pateleb1bb4e2011-08-16 22:09:43 +0000750 }
Eric Christopher6a841382012-11-19 22:42:10 +0000751
Devang Patel07bb9ee2011-08-15 23:47:24 +0000752 if (NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.enum"))
753 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
754 DIType Ty(NMD->getOperand(i));
Devang Pateleb1bb4e2011-08-16 22:09:43 +0000755 if (CompileUnit *CU = CUMap.lookup(Ty.getCompileUnit()))
756 CU->getOrCreateTypeDIE(Ty);
Devang Patel07bb9ee2011-08-15 23:47:24 +0000757 }
Eric Christopher6a841382012-11-19 22:42:10 +0000758
Devang Patel07bb9ee2011-08-15 23:47:24 +0000759 if (NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.ty"))
760 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
761 DIType Ty(NMD->getOperand(i));
Devang Pateleb1bb4e2011-08-16 22:09:43 +0000762 if (CompileUnit *CU = CUMap.lookup(Ty.getCompileUnit()))
763 CU->getOrCreateTypeDIE(Ty);
Devang Patel07bb9ee2011-08-15 23:47:24 +0000764 }
765}
766
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000767// Collect debug info using DebugInfoFinder.
768// FIXME - Remove this when dragonegg switches to DIBuilder.
Eric Christopher58f41952012-11-19 22:42:15 +0000769bool DwarfDebug::collectLegacyDebugInfo(const Module *M) {
Devang Patel07bb9ee2011-08-15 23:47:24 +0000770 DebugInfoFinder DbgFinder;
771 DbgFinder.processModule(*M);
Eric Christopher6a841382012-11-19 22:42:10 +0000772
Devang Patel07bb9ee2011-08-15 23:47:24 +0000773 bool HasDebugInfo = false;
774 // Scan all the compile-units to see if there are any marked as the main
775 // unit. If not, we do not generate debug info.
776 for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
777 E = DbgFinder.compile_unit_end(); I != E; ++I) {
778 if (DICompileUnit(*I).isMain()) {
779 HasDebugInfo = true;
780 break;
781 }
782 }
783 if (!HasDebugInfo) return false;
Eric Christopher6a841382012-11-19 22:42:10 +0000784
Devang Patel07bb9ee2011-08-15 23:47:24 +0000785 // Create all the compile unit DIEs.
786 for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
787 E = DbgFinder.compile_unit_end(); I != E; ++I)
788 constructCompileUnit(*I);
Eric Christopher6a841382012-11-19 22:42:10 +0000789
Devang Patel07bb9ee2011-08-15 23:47:24 +0000790 // Create DIEs for each global variable.
791 for (DebugInfoFinder::iterator I = DbgFinder.global_variable_begin(),
792 E = DbgFinder.global_variable_end(); I != E; ++I) {
793 const MDNode *N = *I;
Devang Pateleb1bb4e2011-08-16 22:09:43 +0000794 if (CompileUnit *CU = CUMap.lookup(DIGlobalVariable(N).getCompileUnit()))
Devang Patel0ecbcbd2011-08-18 23:17:55 +0000795 CU->createGlobalVariableDIE(N);
Devang Patel07bb9ee2011-08-15 23:47:24 +0000796 }
Eric Christopher6a841382012-11-19 22:42:10 +0000797
Devang Patel07bb9ee2011-08-15 23:47:24 +0000798 // Create DIEs for each subprogram.
799 for (DebugInfoFinder::iterator I = DbgFinder.subprogram_begin(),
800 E = DbgFinder.subprogram_end(); I != E; ++I) {
801 const MDNode *N = *I;
Devang Pateleb1bb4e2011-08-16 22:09:43 +0000802 if (CompileUnit *CU = CUMap.lookup(DISubprogram(N).getCompileUnit()))
803 constructSubprogramDIE(CU, N);
Devang Patel07bb9ee2011-08-15 23:47:24 +0000804 }
805
806 return HasDebugInfo;
807}
808
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000809// Emit all Dwarf sections that should come prior to the content. Create
810// global DIEs and emit initial debug info sections. This is invoked by
811// the target AsmPrinter.
Eric Christopher58f41952012-11-19 22:42:15 +0000812void DwarfDebug::beginModule() {
Devang Patel6c74a872010-04-27 19:46:33 +0000813 if (DisableDebugInfoPrinting)
814 return;
815
Eric Christopher58f41952012-11-19 22:42:15 +0000816 const Module *M = MMI->getModule();
817
Nick Lewycky019d2552011-07-29 03:49:23 +0000818 // If module has named metadata anchors then use them, otherwise scan the
819 // module using debug info finder to collect debug info.
Devang Patele02e5852011-05-03 16:45:22 +0000820 NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu");
821 if (CU_Nodes) {
Devang Pateleb1bb4e2011-08-16 22:09:43 +0000822 for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i) {
823 DICompileUnit CUNode(CU_Nodes->getOperand(i));
824 CompileUnit *CU = constructCompileUnit(CUNode);
825 DIArray GVs = CUNode.getGlobalVariables();
826 for (unsigned i = 0, e = GVs.getNumElements(); i != e; ++i)
Devang Patel0ecbcbd2011-08-18 23:17:55 +0000827 CU->createGlobalVariableDIE(GVs.getElement(i));
Devang Pateleb1bb4e2011-08-16 22:09:43 +0000828 DIArray SPs = CUNode.getSubprograms();
829 for (unsigned i = 0, e = SPs.getNumElements(); i != e; ++i)
830 constructSubprogramDIE(CU, SPs.getElement(i));
831 DIArray EnumTypes = CUNode.getEnumTypes();
832 for (unsigned i = 0, e = EnumTypes.getNumElements(); i != e; ++i)
833 CU->getOrCreateTypeDIE(EnumTypes.getElement(i));
834 DIArray RetainedTypes = CUNode.getRetainedTypes();
835 for (unsigned i = 0, e = RetainedTypes.getNumElements(); i != e; ++i)
836 CU->getOrCreateTypeDIE(RetainedTypes.getElement(i));
837 }
Devang Patel07bb9ee2011-08-15 23:47:24 +0000838 } else if (!collectLegacyDebugInfo(M))
839 return;
Devang Patele02e5852011-05-03 16:45:22 +0000840
Devang Patel07bb9ee2011-08-15 23:47:24 +0000841 collectInfoFromNamedMDNodes(M);
Eric Christopher6a841382012-11-19 22:42:10 +0000842
Chris Lattner7cfa70e2010-04-05 02:19:28 +0000843 // Tell MMI that we have debug info.
844 MMI->setDebugInfoAvailability(true);
Eric Christopher6a841382012-11-19 22:42:10 +0000845
Bill Wendling2b128d72009-05-20 23:19:06 +0000846 // Prime section data.
Chris Lattner5e693ed2009-07-28 03:13:23 +0000847 SectionMap.insert(Asm->getObjFileLowering().getTextSection());
Bill Wendling2b128d72009-05-20 23:19:06 +0000848}
849
Eric Christopher960ac372012-11-22 00:59:49 +0000850// Attach DW_AT_inline attribute with inlined subprogram DIEs.
851void DwarfDebug::computeInlinedDIEs() {
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000852 // Attach DW_AT_inline attribute with inlined subprogram DIEs.
853 for (SmallPtrSet<DIE *, 4>::iterator AI = InlinedSubprogramDIEs.begin(),
Eric Christopher735401c2012-11-27 00:13:51 +0000854 AE = InlinedSubprogramDIEs.end(); AI != AE; ++AI) {
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000855 DIE *ISP = *AI;
Devang Patelf20c4f72011-04-12 22:53:02 +0000856 FirstCU->addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000857 }
Rafael Espindolae7cc8bf2011-11-12 01:57:54 +0000858 for (DenseMap<const MDNode *, DIE *>::iterator AI = AbstractSPDies.begin(),
Eric Christopher735401c2012-11-27 00:13:51 +0000859 AE = AbstractSPDies.end(); AI != AE; ++AI) {
Rafael Espindolae7cc8bf2011-11-12 01:57:54 +0000860 DIE *ISP = AI->second;
861 if (InlinedSubprogramDIEs.count(ISP))
862 continue;
863 FirstCU->addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
864 }
Eric Christopher960ac372012-11-22 00:59:49 +0000865}
866
867// Collect info for variables that were optimized out.
868void DwarfDebug::collectDeadVariables() {
869 const Module *M = MMI->getModule();
870 DenseMap<const MDNode *, LexicalScope *> DeadFnScopeMap;
871
872 if (NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu")) {
873 for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i) {
874 DICompileUnit TheCU(CU_Nodes->getOperand(i));
875 DIArray Subprograms = TheCU.getSubprograms();
876 for (unsigned i = 0, e = Subprograms.getNumElements(); i != e; ++i) {
Eric Christopher735401c2012-11-27 00:13:51 +0000877 DISubprogram SP(Subprograms.getElement(i));
878 if (ProcessedSPNodes.count(SP) != 0) continue;
879 if (!SP.Verify()) continue;
880 if (!SP.isDefinition()) continue;
881 DIArray Variables = SP.getVariables();
882 if (Variables.getNumElements() == 0) continue;
Eric Christopher960ac372012-11-22 00:59:49 +0000883
Eric Christopher735401c2012-11-27 00:13:51 +0000884 LexicalScope *Scope =
885 new LexicalScope(NULL, DIDescriptor(SP), NULL, false);
886 DeadFnScopeMap[SP] = Scope;
Eric Christopher960ac372012-11-22 00:59:49 +0000887
Eric Christopher735401c2012-11-27 00:13:51 +0000888 // Construct subprogram DIE and add variables DIEs.
889 CompileUnit *SPCU = CUMap.lookup(TheCU);
890 assert(SPCU && "Unable to find Compile Unit!");
891 constructSubprogramDIE(SPCU, SP);
892 DIE *ScopeDIE = SPCU->getDIE(SP);
893 for (unsigned vi = 0, ve = Variables.getNumElements(); vi != ve; ++vi) {
894 DIVariable DV(Variables.getElement(vi));
895 if (!DV.Verify()) continue;
896 DbgVariable *NewVar = new DbgVariable(DV, NULL);
897 if (DIE *VariableDIE =
898 SPCU->constructVariableDIE(NewVar, Scope->isAbstractScope()))
899 ScopeDIE->addChild(VariableDIE);
900 }
Eric Christopher960ac372012-11-22 00:59:49 +0000901 }
902 }
903 }
904 DeleteContainerSeconds(DeadFnScopeMap);
905}
906
907void DwarfDebug::finalizeModuleInfo() {
908 // Collect info for variables that were optimized out.
909 collectDeadVariables();
910
911 // Attach DW_AT_inline attribute with inlined subprogram DIEs.
912 computeInlinedDIEs();
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000913
Eric Christopherb1b94512012-08-01 18:19:01 +0000914 // Emit DW_AT_containing_type attribute to connect types with their
915 // vtable holding type.
Devang Patel89543712011-08-15 17:24:54 +0000916 for (DenseMap<const MDNode *, CompileUnit *>::iterator CUI = CUMap.begin(),
Eric Christopher735401c2012-11-27 00:13:51 +0000917 CUE = CUMap.end(); CUI != CUE; ++CUI) {
Devang Patel89543712011-08-15 17:24:54 +0000918 CompileUnit *TheCU = CUI->second;
919 TheCU->constructContainingTypeDIEs();
Devang Pateleb57c592009-12-03 19:11:07 +0000920 }
921
Eric Christopher960ac372012-11-22 00:59:49 +0000922 // Compute DIE offsets and sizes.
Eric Christopherc8a310e2012-12-10 23:34:43 +0000923 InfoHolder.computeSizeAndOffsets();
924 if (useSplitDwarf())
925 SkeletonHolder.computeSizeAndOffsets();
Eric Christopher960ac372012-11-22 00:59:49 +0000926}
927
928void DwarfDebug::endSections() {
Bill Wendling2b128d72009-05-20 23:19:06 +0000929 // Standard sections final addresses.
Chris Lattner4b7dadb2009-08-19 05:49:37 +0000930 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getTextSection());
Chris Lattnera179b522010-04-04 19:25:43 +0000931 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("text_end"));
Chris Lattner4b7dadb2009-08-19 05:49:37 +0000932 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getDataSection());
Chris Lattnera179b522010-04-04 19:25:43 +0000933 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("data_end"));
Bill Wendling2b128d72009-05-20 23:19:06 +0000934
935 // End text sections.
Benjamin Kramer15591272012-10-31 13:45:49 +0000936 for (unsigned I = 0, E = SectionMap.size(); I != E; ++I) {
937 Asm->OutStreamer.SwitchSection(SectionMap[I]);
938 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("section_end", I+1));
Bill Wendling2b128d72009-05-20 23:19:06 +0000939 }
Eric Christopher960ac372012-11-22 00:59:49 +0000940}
Bill Wendling2b128d72009-05-20 23:19:06 +0000941
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000942// Emit all Dwarf sections that should come after the content.
Eric Christopher960ac372012-11-22 00:59:49 +0000943void DwarfDebug::endModule() {
944
945 if (!FirstCU) return;
946
947 // End any existing sections.
948 // TODO: Does this need to happen?
949 endSections();
950
951 // Finalize the debug info for the module.
952 finalizeModuleInfo();
Bill Wendling2b128d72009-05-20 23:19:06 +0000953
Eric Christophercebb0ec2012-11-19 19:43:59 +0000954 // Emit initial sections.
Eric Christopher7b30f2e42012-11-21 00:34:35 +0000955 emitSectionLabels();
Eric Christophercebb0ec2012-11-19 19:43:59 +0000956
Eric Christophercdf218d2012-12-10 19:51:21 +0000957 if (!useSplitDwarf()) {
Eric Christopher95198f502012-11-27 22:43:42 +0000958 // Emit all the DIEs into a debug info section.
959 emitDebugInfo();
Eric Christopher4c9b1192012-11-27 00:41:54 +0000960
Eric Christopher95198f502012-11-27 22:43:42 +0000961 // Corresponding abbreviations into a abbrev section.
962 emitAbbreviations();
963
964 // Emit info into a debug loc section.
965 emitDebugLoc();
966
967 // Emit info into a debug aranges section.
968 emitDebugARanges();
969
970 // Emit info into a debug ranges section.
971 emitDebugRanges();
972
973 // Emit info into a debug macinfo section.
974 emitDebugMacInfo();
975
976 // Emit inline info.
977 // TODO: When we don't need the option anymore we
978 // can remove all of the code that this section
979 // depends upon.
980 if (useDarwinGDBCompat())
981 emitDebugInlineInfo();
982 } else {
Eric Christopherd692c1d2012-12-11 19:42:09 +0000983 // TODO: Fill this in for separated debug sections and separate
Eric Christopher95198f502012-11-27 22:43:42 +0000984 // out information into new sections.
985
Eric Christopher9c2ecd92012-11-30 23:59:06 +0000986 // Emit the debug info section and compile units.
Eric Christopher95198f502012-11-27 22:43:42 +0000987 emitDebugInfo();
Eric Christopher9c2ecd92012-11-30 23:59:06 +0000988 emitDebugInfoDWO();
Eric Christopher95198f502012-11-27 22:43:42 +0000989
990 // Corresponding abbreviations into a abbrev section.
991 emitAbbreviations();
Eric Christopher3c5a1912012-12-19 22:02:53 +0000992 emitDebugAbbrevDWO();
Eric Christopher95198f502012-11-27 22:43:42 +0000993
994 // Emit info into a debug loc section.
995 emitDebugLoc();
996
997 // Emit info into a debug aranges section.
998 emitDebugARanges();
999
1000 // Emit info into a debug ranges section.
1001 emitDebugRanges();
1002
1003 // Emit info into a debug macinfo section.
1004 emitDebugMacInfo();
1005
Eric Christopher962c9082013-01-15 23:56:56 +00001006 // Emit DWO addresses.
1007 InfoHolder.emitAddresses(Asm->getObjFileLowering().getDwarfAddrSection());
1008
Eric Christopher95198f502012-11-27 22:43:42 +00001009 // Emit inline info.
1010 // TODO: When we don't need the option anymore we
1011 // can remove all of the code that this section
1012 // depends upon.
1013 if (useDarwinGDBCompat())
1014 emitDebugInlineInfo();
1015 }
Bill Wendling2b128d72009-05-20 23:19:06 +00001016
Eric Christophera876b822012-08-23 07:32:06 +00001017 // Emit info into the dwarf accelerator table sections.
Eric Christopher20b76a72012-08-23 22:36:40 +00001018 if (useDwarfAccelTables()) {
Eric Christopher4996c702011-11-07 09:24:32 +00001019 emitAccelNames();
1020 emitAccelObjC();
1021 emitAccelNamespaces();
1022 emitAccelTypes();
1023 }
Eric Christopher6a841382012-11-19 22:42:10 +00001024
Devang Patel04d2f2d2009-11-24 01:14:22 +00001025 // Emit info into a debug pubtypes section.
Eric Christopher77826182012-08-23 07:10:56 +00001026 // TODO: When we don't need the option anymore we can
1027 // remove all of the code that adds to the table.
Eric Christopher20b76a72012-08-23 22:36:40 +00001028 if (useDarwinGDBCompat())
Eric Christopher77826182012-08-23 07:10:56 +00001029 emitDebugPubTypes();
Devang Patel04d2f2d2009-11-24 01:14:22 +00001030
Eric Christopher95198f502012-11-27 22:43:42 +00001031 // Finally emit string information into a string table.
Eric Christopher6e20a162012-11-27 06:49:23 +00001032 emitDebugStr();
Eric Christopher3bf29fd2012-12-27 02:14:01 +00001033 if (useSplitDwarf())
1034 emitDebugStrDWO();
Eric Christopher6e20a162012-11-27 06:49:23 +00001035
Devang Pateld0701282010-08-02 17:32:15 +00001036 // clean up.
Devang Pateleb1bb4e2011-08-16 22:09:43 +00001037 SPMap.clear();
Devang Patel1a0df9a2010-05-10 22:49:55 +00001038 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
1039 E = CUMap.end(); I != E; ++I)
1040 delete I->second;
Eric Christopher8afd7b62012-12-10 19:51:18 +00001041
Eric Christopher5b33b3c2013-02-06 21:53:56 +00001042 for (SmallVector<CompileUnit *, 1>::iterator I = SkeletonCUs.begin(),
1043 E = SkeletonCUs.end(); I != E; ++I)
1044 delete *I;
Eric Christopher8afd7b62012-12-10 19:51:18 +00001045
Eric Christopher9c2ecd92012-11-30 23:59:06 +00001046 // Reset these for the next Module if we have one.
1047 FirstCU = NULL;
Bill Wendling2b128d72009-05-20 23:19:06 +00001048}
1049
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001050// Find abstract variable, if any, associated with Var.
Devang Patelbb23a4a2011-08-10 21:50:54 +00001051DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &DV,
Chris Lattner915c5f92010-04-02 19:42:39 +00001052 DebugLoc ScopeLoc) {
Devang Patelbb23a4a2011-08-10 21:50:54 +00001053 LLVMContext &Ctx = DV->getContext();
1054 // More then one inlined variable corresponds to one abstract variable.
1055 DIVariable Var = cleanseInlinedVariable(DV, Ctx);
Devang Patelcfa8e9d2010-05-07 18:11:54 +00001056 DbgVariable *AbsDbgVariable = AbstractVariables.lookup(Var);
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001057 if (AbsDbgVariable)
1058 return AbsDbgVariable;
1059
Devang Patel7e623022011-08-10 20:55:27 +00001060 LexicalScope *Scope = LScopes.findAbstractScope(ScopeLoc.getScope(Ctx));
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001061 if (!Scope)
1062 return NULL;
1063
Devang Patel99819b52011-08-15 19:01:20 +00001064 AbsDbgVariable = new DbgVariable(Var, NULL);
Devang Patel7e623022011-08-10 20:55:27 +00001065 addScopeVariable(Scope, AbsDbgVariable);
Devang Patelcfa8e9d2010-05-07 18:11:54 +00001066 AbstractVariables[Var] = AbsDbgVariable;
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001067 return AbsDbgVariable;
1068}
1069
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001070// If Var is a current function argument then add it to CurrentFnArguments list.
Devang Patel6c622ef2011-03-01 22:58:55 +00001071bool DwarfDebug::addCurrentFnArgument(const MachineFunction *MF,
Devang Patel7e623022011-08-10 20:55:27 +00001072 DbgVariable *Var, LexicalScope *Scope) {
1073 if (!LScopes.isCurrentFunctionScope(Scope))
Devang Patel6c622ef2011-03-01 22:58:55 +00001074 return false;
1075 DIVariable DV = Var->getVariable();
1076 if (DV.getTag() != dwarf::DW_TAG_arg_variable)
1077 return false;
1078 unsigned ArgNo = DV.getArgNumber();
Eric Christopher6a841382012-11-19 22:42:10 +00001079 if (ArgNo == 0)
Devang Patel6c622ef2011-03-01 22:58:55 +00001080 return false;
1081
Devang Patel4ab660b2011-03-03 20:02:02 +00001082 size_t Size = CurrentFnArguments.size();
1083 if (Size == 0)
Devang Patel6c622ef2011-03-01 22:58:55 +00001084 CurrentFnArguments.resize(MF->getFunction()->arg_size());
Devang Patel63b3e762011-03-03 21:49:41 +00001085 // llvm::Function argument size is not good indicator of how many
Devang Patel34a7ab42011-03-03 20:08:10 +00001086 // arguments does the function have at source level.
1087 if (ArgNo > Size)
Devang Patel4ab660b2011-03-03 20:02:02 +00001088 CurrentFnArguments.resize(ArgNo * 2);
Devang Patel6c622ef2011-03-01 22:58:55 +00001089 CurrentFnArguments[ArgNo - 1] = Var;
1090 return true;
1091}
1092
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001093// Collect variable information from side table maintained by MMI.
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001094void
Nick Lewycky019d2552011-07-29 03:49:23 +00001095DwarfDebug::collectVariableInfoFromMMITable(const MachineFunction *MF,
Devang Patel490c8ab2010-05-20 19:57:06 +00001096 SmallPtrSet<const MDNode *, 16> &Processed) {
Devang Patel475d32a2009-10-06 01:26:37 +00001097 MachineModuleInfo::VariableDbgInfoMapTy &VMap = MMI->getVariableDbgInfo();
1098 for (MachineModuleInfo::VariableDbgInfoMapTy::iterator VI = VMap.begin(),
1099 VE = VMap.end(); VI != VE; ++VI) {
Devang Patel32cc43c2010-05-07 20:54:48 +00001100 const MDNode *Var = VI->first;
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001101 if (!Var) continue;
Devang Patele0a94bf2010-05-14 21:01:35 +00001102 Processed.insert(Var);
Chris Lattner915c5f92010-04-02 19:42:39 +00001103 DIVariable DV(Var);
1104 const std::pair<unsigned, DebugLoc> &VP = VI->second;
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001105
Devang Patel7e623022011-08-10 20:55:27 +00001106 LexicalScope *Scope = LScopes.findLexicalScope(VP.second);
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001107
Devang Patelcdb7d442009-11-10 23:20:04 +00001108 // If variable scope is not found then skip this variable.
Chris Lattner915c5f92010-04-02 19:42:39 +00001109 if (Scope == 0)
Devang Patelcdb7d442009-11-10 23:20:04 +00001110 continue;
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001111
Devang Patele1c53f22010-05-20 16:36:41 +00001112 DbgVariable *AbsDbgVariable = findAbstractVariable(DV, VP.second);
Devang Patel99819b52011-08-15 19:01:20 +00001113 DbgVariable *RegVar = new DbgVariable(DV, AbsDbgVariable);
Devang Patel3e4a9652011-08-15 21:24:36 +00001114 RegVar->setFrameIndex(VP.first);
Devang Patel6c622ef2011-03-01 22:58:55 +00001115 if (!addCurrentFnArgument(MF, RegVar, Scope))
Devang Patel7e623022011-08-10 20:55:27 +00001116 addScopeVariable(Scope, RegVar);
Devang Patel99819b52011-08-15 19:01:20 +00001117 if (AbsDbgVariable)
Devang Patel3e4a9652011-08-15 21:24:36 +00001118 AbsDbgVariable->setFrameIndex(VP.first);
Devang Patel475d32a2009-10-06 01:26:37 +00001119 }
Devang Patel490c8ab2010-05-20 19:57:06 +00001120}
Devang Patela3e9c9c2010-03-15 18:33:46 +00001121
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001122// Return true if debug value, encoded by DBG_VALUE instruction, is in a
1123// defined reg.
Devang Patel9fc11702010-05-25 23:40:22 +00001124static bool isDbgValueInDefinedReg(const MachineInstr *MI) {
Nick Lewycky654f5ce2011-10-26 22:55:33 +00001125 assert(MI->isDebugValue() && "Invalid DBG_VALUE machine instruction!");
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001126 return MI->getNumOperands() == 3 &&
1127 MI->getOperand(0).isReg() && MI->getOperand(0).getReg() &&
1128 MI->getOperand(1).isImm() && MI->getOperand(1).getImm() == 0;
Devang Patel9fc11702010-05-25 23:40:22 +00001129}
1130
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001131// Get .debug_loc entry for the instruction range starting at MI.
Eric Christopher6a841382012-11-19 22:42:10 +00001132static DotDebugLocEntry getDebugLocEntry(AsmPrinter *Asm,
1133 const MCSymbol *FLabel,
Devang Patel2442a892011-07-08 17:09:57 +00001134 const MCSymbol *SLabel,
1135 const MachineInstr *MI) {
1136 const MDNode *Var = MI->getOperand(MI->getNumOperands() - 1).getMetadata();
1137
1138 if (MI->getNumOperands() != 3) {
1139 MachineLocation MLoc = Asm->getDebugValueLocation(MI);
1140 return DotDebugLocEntry(FLabel, SLabel, MLoc, Var);
1141 }
1142 if (MI->getOperand(0).isReg() && MI->getOperand(1).isImm()) {
1143 MachineLocation MLoc;
1144 MLoc.set(MI->getOperand(0).getReg(), MI->getOperand(1).getImm());
1145 return DotDebugLocEntry(FLabel, SLabel, MLoc, Var);
1146 }
1147 if (MI->getOperand(0).isImm())
1148 return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getImm());
1149 if (MI->getOperand(0).isFPImm())
1150 return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getFPImm());
1151 if (MI->getOperand(0).isCImm())
1152 return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getCImm());
1153
Craig Topperee4dab52012-02-05 08:31:47 +00001154 llvm_unreachable("Unexpected 3 operand DBG_VALUE instruction!");
Devang Patel2442a892011-07-08 17:09:57 +00001155}
1156
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001157// Find variables for each lexical scope.
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001158void
Devang Patel5c0f85c2010-06-25 22:07:34 +00001159DwarfDebug::collectVariableInfo(const MachineFunction *MF,
1160 SmallPtrSet<const MDNode *, 16> &Processed) {
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001161
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001162 // collection info from MMI table.
Devang Patel490c8ab2010-05-20 19:57:06 +00001163 collectVariableInfoFromMMITable(MF, Processed);
1164
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001165 for (SmallVectorImpl<const MDNode*>::const_iterator
1166 UVI = UserVariables.begin(), UVE = UserVariables.end(); UVI != UVE;
1167 ++UVI) {
1168 const MDNode *Var = *UVI;
1169 if (Processed.count(Var))
Devang Patel490c8ab2010-05-20 19:57:06 +00001170 continue;
1171
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001172 // History contains relevant DBG_VALUE instructions for Var and instructions
1173 // clobbering it.
1174 SmallVectorImpl<const MachineInstr*> &History = DbgValues[Var];
1175 if (History.empty())
1176 continue;
1177 const MachineInstr *MInsn = History.front();
Devang Patel9fc11702010-05-25 23:40:22 +00001178
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001179 DIVariable DV(Var);
Devang Patel7e623022011-08-10 20:55:27 +00001180 LexicalScope *Scope = NULL;
Devang Patel7a9dedf2010-05-27 20:25:04 +00001181 if (DV.getTag() == dwarf::DW_TAG_arg_variable &&
1182 DISubprogram(DV.getContext()).describes(MF->getFunction()))
Devang Patel7e623022011-08-10 20:55:27 +00001183 Scope = LScopes.getCurrentFunctionScope();
Devang Patel8fb9fd62011-07-20 22:18:50 +00001184 else {
1185 if (DV.getVersion() <= LLVMDebugVersion9)
Devang Patel7e623022011-08-10 20:55:27 +00001186 Scope = LScopes.findLexicalScope(MInsn->getDebugLoc());
Devang Patel8fb9fd62011-07-20 22:18:50 +00001187 else {
1188 if (MDNode *IA = DV.getInlinedAt())
Devang Patel7e623022011-08-10 20:55:27 +00001189 Scope = LScopes.findInlinedScope(DebugLoc::getFromDILocation(IA));
Devang Patel8fb9fd62011-07-20 22:18:50 +00001190 else
Devang Patel7e623022011-08-10 20:55:27 +00001191 Scope = LScopes.findLexicalScope(cast<MDNode>(DV->getOperand(1)));
Devang Patel8fb9fd62011-07-20 22:18:50 +00001192 }
1193 }
Devang Patel490c8ab2010-05-20 19:57:06 +00001194 // If variable scope is not found then skip this variable.
Devang Patelfbd6c452010-05-21 00:10:20 +00001195 if (!Scope)
Devang Patel490c8ab2010-05-20 19:57:06 +00001196 continue;
1197
1198 Processed.insert(DV);
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001199 assert(MInsn->isDebugValue() && "History must begin with debug value");
Devang Patel99819b52011-08-15 19:01:20 +00001200 DbgVariable *AbsVar = findAbstractVariable(DV, MInsn->getDebugLoc());
1201 DbgVariable *RegVar = new DbgVariable(DV, AbsVar);
Devang Patel6c622ef2011-03-01 22:58:55 +00001202 if (!addCurrentFnArgument(MF, RegVar, Scope))
Devang Patel7e623022011-08-10 20:55:27 +00001203 addScopeVariable(Scope, RegVar);
Devang Patel99819b52011-08-15 19:01:20 +00001204 if (AbsVar)
Devang Patel3e4a9652011-08-15 21:24:36 +00001205 AbsVar->setMInsn(MInsn);
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001206
Eric Christophercc10d202012-10-08 20:48:54 +00001207 // Simplify ranges that are fully coalesced.
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001208 if (History.size() <= 1 || (History.size() == 2 &&
1209 MInsn->isIdenticalTo(History.back()))) {
Devang Patel3e4a9652011-08-15 21:24:36 +00001210 RegVar->setMInsn(MInsn);
Devang Patel9fc11702010-05-25 23:40:22 +00001211 continue;
1212 }
1213
Eric Christopher59cc0712013-01-28 17:33:26 +00001214 // Handle multiple DBG_VALUE instructions describing one variable.
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001215 RegVar->setDotDebugLocOffset(DotDebugLocEntries.size());
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001216
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001217 for (SmallVectorImpl<const MachineInstr*>::const_iterator
1218 HI = History.begin(), HE = History.end(); HI != HE; ++HI) {
1219 const MachineInstr *Begin = *HI;
1220 assert(Begin->isDebugValue() && "Invalid History entry");
Jakob Stoklund Olesen9c057ee2011-03-22 00:21:41 +00001221
Devang Patele7181b52011-06-01 23:00:17 +00001222 // Check if DBG_VALUE is truncating a range.
1223 if (Begin->getNumOperands() > 1 && Begin->getOperand(0).isReg()
1224 && !Begin->getOperand(0).getReg())
1225 continue;
1226
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001227 // Compute the range for a register location.
1228 const MCSymbol *FLabel = getLabelBeforeInsn(Begin);
1229 const MCSymbol *SLabel = 0;
1230
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001231 if (HI + 1 == HE)
1232 // If Begin is the last instruction in History then its value is valid
Chris Lattner0ab5e2c2011-04-15 05:18:47 +00001233 // until the end of the function.
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001234 SLabel = FunctionEndSym;
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001235 else {
1236 const MachineInstr *End = HI[1];
Eric Christopher6a841382012-11-19 22:42:10 +00001237 DEBUG(dbgs() << "DotDebugLoc Pair:\n"
Devang Patel53b050a2011-07-07 21:44:42 +00001238 << "\t" << *Begin << "\t" << *End << "\n");
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001239 if (End->isDebugValue())
1240 SLabel = getLabelBeforeInsn(End);
1241 else {
1242 // End is a normal instruction clobbering the range.
1243 SLabel = getLabelAfterInsn(End);
1244 assert(SLabel && "Forgot label after clobber instruction");
1245 ++HI;
1246 }
1247 }
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001248
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001249 // The value is valid until the next DBG_VALUE or clobber.
Eric Christopher365d0832011-12-16 23:42:31 +00001250 DotDebugLocEntries.push_back(getDebugLocEntry(Asm, FLabel, SLabel,
1251 Begin));
Devang Patel9fc11702010-05-25 23:40:22 +00001252 }
1253 DotDebugLocEntries.push_back(DotDebugLocEntry());
Devang Patela3e9c9c2010-03-15 18:33:46 +00001254 }
Devang Patele0a94bf2010-05-14 21:01:35 +00001255
1256 // Collect info for variables that were optimized out.
Devang Patel59e27c52011-08-19 23:28:12 +00001257 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
1258 DIArray Variables = DISubprogram(FnScope->getScopeNode()).getVariables();
1259 for (unsigned i = 0, e = Variables.getNumElements(); i != e; ++i) {
1260 DIVariable DV(Variables.getElement(i));
1261 if (!DV || !DV.Verify() || !Processed.insert(DV))
1262 continue;
1263 if (LexicalScope *Scope = LScopes.findLexicalScope(DV.getContext()))
1264 addScopeVariable(Scope, new DbgVariable(DV, NULL));
Devang Patele0a94bf2010-05-14 21:01:35 +00001265 }
Devang Patel9fc11702010-05-25 23:40:22 +00001266}
Devang Patele0a94bf2010-05-14 21:01:35 +00001267
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001268// Return Label preceding the instruction.
Eric Christopher962c9082013-01-15 23:56:56 +00001269MCSymbol *DwarfDebug::getLabelBeforeInsn(const MachineInstr *MI) {
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001270 MCSymbol *Label = LabelsBeforeInsn.lookup(MI);
1271 assert(Label && "Didn't insert label before instruction");
1272 return Label;
Devang Patel9fc11702010-05-25 23:40:22 +00001273}
1274
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001275// Return Label immediately following the instruction.
Eric Christopher962c9082013-01-15 23:56:56 +00001276MCSymbol *DwarfDebug::getLabelAfterInsn(const MachineInstr *MI) {
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001277 return LabelsAfterInsn.lookup(MI);
Devang Patel475d32a2009-10-06 01:26:37 +00001278}
1279
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001280// Process beginning of an instruction.
Devang Patelb5694e72010-10-26 17:49:02 +00001281void DwarfDebug::beginInstruction(const MachineInstr *MI) {
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001282 // Check if source location changes, but ignore DBG_VALUE locations.
1283 if (!MI->isDebugValue()) {
1284 DebugLoc DL = MI->getDebugLoc();
1285 if (DL != PrevInstLoc && (!DL.isUnknown() || UnknownLocations)) {
Eric Christopheraec8a822012-04-05 20:39:05 +00001286 unsigned Flags = 0;
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001287 PrevInstLoc = DL;
Devang Patel34a66202011-05-11 19:22:19 +00001288 if (DL == PrologEndLoc) {
1289 Flags |= DWARF2_FLAG_PROLOGUE_END;
1290 PrologEndLoc = DebugLoc();
1291 }
Eric Christopheraec8a822012-04-05 20:39:05 +00001292 if (PrologEndLoc.isUnknown())
1293 Flags |= DWARF2_FLAG_IS_STMT;
1294
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001295 if (!DL.isUnknown()) {
1296 const MDNode *Scope = DL.getScope(Asm->MF->getFunction()->getContext());
Devang Patel34a66202011-05-11 19:22:19 +00001297 recordSourceLine(DL.getLine(), DL.getCol(), Scope, Flags);
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001298 } else
Devang Patel34a66202011-05-11 19:22:19 +00001299 recordSourceLine(0, 0, 0, 0);
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001300 }
Devang Patel9fc11702010-05-25 23:40:22 +00001301 }
Devang Patel23b2ae62010-03-29 22:59:58 +00001302
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001303 // Insert labels where requested.
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001304 DenseMap<const MachineInstr*, MCSymbol*>::iterator I =
1305 LabelsBeforeInsn.find(MI);
1306
1307 // No label needed.
1308 if (I == LabelsBeforeInsn.end())
1309 return;
1310
1311 // Label already assigned.
1312 if (I->second)
Devang Patel002d54d2010-05-26 19:37:24 +00001313 return;
Devang Patelbd477be2010-03-29 17:20:31 +00001314
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001315 if (!PrevLabel) {
Devang Patelacc32a52010-05-26 21:23:46 +00001316 PrevLabel = MMI->getContext().CreateTempSymbol();
1317 Asm->OutStreamer.EmitLabel(PrevLabel);
Devang Patel002d54d2010-05-26 19:37:24 +00001318 }
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001319 I->second = PrevLabel;
Devang Patel8db360d2009-10-06 01:50:42 +00001320}
1321
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001322// Process end of an instruction.
Devang Patelb5694e72010-10-26 17:49:02 +00001323void DwarfDebug::endInstruction(const MachineInstr *MI) {
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001324 // Don't create a new label after DBG_VALUE instructions.
1325 // They don't generate code.
1326 if (!MI->isDebugValue())
1327 PrevLabel = 0;
1328
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001329 DenseMap<const MachineInstr*, MCSymbol*>::iterator I =
1330 LabelsAfterInsn.find(MI);
1331
1332 // No label needed.
1333 if (I == LabelsAfterInsn.end())
1334 return;
1335
1336 // Label already assigned.
1337 if (I->second)
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001338 return;
1339
1340 // We need a label after this instruction.
1341 if (!PrevLabel) {
1342 PrevLabel = MMI->getContext().CreateTempSymbol();
1343 Asm->OutStreamer.EmitLabel(PrevLabel);
Devang Patel3ebd8932010-04-08 16:50:29 +00001344 }
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001345 I->second = PrevLabel;
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001346}
1347
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001348// Each LexicalScope has first instruction and last instruction to mark
1349// beginning and end of a scope respectively. Create an inverse map that list
1350// scopes starts (and ends) with an instruction. One instruction may start (or
1351// end) multiple scopes. Ignore scopes that are not reachable.
Devang Patel359b0132010-04-08 18:43:56 +00001352void DwarfDebug::identifyScopeMarkers() {
Devang Patel7e623022011-08-10 20:55:27 +00001353 SmallVector<LexicalScope *, 4> WorkList;
1354 WorkList.push_back(LScopes.getCurrentFunctionScope());
Devang Patel7771b7c2010-01-20 02:05:23 +00001355 while (!WorkList.empty()) {
Devang Patel7e623022011-08-10 20:55:27 +00001356 LexicalScope *S = WorkList.pop_back_val();
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001357
Devang Patel7e623022011-08-10 20:55:27 +00001358 const SmallVector<LexicalScope *, 4> &Children = S->getChildren();
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001359 if (!Children.empty())
Devang Patel7e623022011-08-10 20:55:27 +00001360 for (SmallVector<LexicalScope *, 4>::const_iterator SI = Children.begin(),
Devang Patel7771b7c2010-01-20 02:05:23 +00001361 SE = Children.end(); SI != SE; ++SI)
1362 WorkList.push_back(*SI);
1363
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001364 if (S->isAbstractScope())
1365 continue;
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001366
Devang Patel7e623022011-08-10 20:55:27 +00001367 const SmallVector<InsnRange, 4> &Ranges = S->getRanges();
Devang Patel6c74a872010-04-27 19:46:33 +00001368 if (Ranges.empty())
1369 continue;
Devang Patel7e623022011-08-10 20:55:27 +00001370 for (SmallVector<InsnRange, 4>::const_iterator RI = Ranges.begin(),
Devang Patel6c74a872010-04-27 19:46:33 +00001371 RE = Ranges.end(); RI != RE; ++RI) {
Devang Patel7e623022011-08-10 20:55:27 +00001372 assert(RI->first && "InsnRange does not have first instruction!");
1373 assert(RI->second && "InsnRange does not have second instruction!");
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001374 requestLabelBeforeInsn(RI->first);
1375 requestLabelAfterInsn(RI->second);
Devang Patel6c74a872010-04-27 19:46:33 +00001376 }
Devang Patel75cc16c2009-10-01 20:31:14 +00001377 }
Devang Patel75cc16c2009-10-01 20:31:14 +00001378}
1379
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001380// Get MDNode for DebugLoc's scope.
Devang Patel589845d2011-05-09 22:14:49 +00001381static MDNode *getScopeNode(DebugLoc DL, const LLVMContext &Ctx) {
1382 if (MDNode *InlinedAt = DL.getInlinedAt(Ctx))
1383 return getScopeNode(DebugLoc::getFromDILocation(InlinedAt), Ctx);
1384 return DL.getScope(Ctx);
1385}
1386
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001387// Walk up the scope chain of given debug loc and find line number info
1388// for the function.
Devang Patel34a66202011-05-11 19:22:19 +00001389static DebugLoc getFnDebugLoc(DebugLoc DL, const LLVMContext &Ctx) {
1390 const MDNode *Scope = getScopeNode(DL, Ctx);
1391 DISubprogram SP = getDISubprogram(Scope);
Eric Christopher34164192012-04-03 00:43:49 +00001392 if (SP.Verify()) {
1393 // Check for number of operands since the compatibility is
1394 // cheap here.
Eric Christopherb81e2b42012-04-03 17:55:42 +00001395 if (SP->getNumOperands() > 19)
Eric Christopher34164192012-04-03 00:43:49 +00001396 return DebugLoc::get(SP.getScopeLineNumber(), 0, SP);
1397 else
1398 return DebugLoc::get(SP.getLineNumber(), 0, SP);
1399 }
1400
Devang Patel34a66202011-05-11 19:22:19 +00001401 return DebugLoc();
1402}
1403
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001404// Gather pre-function debug information. Assumes being called immediately
1405// after the function entry point has been emitted.
Chris Lattner76555b52010-01-26 23:18:02 +00001406void DwarfDebug::beginFunction(const MachineFunction *MF) {
Chris Lattner196dbdc2010-04-05 03:52:55 +00001407 if (!MMI->hasDebugInfo()) return;
Devang Patel7e623022011-08-10 20:55:27 +00001408 LScopes.initialize(*MF);
1409 if (LScopes.empty()) return;
1410 identifyScopeMarkers();
Devang Patel4598eb62009-10-06 18:37:31 +00001411
Manman Ren4e042a62013-02-05 21:52:47 +00001412 // Set DwarfCompileUnitID in MCContext to the Compile Unit this function
1413 // belongs to.
1414 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
1415 CompileUnit *TheCU = SPMap.lookup(FnScope->getScopeNode());
1416 assert(TheCU && "Unable to find compile unit!");
1417 Asm->OutStreamer.getContext().setDwarfCompileUnitID(TheCU->getUniqueID());
1418
Devang Patel6c74a872010-04-27 19:46:33 +00001419 FunctionBeginSym = Asm->GetTempSymbol("func_begin",
1420 Asm->getFunctionNumber());
Bill Wendling2b128d72009-05-20 23:19:06 +00001421 // Assumes in correct section after the entry point.
Devang Patel6c74a872010-04-27 19:46:33 +00001422 Asm->OutStreamer.EmitLabel(FunctionBeginSym);
Bill Wendling2b128d72009-05-20 23:19:06 +00001423
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001424 assert(UserVariables.empty() && DbgValues.empty() && "Maps weren't cleaned");
1425
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001426 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001427 // LiveUserVar - Map physreg numbers to the MDNode they contain.
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001428 std::vector<const MDNode*> LiveUserVar(TRI->getNumRegs());
1429
Devang Patel002d54d2010-05-26 19:37:24 +00001430 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001431 I != E; ++I) {
1432 bool AtBlockEntry = true;
Devang Patel002d54d2010-05-26 19:37:24 +00001433 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
1434 II != IE; ++II) {
1435 const MachineInstr *MI = II;
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001436
Devang Patel002d54d2010-05-26 19:37:24 +00001437 if (MI->isDebugValue()) {
Nick Lewycky654f5ce2011-10-26 22:55:33 +00001438 assert(MI->getNumOperands() > 1 && "Invalid machine instruction!");
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001439
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001440 // Keep track of user variables.
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001441 const MDNode *Var =
1442 MI->getOperand(MI->getNumOperands() - 1).getMetadata();
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001443
1444 // Variable is in a register, we need to check for clobbers.
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001445 if (isDbgValueInDefinedReg(MI))
1446 LiveUserVar[MI->getOperand(0).getReg()] = Var;
1447
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001448 // Check the history of this variable.
1449 SmallVectorImpl<const MachineInstr*> &History = DbgValues[Var];
1450 if (History.empty()) {
1451 UserVariables.push_back(Var);
1452 // The first mention of a function argument gets the FunctionBeginSym
1453 // label, so arguments are visible when breaking at function entry.
1454 DIVariable DV(Var);
1455 if (DV.Verify() && DV.getTag() == dwarf::DW_TAG_arg_variable &&
1456 DISubprogram(getDISubprogram(DV.getContext()))
1457 .describes(MF->getFunction()))
1458 LabelsBeforeInsn[MI] = FunctionBeginSym;
1459 } else {
1460 // We have seen this variable before. Try to coalesce DBG_VALUEs.
1461 const MachineInstr *Prev = History.back();
1462 if (Prev->isDebugValue()) {
1463 // Coalesce identical entries at the end of History.
1464 if (History.size() >= 2 &&
Devang Patelb7a328e2011-07-07 00:14:27 +00001465 Prev->isIdenticalTo(History[History.size() - 2])) {
Eric Christopher85a495e2012-10-08 20:48:49 +00001466 DEBUG(dbgs() << "Coalescing identical DBG_VALUE entries:\n"
Eric Christopher6a841382012-11-19 22:42:10 +00001467 << "\t" << *Prev
Devang Patelb7a328e2011-07-07 00:14:27 +00001468 << "\t" << *History[History.size() - 2] << "\n");
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001469 History.pop_back();
Devang Patelb7a328e2011-07-07 00:14:27 +00001470 }
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001471
1472 // Terminate old register assignments that don't reach MI;
1473 MachineFunction::const_iterator PrevMBB = Prev->getParent();
1474 if (PrevMBB != I && (!AtBlockEntry || llvm::next(PrevMBB) != I) &&
1475 isDbgValueInDefinedReg(Prev)) {
1476 // Previous register assignment needs to terminate at the end of
1477 // its basic block.
1478 MachineBasicBlock::const_iterator LastMI =
1479 PrevMBB->getLastNonDebugInstr();
Devang Patelb7a328e2011-07-07 00:14:27 +00001480 if (LastMI == PrevMBB->end()) {
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001481 // Drop DBG_VALUE for empty range.
Eric Christopher85a495e2012-10-08 20:48:49 +00001482 DEBUG(dbgs() << "Dropping DBG_VALUE for empty range:\n"
Devang Patelb7a328e2011-07-07 00:14:27 +00001483 << "\t" << *Prev << "\n");
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001484 History.pop_back();
Devang Patelb7a328e2011-07-07 00:14:27 +00001485 }
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001486 else {
1487 // Terminate after LastMI.
1488 History.push_back(LastMI);
1489 }
1490 }
1491 }
1492 }
1493 History.push_back(MI);
Devang Patel002d54d2010-05-26 19:37:24 +00001494 } else {
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001495 // Not a DBG_VALUE instruction.
1496 if (!MI->isLabel())
1497 AtBlockEntry = false;
1498
Eric Christopher133195782012-10-04 20:46:14 +00001499 // First known non-DBG_VALUE and non-frame setup location marks
1500 // the beginning of the function body.
1501 if (!MI->getFlag(MachineInstr::FrameSetup) &&
1502 (PrologEndLoc.isUnknown() && !MI->getDebugLoc().isUnknown()))
Devang Patel34a66202011-05-11 19:22:19 +00001503 PrologEndLoc = MI->getDebugLoc();
1504
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001505 // Check if the instruction clobbers any registers with debug vars.
1506 for (MachineInstr::const_mop_iterator MOI = MI->operands_begin(),
1507 MOE = MI->operands_end(); MOI != MOE; ++MOI) {
1508 if (!MOI->isReg() || !MOI->isDef() || !MOI->getReg())
1509 continue;
Jakob Stoklund Olesen54038d72012-06-01 23:28:30 +00001510 for (MCRegAliasIterator AI(MOI->getReg(), TRI, true);
1511 AI.isValid(); ++AI) {
1512 unsigned Reg = *AI;
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001513 const MDNode *Var = LiveUserVar[Reg];
1514 if (!Var)
1515 continue;
1516 // Reg is now clobbered.
1517 LiveUserVar[Reg] = 0;
1518
1519 // Was MD last defined by a DBG_VALUE referring to Reg?
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001520 DbgValueHistoryMap::iterator HistI = DbgValues.find(Var);
1521 if (HistI == DbgValues.end())
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001522 continue;
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001523 SmallVectorImpl<const MachineInstr*> &History = HistI->second;
1524 if (History.empty())
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001525 continue;
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001526 const MachineInstr *Prev = History.back();
1527 // Sanity-check: Register assignments are terminated at the end of
1528 // their block.
1529 if (!Prev->isDebugValue() || Prev->getParent() != MI->getParent())
1530 continue;
1531 // Is the variable still in Reg?
1532 if (!isDbgValueInDefinedReg(Prev) ||
1533 Prev->getOperand(0).getReg() != Reg)
1534 continue;
1535 // Var is clobbered. Make sure the next instruction gets a label.
1536 History.push_back(MI);
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001537 }
1538 }
Devang Patel002d54d2010-05-26 19:37:24 +00001539 }
Devang Patel002d54d2010-05-26 19:37:24 +00001540 }
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001541 }
1542
1543 for (DbgValueHistoryMap::iterator I = DbgValues.begin(), E = DbgValues.end();
1544 I != E; ++I) {
1545 SmallVectorImpl<const MachineInstr*> &History = I->second;
1546 if (History.empty())
1547 continue;
1548
1549 // Make sure the final register assignments are terminated.
1550 const MachineInstr *Prev = History.back();
1551 if (Prev->isDebugValue() && isDbgValueInDefinedReg(Prev)) {
1552 const MachineBasicBlock *PrevMBB = Prev->getParent();
Eric Christopher6a841382012-11-19 22:42:10 +00001553 MachineBasicBlock::const_iterator LastMI =
Devang Patel784077e2011-08-10 23:58:09 +00001554 PrevMBB->getLastNonDebugInstr();
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001555 if (LastMI == PrevMBB->end())
1556 // Drop DBG_VALUE for empty range.
1557 History.pop_back();
1558 else {
1559 // Terminate after LastMI.
1560 History.push_back(LastMI);
1561 }
1562 }
1563 // Request labels for the full history.
1564 for (unsigned i = 0, e = History.size(); i != e; ++i) {
1565 const MachineInstr *MI = History[i];
1566 if (MI->isDebugValue())
1567 requestLabelBeforeInsn(MI);
1568 else
1569 requestLabelAfterInsn(MI);
1570 }
1571 }
Devang Patel002d54d2010-05-26 19:37:24 +00001572
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001573 PrevInstLoc = DebugLoc();
Devang Patel002d54d2010-05-26 19:37:24 +00001574 PrevLabel = FunctionBeginSym;
Devang Patel34a66202011-05-11 19:22:19 +00001575
1576 // Record beginning of function.
1577 if (!PrologEndLoc.isUnknown()) {
1578 DebugLoc FnStartDL = getFnDebugLoc(PrologEndLoc,
1579 MF->getFunction()->getContext());
1580 recordSourceLine(FnStartDL.getLine(), FnStartDL.getCol(),
1581 FnStartDL.getScope(MF->getFunction()->getContext()),
David Blaikie67cb31e2012-12-04 22:02:33 +00001582 // We'd like to list the prologue as "not statements" but GDB behaves
1583 // poorly if we do that. Revisit this with caution/GDB (7.5+) testing.
David Blaikie5a773bb2012-12-04 21:05:36 +00001584 DWARF2_FLAG_IS_STMT);
Devang Patel34a66202011-05-11 19:22:19 +00001585 }
Bill Wendling2b128d72009-05-20 23:19:06 +00001586}
1587
Devang Patel7e623022011-08-10 20:55:27 +00001588void DwarfDebug::addScopeVariable(LexicalScope *LS, DbgVariable *Var) {
1589// SmallVector<DbgVariable *, 8> &Vars = ScopeVariables.lookup(LS);
1590 ScopeVariables[LS].push_back(Var);
1591// Vars.push_back(Var);
1592}
1593
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001594// Gather and emit post-function debug information.
Chris Lattner76555b52010-01-26 23:18:02 +00001595void DwarfDebug::endFunction(const MachineFunction *MF) {
Devang Patel7e623022011-08-10 20:55:27 +00001596 if (!MMI->hasDebugInfo() || LScopes.empty()) return;
Devang Patel2904aa92009-11-12 19:02:56 +00001597
Devang Patel7e623022011-08-10 20:55:27 +00001598 // Define end label for subprogram.
1599 FunctionEndSym = Asm->GetTempSymbol("func_end",
1600 Asm->getFunctionNumber());
1601 // Assumes in correct section after the entry point.
1602 Asm->OutStreamer.EmitLabel(FunctionEndSym);
Manman Ren4e042a62013-02-05 21:52:47 +00001603 // Set DwarfCompileUnitID in MCContext to default value.
1604 Asm->OutStreamer.getContext().setDwarfCompileUnitID(0);
Eric Christopher6a841382012-11-19 22:42:10 +00001605
Devang Patel7e623022011-08-10 20:55:27 +00001606 SmallPtrSet<const MDNode *, 16> ProcessedVars;
1607 collectVariableInfo(MF, ProcessedVars);
Eric Christopher6a841382012-11-19 22:42:10 +00001608
Devang Patel3acc70e2011-08-15 22:04:40 +00001609 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
Devang Pateleb1bb4e2011-08-16 22:09:43 +00001610 CompileUnit *TheCU = SPMap.lookup(FnScope->getScopeNode());
Nick Lewycky654f5ce2011-10-26 22:55:33 +00001611 assert(TheCU && "Unable to find compile unit!");
Devang Patel3acc70e2011-08-15 22:04:40 +00001612
Devang Patel7e623022011-08-10 20:55:27 +00001613 // Construct abstract scopes.
Devang Patel44403472011-08-12 18:10:19 +00001614 ArrayRef<LexicalScope *> AList = LScopes.getAbstractScopesList();
1615 for (unsigned i = 0, e = AList.size(); i != e; ++i) {
1616 LexicalScope *AScope = AList[i];
1617 DISubprogram SP(AScope->getScopeNode());
Devang Patel7e623022011-08-10 20:55:27 +00001618 if (SP.Verify()) {
1619 // Collect info for variables that were optimized out.
Devang Patel59e27c52011-08-19 23:28:12 +00001620 DIArray Variables = SP.getVariables();
1621 for (unsigned i = 0, e = Variables.getNumElements(); i != e; ++i) {
1622 DIVariable DV(Variables.getElement(i));
1623 if (!DV || !DV.Verify() || !ProcessedVars.insert(DV))
1624 continue;
Alexey Samsonov39602782012-07-06 08:45:08 +00001625 // Check that DbgVariable for DV wasn't created earlier, when
1626 // findAbstractVariable() was called for inlined instance of DV.
1627 LLVMContext &Ctx = DV->getContext();
1628 DIVariable CleanDV = cleanseInlinedVariable(DV, Ctx);
1629 if (AbstractVariables.lookup(CleanDV))
1630 continue;
Devang Patel59e27c52011-08-19 23:28:12 +00001631 if (LexicalScope *Scope = LScopes.findAbstractScope(DV.getContext()))
1632 addScopeVariable(Scope, new DbgVariable(DV, NULL));
Devang Patel5c0f85c2010-06-25 22:07:34 +00001633 }
1634 }
Devang Patel44403472011-08-12 18:10:19 +00001635 if (ProcessedSPNodes.count(AScope->getScopeNode()) == 0)
Devang Patel3acc70e2011-08-15 22:04:40 +00001636 constructScopeDIE(TheCU, AScope);
Bill Wendling2b128d72009-05-20 23:19:06 +00001637 }
Eric Christopher6a841382012-11-19 22:42:10 +00001638
Devang Patel3acc70e2011-08-15 22:04:40 +00001639 DIE *CurFnDIE = constructScopeDIE(TheCU, FnScope);
Eric Christopher6a841382012-11-19 22:42:10 +00001640
Nick Lewycky50f02cb2011-12-02 22:16:29 +00001641 if (!MF->getTarget().Options.DisableFramePointerElim(*MF))
Eric Christopherbb69a272012-08-24 01:14:27 +00001642 TheCU->addFlag(CurFnDIE, dwarf::DW_AT_APPLE_omit_frame_ptr);
Devang Patel3acc70e2011-08-15 22:04:40 +00001643
Devang Patel7e623022011-08-10 20:55:27 +00001644 DebugFrames.push_back(FunctionDebugFrameInfo(Asm->getFunctionNumber(),
1645 MMI->getFrameMoves()));
Bill Wendling2b128d72009-05-20 23:19:06 +00001646
Bill Wendling2b128d72009-05-20 23:19:06 +00001647 // Clear debug info
Devang Patel7e623022011-08-10 20:55:27 +00001648 for (DenseMap<LexicalScope *, SmallVector<DbgVariable *, 8> >::iterator
1649 I = ScopeVariables.begin(), E = ScopeVariables.end(); I != E; ++I)
1650 DeleteContainerPointers(I->second);
1651 ScopeVariables.clear();
Devang Patelad45d912011-04-22 18:09:57 +00001652 DeleteContainerPointers(CurrentFnArguments);
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001653 UserVariables.clear();
1654 DbgValues.clear();
Jeffrey Yasskin35b4e4f2010-03-12 17:45:06 +00001655 AbstractVariables.clear();
Devang Patel6c74a872010-04-27 19:46:33 +00001656 LabelsBeforeInsn.clear();
1657 LabelsAfterInsn.clear();
Devang Patel12563b32010-04-16 23:33:45 +00001658 PrevLabel = NULL;
Bill Wendling2b128d72009-05-20 23:19:06 +00001659}
1660
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001661// Register a source line with debug info. Returns the unique label that was
1662// emitted and which provides correspondence to the source line list.
Devang Patel34a66202011-05-11 19:22:19 +00001663void DwarfDebug::recordSourceLine(unsigned Line, unsigned Col, const MDNode *S,
1664 unsigned Flags) {
Devang Patel2d9caf92009-11-25 17:36:49 +00001665 StringRef Fn;
Devang Patele01b75c2011-03-24 20:30:50 +00001666 StringRef Dir;
Dan Gohman50849c62010-05-05 23:41:32 +00001667 unsigned Src = 1;
1668 if (S) {
1669 DIDescriptor Scope(S);
Devang Patel2089d162009-10-05 18:03:19 +00001670
Dan Gohman50849c62010-05-05 23:41:32 +00001671 if (Scope.isCompileUnit()) {
1672 DICompileUnit CU(S);
Dan Gohman50849c62010-05-05 23:41:32 +00001673 Fn = CU.getFilename();
Devang Patele01b75c2011-03-24 20:30:50 +00001674 Dir = CU.getDirectory();
Devang Patelc4b69052010-10-28 17:30:52 +00001675 } else if (Scope.isFile()) {
1676 DIFile F(S);
Devang Patelc4b69052010-10-28 17:30:52 +00001677 Fn = F.getFilename();
Devang Patele01b75c2011-03-24 20:30:50 +00001678 Dir = F.getDirectory();
Dan Gohman50849c62010-05-05 23:41:32 +00001679 } else if (Scope.isSubprogram()) {
1680 DISubprogram SP(S);
Dan Gohman50849c62010-05-05 23:41:32 +00001681 Fn = SP.getFilename();
Devang Patele01b75c2011-03-24 20:30:50 +00001682 Dir = SP.getDirectory();
Eric Christopher6647b832011-10-11 22:59:11 +00001683 } else if (Scope.isLexicalBlockFile()) {
1684 DILexicalBlockFile DBF(S);
1685 Fn = DBF.getFilename();
1686 Dir = DBF.getDirectory();
Dan Gohman50849c62010-05-05 23:41:32 +00001687 } else if (Scope.isLexicalBlock()) {
1688 DILexicalBlock DB(S);
Dan Gohman50849c62010-05-05 23:41:32 +00001689 Fn = DB.getFilename();
Devang Patele01b75c2011-03-24 20:30:50 +00001690 Dir = DB.getDirectory();
Dan Gohman50849c62010-05-05 23:41:32 +00001691 } else
Craig Topperee4dab52012-02-05 08:31:47 +00001692 llvm_unreachable("Unexpected scope info");
Dan Gohman50849c62010-05-05 23:41:32 +00001693
Eric Christopher7b30f2e42012-11-21 00:34:35 +00001694 Src = getOrCreateSourceID(Fn, Dir);
Dan Gohman50849c62010-05-05 23:41:32 +00001695 }
Nick Lewycky019d2552011-07-29 03:49:23 +00001696 Asm->OutStreamer.EmitDwarfLocDirective(Src, Line, Col, Flags, 0, 0, Fn);
Bill Wendling2b128d72009-05-20 23:19:06 +00001697}
1698
Bill Wendling806535f2009-05-20 23:22:40 +00001699//===----------------------------------------------------------------------===//
1700// Emit Methods
1701//===----------------------------------------------------------------------===//
1702
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001703// Compute the size and offset of a DIE.
Jim Grosbach00e9c612009-11-22 19:20:36 +00001704unsigned
Eric Christopherc8a310e2012-12-10 23:34:43 +00001705DwarfUnits::computeSizeAndOffset(DIE *Die, unsigned Offset) {
Bill Wendling480ff322009-05-20 23:21:38 +00001706 // Get the children.
1707 const std::vector<DIE *> &Children = Die->getChildren();
1708
Bill Wendling480ff322009-05-20 23:21:38 +00001709 // Record the abbreviation.
Devang Patel930143b2009-11-21 02:48:08 +00001710 assignAbbrevNumber(Die->getAbbrev());
Bill Wendling480ff322009-05-20 23:21:38 +00001711
1712 // Get the abbreviation for this DIE.
1713 unsigned AbbrevNumber = Die->getAbbrevNumber();
Eric Christopherc8a310e2012-12-10 23:34:43 +00001714 const DIEAbbrev *Abbrev = Abbreviations->at(AbbrevNumber - 1);
Bill Wendling480ff322009-05-20 23:21:38 +00001715
1716 // Set DIE offset
1717 Die->setOffset(Offset);
1718
1719 // Start the size with the size of abbreviation code.
Chris Lattner7b26fce2009-08-22 20:48:53 +00001720 Offset += MCAsmInfo::getULEB128Size(AbbrevNumber);
Bill Wendling480ff322009-05-20 23:21:38 +00001721
1722 const SmallVector<DIEValue*, 32> &Values = Die->getValues();
1723 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
1724
1725 // Size the DIE attribute values.
1726 for (unsigned i = 0, N = Values.size(); i < N; ++i)
1727 // Size attribute value.
Chris Lattner5a00dea2010-04-05 00:18:22 +00001728 Offset += Values[i]->SizeOf(Asm, AbbrevData[i].getForm());
Bill Wendling480ff322009-05-20 23:21:38 +00001729
1730 // Size the DIE children if any.
1731 if (!Children.empty()) {
1732 assert(Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes &&
1733 "Children flag not set");
1734
1735 for (unsigned j = 0, M = Children.size(); j < M; ++j)
Eric Christopher1f0cbb82012-11-20 22:14:13 +00001736 Offset = computeSizeAndOffset(Children[j], Offset);
Bill Wendling480ff322009-05-20 23:21:38 +00001737
1738 // End of children marker.
1739 Offset += sizeof(int8_t);
1740 }
1741
1742 Die->setSize(Offset - Die->getOffset());
1743 return Offset;
1744}
1745
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001746// Compute the size and offset of all the DIEs.
Eric Christopherc8a310e2012-12-10 23:34:43 +00001747void DwarfUnits::computeSizeAndOffsets() {
1748 for (SmallVector<CompileUnit *, 1>::iterator I = CUs.begin(),
1749 E = CUs.end(); I != E; ++I) {
Eric Christopher9c2ecd92012-11-30 23:59:06 +00001750 unsigned Offset =
1751 sizeof(int32_t) + // Length of Compilation Unit Info
1752 sizeof(int16_t) + // DWARF version number
1753 sizeof(int32_t) + // Offset Into Abbrev. Section
1754 sizeof(int8_t); // Pointer Size (in bytes)
1755
Eric Christopherc8a310e2012-12-10 23:34:43 +00001756 computeSizeAndOffset((*I)->getCUDie(), Offset);
Devang Patel1a0df9a2010-05-10 22:49:55 +00001757 }
Bill Wendling480ff322009-05-20 23:21:38 +00001758}
1759
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001760// Emit initial Dwarf sections with a label at the start of each one.
Eric Christopher7b30f2e42012-11-21 00:34:35 +00001761void DwarfDebug::emitSectionLabels() {
Chris Lattner4b7dadb2009-08-19 05:49:37 +00001762 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
Daniel Dunbarc418d6b2009-09-19 20:40:05 +00001763
Bill Wendling480ff322009-05-20 23:21:38 +00001764 // Dwarf sections base addresses.
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001765 DwarfInfoSectionSym =
Eric Christopher7b30f2e42012-11-21 00:34:35 +00001766 emitSectionSym(Asm, TLOF.getDwarfInfoSection(), "section_info");
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001767 DwarfAbbrevSectionSym =
Eric Christopher7b30f2e42012-11-21 00:34:35 +00001768 emitSectionSym(Asm, TLOF.getDwarfAbbrevSection(), "section_abbrev");
Eric Christopher3c5a1912012-12-19 22:02:53 +00001769 if (useSplitDwarf())
1770 DwarfAbbrevDWOSectionSym =
1771 emitSectionSym(Asm, TLOF.getDwarfAbbrevDWOSection(),
1772 "section_abbrev_dwo");
Eric Christopher7b30f2e42012-11-21 00:34:35 +00001773 emitSectionSym(Asm, TLOF.getDwarfARangesSection());
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001774
Chris Lattner6629ca92010-04-04 22:59:04 +00001775 if (const MCSection *MacroInfo = TLOF.getDwarfMacroInfoSection())
Eric Christopher7b30f2e42012-11-21 00:34:35 +00001776 emitSectionSym(Asm, MacroInfo);
Bill Wendling480ff322009-05-20 23:21:38 +00001777
Eric Christopher7b30f2e42012-11-21 00:34:35 +00001778 emitSectionSym(Asm, TLOF.getDwarfLineSection(), "section_line");
1779 emitSectionSym(Asm, TLOF.getDwarfLocSection());
1780 emitSectionSym(Asm, TLOF.getDwarfPubTypesSection());
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001781 DwarfStrSectionSym =
Eric Christopher3bf29fd2012-12-27 02:14:01 +00001782 emitSectionSym(Asm, TLOF.getDwarfStrSection(), "info_string");
1783 if (useSplitDwarf())
1784 DwarfStrDWOSectionSym =
1785 emitSectionSym(Asm, TLOF.getDwarfStrDWOSection(), "skel_string");
Eric Christopher7b30f2e42012-11-21 00:34:35 +00001786 DwarfDebugRangeSectionSym = emitSectionSym(Asm, TLOF.getDwarfRangesSection(),
Devang Patel12563b32010-04-16 23:33:45 +00001787 "debug_range");
Bill Wendling480ff322009-05-20 23:21:38 +00001788
Eric Christopher7b30f2e42012-11-21 00:34:35 +00001789 DwarfDebugLocSectionSym = emitSectionSym(Asm, TLOF.getDwarfLocSection(),
Devang Patel9fc11702010-05-25 23:40:22 +00001790 "section_debug_loc");
1791
Eric Christopher7b30f2e42012-11-21 00:34:35 +00001792 TextSectionSym = emitSectionSym(Asm, TLOF.getTextSection(), "text_begin");
1793 emitSectionSym(Asm, TLOF.getDataSection());
Bill Wendling480ff322009-05-20 23:21:38 +00001794}
1795
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001796// Recursively emits a debug information entry.
Eric Christopher3c5a1912012-12-19 22:02:53 +00001797void DwarfDebug::emitDIE(DIE *Die, std::vector<DIEAbbrev *> *Abbrevs) {
Bill Wendling480ff322009-05-20 23:21:38 +00001798 // Get the abbreviation for this DIE.
1799 unsigned AbbrevNumber = Die->getAbbrevNumber();
Eric Christopher3c5a1912012-12-19 22:02:53 +00001800 const DIEAbbrev *Abbrev = Abbrevs->at(AbbrevNumber - 1);
Bill Wendling480ff322009-05-20 23:21:38 +00001801
Bill Wendling480ff322009-05-20 23:21:38 +00001802 // Emit the code (index) for the abbreviation.
Chris Lattner7bde8c02010-04-04 18:52:31 +00001803 if (Asm->isVerbose())
Chris Lattnerfa823552010-01-22 23:18:42 +00001804 Asm->OutStreamer.AddComment("Abbrev [" + Twine(AbbrevNumber) + "] 0x" +
1805 Twine::utohexstr(Die->getOffset()) + ":0x" +
1806 Twine::utohexstr(Die->getSize()) + " " +
1807 dwarf::TagString(Abbrev->getTag()));
Chris Lattner9efd1182010-04-04 19:09:29 +00001808 Asm->EmitULEB128(AbbrevNumber);
Bill Wendling480ff322009-05-20 23:21:38 +00001809
Jeffrey Yasskin54ebc982010-03-22 18:47:14 +00001810 const SmallVector<DIEValue*, 32> &Values = Die->getValues();
Bill Wendling480ff322009-05-20 23:21:38 +00001811 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
1812
1813 // Emit the DIE attribute values.
1814 for (unsigned i = 0, N = Values.size(); i < N; ++i) {
1815 unsigned Attr = AbbrevData[i].getAttribute();
1816 unsigned Form = AbbrevData[i].getForm();
1817 assert(Form && "Too many attributes for DIE (check abbreviation)");
1818
Chris Lattner7bde8c02010-04-04 18:52:31 +00001819 if (Asm->isVerbose())
Chris Lattner5adf9872010-01-24 18:54:17 +00001820 Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr));
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001821
Bill Wendling480ff322009-05-20 23:21:38 +00001822 switch (Attr) {
Bill Wendling480ff322009-05-20 23:21:38 +00001823 case dwarf::DW_AT_abstract_origin: {
1824 DIEEntry *E = cast<DIEEntry>(Values[i]);
1825 DIE *Origin = E->getEntry();
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001826 unsigned Addr = Origin->getOffset();
Bill Wendling480ff322009-05-20 23:21:38 +00001827 Asm->EmitInt32(Addr);
1828 break;
1829 }
Devang Patel12563b32010-04-16 23:33:45 +00001830 case dwarf::DW_AT_ranges: {
1831 // DW_AT_range Value encodes offset in debug_range section.
1832 DIEInteger *V = cast<DIEInteger>(Values[i]);
Devang Patelda3ef852010-09-02 16:43:44 +00001833
Nick Lewycky33da3362012-06-22 01:25:12 +00001834 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections()) {
Devang Patelda3ef852010-09-02 16:43:44 +00001835 Asm->EmitLabelPlusOffset(DwarfDebugRangeSectionSym,
1836 V->getValue(),
1837 4);
1838 } else {
1839 Asm->EmitLabelOffsetDifference(DwarfDebugRangeSectionSym,
1840 V->getValue(),
1841 DwarfDebugRangeSectionSym,
1842 4);
1843 }
Devang Patel12563b32010-04-16 23:33:45 +00001844 break;
1845 }
Devang Patel9fc11702010-05-25 23:40:22 +00001846 case dwarf::DW_AT_location: {
Nick Lewycky33da3362012-06-22 01:25:12 +00001847 if (DIELabel *L = dyn_cast<DIELabel>(Values[i])) {
1848 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
1849 Asm->EmitLabelReference(L->getValue(), 4);
1850 else
1851 Asm->EmitLabelDifference(L->getValue(), DwarfDebugLocSectionSym, 4);
1852 } else {
Devang Patel9fc11702010-05-25 23:40:22 +00001853 Values[i]->EmitValue(Asm, Form);
Nick Lewycky33da3362012-06-22 01:25:12 +00001854 }
Devang Patel9fc11702010-05-25 23:40:22 +00001855 break;
1856 }
Devang Patela1bd5a12010-09-29 19:08:08 +00001857 case dwarf::DW_AT_accessibility: {
1858 if (Asm->isVerbose()) {
1859 DIEInteger *V = cast<DIEInteger>(Values[i]);
1860 Asm->OutStreamer.AddComment(dwarf::AccessibilityString(V->getValue()));
1861 }
1862 Values[i]->EmitValue(Asm, Form);
1863 break;
1864 }
Bill Wendling480ff322009-05-20 23:21:38 +00001865 default:
1866 // Emit an attribute using the defined form.
Chris Lattner3a383cb2010-04-05 00:13:49 +00001867 Values[i]->EmitValue(Asm, Form);
Bill Wendling480ff322009-05-20 23:21:38 +00001868 break;
1869 }
Bill Wendling480ff322009-05-20 23:21:38 +00001870 }
1871
1872 // Emit the DIE children if any.
1873 if (Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes) {
1874 const std::vector<DIE *> &Children = Die->getChildren();
1875
1876 for (unsigned j = 0, M = Children.size(); j < M; ++j)
Eric Christopher3c5a1912012-12-19 22:02:53 +00001877 emitDIE(Children[j], Abbrevs);
Bill Wendling480ff322009-05-20 23:21:38 +00001878
Chris Lattner7bde8c02010-04-04 18:52:31 +00001879 if (Asm->isVerbose())
Chris Lattner566cae92010-03-09 23:52:58 +00001880 Asm->OutStreamer.AddComment("End Of Children Mark");
1881 Asm->EmitInt8(0);
Bill Wendling480ff322009-05-20 23:21:38 +00001882 }
1883}
1884
Eric Christophera2de8262012-12-15 00:04:07 +00001885// Emit the various dwarf units to the unit section USection with
1886// the abbreviations going into ASection.
1887void DwarfUnits::emitUnits(DwarfDebug *DD,
1888 const MCSection *USection,
1889 const MCSection *ASection,
1890 const MCSymbol *ASectionSym) {
1891 Asm->OutStreamer.SwitchSection(USection);
1892 for (SmallVector<CompileUnit *, 1>::iterator I = CUs.begin(),
1893 E = CUs.end(); I != E; ++I) {
1894 CompileUnit *TheCU = *I;
Devang Patel1a0df9a2010-05-10 22:49:55 +00001895 DIE *Die = TheCU->getCUDie();
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001896
Devang Patel1a0df9a2010-05-10 22:49:55 +00001897 // Emit the compile units header.
Eric Christophera2de8262012-12-15 00:04:07 +00001898 Asm->OutStreamer
1899 .EmitLabel(Asm->GetTempSymbol(USection->getLabelBeginName(),
1900 TheCU->getUniqueID()));
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001901
Devang Patel1a0df9a2010-05-10 22:49:55 +00001902 // Emit size of content not including length itself
1903 unsigned ContentSize = Die->getSize() +
1904 sizeof(int16_t) + // DWARF version number
1905 sizeof(int32_t) + // Offset Into Abbrev. Section
Devang Patele141234942011-04-13 19:41:17 +00001906 sizeof(int8_t); // Pointer Size (in bytes)
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001907
Devang Patel1a0df9a2010-05-10 22:49:55 +00001908 Asm->OutStreamer.AddComment("Length of Compilation Unit Info");
1909 Asm->EmitInt32(ContentSize);
1910 Asm->OutStreamer.AddComment("DWARF version number");
1911 Asm->EmitInt16(dwarf::DWARF_VERSION);
1912 Asm->OutStreamer.AddComment("Offset Into Abbrev. Section");
Eric Christophera2de8262012-12-15 00:04:07 +00001913 Asm->EmitSectionOffset(Asm->GetTempSymbol(ASection->getLabelBeginName()),
1914 ASectionSym);
Devang Patel1a0df9a2010-05-10 22:49:55 +00001915 Asm->OutStreamer.AddComment("Address Size (in bytes)");
Chandler Carruth5da3f052012-11-01 09:14:31 +00001916 Asm->EmitInt8(Asm->getDataLayout().getPointerSize());
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001917
Eric Christopher3c5a1912012-12-19 22:02:53 +00001918 DD->emitDIE(Die, Abbreviations);
Eric Christophera2de8262012-12-15 00:04:07 +00001919 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol(USection->getLabelEndName(),
Eli Benderskyb42d1462012-12-03 18:45:45 +00001920 TheCU->getUniqueID()));
Devang Patel1a0df9a2010-05-10 22:49:55 +00001921 }
Bill Wendling480ff322009-05-20 23:21:38 +00001922}
1923
Eric Christopher9c2ecd92012-11-30 23:59:06 +00001924// Emit the debug info section.
1925void DwarfDebug::emitDebugInfo() {
Eric Christophera2de8262012-12-15 00:04:07 +00001926 DwarfUnits &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
1927
1928 Holder.emitUnits(this, Asm->getObjFileLowering().getDwarfInfoSection(),
1929 Asm->getObjFileLowering().getDwarfAbbrevSection(),
1930 DwarfAbbrevSectionSym);
Eric Christopher9c2ecd92012-11-30 23:59:06 +00001931}
1932
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001933// Emit the abbreviation section.
Eric Christopher38371952012-11-20 23:30:11 +00001934void DwarfDebug::emitAbbreviations() {
Eric Christopher3c5a1912012-12-19 22:02:53 +00001935 if (!useSplitDwarf())
1936 emitAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevSection(),
1937 &Abbreviations);
1938 else
1939 emitSkeletonAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevSection());
1940}
Bill Wendling480ff322009-05-20 23:21:38 +00001941
Eric Christopher3c5a1912012-12-19 22:02:53 +00001942void DwarfDebug::emitAbbrevs(const MCSection *Section,
1943 std::vector<DIEAbbrev *> *Abbrevs) {
1944 // Check to see if it is worth the effort.
1945 if (!Abbrevs->empty()) {
1946 // Start the debug abbrev section.
1947 Asm->OutStreamer.SwitchSection(Section);
1948
1949 MCSymbol *Begin = Asm->GetTempSymbol(Section->getLabelBeginName());
Eric Christopher996b2b72012-12-13 03:00:38 +00001950 Asm->OutStreamer.EmitLabel(Begin);
Bill Wendling480ff322009-05-20 23:21:38 +00001951
1952 // For each abbrevation.
Eric Christopher3c5a1912012-12-19 22:02:53 +00001953 for (unsigned i = 0, N = Abbrevs->size(); i < N; ++i) {
Bill Wendling480ff322009-05-20 23:21:38 +00001954 // Get abbreviation data
Eric Christopher3c5a1912012-12-19 22:02:53 +00001955 const DIEAbbrev *Abbrev = Abbrevs->at(i);
Bill Wendling480ff322009-05-20 23:21:38 +00001956
1957 // Emit the abbrevations code (base 1 index.)
Chris Lattner9efd1182010-04-04 19:09:29 +00001958 Asm->EmitULEB128(Abbrev->getNumber(), "Abbreviation Code");
Bill Wendling480ff322009-05-20 23:21:38 +00001959
1960 // Emit the abbreviations data.
Chris Lattner3a383cb2010-04-05 00:13:49 +00001961 Abbrev->Emit(Asm);
Bill Wendling480ff322009-05-20 23:21:38 +00001962 }
1963
1964 // Mark end of abbreviations.
Chris Lattner9efd1182010-04-04 19:09:29 +00001965 Asm->EmitULEB128(0, "EOM(3)");
Bill Wendling480ff322009-05-20 23:21:38 +00001966
Eric Christopher3c5a1912012-12-19 22:02:53 +00001967 MCSymbol *End = Asm->GetTempSymbol(Section->getLabelEndName());
Eric Christopher996b2b72012-12-13 03:00:38 +00001968 Asm->OutStreamer.EmitLabel(End);
Bill Wendling480ff322009-05-20 23:21:38 +00001969 }
1970}
1971
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001972// Emit the last address of the section and the end of the line matrix.
Devang Patel930143b2009-11-21 02:48:08 +00001973void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) {
Bill Wendling480ff322009-05-20 23:21:38 +00001974 // Define last address of section.
Chris Lattner566cae92010-03-09 23:52:58 +00001975 Asm->OutStreamer.AddComment("Extended Op");
1976 Asm->EmitInt8(0);
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001977
Chris Lattner566cae92010-03-09 23:52:58 +00001978 Asm->OutStreamer.AddComment("Op size");
Chandler Carruth5da3f052012-11-01 09:14:31 +00001979 Asm->EmitInt8(Asm->getDataLayout().getPointerSize() + 1);
Chris Lattner566cae92010-03-09 23:52:58 +00001980 Asm->OutStreamer.AddComment("DW_LNE_set_address");
1981 Asm->EmitInt8(dwarf::DW_LNE_set_address);
1982
1983 Asm->OutStreamer.AddComment("Section end label");
Chris Lattnerb245dfb2010-03-10 01:17:49 +00001984
Chris Lattnera179b522010-04-04 19:25:43 +00001985 Asm->OutStreamer.EmitSymbolValue(Asm->GetTempSymbol("section_end",SectionEnd),
Eric Christopherce0cfce2013-01-09 01:35:34 +00001986 Asm->getDataLayout().getPointerSize());
Bill Wendling480ff322009-05-20 23:21:38 +00001987
1988 // Mark end of matrix.
Chris Lattner566cae92010-03-09 23:52:58 +00001989 Asm->OutStreamer.AddComment("DW_LNE_end_sequence");
1990 Asm->EmitInt8(0);
Chris Lattnerf5c834f2010-01-22 22:09:00 +00001991 Asm->EmitInt8(1);
Chris Lattnerfa823552010-01-22 23:18:42 +00001992 Asm->EmitInt8(1);
Bill Wendling480ff322009-05-20 23:21:38 +00001993}
1994
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001995// Emit visible names into a hashed accelerator table section.
Eric Christopher4996c702011-11-07 09:24:32 +00001996void DwarfDebug::emitAccelNames() {
1997 DwarfAccelTable AT(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset,
1998 dwarf::DW_FORM_data4));
1999 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2000 E = CUMap.end(); I != E; ++I) {
2001 CompileUnit *TheCU = I->second;
Eric Christopherd9843b32011-11-10 19:25:34 +00002002 const StringMap<std::vector<DIE*> > &Names = TheCU->getAccelNames();
2003 for (StringMap<std::vector<DIE*> >::const_iterator
Eric Christopher4996c702011-11-07 09:24:32 +00002004 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
2005 const char *Name = GI->getKeyData();
Eric Christopher090fcc12012-01-06 23:03:34 +00002006 const std::vector<DIE *> &Entities = GI->second;
Eric Christopherd9843b32011-11-10 19:25:34 +00002007 for (std::vector<DIE *>::const_iterator DI = Entities.begin(),
2008 DE = Entities.end(); DI != DE; ++DI)
2009 AT.AddName(Name, (*DI));
Eric Christopher4996c702011-11-07 09:24:32 +00002010 }
2011 }
2012
2013 AT.FinalizeTable(Asm, "Names");
2014 Asm->OutStreamer.SwitchSection(
2015 Asm->getObjFileLowering().getDwarfAccelNamesSection());
2016 MCSymbol *SectionBegin = Asm->GetTempSymbol("names_begin");
2017 Asm->OutStreamer.EmitLabel(SectionBegin);
2018
2019 // Emit the full data.
Eric Christophere698f532012-12-20 21:58:36 +00002020 AT.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher4996c702011-11-07 09:24:32 +00002021}
2022
Eric Christopher48fef592012-12-20 21:58:40 +00002023// Emit objective C classes and categories into a hashed accelerator table
2024// section.
Eric Christopher4996c702011-11-07 09:24:32 +00002025void DwarfDebug::emitAccelObjC() {
2026 DwarfAccelTable AT(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset,
2027 dwarf::DW_FORM_data4));
2028 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2029 E = CUMap.end(); I != E; ++I) {
2030 CompileUnit *TheCU = I->second;
2031 const StringMap<std::vector<DIE*> > &Names = TheCU->getAccelObjC();
2032 for (StringMap<std::vector<DIE*> >::const_iterator
2033 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
2034 const char *Name = GI->getKeyData();
Eric Christopher090fcc12012-01-06 23:03:34 +00002035 const std::vector<DIE *> &Entities = GI->second;
Eric Christopher4996c702011-11-07 09:24:32 +00002036 for (std::vector<DIE *>::const_iterator DI = Entities.begin(),
2037 DE = Entities.end(); DI != DE; ++DI)
2038 AT.AddName(Name, (*DI));
2039 }
2040 }
2041
2042 AT.FinalizeTable(Asm, "ObjC");
2043 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering()
2044 .getDwarfAccelObjCSection());
2045 MCSymbol *SectionBegin = Asm->GetTempSymbol("objc_begin");
2046 Asm->OutStreamer.EmitLabel(SectionBegin);
2047
2048 // Emit the full data.
Eric Christophere698f532012-12-20 21:58:36 +00002049 AT.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher4996c702011-11-07 09:24:32 +00002050}
2051
Eric Christopheracdcbdb2012-11-27 22:43:45 +00002052// Emit namespace dies into a hashed accelerator table.
Eric Christopher4996c702011-11-07 09:24:32 +00002053void DwarfDebug::emitAccelNamespaces() {
2054 DwarfAccelTable AT(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset,
2055 dwarf::DW_FORM_data4));
2056 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2057 E = CUMap.end(); I != E; ++I) {
2058 CompileUnit *TheCU = I->second;
Eric Christopher66b37db2011-11-10 21:47:55 +00002059 const StringMap<std::vector<DIE*> > &Names = TheCU->getAccelNamespace();
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 Christopher66b37db2011-11-10 21:47:55 +00002064 for (std::vector<DIE *>::const_iterator DI = Entities.begin(),
2065 DE = Entities.end(); DI != DE; ++DI)
2066 AT.AddName(Name, (*DI));
Eric Christopher4996c702011-11-07 09:24:32 +00002067 }
2068 }
2069
2070 AT.FinalizeTable(Asm, "namespac");
2071 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering()
2072 .getDwarfAccelNamespaceSection());
2073 MCSymbol *SectionBegin = Asm->GetTempSymbol("namespac_begin");
2074 Asm->OutStreamer.EmitLabel(SectionBegin);
2075
2076 // Emit the full data.
Eric Christophere698f532012-12-20 21:58:36 +00002077 AT.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher4996c702011-11-07 09:24:32 +00002078}
2079
Eric Christopheracdcbdb2012-11-27 22:43:45 +00002080// Emit type dies into a hashed accelerator table.
Eric Christopher4996c702011-11-07 09:24:32 +00002081void DwarfDebug::emitAccelTypes() {
Eric Christopher21bde872012-01-06 04:35:23 +00002082 std::vector<DwarfAccelTable::Atom> Atoms;
2083 Atoms.push_back(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset,
2084 dwarf::DW_FORM_data4));
2085 Atoms.push_back(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeTag,
2086 dwarf::DW_FORM_data2));
2087 Atoms.push_back(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeTypeFlags,
2088 dwarf::DW_FORM_data1));
2089 DwarfAccelTable AT(Atoms);
Eric Christopher4996c702011-11-07 09:24:32 +00002090 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2091 E = CUMap.end(); I != E; ++I) {
2092 CompileUnit *TheCU = I->second;
Eric Christopher21bde872012-01-06 04:35:23 +00002093 const StringMap<std::vector<std::pair<DIE*, unsigned > > > &Names
2094 = TheCU->getAccelTypes();
2095 for (StringMap<std::vector<std::pair<DIE*, unsigned> > >::const_iterator
Eric Christopher4996c702011-11-07 09:24:32 +00002096 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
2097 const char *Name = GI->getKeyData();
Eric Christopher090fcc12012-01-06 23:03:34 +00002098 const std::vector<std::pair<DIE *, unsigned> > &Entities = GI->second;
Eric Christopher21bde872012-01-06 04:35:23 +00002099 for (std::vector<std::pair<DIE *, unsigned> >::const_iterator DI
2100 = Entities.begin(), DE = Entities.end(); DI !=DE; ++DI)
2101 AT.AddName(Name, (*DI).first, (*DI).second);
Eric Christopher4996c702011-11-07 09:24:32 +00002102 }
2103 }
2104
2105 AT.FinalizeTable(Asm, "types");
2106 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering()
2107 .getDwarfAccelTypesSection());
2108 MCSymbol *SectionBegin = Asm->GetTempSymbol("types_begin");
2109 Asm->OutStreamer.EmitLabel(SectionBegin);
2110
2111 // Emit the full data.
Eric Christophere698f532012-12-20 21:58:36 +00002112 AT.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher4996c702011-11-07 09:24:32 +00002113}
2114
Devang Patel04d2f2d2009-11-24 01:14:22 +00002115void DwarfDebug::emitDebugPubTypes() {
Devang Patel1a0df9a2010-05-10 22:49:55 +00002116 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2117 E = CUMap.end(); I != E; ++I) {
2118 CompileUnit *TheCU = I->second;
Eric Christopher6abc9c52011-11-07 09:18:35 +00002119 // Start the dwarf pubtypes section.
Devang Patel1a0df9a2010-05-10 22:49:55 +00002120 Asm->OutStreamer.SwitchSection(
2121 Asm->getObjFileLowering().getDwarfPubTypesSection());
2122 Asm->OutStreamer.AddComment("Length of Public Types Info");
2123 Asm->EmitLabelDifference(
Eli Benderskyb42d1462012-12-03 18:45:45 +00002124 Asm->GetTempSymbol("pubtypes_end", TheCU->getUniqueID()),
2125 Asm->GetTempSymbol("pubtypes_begin", TheCU->getUniqueID()), 4);
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002126
Devang Patel1a0df9a2010-05-10 22:49:55 +00002127 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_begin",
Eli Benderskyb42d1462012-12-03 18:45:45 +00002128 TheCU->getUniqueID()));
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002129
Devang Patel1a0df9a2010-05-10 22:49:55 +00002130 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DWARF Version");
2131 Asm->EmitInt16(dwarf::DWARF_VERSION);
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002132
Devang Patel1a0df9a2010-05-10 22:49:55 +00002133 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
Eric Christopher16485a52012-12-15 00:04:04 +00002134 const MCSection *ISec = Asm->getObjFileLowering().getDwarfInfoSection();
2135 Asm->EmitSectionOffset(Asm->GetTempSymbol(ISec->getLabelBeginName(),
Eli Benderskyb42d1462012-12-03 18:45:45 +00002136 TheCU->getUniqueID()),
Devang Patel1a0df9a2010-05-10 22:49:55 +00002137 DwarfInfoSectionSym);
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002138
Devang Patel1a0df9a2010-05-10 22:49:55 +00002139 Asm->OutStreamer.AddComment("Compilation Unit Length");
Eric Christopher16485a52012-12-15 00:04:04 +00002140 Asm->EmitLabelDifference(Asm->GetTempSymbol(ISec->getLabelEndName(),
Eli Benderskyb42d1462012-12-03 18:45:45 +00002141 TheCU->getUniqueID()),
Eric Christopher16485a52012-12-15 00:04:04 +00002142 Asm->GetTempSymbol(ISec->getLabelBeginName(),
Eli Benderskyb42d1462012-12-03 18:45:45 +00002143 TheCU->getUniqueID()),
Devang Patel1a0df9a2010-05-10 22:49:55 +00002144 4);
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002145
Devang Patel1a0df9a2010-05-10 22:49:55 +00002146 const StringMap<DIE*> &Globals = TheCU->getGlobalTypes();
2147 for (StringMap<DIE*>::const_iterator
2148 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2149 const char *Name = GI->getKeyData();
Nick Lewycky019d2552011-07-29 03:49:23 +00002150 DIE *Entity = GI->second;
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002151
Devang Patel1a0df9a2010-05-10 22:49:55 +00002152 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
2153 Asm->EmitInt32(Entity->getOffset());
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002154
Devang Patel1a0df9a2010-05-10 22:49:55 +00002155 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("External Name");
Benjamin Kramer966ed1b2011-11-09 18:16:11 +00002156 // Emit the name with a terminating null byte.
Eric Christophere3ab3d02013-01-09 01:57:54 +00002157 Asm->OutStreamer.EmitBytes(StringRef(Name, GI->getKeyLength()+1));
Devang Patel1a0df9a2010-05-10 22:49:55 +00002158 }
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002159
Devang Patel1a0df9a2010-05-10 22:49:55 +00002160 Asm->OutStreamer.AddComment("End Mark");
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002161 Asm->EmitInt32(0);
Devang Patel1a0df9a2010-05-10 22:49:55 +00002162 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_end",
Eli Benderskyb42d1462012-12-03 18:45:45 +00002163 TheCU->getUniqueID()));
Devang Patel04d2f2d2009-11-24 01:14:22 +00002164 }
Devang Patel04d2f2d2009-11-24 01:14:22 +00002165}
2166
Eric Christopher3bf29fd2012-12-27 02:14:01 +00002167// Emit strings into a string section.
Eric Christopher2cbd5762013-01-07 19:32:41 +00002168void DwarfUnits::emitStrings(const MCSection *StrSection,
2169 const MCSection *OffsetSection = NULL,
2170 const MCSymbol *StrSecSym = NULL) {
Eric Christopher3bf29fd2012-12-27 02:14:01 +00002171
Eric Christopher27614582013-01-08 22:22:06 +00002172 if (StringPool.empty()) return;
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002173
Chris Lattner3d72a672010-03-09 23:38:23 +00002174 // Start the dwarf str section.
Eric Christopher2cbd5762013-01-07 19:32:41 +00002175 Asm->OutStreamer.SwitchSection(StrSection);
Bill Wendling480ff322009-05-20 23:21:38 +00002176
Chris Lattnerb7aa9522010-03-13 02:17:42 +00002177 // Get all of the string pool entries and put them in an array by their ID so
2178 // we can sort them.
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002179 SmallVector<std::pair<unsigned,
Eric Christopherb800ff72013-01-07 22:40:45 +00002180 StringMapEntry<std::pair<MCSymbol*, unsigned> >*>, 64> Entries;
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002181
Chris Lattnerb7aa9522010-03-13 02:17:42 +00002182 for (StringMap<std::pair<MCSymbol*, unsigned> >::iterator
Eric Christopher27614582013-01-08 22:22:06 +00002183 I = StringPool.begin(), E = StringPool.end();
Eric Christopher48fef592012-12-20 21:58:40 +00002184 I != E; ++I)
Chris Lattnerb7aa9522010-03-13 02:17:42 +00002185 Entries.push_back(std::make_pair(I->second.second, &*I));
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002186
Chris Lattnerb7aa9522010-03-13 02:17:42 +00002187 array_pod_sort(Entries.begin(), Entries.end());
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002188
Chris Lattnerb7aa9522010-03-13 02:17:42 +00002189 for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
Chris Lattner3d72a672010-03-09 23:38:23 +00002190 // Emit a label for reference from debug information entries.
Chris Lattnerb7aa9522010-03-13 02:17:42 +00002191 Asm->OutStreamer.EmitLabel(Entries[i].second->getValue().first);
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002192
Benjamin Kramer966ed1b2011-11-09 18:16:11 +00002193 // Emit the string itself with a terminating null byte.
Benjamin Kramer148db362011-11-09 12:12:04 +00002194 Asm->OutStreamer.EmitBytes(StringRef(Entries[i].second->getKeyData(),
Eric Christopherce0cfce2013-01-09 01:35:34 +00002195 Entries[i].second->getKeyLength()+1));
Bill Wendling480ff322009-05-20 23:21:38 +00002196 }
Eric Christopher2cbd5762013-01-07 19:32:41 +00002197
2198 // If we've got an offset section go ahead and emit that now as well.
2199 if (OffsetSection) {
2200 Asm->OutStreamer.SwitchSection(OffsetSection);
2201 unsigned offset = 0;
Eric Christopher962c9082013-01-15 23:56:56 +00002202 unsigned size = 4; // FIXME: DWARF64 is 8.
Eric Christopher2cbd5762013-01-07 19:32:41 +00002203 for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
Eric Christopherbf7bc492013-01-09 03:52:05 +00002204 Asm->OutStreamer.EmitIntValue(offset, size);
Eric Christopher2cbd5762013-01-07 19:32:41 +00002205 offset += Entries[i].second->getKeyLength() + 1;
2206 }
2207 }
Bill Wendling480ff322009-05-20 23:21:38 +00002208}
2209
Eric Christopher962c9082013-01-15 23:56:56 +00002210// Emit strings into a string section.
2211void DwarfUnits::emitAddresses(const MCSection *AddrSection) {
2212
2213 if (AddressPool.empty()) return;
2214
2215 // Start the dwarf addr section.
2216 Asm->OutStreamer.SwitchSection(AddrSection);
2217
2218 // Get all of the string pool entries and put them in an array by their ID so
2219 // we can sort them.
2220 SmallVector<std::pair<unsigned,
2221 std::pair<MCSymbol*, unsigned>* >, 64> Entries;
2222
2223 for (DenseMap<MCSymbol*, std::pair<MCSymbol*, unsigned> >::iterator
2224 I = AddressPool.begin(), E = AddressPool.end();
2225 I != E; ++I)
2226 Entries.push_back(std::make_pair(I->second.second, &(I->second)));
2227
2228 array_pod_sort(Entries.begin(), Entries.end());
2229
2230 for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
2231 // Emit a label for reference from debug information entries.
2232 MCSymbol *Sym = Entries[i].second->first;
2233 if (Sym)
2234 Asm->EmitLabelReference(Entries[i].second->first,
2235 Asm->getDataLayout().getPointerSize());
2236 else
2237 Asm->OutStreamer.EmitIntValue(0, Asm->getDataLayout().getPointerSize());
2238 }
2239
2240}
2241
Eric Christopher3bf29fd2012-12-27 02:14:01 +00002242// Emit visible names into a debug str section.
2243void DwarfDebug::emitDebugStr() {
2244 DwarfUnits &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
2245 Holder.emitStrings(Asm->getObjFileLowering().getDwarfStrSection());
2246}
2247
Eric Christopheracdcbdb2012-11-27 22:43:45 +00002248// Emit visible names into a debug loc section.
Devang Patel930143b2009-11-21 02:48:08 +00002249void DwarfDebug::emitDebugLoc() {
Devang Patel6b9a9fe2010-05-26 23:55:23 +00002250 if (DotDebugLocEntries.empty())
2251 return;
2252
Devang Patel116a9d72011-02-04 22:57:18 +00002253 for (SmallVector<DotDebugLocEntry, 4>::iterator
2254 I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
2255 I != E; ++I) {
2256 DotDebugLocEntry &Entry = *I;
2257 if (I + 1 != DotDebugLocEntries.end())
2258 Entry.Merge(I+1);
2259 }
2260
Daniel Dunbarfd95b012011-03-16 22:16:39 +00002261 // Start the dwarf loc section.
Chris Lattner4b7dadb2009-08-19 05:49:37 +00002262 Asm->OutStreamer.SwitchSection(
Devang Patel9fc11702010-05-25 23:40:22 +00002263 Asm->getObjFileLowering().getDwarfLocSection());
Chandler Carruth5da3f052012-11-01 09:14:31 +00002264 unsigned char Size = Asm->getDataLayout().getPointerSize();
Devang Patel6b9a9fe2010-05-26 23:55:23 +00002265 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", 0));
2266 unsigned index = 1;
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002267 for (SmallVector<DotDebugLocEntry, 4>::iterator
2268 I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
Devang Patel30265c42010-07-07 20:12:52 +00002269 I != E; ++I, ++index) {
Devang Patel116a9d72011-02-04 22:57:18 +00002270 DotDebugLocEntry &Entry = *I;
2271 if (Entry.isMerged()) continue;
Devang Patel9fc11702010-05-25 23:40:22 +00002272 if (Entry.isEmpty()) {
Eric Christopherce0cfce2013-01-09 01:35:34 +00002273 Asm->OutStreamer.EmitIntValue(0, Size);
2274 Asm->OutStreamer.EmitIntValue(0, Size);
Devang Patel6b9a9fe2010-05-26 23:55:23 +00002275 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", index));
Devang Patel9fc11702010-05-25 23:40:22 +00002276 } else {
Eric Christopherbf7bc492013-01-09 03:52:05 +00002277 Asm->OutStreamer.EmitSymbolValue(Entry.Begin, Size);
2278 Asm->OutStreamer.EmitSymbolValue(Entry.End, Size);
Devang Patel3e021532011-04-28 02:22:40 +00002279 DIVariable DV(Entry.Variable);
Rafael Espindolad23bfb82011-05-27 22:05:41 +00002280 Asm->OutStreamer.AddComment("Loc expr size");
2281 MCSymbol *begin = Asm->OutStreamer.getContext().CreateTempSymbol();
2282 MCSymbol *end = Asm->OutStreamer.getContext().CreateTempSymbol();
2283 Asm->EmitLabelDifference(end, begin, 2);
2284 Asm->OutStreamer.EmitLabel(begin);
Devang Pateled9fd452011-07-08 16:49:43 +00002285 if (Entry.isInt()) {
Devang Patel324f8432011-06-01 22:03:25 +00002286 DIBasicType BTy(DV.getType());
2287 if (BTy.Verify() &&
Eric Christopher6a841382012-11-19 22:42:10 +00002288 (BTy.getEncoding() == dwarf::DW_ATE_signed
Devang Patel324f8432011-06-01 22:03:25 +00002289 || BTy.getEncoding() == dwarf::DW_ATE_signed_char)) {
2290 Asm->OutStreamer.AddComment("DW_OP_consts");
2291 Asm->EmitInt8(dwarf::DW_OP_consts);
Devang Pateled9fd452011-07-08 16:49:43 +00002292 Asm->EmitSLEB128(Entry.getInt());
Devang Patel324f8432011-06-01 22:03:25 +00002293 } else {
2294 Asm->OutStreamer.AddComment("DW_OP_constu");
2295 Asm->EmitInt8(dwarf::DW_OP_constu);
Devang Pateled9fd452011-07-08 16:49:43 +00002296 Asm->EmitULEB128(Entry.getInt());
Devang Patel324f8432011-06-01 22:03:25 +00002297 }
Devang Pateled9fd452011-07-08 16:49:43 +00002298 } else if (Entry.isLocation()) {
Eric Christopher6a841382012-11-19 22:42:10 +00002299 if (!DV.hasComplexAddress())
Devang Pateled9fd452011-07-08 16:49:43 +00002300 // Regular entry.
Devang Patel3e021532011-04-28 02:22:40 +00002301 Asm->EmitDwarfRegOp(Entry.Loc);
Devang Pateled9fd452011-07-08 16:49:43 +00002302 else {
2303 // Complex address entry.
2304 unsigned N = DV.getNumAddrElements();
2305 unsigned i = 0;
2306 if (N >= 2 && DV.getAddrElement(0) == DIBuilder::OpPlus) {
2307 if (Entry.Loc.getOffset()) {
2308 i = 2;
2309 Asm->EmitDwarfRegOp(Entry.Loc);
2310 Asm->OutStreamer.AddComment("DW_OP_deref");
2311 Asm->EmitInt8(dwarf::DW_OP_deref);
2312 Asm->OutStreamer.AddComment("DW_OP_plus_uconst");
2313 Asm->EmitInt8(dwarf::DW_OP_plus_uconst);
2314 Asm->EmitSLEB128(DV.getAddrElement(1));
2315 } else {
2316 // If first address element is OpPlus then emit
2317 // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
2318 MachineLocation Loc(Entry.Loc.getReg(), DV.getAddrElement(1));
2319 Asm->EmitDwarfRegOp(Loc);
2320 i = 2;
2321 }
2322 } else {
2323 Asm->EmitDwarfRegOp(Entry.Loc);
2324 }
Eric Christopher6a841382012-11-19 22:42:10 +00002325
Devang Pateled9fd452011-07-08 16:49:43 +00002326 // Emit remaining complex address elements.
2327 for (; i < N; ++i) {
2328 uint64_t Element = DV.getAddrElement(i);
2329 if (Element == DIBuilder::OpPlus) {
2330 Asm->EmitInt8(dwarf::DW_OP_plus_uconst);
2331 Asm->EmitULEB128(DV.getAddrElement(++i));
Eric Christopher4d250522012-05-08 18:56:00 +00002332 } else if (Element == DIBuilder::OpDeref) {
Eric Christopher8d2a77d2012-05-08 21:24:39 +00002333 if (!Entry.Loc.isReg())
Eric Christopher4d250522012-05-08 18:56:00 +00002334 Asm->EmitInt8(dwarf::DW_OP_deref);
2335 } else
2336 llvm_unreachable("unknown Opcode found in complex address");
Devang Pateled9fd452011-07-08 16:49:43 +00002337 }
Devang Patel3e021532011-04-28 02:22:40 +00002338 }
Devang Patel3e021532011-04-28 02:22:40 +00002339 }
Devang Pateled9fd452011-07-08 16:49:43 +00002340 // else ... ignore constant fp. There is not any good way to
2341 // to represent them here in dwarf.
Rafael Espindolad23bfb82011-05-27 22:05:41 +00002342 Asm->OutStreamer.EmitLabel(end);
Devang Patel9fc11702010-05-25 23:40:22 +00002343 }
2344 }
Bill Wendling480ff322009-05-20 23:21:38 +00002345}
2346
Eric Christopheracdcbdb2012-11-27 22:43:45 +00002347// Emit visible names into a debug aranges section.
Eric Christopher7b30f2e42012-11-21 00:34:35 +00002348void DwarfDebug::emitDebugARanges() {
Bill Wendling480ff322009-05-20 23:21:38 +00002349 // Start the dwarf aranges section.
Chris Lattner4b7dadb2009-08-19 05:49:37 +00002350 Asm->OutStreamer.SwitchSection(
2351 Asm->getObjFileLowering().getDwarfARangesSection());
Bill Wendling480ff322009-05-20 23:21:38 +00002352}
2353
Eric Christopheracdcbdb2012-11-27 22:43:45 +00002354// Emit visible names into a debug ranges section.
Devang Patel930143b2009-11-21 02:48:08 +00002355void DwarfDebug::emitDebugRanges() {
Bill Wendling480ff322009-05-20 23:21:38 +00002356 // Start the dwarf ranges section.
Chris Lattner4b7dadb2009-08-19 05:49:37 +00002357 Asm->OutStreamer.SwitchSection(
Devang Patel12563b32010-04-16 23:33:45 +00002358 Asm->getObjFileLowering().getDwarfRangesSection());
Chandler Carruth5da3f052012-11-01 09:14:31 +00002359 unsigned char Size = Asm->getDataLayout().getPointerSize();
Devang Patel6c74a872010-04-27 19:46:33 +00002360 for (SmallVector<const MCSymbol *, 8>::iterator
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002361 I = DebugRangeSymbols.begin(), E = DebugRangeSymbols.end();
Devang Patel6c74a872010-04-27 19:46:33 +00002362 I != E; ++I) {
2363 if (*I)
Eric Christopherbf7bc492013-01-09 03:52:05 +00002364 Asm->OutStreamer.EmitSymbolValue(const_cast<MCSymbol*>(*I), Size);
Devang Patel12563b32010-04-16 23:33:45 +00002365 else
Eric Christopherce0cfce2013-01-09 01:35:34 +00002366 Asm->OutStreamer.EmitIntValue(0, Size);
Devang Patel12563b32010-04-16 23:33:45 +00002367 }
Bill Wendling480ff322009-05-20 23:21:38 +00002368}
2369
Eric Christopheracdcbdb2012-11-27 22:43:45 +00002370// Emit visible names into a debug macinfo section.
Devang Patel930143b2009-11-21 02:48:08 +00002371void DwarfDebug::emitDebugMacInfo() {
Daniel Dunbarc418d6b2009-09-19 20:40:05 +00002372 if (const MCSection *LineInfo =
Chris Lattner1472cf52009-08-02 07:24:22 +00002373 Asm->getObjFileLowering().getDwarfMacroInfoSection()) {
Bill Wendling480ff322009-05-20 23:21:38 +00002374 // Start the dwarf macinfo section.
Chris Lattner4b7dadb2009-08-19 05:49:37 +00002375 Asm->OutStreamer.SwitchSection(LineInfo);
Bill Wendling480ff322009-05-20 23:21:38 +00002376 }
2377}
2378
Eric Christopheracdcbdb2012-11-27 22:43:45 +00002379// Emit inline info using following format.
2380// Section Header:
2381// 1. length of section
2382// 2. Dwarf version number
2383// 3. address size.
2384//
2385// Entries (one "entry" for each function that was inlined):
2386//
2387// 1. offset into __debug_str section for MIPS linkage name, if exists;
2388// otherwise offset into __debug_str for regular function name.
2389// 2. offset into __debug_str section for regular function name.
2390// 3. an unsigned LEB128 number indicating the number of distinct inlining
2391// instances for the function.
2392//
2393// The rest of the entry consists of a {die_offset, low_pc} pair for each
2394// inlined instance; the die_offset points to the inlined_subroutine die in the
2395// __debug_info section, and the low_pc is the starting address for the
2396// inlining instance.
Devang Patel930143b2009-11-21 02:48:08 +00002397void DwarfDebug::emitDebugInlineInfo() {
Eric Christopher1df94bf2012-03-02 02:11:47 +00002398 if (!Asm->MAI->doesDwarfUseInlineInfoSection())
Bill Wendling480ff322009-05-20 23:21:38 +00002399 return;
2400
Devang Patel1a0df9a2010-05-10 22:49:55 +00002401 if (!FirstCU)
Bill Wendling480ff322009-05-20 23:21:38 +00002402 return;
2403
Chris Lattner4b7dadb2009-08-19 05:49:37 +00002404 Asm->OutStreamer.SwitchSection(
2405 Asm->getObjFileLowering().getDwarfDebugInlineSection());
Chris Lattnerf5c834f2010-01-22 22:09:00 +00002406
Chris Lattner566cae92010-03-09 23:52:58 +00002407 Asm->OutStreamer.AddComment("Length of Debug Inlined Information Entry");
Chris Lattnerf1429f12010-04-04 19:58:12 +00002408 Asm->EmitLabelDifference(Asm->GetTempSymbol("debug_inlined_end", 1),
2409 Asm->GetTempSymbol("debug_inlined_begin", 1), 4);
Bill Wendling480ff322009-05-20 23:21:38 +00002410
Chris Lattnera179b522010-04-04 19:25:43 +00002411 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_begin", 1));
Bill Wendling480ff322009-05-20 23:21:38 +00002412
Chris Lattner566cae92010-03-09 23:52:58 +00002413 Asm->OutStreamer.AddComment("Dwarf Version");
2414 Asm->EmitInt16(dwarf::DWARF_VERSION);
2415 Asm->OutStreamer.AddComment("Address Size (in bytes)");
Chandler Carruth5da3f052012-11-01 09:14:31 +00002416 Asm->EmitInt8(Asm->getDataLayout().getPointerSize());
Bill Wendling480ff322009-05-20 23:21:38 +00002417
Devang Patel32cc43c2010-05-07 20:54:48 +00002418 for (SmallVector<const MDNode *, 4>::iterator I = InlinedSPNodes.begin(),
Devang Patelf6eeaeb2009-11-10 23:06:00 +00002419 E = InlinedSPNodes.end(); I != E; ++I) {
Jim Grosbach042483e2009-11-21 23:12:12 +00002420
Devang Patel32cc43c2010-05-07 20:54:48 +00002421 const MDNode *Node = *I;
2422 DenseMap<const MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator II
Jim Grosbach00e9c612009-11-22 19:20:36 +00002423 = InlineInfo.find(Node);
Devang Patelf6eeaeb2009-11-10 23:06:00 +00002424 SmallVector<InlineInfoLabels, 4> &Labels = II->second;
Devang Patel80ae3492009-08-28 23:24:31 +00002425 DISubprogram SP(Node);
Devang Patel2d9caf92009-11-25 17:36:49 +00002426 StringRef LName = SP.getLinkageName();
2427 StringRef Name = SP.getName();
Bill Wendling480ff322009-05-20 23:21:38 +00002428
Chris Lattner566cae92010-03-09 23:52:58 +00002429 Asm->OutStreamer.AddComment("MIPS linkage name");
Eric Christopher77725312012-03-02 01:57:52 +00002430 if (LName.empty())
Eric Christophere698f532012-12-20 21:58:36 +00002431 Asm->EmitSectionOffset(InfoHolder.getStringPoolEntry(Name),
2432 DwarfStrSectionSym);
Eric Christopher77725312012-03-02 01:57:52 +00002433 else
Eric Christophere698f532012-12-20 21:58:36 +00002434 Asm->EmitSectionOffset(InfoHolder
2435 .getStringPoolEntry(getRealLinkageName(LName)),
Chris Lattner70a4fce2010-04-04 23:25:33 +00002436 DwarfStrSectionSym);
Devang Patelf6eeaeb2009-11-10 23:06:00 +00002437
Chris Lattner566cae92010-03-09 23:52:58 +00002438 Asm->OutStreamer.AddComment("Function name");
Eric Christophere698f532012-12-20 21:58:36 +00002439 Asm->EmitSectionOffset(InfoHolder.getStringPoolEntry(Name),
2440 DwarfStrSectionSym);
Chris Lattner9efd1182010-04-04 19:09:29 +00002441 Asm->EmitULEB128(Labels.size(), "Inline count");
Bill Wendling480ff322009-05-20 23:21:38 +00002442
Devang Patelf6eeaeb2009-11-10 23:06:00 +00002443 for (SmallVector<InlineInfoLabels, 4>::iterator LI = Labels.begin(),
Bill Wendling480ff322009-05-20 23:21:38 +00002444 LE = Labels.end(); LI != LE; ++LI) {
Chris Lattner7bde8c02010-04-04 18:52:31 +00002445 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
Chris Lattner085b6522010-03-09 00:31:02 +00002446 Asm->EmitInt32(LI->second->getOffset());
Bill Wendling480ff322009-05-20 23:21:38 +00002447
Chris Lattner7bde8c02010-04-04 18:52:31 +00002448 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("low_pc");
Chris Lattner3a383cb2010-04-05 00:13:49 +00002449 Asm->OutStreamer.EmitSymbolValue(LI->first,
Eric Christopherbf7bc492013-01-09 03:52:05 +00002450 Asm->getDataLayout().getPointerSize());
Bill Wendling480ff322009-05-20 23:21:38 +00002451 }
2452 }
2453
Chris Lattnera179b522010-04-04 19:25:43 +00002454 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_end", 1));
Bill Wendling480ff322009-05-20 23:21:38 +00002455}
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002456
Eric Christopherd692c1d2012-12-11 19:42:09 +00002457// DWARF5 Experimental Separate Dwarf emitters.
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002458
2459// This DIE has the following attributes: DW_AT_comp_dir, DW_AT_stmt_list,
2460// DW_AT_low_pc, DW_AT_high_pc, DW_AT_ranges, DW_AT_dwo_name, DW_AT_dwo_id,
2461// DW_AT_ranges_base, DW_AT_addr_base. If DW_AT_ranges is present,
2462// DW_AT_low_pc and DW_AT_high_pc are not used, and vice versa.
Eric Christophercdf218d2012-12-10 19:51:21 +00002463CompileUnit *DwarfDebug::constructSkeletonCU(const MDNode *N) {
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002464 DICompileUnit DIUnit(N);
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002465 CompilationDir = DIUnit.getDirectory();
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002466
2467 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
Eli Benderskyb42d1462012-12-03 18:45:45 +00002468 CompileUnit *NewCU = new CompileUnit(GlobalCUIndexCount++,
Eric Christophere698f532012-12-20 21:58:36 +00002469 DIUnit.getLanguage(), Die, Asm,
Eric Christopher3bf29fd2012-12-27 02:14:01 +00002470 this, &SkeletonHolder);
Eric Christopher4c7765f2013-01-17 03:00:04 +00002471
2472 SmallString<16> T(DIUnit.getFilename());
2473 sys::path::replace_extension(T, ".dwo");
2474 StringRef FN = sys::path::filename(T);
Eric Christopher2cbd5762013-01-07 19:32:41 +00002475 NewCU->addLocalString(Die, dwarf::DW_AT_GNU_dwo_name, FN);
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002476
Eric Christopher7a2cdf72013-02-05 07:31:55 +00002477 // This should be a unique identifier when we want to build .dwp files.
2478 NewCU->addUInt(Die, dwarf::DW_AT_GNU_dwo_id, dwarf::DW_FORM_data8, 0);
Eric Christopher18266172013-01-17 02:59:59 +00002479
2480 // FIXME: The addr base should be relative for each compile unit, however,
2481 // this one is going to be 0 anyhow.
2482 NewCU->addUInt(Die, dwarf::DW_AT_GNU_addr_base, dwarf::DW_FORM_sec_offset, 0);
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002483
2484 // 2.17.1 requires that we use DW_AT_low_pc for a single entry point
Eric Christopher962c9082013-01-15 23:56:56 +00002485 // into an entity. We're using 0, or a NULL label for this.
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002486 NewCU->addUInt(Die, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, 0);
Eric Christopher962c9082013-01-15 23:56:56 +00002487
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002488 // DW_AT_stmt_list is a offset of line number information for this
2489 // compile unit in debug_line section.
2490 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
Eric Christopher4c7765f2013-01-17 03:00:04 +00002491 NewCU->addLabel(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_sec_offset,
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002492 Asm->GetTempSymbol("section_line"));
2493 else
Eric Christopher4c7765f2013-01-17 03:00:04 +00002494 NewCU->addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_sec_offset, 0);
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002495
2496 if (!CompilationDir.empty())
Eric Christopher2cbd5762013-01-07 19:32:41 +00002497 NewCU->addLocalString(Die, dwarf::DW_AT_comp_dir, CompilationDir);
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002498
Eric Christopherc8a310e2012-12-10 23:34:43 +00002499 SkeletonHolder.addUnit(NewCU);
Eric Christopher5b33b3c2013-02-06 21:53:56 +00002500 SkeletonCUs.push_back(NewCU);
Eric Christopherc8a310e2012-12-10 23:34:43 +00002501
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002502 return NewCU;
2503}
2504
Eric Christopher3c5a1912012-12-19 22:02:53 +00002505void DwarfDebug::emitSkeletonAbbrevs(const MCSection *Section) {
2506 assert(useSplitDwarf() && "No split dwarf debug info?");
2507 emitAbbrevs(Section, &SkeletonAbbrevs);
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002508}
2509
Eric Christopherd692c1d2012-12-11 19:42:09 +00002510// Emit the .debug_info.dwo section for separated dwarf. This contains the
2511// compile units that would normally be in debug_info.
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002512void DwarfDebug::emitDebugInfoDWO() {
Eric Christophercdf218d2012-12-10 19:51:21 +00002513 assert(useSplitDwarf() && "No split dwarf debug info?");
Eric Christophera2de8262012-12-15 00:04:07 +00002514 InfoHolder.emitUnits(this, Asm->getObjFileLowering().getDwarfInfoDWOSection(),
Eric Christopher3c5a1912012-12-19 22:02:53 +00002515 Asm->getObjFileLowering().getDwarfAbbrevDWOSection(),
2516 DwarfAbbrevDWOSectionSym);
2517}
2518
2519// Emit the .debug_abbrev.dwo section for separated dwarf. This contains the
2520// abbreviations for the .debug_info.dwo section.
2521void DwarfDebug::emitDebugAbbrevDWO() {
2522 assert(useSplitDwarf() && "No split dwarf?");
Eric Christopher48fef592012-12-20 21:58:40 +00002523 emitAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevDWOSection(),
2524 &Abbreviations);
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002525}
Eric Christopher3bf29fd2012-12-27 02:14:01 +00002526
2527// Emit the .debug_str.dwo section for separated dwarf. This contains the
2528// string section and is identical in format to traditional .debug_str
2529// sections.
2530void DwarfDebug::emitDebugStrDWO() {
2531 assert(useSplitDwarf() && "No split dwarf?");
Eric Christopherb800ff72013-01-07 22:40:45 +00002532 const MCSection *OffSec = Asm->getObjFileLowering()
2533 .getDwarfStrOffDWOSection();
Eric Christopher2cbd5762013-01-07 19:32:41 +00002534 const MCSymbol *StrSym = DwarfStrSectionSym;
2535 InfoHolder.emitStrings(Asm->getObjFileLowering().getDwarfStrDWOSection(),
2536 OffSec, StrSym);
Eric Christopher3bf29fd2012-12-27 02:14:01 +00002537}