blob: 064452ca9e22c3697c326c8d100a77decb2f3a85 [file] [log] [blame]
Eric Christopher4daaed12012-12-10 19:51:21 +00001
Bill Wendling0310d762009-05-15 09:23:25 +00002//===-- llvm/CodeGen/DwarfDebug.cpp - Dwarf Debug Framework ---------------===//
3//
4// The LLVM Compiler Infrastructure
5//
6// This file is distributed under the University of Illinois Open Source
7// License. See LICENSE.TXT for details.
8//
9//===----------------------------------------------------------------------===//
10//
11// This file contains support for writing dwarf debug info into asm files.
12//
13//===----------------------------------------------------------------------===//
Chris Lattner6cde3e62010-03-09 00:39:24 +000014
Devang Patele4b27562009-08-28 23:24:31 +000015#define DEBUG_TYPE "dwarfdebug"
Bill Wendling0310d762009-05-15 09:23:25 +000016#include "DwarfDebug.h"
Chris Lattner74e41f92010-04-05 05:24:55 +000017#include "DIE.h"
Eric Christopher09ac3d82011-11-07 09:24:32 +000018#include "DwarfAccelTable.h"
Devang Patel8b9df622011-04-12 17:40:32 +000019#include "DwarfCompileUnit.h"
Chandler Carruthd04a8d42012-12-03 16:50:05 +000020#include "llvm/ADT/STLExtras.h"
21#include "llvm/ADT/Statistic.h"
22#include "llvm/ADT/StringExtras.h"
23#include "llvm/ADT/Triple.h"
David Greeneb2c66fc2009-08-19 21:52:55 +000024#include "llvm/CodeGen/MachineFunction.h"
Bill Wendling0310d762009-05-15 09:23:25 +000025#include "llvm/CodeGen/MachineModuleInfo.h"
Chandler Carruthd04a8d42012-12-03 16:50:05 +000026#include "llvm/Constants.h"
27#include "llvm/DIBuilder.h"
28#include "llvm/DataLayout.h"
29#include "llvm/DebugInfo.h"
30#include "llvm/Instructions.h"
Chris Lattnerb7db7332010-03-09 01:58:53 +000031#include "llvm/MC/MCAsmInfo.h"
Chris Lattnera87dea42009-07-31 18:48:30 +000032#include "llvm/MC/MCSection.h"
Chris Lattner6c2f9e12009-08-19 05:49:37 +000033#include "llvm/MC/MCStreamer.h"
Chris Lattnerb7db7332010-03-09 01:58:53 +000034#include "llvm/MC/MCSymbol.h"
Chandler Carruthd04a8d42012-12-03 16:50:05 +000035#include "llvm/Module.h"
Devang Pateleac9c072010-04-27 19:46:33 +000036#include "llvm/Support/CommandLine.h"
Daniel Dunbar6e4bdfc2009-10-13 06:47:08 +000037#include "llvm/Support/Debug.h"
38#include "llvm/Support/ErrorHandling.h"
Chris Lattner0ad9c912010-01-22 22:09:00 +000039#include "llvm/Support/FormattedStream.h"
Michael J. Spencer1f6efa32010-11-29 18:16:10 +000040#include "llvm/Support/Path.h"
Chandler Carruthd04a8d42012-12-03 16:50:05 +000041#include "llvm/Support/Timer.h"
42#include "llvm/Support/ValueHandle.h"
43#include "llvm/Target/TargetFrameLowering.h"
44#include "llvm/Target/TargetLoweringObjectFile.h"
45#include "llvm/Target/TargetMachine.h"
46#include "llvm/Target/TargetOptions.h"
47#include "llvm/Target/TargetRegisterInfo.h"
Bill Wendling0310d762009-05-15 09:23:25 +000048using namespace llvm;
49
Jim Grosbach1e20b962010-07-21 21:21:52 +000050static cl::opt<bool> DisableDebugInfoPrinting("disable-debug-info-print",
Devang Patel61409622010-07-07 20:12:52 +000051 cl::Hidden,
Devang Pateleac9c072010-04-27 19:46:33 +000052 cl::desc("Disable debug info printing"));
53
Dan Gohman281d65d2010-05-07 01:08:53 +000054static cl::opt<bool> UnknownLocations("use-unknown-locations", cl::Hidden,
Chris Lattner7a2bdde2011-04-15 05:18:47 +000055 cl::desc("Make an absence of debug location information explicit."),
Dan Gohman281d65d2010-05-07 01:08:53 +000056 cl::init(false));
57
Eric Christopher20f47ab2012-08-23 22:36:40 +000058namespace {
59 enum DefaultOnOff {
60 Default, Enable, Disable
61 };
62}
Eric Christopher09ac3d82011-11-07 09:24:32 +000063
Eric Christopher20f47ab2012-08-23 22:36:40 +000064static cl::opt<DefaultOnOff> DwarfAccelTables("dwarf-accel-tables", cl::Hidden,
65 cl::desc("Output prototype dwarf accelerator tables."),
66 cl::values(
67 clEnumVal(Default, "Default for platform"),
68 clEnumVal(Enable, "Enabled"),
69 clEnumVal(Disable, "Disabled"),
70 clEnumValEnd),
71 cl::init(Default));
72
73static cl::opt<DefaultOnOff> DarwinGDBCompat("darwin-gdb-compat", cl::Hidden,
Eric Christopher10cb7442012-08-23 07:10:46 +000074 cl::desc("Compatibility with Darwin gdb."),
Eric Christopher20f47ab2012-08-23 22:36:40 +000075 cl::values(
76 clEnumVal(Default, "Default for platform"),
77 clEnumVal(Enable, "Enabled"),
78 clEnumVal(Disable, "Disabled"),
79 clEnumValEnd),
80 cl::init(Default));
Eric Christopher10cb7442012-08-23 07:10:46 +000081
Eric Christopher4daaed12012-12-10 19:51:21 +000082static cl::opt<DefaultOnOff> SplitDwarf("split-dwarf", cl::Hidden,
83 cl::desc("Output prototype dwarf split debug info."),
Eric Christopherf5b6dcd2012-11-12 22:22:20 +000084 cl::values(
85 clEnumVal(Default, "Default for platform"),
86 clEnumVal(Enable, "Enabled"),
87 clEnumVal(Disable, "Disabled"),
88 clEnumValEnd),
89 cl::init(Default));
90
Bill Wendling5f017e82010-04-07 09:28:04 +000091namespace {
92 const char *DWARFGroupName = "DWARF Emission";
93 const char *DbgTimerName = "DWARF Debug Writer";
94} // end anonymous namespace
95
Bill Wendling0310d762009-05-15 09:23:25 +000096//===----------------------------------------------------------------------===//
97
Eric Christopherb6dc8652012-11-27 22:43:45 +000098// Configuration values for initial hash set sizes (log2).
99//
Bill Wendling0310d762009-05-15 09:23:25 +0000100static const unsigned InitAbbreviationsSetSize = 9; // log2(512)
Bill Wendling0310d762009-05-15 09:23:25 +0000101
102namespace llvm {
103
Nick Lewycky3bbb6f72011-07-29 03:49:23 +0000104DIType DbgVariable::getType() const {
Devang Patel3cbee302011-04-12 22:53:02 +0000105 DIType Ty = Var.getType();
106 // FIXME: isBlockByrefVariable should be reformulated in terms of complex
107 // addresses instead.
108 if (Var.isBlockByrefVariable()) {
109 /* Byref variables, in Blocks, are declared by the programmer as
110 "SomeType VarName;", but the compiler creates a
111 __Block_byref_x_VarName struct, and gives the variable VarName
112 either the struct, or a pointer to the struct, as its type. This
113 is necessary for various behind-the-scenes things the compiler
114 needs to do with by-reference variables in blocks.
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000115
Devang Patel3cbee302011-04-12 22:53:02 +0000116 However, as far as the original *programmer* is concerned, the
117 variable should still have type 'SomeType', as originally declared.
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000118
Devang Patel3cbee302011-04-12 22:53:02 +0000119 The following function dives into the __Block_byref_x_VarName
120 struct to find the original type of the variable. This will be
121 passed back to the code generating the type for the Debug
122 Information Entry for the variable 'VarName'. 'VarName' will then
123 have the original type 'SomeType' in its debug information.
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000124
Devang Patel3cbee302011-04-12 22:53:02 +0000125 The original type 'SomeType' will be the type of the field named
126 'VarName' inside the __Block_byref_x_VarName struct.
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000127
Devang Patel3cbee302011-04-12 22:53:02 +0000128 NOTE: In order for this to not completely fail on the debugger
129 side, the Debug Information Entry for the variable VarName needs to
130 have a DW_AT_location that tells the debugger how to unwind through
131 the pointers and __Block_byref_x_VarName struct to find the actual
132 value of the variable. The function addBlockByrefType does this. */
133 DIType subType = Ty;
134 unsigned tag = Ty.getTag();
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000135
Devang Patel3cbee302011-04-12 22:53:02 +0000136 if (tag == dwarf::DW_TAG_pointer_type) {
137 DIDerivedType DTy = DIDerivedType(Ty);
138 subType = DTy.getTypeDerivedFrom();
139 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000140
Devang Patel3cbee302011-04-12 22:53:02 +0000141 DICompositeType blockStruct = DICompositeType(subType);
142 DIArray Elements = blockStruct.getTypeArray();
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000143
Devang Patel3cbee302011-04-12 22:53:02 +0000144 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
145 DIDescriptor Element = Elements.getElement(i);
146 DIDerivedType DT = DIDerivedType(Element);
147 if (getName() == DT.getName())
148 return (DT.getTypeDerivedFrom());
Devang Patel8bd11de2010-08-09 21:01:39 +0000149 }
Devang Patel8bd11de2010-08-09 21:01:39 +0000150 }
Devang Patel3cbee302011-04-12 22:53:02 +0000151 return Ty;
152}
Bill Wendling0310d762009-05-15 09:23:25 +0000153
Chris Lattnerea761862010-04-05 04:09:20 +0000154} // end llvm namespace
Bill Wendling0310d762009-05-15 09:23:25 +0000155
Chris Lattner49cd6642010-04-05 05:11:15 +0000156DwarfDebug::DwarfDebug(AsmPrinter *A, Module *M)
Eric Christopher28bd25a2012-12-10 19:51:13 +0000157 : Asm(A), MMI(Asm->MMI), FirstCU(0),
Jim Grosbach1e20b962010-07-21 21:21:52 +0000158 AbbreviationsSet(InitAbbreviationsSetSize),
Benjamin Kramerf33a79c2012-06-09 10:34:15 +0000159 SourceIdMap(DIEValueAllocator), StringPool(DIEValueAllocator),
Eric Christopher4daaed12012-12-10 19:51:21 +0000160 PrevLabel(NULL), GlobalCUIndexCount(0), SkeletonCU(0) {
Chris Lattnerbc733f52010-03-13 02:17:42 +0000161 NextStringPoolNumber = 0;
Jim Grosbach1e20b962010-07-21 21:21:52 +0000162
Rafael Espindolaf2b04232011-05-06 14:56:22 +0000163 DwarfInfoSectionSym = DwarfAbbrevSectionSym = 0;
Chris Lattner4ad1efe2010-04-04 23:10:38 +0000164 DwarfStrSectionSym = TextSectionSym = 0;
Jim Grosbach1e20b962010-07-21 21:21:52 +0000165 DwarfDebugRangeSectionSym = DwarfDebugLocSectionSym = 0;
Devang Patelc3f5f782010-05-25 23:40:22 +0000166 FunctionBeginSym = FunctionEndSym = 0;
Eric Christopher60777d82012-04-02 17:58:52 +0000167
Eric Christopher10cb7442012-08-23 07:10:46 +0000168 // Turn on accelerator tables and older gdb compatibility
169 // for Darwin.
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000170 bool IsDarwin = Triple(M->getTargetTriple()).isOSDarwin();
Eric Christopher20f47ab2012-08-23 22:36:40 +0000171 if (DarwinGDBCompat == Default) {
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000172 if (IsDarwin)
173 IsDarwinGDBCompat = true;
Eric Christopher20f47ab2012-08-23 22:36:40 +0000174 else
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000175 IsDarwinGDBCompat = false;
Eric Christopher20f47ab2012-08-23 22:36:40 +0000176 } else
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000177 IsDarwinGDBCompat = DarwinGDBCompat == Enable ? true : false;
Eric Christopherc1610fa2012-08-23 22:36:36 +0000178
Eric Christopher20f47ab2012-08-23 22:36:40 +0000179 if (DwarfAccelTables == Default) {
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000180 if (IsDarwin)
181 HasDwarfAccelTables = true;
Eric Christopher20f47ab2012-08-23 22:36:40 +0000182 else
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000183 HasDwarfAccelTables = false;
Eric Christopher20f47ab2012-08-23 22:36:40 +0000184 } else
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000185 HasDwarfAccelTables = DwarfAccelTables == Enable ? true : false;
Eric Christopher20f47ab2012-08-23 22:36:40 +0000186
Eric Christopher4daaed12012-12-10 19:51:21 +0000187 if (SplitDwarf == Default)
188 HasSplitDwarf = false;
Eric Christopherf5b6dcd2012-11-12 22:22:20 +0000189 else
Eric Christopher4daaed12012-12-10 19:51:21 +0000190 HasSplitDwarf = SplitDwarf == Enable ? true : false;
Eric Christopherf5b6dcd2012-11-12 22:22:20 +0000191
Dan Gohman03c3dc72010-06-18 15:56:31 +0000192 {
193 NamedRegionTimer T(DbgTimerName, DWARFGroupName, TimePassesIsEnabled);
Eric Christopherc4639d62012-11-19 22:42:15 +0000194 beginModule();
Torok Edwin9c421072010-04-07 10:44:46 +0000195 }
Bill Wendling0310d762009-05-15 09:23:25 +0000196}
197DwarfDebug::~DwarfDebug() {
Bill Wendling0310d762009-05-15 09:23:25 +0000198}
199
Eric Christopherb6dc8652012-11-27 22:43:45 +0000200// Switch to the specified MCSection and emit an assembler
201// temporary label to it if SymbolStem is specified.
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000202static MCSymbol *emitSectionSym(AsmPrinter *Asm, const MCSection *Section,
Eric Christopherd8a87522011-11-07 09:18:38 +0000203 const char *SymbolStem = 0) {
204 Asm->OutStreamer.SwitchSection(Section);
205 if (!SymbolStem) return 0;
206
207 MCSymbol *TmpSym = Asm->GetTempSymbol(SymbolStem);
208 Asm->OutStreamer.EmitLabel(TmpSym);
209 return TmpSym;
210}
211
Nick Lewycky390c40d2011-10-27 06:44:11 +0000212MCSymbol *DwarfDebug::getStringPool() {
213 return Asm->GetTempSymbol("section_str");
214}
215
Chris Lattnerbc733f52010-03-13 02:17:42 +0000216MCSymbol *DwarfDebug::getStringPoolEntry(StringRef Str) {
217 std::pair<MCSymbol*, unsigned> &Entry = StringPool[Str];
218 if (Entry.first) return Entry.first;
219
220 Entry.second = NextStringPoolNumber++;
Chris Lattnerc0215722010-04-04 19:25:43 +0000221 return Entry.first = Asm->GetTempSymbol("string", Entry.second);
Chris Lattnerbc733f52010-03-13 02:17:42 +0000222}
223
Eric Christopherb6dc8652012-11-27 22:43:45 +0000224// Define a unique number for the abbreviation.
225//
Devang Patel2c4ceb12009-11-21 02:48:08 +0000226void DwarfDebug::assignAbbrevNumber(DIEAbbrev &Abbrev) {
Bill Wendling0310d762009-05-15 09:23:25 +0000227 // Profile the node so that we can make it unique.
228 FoldingSetNodeID ID;
229 Abbrev.Profile(ID);
230
231 // Check the set for priors.
232 DIEAbbrev *InSet = AbbreviationsSet.GetOrInsertNode(&Abbrev);
233
234 // If it's newly added.
235 if (InSet == &Abbrev) {
236 // Add to abbreviation list.
237 Abbreviations.push_back(&Abbrev);
238
239 // Assign the vector position + 1 as its number.
240 Abbrev.setNumber(Abbreviations.size());
241 } else {
242 // Assign existing abbreviation number.
243 Abbrev.setNumber(InSet->getNumber());
244 }
245}
246
Eric Christopherb6dc8652012-11-27 22:43:45 +0000247// If special LLVM prefix that is used to inform the asm
248// printer to not emit usual symbol prefix before the symbol name is used then
249// return linkage name after skipping this special LLVM prefix.
Devang Patel351ca332010-01-05 01:46:14 +0000250static StringRef getRealLinkageName(StringRef LinkageName) {
251 char One = '\1';
252 if (LinkageName.startswith(StringRef(&One, 1)))
253 return LinkageName.substr(1);
254 return LinkageName;
255}
256
Eric Christopher0ffe2b42011-11-10 19:25:34 +0000257static bool isObjCClass(StringRef Name) {
258 return Name.startswith("+") || Name.startswith("-");
259}
260
261static bool hasObjCCategory(StringRef Name) {
262 if (!isObjCClass(Name)) return false;
263
264 size_t pos = Name.find(')');
265 if (pos != std::string::npos) {
266 if (Name[pos+1] != ' ') return false;
267 return true;
268 }
269 return false;
270}
271
272static void getObjCClassCategory(StringRef In, StringRef &Class,
273 StringRef &Category) {
274 if (!hasObjCCategory(In)) {
275 Class = In.slice(In.find('[') + 1, In.find(' '));
276 Category = "";
277 return;
278 }
279
280 Class = In.slice(In.find('[') + 1, In.find('('));
281 Category = In.slice(In.find('[') + 1, In.find(' '));
282 return;
283}
284
285static StringRef getObjCMethodName(StringRef In) {
286 return In.slice(In.find(' ') + 1, In.find(']'));
287}
288
289// Add the various names to the Dwarf accelerator table names.
290static void addSubprogramNames(CompileUnit *TheCU, DISubprogram SP,
291 DIE* Die) {
292 if (!SP.isDefinition()) return;
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000293
Eric Christopher0ffe2b42011-11-10 19:25:34 +0000294 TheCU->addAccelName(SP.getName(), Die);
295
296 // If the linkage name is different than the name, go ahead and output
297 // that as well into the name table.
298 if (SP.getLinkageName() != "" && SP.getName() != SP.getLinkageName())
299 TheCU->addAccelName(SP.getLinkageName(), Die);
300
301 // If this is an Objective-C selector name add it to the ObjC accelerator
302 // too.
303 if (isObjCClass(SP.getName())) {
304 StringRef Class, Category;
305 getObjCClassCategory(SP.getName(), Class, Category);
306 TheCU->addAccelObjC(Class, Die);
307 if (Category != "")
308 TheCU->addAccelObjC(Category, Die);
309 // Also add the base method name to the name table.
310 TheCU->addAccelName(getObjCMethodName(SP.getName()), Die);
311 }
312}
313
Eric Christopherb6dc8652012-11-27 22:43:45 +0000314// Find DIE for the given subprogram and attach appropriate DW_AT_low_pc
315// and DW_AT_high_pc attributes. If there are global variables in this
316// scope then create and insert DIEs for these variables.
Devang Pateld3024342011-08-15 22:24:32 +0000317DIE *DwarfDebug::updateSubprogramScopeDIE(CompileUnit *SPCU,
318 const MDNode *SPNode) {
Devang Patel163a9f72010-05-10 22:49:55 +0000319 DIE *SPDie = SPCU->getDIE(SPNode);
Devang Patel8aa61472010-07-07 22:20:57 +0000320
Chris Lattnerd38fee82010-04-05 00:13:49 +0000321 assert(SPDie && "Unable to find subprogram DIE!");
322 DISubprogram SP(SPNode);
Jim Grosbach1e20b962010-07-21 21:21:52 +0000323
Bill Wendling168c1902012-11-07 05:19:04 +0000324 // If we're updating an abstract DIE, then we will be adding the children and
325 // object pointer later on. But what we don't want to do is process the
326 // concrete DIE twice.
Devang Patel8aa61472010-07-07 22:20:57 +0000327 if (DIE *AbsSPDIE = AbstractSPDies.lookup(SPNode)) {
Bill Wendling168c1902012-11-07 05:19:04 +0000328 // Pick up abstract subprogram DIE.
Devang Patel8aa61472010-07-07 22:20:57 +0000329 SPDie = new DIE(dwarf::DW_TAG_subprogram);
Devang Patel3cbee302011-04-12 22:53:02 +0000330 SPCU->addDIEEntry(SPDie, dwarf::DW_AT_abstract_origin,
331 dwarf::DW_FORM_ref4, AbsSPDIE);
Devang Patel8aa61472010-07-07 22:20:57 +0000332 SPCU->addDie(SPDie);
Bill Wendlinga4c76932012-11-07 04:42:18 +0000333 } else {
334 DISubprogram SPDecl = SP.getFunctionDeclaration();
335 if (!SPDecl.isSubprogram()) {
336 // There is not any need to generate specification DIE for a function
337 // defined at compile unit level. If a function is defined inside another
338 // function then gdb prefers the definition at top level and but does not
339 // expect specification DIE in parent function. So avoid creating
340 // specification DIE for a function defined inside a function.
341 if (SP.isDefinition() && !SP.getContext().isCompileUnit() &&
342 !SP.getContext().isFile() &&
343 !isSubprogramContext(SP.getContext())) {
344 SPCU->addFlag(SPDie, dwarf::DW_AT_declaration);
345
346 // Add arguments.
347 DICompositeType SPTy = SP.getType();
348 DIArray Args = SPTy.getTypeArray();
349 unsigned SPTag = SPTy.getTag();
350 if (SPTag == dwarf::DW_TAG_subroutine_type)
351 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
352 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
353 DIType ATy = DIType(Args.getElement(i));
354 SPCU->addType(Arg, ATy);
355 if (ATy.isArtificial())
356 SPCU->addFlag(Arg, dwarf::DW_AT_artificial);
357 if (ATy.isObjectPointer())
358 SPCU->addDIEEntry(SPDie, dwarf::DW_AT_object_pointer,
359 dwarf::DW_FORM_ref4, Arg);
360 SPDie->addChild(Arg);
361 }
362 DIE *SPDeclDie = SPDie;
363 SPDie = new DIE(dwarf::DW_TAG_subprogram);
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000364 SPCU->addDIEEntry(SPDie, dwarf::DW_AT_specification,
365 dwarf::DW_FORM_ref4, SPDeclDie);
Bill Wendlinga4c76932012-11-07 04:42:18 +0000366 SPCU->addDie(SPDie);
367 }
368 }
Devang Patel8aa61472010-07-07 22:20:57 +0000369 }
370
Devang Patel3cbee302011-04-12 22:53:02 +0000371 SPCU->addLabel(SPDie, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
372 Asm->GetTempSymbol("func_begin", Asm->getFunctionNumber()));
373 SPCU->addLabel(SPDie, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
374 Asm->GetTempSymbol("func_end", Asm->getFunctionNumber()));
Chris Lattnerd38fee82010-04-05 00:13:49 +0000375 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
376 MachineLocation Location(RI->getFrameRegister(*Asm->MF));
Devang Patel3cbee302011-04-12 22:53:02 +0000377 SPCU->addAddress(SPDie, dwarf::DW_AT_frame_base, Location);
Devang Patelb4645642010-02-06 01:02:37 +0000378
Eric Christopher0ffe2b42011-11-10 19:25:34 +0000379 // Add name to the name table, we do this here because we're guaranteed
380 // to have concrete versions of our DW_TAG_subprogram nodes.
381 addSubprogramNames(SPCU, SP, SPDie);
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000382
Chris Lattnerd38fee82010-04-05 00:13:49 +0000383 return SPDie;
Devang Patel53bb5c92009-11-10 23:06:00 +0000384}
385
Eric Christopherb6dc8652012-11-27 22:43:45 +0000386// Construct new DW_TAG_lexical_block for this scope and attach
387// DW_AT_low_pc/DW_AT_high_pc labels.
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000388DIE *DwarfDebug::constructLexicalScopeDIE(CompileUnit *TheCU,
Devang Pateld3024342011-08-15 22:24:32 +0000389 LexicalScope *Scope) {
Devang Pateleac9c072010-04-27 19:46:33 +0000390 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_lexical_block);
391 if (Scope->isAbstractScope())
392 return ScopeDIE;
393
Devang Patelbf47fdb2011-08-10 20:55:27 +0000394 const SmallVector<InsnRange, 4> &Ranges = Scope->getRanges();
Devang Pateleac9c072010-04-27 19:46:33 +0000395 if (Ranges.empty())
396 return 0;
397
Devang Patelbf47fdb2011-08-10 20:55:27 +0000398 SmallVector<InsnRange, 4>::const_iterator RI = Ranges.begin();
Devang Pateleac9c072010-04-27 19:46:33 +0000399 if (Ranges.size() > 1) {
400 // .debug_range section has not been laid out yet. Emit offset in
Jim Grosbach1e20b962010-07-21 21:21:52 +0000401 // .debug_range as a uint, size 4, for now. emitDIE will handle
Devang Pateleac9c072010-04-27 19:46:33 +0000402 // DW_AT_ranges appropriately.
Devang Patel3cbee302011-04-12 22:53:02 +0000403 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_ranges, dwarf::DW_FORM_data4,
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000404 DebugRangeSymbols.size()
Chandler Carruth426c2bf2012-11-01 09:14:31 +0000405 * Asm->getDataLayout().getPointerSize());
Devang Patelbf47fdb2011-08-10 20:55:27 +0000406 for (SmallVector<InsnRange, 4>::const_iterator RI = Ranges.begin(),
Devang Pateleac9c072010-04-27 19:46:33 +0000407 RE = Ranges.end(); RI != RE; ++RI) {
Devang Patelc3f5f782010-05-25 23:40:22 +0000408 DebugRangeSymbols.push_back(getLabelBeforeInsn(RI->first));
409 DebugRangeSymbols.push_back(getLabelAfterInsn(RI->second));
Devang Pateleac9c072010-04-27 19:46:33 +0000410 }
411 DebugRangeSymbols.push_back(NULL);
412 DebugRangeSymbols.push_back(NULL);
413 return ScopeDIE;
414 }
415
Devang Patelc3f5f782010-05-25 23:40:22 +0000416 const MCSymbol *Start = getLabelBeforeInsn(RI->first);
417 const MCSymbol *End = getLabelAfterInsn(RI->second);
Devang Pateleac9c072010-04-27 19:46:33 +0000418
Devang Patelc3f5f782010-05-25 23:40:22 +0000419 if (End == 0) return 0;
Devang Patel53bb5c92009-11-10 23:06:00 +0000420
Chris Lattnerb7db7332010-03-09 01:58:53 +0000421 assert(Start->isDefined() && "Invalid starting label for an inlined scope!");
422 assert(End->isDefined() && "Invalid end label for an inlined scope!");
Jim Grosbach1e20b962010-07-21 21:21:52 +0000423
Devang Patel3cbee302011-04-12 22:53:02 +0000424 TheCU->addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, Start);
425 TheCU->addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr, End);
Devang Patel53bb5c92009-11-10 23:06:00 +0000426
427 return ScopeDIE;
428}
429
Eric Christopherb6dc8652012-11-27 22:43:45 +0000430// This scope represents inlined body of a function. Construct DIE to
431// represent this concrete inlined copy of the function.
Devang Pateld3024342011-08-15 22:24:32 +0000432DIE *DwarfDebug::constructInlinedScopeDIE(CompileUnit *TheCU,
433 LexicalScope *Scope) {
Devang Patelbf47fdb2011-08-10 20:55:27 +0000434 const SmallVector<InsnRange, 4> &Ranges = Scope->getRanges();
Nick Lewycky746cb672011-10-26 22:55:33 +0000435 assert(Ranges.empty() == false &&
436 "LexicalScope does not have instruction markers!");
Devang Pateleac9c072010-04-27 19:46:33 +0000437
Devang Patel26a92002011-07-27 00:34:13 +0000438 if (!Scope->getScopeNode())
439 return NULL;
440 DIScope DS(Scope->getScopeNode());
441 DISubprogram InlinedSP = getDISubprogram(DS);
Devang Patel26a92002011-07-27 00:34:13 +0000442 DIE *OriginDIE = TheCU->getDIE(InlinedSP);
443 if (!OriginDIE) {
Bill Wendlinge0aae5b2012-10-30 17:51:02 +0000444 DEBUG(dbgs() << "Unable to find original DIE for an inlined subprogram.");
Devang Patel26a92002011-07-27 00:34:13 +0000445 return NULL;
446 }
447
Devang Patelbf47fdb2011-08-10 20:55:27 +0000448 SmallVector<InsnRange, 4>::const_iterator RI = Ranges.begin();
Devang Patelc3f5f782010-05-25 23:40:22 +0000449 const MCSymbol *StartLabel = getLabelBeforeInsn(RI->first);
450 const MCSymbol *EndLabel = getLabelAfterInsn(RI->second);
Devang Pateleac9c072010-04-27 19:46:33 +0000451
Devang Patel0afbf232010-07-08 22:39:20 +0000452 if (StartLabel == 0 || EndLabel == 0) {
Bill Wendlinge0aae5b2012-10-30 17:51:02 +0000453 llvm_unreachable("Unexpected Start and End labels for an inlined scope!");
Devang Pateleac9c072010-04-27 19:46:33 +0000454 }
Chris Lattnerb7db7332010-03-09 01:58:53 +0000455 assert(StartLabel->isDefined() &&
Chris Lattnera34ec2292010-03-09 01:51:43 +0000456 "Invalid starting label for an inlined scope!");
Chris Lattnerb7db7332010-03-09 01:58:53 +0000457 assert(EndLabel->isDefined() &&
Chris Lattnera34ec2292010-03-09 01:51:43 +0000458 "Invalid end label for an inlined scope!");
Devang Pateleac9c072010-04-27 19:46:33 +0000459
Devang Pateld96efb82011-05-05 17:54:26 +0000460 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_inlined_subroutine);
Devang Patel3cbee302011-04-12 22:53:02 +0000461 TheCU->addDIEEntry(ScopeDIE, dwarf::DW_AT_abstract_origin,
462 dwarf::DW_FORM_ref4, OriginDIE);
Devang Patel53bb5c92009-11-10 23:06:00 +0000463
Devang Patel26a92002011-07-27 00:34:13 +0000464 if (Ranges.size() > 1) {
465 // .debug_range section has not been laid out yet. Emit offset in
466 // .debug_range as a uint, size 4, for now. emitDIE will handle
467 // DW_AT_ranges appropriately.
468 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_ranges, dwarf::DW_FORM_data4,
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000469 DebugRangeSymbols.size()
Chandler Carruth426c2bf2012-11-01 09:14:31 +0000470 * Asm->getDataLayout().getPointerSize());
Devang Patelbf47fdb2011-08-10 20:55:27 +0000471 for (SmallVector<InsnRange, 4>::const_iterator RI = Ranges.begin(),
Devang Patel26a92002011-07-27 00:34:13 +0000472 RE = Ranges.end(); RI != RE; ++RI) {
473 DebugRangeSymbols.push_back(getLabelBeforeInsn(RI->first));
474 DebugRangeSymbols.push_back(getLabelAfterInsn(RI->second));
475 }
476 DebugRangeSymbols.push_back(NULL);
477 DebugRangeSymbols.push_back(NULL);
478 } else {
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000479 TheCU->addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
Devang Patel5bc942c2011-08-10 23:58:09 +0000480 StartLabel);
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000481 TheCU->addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
Devang Patel5bc942c2011-08-10 23:58:09 +0000482 EndLabel);
Devang Patel26a92002011-07-27 00:34:13 +0000483 }
Devang Patel53bb5c92009-11-10 23:06:00 +0000484
485 InlinedSubprogramDIEs.insert(OriginDIE);
486
487 // Track the start label for this inlined function.
Devang Patel26a92002011-07-27 00:34:13 +0000488 //.debug_inlined section specification does not clearly state how
489 // to emit inlined scope that is split into multiple instruction ranges.
490 // For now, use first instruction range and emit low_pc/high_pc pair and
491 // corresponding .debug_inlined section entry for this pair.
Devang Patele9f8f5e2010-05-07 20:54:48 +0000492 DenseMap<const MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator
Devang Patel2db49d72010-05-07 18:11:54 +0000493 I = InlineInfo.find(InlinedSP);
Devang Patel53bb5c92009-11-10 23:06:00 +0000494
495 if (I == InlineInfo.end()) {
Nick Lewycky746cb672011-10-26 22:55:33 +0000496 InlineInfo[InlinedSP].push_back(std::make_pair(StartLabel, ScopeDIE));
Devang Patel2db49d72010-05-07 18:11:54 +0000497 InlinedSPNodes.push_back(InlinedSP);
Devang Patel53bb5c92009-11-10 23:06:00 +0000498 } else
Chris Lattner6ed0f902010-03-09 00:31:02 +0000499 I->second.push_back(std::make_pair(StartLabel, ScopeDIE));
Devang Patel53bb5c92009-11-10 23:06:00 +0000500
Devang Patel53bb5c92009-11-10 23:06:00 +0000501 DILocation DL(Scope->getInlinedAt());
Eric Christopher08212002012-03-26 21:38:38 +0000502 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_call_file, 0,
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000503 getOrCreateSourceID(DL.getFilename(), DL.getDirectory()));
Devang Patel3cbee302011-04-12 22:53:02 +0000504 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_call_line, 0, DL.getLineNumber());
Devang Patel53bb5c92009-11-10 23:06:00 +0000505
Eric Christopher309bedd2011-12-04 06:02:38 +0000506 // Add name to the name table, we do this here because we're guaranteed
507 // to have concrete versions of our DW_TAG_inlined_subprogram nodes.
508 addSubprogramNames(TheCU, InlinedSP, ScopeDIE);
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000509
Devang Patel53bb5c92009-11-10 23:06:00 +0000510 return ScopeDIE;
511}
512
Eric Christopherb6dc8652012-11-27 22:43:45 +0000513// Construct a DIE for this scope.
Devang Pateld0b5a5e2011-08-15 22:04:40 +0000514DIE *DwarfDebug::constructScopeDIE(CompileUnit *TheCU, LexicalScope *Scope) {
Devang Patel3c91b052010-03-08 20:52:55 +0000515 if (!Scope || !Scope->getScopeNode())
516 return NULL;
Jim Grosbach1e20b962010-07-21 21:21:52 +0000517
Nick Lewycky746cb672011-10-26 22:55:33 +0000518 SmallVector<DIE *, 8> Children;
Eric Christophere5212782012-09-12 23:36:19 +0000519 DIE *ObjectPointer = NULL;
Devang Patel0478c152011-03-01 22:58:55 +0000520
521 // Collect arguments for current function.
Devang Patelbf47fdb2011-08-10 20:55:27 +0000522 if (LScopes.isCurrentFunctionScope(Scope))
Devang Patel0478c152011-03-01 22:58:55 +0000523 for (unsigned i = 0, N = CurrentFnArguments.size(); i < N; ++i)
524 if (DbgVariable *ArgDV = CurrentFnArguments[i])
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000525 if (DIE *Arg =
Eric Christophere5212782012-09-12 23:36:19 +0000526 TheCU->constructVariableDIE(ArgDV, Scope->isAbstractScope())) {
Devang Patel0478c152011-03-01 22:58:55 +0000527 Children.push_back(Arg);
Eric Christophere5212782012-09-12 23:36:19 +0000528 if (ArgDV->isObjectPointer()) ObjectPointer = Arg;
529 }
Devang Patel0478c152011-03-01 22:58:55 +0000530
Eric Christopher1aeb7ac2011-10-03 15:49:16 +0000531 // Collect lexical scope children first.
Devang Patelbf47fdb2011-08-10 20:55:27 +0000532 const SmallVector<DbgVariable *, 8> &Variables = ScopeVariables.lookup(Scope);
Devang Patel5bc9fec2011-02-19 01:31:27 +0000533 for (unsigned i = 0, N = Variables.size(); i < N; ++i)
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000534 if (DIE *Variable =
Eric Christopher7b451cf2012-09-21 22:18:52 +0000535 TheCU->constructVariableDIE(Variables[i], Scope->isAbstractScope())) {
Devang Patel5bc9fec2011-02-19 01:31:27 +0000536 Children.push_back(Variable);
Eric Christopher7b451cf2012-09-21 22:18:52 +0000537 if (Variables[i]->isObjectPointer()) ObjectPointer = Variable;
538 }
Devang Patelbf47fdb2011-08-10 20:55:27 +0000539 const SmallVector<LexicalScope *, 4> &Scopes = Scope->getChildren();
Devang Patel5bc9fec2011-02-19 01:31:27 +0000540 for (unsigned j = 0, M = Scopes.size(); j < M; ++j)
Devang Pateld0b5a5e2011-08-15 22:04:40 +0000541 if (DIE *Nested = constructScopeDIE(TheCU, Scopes[j]))
Devang Patel5bc9fec2011-02-19 01:31:27 +0000542 Children.push_back(Nested);
Devang Patel3c91b052010-03-08 20:52:55 +0000543 DIScope DS(Scope->getScopeNode());
544 DIE *ScopeDIE = NULL;
545 if (Scope->getInlinedAt())
Devang Pateld3024342011-08-15 22:24:32 +0000546 ScopeDIE = constructInlinedScopeDIE(TheCU, Scope);
Devang Patel3c91b052010-03-08 20:52:55 +0000547 else if (DS.isSubprogram()) {
Devang Patel0dd45582010-06-28 20:53:04 +0000548 ProcessedSPNodes.insert(DS);
Devang Patel8aa61472010-07-07 22:20:57 +0000549 if (Scope->isAbstractScope()) {
Devang Pateld3024342011-08-15 22:24:32 +0000550 ScopeDIE = TheCU->getDIE(DS);
Devang Patel8aa61472010-07-07 22:20:57 +0000551 // Note down abstract DIE.
552 if (ScopeDIE)
553 AbstractSPDies.insert(std::make_pair(DS, ScopeDIE));
554 }
Devang Patel3c91b052010-03-08 20:52:55 +0000555 else
Devang Pateld3024342011-08-15 22:24:32 +0000556 ScopeDIE = updateSubprogramScopeDIE(TheCU, DS);
Devang Patel3c91b052010-03-08 20:52:55 +0000557 }
Devang Patel5bc9fec2011-02-19 01:31:27 +0000558 else {
559 // There is no need to emit empty lexical block DIE.
560 if (Children.empty())
561 return NULL;
Devang Pateld3024342011-08-15 22:24:32 +0000562 ScopeDIE = constructLexicalScopeDIE(TheCU, Scope);
Devang Patel5bc9fec2011-02-19 01:31:27 +0000563 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000564
Devang Patelaead63c2010-03-29 22:59:58 +0000565 if (!ScopeDIE) return NULL;
Jim Grosbach1e20b962010-07-21 21:21:52 +0000566
Devang Patel5bc9fec2011-02-19 01:31:27 +0000567 // Add children
568 for (SmallVector<DIE *, 8>::iterator I = Children.begin(),
569 E = Children.end(); I != E; ++I)
570 ScopeDIE->addChild(*I);
Devang Patel193f7202009-11-24 01:14:22 +0000571
Eric Christophere5212782012-09-12 23:36:19 +0000572 if (DS.isSubprogram() && ObjectPointer != NULL)
573 TheCU->addDIEEntry(ScopeDIE, dwarf::DW_AT_object_pointer,
574 dwarf::DW_FORM_ref4, ObjectPointer);
575
Jim Grosbach1e20b962010-07-21 21:21:52 +0000576 if (DS.isSubprogram())
Eric Christopher0ffe2b42011-11-10 19:25:34 +0000577 TheCU->addPubTypes(DISubprogram(DS));
Jim Grosbach1e20b962010-07-21 21:21:52 +0000578
Eric Christopher0ffe2b42011-11-10 19:25:34 +0000579 return ScopeDIE;
Devang Patel53bb5c92009-11-10 23:06:00 +0000580}
581
Eric Christopherb6dc8652012-11-27 22:43:45 +0000582// Look up the source id with the given directory and source file names.
583// If none currently exists, create a new id and insert it in the
584// SourceIds map. This can update DirectoryNames and SourceFileNames maps
585// as well.
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000586unsigned DwarfDebug::getOrCreateSourceID(StringRef FileName,
Devang Patel23670e52011-03-24 20:30:50 +0000587 StringRef DirName) {
Devang Patel1905a182010-09-16 20:57:49 +0000588 // If FE did not provide a file name, then assume stdin.
589 if (FileName.empty())
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000590 return getOrCreateSourceID("<stdin>", StringRef());
Devang Patel23670e52011-03-24 20:30:50 +0000591
Nick Lewycky6c1a7032011-11-02 20:55:33 +0000592 // TODO: this might not belong here. See if we can factor this better.
593 if (DirName == CompilationDir)
594 DirName = "";
595
Nick Lewycky44d798d2011-10-17 23:05:28 +0000596 unsigned SrcId = SourceIdMap.size()+1;
Devang Patel1905a182010-09-16 20:57:49 +0000597
Benjamin Kramer74612c22012-03-11 14:56:26 +0000598 // We look up the file/dir pair by concatenating them with a zero byte.
599 SmallString<128> NamePair;
600 NamePair += DirName;
601 NamePair += '\0'; // Zero bytes are not allowed in paths.
602 NamePair += FileName;
603
604 StringMapEntry<unsigned> &Ent = SourceIdMap.GetOrCreateValue(NamePair, SrcId);
605 if (Ent.getValue() != SrcId)
606 return Ent.getValue();
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000607
Rafael Espindola5c055632010-11-18 02:04:25 +0000608 // Print out a .file directive to specify files for .loc directives.
Benjamin Kramer74612c22012-03-11 14:56:26 +0000609 Asm->OutStreamer.EmitDwarfFileDirective(SrcId, DirName, FileName);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000610
611 return SrcId;
612}
613
Eric Christopherb6dc8652012-11-27 22:43:45 +0000614// Create new CompileUnit for the given metadata node with tag DW_TAG_compile_unit.
Devang Patel94c7ddb2011-08-16 22:09:43 +0000615CompileUnit *DwarfDebug::constructCompileUnit(const MDNode *N) {
Devang Patele4b27562009-08-28 23:24:31 +0000616 DICompileUnit DIUnit(N);
Devang Patel65dbc902009-11-25 17:36:49 +0000617 StringRef FN = DIUnit.getFilename();
Nick Lewycky6c1a7032011-11-02 20:55:33 +0000618 CompilationDir = DIUnit.getDirectory();
Eli Benderskyd4a05e02012-12-03 18:45:45 +0000619 // Call this to emit a .file directive if it wasn't emitted for the source
620 // file this CU comes from yet.
621 getOrCreateSourceID(FN, CompilationDir);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000622
623 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
Eli Benderskyd4a05e02012-12-03 18:45:45 +0000624 CompileUnit *NewCU = new CompileUnit(GlobalCUIndexCount++,
625 DIUnit.getLanguage(), Die, Asm, this);
Nick Lewycky390c40d2011-10-27 06:44:11 +0000626 NewCU->addString(Die, dwarf::DW_AT_producer, DIUnit.getProducer());
Devang Patel3cbee302011-04-12 22:53:02 +0000627 NewCU->addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data2,
628 DIUnit.getLanguage());
Nick Lewycky390c40d2011-10-27 06:44:11 +0000629 NewCU->addString(Die, dwarf::DW_AT_name, FN);
Eric Christopher6635cad2012-08-01 18:19:01 +0000630 // 2.17.1 requires that we use DW_AT_low_pc for a single entry point
631 // into an entity.
632 NewCU->addUInt(Die, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, 0);
Devang Patel4a602ca2010-03-22 23:11:36 +0000633 // DW_AT_stmt_list is a offset of line number information for this
Devang Patelaf608bd2010-08-24 00:06:12 +0000634 // compile unit in debug_line section.
Rafael Espindola2241e512012-06-22 13:24:07 +0000635 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
Rafael Espindola597a7662011-05-04 17:44:06 +0000636 NewCU->addLabel(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4,
Devang Patel3cbee302011-04-12 22:53:02 +0000637 Asm->GetTempSymbol("section_line"));
Devang Patelae84d5b2010-08-31 23:50:19 +0000638 else
Devang Patel3cbee302011-04-12 22:53:02 +0000639 NewCU->addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4, 0);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000640
Nick Lewycky6c1a7032011-11-02 20:55:33 +0000641 if (!CompilationDir.empty())
642 NewCU->addString(Die, dwarf::DW_AT_comp_dir, CompilationDir);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000643 if (DIUnit.isOptimized())
Eric Christopher873cf0a2012-08-24 01:14:27 +0000644 NewCU->addFlag(Die, dwarf::DW_AT_APPLE_optimized);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000645
Devang Patel65dbc902009-11-25 17:36:49 +0000646 StringRef Flags = DIUnit.getFlags();
647 if (!Flags.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +0000648 NewCU->addString(Die, dwarf::DW_AT_APPLE_flags, Flags);
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000649
Nick Lewyckyd5d52132011-10-17 23:27:36 +0000650 if (unsigned RVer = DIUnit.getRunTimeVersion())
Devang Patel3cbee302011-04-12 22:53:02 +0000651 NewCU->addUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers,
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000652 dwarf::DW_FORM_data1, RVer);
653
Devang Patel163a9f72010-05-10 22:49:55 +0000654 if (!FirstCU)
655 FirstCU = NewCU;
Eric Christopher4daaed12012-12-10 19:51:21 +0000656 if (useSplitDwarf() && !SkeletonCU)
657 SkeletonCU = constructSkeletonCU(N);
Eric Christopher98e237f2012-11-30 23:59:06 +0000658
Devang Patel163a9f72010-05-10 22:49:55 +0000659 CUMap.insert(std::make_pair(N, NewCU));
Devang Patel94c7ddb2011-08-16 22:09:43 +0000660 return NewCU;
Devang Patel163a9f72010-05-10 22:49:55 +0000661}
662
Eric Christopherb6dc8652012-11-27 22:43:45 +0000663// Construct subprogram DIE.
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000664void DwarfDebug::constructSubprogramDIE(CompileUnit *TheCU,
Devang Patel3655a212011-08-15 23:36:40 +0000665 const MDNode *N) {
Rafael Espindolab0527282011-11-04 19:00:29 +0000666 CompileUnit *&CURef = SPMap[N];
667 if (CURef)
668 return;
669 CURef = TheCU;
670
Devang Patele4b27562009-08-28 23:24:31 +0000671 DISubprogram SP(N);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000672 if (!SP.isDefinition())
673 // This is a method declaration which will be handled while constructing
674 // class type.
Devang Patel13e16b62009-06-26 01:49:18 +0000675 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000676
Devang Pateldbc64af2011-08-15 17:24:54 +0000677 DIE *SubprogramDie = TheCU->getOrCreateSubprogramDIE(SP);
Stuart Hastings639336e2010-04-06 21:38:29 +0000678
679 // Add to map.
Devang Patel163a9f72010-05-10 22:49:55 +0000680 TheCU->insertDIE(N, SubprogramDie);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000681
682 // Add to context owner.
Devang Patel3cbee302011-04-12 22:53:02 +0000683 TheCU->addToContextOwner(SubprogramDie, SP.getContext());
Devang Patel0000fad2009-12-08 23:21:45 +0000684
Devang Patel13e16b62009-06-26 01:49:18 +0000685 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000686}
687
Eric Christopherb6dc8652012-11-27 22:43:45 +0000688// Collect debug info from named mdnodes such as llvm.dbg.enum and llvm.dbg.ty.
Eric Christopherc4639d62012-11-19 22:42:15 +0000689void DwarfDebug::collectInfoFromNamedMDNodes(const Module *M) {
Devang Patel94c7ddb2011-08-16 22:09:43 +0000690 if (NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.sp"))
691 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
692 const MDNode *N = NMD->getOperand(i);
693 if (CompileUnit *CU = CUMap.lookup(DISubprogram(N).getCompileUnit()))
694 constructSubprogramDIE(CU, N);
695 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000696
Devang Patel94c7ddb2011-08-16 22:09:43 +0000697 if (NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.gv"))
698 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
699 const MDNode *N = NMD->getOperand(i);
700 if (CompileUnit *CU = CUMap.lookup(DIGlobalVariable(N).getCompileUnit()))
Devang Patel28bea082011-08-18 23:17:55 +0000701 CU->createGlobalVariableDIE(N);
Devang Patel94c7ddb2011-08-16 22:09:43 +0000702 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000703
Devang Patel02e603f2011-08-15 23:47:24 +0000704 if (NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.enum"))
705 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
706 DIType Ty(NMD->getOperand(i));
Devang Patel94c7ddb2011-08-16 22:09:43 +0000707 if (CompileUnit *CU = CUMap.lookup(Ty.getCompileUnit()))
708 CU->getOrCreateTypeDIE(Ty);
Devang Patel02e603f2011-08-15 23:47:24 +0000709 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000710
Devang Patel02e603f2011-08-15 23:47:24 +0000711 if (NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.ty"))
712 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
713 DIType Ty(NMD->getOperand(i));
Devang Patel94c7ddb2011-08-16 22:09:43 +0000714 if (CompileUnit *CU = CUMap.lookup(Ty.getCompileUnit()))
715 CU->getOrCreateTypeDIE(Ty);
Devang Patel02e603f2011-08-15 23:47:24 +0000716 }
717}
718
Eric Christopherb6dc8652012-11-27 22:43:45 +0000719// Collect debug info using DebugInfoFinder.
720// FIXME - Remove this when dragonegg switches to DIBuilder.
Eric Christopherc4639d62012-11-19 22:42:15 +0000721bool DwarfDebug::collectLegacyDebugInfo(const Module *M) {
Devang Patel02e603f2011-08-15 23:47:24 +0000722 DebugInfoFinder DbgFinder;
723 DbgFinder.processModule(*M);
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000724
Devang Patel02e603f2011-08-15 23:47:24 +0000725 bool HasDebugInfo = false;
726 // Scan all the compile-units to see if there are any marked as the main
727 // unit. If not, we do not generate debug info.
728 for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
729 E = DbgFinder.compile_unit_end(); I != E; ++I) {
730 if (DICompileUnit(*I).isMain()) {
731 HasDebugInfo = true;
732 break;
733 }
734 }
735 if (!HasDebugInfo) return false;
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000736
Devang Patel02e603f2011-08-15 23:47:24 +0000737 // Create all the compile unit DIEs.
738 for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
739 E = DbgFinder.compile_unit_end(); I != E; ++I)
740 constructCompileUnit(*I);
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000741
Devang Patel02e603f2011-08-15 23:47:24 +0000742 // Create DIEs for each global variable.
743 for (DebugInfoFinder::iterator I = DbgFinder.global_variable_begin(),
744 E = DbgFinder.global_variable_end(); I != E; ++I) {
745 const MDNode *N = *I;
Devang Patel94c7ddb2011-08-16 22:09:43 +0000746 if (CompileUnit *CU = CUMap.lookup(DIGlobalVariable(N).getCompileUnit()))
Devang Patel28bea082011-08-18 23:17:55 +0000747 CU->createGlobalVariableDIE(N);
Devang Patel02e603f2011-08-15 23:47:24 +0000748 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000749
Devang Patel02e603f2011-08-15 23:47:24 +0000750 // Create DIEs for each subprogram.
751 for (DebugInfoFinder::iterator I = DbgFinder.subprogram_begin(),
752 E = DbgFinder.subprogram_end(); I != E; ++I) {
753 const MDNode *N = *I;
Devang Patel94c7ddb2011-08-16 22:09:43 +0000754 if (CompileUnit *CU = CUMap.lookup(DISubprogram(N).getCompileUnit()))
755 constructSubprogramDIE(CU, N);
Devang Patel02e603f2011-08-15 23:47:24 +0000756 }
757
758 return HasDebugInfo;
759}
760
Eric Christopherb6dc8652012-11-27 22:43:45 +0000761// Emit all Dwarf sections that should come prior to the content. Create
762// global DIEs and emit initial debug info sections. This is invoked by
763// the target AsmPrinter.
Eric Christopherc4639d62012-11-19 22:42:15 +0000764void DwarfDebug::beginModule() {
Devang Pateleac9c072010-04-27 19:46:33 +0000765 if (DisableDebugInfoPrinting)
766 return;
767
Eric Christopherc4639d62012-11-19 22:42:15 +0000768 const Module *M = MMI->getModule();
769
Nick Lewycky3bbb6f72011-07-29 03:49:23 +0000770 // If module has named metadata anchors then use them, otherwise scan the
771 // module using debug info finder to collect debug info.
Devang Patel30692ab2011-05-03 16:45:22 +0000772 NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu");
773 if (CU_Nodes) {
Devang Patel94c7ddb2011-08-16 22:09:43 +0000774 for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i) {
775 DICompileUnit CUNode(CU_Nodes->getOperand(i));
776 CompileUnit *CU = constructCompileUnit(CUNode);
777 DIArray GVs = CUNode.getGlobalVariables();
778 for (unsigned i = 0, e = GVs.getNumElements(); i != e; ++i)
Devang Patel28bea082011-08-18 23:17:55 +0000779 CU->createGlobalVariableDIE(GVs.getElement(i));
Devang Patel94c7ddb2011-08-16 22:09:43 +0000780 DIArray SPs = CUNode.getSubprograms();
781 for (unsigned i = 0, e = SPs.getNumElements(); i != e; ++i)
782 constructSubprogramDIE(CU, SPs.getElement(i));
783 DIArray EnumTypes = CUNode.getEnumTypes();
784 for (unsigned i = 0, e = EnumTypes.getNumElements(); i != e; ++i)
785 CU->getOrCreateTypeDIE(EnumTypes.getElement(i));
786 DIArray RetainedTypes = CUNode.getRetainedTypes();
787 for (unsigned i = 0, e = RetainedTypes.getNumElements(); i != e; ++i)
788 CU->getOrCreateTypeDIE(RetainedTypes.getElement(i));
789 }
Devang Patel02e603f2011-08-15 23:47:24 +0000790 } else if (!collectLegacyDebugInfo(M))
791 return;
Devang Patel30692ab2011-05-03 16:45:22 +0000792
Devang Patel02e603f2011-08-15 23:47:24 +0000793 collectInfoFromNamedMDNodes(M);
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000794
Chris Lattnerd850ac72010-04-05 02:19:28 +0000795 // Tell MMI that we have debug info.
796 MMI->setDebugInfoAvailability(true);
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000797
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000798 // Prime section data.
Chris Lattnerf0144122009-07-28 03:13:23 +0000799 SectionMap.insert(Asm->getObjFileLowering().getTextSection());
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000800}
801
Eric Christopher4117bec2012-11-22 00:59:49 +0000802// Attach DW_AT_inline attribute with inlined subprogram DIEs.
803void DwarfDebug::computeInlinedDIEs() {
Devang Patel53bb5c92009-11-10 23:06:00 +0000804 // Attach DW_AT_inline attribute with inlined subprogram DIEs.
805 for (SmallPtrSet<DIE *, 4>::iterator AI = InlinedSubprogramDIEs.begin(),
Eric Christopherbdab8002012-11-27 00:13:51 +0000806 AE = InlinedSubprogramDIEs.end(); AI != AE; ++AI) {
Devang Patel53bb5c92009-11-10 23:06:00 +0000807 DIE *ISP = *AI;
Devang Patel3cbee302011-04-12 22:53:02 +0000808 FirstCU->addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
Devang Patel53bb5c92009-11-10 23:06:00 +0000809 }
Rafael Espindolad1ac3a42011-11-12 01:57:54 +0000810 for (DenseMap<const MDNode *, DIE *>::iterator AI = AbstractSPDies.begin(),
Eric Christopherbdab8002012-11-27 00:13:51 +0000811 AE = AbstractSPDies.end(); AI != AE; ++AI) {
Rafael Espindolad1ac3a42011-11-12 01:57:54 +0000812 DIE *ISP = AI->second;
813 if (InlinedSubprogramDIEs.count(ISP))
814 continue;
815 FirstCU->addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
816 }
Eric Christopher4117bec2012-11-22 00:59:49 +0000817}
818
819// Collect info for variables that were optimized out.
820void DwarfDebug::collectDeadVariables() {
821 const Module *M = MMI->getModule();
822 DenseMap<const MDNode *, LexicalScope *> DeadFnScopeMap;
823
824 if (NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu")) {
825 for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i) {
826 DICompileUnit TheCU(CU_Nodes->getOperand(i));
827 DIArray Subprograms = TheCU.getSubprograms();
828 for (unsigned i = 0, e = Subprograms.getNumElements(); i != e; ++i) {
Eric Christopherbdab8002012-11-27 00:13:51 +0000829 DISubprogram SP(Subprograms.getElement(i));
830 if (ProcessedSPNodes.count(SP) != 0) continue;
831 if (!SP.Verify()) continue;
832 if (!SP.isDefinition()) continue;
833 DIArray Variables = SP.getVariables();
834 if (Variables.getNumElements() == 0) continue;
Eric Christopher4117bec2012-11-22 00:59:49 +0000835
Eric Christopherbdab8002012-11-27 00:13:51 +0000836 LexicalScope *Scope =
837 new LexicalScope(NULL, DIDescriptor(SP), NULL, false);
838 DeadFnScopeMap[SP] = Scope;
Eric Christopher4117bec2012-11-22 00:59:49 +0000839
Eric Christopherbdab8002012-11-27 00:13:51 +0000840 // Construct subprogram DIE and add variables DIEs.
841 CompileUnit *SPCU = CUMap.lookup(TheCU);
842 assert(SPCU && "Unable to find Compile Unit!");
843 constructSubprogramDIE(SPCU, SP);
844 DIE *ScopeDIE = SPCU->getDIE(SP);
845 for (unsigned vi = 0, ve = Variables.getNumElements(); vi != ve; ++vi) {
846 DIVariable DV(Variables.getElement(vi));
847 if (!DV.Verify()) continue;
848 DbgVariable *NewVar = new DbgVariable(DV, NULL);
849 if (DIE *VariableDIE =
850 SPCU->constructVariableDIE(NewVar, Scope->isAbstractScope()))
851 ScopeDIE->addChild(VariableDIE);
852 }
Eric Christopher4117bec2012-11-22 00:59:49 +0000853 }
854 }
855 }
856 DeleteContainerSeconds(DeadFnScopeMap);
857}
858
859void DwarfDebug::finalizeModuleInfo() {
860 // Collect info for variables that were optimized out.
861 collectDeadVariables();
862
863 // Attach DW_AT_inline attribute with inlined subprogram DIEs.
864 computeInlinedDIEs();
Devang Patel53bb5c92009-11-10 23:06:00 +0000865
Eric Christopher6635cad2012-08-01 18:19:01 +0000866 // Emit DW_AT_containing_type attribute to connect types with their
867 // vtable holding type.
Devang Pateldbc64af2011-08-15 17:24:54 +0000868 for (DenseMap<const MDNode *, CompileUnit *>::iterator CUI = CUMap.begin(),
Eric Christopherbdab8002012-11-27 00:13:51 +0000869 CUE = CUMap.end(); CUI != CUE; ++CUI) {
Devang Pateldbc64af2011-08-15 17:24:54 +0000870 CompileUnit *TheCU = CUI->second;
871 TheCU->constructContainingTypeDIEs();
Devang Patel5d11eb02009-12-03 19:11:07 +0000872 }
873
Eric Christopher4117bec2012-11-22 00:59:49 +0000874 // Compute DIE offsets and sizes.
875 computeSizeAndOffsets();
876}
877
878void DwarfDebug::endSections() {
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000879 // Standard sections final addresses.
Chris Lattner6c2f9e12009-08-19 05:49:37 +0000880 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getTextSection());
Chris Lattnerc0215722010-04-04 19:25:43 +0000881 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("text_end"));
Chris Lattner6c2f9e12009-08-19 05:49:37 +0000882 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getDataSection());
Chris Lattnerc0215722010-04-04 19:25:43 +0000883 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("data_end"));
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000884
885 // End text sections.
Benjamin Kramerb4c9d9c2012-10-31 13:45:49 +0000886 for (unsigned I = 0, E = SectionMap.size(); I != E; ++I) {
887 Asm->OutStreamer.SwitchSection(SectionMap[I]);
888 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("section_end", I+1));
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000889 }
Eric Christopher4117bec2012-11-22 00:59:49 +0000890}
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000891
Eric Christopherb6dc8652012-11-27 22:43:45 +0000892// Emit all Dwarf sections that should come after the content.
Eric Christopher4117bec2012-11-22 00:59:49 +0000893void DwarfDebug::endModule() {
894
895 if (!FirstCU) return;
896
897 // End any existing sections.
898 // TODO: Does this need to happen?
899 endSections();
900
901 // Finalize the debug info for the module.
902 finalizeModuleInfo();
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000903
Eric Christopher97c34722012-11-19 19:43:59 +0000904 // Emit initial sections.
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000905 emitSectionLabels();
Eric Christopher97c34722012-11-19 19:43:59 +0000906
Eric Christopher4daaed12012-12-10 19:51:21 +0000907 if (!useSplitDwarf()) {
Eric Christopher42885022012-11-27 22:43:42 +0000908 // Emit all the DIEs into a debug info section.
909 emitDebugInfo();
Eric Christopher74802f72012-11-27 00:41:54 +0000910
Eric Christopher42885022012-11-27 22:43:42 +0000911 // Corresponding abbreviations into a abbrev section.
912 emitAbbreviations();
913
914 // Emit info into a debug loc section.
915 emitDebugLoc();
916
917 // Emit info into a debug aranges section.
918 emitDebugARanges();
919
920 // Emit info into a debug ranges section.
921 emitDebugRanges();
922
923 // Emit info into a debug macinfo section.
924 emitDebugMacInfo();
925
926 // Emit inline info.
927 // TODO: When we don't need the option anymore we
928 // can remove all of the code that this section
929 // depends upon.
930 if (useDarwinGDBCompat())
931 emitDebugInlineInfo();
932 } else {
933 // TODO: Fill this in for Fission sections and separate
934 // out information into new sections.
935
Eric Christopher98e237f2012-11-30 23:59:06 +0000936 // Emit the debug info section and compile units.
Eric Christopher42885022012-11-27 22:43:42 +0000937 emitDebugInfo();
Eric Christopher98e237f2012-11-30 23:59:06 +0000938 emitDebugInfoDWO();
Eric Christopher42885022012-11-27 22:43:42 +0000939
940 // Corresponding abbreviations into a abbrev section.
941 emitAbbreviations();
942
943 // Emit info into a debug loc section.
944 emitDebugLoc();
945
946 // Emit info into a debug aranges section.
947 emitDebugARanges();
948
949 // Emit info into a debug ranges section.
950 emitDebugRanges();
951
952 // Emit info into a debug macinfo section.
953 emitDebugMacInfo();
954
955 // Emit inline info.
956 // TODO: When we don't need the option anymore we
957 // can remove all of the code that this section
958 // depends upon.
959 if (useDarwinGDBCompat())
960 emitDebugInlineInfo();
961 }
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000962
Eric Christopher9d9f5a52012-08-23 07:32:06 +0000963 // Emit info into the dwarf accelerator table sections.
Eric Christopher20f47ab2012-08-23 22:36:40 +0000964 if (useDwarfAccelTables()) {
Eric Christopher09ac3d82011-11-07 09:24:32 +0000965 emitAccelNames();
966 emitAccelObjC();
967 emitAccelNamespaces();
968 emitAccelTypes();
969 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000970
Devang Patel193f7202009-11-24 01:14:22 +0000971 // Emit info into a debug pubtypes section.
Eric Christopher360f0062012-08-23 07:10:56 +0000972 // TODO: When we don't need the option anymore we can
973 // remove all of the code that adds to the table.
Eric Christopher20f47ab2012-08-23 22:36:40 +0000974 if (useDarwinGDBCompat())
Eric Christopher360f0062012-08-23 07:10:56 +0000975 emitDebugPubTypes();
Devang Patel193f7202009-11-24 01:14:22 +0000976
Eric Christopher42885022012-11-27 22:43:42 +0000977 // Finally emit string information into a string table.
Eric Christopherfcdbecb2012-11-27 06:49:23 +0000978 emitDebugStr();
979
Devang Patele9a1cca2010-08-02 17:32:15 +0000980 // clean up.
Devang Patel94c7ddb2011-08-16 22:09:43 +0000981 SPMap.clear();
Devang Patel163a9f72010-05-10 22:49:55 +0000982 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
983 E = CUMap.end(); I != E; ++I)
984 delete I->second;
Eric Christopher9ec87b32012-12-10 19:51:18 +0000985
Eric Christopher4daaed12012-12-10 19:51:21 +0000986 delete SkeletonCU;
Eric Christopher9ec87b32012-12-10 19:51:18 +0000987
Eric Christopher98e237f2012-11-30 23:59:06 +0000988 // Reset these for the next Module if we have one.
989 FirstCU = NULL;
Eric Christopher4daaed12012-12-10 19:51:21 +0000990 SkeletonCU = NULL;
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000991}
992
Eric Christopherb6dc8652012-11-27 22:43:45 +0000993// Find abstract variable, if any, associated with Var.
Devang Patelb549bcf2011-08-10 21:50:54 +0000994DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &DV,
Chris Lattnerde4845c2010-04-02 19:42:39 +0000995 DebugLoc ScopeLoc) {
Devang Patelb549bcf2011-08-10 21:50:54 +0000996 LLVMContext &Ctx = DV->getContext();
997 // More then one inlined variable corresponds to one abstract variable.
998 DIVariable Var = cleanseInlinedVariable(DV, Ctx);
Devang Patel2db49d72010-05-07 18:11:54 +0000999 DbgVariable *AbsDbgVariable = AbstractVariables.lookup(Var);
Devang Patel53bb5c92009-11-10 23:06:00 +00001000 if (AbsDbgVariable)
1001 return AbsDbgVariable;
1002
Devang Patelbf47fdb2011-08-10 20:55:27 +00001003 LexicalScope *Scope = LScopes.findAbstractScope(ScopeLoc.getScope(Ctx));
Devang Patel53bb5c92009-11-10 23:06:00 +00001004 if (!Scope)
1005 return NULL;
1006
Devang Patel5a1a67c2011-08-15 19:01:20 +00001007 AbsDbgVariable = new DbgVariable(Var, NULL);
Devang Patelbf47fdb2011-08-10 20:55:27 +00001008 addScopeVariable(Scope, AbsDbgVariable);
Devang Patel2db49d72010-05-07 18:11:54 +00001009 AbstractVariables[Var] = AbsDbgVariable;
Devang Patel53bb5c92009-11-10 23:06:00 +00001010 return AbsDbgVariable;
1011}
1012
Eric Christopherb6dc8652012-11-27 22:43:45 +00001013// If Var is a current function argument then add it to CurrentFnArguments list.
Devang Patel0478c152011-03-01 22:58:55 +00001014bool DwarfDebug::addCurrentFnArgument(const MachineFunction *MF,
Devang Patelbf47fdb2011-08-10 20:55:27 +00001015 DbgVariable *Var, LexicalScope *Scope) {
1016 if (!LScopes.isCurrentFunctionScope(Scope))
Devang Patel0478c152011-03-01 22:58:55 +00001017 return false;
1018 DIVariable DV = Var->getVariable();
1019 if (DV.getTag() != dwarf::DW_TAG_arg_variable)
1020 return false;
1021 unsigned ArgNo = DV.getArgNumber();
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001022 if (ArgNo == 0)
Devang Patel0478c152011-03-01 22:58:55 +00001023 return false;
1024
Devang Patelcb3a6572011-03-03 20:02:02 +00001025 size_t Size = CurrentFnArguments.size();
1026 if (Size == 0)
Devang Patel0478c152011-03-01 22:58:55 +00001027 CurrentFnArguments.resize(MF->getFunction()->arg_size());
Devang Patelbbd0f452011-03-03 21:49:41 +00001028 // llvm::Function argument size is not good indicator of how many
Devang Patel6f676be2011-03-03 20:08:10 +00001029 // arguments does the function have at source level.
1030 if (ArgNo > Size)
Devang Patelcb3a6572011-03-03 20:02:02 +00001031 CurrentFnArguments.resize(ArgNo * 2);
Devang Patel0478c152011-03-01 22:58:55 +00001032 CurrentFnArguments[ArgNo - 1] = Var;
1033 return true;
1034}
1035
Eric Christopherb6dc8652012-11-27 22:43:45 +00001036// Collect variable information from side table maintained by MMI.
Jim Grosbach1e20b962010-07-21 21:21:52 +00001037void
Nick Lewycky3bbb6f72011-07-29 03:49:23 +00001038DwarfDebug::collectVariableInfoFromMMITable(const MachineFunction *MF,
Devang Patelee432862010-05-20 19:57:06 +00001039 SmallPtrSet<const MDNode *, 16> &Processed) {
Devang Patele717faa2009-10-06 01:26:37 +00001040 MachineModuleInfo::VariableDbgInfoMapTy &VMap = MMI->getVariableDbgInfo();
1041 for (MachineModuleInfo::VariableDbgInfoMapTy::iterator VI = VMap.begin(),
1042 VE = VMap.end(); VI != VE; ++VI) {
Devang Patele9f8f5e2010-05-07 20:54:48 +00001043 const MDNode *Var = VI->first;
Devang Patel53bb5c92009-11-10 23:06:00 +00001044 if (!Var) continue;
Devang Patel98e1cac2010-05-14 21:01:35 +00001045 Processed.insert(Var);
Chris Lattnerde4845c2010-04-02 19:42:39 +00001046 DIVariable DV(Var);
1047 const std::pair<unsigned, DebugLoc> &VP = VI->second;
Devang Patel53bb5c92009-11-10 23:06:00 +00001048
Devang Patelbf47fdb2011-08-10 20:55:27 +00001049 LexicalScope *Scope = LScopes.findLexicalScope(VP.second);
Jim Grosbach1e20b962010-07-21 21:21:52 +00001050
Devang Patelfb0ee432009-11-10 23:20:04 +00001051 // If variable scope is not found then skip this variable.
Chris Lattnerde4845c2010-04-02 19:42:39 +00001052 if (Scope == 0)
Devang Patelfb0ee432009-11-10 23:20:04 +00001053 continue;
Devang Patel53bb5c92009-11-10 23:06:00 +00001054
Devang Patel26c1e562010-05-20 16:36:41 +00001055 DbgVariable *AbsDbgVariable = findAbstractVariable(DV, VP.second);
Devang Patel5a1a67c2011-08-15 19:01:20 +00001056 DbgVariable *RegVar = new DbgVariable(DV, AbsDbgVariable);
Devang Patelff9dd0a2011-08-15 21:24:36 +00001057 RegVar->setFrameIndex(VP.first);
Devang Patel0478c152011-03-01 22:58:55 +00001058 if (!addCurrentFnArgument(MF, RegVar, Scope))
Devang Patelbf47fdb2011-08-10 20:55:27 +00001059 addScopeVariable(Scope, RegVar);
Devang Patel5a1a67c2011-08-15 19:01:20 +00001060 if (AbsDbgVariable)
Devang Patelff9dd0a2011-08-15 21:24:36 +00001061 AbsDbgVariable->setFrameIndex(VP.first);
Devang Patele717faa2009-10-06 01:26:37 +00001062 }
Devang Patelee432862010-05-20 19:57:06 +00001063}
Devang Patel90a48ad2010-03-15 18:33:46 +00001064
Eric Christopherb6dc8652012-11-27 22:43:45 +00001065// Return true if debug value, encoded by DBG_VALUE instruction, is in a
1066// defined reg.
Devang Patelc3f5f782010-05-25 23:40:22 +00001067static bool isDbgValueInDefinedReg(const MachineInstr *MI) {
Nick Lewycky746cb672011-10-26 22:55:33 +00001068 assert(MI->isDebugValue() && "Invalid DBG_VALUE machine instruction!");
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001069 return MI->getNumOperands() == 3 &&
1070 MI->getOperand(0).isReg() && MI->getOperand(0).getReg() &&
1071 MI->getOperand(1).isImm() && MI->getOperand(1).getImm() == 0;
Devang Patelc3f5f782010-05-25 23:40:22 +00001072}
1073
Eric Christopherb6dc8652012-11-27 22:43:45 +00001074// Get .debug_loc entry for the instruction range starting at MI.
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001075static DotDebugLocEntry getDebugLocEntry(AsmPrinter *Asm,
1076 const MCSymbol *FLabel,
Devang Patel90b40412011-07-08 17:09:57 +00001077 const MCSymbol *SLabel,
1078 const MachineInstr *MI) {
1079 const MDNode *Var = MI->getOperand(MI->getNumOperands() - 1).getMetadata();
1080
1081 if (MI->getNumOperands() != 3) {
1082 MachineLocation MLoc = Asm->getDebugValueLocation(MI);
1083 return DotDebugLocEntry(FLabel, SLabel, MLoc, Var);
1084 }
1085 if (MI->getOperand(0).isReg() && MI->getOperand(1).isImm()) {
1086 MachineLocation MLoc;
1087 MLoc.set(MI->getOperand(0).getReg(), MI->getOperand(1).getImm());
1088 return DotDebugLocEntry(FLabel, SLabel, MLoc, Var);
1089 }
1090 if (MI->getOperand(0).isImm())
1091 return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getImm());
1092 if (MI->getOperand(0).isFPImm())
1093 return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getFPImm());
1094 if (MI->getOperand(0).isCImm())
1095 return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getCImm());
1096
Craig Topper5e25ee82012-02-05 08:31:47 +00001097 llvm_unreachable("Unexpected 3 operand DBG_VALUE instruction!");
Devang Patel90b40412011-07-08 17:09:57 +00001098}
1099
Eric Christopherb6dc8652012-11-27 22:43:45 +00001100// Find variables for each lexical scope.
Jim Grosbach1e20b962010-07-21 21:21:52 +00001101void
Devang Patel78e127d2010-06-25 22:07:34 +00001102DwarfDebug::collectVariableInfo(const MachineFunction *MF,
1103 SmallPtrSet<const MDNode *, 16> &Processed) {
Jim Grosbach1e20b962010-07-21 21:21:52 +00001104
Eric Christopherb6dc8652012-11-27 22:43:45 +00001105 // collection info from MMI table.
Devang Patelee432862010-05-20 19:57:06 +00001106 collectVariableInfoFromMMITable(MF, Processed);
1107
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001108 for (SmallVectorImpl<const MDNode*>::const_iterator
1109 UVI = UserVariables.begin(), UVE = UserVariables.end(); UVI != UVE;
1110 ++UVI) {
1111 const MDNode *Var = *UVI;
1112 if (Processed.count(Var))
Devang Patelee432862010-05-20 19:57:06 +00001113 continue;
1114
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001115 // History contains relevant DBG_VALUE instructions for Var and instructions
1116 // clobbering it.
1117 SmallVectorImpl<const MachineInstr*> &History = DbgValues[Var];
1118 if (History.empty())
1119 continue;
1120 const MachineInstr *MInsn = History.front();
Devang Patelc3f5f782010-05-25 23:40:22 +00001121
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001122 DIVariable DV(Var);
Devang Patelbf47fdb2011-08-10 20:55:27 +00001123 LexicalScope *Scope = NULL;
Devang Pateld8720f42010-05-27 20:25:04 +00001124 if (DV.getTag() == dwarf::DW_TAG_arg_variable &&
1125 DISubprogram(DV.getContext()).describes(MF->getFunction()))
Devang Patelbf47fdb2011-08-10 20:55:27 +00001126 Scope = LScopes.getCurrentFunctionScope();
Devang Patel40c7e412011-07-20 22:18:50 +00001127 else {
1128 if (DV.getVersion() <= LLVMDebugVersion9)
Devang Patelbf47fdb2011-08-10 20:55:27 +00001129 Scope = LScopes.findLexicalScope(MInsn->getDebugLoc());
Devang Patel40c7e412011-07-20 22:18:50 +00001130 else {
1131 if (MDNode *IA = DV.getInlinedAt())
Devang Patelbf47fdb2011-08-10 20:55:27 +00001132 Scope = LScopes.findInlinedScope(DebugLoc::getFromDILocation(IA));
Devang Patel40c7e412011-07-20 22:18:50 +00001133 else
Devang Patelbf47fdb2011-08-10 20:55:27 +00001134 Scope = LScopes.findLexicalScope(cast<MDNode>(DV->getOperand(1)));
Devang Patel40c7e412011-07-20 22:18:50 +00001135 }
1136 }
Devang Patelee432862010-05-20 19:57:06 +00001137 // If variable scope is not found then skip this variable.
Devang Patelc0c5a262010-05-21 00:10:20 +00001138 if (!Scope)
Devang Patelee432862010-05-20 19:57:06 +00001139 continue;
1140
1141 Processed.insert(DV);
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001142 assert(MInsn->isDebugValue() && "History must begin with debug value");
Devang Patel5a1a67c2011-08-15 19:01:20 +00001143 DbgVariable *AbsVar = findAbstractVariable(DV, MInsn->getDebugLoc());
1144 DbgVariable *RegVar = new DbgVariable(DV, AbsVar);
Devang Patel0478c152011-03-01 22:58:55 +00001145 if (!addCurrentFnArgument(MF, RegVar, Scope))
Devang Patelbf47fdb2011-08-10 20:55:27 +00001146 addScopeVariable(Scope, RegVar);
Devang Patel5a1a67c2011-08-15 19:01:20 +00001147 if (AbsVar)
Devang Patelff9dd0a2011-08-15 21:24:36 +00001148 AbsVar->setMInsn(MInsn);
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001149
Eric Christopherc56e3f02012-10-08 20:48:54 +00001150 // Simplify ranges that are fully coalesced.
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001151 if (History.size() <= 1 || (History.size() == 2 &&
1152 MInsn->isIdenticalTo(History.back()))) {
Devang Patelff9dd0a2011-08-15 21:24:36 +00001153 RegVar->setMInsn(MInsn);
Devang Patelc3f5f782010-05-25 23:40:22 +00001154 continue;
1155 }
1156
1157 // handle multiple DBG_VALUE instructions describing one variable.
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001158 RegVar->setDotDebugLocOffset(DotDebugLocEntries.size());
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001159
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001160 for (SmallVectorImpl<const MachineInstr*>::const_iterator
1161 HI = History.begin(), HE = History.end(); HI != HE; ++HI) {
1162 const MachineInstr *Begin = *HI;
1163 assert(Begin->isDebugValue() && "Invalid History entry");
Jakob Stoklund Olesene17232e2011-03-22 00:21:41 +00001164
Devang Patel4ada1d72011-06-01 23:00:17 +00001165 // Check if DBG_VALUE is truncating a range.
1166 if (Begin->getNumOperands() > 1 && Begin->getOperand(0).isReg()
1167 && !Begin->getOperand(0).getReg())
1168 continue;
1169
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001170 // Compute the range for a register location.
1171 const MCSymbol *FLabel = getLabelBeforeInsn(Begin);
1172 const MCSymbol *SLabel = 0;
1173
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001174 if (HI + 1 == HE)
1175 // If Begin is the last instruction in History then its value is valid
Chris Lattner7a2bdde2011-04-15 05:18:47 +00001176 // until the end of the function.
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001177 SLabel = FunctionEndSym;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001178 else {
1179 const MachineInstr *End = HI[1];
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001180 DEBUG(dbgs() << "DotDebugLoc Pair:\n"
Devang Patel476df5f2011-07-07 21:44:42 +00001181 << "\t" << *Begin << "\t" << *End << "\n");
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001182 if (End->isDebugValue())
1183 SLabel = getLabelBeforeInsn(End);
1184 else {
1185 // End is a normal instruction clobbering the range.
1186 SLabel = getLabelAfterInsn(End);
1187 assert(SLabel && "Forgot label after clobber instruction");
1188 ++HI;
1189 }
1190 }
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001191
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001192 // The value is valid until the next DBG_VALUE or clobber.
Eric Christopherabbb2002011-12-16 23:42:31 +00001193 DotDebugLocEntries.push_back(getDebugLocEntry(Asm, FLabel, SLabel,
1194 Begin));
Devang Patelc3f5f782010-05-25 23:40:22 +00001195 }
1196 DotDebugLocEntries.push_back(DotDebugLocEntry());
Devang Patel90a48ad2010-03-15 18:33:46 +00001197 }
Devang Patel98e1cac2010-05-14 21:01:35 +00001198
1199 // Collect info for variables that were optimized out.
Devang Patel93d39be2011-08-19 23:28:12 +00001200 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
1201 DIArray Variables = DISubprogram(FnScope->getScopeNode()).getVariables();
1202 for (unsigned i = 0, e = Variables.getNumElements(); i != e; ++i) {
1203 DIVariable DV(Variables.getElement(i));
1204 if (!DV || !DV.Verify() || !Processed.insert(DV))
1205 continue;
1206 if (LexicalScope *Scope = LScopes.findLexicalScope(DV.getContext()))
1207 addScopeVariable(Scope, new DbgVariable(DV, NULL));
Devang Patel98e1cac2010-05-14 21:01:35 +00001208 }
Devang Patelc3f5f782010-05-25 23:40:22 +00001209}
Devang Patel98e1cac2010-05-14 21:01:35 +00001210
Eric Christopherb6dc8652012-11-27 22:43:45 +00001211// Return Label preceding the instruction.
Devang Patelc3f5f782010-05-25 23:40:22 +00001212const MCSymbol *DwarfDebug::getLabelBeforeInsn(const MachineInstr *MI) {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001213 MCSymbol *Label = LabelsBeforeInsn.lookup(MI);
1214 assert(Label && "Didn't insert label before instruction");
1215 return Label;
Devang Patelc3f5f782010-05-25 23:40:22 +00001216}
1217
Eric Christopherb6dc8652012-11-27 22:43:45 +00001218// Return Label immediately following the instruction.
Devang Patelc3f5f782010-05-25 23:40:22 +00001219const MCSymbol *DwarfDebug::getLabelAfterInsn(const MachineInstr *MI) {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001220 return LabelsAfterInsn.lookup(MI);
Devang Patele717faa2009-10-06 01:26:37 +00001221}
1222
Eric Christopherb6dc8652012-11-27 22:43:45 +00001223// Process beginning of an instruction.
Devang Patelcbbe2872010-10-26 17:49:02 +00001224void DwarfDebug::beginInstruction(const MachineInstr *MI) {
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001225 // Check if source location changes, but ignore DBG_VALUE locations.
1226 if (!MI->isDebugValue()) {
1227 DebugLoc DL = MI->getDebugLoc();
1228 if (DL != PrevInstLoc && (!DL.isUnknown() || UnknownLocations)) {
Eric Christopher60b35f42012-04-05 20:39:05 +00001229 unsigned Flags = 0;
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001230 PrevInstLoc = DL;
Devang Patel4243e672011-05-11 19:22:19 +00001231 if (DL == PrologEndLoc) {
1232 Flags |= DWARF2_FLAG_PROLOGUE_END;
1233 PrologEndLoc = DebugLoc();
1234 }
Eric Christopher60b35f42012-04-05 20:39:05 +00001235 if (PrologEndLoc.isUnknown())
1236 Flags |= DWARF2_FLAG_IS_STMT;
1237
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001238 if (!DL.isUnknown()) {
1239 const MDNode *Scope = DL.getScope(Asm->MF->getFunction()->getContext());
Devang Patel4243e672011-05-11 19:22:19 +00001240 recordSourceLine(DL.getLine(), DL.getCol(), Scope, Flags);
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001241 } else
Devang Patel4243e672011-05-11 19:22:19 +00001242 recordSourceLine(0, 0, 0, 0);
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001243 }
Devang Patelc3f5f782010-05-25 23:40:22 +00001244 }
Devang Patelaead63c2010-03-29 22:59:58 +00001245
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001246 // Insert labels where requested.
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001247 DenseMap<const MachineInstr*, MCSymbol*>::iterator I =
1248 LabelsBeforeInsn.find(MI);
1249
1250 // No label needed.
1251 if (I == LabelsBeforeInsn.end())
1252 return;
1253
1254 // Label already assigned.
1255 if (I->second)
Devang Patelb2b31a62010-05-26 19:37:24 +00001256 return;
Devang Patel553881b2010-03-29 17:20:31 +00001257
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001258 if (!PrevLabel) {
Devang Patel77051f52010-05-26 21:23:46 +00001259 PrevLabel = MMI->getContext().CreateTempSymbol();
1260 Asm->OutStreamer.EmitLabel(PrevLabel);
Devang Patelb2b31a62010-05-26 19:37:24 +00001261 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001262 I->second = PrevLabel;
Devang Patel0d20ac82009-10-06 01:50:42 +00001263}
1264
Eric Christopherb6dc8652012-11-27 22:43:45 +00001265// Process end of an instruction.
Devang Patelcbbe2872010-10-26 17:49:02 +00001266void DwarfDebug::endInstruction(const MachineInstr *MI) {
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001267 // Don't create a new label after DBG_VALUE instructions.
1268 // They don't generate code.
1269 if (!MI->isDebugValue())
1270 PrevLabel = 0;
1271
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001272 DenseMap<const MachineInstr*, MCSymbol*>::iterator I =
1273 LabelsAfterInsn.find(MI);
1274
1275 // No label needed.
1276 if (I == LabelsAfterInsn.end())
1277 return;
1278
1279 // Label already assigned.
1280 if (I->second)
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001281 return;
1282
1283 // We need a label after this instruction.
1284 if (!PrevLabel) {
1285 PrevLabel = MMI->getContext().CreateTempSymbol();
1286 Asm->OutStreamer.EmitLabel(PrevLabel);
Devang Patel1c246352010-04-08 16:50:29 +00001287 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001288 I->second = PrevLabel;
Devang Patel53bb5c92009-11-10 23:06:00 +00001289}
1290
Eric Christopherb6dc8652012-11-27 22:43:45 +00001291// Each LexicalScope has first instruction and last instruction to mark
1292// beginning and end of a scope respectively. Create an inverse map that list
1293// scopes starts (and ends) with an instruction. One instruction may start (or
1294// end) multiple scopes. Ignore scopes that are not reachable.
Devang Patele37b0c62010-04-08 18:43:56 +00001295void DwarfDebug::identifyScopeMarkers() {
Devang Patelbf47fdb2011-08-10 20:55:27 +00001296 SmallVector<LexicalScope *, 4> WorkList;
1297 WorkList.push_back(LScopes.getCurrentFunctionScope());
Devang Patel42aafd72010-01-20 02:05:23 +00001298 while (!WorkList.empty()) {
Devang Patelbf47fdb2011-08-10 20:55:27 +00001299 LexicalScope *S = WorkList.pop_back_val();
Jim Grosbach1e20b962010-07-21 21:21:52 +00001300
Devang Patelbf47fdb2011-08-10 20:55:27 +00001301 const SmallVector<LexicalScope *, 4> &Children = S->getChildren();
Jim Grosbach1e20b962010-07-21 21:21:52 +00001302 if (!Children.empty())
Devang Patelbf47fdb2011-08-10 20:55:27 +00001303 for (SmallVector<LexicalScope *, 4>::const_iterator SI = Children.begin(),
Devang Patel42aafd72010-01-20 02:05:23 +00001304 SE = Children.end(); SI != SE; ++SI)
1305 WorkList.push_back(*SI);
1306
Devang Patel53bb5c92009-11-10 23:06:00 +00001307 if (S->isAbstractScope())
1308 continue;
Jim Grosbach1e20b962010-07-21 21:21:52 +00001309
Devang Patelbf47fdb2011-08-10 20:55:27 +00001310 const SmallVector<InsnRange, 4> &Ranges = S->getRanges();
Devang Pateleac9c072010-04-27 19:46:33 +00001311 if (Ranges.empty())
1312 continue;
Devang Patelbf47fdb2011-08-10 20:55:27 +00001313 for (SmallVector<InsnRange, 4>::const_iterator RI = Ranges.begin(),
Devang Pateleac9c072010-04-27 19:46:33 +00001314 RE = Ranges.end(); RI != RE; ++RI) {
Devang Patelbf47fdb2011-08-10 20:55:27 +00001315 assert(RI->first && "InsnRange does not have first instruction!");
1316 assert(RI->second && "InsnRange does not have second instruction!");
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001317 requestLabelBeforeInsn(RI->first);
1318 requestLabelAfterInsn(RI->second);
Devang Pateleac9c072010-04-27 19:46:33 +00001319 }
Devang Patelaf9e8472009-10-01 20:31:14 +00001320 }
Devang Patelaf9e8472009-10-01 20:31:14 +00001321}
1322
Eric Christopherb6dc8652012-11-27 22:43:45 +00001323// Get MDNode for DebugLoc's scope.
Devang Patela3f48672011-05-09 22:14:49 +00001324static MDNode *getScopeNode(DebugLoc DL, const LLVMContext &Ctx) {
1325 if (MDNode *InlinedAt = DL.getInlinedAt(Ctx))
1326 return getScopeNode(DebugLoc::getFromDILocation(InlinedAt), Ctx);
1327 return DL.getScope(Ctx);
1328}
1329
Eric Christopherb6dc8652012-11-27 22:43:45 +00001330// Walk up the scope chain of given debug loc and find line number info
1331// for the function.
Devang Patel4243e672011-05-11 19:22:19 +00001332static DebugLoc getFnDebugLoc(DebugLoc DL, const LLVMContext &Ctx) {
1333 const MDNode *Scope = getScopeNode(DL, Ctx);
1334 DISubprogram SP = getDISubprogram(Scope);
Eric Christopher6126a1e2012-04-03 00:43:49 +00001335 if (SP.Verify()) {
1336 // Check for number of operands since the compatibility is
1337 // cheap here.
Eric Christopherfa5b0502012-04-03 17:55:42 +00001338 if (SP->getNumOperands() > 19)
Eric Christopher6126a1e2012-04-03 00:43:49 +00001339 return DebugLoc::get(SP.getScopeLineNumber(), 0, SP);
1340 else
1341 return DebugLoc::get(SP.getLineNumber(), 0, SP);
1342 }
1343
Devang Patel4243e672011-05-11 19:22:19 +00001344 return DebugLoc();
1345}
1346
Eric Christopherb6dc8652012-11-27 22:43:45 +00001347// Gather pre-function debug information. Assumes being called immediately
1348// after the function entry point has been emitted.
Chris Lattnereec791a2010-01-26 23:18:02 +00001349void DwarfDebug::beginFunction(const MachineFunction *MF) {
Chris Lattner994cb122010-04-05 03:52:55 +00001350 if (!MMI->hasDebugInfo()) return;
Devang Patelbf47fdb2011-08-10 20:55:27 +00001351 LScopes.initialize(*MF);
1352 if (LScopes.empty()) return;
1353 identifyScopeMarkers();
Devang Patel60b35bd2009-10-06 18:37:31 +00001354
Devang Pateleac9c072010-04-27 19:46:33 +00001355 FunctionBeginSym = Asm->GetTempSymbol("func_begin",
1356 Asm->getFunctionNumber());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001357 // Assumes in correct section after the entry point.
Devang Pateleac9c072010-04-27 19:46:33 +00001358 Asm->OutStreamer.EmitLabel(FunctionBeginSym);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001359
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001360 assert(UserVariables.empty() && DbgValues.empty() && "Maps weren't cleaned");
1361
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001362 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
Eric Christopherb6dc8652012-11-27 22:43:45 +00001363 // LiveUserVar - Map physreg numbers to the MDNode they contain.
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001364 std::vector<const MDNode*> LiveUserVar(TRI->getNumRegs());
1365
Devang Patelb2b31a62010-05-26 19:37:24 +00001366 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001367 I != E; ++I) {
1368 bool AtBlockEntry = true;
Devang Patelb2b31a62010-05-26 19:37:24 +00001369 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
1370 II != IE; ++II) {
1371 const MachineInstr *MI = II;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001372
Devang Patelb2b31a62010-05-26 19:37:24 +00001373 if (MI->isDebugValue()) {
Nick Lewycky746cb672011-10-26 22:55:33 +00001374 assert(MI->getNumOperands() > 1 && "Invalid machine instruction!");
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001375
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001376 // Keep track of user variables.
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001377 const MDNode *Var =
1378 MI->getOperand(MI->getNumOperands() - 1).getMetadata();
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001379
1380 // Variable is in a register, we need to check for clobbers.
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001381 if (isDbgValueInDefinedReg(MI))
1382 LiveUserVar[MI->getOperand(0).getReg()] = Var;
1383
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001384 // Check the history of this variable.
1385 SmallVectorImpl<const MachineInstr*> &History = DbgValues[Var];
1386 if (History.empty()) {
1387 UserVariables.push_back(Var);
1388 // The first mention of a function argument gets the FunctionBeginSym
1389 // label, so arguments are visible when breaking at function entry.
1390 DIVariable DV(Var);
1391 if (DV.Verify() && DV.getTag() == dwarf::DW_TAG_arg_variable &&
1392 DISubprogram(getDISubprogram(DV.getContext()))
1393 .describes(MF->getFunction()))
1394 LabelsBeforeInsn[MI] = FunctionBeginSym;
1395 } else {
1396 // We have seen this variable before. Try to coalesce DBG_VALUEs.
1397 const MachineInstr *Prev = History.back();
1398 if (Prev->isDebugValue()) {
1399 // Coalesce identical entries at the end of History.
1400 if (History.size() >= 2 &&
Devang Patel79862892011-07-07 00:14:27 +00001401 Prev->isIdenticalTo(History[History.size() - 2])) {
Eric Christopher02c1a642012-10-08 20:48:49 +00001402 DEBUG(dbgs() << "Coalescing identical DBG_VALUE entries:\n"
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001403 << "\t" << *Prev
Devang Patel79862892011-07-07 00:14:27 +00001404 << "\t" << *History[History.size() - 2] << "\n");
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001405 History.pop_back();
Devang Patel79862892011-07-07 00:14:27 +00001406 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001407
1408 // Terminate old register assignments that don't reach MI;
1409 MachineFunction::const_iterator PrevMBB = Prev->getParent();
1410 if (PrevMBB != I && (!AtBlockEntry || llvm::next(PrevMBB) != I) &&
1411 isDbgValueInDefinedReg(Prev)) {
1412 // Previous register assignment needs to terminate at the end of
1413 // its basic block.
1414 MachineBasicBlock::const_iterator LastMI =
1415 PrevMBB->getLastNonDebugInstr();
Devang Patel79862892011-07-07 00:14:27 +00001416 if (LastMI == PrevMBB->end()) {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001417 // Drop DBG_VALUE for empty range.
Eric Christopher02c1a642012-10-08 20:48:49 +00001418 DEBUG(dbgs() << "Dropping DBG_VALUE for empty range:\n"
Devang Patel79862892011-07-07 00:14:27 +00001419 << "\t" << *Prev << "\n");
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001420 History.pop_back();
Devang Patel79862892011-07-07 00:14:27 +00001421 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001422 else {
1423 // Terminate after LastMI.
1424 History.push_back(LastMI);
1425 }
1426 }
1427 }
1428 }
1429 History.push_back(MI);
Devang Patelb2b31a62010-05-26 19:37:24 +00001430 } else {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001431 // Not a DBG_VALUE instruction.
1432 if (!MI->isLabel())
1433 AtBlockEntry = false;
1434
Eric Christopher0313ced2012-10-04 20:46:14 +00001435 // First known non-DBG_VALUE and non-frame setup location marks
1436 // the beginning of the function body.
1437 if (!MI->getFlag(MachineInstr::FrameSetup) &&
1438 (PrologEndLoc.isUnknown() && !MI->getDebugLoc().isUnknown()))
Devang Patel4243e672011-05-11 19:22:19 +00001439 PrologEndLoc = MI->getDebugLoc();
1440
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001441 // Check if the instruction clobbers any registers with debug vars.
1442 for (MachineInstr::const_mop_iterator MOI = MI->operands_begin(),
1443 MOE = MI->operands_end(); MOI != MOE; ++MOI) {
1444 if (!MOI->isReg() || !MOI->isDef() || !MOI->getReg())
1445 continue;
Jakob Stoklund Olesen396618b2012-06-01 23:28:30 +00001446 for (MCRegAliasIterator AI(MOI->getReg(), TRI, true);
1447 AI.isValid(); ++AI) {
1448 unsigned Reg = *AI;
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001449 const MDNode *Var = LiveUserVar[Reg];
1450 if (!Var)
1451 continue;
1452 // Reg is now clobbered.
1453 LiveUserVar[Reg] = 0;
1454
1455 // Was MD last defined by a DBG_VALUE referring to Reg?
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001456 DbgValueHistoryMap::iterator HistI = DbgValues.find(Var);
1457 if (HistI == DbgValues.end())
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001458 continue;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001459 SmallVectorImpl<const MachineInstr*> &History = HistI->second;
1460 if (History.empty())
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001461 continue;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001462 const MachineInstr *Prev = History.back();
1463 // Sanity-check: Register assignments are terminated at the end of
1464 // their block.
1465 if (!Prev->isDebugValue() || Prev->getParent() != MI->getParent())
1466 continue;
1467 // Is the variable still in Reg?
1468 if (!isDbgValueInDefinedReg(Prev) ||
1469 Prev->getOperand(0).getReg() != Reg)
1470 continue;
1471 // Var is clobbered. Make sure the next instruction gets a label.
1472 History.push_back(MI);
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001473 }
1474 }
Devang Patelb2b31a62010-05-26 19:37:24 +00001475 }
Devang Patelb2b31a62010-05-26 19:37:24 +00001476 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001477 }
1478
1479 for (DbgValueHistoryMap::iterator I = DbgValues.begin(), E = DbgValues.end();
1480 I != E; ++I) {
1481 SmallVectorImpl<const MachineInstr*> &History = I->second;
1482 if (History.empty())
1483 continue;
1484
1485 // Make sure the final register assignments are terminated.
1486 const MachineInstr *Prev = History.back();
1487 if (Prev->isDebugValue() && isDbgValueInDefinedReg(Prev)) {
1488 const MachineBasicBlock *PrevMBB = Prev->getParent();
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001489 MachineBasicBlock::const_iterator LastMI =
Devang Patel5bc942c2011-08-10 23:58:09 +00001490 PrevMBB->getLastNonDebugInstr();
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001491 if (LastMI == PrevMBB->end())
1492 // Drop DBG_VALUE for empty range.
1493 History.pop_back();
1494 else {
1495 // Terminate after LastMI.
1496 History.push_back(LastMI);
1497 }
1498 }
1499 // Request labels for the full history.
1500 for (unsigned i = 0, e = History.size(); i != e; ++i) {
1501 const MachineInstr *MI = History[i];
1502 if (MI->isDebugValue())
1503 requestLabelBeforeInsn(MI);
1504 else
1505 requestLabelAfterInsn(MI);
1506 }
1507 }
Devang Patelb2b31a62010-05-26 19:37:24 +00001508
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001509 PrevInstLoc = DebugLoc();
Devang Patelb2b31a62010-05-26 19:37:24 +00001510 PrevLabel = FunctionBeginSym;
Devang Patel4243e672011-05-11 19:22:19 +00001511
1512 // Record beginning of function.
1513 if (!PrologEndLoc.isUnknown()) {
1514 DebugLoc FnStartDL = getFnDebugLoc(PrologEndLoc,
1515 MF->getFunction()->getContext());
1516 recordSourceLine(FnStartDL.getLine(), FnStartDL.getCol(),
1517 FnStartDL.getScope(MF->getFunction()->getContext()),
David Blaikie836cfc42012-12-04 22:02:33 +00001518 // We'd like to list the prologue as "not statements" but GDB behaves
1519 // poorly if we do that. Revisit this with caution/GDB (7.5+) testing.
David Blaikieb36c5312012-12-04 21:05:36 +00001520 DWARF2_FLAG_IS_STMT);
Devang Patel4243e672011-05-11 19:22:19 +00001521 }
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001522}
1523
Devang Patelbf47fdb2011-08-10 20:55:27 +00001524void DwarfDebug::addScopeVariable(LexicalScope *LS, DbgVariable *Var) {
1525// SmallVector<DbgVariable *, 8> &Vars = ScopeVariables.lookup(LS);
1526 ScopeVariables[LS].push_back(Var);
1527// Vars.push_back(Var);
1528}
1529
Eric Christopherb6dc8652012-11-27 22:43:45 +00001530// Gather and emit post-function debug information.
Chris Lattnereec791a2010-01-26 23:18:02 +00001531void DwarfDebug::endFunction(const MachineFunction *MF) {
Devang Patelbf47fdb2011-08-10 20:55:27 +00001532 if (!MMI->hasDebugInfo() || LScopes.empty()) return;
Devang Patel70d75ca2009-11-12 19:02:56 +00001533
Devang Patelbf47fdb2011-08-10 20:55:27 +00001534 // Define end label for subprogram.
1535 FunctionEndSym = Asm->GetTempSymbol("func_end",
1536 Asm->getFunctionNumber());
1537 // Assumes in correct section after the entry point.
1538 Asm->OutStreamer.EmitLabel(FunctionEndSym);
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001539
Devang Patelbf47fdb2011-08-10 20:55:27 +00001540 SmallPtrSet<const MDNode *, 16> ProcessedVars;
1541 collectVariableInfo(MF, ProcessedVars);
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001542
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001543 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
Devang Patel94c7ddb2011-08-16 22:09:43 +00001544 CompileUnit *TheCU = SPMap.lookup(FnScope->getScopeNode());
Nick Lewycky746cb672011-10-26 22:55:33 +00001545 assert(TheCU && "Unable to find compile unit!");
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001546
Devang Patelbf47fdb2011-08-10 20:55:27 +00001547 // Construct abstract scopes.
Devang Patelcd9f6c52011-08-12 18:10:19 +00001548 ArrayRef<LexicalScope *> AList = LScopes.getAbstractScopesList();
1549 for (unsigned i = 0, e = AList.size(); i != e; ++i) {
1550 LexicalScope *AScope = AList[i];
1551 DISubprogram SP(AScope->getScopeNode());
Devang Patelbf47fdb2011-08-10 20:55:27 +00001552 if (SP.Verify()) {
1553 // Collect info for variables that were optimized out.
Devang Patel93d39be2011-08-19 23:28:12 +00001554 DIArray Variables = SP.getVariables();
1555 for (unsigned i = 0, e = Variables.getNumElements(); i != e; ++i) {
1556 DIVariable DV(Variables.getElement(i));
1557 if (!DV || !DV.Verify() || !ProcessedVars.insert(DV))
1558 continue;
Alexey Samsonovb67bd332012-07-06 08:45:08 +00001559 // Check that DbgVariable for DV wasn't created earlier, when
1560 // findAbstractVariable() was called for inlined instance of DV.
1561 LLVMContext &Ctx = DV->getContext();
1562 DIVariable CleanDV = cleanseInlinedVariable(DV, Ctx);
1563 if (AbstractVariables.lookup(CleanDV))
1564 continue;
Devang Patel93d39be2011-08-19 23:28:12 +00001565 if (LexicalScope *Scope = LScopes.findAbstractScope(DV.getContext()))
1566 addScopeVariable(Scope, new DbgVariable(DV, NULL));
Devang Patel78e127d2010-06-25 22:07:34 +00001567 }
1568 }
Devang Patelcd9f6c52011-08-12 18:10:19 +00001569 if (ProcessedSPNodes.count(AScope->getScopeNode()) == 0)
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001570 constructScopeDIE(TheCU, AScope);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001571 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001572
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001573 DIE *CurFnDIE = constructScopeDIE(TheCU, FnScope);
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001574
Nick Lewycky8a8d4792011-12-02 22:16:29 +00001575 if (!MF->getTarget().Options.DisableFramePointerElim(*MF))
Eric Christopher873cf0a2012-08-24 01:14:27 +00001576 TheCU->addFlag(CurFnDIE, dwarf::DW_AT_APPLE_omit_frame_ptr);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001577
Devang Patelbf47fdb2011-08-10 20:55:27 +00001578 DebugFrames.push_back(FunctionDebugFrameInfo(Asm->getFunctionNumber(),
1579 MMI->getFrameMoves()));
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001580
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001581 // Clear debug info
Devang Patelbf47fdb2011-08-10 20:55:27 +00001582 for (DenseMap<LexicalScope *, SmallVector<DbgVariable *, 8> >::iterator
1583 I = ScopeVariables.begin(), E = ScopeVariables.end(); I != E; ++I)
1584 DeleteContainerPointers(I->second);
1585 ScopeVariables.clear();
Devang Pateleac0c9d2011-04-22 18:09:57 +00001586 DeleteContainerPointers(CurrentFnArguments);
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001587 UserVariables.clear();
1588 DbgValues.clear();
Jeffrey Yasskin5c213dc2010-03-12 17:45:06 +00001589 AbstractVariables.clear();
Devang Pateleac9c072010-04-27 19:46:33 +00001590 LabelsBeforeInsn.clear();
1591 LabelsAfterInsn.clear();
Devang Patelf2548ca2010-04-16 23:33:45 +00001592 PrevLabel = NULL;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001593}
1594
Eric Christopherb6dc8652012-11-27 22:43:45 +00001595// Register a source line with debug info. Returns the unique label that was
1596// emitted and which provides correspondence to the source line list.
Devang Patel4243e672011-05-11 19:22:19 +00001597void DwarfDebug::recordSourceLine(unsigned Line, unsigned Col, const MDNode *S,
1598 unsigned Flags) {
Devang Patel65dbc902009-11-25 17:36:49 +00001599 StringRef Fn;
Devang Patel23670e52011-03-24 20:30:50 +00001600 StringRef Dir;
Dan Gohman1cc0d622010-05-05 23:41:32 +00001601 unsigned Src = 1;
1602 if (S) {
1603 DIDescriptor Scope(S);
Devang Patelf84548d2009-10-05 18:03:19 +00001604
Dan Gohman1cc0d622010-05-05 23:41:32 +00001605 if (Scope.isCompileUnit()) {
1606 DICompileUnit CU(S);
Dan Gohman1cc0d622010-05-05 23:41:32 +00001607 Fn = CU.getFilename();
Devang Patel23670e52011-03-24 20:30:50 +00001608 Dir = CU.getDirectory();
Devang Patel3cabc9d2010-10-28 17:30:52 +00001609 } else if (Scope.isFile()) {
1610 DIFile F(S);
Devang Patel3cabc9d2010-10-28 17:30:52 +00001611 Fn = F.getFilename();
Devang Patel23670e52011-03-24 20:30:50 +00001612 Dir = F.getDirectory();
Dan Gohman1cc0d622010-05-05 23:41:32 +00001613 } else if (Scope.isSubprogram()) {
1614 DISubprogram SP(S);
Dan Gohman1cc0d622010-05-05 23:41:32 +00001615 Fn = SP.getFilename();
Devang Patel23670e52011-03-24 20:30:50 +00001616 Dir = SP.getDirectory();
Eric Christopher6618a242011-10-11 22:59:11 +00001617 } else if (Scope.isLexicalBlockFile()) {
1618 DILexicalBlockFile DBF(S);
1619 Fn = DBF.getFilename();
1620 Dir = DBF.getDirectory();
Dan Gohman1cc0d622010-05-05 23:41:32 +00001621 } else if (Scope.isLexicalBlock()) {
1622 DILexicalBlock DB(S);
Dan Gohman1cc0d622010-05-05 23:41:32 +00001623 Fn = DB.getFilename();
Devang Patel23670e52011-03-24 20:30:50 +00001624 Dir = DB.getDirectory();
Dan Gohman1cc0d622010-05-05 23:41:32 +00001625 } else
Craig Topper5e25ee82012-02-05 08:31:47 +00001626 llvm_unreachable("Unexpected scope info");
Dan Gohman1cc0d622010-05-05 23:41:32 +00001627
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001628 Src = getOrCreateSourceID(Fn, Dir);
Dan Gohman1cc0d622010-05-05 23:41:32 +00001629 }
Nick Lewycky3bbb6f72011-07-29 03:49:23 +00001630 Asm->OutStreamer.EmitDwarfLocDirective(Src, Line, Col, Flags, 0, 0, Fn);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001631}
1632
Bill Wendling829e67b2009-05-20 23:22:40 +00001633//===----------------------------------------------------------------------===//
1634// Emit Methods
1635//===----------------------------------------------------------------------===//
1636
Eric Christopherb6dc8652012-11-27 22:43:45 +00001637// Compute the size and offset of a DIE.
Jim Grosbach7ab38df2009-11-22 19:20:36 +00001638unsigned
Eric Christopherfbd19752012-11-20 22:14:13 +00001639DwarfDebug::computeSizeAndOffset(DIE *Die, unsigned Offset) {
Bill Wendling94d04b82009-05-20 23:21:38 +00001640 // Get the children.
1641 const std::vector<DIE *> &Children = Die->getChildren();
1642
Bill Wendling94d04b82009-05-20 23:21:38 +00001643 // Record the abbreviation.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001644 assignAbbrevNumber(Die->getAbbrev());
Bill Wendling94d04b82009-05-20 23:21:38 +00001645
1646 // Get the abbreviation for this DIE.
1647 unsigned AbbrevNumber = Die->getAbbrevNumber();
1648 const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
1649
1650 // Set DIE offset
1651 Die->setOffset(Offset);
1652
1653 // Start the size with the size of abbreviation code.
Chris Lattneraf76e592009-08-22 20:48:53 +00001654 Offset += MCAsmInfo::getULEB128Size(AbbrevNumber);
Bill Wendling94d04b82009-05-20 23:21:38 +00001655
1656 const SmallVector<DIEValue*, 32> &Values = Die->getValues();
1657 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
1658
1659 // Size the DIE attribute values.
1660 for (unsigned i = 0, N = Values.size(); i < N; ++i)
1661 // Size attribute value.
Chris Lattnera37d5382010-04-05 00:18:22 +00001662 Offset += Values[i]->SizeOf(Asm, AbbrevData[i].getForm());
Bill Wendling94d04b82009-05-20 23:21:38 +00001663
1664 // Size the DIE children if any.
1665 if (!Children.empty()) {
1666 assert(Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes &&
1667 "Children flag not set");
1668
1669 for (unsigned j = 0, M = Children.size(); j < M; ++j)
Eric Christopherfbd19752012-11-20 22:14:13 +00001670 Offset = computeSizeAndOffset(Children[j], Offset);
Bill Wendling94d04b82009-05-20 23:21:38 +00001671
1672 // End of children marker.
1673 Offset += sizeof(int8_t);
1674 }
1675
1676 Die->setSize(Offset - Die->getOffset());
1677 return Offset;
1678}
1679
Eric Christopherb6dc8652012-11-27 22:43:45 +00001680// Compute the size and offset of all the DIEs.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001681void DwarfDebug::computeSizeAndOffsets() {
Eric Christopher4daaed12012-12-10 19:51:21 +00001682 if (SkeletonCU) {
Eric Christopher98e237f2012-11-30 23:59:06 +00001683 unsigned Offset =
1684 sizeof(int32_t) + // Length of Compilation Unit Info
1685 sizeof(int16_t) + // DWARF version number
1686 sizeof(int32_t) + // Offset Into Abbrev. Section
1687 sizeof(int8_t); // Pointer Size (in bytes)
1688
Eric Christopher4daaed12012-12-10 19:51:21 +00001689 computeSizeAndOffset(SkeletonCU->getCUDie(), Offset);
Eric Christopher98e237f2012-11-30 23:59:06 +00001690 }
Devang Patel163a9f72010-05-10 22:49:55 +00001691 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
1692 E = CUMap.end(); I != E; ++I) {
1693 // Compute size of compile unit header.
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001694 unsigned Offset =
Devang Patel163a9f72010-05-10 22:49:55 +00001695 sizeof(int32_t) + // Length of Compilation Unit Info
1696 sizeof(int16_t) + // DWARF version number
1697 sizeof(int32_t) + // Offset Into Abbrev. Section
1698 sizeof(int8_t); // Pointer Size (in bytes)
Eric Christopherfbd19752012-11-20 22:14:13 +00001699 computeSizeAndOffset(I->second->getCUDie(), Offset);
Devang Patel163a9f72010-05-10 22:49:55 +00001700 }
Bill Wendling94d04b82009-05-20 23:21:38 +00001701}
1702
Eric Christopherb6dc8652012-11-27 22:43:45 +00001703// Emit initial Dwarf sections with a label at the start of each one.
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001704void DwarfDebug::emitSectionLabels() {
Chris Lattner6c2f9e12009-08-19 05:49:37 +00001705 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
Daniel Dunbarf612ff62009-09-19 20:40:05 +00001706
Bill Wendling94d04b82009-05-20 23:21:38 +00001707 // Dwarf sections base addresses.
Jim Grosbach1e20b962010-07-21 21:21:52 +00001708 DwarfInfoSectionSym =
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001709 emitSectionSym(Asm, TLOF.getDwarfInfoSection(), "section_info");
Jim Grosbach1e20b962010-07-21 21:21:52 +00001710 DwarfAbbrevSectionSym =
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001711 emitSectionSym(Asm, TLOF.getDwarfAbbrevSection(), "section_abbrev");
1712 emitSectionSym(Asm, TLOF.getDwarfARangesSection());
Jim Grosbach1e20b962010-07-21 21:21:52 +00001713
Chris Lattner9c69e285532010-04-04 22:59:04 +00001714 if (const MCSection *MacroInfo = TLOF.getDwarfMacroInfoSection())
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001715 emitSectionSym(Asm, MacroInfo);
Bill Wendling94d04b82009-05-20 23:21:38 +00001716
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001717 emitSectionSym(Asm, TLOF.getDwarfLineSection(), "section_line");
1718 emitSectionSym(Asm, TLOF.getDwarfLocSection());
1719 emitSectionSym(Asm, TLOF.getDwarfPubTypesSection());
Jim Grosbach1e20b962010-07-21 21:21:52 +00001720 DwarfStrSectionSym =
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001721 emitSectionSym(Asm, TLOF.getDwarfStrSection(), "section_str");
1722 DwarfDebugRangeSectionSym = emitSectionSym(Asm, TLOF.getDwarfRangesSection(),
Devang Patelf2548ca2010-04-16 23:33:45 +00001723 "debug_range");
Bill Wendling94d04b82009-05-20 23:21:38 +00001724
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001725 DwarfDebugLocSectionSym = emitSectionSym(Asm, TLOF.getDwarfLocSection(),
Devang Patelc3f5f782010-05-25 23:40:22 +00001726 "section_debug_loc");
1727
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001728 TextSectionSym = emitSectionSym(Asm, TLOF.getTextSection(), "text_begin");
1729 emitSectionSym(Asm, TLOF.getDataSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00001730}
1731
Eric Christopherb6dc8652012-11-27 22:43:45 +00001732// Recursively emits a debug information entry.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001733void DwarfDebug::emitDIE(DIE *Die) {
Bill Wendling94d04b82009-05-20 23:21:38 +00001734 // Get the abbreviation for this DIE.
1735 unsigned AbbrevNumber = Die->getAbbrevNumber();
1736 const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
1737
Bill Wendling94d04b82009-05-20 23:21:38 +00001738 // Emit the code (index) for the abbreviation.
Chris Lattner3f53c832010-04-04 18:52:31 +00001739 if (Asm->isVerbose())
Chris Lattner894d75a2010-01-22 23:18:42 +00001740 Asm->OutStreamer.AddComment("Abbrev [" + Twine(AbbrevNumber) + "] 0x" +
1741 Twine::utohexstr(Die->getOffset()) + ":0x" +
1742 Twine::utohexstr(Die->getSize()) + " " +
1743 dwarf::TagString(Abbrev->getTag()));
Chris Lattner7e1a8f82010-04-04 19:09:29 +00001744 Asm->EmitULEB128(AbbrevNumber);
Bill Wendling94d04b82009-05-20 23:21:38 +00001745
Jeffrey Yasskin638fe8d2010-03-22 18:47:14 +00001746 const SmallVector<DIEValue*, 32> &Values = Die->getValues();
Bill Wendling94d04b82009-05-20 23:21:38 +00001747 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
1748
1749 // Emit the DIE attribute values.
1750 for (unsigned i = 0, N = Values.size(); i < N; ++i) {
1751 unsigned Attr = AbbrevData[i].getAttribute();
1752 unsigned Form = AbbrevData[i].getForm();
1753 assert(Form && "Too many attributes for DIE (check abbreviation)");
1754
Chris Lattner3f53c832010-04-04 18:52:31 +00001755 if (Asm->isVerbose())
Chris Lattnera8013622010-01-24 18:54:17 +00001756 Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr));
Jim Grosbach1e20b962010-07-21 21:21:52 +00001757
Bill Wendling94d04b82009-05-20 23:21:38 +00001758 switch (Attr) {
Bill Wendling94d04b82009-05-20 23:21:38 +00001759 case dwarf::DW_AT_abstract_origin: {
1760 DIEEntry *E = cast<DIEEntry>(Values[i]);
1761 DIE *Origin = E->getEntry();
Devang Patel53bb5c92009-11-10 23:06:00 +00001762 unsigned Addr = Origin->getOffset();
Bill Wendling94d04b82009-05-20 23:21:38 +00001763 Asm->EmitInt32(Addr);
1764 break;
1765 }
Devang Patelf2548ca2010-04-16 23:33:45 +00001766 case dwarf::DW_AT_ranges: {
1767 // DW_AT_range Value encodes offset in debug_range section.
1768 DIEInteger *V = cast<DIEInteger>(Values[i]);
Devang Patelb1fcfbe2010-09-02 16:43:44 +00001769
Nick Lewyckyffccd922012-06-22 01:25:12 +00001770 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections()) {
Devang Patelb1fcfbe2010-09-02 16:43:44 +00001771 Asm->EmitLabelPlusOffset(DwarfDebugRangeSectionSym,
1772 V->getValue(),
1773 4);
1774 } else {
1775 Asm->EmitLabelOffsetDifference(DwarfDebugRangeSectionSym,
1776 V->getValue(),
1777 DwarfDebugRangeSectionSym,
1778 4);
1779 }
Devang Patelf2548ca2010-04-16 23:33:45 +00001780 break;
1781 }
Devang Patelc3f5f782010-05-25 23:40:22 +00001782 case dwarf::DW_AT_location: {
Nick Lewyckyffccd922012-06-22 01:25:12 +00001783 if (DIELabel *L = dyn_cast<DIELabel>(Values[i])) {
1784 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
1785 Asm->EmitLabelReference(L->getValue(), 4);
1786 else
1787 Asm->EmitLabelDifference(L->getValue(), DwarfDebugLocSectionSym, 4);
1788 } else {
Devang Patelc3f5f782010-05-25 23:40:22 +00001789 Values[i]->EmitValue(Asm, Form);
Nick Lewyckyffccd922012-06-22 01:25:12 +00001790 }
Devang Patelc3f5f782010-05-25 23:40:22 +00001791 break;
1792 }
Devang Patel2a361602010-09-29 19:08:08 +00001793 case dwarf::DW_AT_accessibility: {
1794 if (Asm->isVerbose()) {
1795 DIEInteger *V = cast<DIEInteger>(Values[i]);
1796 Asm->OutStreamer.AddComment(dwarf::AccessibilityString(V->getValue()));
1797 }
1798 Values[i]->EmitValue(Asm, Form);
1799 break;
1800 }
Bill Wendling94d04b82009-05-20 23:21:38 +00001801 default:
1802 // Emit an attribute using the defined form.
Chris Lattnerd38fee82010-04-05 00:13:49 +00001803 Values[i]->EmitValue(Asm, Form);
Bill Wendling94d04b82009-05-20 23:21:38 +00001804 break;
1805 }
Bill Wendling94d04b82009-05-20 23:21:38 +00001806 }
1807
1808 // Emit the DIE children if any.
1809 if (Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes) {
1810 const std::vector<DIE *> &Children = Die->getChildren();
1811
1812 for (unsigned j = 0, M = Children.size(); j < M; ++j)
Devang Patel2c4ceb12009-11-21 02:48:08 +00001813 emitDIE(Children[j]);
Bill Wendling94d04b82009-05-20 23:21:38 +00001814
Chris Lattner3f53c832010-04-04 18:52:31 +00001815 if (Asm->isVerbose())
Chris Lattner233f52b2010-03-09 23:52:58 +00001816 Asm->OutStreamer.AddComment("End Of Children Mark");
1817 Asm->EmitInt8(0);
Bill Wendling94d04b82009-05-20 23:21:38 +00001818 }
1819}
1820
Eric Christopher98e237f2012-11-30 23:59:06 +00001821void DwarfDebug::emitCompileUnits(const MCSection *Section) {
1822 Asm->OutStreamer.SwitchSection(Section);
Devang Patel163a9f72010-05-10 22:49:55 +00001823 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
1824 E = CUMap.end(); I != E; ++I) {
1825 CompileUnit *TheCU = I->second;
1826 DIE *Die = TheCU->getCUDie();
Jim Grosbach1e20b962010-07-21 21:21:52 +00001827
Devang Patel163a9f72010-05-10 22:49:55 +00001828 // Emit the compile units header.
1829 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_begin",
Eli Benderskyd4a05e02012-12-03 18:45:45 +00001830 TheCU->getUniqueID()));
Jim Grosbach1e20b962010-07-21 21:21:52 +00001831
Devang Patel163a9f72010-05-10 22:49:55 +00001832 // Emit size of content not including length itself
1833 unsigned ContentSize = Die->getSize() +
1834 sizeof(int16_t) + // DWARF version number
1835 sizeof(int32_t) + // Offset Into Abbrev. Section
Devang Patel65705d52011-04-13 19:41:17 +00001836 sizeof(int8_t); // Pointer Size (in bytes)
Jim Grosbach1e20b962010-07-21 21:21:52 +00001837
Devang Patel163a9f72010-05-10 22:49:55 +00001838 Asm->OutStreamer.AddComment("Length of Compilation Unit Info");
1839 Asm->EmitInt32(ContentSize);
1840 Asm->OutStreamer.AddComment("DWARF version number");
1841 Asm->EmitInt16(dwarf::DWARF_VERSION);
1842 Asm->OutStreamer.AddComment("Offset Into Abbrev. Section");
1843 Asm->EmitSectionOffset(Asm->GetTempSymbol("abbrev_begin"),
1844 DwarfAbbrevSectionSym);
1845 Asm->OutStreamer.AddComment("Address Size (in bytes)");
Chandler Carruth426c2bf2012-11-01 09:14:31 +00001846 Asm->EmitInt8(Asm->getDataLayout().getPointerSize());
Jim Grosbach1e20b962010-07-21 21:21:52 +00001847
Devang Patel163a9f72010-05-10 22:49:55 +00001848 emitDIE(Die);
Eli Benderskyd4a05e02012-12-03 18:45:45 +00001849 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_end",
1850 TheCU->getUniqueID()));
Devang Patel163a9f72010-05-10 22:49:55 +00001851 }
Bill Wendling94d04b82009-05-20 23:21:38 +00001852}
1853
Eric Christopher98e237f2012-11-30 23:59:06 +00001854// Emit the debug info section.
1855void DwarfDebug::emitDebugInfo() {
Eric Christopher4daaed12012-12-10 19:51:21 +00001856 if (!useSplitDwarf())
Eric Christopher98e237f2012-11-30 23:59:06 +00001857 emitCompileUnits(Asm->getObjFileLowering().getDwarfInfoSection());
1858 else
Eric Christopher4daaed12012-12-10 19:51:21 +00001859 emitSkeletonCU(Asm->getObjFileLowering().getDwarfInfoSection());
Eric Christopher98e237f2012-11-30 23:59:06 +00001860}
1861
Eric Christopherb6dc8652012-11-27 22:43:45 +00001862// Emit the abbreviation section.
Eric Christopher7dc68db2012-11-20 23:30:11 +00001863void DwarfDebug::emitAbbreviations() {
Bill Wendling94d04b82009-05-20 23:21:38 +00001864 // Check to see if it is worth the effort.
1865 if (!Abbreviations.empty()) {
1866 // Start the debug abbrev section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00001867 Asm->OutStreamer.SwitchSection(
1868 Asm->getObjFileLowering().getDwarfAbbrevSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00001869
Chris Lattnerc0215722010-04-04 19:25:43 +00001870 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_begin"));
Bill Wendling94d04b82009-05-20 23:21:38 +00001871
1872 // For each abbrevation.
1873 for (unsigned i = 0, N = Abbreviations.size(); i < N; ++i) {
1874 // Get abbreviation data
1875 const DIEAbbrev *Abbrev = Abbreviations[i];
1876
1877 // Emit the abbrevations code (base 1 index.)
Chris Lattner7e1a8f82010-04-04 19:09:29 +00001878 Asm->EmitULEB128(Abbrev->getNumber(), "Abbreviation Code");
Bill Wendling94d04b82009-05-20 23:21:38 +00001879
1880 // Emit the abbreviations data.
Chris Lattnerd38fee82010-04-05 00:13:49 +00001881 Abbrev->Emit(Asm);
Bill Wendling94d04b82009-05-20 23:21:38 +00001882 }
1883
1884 // Mark end of abbreviations.
Chris Lattner7e1a8f82010-04-04 19:09:29 +00001885 Asm->EmitULEB128(0, "EOM(3)");
Bill Wendling94d04b82009-05-20 23:21:38 +00001886
Chris Lattnerc0215722010-04-04 19:25:43 +00001887 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_end"));
Bill Wendling94d04b82009-05-20 23:21:38 +00001888 }
1889}
1890
Eric Christopherb6dc8652012-11-27 22:43:45 +00001891// Emit the last address of the section and the end of the line matrix.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001892void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) {
Bill Wendling94d04b82009-05-20 23:21:38 +00001893 // Define last address of section.
Chris Lattner233f52b2010-03-09 23:52:58 +00001894 Asm->OutStreamer.AddComment("Extended Op");
1895 Asm->EmitInt8(0);
Jim Grosbach1e20b962010-07-21 21:21:52 +00001896
Chris Lattner233f52b2010-03-09 23:52:58 +00001897 Asm->OutStreamer.AddComment("Op size");
Chandler Carruth426c2bf2012-11-01 09:14:31 +00001898 Asm->EmitInt8(Asm->getDataLayout().getPointerSize() + 1);
Chris Lattner233f52b2010-03-09 23:52:58 +00001899 Asm->OutStreamer.AddComment("DW_LNE_set_address");
1900 Asm->EmitInt8(dwarf::DW_LNE_set_address);
1901
1902 Asm->OutStreamer.AddComment("Section end label");
Chris Lattnerd85fc6e2010-03-10 01:17:49 +00001903
Chris Lattnerc0215722010-04-04 19:25:43 +00001904 Asm->OutStreamer.EmitSymbolValue(Asm->GetTempSymbol("section_end",SectionEnd),
Chandler Carruth426c2bf2012-11-01 09:14:31 +00001905 Asm->getDataLayout().getPointerSize(),
Chris Lattnerd38fee82010-04-05 00:13:49 +00001906 0/*AddrSpace*/);
Bill Wendling94d04b82009-05-20 23:21:38 +00001907
1908 // Mark end of matrix.
Chris Lattner233f52b2010-03-09 23:52:58 +00001909 Asm->OutStreamer.AddComment("DW_LNE_end_sequence");
1910 Asm->EmitInt8(0);
Chris Lattner0ad9c912010-01-22 22:09:00 +00001911 Asm->EmitInt8(1);
Chris Lattner894d75a2010-01-22 23:18:42 +00001912 Asm->EmitInt8(1);
Bill Wendling94d04b82009-05-20 23:21:38 +00001913}
1914
Eric Christopherb6dc8652012-11-27 22:43:45 +00001915// Emit visible names into a hashed accelerator table section.
Eric Christopher09ac3d82011-11-07 09:24:32 +00001916void DwarfDebug::emitAccelNames() {
1917 DwarfAccelTable AT(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset,
1918 dwarf::DW_FORM_data4));
1919 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
1920 E = CUMap.end(); I != E; ++I) {
1921 CompileUnit *TheCU = I->second;
Eric Christopher0ffe2b42011-11-10 19:25:34 +00001922 const StringMap<std::vector<DIE*> > &Names = TheCU->getAccelNames();
1923 for (StringMap<std::vector<DIE*> >::const_iterator
Eric Christopher09ac3d82011-11-07 09:24:32 +00001924 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
1925 const char *Name = GI->getKeyData();
Eric Christopherfa03db02012-01-06 23:03:34 +00001926 const std::vector<DIE *> &Entities = GI->second;
Eric Christopher0ffe2b42011-11-10 19:25:34 +00001927 for (std::vector<DIE *>::const_iterator DI = Entities.begin(),
1928 DE = Entities.end(); DI != DE; ++DI)
1929 AT.AddName(Name, (*DI));
Eric Christopher09ac3d82011-11-07 09:24:32 +00001930 }
1931 }
1932
1933 AT.FinalizeTable(Asm, "Names");
1934 Asm->OutStreamer.SwitchSection(
1935 Asm->getObjFileLowering().getDwarfAccelNamesSection());
1936 MCSymbol *SectionBegin = Asm->GetTempSymbol("names_begin");
1937 Asm->OutStreamer.EmitLabel(SectionBegin);
1938
1939 // Emit the full data.
1940 AT.Emit(Asm, SectionBegin, this);
1941}
1942
Eric Christopherb6dc8652012-11-27 22:43:45 +00001943// Emit objective C classes and categories into a hashed accelerator table section.
Eric Christopher09ac3d82011-11-07 09:24:32 +00001944void DwarfDebug::emitAccelObjC() {
1945 DwarfAccelTable AT(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset,
1946 dwarf::DW_FORM_data4));
1947 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
1948 E = CUMap.end(); I != E; ++I) {
1949 CompileUnit *TheCU = I->second;
1950 const StringMap<std::vector<DIE*> > &Names = TheCU->getAccelObjC();
1951 for (StringMap<std::vector<DIE*> >::const_iterator
1952 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
1953 const char *Name = GI->getKeyData();
Eric Christopherfa03db02012-01-06 23:03:34 +00001954 const std::vector<DIE *> &Entities = GI->second;
Eric Christopher09ac3d82011-11-07 09:24:32 +00001955 for (std::vector<DIE *>::const_iterator DI = Entities.begin(),
1956 DE = Entities.end(); DI != DE; ++DI)
1957 AT.AddName(Name, (*DI));
1958 }
1959 }
1960
1961 AT.FinalizeTable(Asm, "ObjC");
1962 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering()
1963 .getDwarfAccelObjCSection());
1964 MCSymbol *SectionBegin = Asm->GetTempSymbol("objc_begin");
1965 Asm->OutStreamer.EmitLabel(SectionBegin);
1966
1967 // Emit the full data.
1968 AT.Emit(Asm, SectionBegin, this);
1969}
1970
Eric Christopherb6dc8652012-11-27 22:43:45 +00001971// Emit namespace dies into a hashed accelerator table.
Eric Christopher09ac3d82011-11-07 09:24:32 +00001972void DwarfDebug::emitAccelNamespaces() {
1973 DwarfAccelTable AT(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset,
1974 dwarf::DW_FORM_data4));
1975 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
1976 E = CUMap.end(); I != E; ++I) {
1977 CompileUnit *TheCU = I->second;
Eric Christopher8bd36ea2011-11-10 21:47:55 +00001978 const StringMap<std::vector<DIE*> > &Names = TheCU->getAccelNamespace();
1979 for (StringMap<std::vector<DIE*> >::const_iterator
Eric Christopher09ac3d82011-11-07 09:24:32 +00001980 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
1981 const char *Name = GI->getKeyData();
Eric Christopherfa03db02012-01-06 23:03:34 +00001982 const std::vector<DIE *> &Entities = GI->second;
Eric Christopher8bd36ea2011-11-10 21:47:55 +00001983 for (std::vector<DIE *>::const_iterator DI = Entities.begin(),
1984 DE = Entities.end(); DI != DE; ++DI)
1985 AT.AddName(Name, (*DI));
Eric Christopher09ac3d82011-11-07 09:24:32 +00001986 }
1987 }
1988
1989 AT.FinalizeTable(Asm, "namespac");
1990 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering()
1991 .getDwarfAccelNamespaceSection());
1992 MCSymbol *SectionBegin = Asm->GetTempSymbol("namespac_begin");
1993 Asm->OutStreamer.EmitLabel(SectionBegin);
1994
1995 // Emit the full data.
1996 AT.Emit(Asm, SectionBegin, this);
1997}
1998
Eric Christopherb6dc8652012-11-27 22:43:45 +00001999// Emit type dies into a hashed accelerator table.
Eric Christopher09ac3d82011-11-07 09:24:32 +00002000void DwarfDebug::emitAccelTypes() {
Eric Christopherc36145f2012-01-06 04:35:23 +00002001 std::vector<DwarfAccelTable::Atom> Atoms;
2002 Atoms.push_back(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset,
2003 dwarf::DW_FORM_data4));
2004 Atoms.push_back(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeTag,
2005 dwarf::DW_FORM_data2));
2006 Atoms.push_back(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeTypeFlags,
2007 dwarf::DW_FORM_data1));
2008 DwarfAccelTable AT(Atoms);
Eric Christopher09ac3d82011-11-07 09:24:32 +00002009 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2010 E = CUMap.end(); I != E; ++I) {
2011 CompileUnit *TheCU = I->second;
Eric Christopherc36145f2012-01-06 04:35:23 +00002012 const StringMap<std::vector<std::pair<DIE*, unsigned > > > &Names
2013 = TheCU->getAccelTypes();
2014 for (StringMap<std::vector<std::pair<DIE*, unsigned> > >::const_iterator
Eric Christopher09ac3d82011-11-07 09:24:32 +00002015 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
2016 const char *Name = GI->getKeyData();
Eric Christopherfa03db02012-01-06 23:03:34 +00002017 const std::vector<std::pair<DIE *, unsigned> > &Entities = GI->second;
Eric Christopherc36145f2012-01-06 04:35:23 +00002018 for (std::vector<std::pair<DIE *, unsigned> >::const_iterator DI
2019 = Entities.begin(), DE = Entities.end(); DI !=DE; ++DI)
2020 AT.AddName(Name, (*DI).first, (*DI).second);
Eric Christopher09ac3d82011-11-07 09:24:32 +00002021 }
2022 }
2023
2024 AT.FinalizeTable(Asm, "types");
2025 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering()
2026 .getDwarfAccelTypesSection());
2027 MCSymbol *SectionBegin = Asm->GetTempSymbol("types_begin");
2028 Asm->OutStreamer.EmitLabel(SectionBegin);
2029
2030 // Emit the full data.
2031 AT.Emit(Asm, SectionBegin, this);
2032}
2033
Devang Patel193f7202009-11-24 01:14:22 +00002034void DwarfDebug::emitDebugPubTypes() {
Devang Patel163a9f72010-05-10 22:49:55 +00002035 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2036 E = CUMap.end(); I != E; ++I) {
2037 CompileUnit *TheCU = I->second;
Eric Christopher63701182011-11-07 09:18:35 +00002038 // Start the dwarf pubtypes section.
Devang Patel163a9f72010-05-10 22:49:55 +00002039 Asm->OutStreamer.SwitchSection(
2040 Asm->getObjFileLowering().getDwarfPubTypesSection());
2041 Asm->OutStreamer.AddComment("Length of Public Types Info");
2042 Asm->EmitLabelDifference(
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002043 Asm->GetTempSymbol("pubtypes_end", TheCU->getUniqueID()),
2044 Asm->GetTempSymbol("pubtypes_begin", TheCU->getUniqueID()), 4);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002045
Devang Patel163a9f72010-05-10 22:49:55 +00002046 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_begin",
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002047 TheCU->getUniqueID()));
Jim Grosbach1e20b962010-07-21 21:21:52 +00002048
Devang Patel163a9f72010-05-10 22:49:55 +00002049 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DWARF Version");
2050 Asm->EmitInt16(dwarf::DWARF_VERSION);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002051
Devang Patel163a9f72010-05-10 22:49:55 +00002052 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002053 Asm->EmitSectionOffset(Asm->GetTempSymbol("info_begin",
2054 TheCU->getUniqueID()),
Devang Patel163a9f72010-05-10 22:49:55 +00002055 DwarfInfoSectionSym);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002056
Devang Patel163a9f72010-05-10 22:49:55 +00002057 Asm->OutStreamer.AddComment("Compilation Unit Length");
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002058 Asm->EmitLabelDifference(Asm->GetTempSymbol("info_end",
2059 TheCU->getUniqueID()),
2060 Asm->GetTempSymbol("info_begin",
2061 TheCU->getUniqueID()),
Devang Patel163a9f72010-05-10 22:49:55 +00002062 4);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002063
Devang Patel163a9f72010-05-10 22:49:55 +00002064 const StringMap<DIE*> &Globals = TheCU->getGlobalTypes();
2065 for (StringMap<DIE*>::const_iterator
2066 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2067 const char *Name = GI->getKeyData();
Nick Lewycky3bbb6f72011-07-29 03:49:23 +00002068 DIE *Entity = GI->second;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002069
Devang Patel163a9f72010-05-10 22:49:55 +00002070 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
2071 Asm->EmitInt32(Entity->getOffset());
Jim Grosbach1e20b962010-07-21 21:21:52 +00002072
Devang Patel163a9f72010-05-10 22:49:55 +00002073 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("External Name");
Benjamin Kramer983c4572011-11-09 18:16:11 +00002074 // Emit the name with a terminating null byte.
Devang Patel163a9f72010-05-10 22:49:55 +00002075 Asm->OutStreamer.EmitBytes(StringRef(Name, GI->getKeyLength()+1), 0);
2076 }
Jim Grosbach1e20b962010-07-21 21:21:52 +00002077
Devang Patel163a9f72010-05-10 22:49:55 +00002078 Asm->OutStreamer.AddComment("End Mark");
Jim Grosbach1e20b962010-07-21 21:21:52 +00002079 Asm->EmitInt32(0);
Devang Patel163a9f72010-05-10 22:49:55 +00002080 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_end",
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002081 TheCU->getUniqueID()));
Devang Patel193f7202009-11-24 01:14:22 +00002082 }
Devang Patel193f7202009-11-24 01:14:22 +00002083}
2084
Eric Christopherb6dc8652012-11-27 22:43:45 +00002085// Emit visible names into a debug str section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002086void DwarfDebug::emitDebugStr() {
Bill Wendling94d04b82009-05-20 23:21:38 +00002087 // Check to see if it is worth the effort.
Chris Lattner0d9d70f2010-03-09 23:38:23 +00002088 if (StringPool.empty()) return;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002089
Chris Lattner0d9d70f2010-03-09 23:38:23 +00002090 // Start the dwarf str section.
2091 Asm->OutStreamer.SwitchSection(
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002092 Asm->getObjFileLowering().getDwarfStrSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002093
Chris Lattnerbc733f52010-03-13 02:17:42 +00002094 // Get all of the string pool entries and put them in an array by their ID so
2095 // we can sort them.
Jim Grosbach1e20b962010-07-21 21:21:52 +00002096 SmallVector<std::pair<unsigned,
Chris Lattnerbc733f52010-03-13 02:17:42 +00002097 StringMapEntry<std::pair<MCSymbol*, unsigned> >*>, 64> Entries;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002098
Chris Lattnerbc733f52010-03-13 02:17:42 +00002099 for (StringMap<std::pair<MCSymbol*, unsigned> >::iterator
2100 I = StringPool.begin(), E = StringPool.end(); I != E; ++I)
2101 Entries.push_back(std::make_pair(I->second.second, &*I));
Jim Grosbach1e20b962010-07-21 21:21:52 +00002102
Chris Lattnerbc733f52010-03-13 02:17:42 +00002103 array_pod_sort(Entries.begin(), Entries.end());
Jim Grosbach1e20b962010-07-21 21:21:52 +00002104
Chris Lattnerbc733f52010-03-13 02:17:42 +00002105 for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
Chris Lattner0d9d70f2010-03-09 23:38:23 +00002106 // Emit a label for reference from debug information entries.
Chris Lattnerbc733f52010-03-13 02:17:42 +00002107 Asm->OutStreamer.EmitLabel(Entries[i].second->getValue().first);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002108
Benjamin Kramer983c4572011-11-09 18:16:11 +00002109 // Emit the string itself with a terminating null byte.
Benjamin Kramer0c45f7d2011-11-09 12:12:04 +00002110 Asm->OutStreamer.EmitBytes(StringRef(Entries[i].second->getKeyData(),
2111 Entries[i].second->getKeyLength()+1),
2112 0/*addrspace*/);
Bill Wendling94d04b82009-05-20 23:21:38 +00002113 }
2114}
2115
Eric Christopherb6dc8652012-11-27 22:43:45 +00002116// Emit visible names into a debug loc section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002117void DwarfDebug::emitDebugLoc() {
Devang Patel80250682010-05-26 23:55:23 +00002118 if (DotDebugLocEntries.empty())
2119 return;
2120
Devang Patel6c3ea902011-02-04 22:57:18 +00002121 for (SmallVector<DotDebugLocEntry, 4>::iterator
2122 I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
2123 I != E; ++I) {
2124 DotDebugLocEntry &Entry = *I;
2125 if (I + 1 != DotDebugLocEntries.end())
2126 Entry.Merge(I+1);
2127 }
2128
Daniel Dunbar83320a02011-03-16 22:16:39 +00002129 // Start the dwarf loc section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002130 Asm->OutStreamer.SwitchSection(
Devang Patelc3f5f782010-05-25 23:40:22 +00002131 Asm->getObjFileLowering().getDwarfLocSection());
Chandler Carruth426c2bf2012-11-01 09:14:31 +00002132 unsigned char Size = Asm->getDataLayout().getPointerSize();
Devang Patel80250682010-05-26 23:55:23 +00002133 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", 0));
2134 unsigned index = 1;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002135 for (SmallVector<DotDebugLocEntry, 4>::iterator
2136 I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
Devang Patel61409622010-07-07 20:12:52 +00002137 I != E; ++I, ++index) {
Devang Patel6c3ea902011-02-04 22:57:18 +00002138 DotDebugLocEntry &Entry = *I;
2139 if (Entry.isMerged()) continue;
Devang Patelc3f5f782010-05-25 23:40:22 +00002140 if (Entry.isEmpty()) {
2141 Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
2142 Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
Devang Patel80250682010-05-26 23:55:23 +00002143 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", index));
Devang Patelc3f5f782010-05-25 23:40:22 +00002144 } else {
2145 Asm->OutStreamer.EmitSymbolValue(Entry.Begin, Size, 0);
2146 Asm->OutStreamer.EmitSymbolValue(Entry.End, Size, 0);
Devang Patelc26f5442011-04-28 02:22:40 +00002147 DIVariable DV(Entry.Variable);
Rafael Espindola5b23b7f2011-05-27 22:05:41 +00002148 Asm->OutStreamer.AddComment("Loc expr size");
2149 MCSymbol *begin = Asm->OutStreamer.getContext().CreateTempSymbol();
2150 MCSymbol *end = Asm->OutStreamer.getContext().CreateTempSymbol();
2151 Asm->EmitLabelDifference(end, begin, 2);
2152 Asm->OutStreamer.EmitLabel(begin);
Devang Patel80efd4e2011-07-08 16:49:43 +00002153 if (Entry.isInt()) {
Devang Patelc4329072011-06-01 22:03:25 +00002154 DIBasicType BTy(DV.getType());
2155 if (BTy.Verify() &&
Eric Christopher0f1c7f62012-11-19 22:42:10 +00002156 (BTy.getEncoding() == dwarf::DW_ATE_signed
Devang Patelc4329072011-06-01 22:03:25 +00002157 || BTy.getEncoding() == dwarf::DW_ATE_signed_char)) {
2158 Asm->OutStreamer.AddComment("DW_OP_consts");
2159 Asm->EmitInt8(dwarf::DW_OP_consts);
Devang Patel80efd4e2011-07-08 16:49:43 +00002160 Asm->EmitSLEB128(Entry.getInt());
Devang Patelc4329072011-06-01 22:03:25 +00002161 } else {
2162 Asm->OutStreamer.AddComment("DW_OP_constu");
2163 Asm->EmitInt8(dwarf::DW_OP_constu);
Devang Patel80efd4e2011-07-08 16:49:43 +00002164 Asm->EmitULEB128(Entry.getInt());
Devang Patelc4329072011-06-01 22:03:25 +00002165 }
Devang Patel80efd4e2011-07-08 16:49:43 +00002166 } else if (Entry.isLocation()) {
Eric Christopher0f1c7f62012-11-19 22:42:10 +00002167 if (!DV.hasComplexAddress())
Devang Patel80efd4e2011-07-08 16:49:43 +00002168 // Regular entry.
Devang Patelc26f5442011-04-28 02:22:40 +00002169 Asm->EmitDwarfRegOp(Entry.Loc);
Devang Patel80efd4e2011-07-08 16:49:43 +00002170 else {
2171 // Complex address entry.
2172 unsigned N = DV.getNumAddrElements();
2173 unsigned i = 0;
2174 if (N >= 2 && DV.getAddrElement(0) == DIBuilder::OpPlus) {
2175 if (Entry.Loc.getOffset()) {
2176 i = 2;
2177 Asm->EmitDwarfRegOp(Entry.Loc);
2178 Asm->OutStreamer.AddComment("DW_OP_deref");
2179 Asm->EmitInt8(dwarf::DW_OP_deref);
2180 Asm->OutStreamer.AddComment("DW_OP_plus_uconst");
2181 Asm->EmitInt8(dwarf::DW_OP_plus_uconst);
2182 Asm->EmitSLEB128(DV.getAddrElement(1));
2183 } else {
2184 // If first address element is OpPlus then emit
2185 // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
2186 MachineLocation Loc(Entry.Loc.getReg(), DV.getAddrElement(1));
2187 Asm->EmitDwarfRegOp(Loc);
2188 i = 2;
2189 }
2190 } else {
2191 Asm->EmitDwarfRegOp(Entry.Loc);
2192 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +00002193
Devang Patel80efd4e2011-07-08 16:49:43 +00002194 // Emit remaining complex address elements.
2195 for (; i < N; ++i) {
2196 uint64_t Element = DV.getAddrElement(i);
2197 if (Element == DIBuilder::OpPlus) {
2198 Asm->EmitInt8(dwarf::DW_OP_plus_uconst);
2199 Asm->EmitULEB128(DV.getAddrElement(++i));
Eric Christopher50120762012-05-08 18:56:00 +00002200 } else if (Element == DIBuilder::OpDeref) {
Eric Christophera80f2d12012-05-08 21:24:39 +00002201 if (!Entry.Loc.isReg())
Eric Christopher50120762012-05-08 18:56:00 +00002202 Asm->EmitInt8(dwarf::DW_OP_deref);
2203 } else
2204 llvm_unreachable("unknown Opcode found in complex address");
Devang Patel80efd4e2011-07-08 16:49:43 +00002205 }
Devang Patelc26f5442011-04-28 02:22:40 +00002206 }
Devang Patelc26f5442011-04-28 02:22:40 +00002207 }
Devang Patel80efd4e2011-07-08 16:49:43 +00002208 // else ... ignore constant fp. There is not any good way to
2209 // to represent them here in dwarf.
Rafael Espindola5b23b7f2011-05-27 22:05:41 +00002210 Asm->OutStreamer.EmitLabel(end);
Devang Patelc3f5f782010-05-25 23:40:22 +00002211 }
2212 }
Bill Wendling94d04b82009-05-20 23:21:38 +00002213}
2214
Eric Christopherb6dc8652012-11-27 22:43:45 +00002215// Emit visible names into a debug aranges section.
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00002216void DwarfDebug::emitDebugARanges() {
Bill Wendling94d04b82009-05-20 23:21:38 +00002217 // Start the dwarf aranges section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002218 Asm->OutStreamer.SwitchSection(
2219 Asm->getObjFileLowering().getDwarfARangesSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002220}
2221
Eric Christopherb6dc8652012-11-27 22:43:45 +00002222// Emit visible names into a debug ranges section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002223void DwarfDebug::emitDebugRanges() {
Bill Wendling94d04b82009-05-20 23:21:38 +00002224 // Start the dwarf ranges section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002225 Asm->OutStreamer.SwitchSection(
Devang Patelf2548ca2010-04-16 23:33:45 +00002226 Asm->getObjFileLowering().getDwarfRangesSection());
Chandler Carruth426c2bf2012-11-01 09:14:31 +00002227 unsigned char Size = Asm->getDataLayout().getPointerSize();
Devang Pateleac9c072010-04-27 19:46:33 +00002228 for (SmallVector<const MCSymbol *, 8>::iterator
Jim Grosbach1e20b962010-07-21 21:21:52 +00002229 I = DebugRangeSymbols.begin(), E = DebugRangeSymbols.end();
Devang Pateleac9c072010-04-27 19:46:33 +00002230 I != E; ++I) {
2231 if (*I)
2232 Asm->OutStreamer.EmitSymbolValue(const_cast<MCSymbol*>(*I), Size, 0);
Devang Patelf2548ca2010-04-16 23:33:45 +00002233 else
Devang Pateleac9c072010-04-27 19:46:33 +00002234 Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
Devang Patelf2548ca2010-04-16 23:33:45 +00002235 }
Bill Wendling94d04b82009-05-20 23:21:38 +00002236}
2237
Eric Christopherb6dc8652012-11-27 22:43:45 +00002238// Emit visible names into a debug macinfo section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002239void DwarfDebug::emitDebugMacInfo() {
Daniel Dunbarf612ff62009-09-19 20:40:05 +00002240 if (const MCSection *LineInfo =
Chris Lattner18a4c162009-08-02 07:24:22 +00002241 Asm->getObjFileLowering().getDwarfMacroInfoSection()) {
Bill Wendling94d04b82009-05-20 23:21:38 +00002242 // Start the dwarf macinfo section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002243 Asm->OutStreamer.SwitchSection(LineInfo);
Bill Wendling94d04b82009-05-20 23:21:38 +00002244 }
2245}
2246
Eric Christopherb6dc8652012-11-27 22:43:45 +00002247// Emit inline info using following format.
2248// Section Header:
2249// 1. length of section
2250// 2. Dwarf version number
2251// 3. address size.
2252//
2253// Entries (one "entry" for each function that was inlined):
2254//
2255// 1. offset into __debug_str section for MIPS linkage name, if exists;
2256// otherwise offset into __debug_str for regular function name.
2257// 2. offset into __debug_str section for regular function name.
2258// 3. an unsigned LEB128 number indicating the number of distinct inlining
2259// instances for the function.
2260//
2261// The rest of the entry consists of a {die_offset, low_pc} pair for each
2262// inlined instance; the die_offset points to the inlined_subroutine die in the
2263// __debug_info section, and the low_pc is the starting address for the
2264// inlining instance.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002265void DwarfDebug::emitDebugInlineInfo() {
Eric Christopherb83e2bb2012-03-02 02:11:47 +00002266 if (!Asm->MAI->doesDwarfUseInlineInfoSection())
Bill Wendling94d04b82009-05-20 23:21:38 +00002267 return;
2268
Devang Patel163a9f72010-05-10 22:49:55 +00002269 if (!FirstCU)
Bill Wendling94d04b82009-05-20 23:21:38 +00002270 return;
2271
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002272 Asm->OutStreamer.SwitchSection(
2273 Asm->getObjFileLowering().getDwarfDebugInlineSection());
Chris Lattner0ad9c912010-01-22 22:09:00 +00002274
Chris Lattner233f52b2010-03-09 23:52:58 +00002275 Asm->OutStreamer.AddComment("Length of Debug Inlined Information Entry");
Chris Lattnera6437182010-04-04 19:58:12 +00002276 Asm->EmitLabelDifference(Asm->GetTempSymbol("debug_inlined_end", 1),
2277 Asm->GetTempSymbol("debug_inlined_begin", 1), 4);
Bill Wendling94d04b82009-05-20 23:21:38 +00002278
Chris Lattnerc0215722010-04-04 19:25:43 +00002279 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_begin", 1));
Bill Wendling94d04b82009-05-20 23:21:38 +00002280
Chris Lattner233f52b2010-03-09 23:52:58 +00002281 Asm->OutStreamer.AddComment("Dwarf Version");
2282 Asm->EmitInt16(dwarf::DWARF_VERSION);
2283 Asm->OutStreamer.AddComment("Address Size (in bytes)");
Chandler Carruth426c2bf2012-11-01 09:14:31 +00002284 Asm->EmitInt8(Asm->getDataLayout().getPointerSize());
Bill Wendling94d04b82009-05-20 23:21:38 +00002285
Devang Patele9f8f5e2010-05-07 20:54:48 +00002286 for (SmallVector<const MDNode *, 4>::iterator I = InlinedSPNodes.begin(),
Devang Patel53bb5c92009-11-10 23:06:00 +00002287 E = InlinedSPNodes.end(); I != E; ++I) {
Jim Grosbach31ef40e2009-11-21 23:12:12 +00002288
Devang Patele9f8f5e2010-05-07 20:54:48 +00002289 const MDNode *Node = *I;
2290 DenseMap<const MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator II
Jim Grosbach7ab38df2009-11-22 19:20:36 +00002291 = InlineInfo.find(Node);
Devang Patel53bb5c92009-11-10 23:06:00 +00002292 SmallVector<InlineInfoLabels, 4> &Labels = II->second;
Devang Patele4b27562009-08-28 23:24:31 +00002293 DISubprogram SP(Node);
Devang Patel65dbc902009-11-25 17:36:49 +00002294 StringRef LName = SP.getLinkageName();
2295 StringRef Name = SP.getName();
Bill Wendling94d04b82009-05-20 23:21:38 +00002296
Chris Lattner233f52b2010-03-09 23:52:58 +00002297 Asm->OutStreamer.AddComment("MIPS linkage name");
Eric Christopher50e26612012-03-02 01:57:52 +00002298 if (LName.empty())
2299 Asm->EmitSectionOffset(getStringPoolEntry(Name), DwarfStrSectionSym);
2300 else
Chris Lattner6189ed12010-04-04 23:25:33 +00002301 Asm->EmitSectionOffset(getStringPoolEntry(getRealLinkageName(LName)),
2302 DwarfStrSectionSym);
Devang Patel53bb5c92009-11-10 23:06:00 +00002303
Chris Lattner233f52b2010-03-09 23:52:58 +00002304 Asm->OutStreamer.AddComment("Function name");
Chris Lattner6189ed12010-04-04 23:25:33 +00002305 Asm->EmitSectionOffset(getStringPoolEntry(Name), DwarfStrSectionSym);
Chris Lattner7e1a8f82010-04-04 19:09:29 +00002306 Asm->EmitULEB128(Labels.size(), "Inline count");
Bill Wendling94d04b82009-05-20 23:21:38 +00002307
Devang Patel53bb5c92009-11-10 23:06:00 +00002308 for (SmallVector<InlineInfoLabels, 4>::iterator LI = Labels.begin(),
Bill Wendling94d04b82009-05-20 23:21:38 +00002309 LE = Labels.end(); LI != LE; ++LI) {
Chris Lattner3f53c832010-04-04 18:52:31 +00002310 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
Chris Lattner6ed0f902010-03-09 00:31:02 +00002311 Asm->EmitInt32(LI->second->getOffset());
Bill Wendling94d04b82009-05-20 23:21:38 +00002312
Chris Lattner3f53c832010-04-04 18:52:31 +00002313 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("low_pc");
Chris Lattnerd38fee82010-04-05 00:13:49 +00002314 Asm->OutStreamer.EmitSymbolValue(LI->first,
Chandler Carruth426c2bf2012-11-01 09:14:31 +00002315 Asm->getDataLayout().getPointerSize(),0);
Bill Wendling94d04b82009-05-20 23:21:38 +00002316 }
2317 }
2318
Chris Lattnerc0215722010-04-04 19:25:43 +00002319 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_end", 1));
Bill Wendling94d04b82009-05-20 23:21:38 +00002320}
Eric Christopher98e237f2012-11-30 23:59:06 +00002321
2322// DWARF5 Experimental Fission emitters.
2323
2324// This DIE has the following attributes: DW_AT_comp_dir, DW_AT_stmt_list,
2325// DW_AT_low_pc, DW_AT_high_pc, DW_AT_ranges, DW_AT_dwo_name, DW_AT_dwo_id,
2326// DW_AT_ranges_base, DW_AT_addr_base. If DW_AT_ranges is present,
2327// DW_AT_low_pc and DW_AT_high_pc are not used, and vice versa.
Eric Christopher4daaed12012-12-10 19:51:21 +00002328CompileUnit *DwarfDebug::constructSkeletonCU(const MDNode *N) {
Eric Christopher98e237f2012-11-30 23:59:06 +00002329 DICompileUnit DIUnit(N);
2330 StringRef FN = DIUnit.getFilename();
2331 CompilationDir = DIUnit.getDirectory();
Eric Christopher98e237f2012-11-30 23:59:06 +00002332
2333 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002334 CompileUnit *NewCU = new CompileUnit(GlobalCUIndexCount++,
2335 DIUnit.getLanguage(), Die, Asm, this);
Eric Christopher98e237f2012-11-30 23:59:06 +00002336 // FIXME: This should be the .dwo file.
2337 NewCU->addString(Die, dwarf::DW_AT_GNU_dwo_name, FN);
2338
2339 // FIXME: We also need DW_AT_addr_base and DW_AT_dwo_id.
2340
2341 // 2.17.1 requires that we use DW_AT_low_pc for a single entry point
2342 // into an entity.
2343 NewCU->addUInt(Die, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, 0);
2344 // DW_AT_stmt_list is a offset of line number information for this
2345 // compile unit in debug_line section.
2346 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
2347 NewCU->addLabel(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4,
2348 Asm->GetTempSymbol("section_line"));
2349 else
2350 NewCU->addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4, 0);
2351
2352 if (!CompilationDir.empty())
2353 NewCU->addString(Die, dwarf::DW_AT_comp_dir, CompilationDir);
2354
2355 return NewCU;
2356}
2357
Eric Christopher4daaed12012-12-10 19:51:21 +00002358void DwarfDebug::emitSkeletonCU(const MCSection *Section) {
Eric Christopher98e237f2012-11-30 23:59:06 +00002359 Asm->OutStreamer.SwitchSection(Section);
Eric Christopher4daaed12012-12-10 19:51:21 +00002360 DIE *Die = SkeletonCU->getCUDie();
Eric Christopher98e237f2012-11-30 23:59:06 +00002361
2362 // Emit the compile units header.
2363 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("skel_info_begin",
Eric Christopher4daaed12012-12-10 19:51:21 +00002364 SkeletonCU->getUniqueID()));
Eric Christopher98e237f2012-11-30 23:59:06 +00002365
2366 // Emit size of content not including length itself
2367 unsigned ContentSize = Die->getSize() +
2368 sizeof(int16_t) + // DWARF version number
2369 sizeof(int32_t) + // Offset Into Abbrev. Section
2370 sizeof(int8_t); // Pointer Size (in bytes)
2371
2372 Asm->OutStreamer.AddComment("Length of Compilation Unit Info");
2373 Asm->EmitInt32(ContentSize);
2374 Asm->OutStreamer.AddComment("DWARF version number");
2375 Asm->EmitInt16(dwarf::DWARF_VERSION);
2376 Asm->OutStreamer.AddComment("Offset Into Abbrev. Section");
2377 Asm->EmitSectionOffset(Asm->GetTempSymbol("abbrev_begin"),
2378 DwarfAbbrevSectionSym);
2379 Asm->OutStreamer.AddComment("Address Size (in bytes)");
2380 Asm->EmitInt8(Asm->getDataLayout().getPointerSize());
2381
2382 emitDIE(Die);
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002383 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("skel_info_end",
Eric Christopher4daaed12012-12-10 19:51:21 +00002384 SkeletonCU->getUniqueID()));
Eric Christopher98e237f2012-11-30 23:59:06 +00002385
2386
2387}
2388
2389// Emit the .debug_info.dwo section for fission. This contains the compile
2390// units that would normally be in debug_info.
2391void DwarfDebug::emitDebugInfoDWO() {
Eric Christopher4daaed12012-12-10 19:51:21 +00002392 assert(useSplitDwarf() && "No split dwarf debug info?");
Eric Christopher98e237f2012-11-30 23:59:06 +00002393 emitCompileUnits(Asm->getObjFileLowering().getDwarfInfoDWOSection());
2394}