blob: 5056ecabffd85b925ddce50805a06ac81108d82b [file] [log] [blame]
Bill Wendling0310d762009-05-15 09:23:25 +00001//===-- llvm/CodeGen/DwarfDebug.cpp - Dwarf Debug Framework ---------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file contains support for writing dwarf debug info into asm files.
11//
12//===----------------------------------------------------------------------===//
Chris Lattner6cde3e62010-03-09 00:39:24 +000013
Devang Patele4b27562009-08-28 23:24:31 +000014#define DEBUG_TYPE "dwarfdebug"
Bill Wendling0310d762009-05-15 09:23:25 +000015#include "DwarfDebug.h"
Chris Lattner74e41f92010-04-05 05:24:55 +000016#include "DIE.h"
Eric Christopher0d27ca12013-08-08 23:45:55 +000017#include "DIEHash.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/DIBuilder.h"
Chandler Carruthd04a8d42012-12-03 16:50:05 +000027#include "llvm/DebugInfo.h"
Chandler Carruth0b8c9a82013-01-02 11:36:10 +000028#include "llvm/IR/Constants.h"
29#include "llvm/IR/DataLayout.h"
30#include "llvm/IR/Instructions.h"
31#include "llvm/IR/Module.h"
Chris Lattnerb7db7332010-03-09 01:58:53 +000032#include "llvm/MC/MCAsmInfo.h"
Chris Lattnera87dea42009-07-31 18:48:30 +000033#include "llvm/MC/MCSection.h"
Chris Lattner6c2f9e12009-08-19 05:49:37 +000034#include "llvm/MC/MCStreamer.h"
Chris Lattnerb7db7332010-03-09 01:58:53 +000035#include "llvm/MC/MCSymbol.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"
David Majnemerd7d43dc2013-08-21 06:13:34 +000038#include "llvm/Support/Dwarf.h"
Daniel Dunbar6e4bdfc2009-10-13 06:47:08 +000039#include "llvm/Support/ErrorHandling.h"
Chris Lattner0ad9c912010-01-22 22:09:00 +000040#include "llvm/Support/FormattedStream.h"
Eric Christopher3dee5752013-07-26 17:02:41 +000041#include "llvm/Support/MD5.h"
Michael J. Spencer1f6efa32010-11-29 18:16:10 +000042#include "llvm/Support/Path.h"
Chandler Carruthd04a8d42012-12-03 16:50:05 +000043#include "llvm/Support/Timer.h"
44#include "llvm/Support/ValueHandle.h"
45#include "llvm/Target/TargetFrameLowering.h"
46#include "llvm/Target/TargetLoweringObjectFile.h"
47#include "llvm/Target/TargetMachine.h"
48#include "llvm/Target/TargetOptions.h"
49#include "llvm/Target/TargetRegisterInfo.h"
Bill Wendling0310d762009-05-15 09:23:25 +000050using namespace llvm;
51
Eric Christopher6e61e0b2013-07-23 22:16:41 +000052static cl::opt<bool>
53DisableDebugInfoPrinting("disable-debug-info-print", cl::Hidden,
54 cl::desc("Disable debug info printing"));
Devang Pateleac9c072010-04-27 19:46:33 +000055
Eric Christopher6e61e0b2013-07-23 22:16:41 +000056static cl::opt<bool> UnknownLocations(
57 "use-unknown-locations", cl::Hidden,
58 cl::desc("Make an absence of debug location information explicit."),
59 cl::init(false));
Dan Gohman281d65d2010-05-07 01:08:53 +000060
Eric Christopher6e61e0b2013-07-23 22:16:41 +000061static cl::opt<bool>
Eric Christopher3dee5752013-07-26 17:02:41 +000062GenerateODRHash("generate-odr-hash", cl::Hidden,
63 cl::desc("Add an ODR hash to external type DIEs."),
64 cl::init(false));
65
Eric Christopher0710bfa2013-08-13 01:21:55 +000066static cl::opt<bool>
67GenerateCUHash("generate-cu-hash", cl::Hidden,
68 cl::desc("Add the CU hash as the dwo_id."),
69 cl::init(false));
70
Eric Christopher20f47ab2012-08-23 22:36:40 +000071namespace {
Eric Christopher6e61e0b2013-07-23 22:16:41 +000072enum DefaultOnOff {
73 Default,
74 Enable,
75 Disable
76};
Eric Christopher20f47ab2012-08-23 22:36:40 +000077}
Eric Christopher09ac3d82011-11-07 09:24:32 +000078
Eric Christopher6e61e0b2013-07-23 22:16:41 +000079static cl::opt<DefaultOnOff>
80DwarfAccelTables("dwarf-accel-tables", cl::Hidden,
81 cl::desc("Output prototype dwarf accelerator tables."),
82 cl::values(clEnumVal(Default, "Default for platform"),
83 clEnumVal(Enable, "Enabled"),
84 clEnumVal(Disable, "Disabled"), clEnumValEnd),
85 cl::init(Default));
Eric Christopher20f47ab2012-08-23 22:36:40 +000086
Eric Christopher6e61e0b2013-07-23 22:16:41 +000087static cl::opt<DefaultOnOff>
Eric Christopher6e61e0b2013-07-23 22:16:41 +000088SplitDwarf("split-dwarf", cl::Hidden,
89 cl::desc("Output prototype dwarf split debug info."),
90 cl::values(clEnumVal(Default, "Default for platform"),
91 clEnumVal(Enable, "Enabled"),
92 clEnumVal(Disable, "Disabled"), clEnumValEnd),
93 cl::init(Default));
Eric Christopherf5b6dcd2012-11-12 22:22:20 +000094
Eric Christopherf04e4ef2013-08-19 21:07:38 +000095static cl::opt<DefaultOnOff>
Eric Christopher63ae7c92013-08-26 23:24:35 +000096DwarfPubSections("generate-dwarf-pub-sections", cl::Hidden,
97 cl::desc("Generate DWARF pubnames and pubtypes sections"),
98 cl::values(clEnumVal(Default, "Default for platform"),
99 clEnumVal(Enable, "Enabled"),
100 clEnumVal(Disable, "Disabled"), clEnumValEnd),
101 cl::init(Default));
Eric Christopherf04e4ef2013-08-19 21:07:38 +0000102
Benjamin Kramer0b6962f2013-08-24 12:54:27 +0000103static const char *const DWARFGroupName = "DWARF Emission";
104static const char *const DbgTimerName = "DWARF Debug Writer";
Bill Wendling5f017e82010-04-07 09:28:04 +0000105
Bill Wendling0310d762009-05-15 09:23:25 +0000106//===----------------------------------------------------------------------===//
107
Eric Christopherb6dc8652012-11-27 22:43:45 +0000108// Configuration values for initial hash set sizes (log2).
109//
Bill Wendling0310d762009-05-15 09:23:25 +0000110static const unsigned InitAbbreviationsSetSize = 9; // log2(512)
Bill Wendling0310d762009-05-15 09:23:25 +0000111
112namespace llvm {
113
Nick Lewycky3bbb6f72011-07-29 03:49:23 +0000114DIType DbgVariable::getType() const {
Devang Patel3cbee302011-04-12 22:53:02 +0000115 DIType Ty = Var.getType();
116 // FIXME: isBlockByrefVariable should be reformulated in terms of complex
117 // addresses instead.
118 if (Var.isBlockByrefVariable()) {
119 /* Byref variables, in Blocks, are declared by the programmer as
120 "SomeType VarName;", but the compiler creates a
121 __Block_byref_x_VarName struct, and gives the variable VarName
122 either the struct, or a pointer to the struct, as its type. This
123 is necessary for various behind-the-scenes things the compiler
124 needs to do with by-reference variables in blocks.
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000125
Devang Patel3cbee302011-04-12 22:53:02 +0000126 However, as far as the original *programmer* is concerned, the
127 variable should still have type 'SomeType', as originally declared.
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000128
Devang Patel3cbee302011-04-12 22:53:02 +0000129 The following function dives into the __Block_byref_x_VarName
130 struct to find the original type of the variable. This will be
131 passed back to the code generating the type for the Debug
132 Information Entry for the variable 'VarName'. 'VarName' will then
133 have the original type 'SomeType' in its debug information.
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000134
Devang Patel3cbee302011-04-12 22:53:02 +0000135 The original type 'SomeType' will be the type of the field named
136 'VarName' inside the __Block_byref_x_VarName struct.
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000137
Devang Patel3cbee302011-04-12 22:53:02 +0000138 NOTE: In order for this to not completely fail on the debugger
139 side, the Debug Information Entry for the variable VarName needs to
140 have a DW_AT_location that tells the debugger how to unwind through
141 the pointers and __Block_byref_x_VarName struct to find the actual
142 value of the variable. The function addBlockByrefType does this. */
143 DIType subType = Ty;
Eric Christopher31667622013-08-08 01:41:00 +0000144 uint16_t tag = Ty.getTag();
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000145
Eric Christopher4dc211a2013-09-04 19:53:21 +0000146 if (tag == dwarf::DW_TAG_pointer_type)
147 subType = DIDerivedType(Ty).getTypeDerivedFrom();
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000148
Eric Christopher4dc211a2013-09-04 19:53:21 +0000149 DIArray Elements = DICompositeType(subType).getTypeArray();
Devang Patel3cbee302011-04-12 22:53:02 +0000150 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
Eric Christopher4dc211a2013-09-04 19:53:21 +0000151 DIDerivedType DT = DIDerivedType(Elements.getElement(i));
Devang Patel3cbee302011-04-12 22:53:02 +0000152 if (getName() == DT.getName())
153 return (DT.getTypeDerivedFrom());
Devang Patel8bd11de2010-08-09 21:01:39 +0000154 }
Devang Patel8bd11de2010-08-09 21:01:39 +0000155 }
Devang Patel3cbee302011-04-12 22:53:02 +0000156 return Ty;
157}
Bill Wendling0310d762009-05-15 09:23:25 +0000158
Chris Lattnerea761862010-04-05 04:09:20 +0000159} // end llvm namespace
Bill Wendling0310d762009-05-15 09:23:25 +0000160
Manman Ren0e6783f2013-07-02 23:40:10 +0000161/// Return Dwarf Version by checking module flags.
162static unsigned getDwarfVersionFromModule(const Module *M) {
Manman Renc8cfaa12013-07-16 23:21:16 +0000163 Value *Val = M->getModuleFlag("Dwarf Version");
164 if (!Val)
Eric Christopherefc47ec2013-09-04 22:21:24 +0000165 return dwarf::DWARF_VERSION;
Manman Renc8cfaa12013-07-16 23:21:16 +0000166 return cast<ConstantInt>(Val)->getZExtValue();
Manman Ren0e6783f2013-07-02 23:40:10 +0000167}
168
Chris Lattner49cd6642010-04-05 05:11:15 +0000169DwarfDebug::DwarfDebug(AsmPrinter *A, Module *M)
Eric Christopher28bd25a2012-12-10 19:51:13 +0000170 : Asm(A), MMI(Asm->MMI), FirstCU(0),
Jim Grosbach1e20b962010-07-21 21:21:52 +0000171 AbbreviationsSet(InitAbbreviationsSetSize),
Eric Christopherb6714222013-01-08 22:22:06 +0000172 SourceIdMap(DIEValueAllocator),
Eric Christopher0e3e9b72012-12-10 23:34:43 +0000173 PrevLabel(NULL), GlobalCUIndexCount(0),
Eric Christopherb6714222013-01-08 22:22:06 +0000174 InfoHolder(A, &AbbreviationsSet, &Abbreviations, "info_string",
175 DIEValueAllocator),
Eric Christopher6eebe472012-12-19 22:02:53 +0000176 SkeletonAbbrevSet(InitAbbreviationsSetSize),
Eric Christopherb6714222013-01-08 22:22:06 +0000177 SkeletonHolder(A, &SkeletonAbbrevSet, &SkeletonAbbrevs, "skel_string",
178 DIEValueAllocator) {
Jim Grosbach1e20b962010-07-21 21:21:52 +0000179
Rafael Espindolaf2b04232011-05-06 14:56:22 +0000180 DwarfInfoSectionSym = DwarfAbbrevSectionSym = 0;
Chris Lattner4ad1efe2010-04-04 23:10:38 +0000181 DwarfStrSectionSym = TextSectionSym = 0;
Eric Christopher7a0103c2013-02-07 21:19:50 +0000182 DwarfDebugRangeSectionSym = DwarfDebugLocSectionSym = DwarfLineSectionSym = 0;
Eric Christopher9a9e73b2013-04-07 03:43:09 +0000183 DwarfAddrSectionSym = 0;
Eric Christopher64f824c2012-12-27 02:14:01 +0000184 DwarfAbbrevDWOSectionSym = DwarfStrDWOSectionSym = 0;
Devang Patelc3f5f782010-05-25 23:40:22 +0000185 FunctionBeginSym = FunctionEndSym = 0;
Eric Christopher60777d82012-04-02 17:58:52 +0000186
Eric Christopher10cb7442012-08-23 07:10:46 +0000187 // Turn on accelerator tables and older gdb compatibility
Eric Christopher05bae3b2013-08-19 21:41:38 +0000188 // for Darwin by default, pubnames by default for non-Darwin,
189 // and handle split dwarf.
Eric Christopher00297ba2013-04-27 01:07:52 +0000190 bool IsDarwin = Triple(A->getTargetTriple()).isOSDarwin();
Eric Christopherc1610fa2012-08-23 22:36:36 +0000191
Eric Christopher05bae3b2013-08-19 21:41:38 +0000192 if (DwarfAccelTables == Default)
193 HasDwarfAccelTables = IsDarwin;
194 else
Eric Christopher03be5e52013-08-26 20:58:35 +0000195 HasDwarfAccelTables = DwarfAccelTables == Enable;
Eric Christopher20f47ab2012-08-23 22:36:40 +0000196
Eric Christopher4daaed12012-12-10 19:51:21 +0000197 if (SplitDwarf == Default)
198 HasSplitDwarf = false;
Eric Christopherf5b6dcd2012-11-12 22:22:20 +0000199 else
Eric Christopher05bae3b2013-08-19 21:41:38 +0000200 HasSplitDwarf = SplitDwarf == Enable;
Eric Christopherf5b6dcd2012-11-12 22:22:20 +0000201
Eric Christopher63ae7c92013-08-26 23:24:35 +0000202 if (DwarfPubSections == Default)
203 HasDwarfPubSections = !IsDarwin;
Eric Christopher05bae3b2013-08-19 21:41:38 +0000204 else
Eric Christopher63ae7c92013-08-26 23:24:35 +0000205 HasDwarfPubSections = DwarfPubSections == Enable;
Eric Christopherf04e4ef2013-08-19 21:07:38 +0000206
Manman Ren0e6783f2013-07-02 23:40:10 +0000207 DwarfVersion = getDwarfVersionFromModule(MMI->getModule());
208
Dan Gohman03c3dc72010-06-18 15:56:31 +0000209 {
210 NamedRegionTimer T(DbgTimerName, DWARFGroupName, TimePassesIsEnabled);
Eric Christopherc4639d62012-11-19 22:42:15 +0000211 beginModule();
Torok Edwin9c421072010-04-07 10:44:46 +0000212 }
Bill Wendling0310d762009-05-15 09:23:25 +0000213}
214DwarfDebug::~DwarfDebug() {
Bill Wendling0310d762009-05-15 09:23:25 +0000215}
216
Eric Christopherb6dc8652012-11-27 22:43:45 +0000217// Switch to the specified MCSection and emit an assembler
218// temporary label to it if SymbolStem is specified.
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000219static MCSymbol *emitSectionSym(AsmPrinter *Asm, const MCSection *Section,
Eric Christopherd8a87522011-11-07 09:18:38 +0000220 const char *SymbolStem = 0) {
221 Asm->OutStreamer.SwitchSection(Section);
222 if (!SymbolStem) return 0;
223
224 MCSymbol *TmpSym = Asm->GetTempSymbol(SymbolStem);
225 Asm->OutStreamer.EmitLabel(TmpSym);
226 return TmpSym;
227}
228
Eric Christopher2e5d8702012-12-20 21:58:36 +0000229MCSymbol *DwarfUnits::getStringPoolSym() {
Eric Christopher64f824c2012-12-27 02:14:01 +0000230 return Asm->GetTempSymbol(StringPref);
Nick Lewycky390c40d2011-10-27 06:44:11 +0000231}
232
Eric Christopher2e5d8702012-12-20 21:58:36 +0000233MCSymbol *DwarfUnits::getStringPoolEntry(StringRef Str) {
234 std::pair<MCSymbol*, unsigned> &Entry =
Eric Christopherb6714222013-01-08 22:22:06 +0000235 StringPool.GetOrCreateValue(Str).getValue();
Chris Lattnerbc733f52010-03-13 02:17:42 +0000236 if (Entry.first) return Entry.first;
237
238 Entry.second = NextStringPoolNumber++;
Eric Christopher64f824c2012-12-27 02:14:01 +0000239 return Entry.first = Asm->GetTempSymbol(StringPref, Entry.second);
Chris Lattnerbc733f52010-03-13 02:17:42 +0000240}
241
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000242unsigned DwarfUnits::getStringPoolIndex(StringRef Str) {
243 std::pair<MCSymbol*, unsigned> &Entry =
Eric Christopherb6714222013-01-08 22:22:06 +0000244 StringPool.GetOrCreateValue(Str).getValue();
Eric Christopherdd8e9f32013-01-07 19:32:41 +0000245 if (Entry.first) return Entry.second;
246
247 Entry.second = NextStringPoolNumber++;
248 Entry.first = Asm->GetTempSymbol(StringPref, Entry.second);
249 return Entry.second;
250}
251
David Blaikie321d83b2013-06-28 18:47:14 +0000252unsigned DwarfUnits::getAddrPoolIndex(const MCSymbol *Sym) {
David Blaikie8fed05e2013-07-01 23:55:52 +0000253 return getAddrPoolIndex(MCSymbolRefExpr::Create(Sym, Asm->OutContext));
254}
255
Ulrich Weigand18dbe502013-07-02 18:46:46 +0000256unsigned DwarfUnits::getAddrPoolIndex(const MCExpr *Sym) {
257 std::pair<DenseMap<const MCExpr *, unsigned>::iterator, bool> P =
David Blaikie1c736322013-06-28 18:47:19 +0000258 AddressPool.insert(std::make_pair(Sym, NextAddrPoolNumber));
David Blaikie1ca79902013-06-28 18:55:13 +0000259 if (P.second)
260 ++NextAddrPoolNumber;
David Blaikie1c736322013-06-28 18:47:19 +0000261 return P.first->second;
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000262}
263
Eric Christopherb6dc8652012-11-27 22:43:45 +0000264// Define a unique number for the abbreviation.
265//
Eric Christopher0e3e9b72012-12-10 23:34:43 +0000266void DwarfUnits::assignAbbrevNumber(DIEAbbrev &Abbrev) {
Bill Wendling0310d762009-05-15 09:23:25 +0000267 // Check the set for priors.
Eric Christopher0e3e9b72012-12-10 23:34:43 +0000268 DIEAbbrev *InSet = AbbreviationsSet->GetOrInsertNode(&Abbrev);
Bill Wendling0310d762009-05-15 09:23:25 +0000269
270 // If it's newly added.
271 if (InSet == &Abbrev) {
272 // Add to abbreviation list.
Eric Christopher0e3e9b72012-12-10 23:34:43 +0000273 Abbreviations->push_back(&Abbrev);
Bill Wendling0310d762009-05-15 09:23:25 +0000274
275 // Assign the vector position + 1 as its number.
Eric Christopher0e3e9b72012-12-10 23:34:43 +0000276 Abbrev.setNumber(Abbreviations->size());
Bill Wendling0310d762009-05-15 09:23:25 +0000277 } else {
278 // Assign existing abbreviation number.
279 Abbrev.setNumber(InSet->getNumber());
280 }
281}
282
Eric Christopher0ffe2b42011-11-10 19:25:34 +0000283static bool isObjCClass(StringRef Name) {
284 return Name.startswith("+") || Name.startswith("-");
285}
286
287static bool hasObjCCategory(StringRef Name) {
288 if (!isObjCClass(Name)) return false;
289
Benjamin Kramer4321d4e2013-08-24 12:15:54 +0000290 return Name.find(") ") != StringRef::npos;
Eric Christopher0ffe2b42011-11-10 19:25:34 +0000291}
292
293static void getObjCClassCategory(StringRef In, StringRef &Class,
294 StringRef &Category) {
295 if (!hasObjCCategory(In)) {
296 Class = In.slice(In.find('[') + 1, In.find(' '));
297 Category = "";
298 return;
299 }
300
301 Class = In.slice(In.find('[') + 1, In.find('('));
302 Category = In.slice(In.find('[') + 1, In.find(' '));
303 return;
304}
305
306static StringRef getObjCMethodName(StringRef In) {
307 return In.slice(In.find(' ') + 1, In.find(']'));
308}
309
310// Add the various names to the Dwarf accelerator table names.
311static void addSubprogramNames(CompileUnit *TheCU, DISubprogram SP,
312 DIE* Die) {
313 if (!SP.isDefinition()) return;
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000314
Eric Christopher0ffe2b42011-11-10 19:25:34 +0000315 TheCU->addAccelName(SP.getName(), Die);
316
317 // If the linkage name is different than the name, go ahead and output
318 // that as well into the name table.
319 if (SP.getLinkageName() != "" && SP.getName() != SP.getLinkageName())
320 TheCU->addAccelName(SP.getLinkageName(), Die);
321
322 // If this is an Objective-C selector name add it to the ObjC accelerator
323 // too.
324 if (isObjCClass(SP.getName())) {
325 StringRef Class, Category;
326 getObjCClassCategory(SP.getName(), Class, Category);
327 TheCU->addAccelObjC(Class, Die);
328 if (Category != "")
329 TheCU->addAccelObjC(Category, Die);
330 // Also add the base method name to the name table.
331 TheCU->addAccelName(getObjCMethodName(SP.getName()), Die);
332 }
333}
334
Manman Ren02d29672013-09-09 19:05:21 +0000335/// isSubprogramContext - Return true if Context is either a subprogram
336/// or another context nested inside a subprogram.
337bool DwarfDebug::isSubprogramContext(const MDNode *Context) {
338 if (!Context)
339 return false;
340 DIDescriptor D(Context);
341 if (D.isSubprogram())
342 return true;
343 if (D.isType())
Manman Ren2c9905a2013-09-09 19:47:11 +0000344 return isSubprogramContext(resolve(DIType(Context).getContext()));
Manman Ren02d29672013-09-09 19:05:21 +0000345 return false;
346}
347
Eric Christopherb6dc8652012-11-27 22:43:45 +0000348// Find DIE for the given subprogram and attach appropriate DW_AT_low_pc
349// and DW_AT_high_pc attributes. If there are global variables in this
350// scope then create and insert DIEs for these variables.
Devang Pateld3024342011-08-15 22:24:32 +0000351DIE *DwarfDebug::updateSubprogramScopeDIE(CompileUnit *SPCU,
352 const MDNode *SPNode) {
Devang Patel163a9f72010-05-10 22:49:55 +0000353 DIE *SPDie = SPCU->getDIE(SPNode);
Devang Patel8aa61472010-07-07 22:20:57 +0000354
Chris Lattnerd38fee82010-04-05 00:13:49 +0000355 assert(SPDie && "Unable to find subprogram DIE!");
356 DISubprogram SP(SPNode);
Jim Grosbach1e20b962010-07-21 21:21:52 +0000357
Bill Wendling168c1902012-11-07 05:19:04 +0000358 // If we're updating an abstract DIE, then we will be adding the children and
359 // object pointer later on. But what we don't want to do is process the
360 // concrete DIE twice.
Manman Renbc3e96f2013-03-12 18:27:15 +0000361 DIE *AbsSPDIE = AbstractSPDies.lookup(SPNode);
362 if (AbsSPDIE) {
363 bool InSameCU = (AbsSPDIE->getCompileUnit() == SPCU->getCUDie());
Bill Wendling168c1902012-11-07 05:19:04 +0000364 // Pick up abstract subprogram DIE.
Devang Patel8aa61472010-07-07 22:20:57 +0000365 SPDie = new DIE(dwarf::DW_TAG_subprogram);
Manman Renbc3e96f2013-03-12 18:27:15 +0000366 // If AbsSPDIE belongs to a different CU, use DW_FORM_ref_addr instead of
367 // DW_FORM_ref4.
Devang Patel3cbee302011-04-12 22:53:02 +0000368 SPCU->addDIEEntry(SPDie, dwarf::DW_AT_abstract_origin,
Manman Renbc3e96f2013-03-12 18:27:15 +0000369 InSameCU ? dwarf::DW_FORM_ref4 : dwarf::DW_FORM_ref_addr,
370 AbsSPDIE);
Devang Patel8aa61472010-07-07 22:20:57 +0000371 SPCU->addDie(SPDie);
Bill Wendlinga4c76932012-11-07 04:42:18 +0000372 } else {
373 DISubprogram SPDecl = SP.getFunctionDeclaration();
374 if (!SPDecl.isSubprogram()) {
375 // There is not any need to generate specification DIE for a function
376 // defined at compile unit level. If a function is defined inside another
377 // function then gdb prefers the definition at top level and but does not
378 // expect specification DIE in parent function. So avoid creating
379 // specification DIE for a function defined inside a function.
380 if (SP.isDefinition() && !SP.getContext().isCompileUnit() &&
381 !SP.getContext().isFile() &&
382 !isSubprogramContext(SP.getContext())) {
383 SPCU->addFlag(SPDie, dwarf::DW_AT_declaration);
384
385 // Add arguments.
386 DICompositeType SPTy = SP.getType();
387 DIArray Args = SPTy.getTypeArray();
Eric Christopher31667622013-08-08 01:41:00 +0000388 uint16_t SPTag = SPTy.getTag();
Bill Wendlinga4c76932012-11-07 04:42:18 +0000389 if (SPTag == dwarf::DW_TAG_subroutine_type)
390 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
391 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
392 DIType ATy = DIType(Args.getElement(i));
393 SPCU->addType(Arg, ATy);
394 if (ATy.isArtificial())
395 SPCU->addFlag(Arg, dwarf::DW_AT_artificial);
396 if (ATy.isObjectPointer())
397 SPCU->addDIEEntry(SPDie, dwarf::DW_AT_object_pointer,
398 dwarf::DW_FORM_ref4, Arg);
399 SPDie->addChild(Arg);
400 }
401 DIE *SPDeclDie = SPDie;
402 SPDie = new DIE(dwarf::DW_TAG_subprogram);
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000403 SPCU->addDIEEntry(SPDie, dwarf::DW_AT_specification,
404 dwarf::DW_FORM_ref4, SPDeclDie);
Bill Wendlinga4c76932012-11-07 04:42:18 +0000405 SPCU->addDie(SPDie);
406 }
407 }
Devang Patel8aa61472010-07-07 22:20:57 +0000408 }
409
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000410 SPCU->addLabelAddress(SPDie, dwarf::DW_AT_low_pc,
411 Asm->GetTempSymbol("func_begin",
412 Asm->getFunctionNumber()));
413 SPCU->addLabelAddress(SPDie, dwarf::DW_AT_high_pc,
414 Asm->GetTempSymbol("func_end",
415 Asm->getFunctionNumber()));
Chris Lattnerd38fee82010-04-05 00:13:49 +0000416 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
417 MachineLocation Location(RI->getFrameRegister(*Asm->MF));
Devang Patel3cbee302011-04-12 22:53:02 +0000418 SPCU->addAddress(SPDie, dwarf::DW_AT_frame_base, Location);
Devang Patelb4645642010-02-06 01:02:37 +0000419
Eric Christopher0ffe2b42011-11-10 19:25:34 +0000420 // Add name to the name table, we do this here because we're guaranteed
421 // to have concrete versions of our DW_TAG_subprogram nodes.
422 addSubprogramNames(SPCU, SP, SPDie);
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000423
Chris Lattnerd38fee82010-04-05 00:13:49 +0000424 return SPDie;
Devang Patel53bb5c92009-11-10 23:06:00 +0000425}
426
Manman Renfd2210a2013-09-10 18:40:41 +0000427bool DwarfDebug::isLexicalScopeDIENull(LexicalScope *Scope) {
428 if (Scope->isAbstractScope())
429 return false;
430
431 const SmallVectorImpl<InsnRange> &Ranges = Scope->getRanges();
432 if (Ranges.empty())
433 return true;
434
435 if (Ranges.size() > 1)
436 return false;
437
438 SmallVectorImpl<InsnRange>::const_iterator RI = Ranges.begin();
439 MCSymbol *End = getLabelAfterInsn(RI->second);
440 return !End;
441}
442
Eric Christopherb6dc8652012-11-27 22:43:45 +0000443// Construct new DW_TAG_lexical_block for this scope and attach
444// DW_AT_low_pc/DW_AT_high_pc labels.
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000445DIE *DwarfDebug::constructLexicalScopeDIE(CompileUnit *TheCU,
Devang Pateld3024342011-08-15 22:24:32 +0000446 LexicalScope *Scope) {
Manman Renfd2210a2013-09-10 18:40:41 +0000447 if (isLexicalScopeDIENull(Scope))
448 return 0;
449
Devang Pateleac9c072010-04-27 19:46:33 +0000450 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_lexical_block);
451 if (Scope->isAbstractScope())
452 return ScopeDIE;
453
Craig Topper9f43ac62013-07-03 04:24:43 +0000454 const SmallVectorImpl<InsnRange> &Ranges = Scope->getRanges();
Eric Christopherf53d6432013-07-03 01:57:28 +0000455 // If we have multiple ranges, emit them into the range section.
Devang Pateleac9c072010-04-27 19:46:33 +0000456 if (Ranges.size() > 1) {
457 // .debug_range section has not been laid out yet. Emit offset in
Jim Grosbach1e20b962010-07-21 21:21:52 +0000458 // .debug_range as a uint, size 4, for now. emitDIE will handle
Devang Pateleac9c072010-04-27 19:46:33 +0000459 // DW_AT_ranges appropriately.
Devang Patel3cbee302011-04-12 22:53:02 +0000460 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_ranges, dwarf::DW_FORM_data4,
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000461 DebugRangeSymbols.size()
Chandler Carruth426c2bf2012-11-01 09:14:31 +0000462 * Asm->getDataLayout().getPointerSize());
Craig Topper2d785db2013-07-03 04:17:25 +0000463 for (SmallVectorImpl<InsnRange>::const_iterator RI = Ranges.begin(),
Devang Pateleac9c072010-04-27 19:46:33 +0000464 RE = Ranges.end(); RI != RE; ++RI) {
Devang Patelc3f5f782010-05-25 23:40:22 +0000465 DebugRangeSymbols.push_back(getLabelBeforeInsn(RI->first));
466 DebugRangeSymbols.push_back(getLabelAfterInsn(RI->second));
Devang Pateleac9c072010-04-27 19:46:33 +0000467 }
Eric Christopherda965de2013-07-03 01:22:29 +0000468
469 // Terminate the range list.
Devang Pateleac9c072010-04-27 19:46:33 +0000470 DebugRangeSymbols.push_back(NULL);
471 DebugRangeSymbols.push_back(NULL);
472 return ScopeDIE;
473 }
474
Eric Christopherf53d6432013-07-03 01:57:28 +0000475 // Construct the address range for this DIE.
Craig Topper2d785db2013-07-03 04:17:25 +0000476 SmallVectorImpl<InsnRange>::const_iterator RI = Ranges.begin();
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000477 MCSymbol *Start = getLabelBeforeInsn(RI->first);
478 MCSymbol *End = getLabelAfterInsn(RI->second);
Manman Renfd2210a2013-09-10 18:40:41 +0000479 assert(End && "End label should not be null!");
Devang Patel53bb5c92009-11-10 23:06:00 +0000480
Chris Lattnerb7db7332010-03-09 01:58:53 +0000481 assert(Start->isDefined() && "Invalid starting label for an inlined scope!");
482 assert(End->isDefined() && "Invalid end label for an inlined scope!");
Jim Grosbach1e20b962010-07-21 21:21:52 +0000483
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000484 TheCU->addLabelAddress(ScopeDIE, dwarf::DW_AT_low_pc, Start);
485 TheCU->addLabelAddress(ScopeDIE, dwarf::DW_AT_high_pc, End);
Devang Patel53bb5c92009-11-10 23:06:00 +0000486
487 return ScopeDIE;
488}
489
Eric Christopherb6dc8652012-11-27 22:43:45 +0000490// This scope represents inlined body of a function. Construct DIE to
491// represent this concrete inlined copy of the function.
Devang Pateld3024342011-08-15 22:24:32 +0000492DIE *DwarfDebug::constructInlinedScopeDIE(CompileUnit *TheCU,
493 LexicalScope *Scope) {
Craig Topper9f43ac62013-07-03 04:24:43 +0000494 const SmallVectorImpl<InsnRange> &Ranges = Scope->getRanges();
Nick Lewycky746cb672011-10-26 22:55:33 +0000495 assert(Ranges.empty() == false &&
496 "LexicalScope does not have instruction markers!");
Devang Pateleac9c072010-04-27 19:46:33 +0000497
Devang Patel26a92002011-07-27 00:34:13 +0000498 if (!Scope->getScopeNode())
499 return NULL;
500 DIScope DS(Scope->getScopeNode());
501 DISubprogram InlinedSP = getDISubprogram(DS);
Manman Ren742671b2013-05-29 17:16:59 +0000502 DIE *OriginDIE = TheCU->getDIE(InlinedSP);
Devang Patel26a92002011-07-27 00:34:13 +0000503 if (!OriginDIE) {
Bill Wendlinge0aae5b2012-10-30 17:51:02 +0000504 DEBUG(dbgs() << "Unable to find original DIE for an inlined subprogram.");
Devang Patel26a92002011-07-27 00:34:13 +0000505 return NULL;
506 }
507
Devang Pateld96efb82011-05-05 17:54:26 +0000508 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_inlined_subroutine);
Devang Patel3cbee302011-04-12 22:53:02 +0000509 TheCU->addDIEEntry(ScopeDIE, dwarf::DW_AT_abstract_origin,
Manman Ren742671b2013-05-29 17:16:59 +0000510 dwarf::DW_FORM_ref4, OriginDIE);
Devang Patel53bb5c92009-11-10 23:06:00 +0000511
Devang Patel26a92002011-07-27 00:34:13 +0000512 if (Ranges.size() > 1) {
513 // .debug_range section has not been laid out yet. Emit offset in
514 // .debug_range as a uint, size 4, for now. emitDIE will handle
515 // DW_AT_ranges appropriately.
516 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_ranges, dwarf::DW_FORM_data4,
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000517 DebugRangeSymbols.size()
Chandler Carruth426c2bf2012-11-01 09:14:31 +0000518 * Asm->getDataLayout().getPointerSize());
Craig Topper2d785db2013-07-03 04:17:25 +0000519 for (SmallVectorImpl<InsnRange>::const_iterator RI = Ranges.begin(),
Devang Patel26a92002011-07-27 00:34:13 +0000520 RE = Ranges.end(); RI != RE; ++RI) {
521 DebugRangeSymbols.push_back(getLabelBeforeInsn(RI->first));
522 DebugRangeSymbols.push_back(getLabelAfterInsn(RI->second));
523 }
524 DebugRangeSymbols.push_back(NULL);
525 DebugRangeSymbols.push_back(NULL);
526 } else {
Craig Topper2d785db2013-07-03 04:17:25 +0000527 SmallVectorImpl<InsnRange>::const_iterator RI = Ranges.begin();
Eric Christophere7177132013-07-03 02:23:53 +0000528 MCSymbol *StartLabel = getLabelBeforeInsn(RI->first);
529 MCSymbol *EndLabel = getLabelAfterInsn(RI->second);
530
531 if (StartLabel == 0 || EndLabel == 0)
532 llvm_unreachable("Unexpected Start and End labels for an inlined scope!");
533
534 assert(StartLabel->isDefined() &&
535 "Invalid starting label for an inlined scope!");
536 assert(EndLabel->isDefined() && "Invalid end label for an inlined scope!");
537
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000538 TheCU->addLabelAddress(ScopeDIE, dwarf::DW_AT_low_pc, StartLabel);
539 TheCU->addLabelAddress(ScopeDIE, dwarf::DW_AT_high_pc, EndLabel);
Devang Patel26a92002011-07-27 00:34:13 +0000540 }
Devang Patel53bb5c92009-11-10 23:06:00 +0000541
542 InlinedSubprogramDIEs.insert(OriginDIE);
543
Eric Christophere7177132013-07-03 02:23:53 +0000544 // Add the call site information to the DIE.
Devang Patel53bb5c92009-11-10 23:06:00 +0000545 DILocation DL(Scope->getInlinedAt());
Eric Christopher08212002012-03-26 21:38:38 +0000546 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_call_file, 0,
Manman Ren3de61b42013-03-07 01:42:00 +0000547 getOrCreateSourceID(DL.getFilename(), DL.getDirectory(),
548 TheCU->getUniqueID()));
Devang Patel3cbee302011-04-12 22:53:02 +0000549 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_call_line, 0, DL.getLineNumber());
Devang Patel53bb5c92009-11-10 23:06:00 +0000550
Eric Christopher309bedd2011-12-04 06:02:38 +0000551 // Add name to the name table, we do this here because we're guaranteed
552 // to have concrete versions of our DW_TAG_inlined_subprogram nodes.
553 addSubprogramNames(TheCU, InlinedSP, ScopeDIE);
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000554
Devang Patel53bb5c92009-11-10 23:06:00 +0000555 return ScopeDIE;
556}
557
Manman Renfd2210a2013-09-10 18:40:41 +0000558DIE *DwarfDebug::createScopeChildrenDIE(CompileUnit *TheCU, LexicalScope *Scope,
559 SmallVectorImpl<DIE*> &Children) {
560 DIE *ObjectPointer = NULL;
Devang Patel0478c152011-03-01 22:58:55 +0000561
562 // Collect arguments for current function.
Devang Patelbf47fdb2011-08-10 20:55:27 +0000563 if (LScopes.isCurrentFunctionScope(Scope))
Devang Patel0478c152011-03-01 22:58:55 +0000564 for (unsigned i = 0, N = CurrentFnArguments.size(); i < N; ++i)
565 if (DbgVariable *ArgDV = CurrentFnArguments[i])
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000566 if (DIE *Arg =
Eric Christophere5212782012-09-12 23:36:19 +0000567 TheCU->constructVariableDIE(ArgDV, Scope->isAbstractScope())) {
Devang Patel0478c152011-03-01 22:58:55 +0000568 Children.push_back(Arg);
Eric Christophere5212782012-09-12 23:36:19 +0000569 if (ArgDV->isObjectPointer()) ObjectPointer = Arg;
570 }
Devang Patel0478c152011-03-01 22:58:55 +0000571
Eric Christopher1aeb7ac2011-10-03 15:49:16 +0000572 // Collect lexical scope children first.
Craig Topper9f43ac62013-07-03 04:24:43 +0000573 const SmallVectorImpl<DbgVariable *> &Variables =ScopeVariables.lookup(Scope);
Devang Patel5bc9fec2011-02-19 01:31:27 +0000574 for (unsigned i = 0, N = Variables.size(); i < N; ++i)
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000575 if (DIE *Variable =
Eric Christopher7b451cf2012-09-21 22:18:52 +0000576 TheCU->constructVariableDIE(Variables[i], Scope->isAbstractScope())) {
Devang Patel5bc9fec2011-02-19 01:31:27 +0000577 Children.push_back(Variable);
Eric Christopher7b451cf2012-09-21 22:18:52 +0000578 if (Variables[i]->isObjectPointer()) ObjectPointer = Variable;
579 }
Craig Topper9f43ac62013-07-03 04:24:43 +0000580 const SmallVectorImpl<LexicalScope *> &Scopes = Scope->getChildren();
Devang Patel5bc9fec2011-02-19 01:31:27 +0000581 for (unsigned j = 0, M = Scopes.size(); j < M; ++j)
Devang Pateld0b5a5e2011-08-15 22:04:40 +0000582 if (DIE *Nested = constructScopeDIE(TheCU, Scopes[j]))
Devang Patel5bc9fec2011-02-19 01:31:27 +0000583 Children.push_back(Nested);
Manman Renfd2210a2013-09-10 18:40:41 +0000584 return ObjectPointer;
585}
586
587// Construct a DIE for this scope.
588DIE *DwarfDebug::constructScopeDIE(CompileUnit *TheCU, LexicalScope *Scope) {
589 if (!Scope || !Scope->getScopeNode())
590 return NULL;
591
592 DIScope DS(Scope->getScopeNode());
593
594 SmallVector<DIE *, 8> Children;
595 DIE *ObjectPointer = NULL;
596 bool ChildrenCreated = false;
597
Devang Patel3c91b052010-03-08 20:52:55 +0000598 DIE *ScopeDIE = NULL;
599 if (Scope->getInlinedAt())
Devang Pateld3024342011-08-15 22:24:32 +0000600 ScopeDIE = constructInlinedScopeDIE(TheCU, Scope);
Devang Patel3c91b052010-03-08 20:52:55 +0000601 else if (DS.isSubprogram()) {
Devang Patel0dd45582010-06-28 20:53:04 +0000602 ProcessedSPNodes.insert(DS);
Devang Patel8aa61472010-07-07 22:20:57 +0000603 if (Scope->isAbstractScope()) {
Manman Ren742671b2013-05-29 17:16:59 +0000604 ScopeDIE = TheCU->getDIE(DS);
Devang Patel8aa61472010-07-07 22:20:57 +0000605 // Note down abstract DIE.
606 if (ScopeDIE)
607 AbstractSPDies.insert(std::make_pair(DS, ScopeDIE));
608 }
Devang Patel3c91b052010-03-08 20:52:55 +0000609 else
Devang Pateld3024342011-08-15 22:24:32 +0000610 ScopeDIE = updateSubprogramScopeDIE(TheCU, DS);
Devang Patel3c91b052010-03-08 20:52:55 +0000611 }
Devang Patel5bc9fec2011-02-19 01:31:27 +0000612 else {
Manman Renfd2210a2013-09-10 18:40:41 +0000613 if (isLexicalScopeDIENull(Scope))
614 return NULL;
615 // We create children only when we know the scope DIE is not going to be
616 // null.
617 ObjectPointer = createScopeChildrenDIE(TheCU, Scope, Children);
618 ChildrenCreated = true;
Devang Patel5bc9fec2011-02-19 01:31:27 +0000619 // There is no need to emit empty lexical block DIE.
David Blaikied2e0f7e2013-05-06 23:33:07 +0000620 std::pair<ImportedEntityMap::const_iterator,
621 ImportedEntityMap::const_iterator> Range = std::equal_range(
622 ScopesWithImportedEntities.begin(), ScopesWithImportedEntities.end(),
Timur Iskhodzhanov664fbee2013-05-07 07:47:47 +0000623 std::pair<const MDNode *, const MDNode *>(DS, (const MDNode*)0),
Benjamin Kramer0b6962f2013-08-24 12:54:27 +0000624 less_first());
David Blaikied2e0f7e2013-05-06 23:33:07 +0000625 if (Children.empty() && Range.first == Range.second)
Devang Patel5bc9fec2011-02-19 01:31:27 +0000626 return NULL;
Devang Pateld3024342011-08-15 22:24:32 +0000627 ScopeDIE = constructLexicalScopeDIE(TheCU, Scope);
Manman Renfd2210a2013-09-10 18:40:41 +0000628 assert(ScopeDIE && "Scope DIE should not be null.");
Eric Christopherfdfc81f2013-06-24 23:20:02 +0000629 for (ImportedEntityMap::const_iterator i = Range.first; i != Range.second;
630 ++i)
David Blaikied1221e32013-05-08 06:01:38 +0000631 constructImportedEntityDIE(TheCU, i->second, ScopeDIE);
Devang Patel5bc9fec2011-02-19 01:31:27 +0000632 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000633
Benjamin Kramer6bee6312013-08-24 11:55:49 +0000634 if (!ScopeDIE) {
Manman Renfd2210a2013-09-10 18:40:41 +0000635 assert(Children.empty() &&
636 "We create children only when the scope DIE is not null.");
Benjamin Kramer6bee6312013-08-24 11:55:49 +0000637 return NULL;
638 }
Manman Renfd2210a2013-09-10 18:40:41 +0000639 if (!ChildrenCreated)
640 ObjectPointer = createScopeChildrenDIE(TheCU, Scope, Children);
Jim Grosbach1e20b962010-07-21 21:21:52 +0000641
Devang Patel5bc9fec2011-02-19 01:31:27 +0000642 // Add children
Craig Topper2d785db2013-07-03 04:17:25 +0000643 for (SmallVectorImpl<DIE *>::iterator I = Children.begin(),
Devang Patel5bc9fec2011-02-19 01:31:27 +0000644 E = Children.end(); I != E; ++I)
645 ScopeDIE->addChild(*I);
Devang Patel193f7202009-11-24 01:14:22 +0000646
Eric Christophere5212782012-09-12 23:36:19 +0000647 if (DS.isSubprogram() && ObjectPointer != NULL)
648 TheCU->addDIEEntry(ScopeDIE, dwarf::DW_AT_object_pointer,
649 dwarf::DW_FORM_ref4, ObjectPointer);
650
Jim Grosbach1e20b962010-07-21 21:21:52 +0000651 if (DS.isSubprogram())
Eric Christopher0ffe2b42011-11-10 19:25:34 +0000652 TheCU->addPubTypes(DISubprogram(DS));
Jim Grosbach1e20b962010-07-21 21:21:52 +0000653
Eric Christopher0ffe2b42011-11-10 19:25:34 +0000654 return ScopeDIE;
Devang Patel53bb5c92009-11-10 23:06:00 +0000655}
656
Eric Christopherb6dc8652012-11-27 22:43:45 +0000657// Look up the source id with the given directory and source file names.
658// If none currently exists, create a new id and insert it in the
659// SourceIds map. This can update DirectoryNames and SourceFileNames maps
660// as well.
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000661unsigned DwarfDebug::getOrCreateSourceID(StringRef FileName,
Manman Ren3de61b42013-03-07 01:42:00 +0000662 StringRef DirName, unsigned CUID) {
663 // If we use .loc in assembly, we can't separate .file entries according to
664 // compile units. Thus all files will belong to the default compile unit.
665 if (Asm->TM.hasMCUseLoc() &&
666 Asm->OutStreamer.getKind() == MCStreamer::SK_AsmStreamer)
667 CUID = 0;
668
Devang Patel1905a182010-09-16 20:57:49 +0000669 // If FE did not provide a file name, then assume stdin.
670 if (FileName.empty())
Manman Ren3de61b42013-03-07 01:42:00 +0000671 return getOrCreateSourceID("<stdin>", StringRef(), CUID);
Devang Patel23670e52011-03-24 20:30:50 +0000672
Nick Lewycky6c1a7032011-11-02 20:55:33 +0000673 // TODO: this might not belong here. See if we can factor this better.
674 if (DirName == CompilationDir)
675 DirName = "";
676
Manman Ren3de61b42013-03-07 01:42:00 +0000677 // FileIDCUMap stores the current ID for the given compile unit.
678 unsigned SrcId = FileIDCUMap[CUID] + 1;
Devang Patel1905a182010-09-16 20:57:49 +0000679
Manman Ren3de61b42013-03-07 01:42:00 +0000680 // We look up the CUID/file/dir by concatenating them with a zero byte.
Benjamin Kramer74612c22012-03-11 14:56:26 +0000681 SmallString<128> NamePair;
Manman Ren5044a932013-04-06 01:02:38 +0000682 NamePair += utostr(CUID);
Manman Ren3de61b42013-03-07 01:42:00 +0000683 NamePair += '\0';
Benjamin Kramer74612c22012-03-11 14:56:26 +0000684 NamePair += DirName;
685 NamePair += '\0'; // Zero bytes are not allowed in paths.
686 NamePair += FileName;
687
688 StringMapEntry<unsigned> &Ent = SourceIdMap.GetOrCreateValue(NamePair, SrcId);
689 if (Ent.getValue() != SrcId)
690 return Ent.getValue();
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000691
Manman Ren3de61b42013-03-07 01:42:00 +0000692 FileIDCUMap[CUID] = SrcId;
Rafael Espindola5c055632010-11-18 02:04:25 +0000693 // Print out a .file directive to specify files for .loc directives.
Manman Ren3de61b42013-03-07 01:42:00 +0000694 Asm->OutStreamer.EmitDwarfFileDirective(SrcId, DirName, FileName, CUID);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000695
696 return SrcId;
697}
698
Eric Christopher72c16552012-12-20 21:58:40 +0000699// Create new CompileUnit for the given metadata node with tag
700// DW_TAG_compile_unit.
Devang Patel94c7ddb2011-08-16 22:09:43 +0000701CompileUnit *DwarfDebug::constructCompileUnit(const MDNode *N) {
Devang Patele4b27562009-08-28 23:24:31 +0000702 DICompileUnit DIUnit(N);
Devang Patel65dbc902009-11-25 17:36:49 +0000703 StringRef FN = DIUnit.getFilename();
Nick Lewycky6c1a7032011-11-02 20:55:33 +0000704 CompilationDir = DIUnit.getDirectory();
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000705
706 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
Eric Christopher7b878952013-08-26 23:50:38 +0000707 CompileUnit *NewCU =
708 new CompileUnit(GlobalCUIndexCount++, Die, N, Asm, this, &InfoHolder);
Manman Ren3de61b42013-03-07 01:42:00 +0000709
710 FileIDCUMap[NewCU->getUniqueID()] = 0;
711 // Call this to emit a .file directive if it wasn't emitted for the source
712 // file this CU comes from yet.
713 getOrCreateSourceID(FN, CompilationDir, NewCU->getUniqueID());
714
Nick Lewycky390c40d2011-10-27 06:44:11 +0000715 NewCU->addString(Die, dwarf::DW_AT_producer, DIUnit.getProducer());
Devang Patel3cbee302011-04-12 22:53:02 +0000716 NewCU->addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data2,
717 DIUnit.getLanguage());
Nick Lewycky390c40d2011-10-27 06:44:11 +0000718 NewCU->addString(Die, dwarf::DW_AT_name, FN);
Eric Christophere0828ec2013-04-09 19:23:15 +0000719
Eric Christopher6635cad2012-08-01 18:19:01 +0000720 // 2.17.1 requires that we use DW_AT_low_pc for a single entry point
Eric Christophere0828ec2013-04-09 19:23:15 +0000721 // into an entity. We're using 0 (or a NULL label) for this. For
722 // split dwarf it's in the skeleton CU so omit it here.
723 if (!useSplitDwarf())
724 NewCU->addLabelAddress(Die, dwarf::DW_AT_low_pc, NULL);
Manman Ren43213cf2013-02-05 21:52:47 +0000725
726 // Define start line table label for each Compile Unit.
727 MCSymbol *LineTableStartSym = Asm->GetTempSymbol("line_table_start",
728 NewCU->getUniqueID());
729 Asm->OutStreamer.getContext().setMCLineTableSymbol(LineTableStartSym,
730 NewCU->getUniqueID());
731
Manman Ren01cb18e2013-05-21 00:57:22 +0000732 // Use a single line table if we are using .loc and generating assembly.
733 bool UseTheFirstCU =
734 (Asm->TM.hasMCUseLoc() &&
735 Asm->OutStreamer.getKind() == MCStreamer::SK_AsmStreamer) ||
736 (NewCU->getUniqueID() == 0);
737
Devang Patel4a602ca2010-03-22 23:11:36 +0000738 // DW_AT_stmt_list is a offset of line number information for this
Eric Christophere0828ec2013-04-09 19:23:15 +0000739 // compile unit in debug_line section. For split dwarf this is
740 // left in the skeleton CU and so not included.
Manman Renf2d89ff2013-02-09 00:41:44 +0000741 // The line table entries are not always emitted in assembly, so it
742 // is not okay to use line_table_start here.
Eric Christophere0828ec2013-04-09 19:23:15 +0000743 if (!useSplitDwarf()) {
744 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
Carlo Kok46f0b6f2013-08-13 17:46:57 +0000745 NewCU->addLabel(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_sec_offset,
Manman Ren01cb18e2013-05-21 00:57:22 +0000746 UseTheFirstCU ?
Eric Christophere0828ec2013-04-09 19:23:15 +0000747 Asm->GetTempSymbol("section_line") : LineTableStartSym);
Manman Ren01cb18e2013-05-21 00:57:22 +0000748 else if (UseTheFirstCU)
Eric Christophere0828ec2013-04-09 19:23:15 +0000749 NewCU->addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4, 0);
750 else
751 NewCU->addDelta(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4,
752 LineTableStartSym, DwarfLineSectionSym);
753 }
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000754
Eric Christophere0828ec2013-04-09 19:23:15 +0000755 // If we're using split dwarf the compilation dir is going to be in the
756 // skeleton CU and so we don't need to duplicate it here.
757 if (!useSplitDwarf() && !CompilationDir.empty())
Nick Lewycky6c1a7032011-11-02 20:55:33 +0000758 NewCU->addString(Die, dwarf::DW_AT_comp_dir, CompilationDir);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000759 if (DIUnit.isOptimized())
Eric Christopher873cf0a2012-08-24 01:14:27 +0000760 NewCU->addFlag(Die, dwarf::DW_AT_APPLE_optimized);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000761
Devang Patel65dbc902009-11-25 17:36:49 +0000762 StringRef Flags = DIUnit.getFlags();
763 if (!Flags.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +0000764 NewCU->addString(Die, dwarf::DW_AT_APPLE_flags, Flags);
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000765
Nick Lewyckyd5d52132011-10-17 23:27:36 +0000766 if (unsigned RVer = DIUnit.getRunTimeVersion())
Devang Patel3cbee302011-04-12 22:53:02 +0000767 NewCU->addUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers,
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000768 dwarf::DW_FORM_data1, RVer);
769
Devang Patel163a9f72010-05-10 22:49:55 +0000770 if (!FirstCU)
771 FirstCU = NewCU;
Eric Christopher208cc6f2013-02-05 07:31:55 +0000772
Eric Christopher0e3e9b72012-12-10 23:34:43 +0000773 InfoHolder.addUnit(NewCU);
774
Devang Patel163a9f72010-05-10 22:49:55 +0000775 CUMap.insert(std::make_pair(N, NewCU));
Devang Patel94c7ddb2011-08-16 22:09:43 +0000776 return NewCU;
Devang Patel163a9f72010-05-10 22:49:55 +0000777}
778
Eric Christopherb6dc8652012-11-27 22:43:45 +0000779// Construct subprogram DIE.
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000780void DwarfDebug::constructSubprogramDIE(CompileUnit *TheCU,
Devang Patel3655a212011-08-15 23:36:40 +0000781 const MDNode *N) {
Rafael Espindolab0527282011-11-04 19:00:29 +0000782 CompileUnit *&CURef = SPMap[N];
783 if (CURef)
784 return;
785 CURef = TheCU;
786
Devang Patele4b27562009-08-28 23:24:31 +0000787 DISubprogram SP(N);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000788 if (!SP.isDefinition())
789 // This is a method declaration which will be handled while constructing
790 // class type.
Devang Patel13e16b62009-06-26 01:49:18 +0000791 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000792
Devang Pateldbc64af2011-08-15 17:24:54 +0000793 DIE *SubprogramDie = TheCU->getOrCreateSubprogramDIE(SP);
Stuart Hastings639336e2010-04-06 21:38:29 +0000794
795 // Add to map.
Devang Patel163a9f72010-05-10 22:49:55 +0000796 TheCU->insertDIE(N, SubprogramDie);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000797
798 // Add to context owner.
Devang Patel3cbee302011-04-12 22:53:02 +0000799 TheCU->addToContextOwner(SubprogramDie, SP.getContext());
Devang Patel0000fad2009-12-08 23:21:45 +0000800
Eric Christopher28b020d2013-09-09 20:03:20 +0000801 // Expose as a global name.
802 TheCU->addGlobalName(SP.getName(), SubprogramDie);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000803}
804
David Blaikie20d9e412013-05-07 21:35:53 +0000805void DwarfDebug::constructImportedEntityDIE(CompileUnit *TheCU,
David Blaikiec462db62013-04-22 06:12:31 +0000806 const MDNode *N) {
David Blaikie20d9e412013-05-07 21:35:53 +0000807 DIImportedEntity Module(N);
David Blaikiec462db62013-04-22 06:12:31 +0000808 if (!Module.Verify())
809 return;
David Blaikied2e0f7e2013-05-06 23:33:07 +0000810 if (DIE *D = TheCU->getOrCreateContextDIE(Module.getContext()))
David Blaikied1221e32013-05-08 06:01:38 +0000811 constructImportedEntityDIE(TheCU, Module, D);
David Blaikied2e0f7e2013-05-06 23:33:07 +0000812}
813
David Blaikied1221e32013-05-08 06:01:38 +0000814void DwarfDebug::constructImportedEntityDIE(CompileUnit *TheCU, const MDNode *N,
David Blaikied2e0f7e2013-05-06 23:33:07 +0000815 DIE *Context) {
David Blaikie20d9e412013-05-07 21:35:53 +0000816 DIImportedEntity Module(N);
David Blaikied2e0f7e2013-05-06 23:33:07 +0000817 if (!Module.Verify())
818 return;
David Blaikied1221e32013-05-08 06:01:38 +0000819 return constructImportedEntityDIE(TheCU, Module, Context);
David Blaikied2e0f7e2013-05-06 23:33:07 +0000820}
821
David Blaikied1221e32013-05-08 06:01:38 +0000822void DwarfDebug::constructImportedEntityDIE(CompileUnit *TheCU,
David Blaikie20d9e412013-05-07 21:35:53 +0000823 const DIImportedEntity &Module,
David Blaikied2e0f7e2013-05-06 23:33:07 +0000824 DIE *Context) {
825 assert(Module.Verify() &&
826 "Use one of the MDNode * overloads to handle invalid metadata");
827 assert(Context && "Should always have a context for an imported_module");
David Blaikie20d9e412013-05-07 21:35:53 +0000828 DIE *IMDie = new DIE(Module.getTag());
David Blaikiec462db62013-04-22 06:12:31 +0000829 TheCU->insertDIE(Module, IMDie);
David Blaikie20d9e412013-05-07 21:35:53 +0000830 DIE *EntityDie;
831 DIDescriptor Entity = Module.getEntity();
832 if (Entity.isNameSpace())
833 EntityDie = TheCU->getOrCreateNameSpace(DINameSpace(Entity));
834 else if (Entity.isSubprogram())
835 EntityDie = TheCU->getOrCreateSubprogramDIE(DISubprogram(Entity));
David Blaikieaa76a932013-05-08 06:01:41 +0000836 else if (Entity.isType())
837 EntityDie = TheCU->getOrCreateTypeDIE(DIType(Entity));
David Blaikie20d9e412013-05-07 21:35:53 +0000838 else
David Blaikieaa76a932013-05-08 06:01:41 +0000839 EntityDie = TheCU->getDIE(Entity);
David Blaikiec462db62013-04-22 06:12:31 +0000840 unsigned FileID = getOrCreateSourceID(Module.getContext().getFilename(),
841 Module.getContext().getDirectory(),
842 TheCU->getUniqueID());
843 TheCU->addUInt(IMDie, dwarf::DW_AT_decl_file, 0, FileID);
844 TheCU->addUInt(IMDie, dwarf::DW_AT_decl_line, 0, Module.getLineNumber());
Eric Christopherfdfc81f2013-06-24 23:20:02 +0000845 TheCU->addDIEEntry(IMDie, dwarf::DW_AT_import, dwarf::DW_FORM_ref4,
846 EntityDie);
David Blaikie7b72cc72013-05-20 22:50:35 +0000847 StringRef Name = Module.getName();
848 if (!Name.empty())
849 TheCU->addString(IMDie, dwarf::DW_AT_name, Name);
David Blaikied2e0f7e2013-05-06 23:33:07 +0000850 Context->addChild(IMDie);
David Blaikiec462db62013-04-22 06:12:31 +0000851}
852
Eric Christopherb6dc8652012-11-27 22:43:45 +0000853// Emit all Dwarf sections that should come prior to the content. Create
854// global DIEs and emit initial debug info sections. This is invoked by
855// the target AsmPrinter.
Eric Christopherc4639d62012-11-19 22:42:15 +0000856void DwarfDebug::beginModule() {
Devang Pateleac9c072010-04-27 19:46:33 +0000857 if (DisableDebugInfoPrinting)
858 return;
859
Eric Christopherc4639d62012-11-19 22:42:15 +0000860 const Module *M = MMI->getModule();
861
Nick Lewycky3bbb6f72011-07-29 03:49:23 +0000862 // If module has named metadata anchors then use them, otherwise scan the
863 // module using debug info finder to collect debug info.
Devang Patel30692ab2011-05-03 16:45:22 +0000864 NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu");
David Blaikiec0ec8a42013-03-11 23:39:23 +0000865 if (!CU_Nodes)
Devang Patel02e603f2011-08-15 23:47:24 +0000866 return;
Manman Renbc660712013-09-05 18:48:31 +0000867 TypeIdentifierMap = generateDITypeIdentifierMap(CU_Nodes);
Devang Patel30692ab2011-05-03 16:45:22 +0000868
David Blaikiec0ec8a42013-03-11 23:39:23 +0000869 // Emit initial sections so we can reference labels later.
870 emitSectionLabels();
871
872 for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i) {
873 DICompileUnit CUNode(CU_Nodes->getOperand(i));
874 CompileUnit *CU = constructCompileUnit(CUNode);
David Blaikie20d9e412013-05-07 21:35:53 +0000875 DIArray ImportedEntities = CUNode.getImportedEntities();
876 for (unsigned i = 0, e = ImportedEntities.getNumElements(); i != e; ++i)
David Blaikied2e0f7e2013-05-06 23:33:07 +0000877 ScopesWithImportedEntities.push_back(std::make_pair(
David Blaikie20d9e412013-05-07 21:35:53 +0000878 DIImportedEntity(ImportedEntities.getElement(i)).getContext(),
879 ImportedEntities.getElement(i)));
David Blaikied2e0f7e2013-05-06 23:33:07 +0000880 std::sort(ScopesWithImportedEntities.begin(),
Benjamin Kramer0b6962f2013-08-24 12:54:27 +0000881 ScopesWithImportedEntities.end(), less_first());
David Blaikiec0ec8a42013-03-11 23:39:23 +0000882 DIArray GVs = CUNode.getGlobalVariables();
883 for (unsigned i = 0, e = GVs.getNumElements(); i != e; ++i)
884 CU->createGlobalVariableDIE(GVs.getElement(i));
885 DIArray SPs = CUNode.getSubprograms();
886 for (unsigned i = 0, e = SPs.getNumElements(); i != e; ++i)
887 constructSubprogramDIE(CU, SPs.getElement(i));
888 DIArray EnumTypes = CUNode.getEnumTypes();
889 for (unsigned i = 0, e = EnumTypes.getNumElements(); i != e; ++i)
890 CU->getOrCreateTypeDIE(EnumTypes.getElement(i));
891 DIArray RetainedTypes = CUNode.getRetainedTypes();
892 for (unsigned i = 0, e = RetainedTypes.getNumElements(); i != e; ++i)
893 CU->getOrCreateTypeDIE(RetainedTypes.getElement(i));
David Blaikiec462db62013-04-22 06:12:31 +0000894 // Emit imported_modules last so that the relevant context is already
895 // available.
David Blaikie20d9e412013-05-07 21:35:53 +0000896 for (unsigned i = 0, e = ImportedEntities.getNumElements(); i != e; ++i)
897 constructImportedEntityDIE(CU, ImportedEntities.getElement(i));
David Blaikiec0ec8a42013-03-11 23:39:23 +0000898 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000899
Chris Lattnerd850ac72010-04-05 02:19:28 +0000900 // Tell MMI that we have debug info.
901 MMI->setDebugInfoAvailability(true);
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000902
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000903 // Prime section data.
Chris Lattnerf0144122009-07-28 03:13:23 +0000904 SectionMap.insert(Asm->getObjFileLowering().getTextSection());
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000905}
906
Eric Christopher4117bec2012-11-22 00:59:49 +0000907// Attach DW_AT_inline attribute with inlined subprogram DIEs.
908void DwarfDebug::computeInlinedDIEs() {
Devang Patel53bb5c92009-11-10 23:06:00 +0000909 // Attach DW_AT_inline attribute with inlined subprogram DIEs.
910 for (SmallPtrSet<DIE *, 4>::iterator AI = InlinedSubprogramDIEs.begin(),
Eric Christopherbdab8002012-11-27 00:13:51 +0000911 AE = InlinedSubprogramDIEs.end(); AI != AE; ++AI) {
Devang Patel53bb5c92009-11-10 23:06:00 +0000912 DIE *ISP = *AI;
Devang Patel3cbee302011-04-12 22:53:02 +0000913 FirstCU->addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
Devang Patel53bb5c92009-11-10 23:06:00 +0000914 }
Rafael Espindolad1ac3a42011-11-12 01:57:54 +0000915 for (DenseMap<const MDNode *, DIE *>::iterator AI = AbstractSPDies.begin(),
Eric Christopherbdab8002012-11-27 00:13:51 +0000916 AE = AbstractSPDies.end(); AI != AE; ++AI) {
Rafael Espindolad1ac3a42011-11-12 01:57:54 +0000917 DIE *ISP = AI->second;
918 if (InlinedSubprogramDIEs.count(ISP))
919 continue;
920 FirstCU->addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
921 }
Eric Christopher4117bec2012-11-22 00:59:49 +0000922}
923
924// Collect info for variables that were optimized out.
925void DwarfDebug::collectDeadVariables() {
926 const Module *M = MMI->getModule();
927 DenseMap<const MDNode *, LexicalScope *> DeadFnScopeMap;
928
929 if (NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu")) {
930 for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i) {
931 DICompileUnit TheCU(CU_Nodes->getOperand(i));
932 DIArray Subprograms = TheCU.getSubprograms();
933 for (unsigned i = 0, e = Subprograms.getNumElements(); i != e; ++i) {
Eric Christopherbdab8002012-11-27 00:13:51 +0000934 DISubprogram SP(Subprograms.getElement(i));
935 if (ProcessedSPNodes.count(SP) != 0) continue;
Manman Rend03d2b22013-07-08 18:33:29 +0000936 if (!SP.isSubprogram()) continue;
Eric Christopherbdab8002012-11-27 00:13:51 +0000937 if (!SP.isDefinition()) continue;
938 DIArray Variables = SP.getVariables();
939 if (Variables.getNumElements() == 0) continue;
Eric Christopher4117bec2012-11-22 00:59:49 +0000940
Eric Christopherbdab8002012-11-27 00:13:51 +0000941 LexicalScope *Scope =
942 new LexicalScope(NULL, DIDescriptor(SP), NULL, false);
943 DeadFnScopeMap[SP] = Scope;
Eric Christopher4117bec2012-11-22 00:59:49 +0000944
Eric Christopherbdab8002012-11-27 00:13:51 +0000945 // Construct subprogram DIE and add variables DIEs.
946 CompileUnit *SPCU = CUMap.lookup(TheCU);
947 assert(SPCU && "Unable to find Compile Unit!");
948 constructSubprogramDIE(SPCU, SP);
949 DIE *ScopeDIE = SPCU->getDIE(SP);
950 for (unsigned vi = 0, ve = Variables.getNumElements(); vi != ve; ++vi) {
951 DIVariable DV(Variables.getElement(vi));
Manman Rend03d2b22013-07-08 18:33:29 +0000952 if (!DV.isVariable()) continue;
Chandler Carruth05497cc2013-07-27 11:09:58 +0000953 DbgVariable NewVar(DV, NULL);
Eric Christopherbdab8002012-11-27 00:13:51 +0000954 if (DIE *VariableDIE =
Chandler Carruth05497cc2013-07-27 11:09:58 +0000955 SPCU->constructVariableDIE(&NewVar, Scope->isAbstractScope()))
Eric Christopherbdab8002012-11-27 00:13:51 +0000956 ScopeDIE->addChild(VariableDIE);
957 }
Eric Christopher4117bec2012-11-22 00:59:49 +0000958 }
959 }
960 }
961 DeleteContainerSeconds(DeadFnScopeMap);
962}
963
Eric Christopher0d27ca12013-08-08 23:45:55 +0000964// Type Signature [7.27] and ODR Hash code.
Eric Christopher3dee5752013-07-26 17:02:41 +0000965
966/// \brief Grabs the string in whichever attribute is passed in and returns
Eric Christopherb7669132013-08-07 01:18:33 +0000967/// a reference to it. Returns "" if the attribute doesn't exist.
Eric Christopher3dee5752013-07-26 17:02:41 +0000968static StringRef getDIEStringAttr(DIE *Die, unsigned Attr) {
Eric Christopherb7669132013-08-07 01:18:33 +0000969 DIEValue *V = Die->findAttribute(Attr);
Eric Christopher3dee5752013-07-26 17:02:41 +0000970
Eric Christopherb7669132013-08-07 01:18:33 +0000971 if (DIEString *S = dyn_cast_or_null<DIEString>(V))
972 return S->getString();
973
Eric Christopher3dee5752013-07-26 17:02:41 +0000974 return StringRef("");
975}
976
Eric Christopher3dee5752013-07-26 17:02:41 +0000977/// Return true if the current DIE is contained within an anonymous namespace.
978static bool isContainedInAnonNamespace(DIE *Die) {
979 DIE *Parent = Die->getParent();
980
981 while (Parent) {
Eric Christopher86aa03d2013-07-29 23:53:08 +0000982 if (Parent->getTag() == dwarf::DW_TAG_namespace &&
983 getDIEStringAttr(Parent, dwarf::DW_AT_name) == "")
Eric Christopher3dee5752013-07-26 17:02:41 +0000984 return true;
985 Parent = Parent->getParent();
986 }
987
988 return false;
989}
990
Eric Christopher028f3472013-08-07 01:18:24 +0000991/// Test if the current CU language is C++ and that we have
992/// a named type that is not contained in an anonymous namespace.
993static bool shouldAddODRHash(CompileUnit *CU, DIE *Die) {
Eric Christopherf76e1182013-08-07 08:35:10 +0000994 return CU->getLanguage() == dwarf::DW_LANG_C_plus_plus &&
995 getDIEStringAttr(Die, dwarf::DW_AT_name) != "" &&
996 !isContainedInAnonNamespace(Die);
Eric Christopher0d27ca12013-08-08 23:45:55 +0000997}
Eric Christopher028f3472013-08-07 01:18:24 +0000998
Eric Christopher4117bec2012-11-22 00:59:49 +0000999void DwarfDebug::finalizeModuleInfo() {
1000 // Collect info for variables that were optimized out.
1001 collectDeadVariables();
1002
1003 // Attach DW_AT_inline attribute with inlined subprogram DIEs.
1004 computeInlinedDIEs();
Devang Patel53bb5c92009-11-10 23:06:00 +00001005
Eric Christopherbe482042013-07-29 22:24:32 +00001006 // Split out type units and conditionally add an ODR tag to the split
1007 // out type.
Eric Christopher3dee5752013-07-26 17:02:41 +00001008 // FIXME: Do type splitting.
1009 for (unsigned i = 0, e = TypeUnits.size(); i != e; ++i) {
Eric Christopher3dee5752013-07-26 17:02:41 +00001010 DIE *Die = TypeUnits[i];
Eric Christopher0d27ca12013-08-08 23:45:55 +00001011 DIEHash Hash;
Eric Christopher028f3472013-08-07 01:18:24 +00001012 // If we've requested ODR hashes and it's applicable for an ODR hash then
1013 // add the ODR signature now.
Eric Christopher0d27ca12013-08-08 23:45:55 +00001014 // FIXME: This should be added onto the type unit, not the type, but this
1015 // works as an intermediate stage.
Eric Christopher028f3472013-08-07 01:18:24 +00001016 if (GenerateODRHash && shouldAddODRHash(CUMap.begin()->second, Die))
Eric Christopher0d27ca12013-08-08 23:45:55 +00001017 CUMap.begin()->second->addUInt(Die, dwarf::DW_AT_GNU_odr_signature,
1018 dwarf::DW_FORM_data8,
1019 Hash.computeDIEODRSignature(Die));
Eric Christopher3dee5752013-07-26 17:02:41 +00001020 }
1021
Eric Christopherf962c022013-08-12 20:27:48 +00001022 // Handle anything that needs to be done on a per-cu basis.
1023 for (DenseMap<const MDNode *, CompileUnit *>::iterator CUI = CUMap.begin(),
1024 CUE = CUMap.end();
1025 CUI != CUE; ++CUI) {
1026 CompileUnit *TheCU = CUI->second;
1027 // Emit DW_AT_containing_type attribute to connect types with their
1028 // vtable holding type.
1029 TheCU->constructContainingTypeDIEs();
1030
1031 // If we're splitting the dwarf out now that we've got the entire
1032 // CU then construct a skeleton CU based upon it.
1033 if (useSplitDwarf()) {
Eric Christopher0710bfa2013-08-13 01:21:55 +00001034 uint64_t ID = 0;
1035 if (GenerateCUHash) {
1036 DIEHash CUHash;
1037 ID = CUHash.computeCUSignature(TheCU->getCUDie());
1038 }
Eric Christopherf962c022013-08-12 20:27:48 +00001039 // This should be a unique identifier when we want to build .dwp files.
1040 TheCU->addUInt(TheCU->getCUDie(), dwarf::DW_AT_GNU_dwo_id,
Eric Christopher0710bfa2013-08-13 01:21:55 +00001041 dwarf::DW_FORM_data8, ID);
Eric Christopherf962c022013-08-12 20:27:48 +00001042 // Now construct the skeleton CU associated.
Eric Christophera9b2c792013-08-26 23:50:43 +00001043 CompileUnit *SkCU = constructSkeletonCU(TheCU);
Eric Christopherf962c022013-08-12 20:27:48 +00001044 // This should be a unique identifier when we want to build .dwp files.
1045 SkCU->addUInt(SkCU->getCUDie(), dwarf::DW_AT_GNU_dwo_id,
Eric Christopher0710bfa2013-08-13 01:21:55 +00001046 dwarf::DW_FORM_data8, ID);
Eric Christopherf962c022013-08-12 20:27:48 +00001047 }
1048 }
1049
1050 // Compute DIE offsets and sizes.
Eric Christopher0e3e9b72012-12-10 23:34:43 +00001051 InfoHolder.computeSizeAndOffsets();
1052 if (useSplitDwarf())
1053 SkeletonHolder.computeSizeAndOffsets();
Eric Christopher4117bec2012-11-22 00:59:49 +00001054}
1055
1056void DwarfDebug::endSections() {
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001057 // Standard sections final addresses.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00001058 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getTextSection());
Chris Lattnerc0215722010-04-04 19:25:43 +00001059 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("text_end"));
Chris Lattner6c2f9e12009-08-19 05:49:37 +00001060 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getDataSection());
Chris Lattnerc0215722010-04-04 19:25:43 +00001061 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("data_end"));
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001062
1063 // End text sections.
Benjamin Kramerb4c9d9c2012-10-31 13:45:49 +00001064 for (unsigned I = 0, E = SectionMap.size(); I != E; ++I) {
1065 Asm->OutStreamer.SwitchSection(SectionMap[I]);
1066 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("section_end", I+1));
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001067 }
Eric Christopher4117bec2012-11-22 00:59:49 +00001068}
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001069
Eric Christopherb6dc8652012-11-27 22:43:45 +00001070// Emit all Dwarf sections that should come after the content.
Eric Christopher4117bec2012-11-22 00:59:49 +00001071void DwarfDebug::endModule() {
1072
1073 if (!FirstCU) return;
1074
1075 // End any existing sections.
1076 // TODO: Does this need to happen?
1077 endSections();
1078
1079 // Finalize the debug info for the module.
1080 finalizeModuleInfo();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001081
Eric Christopher4daaed12012-12-10 19:51:21 +00001082 if (!useSplitDwarf()) {
Eric Christopher42885022012-11-27 22:43:42 +00001083 // Emit all the DIEs into a debug info section.
1084 emitDebugInfo();
Eric Christopher74802f72012-11-27 00:41:54 +00001085
Eric Christopher42885022012-11-27 22:43:42 +00001086 // Corresponding abbreviations into a abbrev section.
1087 emitAbbreviations();
1088
1089 // Emit info into a debug loc section.
1090 emitDebugLoc();
1091
1092 // Emit info into a debug aranges section.
1093 emitDebugARanges();
1094
1095 // Emit info into a debug ranges section.
1096 emitDebugRanges();
1097
1098 // Emit info into a debug macinfo section.
1099 emitDebugMacInfo();
1100
Eric Christopher42885022012-11-27 22:43:42 +00001101 } else {
Eric Christopher0b944ee2012-12-11 19:42:09 +00001102 // TODO: Fill this in for separated debug sections and separate
Eric Christopher42885022012-11-27 22:43:42 +00001103 // out information into new sections.
1104
Eric Christopher98e237f2012-11-30 23:59:06 +00001105 // Emit the debug info section and compile units.
Eric Christopher42885022012-11-27 22:43:42 +00001106 emitDebugInfo();
Eric Christopher98e237f2012-11-30 23:59:06 +00001107 emitDebugInfoDWO();
Eric Christopher42885022012-11-27 22:43:42 +00001108
1109 // Corresponding abbreviations into a abbrev section.
1110 emitAbbreviations();
Eric Christopher6eebe472012-12-19 22:02:53 +00001111 emitDebugAbbrevDWO();
Eric Christopher42885022012-11-27 22:43:42 +00001112
1113 // Emit info into a debug loc section.
1114 emitDebugLoc();
1115
1116 // Emit info into a debug aranges section.
1117 emitDebugARanges();
1118
1119 // Emit info into a debug ranges section.
1120 emitDebugRanges();
1121
1122 // Emit info into a debug macinfo section.
1123 emitDebugMacInfo();
1124
Eric Christopher72f7bfb2013-01-15 23:56:56 +00001125 // Emit DWO addresses.
1126 InfoHolder.emitAddresses(Asm->getObjFileLowering().getDwarfAddrSection());
1127
Eric Christopher42885022012-11-27 22:43:42 +00001128 }
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001129
Eric Christopher9d9f5a52012-08-23 07:32:06 +00001130 // Emit info into the dwarf accelerator table sections.
Eric Christopher20f47ab2012-08-23 22:36:40 +00001131 if (useDwarfAccelTables()) {
Eric Christopher09ac3d82011-11-07 09:24:32 +00001132 emitAccelNames();
1133 emitAccelObjC();
1134 emitAccelNamespaces();
1135 emitAccelTypes();
1136 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001137
Eric Christopher26123542013-08-30 00:40:17 +00001138 // Emit the pubnames and pubtypes sections if requested.
1139 if (HasDwarfPubSections) {
Eric Christopher57479322013-09-09 20:03:17 +00001140 emitDebugPubNames();
Eric Christopher360f0062012-08-23 07:10:56 +00001141 emitDebugPubTypes();
Eric Christopher26123542013-08-30 00:40:17 +00001142 }
Devang Patel193f7202009-11-24 01:14:22 +00001143
Eric Christopher42885022012-11-27 22:43:42 +00001144 // Finally emit string information into a string table.
Eric Christopherfcdbecb2012-11-27 06:49:23 +00001145 emitDebugStr();
Eric Christopher64f824c2012-12-27 02:14:01 +00001146 if (useSplitDwarf())
1147 emitDebugStrDWO();
Eric Christopherfcdbecb2012-11-27 06:49:23 +00001148
Devang Patele9a1cca2010-08-02 17:32:15 +00001149 // clean up.
Devang Patel94c7ddb2011-08-16 22:09:43 +00001150 SPMap.clear();
Devang Patel163a9f72010-05-10 22:49:55 +00001151 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
1152 E = CUMap.end(); I != E; ++I)
1153 delete I->second;
Eric Christopher9ec87b32012-12-10 19:51:18 +00001154
Craig Topper2d785db2013-07-03 04:17:25 +00001155 for (SmallVectorImpl<CompileUnit *>::iterator I = SkeletonCUs.begin(),
Eric Christopher01776a52013-02-06 21:53:56 +00001156 E = SkeletonCUs.end(); I != E; ++I)
1157 delete *I;
Eric Christopher9ec87b32012-12-10 19:51:18 +00001158
Eric Christopher98e237f2012-11-30 23:59:06 +00001159 // Reset these for the next Module if we have one.
1160 FirstCU = NULL;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001161}
1162
Eric Christopherb6dc8652012-11-27 22:43:45 +00001163// Find abstract variable, if any, associated with Var.
Devang Patelb549bcf2011-08-10 21:50:54 +00001164DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &DV,
Chris Lattnerde4845c2010-04-02 19:42:39 +00001165 DebugLoc ScopeLoc) {
Devang Patelb549bcf2011-08-10 21:50:54 +00001166 LLVMContext &Ctx = DV->getContext();
1167 // More then one inlined variable corresponds to one abstract variable.
1168 DIVariable Var = cleanseInlinedVariable(DV, Ctx);
Devang Patel2db49d72010-05-07 18:11:54 +00001169 DbgVariable *AbsDbgVariable = AbstractVariables.lookup(Var);
Devang Patel53bb5c92009-11-10 23:06:00 +00001170 if (AbsDbgVariable)
1171 return AbsDbgVariable;
1172
Devang Patelbf47fdb2011-08-10 20:55:27 +00001173 LexicalScope *Scope = LScopes.findAbstractScope(ScopeLoc.getScope(Ctx));
Devang Patel53bb5c92009-11-10 23:06:00 +00001174 if (!Scope)
1175 return NULL;
1176
Devang Patel5a1a67c2011-08-15 19:01:20 +00001177 AbsDbgVariable = new DbgVariable(Var, NULL);
Devang Patelbf47fdb2011-08-10 20:55:27 +00001178 addScopeVariable(Scope, AbsDbgVariable);
Devang Patel2db49d72010-05-07 18:11:54 +00001179 AbstractVariables[Var] = AbsDbgVariable;
Devang Patel53bb5c92009-11-10 23:06:00 +00001180 return AbsDbgVariable;
1181}
1182
Eric Christopherb6dc8652012-11-27 22:43:45 +00001183// If Var is a current function argument then add it to CurrentFnArguments list.
Devang Patel0478c152011-03-01 22:58:55 +00001184bool DwarfDebug::addCurrentFnArgument(const MachineFunction *MF,
Devang Patelbf47fdb2011-08-10 20:55:27 +00001185 DbgVariable *Var, LexicalScope *Scope) {
1186 if (!LScopes.isCurrentFunctionScope(Scope))
Devang Patel0478c152011-03-01 22:58:55 +00001187 return false;
1188 DIVariable DV = Var->getVariable();
1189 if (DV.getTag() != dwarf::DW_TAG_arg_variable)
1190 return false;
1191 unsigned ArgNo = DV.getArgNumber();
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001192 if (ArgNo == 0)
Devang Patel0478c152011-03-01 22:58:55 +00001193 return false;
1194
Devang Patelcb3a6572011-03-03 20:02:02 +00001195 size_t Size = CurrentFnArguments.size();
1196 if (Size == 0)
Devang Patel0478c152011-03-01 22:58:55 +00001197 CurrentFnArguments.resize(MF->getFunction()->arg_size());
Devang Patelbbd0f452011-03-03 21:49:41 +00001198 // llvm::Function argument size is not good indicator of how many
Devang Patel6f676be2011-03-03 20:08:10 +00001199 // arguments does the function have at source level.
1200 if (ArgNo > Size)
Devang Patelcb3a6572011-03-03 20:02:02 +00001201 CurrentFnArguments.resize(ArgNo * 2);
Devang Patel0478c152011-03-01 22:58:55 +00001202 CurrentFnArguments[ArgNo - 1] = Var;
1203 return true;
1204}
1205
Eric Christopherb6dc8652012-11-27 22:43:45 +00001206// Collect variable information from side table maintained by MMI.
Jim Grosbach1e20b962010-07-21 21:21:52 +00001207void
Nick Lewycky3bbb6f72011-07-29 03:49:23 +00001208DwarfDebug::collectVariableInfoFromMMITable(const MachineFunction *MF,
Devang Patelee432862010-05-20 19:57:06 +00001209 SmallPtrSet<const MDNode *, 16> &Processed) {
Devang Patele717faa2009-10-06 01:26:37 +00001210 MachineModuleInfo::VariableDbgInfoMapTy &VMap = MMI->getVariableDbgInfo();
1211 for (MachineModuleInfo::VariableDbgInfoMapTy::iterator VI = VMap.begin(),
1212 VE = VMap.end(); VI != VE; ++VI) {
Devang Patele9f8f5e2010-05-07 20:54:48 +00001213 const MDNode *Var = VI->first;
Devang Patel53bb5c92009-11-10 23:06:00 +00001214 if (!Var) continue;
Devang Patel98e1cac2010-05-14 21:01:35 +00001215 Processed.insert(Var);
Chris Lattnerde4845c2010-04-02 19:42:39 +00001216 DIVariable DV(Var);
1217 const std::pair<unsigned, DebugLoc> &VP = VI->second;
Devang Patel53bb5c92009-11-10 23:06:00 +00001218
Devang Patelbf47fdb2011-08-10 20:55:27 +00001219 LexicalScope *Scope = LScopes.findLexicalScope(VP.second);
Jim Grosbach1e20b962010-07-21 21:21:52 +00001220
Devang Patelfb0ee432009-11-10 23:20:04 +00001221 // If variable scope is not found then skip this variable.
Chris Lattnerde4845c2010-04-02 19:42:39 +00001222 if (Scope == 0)
Devang Patelfb0ee432009-11-10 23:20:04 +00001223 continue;
Devang Patel53bb5c92009-11-10 23:06:00 +00001224
Devang Patel26c1e562010-05-20 16:36:41 +00001225 DbgVariable *AbsDbgVariable = findAbstractVariable(DV, VP.second);
Devang Patel5a1a67c2011-08-15 19:01:20 +00001226 DbgVariable *RegVar = new DbgVariable(DV, AbsDbgVariable);
Devang Patelff9dd0a2011-08-15 21:24:36 +00001227 RegVar->setFrameIndex(VP.first);
Devang Patel0478c152011-03-01 22:58:55 +00001228 if (!addCurrentFnArgument(MF, RegVar, Scope))
Devang Patelbf47fdb2011-08-10 20:55:27 +00001229 addScopeVariable(Scope, RegVar);
Devang Patel5a1a67c2011-08-15 19:01:20 +00001230 if (AbsDbgVariable)
Devang Patelff9dd0a2011-08-15 21:24:36 +00001231 AbsDbgVariable->setFrameIndex(VP.first);
Devang Patele717faa2009-10-06 01:26:37 +00001232 }
Devang Patelee432862010-05-20 19:57:06 +00001233}
Devang Patel90a48ad2010-03-15 18:33:46 +00001234
Eric Christopherb6dc8652012-11-27 22:43:45 +00001235// Return true if debug value, encoded by DBG_VALUE instruction, is in a
1236// defined reg.
Devang Patelc3f5f782010-05-25 23:40:22 +00001237static bool isDbgValueInDefinedReg(const MachineInstr *MI) {
Nick Lewycky746cb672011-10-26 22:55:33 +00001238 assert(MI->isDebugValue() && "Invalid DBG_VALUE machine instruction!");
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001239 return MI->getNumOperands() == 3 &&
1240 MI->getOperand(0).isReg() && MI->getOperand(0).getReg() &&
Adrian Prantl35176402013-07-09 20:28:37 +00001241 (MI->getOperand(1).isImm() ||
1242 (MI->getOperand(1).isReg() && MI->getOperand(1).getReg() == 0U));
Devang Patelc3f5f782010-05-25 23:40:22 +00001243}
1244
Eric Christopherb6dc8652012-11-27 22:43:45 +00001245// Get .debug_loc entry for the instruction range starting at MI.
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001246static DotDebugLocEntry getDebugLocEntry(AsmPrinter *Asm,
1247 const MCSymbol *FLabel,
Devang Patel90b40412011-07-08 17:09:57 +00001248 const MCSymbol *SLabel,
1249 const MachineInstr *MI) {
1250 const MDNode *Var = MI->getOperand(MI->getNumOperands() - 1).getMetadata();
1251
David Blaikie6d9dbd52013-06-16 20:34:15 +00001252 assert(MI->getNumOperands() == 3);
Adrian Prantl35176402013-07-09 20:28:37 +00001253 if (MI->getOperand(0).isReg()) {
Devang Patel90b40412011-07-08 17:09:57 +00001254 MachineLocation MLoc;
Adrian Prantl35176402013-07-09 20:28:37 +00001255 // If the second operand is an immediate, this is a
1256 // register-indirect address.
1257 if (!MI->getOperand(1).isImm())
Adrian Prantl13131e62013-04-26 21:57:17 +00001258 MLoc.set(MI->getOperand(0).getReg());
1259 else
1260 MLoc.set(MI->getOperand(0).getReg(), MI->getOperand(1).getImm());
Devang Patel90b40412011-07-08 17:09:57 +00001261 return DotDebugLocEntry(FLabel, SLabel, MLoc, Var);
1262 }
1263 if (MI->getOperand(0).isImm())
1264 return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getImm());
1265 if (MI->getOperand(0).isFPImm())
1266 return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getFPImm());
1267 if (MI->getOperand(0).isCImm())
1268 return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getCImm());
1269
Craig Topper5e25ee82012-02-05 08:31:47 +00001270 llvm_unreachable("Unexpected 3 operand DBG_VALUE instruction!");
Devang Patel90b40412011-07-08 17:09:57 +00001271}
1272
Eric Christopherb6dc8652012-11-27 22:43:45 +00001273// Find variables for each lexical scope.
Jim Grosbach1e20b962010-07-21 21:21:52 +00001274void
Devang Patel78e127d2010-06-25 22:07:34 +00001275DwarfDebug::collectVariableInfo(const MachineFunction *MF,
1276 SmallPtrSet<const MDNode *, 16> &Processed) {
Jim Grosbach1e20b962010-07-21 21:21:52 +00001277
Eric Christopher4e976452013-07-03 21:37:03 +00001278 // Grab the variable info that was squirreled away in the MMI side-table.
Devang Patelee432862010-05-20 19:57:06 +00001279 collectVariableInfoFromMMITable(MF, Processed);
1280
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001281 for (SmallVectorImpl<const MDNode*>::const_iterator
1282 UVI = UserVariables.begin(), UVE = UserVariables.end(); UVI != UVE;
1283 ++UVI) {
1284 const MDNode *Var = *UVI;
1285 if (Processed.count(Var))
Devang Patelee432862010-05-20 19:57:06 +00001286 continue;
1287
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001288 // History contains relevant DBG_VALUE instructions for Var and instructions
1289 // clobbering it.
1290 SmallVectorImpl<const MachineInstr*> &History = DbgValues[Var];
1291 if (History.empty())
1292 continue;
1293 const MachineInstr *MInsn = History.front();
Devang Patelc3f5f782010-05-25 23:40:22 +00001294
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001295 DIVariable DV(Var);
Devang Patelbf47fdb2011-08-10 20:55:27 +00001296 LexicalScope *Scope = NULL;
Devang Pateld8720f42010-05-27 20:25:04 +00001297 if (DV.getTag() == dwarf::DW_TAG_arg_variable &&
1298 DISubprogram(DV.getContext()).describes(MF->getFunction()))
Devang Patelbf47fdb2011-08-10 20:55:27 +00001299 Scope = LScopes.getCurrentFunctionScope();
David Blaikiec0ec8a42013-03-11 23:39:23 +00001300 else if (MDNode *IA = DV.getInlinedAt())
1301 Scope = LScopes.findInlinedScope(DebugLoc::getFromDILocation(IA));
1302 else
1303 Scope = LScopes.findLexicalScope(cast<MDNode>(DV->getOperand(1)));
Devang Patelee432862010-05-20 19:57:06 +00001304 // If variable scope is not found then skip this variable.
Devang Patelc0c5a262010-05-21 00:10:20 +00001305 if (!Scope)
Devang Patelee432862010-05-20 19:57:06 +00001306 continue;
1307
1308 Processed.insert(DV);
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001309 assert(MInsn->isDebugValue() && "History must begin with debug value");
Devang Patel5a1a67c2011-08-15 19:01:20 +00001310 DbgVariable *AbsVar = findAbstractVariable(DV, MInsn->getDebugLoc());
1311 DbgVariable *RegVar = new DbgVariable(DV, AbsVar);
Devang Patel0478c152011-03-01 22:58:55 +00001312 if (!addCurrentFnArgument(MF, RegVar, Scope))
Devang Patelbf47fdb2011-08-10 20:55:27 +00001313 addScopeVariable(Scope, RegVar);
Devang Patel5a1a67c2011-08-15 19:01:20 +00001314 if (AbsVar)
Devang Patelff9dd0a2011-08-15 21:24:36 +00001315 AbsVar->setMInsn(MInsn);
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001316
Eric Christopherc56e3f02012-10-08 20:48:54 +00001317 // Simplify ranges that are fully coalesced.
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001318 if (History.size() <= 1 || (History.size() == 2 &&
1319 MInsn->isIdenticalTo(History.back()))) {
Devang Patelff9dd0a2011-08-15 21:24:36 +00001320 RegVar->setMInsn(MInsn);
Devang Patelc3f5f782010-05-25 23:40:22 +00001321 continue;
1322 }
1323
Eric Christopher498703b2013-01-28 17:33:26 +00001324 // Handle multiple DBG_VALUE instructions describing one variable.
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001325 RegVar->setDotDebugLocOffset(DotDebugLocEntries.size());
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001326
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001327 for (SmallVectorImpl<const MachineInstr*>::const_iterator
1328 HI = History.begin(), HE = History.end(); HI != HE; ++HI) {
1329 const MachineInstr *Begin = *HI;
1330 assert(Begin->isDebugValue() && "Invalid History entry");
Jakob Stoklund Olesene17232e2011-03-22 00:21:41 +00001331
Devang Patel4ada1d72011-06-01 23:00:17 +00001332 // Check if DBG_VALUE is truncating a range.
1333 if (Begin->getNumOperands() > 1 && Begin->getOperand(0).isReg()
1334 && !Begin->getOperand(0).getReg())
1335 continue;
1336
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001337 // Compute the range for a register location.
1338 const MCSymbol *FLabel = getLabelBeforeInsn(Begin);
1339 const MCSymbol *SLabel = 0;
1340
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001341 if (HI + 1 == HE)
1342 // If Begin is the last instruction in History then its value is valid
Chris Lattner7a2bdde2011-04-15 05:18:47 +00001343 // until the end of the function.
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001344 SLabel = FunctionEndSym;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001345 else {
1346 const MachineInstr *End = HI[1];
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001347 DEBUG(dbgs() << "DotDebugLoc Pair:\n"
Devang Patel476df5f2011-07-07 21:44:42 +00001348 << "\t" << *Begin << "\t" << *End << "\n");
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001349 if (End->isDebugValue())
1350 SLabel = getLabelBeforeInsn(End);
1351 else {
1352 // End is a normal instruction clobbering the range.
1353 SLabel = getLabelAfterInsn(End);
1354 assert(SLabel && "Forgot label after clobber instruction");
1355 ++HI;
1356 }
1357 }
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001358
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001359 // The value is valid until the next DBG_VALUE or clobber.
Eric Christopherabbb2002011-12-16 23:42:31 +00001360 DotDebugLocEntries.push_back(getDebugLocEntry(Asm, FLabel, SLabel,
1361 Begin));
Devang Patelc3f5f782010-05-25 23:40:22 +00001362 }
1363 DotDebugLocEntries.push_back(DotDebugLocEntry());
Devang Patel90a48ad2010-03-15 18:33:46 +00001364 }
Devang Patel98e1cac2010-05-14 21:01:35 +00001365
1366 // Collect info for variables that were optimized out.
Devang Patel93d39be2011-08-19 23:28:12 +00001367 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
1368 DIArray Variables = DISubprogram(FnScope->getScopeNode()).getVariables();
1369 for (unsigned i = 0, e = Variables.getNumElements(); i != e; ++i) {
1370 DIVariable DV(Variables.getElement(i));
Manman Rend03d2b22013-07-08 18:33:29 +00001371 if (!DV || !DV.isVariable() || !Processed.insert(DV))
Devang Patel93d39be2011-08-19 23:28:12 +00001372 continue;
1373 if (LexicalScope *Scope = LScopes.findLexicalScope(DV.getContext()))
1374 addScopeVariable(Scope, new DbgVariable(DV, NULL));
Devang Patel98e1cac2010-05-14 21:01:35 +00001375 }
Devang Patelc3f5f782010-05-25 23:40:22 +00001376}
Devang Patel98e1cac2010-05-14 21:01:35 +00001377
Eric Christopherb6dc8652012-11-27 22:43:45 +00001378// Return Label preceding the instruction.
Eric Christopher72f7bfb2013-01-15 23:56:56 +00001379MCSymbol *DwarfDebug::getLabelBeforeInsn(const MachineInstr *MI) {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001380 MCSymbol *Label = LabelsBeforeInsn.lookup(MI);
1381 assert(Label && "Didn't insert label before instruction");
1382 return Label;
Devang Patelc3f5f782010-05-25 23:40:22 +00001383}
1384
Eric Christopherb6dc8652012-11-27 22:43:45 +00001385// Return Label immediately following the instruction.
Eric Christopher72f7bfb2013-01-15 23:56:56 +00001386MCSymbol *DwarfDebug::getLabelAfterInsn(const MachineInstr *MI) {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001387 return LabelsAfterInsn.lookup(MI);
Devang Patele717faa2009-10-06 01:26:37 +00001388}
1389
Eric Christopherb6dc8652012-11-27 22:43:45 +00001390// Process beginning of an instruction.
Devang Patelcbbe2872010-10-26 17:49:02 +00001391void DwarfDebug::beginInstruction(const MachineInstr *MI) {
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001392 // Check if source location changes, but ignore DBG_VALUE locations.
1393 if (!MI->isDebugValue()) {
1394 DebugLoc DL = MI->getDebugLoc();
1395 if (DL != PrevInstLoc && (!DL.isUnknown() || UnknownLocations)) {
Eric Christopher60b35f42012-04-05 20:39:05 +00001396 unsigned Flags = 0;
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001397 PrevInstLoc = DL;
Devang Patel4243e672011-05-11 19:22:19 +00001398 if (DL == PrologEndLoc) {
1399 Flags |= DWARF2_FLAG_PROLOGUE_END;
1400 PrologEndLoc = DebugLoc();
1401 }
Eric Christopher60b35f42012-04-05 20:39:05 +00001402 if (PrologEndLoc.isUnknown())
1403 Flags |= DWARF2_FLAG_IS_STMT;
1404
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001405 if (!DL.isUnknown()) {
1406 const MDNode *Scope = DL.getScope(Asm->MF->getFunction()->getContext());
Devang Patel4243e672011-05-11 19:22:19 +00001407 recordSourceLine(DL.getLine(), DL.getCol(), Scope, Flags);
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001408 } else
Devang Patel4243e672011-05-11 19:22:19 +00001409 recordSourceLine(0, 0, 0, 0);
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001410 }
Devang Patelc3f5f782010-05-25 23:40:22 +00001411 }
Devang Patelaead63c2010-03-29 22:59:58 +00001412
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001413 // Insert labels where requested.
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001414 DenseMap<const MachineInstr*, MCSymbol*>::iterator I =
1415 LabelsBeforeInsn.find(MI);
1416
1417 // No label needed.
1418 if (I == LabelsBeforeInsn.end())
1419 return;
1420
1421 // Label already assigned.
1422 if (I->second)
Devang Patelb2b31a62010-05-26 19:37:24 +00001423 return;
Devang Patel553881b2010-03-29 17:20:31 +00001424
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001425 if (!PrevLabel) {
Devang Patel77051f52010-05-26 21:23:46 +00001426 PrevLabel = MMI->getContext().CreateTempSymbol();
1427 Asm->OutStreamer.EmitLabel(PrevLabel);
Devang Patelb2b31a62010-05-26 19:37:24 +00001428 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001429 I->second = PrevLabel;
Devang Patel0d20ac82009-10-06 01:50:42 +00001430}
1431
Eric Christopherb6dc8652012-11-27 22:43:45 +00001432// Process end of an instruction.
Devang Patelcbbe2872010-10-26 17:49:02 +00001433void DwarfDebug::endInstruction(const MachineInstr *MI) {
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001434 // Don't create a new label after DBG_VALUE instructions.
1435 // They don't generate code.
1436 if (!MI->isDebugValue())
1437 PrevLabel = 0;
1438
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001439 DenseMap<const MachineInstr*, MCSymbol*>::iterator I =
1440 LabelsAfterInsn.find(MI);
1441
1442 // No label needed.
1443 if (I == LabelsAfterInsn.end())
1444 return;
1445
1446 // Label already assigned.
1447 if (I->second)
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001448 return;
1449
1450 // We need a label after this instruction.
1451 if (!PrevLabel) {
1452 PrevLabel = MMI->getContext().CreateTempSymbol();
1453 Asm->OutStreamer.EmitLabel(PrevLabel);
Devang Patel1c246352010-04-08 16:50:29 +00001454 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001455 I->second = PrevLabel;
Devang Patel53bb5c92009-11-10 23:06:00 +00001456}
1457
Eric Christopherb6dc8652012-11-27 22:43:45 +00001458// Each LexicalScope has first instruction and last instruction to mark
1459// beginning and end of a scope respectively. Create an inverse map that list
1460// scopes starts (and ends) with an instruction. One instruction may start (or
1461// end) multiple scopes. Ignore scopes that are not reachable.
Devang Patele37b0c62010-04-08 18:43:56 +00001462void DwarfDebug::identifyScopeMarkers() {
Devang Patelbf47fdb2011-08-10 20:55:27 +00001463 SmallVector<LexicalScope *, 4> WorkList;
1464 WorkList.push_back(LScopes.getCurrentFunctionScope());
Devang Patel42aafd72010-01-20 02:05:23 +00001465 while (!WorkList.empty()) {
Devang Patelbf47fdb2011-08-10 20:55:27 +00001466 LexicalScope *S = WorkList.pop_back_val();
Jim Grosbach1e20b962010-07-21 21:21:52 +00001467
Craig Topper9f43ac62013-07-03 04:24:43 +00001468 const SmallVectorImpl<LexicalScope *> &Children = S->getChildren();
Jim Grosbach1e20b962010-07-21 21:21:52 +00001469 if (!Children.empty())
Craig Topper2d785db2013-07-03 04:17:25 +00001470 for (SmallVectorImpl<LexicalScope *>::const_iterator SI = Children.begin(),
Devang Patel42aafd72010-01-20 02:05:23 +00001471 SE = Children.end(); SI != SE; ++SI)
1472 WorkList.push_back(*SI);
1473
Devang Patel53bb5c92009-11-10 23:06:00 +00001474 if (S->isAbstractScope())
1475 continue;
Jim Grosbach1e20b962010-07-21 21:21:52 +00001476
Craig Topper9f43ac62013-07-03 04:24:43 +00001477 const SmallVectorImpl<InsnRange> &Ranges = S->getRanges();
Devang Pateleac9c072010-04-27 19:46:33 +00001478 if (Ranges.empty())
1479 continue;
Craig Topper2d785db2013-07-03 04:17:25 +00001480 for (SmallVectorImpl<InsnRange>::const_iterator RI = Ranges.begin(),
Devang Pateleac9c072010-04-27 19:46:33 +00001481 RE = Ranges.end(); RI != RE; ++RI) {
Devang Patelbf47fdb2011-08-10 20:55:27 +00001482 assert(RI->first && "InsnRange does not have first instruction!");
1483 assert(RI->second && "InsnRange does not have second instruction!");
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001484 requestLabelBeforeInsn(RI->first);
1485 requestLabelAfterInsn(RI->second);
Devang Pateleac9c072010-04-27 19:46:33 +00001486 }
Devang Patelaf9e8472009-10-01 20:31:14 +00001487 }
Devang Patelaf9e8472009-10-01 20:31:14 +00001488}
1489
Eric Christopherb6dc8652012-11-27 22:43:45 +00001490// Get MDNode for DebugLoc's scope.
Devang Patela3f48672011-05-09 22:14:49 +00001491static MDNode *getScopeNode(DebugLoc DL, const LLVMContext &Ctx) {
1492 if (MDNode *InlinedAt = DL.getInlinedAt(Ctx))
1493 return getScopeNode(DebugLoc::getFromDILocation(InlinedAt), Ctx);
1494 return DL.getScope(Ctx);
1495}
1496
Eric Christopherb6dc8652012-11-27 22:43:45 +00001497// Walk up the scope chain of given debug loc and find line number info
1498// for the function.
Devang Patel4243e672011-05-11 19:22:19 +00001499static DebugLoc getFnDebugLoc(DebugLoc DL, const LLVMContext &Ctx) {
1500 const MDNode *Scope = getScopeNode(DL, Ctx);
1501 DISubprogram SP = getDISubprogram(Scope);
Manman Rend03d2b22013-07-08 18:33:29 +00001502 if (SP.isSubprogram()) {
Eric Christopher6126a1e2012-04-03 00:43:49 +00001503 // Check for number of operands since the compatibility is
1504 // cheap here.
Eric Christopherfa5b0502012-04-03 17:55:42 +00001505 if (SP->getNumOperands() > 19)
Eric Christopher6126a1e2012-04-03 00:43:49 +00001506 return DebugLoc::get(SP.getScopeLineNumber(), 0, SP);
1507 else
1508 return DebugLoc::get(SP.getLineNumber(), 0, SP);
1509 }
1510
Devang Patel4243e672011-05-11 19:22:19 +00001511 return DebugLoc();
1512}
1513
Eric Christopherb6dc8652012-11-27 22:43:45 +00001514// Gather pre-function debug information. Assumes being called immediately
1515// after the function entry point has been emitted.
Chris Lattnereec791a2010-01-26 23:18:02 +00001516void DwarfDebug::beginFunction(const MachineFunction *MF) {
Chris Lattner994cb122010-04-05 03:52:55 +00001517 if (!MMI->hasDebugInfo()) return;
Devang Patelbf47fdb2011-08-10 20:55:27 +00001518 LScopes.initialize(*MF);
1519 if (LScopes.empty()) return;
1520 identifyScopeMarkers();
Devang Patel60b35bd2009-10-06 18:37:31 +00001521
Manman Ren43213cf2013-02-05 21:52:47 +00001522 // Set DwarfCompileUnitID in MCContext to the Compile Unit this function
1523 // belongs to.
1524 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
1525 CompileUnit *TheCU = SPMap.lookup(FnScope->getScopeNode());
1526 assert(TheCU && "Unable to find compile unit!");
Manman Ren01cb18e2013-05-21 00:57:22 +00001527 if (Asm->TM.hasMCUseLoc() &&
1528 Asm->OutStreamer.getKind() == MCStreamer::SK_AsmStreamer)
1529 // Use a single line table if we are using .loc and generating assembly.
1530 Asm->OutStreamer.getContext().setDwarfCompileUnitID(0);
1531 else
1532 Asm->OutStreamer.getContext().setDwarfCompileUnitID(TheCU->getUniqueID());
Manman Ren43213cf2013-02-05 21:52:47 +00001533
Devang Pateleac9c072010-04-27 19:46:33 +00001534 FunctionBeginSym = Asm->GetTempSymbol("func_begin",
1535 Asm->getFunctionNumber());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001536 // Assumes in correct section after the entry point.
Devang Pateleac9c072010-04-27 19:46:33 +00001537 Asm->OutStreamer.EmitLabel(FunctionBeginSym);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001538
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001539 assert(UserVariables.empty() && DbgValues.empty() && "Maps weren't cleaned");
1540
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001541 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
Eric Christopherb6dc8652012-11-27 22:43:45 +00001542 // LiveUserVar - Map physreg numbers to the MDNode they contain.
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001543 std::vector<const MDNode*> LiveUserVar(TRI->getNumRegs());
1544
Devang Patelb2b31a62010-05-26 19:37:24 +00001545 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001546 I != E; ++I) {
1547 bool AtBlockEntry = true;
Devang Patelb2b31a62010-05-26 19:37:24 +00001548 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
1549 II != IE; ++II) {
1550 const MachineInstr *MI = II;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001551
Devang Patelb2b31a62010-05-26 19:37:24 +00001552 if (MI->isDebugValue()) {
Nick Lewycky746cb672011-10-26 22:55:33 +00001553 assert(MI->getNumOperands() > 1 && "Invalid machine instruction!");
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001554
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001555 // Keep track of user variables.
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001556 const MDNode *Var =
1557 MI->getOperand(MI->getNumOperands() - 1).getMetadata();
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001558
1559 // Variable is in a register, we need to check for clobbers.
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001560 if (isDbgValueInDefinedReg(MI))
1561 LiveUserVar[MI->getOperand(0).getReg()] = Var;
1562
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001563 // Check the history of this variable.
1564 SmallVectorImpl<const MachineInstr*> &History = DbgValues[Var];
1565 if (History.empty()) {
1566 UserVariables.push_back(Var);
1567 // The first mention of a function argument gets the FunctionBeginSym
1568 // label, so arguments are visible when breaking at function entry.
1569 DIVariable DV(Var);
Manman Rend03d2b22013-07-08 18:33:29 +00001570 if (DV.isVariable() && DV.getTag() == dwarf::DW_TAG_arg_variable &&
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001571 DISubprogram(getDISubprogram(DV.getContext()))
1572 .describes(MF->getFunction()))
1573 LabelsBeforeInsn[MI] = FunctionBeginSym;
1574 } else {
1575 // We have seen this variable before. Try to coalesce DBG_VALUEs.
1576 const MachineInstr *Prev = History.back();
1577 if (Prev->isDebugValue()) {
1578 // Coalesce identical entries at the end of History.
1579 if (History.size() >= 2 &&
Devang Patel79862892011-07-07 00:14:27 +00001580 Prev->isIdenticalTo(History[History.size() - 2])) {
Eric Christopher02c1a642012-10-08 20:48:49 +00001581 DEBUG(dbgs() << "Coalescing identical DBG_VALUE entries:\n"
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001582 << "\t" << *Prev
Devang Patel79862892011-07-07 00:14:27 +00001583 << "\t" << *History[History.size() - 2] << "\n");
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001584 History.pop_back();
Devang Patel79862892011-07-07 00:14:27 +00001585 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001586
1587 // Terminate old register assignments that don't reach MI;
1588 MachineFunction::const_iterator PrevMBB = Prev->getParent();
1589 if (PrevMBB != I && (!AtBlockEntry || llvm::next(PrevMBB) != I) &&
1590 isDbgValueInDefinedReg(Prev)) {
1591 // Previous register assignment needs to terminate at the end of
1592 // its basic block.
1593 MachineBasicBlock::const_iterator LastMI =
1594 PrevMBB->getLastNonDebugInstr();
Devang Patel79862892011-07-07 00:14:27 +00001595 if (LastMI == PrevMBB->end()) {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001596 // Drop DBG_VALUE for empty range.
Eric Christopher02c1a642012-10-08 20:48:49 +00001597 DEBUG(dbgs() << "Dropping DBG_VALUE for empty range:\n"
Devang Patel79862892011-07-07 00:14:27 +00001598 << "\t" << *Prev << "\n");
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001599 History.pop_back();
David Blaikie4532c282013-06-20 00:25:24 +00001600 } else if (llvm::next(PrevMBB) != PrevMBB->getParent()->end())
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001601 // Terminate after LastMI.
1602 History.push_back(LastMI);
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001603 }
1604 }
1605 }
1606 History.push_back(MI);
Devang Patelb2b31a62010-05-26 19:37:24 +00001607 } else {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001608 // Not a DBG_VALUE instruction.
1609 if (!MI->isLabel())
1610 AtBlockEntry = false;
1611
Eric Christopher0313ced2012-10-04 20:46:14 +00001612 // First known non-DBG_VALUE and non-frame setup location marks
1613 // the beginning of the function body.
1614 if (!MI->getFlag(MachineInstr::FrameSetup) &&
1615 (PrologEndLoc.isUnknown() && !MI->getDebugLoc().isUnknown()))
Devang Patel4243e672011-05-11 19:22:19 +00001616 PrologEndLoc = MI->getDebugLoc();
1617
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001618 // Check if the instruction clobbers any registers with debug vars.
1619 for (MachineInstr::const_mop_iterator MOI = MI->operands_begin(),
1620 MOE = MI->operands_end(); MOI != MOE; ++MOI) {
1621 if (!MOI->isReg() || !MOI->isDef() || !MOI->getReg())
1622 continue;
Jakob Stoklund Olesen396618b2012-06-01 23:28:30 +00001623 for (MCRegAliasIterator AI(MOI->getReg(), TRI, true);
1624 AI.isValid(); ++AI) {
1625 unsigned Reg = *AI;
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001626 const MDNode *Var = LiveUserVar[Reg];
1627 if (!Var)
1628 continue;
1629 // Reg is now clobbered.
1630 LiveUserVar[Reg] = 0;
1631
1632 // Was MD last defined by a DBG_VALUE referring to Reg?
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001633 DbgValueHistoryMap::iterator HistI = DbgValues.find(Var);
1634 if (HistI == DbgValues.end())
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001635 continue;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001636 SmallVectorImpl<const MachineInstr*> &History = HistI->second;
1637 if (History.empty())
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001638 continue;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001639 const MachineInstr *Prev = History.back();
1640 // Sanity-check: Register assignments are terminated at the end of
1641 // their block.
1642 if (!Prev->isDebugValue() || Prev->getParent() != MI->getParent())
1643 continue;
1644 // Is the variable still in Reg?
1645 if (!isDbgValueInDefinedReg(Prev) ||
1646 Prev->getOperand(0).getReg() != Reg)
1647 continue;
1648 // Var is clobbered. Make sure the next instruction gets a label.
1649 History.push_back(MI);
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001650 }
1651 }
Devang Patelb2b31a62010-05-26 19:37:24 +00001652 }
Devang Patelb2b31a62010-05-26 19:37:24 +00001653 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001654 }
1655
1656 for (DbgValueHistoryMap::iterator I = DbgValues.begin(), E = DbgValues.end();
1657 I != E; ++I) {
1658 SmallVectorImpl<const MachineInstr*> &History = I->second;
1659 if (History.empty())
1660 continue;
1661
1662 // Make sure the final register assignments are terminated.
1663 const MachineInstr *Prev = History.back();
1664 if (Prev->isDebugValue() && isDbgValueInDefinedReg(Prev)) {
1665 const MachineBasicBlock *PrevMBB = Prev->getParent();
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001666 MachineBasicBlock::const_iterator LastMI =
Devang Patel5bc942c2011-08-10 23:58:09 +00001667 PrevMBB->getLastNonDebugInstr();
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001668 if (LastMI == PrevMBB->end())
1669 // Drop DBG_VALUE for empty range.
1670 History.pop_back();
David Blaikie4532c282013-06-20 00:25:24 +00001671 else if (PrevMBB != &PrevMBB->getParent()->back()) {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001672 // Terminate after LastMI.
1673 History.push_back(LastMI);
1674 }
1675 }
1676 // Request labels for the full history.
1677 for (unsigned i = 0, e = History.size(); i != e; ++i) {
1678 const MachineInstr *MI = History[i];
1679 if (MI->isDebugValue())
1680 requestLabelBeforeInsn(MI);
1681 else
1682 requestLabelAfterInsn(MI);
1683 }
1684 }
Devang Patelb2b31a62010-05-26 19:37:24 +00001685
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001686 PrevInstLoc = DebugLoc();
Devang Patelb2b31a62010-05-26 19:37:24 +00001687 PrevLabel = FunctionBeginSym;
Devang Patel4243e672011-05-11 19:22:19 +00001688
1689 // Record beginning of function.
1690 if (!PrologEndLoc.isUnknown()) {
1691 DebugLoc FnStartDL = getFnDebugLoc(PrologEndLoc,
1692 MF->getFunction()->getContext());
1693 recordSourceLine(FnStartDL.getLine(), FnStartDL.getCol(),
1694 FnStartDL.getScope(MF->getFunction()->getContext()),
David Blaikie836cfc42012-12-04 22:02:33 +00001695 // We'd like to list the prologue as "not statements" but GDB behaves
1696 // poorly if we do that. Revisit this with caution/GDB (7.5+) testing.
David Blaikieb36c5312012-12-04 21:05:36 +00001697 DWARF2_FLAG_IS_STMT);
Devang Patel4243e672011-05-11 19:22:19 +00001698 }
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001699}
1700
Devang Patelbf47fdb2011-08-10 20:55:27 +00001701void DwarfDebug::addScopeVariable(LexicalScope *LS, DbgVariable *Var) {
David Blaikie032d6242013-06-05 05:39:59 +00001702 SmallVectorImpl<DbgVariable *> &Vars = ScopeVariables[LS];
1703 DIVariable DV = Var->getVariable();
David Blaikieb20fdff2013-06-06 21:04:51 +00001704 // Variables with positive arg numbers are parameters.
1705 if (unsigned ArgNum = DV.getArgNumber()) {
1706 // Keep all parameters in order at the start of the variable list to ensure
1707 // function types are correct (no out-of-order parameters)
1708 //
1709 // This could be improved by only doing it for optimized builds (unoptimized
1710 // builds have the right order to begin with), searching from the back (this
1711 // would catch the unoptimized case quickly), or doing a binary search
1712 // rather than linear search.
1713 SmallVectorImpl<DbgVariable *>::iterator I = Vars.begin();
1714 while (I != Vars.end()) {
1715 unsigned CurNum = (*I)->getVariable().getArgNumber();
1716 // A local (non-parameter) variable has been found, insert immediately
1717 // before it.
1718 if (CurNum == 0)
1719 break;
1720 // A later indexed parameter has been found, insert immediately before it.
David Blaikiebabfebb2013-06-06 22:28:26 +00001721 if (CurNum > ArgNum)
David Blaikieb20fdff2013-06-06 21:04:51 +00001722 break;
David Blaikiebabfebb2013-06-06 22:28:26 +00001723 ++I;
David Blaikie032d6242013-06-05 05:39:59 +00001724 }
David Blaikieb20fdff2013-06-06 21:04:51 +00001725 Vars.insert(I, Var);
1726 return;
David Blaikie032d6242013-06-05 05:39:59 +00001727 }
1728
1729 Vars.push_back(Var);
Devang Patelbf47fdb2011-08-10 20:55:27 +00001730}
1731
Eric Christopherb6dc8652012-11-27 22:43:45 +00001732// Gather and emit post-function debug information.
Chris Lattnereec791a2010-01-26 23:18:02 +00001733void DwarfDebug::endFunction(const MachineFunction *MF) {
Devang Patelbf47fdb2011-08-10 20:55:27 +00001734 if (!MMI->hasDebugInfo() || LScopes.empty()) return;
Devang Patel70d75ca2009-11-12 19:02:56 +00001735
Devang Patelbf47fdb2011-08-10 20:55:27 +00001736 // Define end label for subprogram.
1737 FunctionEndSym = Asm->GetTempSymbol("func_end",
1738 Asm->getFunctionNumber());
1739 // Assumes in correct section after the entry point.
1740 Asm->OutStreamer.EmitLabel(FunctionEndSym);
Manman Ren43213cf2013-02-05 21:52:47 +00001741 // Set DwarfCompileUnitID in MCContext to default value.
1742 Asm->OutStreamer.getContext().setDwarfCompileUnitID(0);
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001743
Devang Patelbf47fdb2011-08-10 20:55:27 +00001744 SmallPtrSet<const MDNode *, 16> ProcessedVars;
1745 collectVariableInfo(MF, ProcessedVars);
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001746
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001747 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
Devang Patel94c7ddb2011-08-16 22:09:43 +00001748 CompileUnit *TheCU = SPMap.lookup(FnScope->getScopeNode());
Nick Lewycky746cb672011-10-26 22:55:33 +00001749 assert(TheCU && "Unable to find compile unit!");
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001750
Devang Patelbf47fdb2011-08-10 20:55:27 +00001751 // Construct abstract scopes.
Devang Patelcd9f6c52011-08-12 18:10:19 +00001752 ArrayRef<LexicalScope *> AList = LScopes.getAbstractScopesList();
1753 for (unsigned i = 0, e = AList.size(); i != e; ++i) {
1754 LexicalScope *AScope = AList[i];
1755 DISubprogram SP(AScope->getScopeNode());
Manman Rend03d2b22013-07-08 18:33:29 +00001756 if (SP.isSubprogram()) {
Devang Patelbf47fdb2011-08-10 20:55:27 +00001757 // Collect info for variables that were optimized out.
Devang Patel93d39be2011-08-19 23:28:12 +00001758 DIArray Variables = SP.getVariables();
1759 for (unsigned i = 0, e = Variables.getNumElements(); i != e; ++i) {
1760 DIVariable DV(Variables.getElement(i));
Manman Rend03d2b22013-07-08 18:33:29 +00001761 if (!DV || !DV.isVariable() || !ProcessedVars.insert(DV))
Devang Patel93d39be2011-08-19 23:28:12 +00001762 continue;
Alexey Samsonovb67bd332012-07-06 08:45:08 +00001763 // Check that DbgVariable for DV wasn't created earlier, when
1764 // findAbstractVariable() was called for inlined instance of DV.
1765 LLVMContext &Ctx = DV->getContext();
1766 DIVariable CleanDV = cleanseInlinedVariable(DV, Ctx);
1767 if (AbstractVariables.lookup(CleanDV))
1768 continue;
Devang Patel93d39be2011-08-19 23:28:12 +00001769 if (LexicalScope *Scope = LScopes.findAbstractScope(DV.getContext()))
1770 addScopeVariable(Scope, new DbgVariable(DV, NULL));
Devang Patel78e127d2010-06-25 22:07:34 +00001771 }
1772 }
Devang Patelcd9f6c52011-08-12 18:10:19 +00001773 if (ProcessedSPNodes.count(AScope->getScopeNode()) == 0)
Manman Ren742671b2013-05-29 17:16:59 +00001774 constructScopeDIE(TheCU, AScope);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001775 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001776
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001777 DIE *CurFnDIE = constructScopeDIE(TheCU, FnScope);
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001778
Nick Lewycky8a8d4792011-12-02 22:16:29 +00001779 if (!MF->getTarget().Options.DisableFramePointerElim(*MF))
Eric Christopher873cf0a2012-08-24 01:14:27 +00001780 TheCU->addFlag(CurFnDIE, dwarf::DW_AT_APPLE_omit_frame_ptr);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001781
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001782 // Clear debug info
Craig Topper01eb99a2013-07-03 04:40:27 +00001783 for (ScopeVariablesMap::iterator
Devang Patelbf47fdb2011-08-10 20:55:27 +00001784 I = ScopeVariables.begin(), E = ScopeVariables.end(); I != E; ++I)
1785 DeleteContainerPointers(I->second);
1786 ScopeVariables.clear();
Devang Pateleac0c9d2011-04-22 18:09:57 +00001787 DeleteContainerPointers(CurrentFnArguments);
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001788 UserVariables.clear();
1789 DbgValues.clear();
Jeffrey Yasskin5c213dc2010-03-12 17:45:06 +00001790 AbstractVariables.clear();
Devang Pateleac9c072010-04-27 19:46:33 +00001791 LabelsBeforeInsn.clear();
1792 LabelsAfterInsn.clear();
Devang Patelf2548ca2010-04-16 23:33:45 +00001793 PrevLabel = NULL;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001794}
1795
Eric Christopherb6dc8652012-11-27 22:43:45 +00001796// Register a source line with debug info. Returns the unique label that was
1797// emitted and which provides correspondence to the source line list.
Devang Patel4243e672011-05-11 19:22:19 +00001798void DwarfDebug::recordSourceLine(unsigned Line, unsigned Col, const MDNode *S,
1799 unsigned Flags) {
Devang Patel65dbc902009-11-25 17:36:49 +00001800 StringRef Fn;
Devang Patel23670e52011-03-24 20:30:50 +00001801 StringRef Dir;
Dan Gohman1cc0d622010-05-05 23:41:32 +00001802 unsigned Src = 1;
1803 if (S) {
1804 DIDescriptor Scope(S);
Devang Patelf84548d2009-10-05 18:03:19 +00001805
Dan Gohman1cc0d622010-05-05 23:41:32 +00001806 if (Scope.isCompileUnit()) {
1807 DICompileUnit CU(S);
Dan Gohman1cc0d622010-05-05 23:41:32 +00001808 Fn = CU.getFilename();
Devang Patel23670e52011-03-24 20:30:50 +00001809 Dir = CU.getDirectory();
Devang Patel3cabc9d2010-10-28 17:30:52 +00001810 } else if (Scope.isFile()) {
1811 DIFile F(S);
Devang Patel3cabc9d2010-10-28 17:30:52 +00001812 Fn = F.getFilename();
Devang Patel23670e52011-03-24 20:30:50 +00001813 Dir = F.getDirectory();
Dan Gohman1cc0d622010-05-05 23:41:32 +00001814 } else if (Scope.isSubprogram()) {
1815 DISubprogram SP(S);
Dan Gohman1cc0d622010-05-05 23:41:32 +00001816 Fn = SP.getFilename();
Devang Patel23670e52011-03-24 20:30:50 +00001817 Dir = SP.getDirectory();
Eric Christopher6618a242011-10-11 22:59:11 +00001818 } else if (Scope.isLexicalBlockFile()) {
1819 DILexicalBlockFile DBF(S);
1820 Fn = DBF.getFilename();
1821 Dir = DBF.getDirectory();
Dan Gohman1cc0d622010-05-05 23:41:32 +00001822 } else if (Scope.isLexicalBlock()) {
1823 DILexicalBlock DB(S);
Dan Gohman1cc0d622010-05-05 23:41:32 +00001824 Fn = DB.getFilename();
Devang Patel23670e52011-03-24 20:30:50 +00001825 Dir = DB.getDirectory();
Dan Gohman1cc0d622010-05-05 23:41:32 +00001826 } else
Craig Topper5e25ee82012-02-05 08:31:47 +00001827 llvm_unreachable("Unexpected scope info");
Dan Gohman1cc0d622010-05-05 23:41:32 +00001828
Manman Ren3de61b42013-03-07 01:42:00 +00001829 Src = getOrCreateSourceID(Fn, Dir,
1830 Asm->OutStreamer.getContext().getDwarfCompileUnitID());
Dan Gohman1cc0d622010-05-05 23:41:32 +00001831 }
Nick Lewycky3bbb6f72011-07-29 03:49:23 +00001832 Asm->OutStreamer.EmitDwarfLocDirective(Src, Line, Col, Flags, 0, 0, Fn);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001833}
1834
Bill Wendling829e67b2009-05-20 23:22:40 +00001835//===----------------------------------------------------------------------===//
1836// Emit Methods
1837//===----------------------------------------------------------------------===//
1838
Eric Christopherb6dc8652012-11-27 22:43:45 +00001839// Compute the size and offset of a DIE.
Jim Grosbach7ab38df2009-11-22 19:20:36 +00001840unsigned
Eric Christopher0e3e9b72012-12-10 23:34:43 +00001841DwarfUnits::computeSizeAndOffset(DIE *Die, unsigned Offset) {
Bill Wendling94d04b82009-05-20 23:21:38 +00001842 // Get the children.
1843 const std::vector<DIE *> &Children = Die->getChildren();
1844
Bill Wendling94d04b82009-05-20 23:21:38 +00001845 // Record the abbreviation.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001846 assignAbbrevNumber(Die->getAbbrev());
Bill Wendling94d04b82009-05-20 23:21:38 +00001847
1848 // Get the abbreviation for this DIE.
1849 unsigned AbbrevNumber = Die->getAbbrevNumber();
Eric Christopher0e3e9b72012-12-10 23:34:43 +00001850 const DIEAbbrev *Abbrev = Abbreviations->at(AbbrevNumber - 1);
Bill Wendling94d04b82009-05-20 23:21:38 +00001851
1852 // Set DIE offset
1853 Die->setOffset(Offset);
1854
1855 // Start the size with the size of abbreviation code.
Chris Lattneraf76e592009-08-22 20:48:53 +00001856 Offset += MCAsmInfo::getULEB128Size(AbbrevNumber);
Bill Wendling94d04b82009-05-20 23:21:38 +00001857
Eric Christopherf7cef702013-03-29 23:34:06 +00001858 const SmallVectorImpl<DIEValue*> &Values = Die->getValues();
1859 const SmallVectorImpl<DIEAbbrevData> &AbbrevData = Abbrev->getData();
Bill Wendling94d04b82009-05-20 23:21:38 +00001860
1861 // Size the DIE attribute values.
1862 for (unsigned i = 0, N = Values.size(); i < N; ++i)
1863 // Size attribute value.
Chris Lattnera37d5382010-04-05 00:18:22 +00001864 Offset += Values[i]->SizeOf(Asm, AbbrevData[i].getForm());
Bill Wendling94d04b82009-05-20 23:21:38 +00001865
1866 // Size the DIE children if any.
1867 if (!Children.empty()) {
1868 assert(Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes &&
1869 "Children flag not set");
1870
1871 for (unsigned j = 0, M = Children.size(); j < M; ++j)
Eric Christopherfbd19752012-11-20 22:14:13 +00001872 Offset = computeSizeAndOffset(Children[j], Offset);
Bill Wendling94d04b82009-05-20 23:21:38 +00001873
1874 // End of children marker.
1875 Offset += sizeof(int8_t);
1876 }
1877
1878 Die->setSize(Offset - Die->getOffset());
1879 return Offset;
1880}
1881
Eric Christopherb6dc8652012-11-27 22:43:45 +00001882// Compute the size and offset of all the DIEs.
Eric Christopher0e3e9b72012-12-10 23:34:43 +00001883void DwarfUnits::computeSizeAndOffsets() {
Manman Renbc3e96f2013-03-12 18:27:15 +00001884 // Offset from the beginning of debug info section.
Eric Christopherd2df98f2013-05-30 00:43:35 +00001885 unsigned SecOffset = 0;
Eric Christopherf7cef702013-03-29 23:34:06 +00001886 for (SmallVectorImpl<CompileUnit *>::iterator I = CUs.begin(),
Eric Christopher0e3e9b72012-12-10 23:34:43 +00001887 E = CUs.end(); I != E; ++I) {
Eric Christopherd2df98f2013-05-30 00:43:35 +00001888 (*I)->setDebugInfoOffset(SecOffset);
Eric Christopher98e237f2012-11-30 23:59:06 +00001889 unsigned Offset =
1890 sizeof(int32_t) + // Length of Compilation Unit Info
1891 sizeof(int16_t) + // DWARF version number
1892 sizeof(int32_t) + // Offset Into Abbrev. Section
1893 sizeof(int8_t); // Pointer Size (in bytes)
1894
Manman Renbc3e96f2013-03-12 18:27:15 +00001895 unsigned EndOffset = computeSizeAndOffset((*I)->getCUDie(), Offset);
Eric Christopherd2df98f2013-05-30 00:43:35 +00001896 SecOffset += EndOffset;
Devang Patel163a9f72010-05-10 22:49:55 +00001897 }
Bill Wendling94d04b82009-05-20 23:21:38 +00001898}
1899
Eric Christopherb6dc8652012-11-27 22:43:45 +00001900// Emit initial Dwarf sections with a label at the start of each one.
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001901void DwarfDebug::emitSectionLabels() {
Chris Lattner6c2f9e12009-08-19 05:49:37 +00001902 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
Daniel Dunbarf612ff62009-09-19 20:40:05 +00001903
Bill Wendling94d04b82009-05-20 23:21:38 +00001904 // Dwarf sections base addresses.
Jim Grosbach1e20b962010-07-21 21:21:52 +00001905 DwarfInfoSectionSym =
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001906 emitSectionSym(Asm, TLOF.getDwarfInfoSection(), "section_info");
Jim Grosbach1e20b962010-07-21 21:21:52 +00001907 DwarfAbbrevSectionSym =
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001908 emitSectionSym(Asm, TLOF.getDwarfAbbrevSection(), "section_abbrev");
Eric Christopher6eebe472012-12-19 22:02:53 +00001909 if (useSplitDwarf())
1910 DwarfAbbrevDWOSectionSym =
1911 emitSectionSym(Asm, TLOF.getDwarfAbbrevDWOSection(),
1912 "section_abbrev_dwo");
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001913 emitSectionSym(Asm, TLOF.getDwarfARangesSection());
Jim Grosbach1e20b962010-07-21 21:21:52 +00001914
Chris Lattner9c69e285532010-04-04 22:59:04 +00001915 if (const MCSection *MacroInfo = TLOF.getDwarfMacroInfoSection())
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001916 emitSectionSym(Asm, MacroInfo);
Bill Wendling94d04b82009-05-20 23:21:38 +00001917
Eric Christopher7a0103c2013-02-07 21:19:50 +00001918 DwarfLineSectionSym =
1919 emitSectionSym(Asm, TLOF.getDwarfLineSection(), "section_line");
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001920 emitSectionSym(Asm, TLOF.getDwarfLocSection());
Michael Gottesmandc42d032013-09-04 04:39:38 +00001921 if (HasDwarfPubSections) {
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00001922 emitSectionSym(Asm, TLOF.getDwarfPubNamesSection());
Eric Christopher978046b2013-08-26 23:24:31 +00001923 emitSectionSym(Asm, TLOF.getDwarfPubTypesSection());
Michael Gottesmandc42d032013-09-04 04:39:38 +00001924 }
Jim Grosbach1e20b962010-07-21 21:21:52 +00001925 DwarfStrSectionSym =
Eric Christopher64f824c2012-12-27 02:14:01 +00001926 emitSectionSym(Asm, TLOF.getDwarfStrSection(), "info_string");
Eric Christopher9a9e73b2013-04-07 03:43:09 +00001927 if (useSplitDwarf()) {
Eric Christopher64f824c2012-12-27 02:14:01 +00001928 DwarfStrDWOSectionSym =
1929 emitSectionSym(Asm, TLOF.getDwarfStrDWOSection(), "skel_string");
Eric Christopher9a9e73b2013-04-07 03:43:09 +00001930 DwarfAddrSectionSym =
1931 emitSectionSym(Asm, TLOF.getDwarfAddrSection(), "addr_sec");
1932 }
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001933 DwarfDebugRangeSectionSym = emitSectionSym(Asm, TLOF.getDwarfRangesSection(),
Devang Patelf2548ca2010-04-16 23:33:45 +00001934 "debug_range");
Bill Wendling94d04b82009-05-20 23:21:38 +00001935
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001936 DwarfDebugLocSectionSym = emitSectionSym(Asm, TLOF.getDwarfLocSection(),
Devang Patelc3f5f782010-05-25 23:40:22 +00001937 "section_debug_loc");
1938
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001939 TextSectionSym = emitSectionSym(Asm, TLOF.getTextSection(), "text_begin");
1940 emitSectionSym(Asm, TLOF.getDataSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00001941}
1942
Eric Christopherb6dc8652012-11-27 22:43:45 +00001943// Recursively emits a debug information entry.
Eric Christopher6eebe472012-12-19 22:02:53 +00001944void DwarfDebug::emitDIE(DIE *Die, std::vector<DIEAbbrev *> *Abbrevs) {
Bill Wendling94d04b82009-05-20 23:21:38 +00001945 // Get the abbreviation for this DIE.
1946 unsigned AbbrevNumber = Die->getAbbrevNumber();
Eric Christopher6eebe472012-12-19 22:02:53 +00001947 const DIEAbbrev *Abbrev = Abbrevs->at(AbbrevNumber - 1);
Bill Wendling94d04b82009-05-20 23:21:38 +00001948
Bill Wendling94d04b82009-05-20 23:21:38 +00001949 // Emit the code (index) for the abbreviation.
Chris Lattner3f53c832010-04-04 18:52:31 +00001950 if (Asm->isVerbose())
Chris Lattner894d75a2010-01-22 23:18:42 +00001951 Asm->OutStreamer.AddComment("Abbrev [" + Twine(AbbrevNumber) + "] 0x" +
1952 Twine::utohexstr(Die->getOffset()) + ":0x" +
1953 Twine::utohexstr(Die->getSize()) + " " +
1954 dwarf::TagString(Abbrev->getTag()));
Chris Lattner7e1a8f82010-04-04 19:09:29 +00001955 Asm->EmitULEB128(AbbrevNumber);
Bill Wendling94d04b82009-05-20 23:21:38 +00001956
Eric Christopherf7cef702013-03-29 23:34:06 +00001957 const SmallVectorImpl<DIEValue*> &Values = Die->getValues();
1958 const SmallVectorImpl<DIEAbbrevData> &AbbrevData = Abbrev->getData();
Bill Wendling94d04b82009-05-20 23:21:38 +00001959
1960 // Emit the DIE attribute values.
1961 for (unsigned i = 0, N = Values.size(); i < N; ++i) {
1962 unsigned Attr = AbbrevData[i].getAttribute();
1963 unsigned Form = AbbrevData[i].getForm();
1964 assert(Form && "Too many attributes for DIE (check abbreviation)");
1965
Chris Lattner3f53c832010-04-04 18:52:31 +00001966 if (Asm->isVerbose())
Chris Lattnera8013622010-01-24 18:54:17 +00001967 Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr));
Jim Grosbach1e20b962010-07-21 21:21:52 +00001968
Bill Wendling94d04b82009-05-20 23:21:38 +00001969 switch (Attr) {
Bill Wendling94d04b82009-05-20 23:21:38 +00001970 case dwarf::DW_AT_abstract_origin: {
1971 DIEEntry *E = cast<DIEEntry>(Values[i]);
1972 DIE *Origin = E->getEntry();
Devang Patel53bb5c92009-11-10 23:06:00 +00001973 unsigned Addr = Origin->getOffset();
Manman Renbc3e96f2013-03-12 18:27:15 +00001974 if (Form == dwarf::DW_FORM_ref_addr) {
1975 // For DW_FORM_ref_addr, output the offset from beginning of debug info
1976 // section. Origin->getOffset() returns the offset from start of the
1977 // compile unit.
1978 DwarfUnits &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
1979 Addr += Holder.getCUOffset(Origin->getCompileUnit());
1980 }
Manman Ren0e6783f2013-07-02 23:40:10 +00001981 Asm->OutStreamer.EmitIntValue(Addr,
1982 Form == dwarf::DW_FORM_ref_addr ? DIEEntry::getRefAddrSize(Asm) : 4);
Bill Wendling94d04b82009-05-20 23:21:38 +00001983 break;
1984 }
Devang Patelf2548ca2010-04-16 23:33:45 +00001985 case dwarf::DW_AT_ranges: {
1986 // DW_AT_range Value encodes offset in debug_range section.
1987 DIEInteger *V = cast<DIEInteger>(Values[i]);
Devang Patelb1fcfbe2010-09-02 16:43:44 +00001988
Nick Lewyckyffccd922012-06-22 01:25:12 +00001989 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections()) {
Devang Patelb1fcfbe2010-09-02 16:43:44 +00001990 Asm->EmitLabelPlusOffset(DwarfDebugRangeSectionSym,
1991 V->getValue(),
1992 4);
1993 } else {
1994 Asm->EmitLabelOffsetDifference(DwarfDebugRangeSectionSym,
1995 V->getValue(),
1996 DwarfDebugRangeSectionSym,
1997 4);
1998 }
Devang Patelf2548ca2010-04-16 23:33:45 +00001999 break;
2000 }
Devang Patelc3f5f782010-05-25 23:40:22 +00002001 case dwarf::DW_AT_location: {
Nick Lewyckyffccd922012-06-22 01:25:12 +00002002 if (DIELabel *L = dyn_cast<DIELabel>(Values[i])) {
2003 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +00002004 Asm->EmitLabelReference(L->getValue(), 4);
Nick Lewyckyffccd922012-06-22 01:25:12 +00002005 else
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +00002006 Asm->EmitLabelDifference(L->getValue(), DwarfDebugLocSectionSym, 4);
Nick Lewyckyffccd922012-06-22 01:25:12 +00002007 } else {
Devang Patelc3f5f782010-05-25 23:40:22 +00002008 Values[i]->EmitValue(Asm, Form);
Nick Lewyckyffccd922012-06-22 01:25:12 +00002009 }
Devang Patelc3f5f782010-05-25 23:40:22 +00002010 break;
2011 }
Devang Patel2a361602010-09-29 19:08:08 +00002012 case dwarf::DW_AT_accessibility: {
2013 if (Asm->isVerbose()) {
2014 DIEInteger *V = cast<DIEInteger>(Values[i]);
2015 Asm->OutStreamer.AddComment(dwarf::AccessibilityString(V->getValue()));
2016 }
2017 Values[i]->EmitValue(Asm, Form);
2018 break;
2019 }
Bill Wendling94d04b82009-05-20 23:21:38 +00002020 default:
2021 // Emit an attribute using the defined form.
Chris Lattnerd38fee82010-04-05 00:13:49 +00002022 Values[i]->EmitValue(Asm, Form);
Bill Wendling94d04b82009-05-20 23:21:38 +00002023 break;
2024 }
Bill Wendling94d04b82009-05-20 23:21:38 +00002025 }
2026
2027 // Emit the DIE children if any.
2028 if (Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes) {
2029 const std::vector<DIE *> &Children = Die->getChildren();
2030
2031 for (unsigned j = 0, M = Children.size(); j < M; ++j)
Eric Christopher6eebe472012-12-19 22:02:53 +00002032 emitDIE(Children[j], Abbrevs);
Bill Wendling94d04b82009-05-20 23:21:38 +00002033
Chris Lattner3f53c832010-04-04 18:52:31 +00002034 if (Asm->isVerbose())
Chris Lattner233f52b2010-03-09 23:52:58 +00002035 Asm->OutStreamer.AddComment("End Of Children Mark");
2036 Asm->EmitInt8(0);
Bill Wendling94d04b82009-05-20 23:21:38 +00002037 }
2038}
2039
Eric Christopherb1e66d02012-12-15 00:04:07 +00002040// Emit the various dwarf units to the unit section USection with
2041// the abbreviations going into ASection.
2042void DwarfUnits::emitUnits(DwarfDebug *DD,
2043 const MCSection *USection,
2044 const MCSection *ASection,
2045 const MCSymbol *ASectionSym) {
2046 Asm->OutStreamer.SwitchSection(USection);
Eric Christopherf7cef702013-03-29 23:34:06 +00002047 for (SmallVectorImpl<CompileUnit *>::iterator I = CUs.begin(),
Eric Christopherb1e66d02012-12-15 00:04:07 +00002048 E = CUs.end(); I != E; ++I) {
2049 CompileUnit *TheCU = *I;
Devang Patel163a9f72010-05-10 22:49:55 +00002050 DIE *Die = TheCU->getCUDie();
Jim Grosbach1e20b962010-07-21 21:21:52 +00002051
Devang Patel163a9f72010-05-10 22:49:55 +00002052 // Emit the compile units header.
Eric Christopherb1e66d02012-12-15 00:04:07 +00002053 Asm->OutStreamer
2054 .EmitLabel(Asm->GetTempSymbol(USection->getLabelBeginName(),
2055 TheCU->getUniqueID()));
Jim Grosbach1e20b962010-07-21 21:21:52 +00002056
Devang Patel163a9f72010-05-10 22:49:55 +00002057 // Emit size of content not including length itself
2058 unsigned ContentSize = Die->getSize() +
2059 sizeof(int16_t) + // DWARF version number
2060 sizeof(int32_t) + // Offset Into Abbrev. Section
Devang Patel65705d52011-04-13 19:41:17 +00002061 sizeof(int8_t); // Pointer Size (in bytes)
Jim Grosbach1e20b962010-07-21 21:21:52 +00002062
Devang Patel163a9f72010-05-10 22:49:55 +00002063 Asm->OutStreamer.AddComment("Length of Compilation Unit Info");
2064 Asm->EmitInt32(ContentSize);
2065 Asm->OutStreamer.AddComment("DWARF version number");
Manman Ren0e6783f2013-07-02 23:40:10 +00002066 Asm->EmitInt16(DD->getDwarfVersion());
Devang Patel163a9f72010-05-10 22:49:55 +00002067 Asm->OutStreamer.AddComment("Offset Into Abbrev. Section");
Eric Christopherb1e66d02012-12-15 00:04:07 +00002068 Asm->EmitSectionOffset(Asm->GetTempSymbol(ASection->getLabelBeginName()),
2069 ASectionSym);
Devang Patel163a9f72010-05-10 22:49:55 +00002070 Asm->OutStreamer.AddComment("Address Size (in bytes)");
Chandler Carruth426c2bf2012-11-01 09:14:31 +00002071 Asm->EmitInt8(Asm->getDataLayout().getPointerSize());
Jim Grosbach1e20b962010-07-21 21:21:52 +00002072
Eric Christopher6eebe472012-12-19 22:02:53 +00002073 DD->emitDIE(Die, Abbreviations);
Eric Christopherb1e66d02012-12-15 00:04:07 +00002074 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol(USection->getLabelEndName(),
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002075 TheCU->getUniqueID()));
Devang Patel163a9f72010-05-10 22:49:55 +00002076 }
Bill Wendling94d04b82009-05-20 23:21:38 +00002077}
2078
Manman Renbc3e96f2013-03-12 18:27:15 +00002079/// For a given compile unit DIE, returns offset from beginning of debug info.
2080unsigned DwarfUnits::getCUOffset(DIE *Die) {
Manman Ren4c6f8952013-03-13 18:41:27 +00002081 assert(Die->getTag() == dwarf::DW_TAG_compile_unit &&
2082 "Input DIE should be compile unit in getCUOffset.");
Eric Christophera1eacd02013-08-08 01:41:05 +00002083 for (SmallVectorImpl<CompileUnit *>::iterator I = CUs.begin(), E = CUs.end();
2084 I != E; ++I) {
Manman Renbc3e96f2013-03-12 18:27:15 +00002085 CompileUnit *TheCU = *I;
2086 if (TheCU->getCUDie() == Die)
2087 return TheCU->getDebugInfoOffset();
2088 }
Manman Ren4c6f8952013-03-13 18:41:27 +00002089 llvm_unreachable("The compile unit DIE should belong to CUs in DwarfUnits.");
Manman Renbc3e96f2013-03-12 18:27:15 +00002090}
2091
Eric Christopher98e237f2012-11-30 23:59:06 +00002092// Emit the debug info section.
2093void DwarfDebug::emitDebugInfo() {
Eric Christopherb1e66d02012-12-15 00:04:07 +00002094 DwarfUnits &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
2095
2096 Holder.emitUnits(this, Asm->getObjFileLowering().getDwarfInfoSection(),
2097 Asm->getObjFileLowering().getDwarfAbbrevSection(),
2098 DwarfAbbrevSectionSym);
Eric Christopher98e237f2012-11-30 23:59:06 +00002099}
2100
Eric Christopherb6dc8652012-11-27 22:43:45 +00002101// Emit the abbreviation section.
Eric Christopher7dc68db2012-11-20 23:30:11 +00002102void DwarfDebug::emitAbbreviations() {
Eric Christopher6eebe472012-12-19 22:02:53 +00002103 if (!useSplitDwarf())
2104 emitAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevSection(),
2105 &Abbreviations);
2106 else
2107 emitSkeletonAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevSection());
2108}
Bill Wendling94d04b82009-05-20 23:21:38 +00002109
Eric Christopher6eebe472012-12-19 22:02:53 +00002110void DwarfDebug::emitAbbrevs(const MCSection *Section,
2111 std::vector<DIEAbbrev *> *Abbrevs) {
2112 // Check to see if it is worth the effort.
2113 if (!Abbrevs->empty()) {
2114 // Start the debug abbrev section.
2115 Asm->OutStreamer.SwitchSection(Section);
2116
2117 MCSymbol *Begin = Asm->GetTempSymbol(Section->getLabelBeginName());
Eric Christopher44fedba2012-12-13 03:00:38 +00002118 Asm->OutStreamer.EmitLabel(Begin);
Bill Wendling94d04b82009-05-20 23:21:38 +00002119
2120 // For each abbrevation.
Eric Christopher6eebe472012-12-19 22:02:53 +00002121 for (unsigned i = 0, N = Abbrevs->size(); i < N; ++i) {
Bill Wendling94d04b82009-05-20 23:21:38 +00002122 // Get abbreviation data
Eric Christopher6eebe472012-12-19 22:02:53 +00002123 const DIEAbbrev *Abbrev = Abbrevs->at(i);
Bill Wendling94d04b82009-05-20 23:21:38 +00002124
2125 // Emit the abbrevations code (base 1 index.)
Chris Lattner7e1a8f82010-04-04 19:09:29 +00002126 Asm->EmitULEB128(Abbrev->getNumber(), "Abbreviation Code");
Bill Wendling94d04b82009-05-20 23:21:38 +00002127
2128 // Emit the abbreviations data.
Chris Lattnerd38fee82010-04-05 00:13:49 +00002129 Abbrev->Emit(Asm);
Bill Wendling94d04b82009-05-20 23:21:38 +00002130 }
2131
2132 // Mark end of abbreviations.
Chris Lattner7e1a8f82010-04-04 19:09:29 +00002133 Asm->EmitULEB128(0, "EOM(3)");
Bill Wendling94d04b82009-05-20 23:21:38 +00002134
Eric Christopher6eebe472012-12-19 22:02:53 +00002135 MCSymbol *End = Asm->GetTempSymbol(Section->getLabelEndName());
Eric Christopher44fedba2012-12-13 03:00:38 +00002136 Asm->OutStreamer.EmitLabel(End);
Bill Wendling94d04b82009-05-20 23:21:38 +00002137 }
2138}
2139
Eric Christopherb6dc8652012-11-27 22:43:45 +00002140// Emit the last address of the section and the end of the line matrix.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002141void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) {
Bill Wendling94d04b82009-05-20 23:21:38 +00002142 // Define last address of section.
Chris Lattner233f52b2010-03-09 23:52:58 +00002143 Asm->OutStreamer.AddComment("Extended Op");
2144 Asm->EmitInt8(0);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002145
Chris Lattner233f52b2010-03-09 23:52:58 +00002146 Asm->OutStreamer.AddComment("Op size");
Chandler Carruth426c2bf2012-11-01 09:14:31 +00002147 Asm->EmitInt8(Asm->getDataLayout().getPointerSize() + 1);
Chris Lattner233f52b2010-03-09 23:52:58 +00002148 Asm->OutStreamer.AddComment("DW_LNE_set_address");
2149 Asm->EmitInt8(dwarf::DW_LNE_set_address);
2150
2151 Asm->OutStreamer.AddComment("Section end label");
Chris Lattnerd85fc6e2010-03-10 01:17:49 +00002152
Chris Lattnerc0215722010-04-04 19:25:43 +00002153 Asm->OutStreamer.EmitSymbolValue(Asm->GetTempSymbol("section_end",SectionEnd),
Eric Christopherca1dd052013-01-09 01:35:34 +00002154 Asm->getDataLayout().getPointerSize());
Bill Wendling94d04b82009-05-20 23:21:38 +00002155
2156 // Mark end of matrix.
Chris Lattner233f52b2010-03-09 23:52:58 +00002157 Asm->OutStreamer.AddComment("DW_LNE_end_sequence");
2158 Asm->EmitInt8(0);
Chris Lattner0ad9c912010-01-22 22:09:00 +00002159 Asm->EmitInt8(1);
Chris Lattner894d75a2010-01-22 23:18:42 +00002160 Asm->EmitInt8(1);
Bill Wendling94d04b82009-05-20 23:21:38 +00002161}
2162
Eric Christopherb6dc8652012-11-27 22:43:45 +00002163// Emit visible names into a hashed accelerator table section.
Eric Christopher09ac3d82011-11-07 09:24:32 +00002164void DwarfDebug::emitAccelNames() {
Eric Christopher577056f2013-09-05 18:20:16 +00002165 DwarfAccelTable AT(DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset,
Eric Christopher09ac3d82011-11-07 09:24:32 +00002166 dwarf::DW_FORM_data4));
2167 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2168 E = CUMap.end(); I != E; ++I) {
2169 CompileUnit *TheCU = I->second;
Eric Christopher0ffe2b42011-11-10 19:25:34 +00002170 const StringMap<std::vector<DIE*> > &Names = TheCU->getAccelNames();
2171 for (StringMap<std::vector<DIE*> >::const_iterator
Eric Christopher09ac3d82011-11-07 09:24:32 +00002172 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
Benjamin Kramer03406c42013-05-11 18:24:28 +00002173 StringRef Name = GI->getKey();
Eric Christopherfa03db02012-01-06 23:03:34 +00002174 const std::vector<DIE *> &Entities = GI->second;
Eric Christopher0ffe2b42011-11-10 19:25:34 +00002175 for (std::vector<DIE *>::const_iterator DI = Entities.begin(),
2176 DE = Entities.end(); DI != DE; ++DI)
2177 AT.AddName(Name, (*DI));
Eric Christopher09ac3d82011-11-07 09:24:32 +00002178 }
2179 }
2180
2181 AT.FinalizeTable(Asm, "Names");
2182 Asm->OutStreamer.SwitchSection(
2183 Asm->getObjFileLowering().getDwarfAccelNamesSection());
2184 MCSymbol *SectionBegin = Asm->GetTempSymbol("names_begin");
2185 Asm->OutStreamer.EmitLabel(SectionBegin);
2186
2187 // Emit the full data.
Eric Christopher2e5d8702012-12-20 21:58:36 +00002188 AT.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher09ac3d82011-11-07 09:24:32 +00002189}
2190
Eric Christopher72c16552012-12-20 21:58:40 +00002191// Emit objective C classes and categories into a hashed accelerator table
2192// section.
Eric Christopher09ac3d82011-11-07 09:24:32 +00002193void DwarfDebug::emitAccelObjC() {
Eric Christopher577056f2013-09-05 18:20:16 +00002194 DwarfAccelTable AT(DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset,
Eric Christopher09ac3d82011-11-07 09:24:32 +00002195 dwarf::DW_FORM_data4));
2196 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2197 E = CUMap.end(); I != E; ++I) {
2198 CompileUnit *TheCU = I->second;
2199 const StringMap<std::vector<DIE*> > &Names = TheCU->getAccelObjC();
2200 for (StringMap<std::vector<DIE*> >::const_iterator
2201 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
Benjamin Kramer03406c42013-05-11 18:24:28 +00002202 StringRef Name = GI->getKey();
Eric Christopherfa03db02012-01-06 23:03:34 +00002203 const std::vector<DIE *> &Entities = GI->second;
Eric Christopher09ac3d82011-11-07 09:24:32 +00002204 for (std::vector<DIE *>::const_iterator DI = Entities.begin(),
2205 DE = Entities.end(); DI != DE; ++DI)
2206 AT.AddName(Name, (*DI));
2207 }
2208 }
2209
2210 AT.FinalizeTable(Asm, "ObjC");
2211 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering()
2212 .getDwarfAccelObjCSection());
2213 MCSymbol *SectionBegin = Asm->GetTempSymbol("objc_begin");
2214 Asm->OutStreamer.EmitLabel(SectionBegin);
2215
2216 // Emit the full data.
Eric Christopher2e5d8702012-12-20 21:58:36 +00002217 AT.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher09ac3d82011-11-07 09:24:32 +00002218}
2219
Eric Christopherb6dc8652012-11-27 22:43:45 +00002220// Emit namespace dies into a hashed accelerator table.
Eric Christopher09ac3d82011-11-07 09:24:32 +00002221void DwarfDebug::emitAccelNamespaces() {
Eric Christopher577056f2013-09-05 18:20:16 +00002222 DwarfAccelTable AT(DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset,
Eric Christopher09ac3d82011-11-07 09:24:32 +00002223 dwarf::DW_FORM_data4));
2224 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2225 E = CUMap.end(); I != E; ++I) {
2226 CompileUnit *TheCU = I->second;
Eric Christopher8bd36ea2011-11-10 21:47:55 +00002227 const StringMap<std::vector<DIE*> > &Names = TheCU->getAccelNamespace();
2228 for (StringMap<std::vector<DIE*> >::const_iterator
Eric Christopher09ac3d82011-11-07 09:24:32 +00002229 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
Benjamin Kramer03406c42013-05-11 18:24:28 +00002230 StringRef Name = GI->getKey();
Eric Christopherfa03db02012-01-06 23:03:34 +00002231 const std::vector<DIE *> &Entities = GI->second;
Eric Christopher8bd36ea2011-11-10 21:47:55 +00002232 for (std::vector<DIE *>::const_iterator DI = Entities.begin(),
2233 DE = Entities.end(); DI != DE; ++DI)
2234 AT.AddName(Name, (*DI));
Eric Christopher09ac3d82011-11-07 09:24:32 +00002235 }
2236 }
2237
2238 AT.FinalizeTable(Asm, "namespac");
2239 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering()
2240 .getDwarfAccelNamespaceSection());
2241 MCSymbol *SectionBegin = Asm->GetTempSymbol("namespac_begin");
2242 Asm->OutStreamer.EmitLabel(SectionBegin);
2243
2244 // Emit the full data.
Eric Christopher2e5d8702012-12-20 21:58:36 +00002245 AT.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher09ac3d82011-11-07 09:24:32 +00002246}
2247
Eric Christopherb6dc8652012-11-27 22:43:45 +00002248// Emit type dies into a hashed accelerator table.
Eric Christopher09ac3d82011-11-07 09:24:32 +00002249void DwarfDebug::emitAccelTypes() {
Eric Christopherc36145f2012-01-06 04:35:23 +00002250 std::vector<DwarfAccelTable::Atom> Atoms;
Eric Christopher577056f2013-09-05 18:20:16 +00002251 Atoms.push_back(DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset,
Eric Christopherc36145f2012-01-06 04:35:23 +00002252 dwarf::DW_FORM_data4));
Eric Christopher577056f2013-09-05 18:20:16 +00002253 Atoms.push_back(DwarfAccelTable::Atom(dwarf::DW_ATOM_die_tag,
Eric Christopherc36145f2012-01-06 04:35:23 +00002254 dwarf::DW_FORM_data2));
Eric Christopher577056f2013-09-05 18:20:16 +00002255 Atoms.push_back(DwarfAccelTable::Atom(dwarf::DW_ATOM_type_flags,
Eric Christopherc36145f2012-01-06 04:35:23 +00002256 dwarf::DW_FORM_data1));
2257 DwarfAccelTable AT(Atoms);
Eric Christopher09ac3d82011-11-07 09:24:32 +00002258 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2259 E = CUMap.end(); I != E; ++I) {
2260 CompileUnit *TheCU = I->second;
Eric Christopherc36145f2012-01-06 04:35:23 +00002261 const StringMap<std::vector<std::pair<DIE*, unsigned > > > &Names
2262 = TheCU->getAccelTypes();
2263 for (StringMap<std::vector<std::pair<DIE*, unsigned> > >::const_iterator
Eric Christopher09ac3d82011-11-07 09:24:32 +00002264 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
Benjamin Kramer03406c42013-05-11 18:24:28 +00002265 StringRef Name = GI->getKey();
Eric Christopherfa03db02012-01-06 23:03:34 +00002266 const std::vector<std::pair<DIE *, unsigned> > &Entities = GI->second;
Eric Christopherc36145f2012-01-06 04:35:23 +00002267 for (std::vector<std::pair<DIE *, unsigned> >::const_iterator DI
2268 = Entities.begin(), DE = Entities.end(); DI !=DE; ++DI)
2269 AT.AddName(Name, (*DI).first, (*DI).second);
Eric Christopher09ac3d82011-11-07 09:24:32 +00002270 }
2271 }
2272
2273 AT.FinalizeTable(Asm, "types");
2274 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering()
2275 .getDwarfAccelTypesSection());
2276 MCSymbol *SectionBegin = Asm->GetTempSymbol("types_begin");
2277 Asm->OutStreamer.EmitLabel(SectionBegin);
2278
2279 // Emit the full data.
Eric Christopher2e5d8702012-12-20 21:58:36 +00002280 AT.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher09ac3d82011-11-07 09:24:32 +00002281}
2282
Eric Christopher57479322013-09-09 20:03:17 +00002283/// emitDebugPubNames - Emit visible names into a debug pubnames section.
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00002284///
Eric Christopher57479322013-09-09 20:03:17 +00002285void DwarfDebug::emitDebugPubNames() {
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00002286 const MCSection *ISec = Asm->getObjFileLowering().getDwarfInfoSection();
2287
2288 typedef DenseMap<const MDNode*, CompileUnit*> CUMapType;
2289 for (CUMapType::iterator I = CUMap.begin(), E = CUMap.end(); I != E; ++I) {
2290 CompileUnit *TheCU = I->second;
2291 unsigned ID = TheCU->getUniqueID();
2292
2293 if (TheCU->getGlobalNames().empty())
2294 continue;
2295
2296 // Start the dwarf pubnames section.
Eric Christopherf04e4ef2013-08-19 21:07:38 +00002297 Asm->OutStreamer
2298 .SwitchSection(Asm->getObjFileLowering().getDwarfPubNamesSection());
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00002299
2300 Asm->OutStreamer.AddComment("Length of Public Names Info");
2301 Asm->EmitLabelDifference(Asm->GetTempSymbol("pubnames_end", ID),
2302 Asm->GetTempSymbol("pubnames_begin", ID), 4);
2303
2304 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_begin", ID));
2305
2306 Asm->OutStreamer.AddComment("DWARF Version");
David Majnemerd7d43dc2013-08-21 06:13:34 +00002307 Asm->EmitInt16(dwarf::DW_PUBNAMES_VERSION);
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00002308
2309 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
2310 Asm->EmitSectionOffset(Asm->GetTempSymbol(ISec->getLabelBeginName(), ID),
2311 DwarfInfoSectionSym);
2312
2313 Asm->OutStreamer.AddComment("Compilation Unit Length");
2314 Asm->EmitLabelDifference(Asm->GetTempSymbol(ISec->getLabelEndName(), ID),
2315 Asm->GetTempSymbol(ISec->getLabelBeginName(), ID),
2316 4);
2317
2318 const StringMap<DIE*> &Globals = TheCU->getGlobalNames();
2319 for (StringMap<DIE*>::const_iterator
2320 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2321 const char *Name = GI->getKeyData();
2322 const DIE *Entity = GI->second;
2323
2324 Asm->OutStreamer.AddComment("DIE offset");
2325 Asm->EmitInt32(Entity->getOffset());
2326
2327 if (Asm->isVerbose())
2328 Asm->OutStreamer.AddComment("External Name");
Rafael Espindolaa3863ea2013-07-02 15:49:13 +00002329 Asm->OutStreamer.EmitBytes(StringRef(Name, GI->getKeyLength()+1));
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00002330 }
2331
2332 Asm->OutStreamer.AddComment("End Mark");
2333 Asm->EmitInt32(0);
2334 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_end", ID));
2335 }
2336}
2337
Devang Patel193f7202009-11-24 01:14:22 +00002338void DwarfDebug::emitDebugPubTypes() {
Devang Patel163a9f72010-05-10 22:49:55 +00002339 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2340 E = CUMap.end(); I != E; ++I) {
2341 CompileUnit *TheCU = I->second;
Eric Christopher63701182011-11-07 09:18:35 +00002342 // Start the dwarf pubtypes section.
Devang Patel163a9f72010-05-10 22:49:55 +00002343 Asm->OutStreamer.SwitchSection(
2344 Asm->getObjFileLowering().getDwarfPubTypesSection());
2345 Asm->OutStreamer.AddComment("Length of Public Types Info");
2346 Asm->EmitLabelDifference(
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002347 Asm->GetTempSymbol("pubtypes_end", TheCU->getUniqueID()),
2348 Asm->GetTempSymbol("pubtypes_begin", TheCU->getUniqueID()), 4);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002349
Devang Patel163a9f72010-05-10 22:49:55 +00002350 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_begin",
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002351 TheCU->getUniqueID()));
Jim Grosbach1e20b962010-07-21 21:21:52 +00002352
Devang Patel163a9f72010-05-10 22:49:55 +00002353 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DWARF Version");
David Majnemerd7d43dc2013-08-21 06:13:34 +00002354 Asm->EmitInt16(dwarf::DW_PUBTYPES_VERSION);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002355
Devang Patel163a9f72010-05-10 22:49:55 +00002356 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
Eric Christophercf6b8ad2012-12-15 00:04:04 +00002357 const MCSection *ISec = Asm->getObjFileLowering().getDwarfInfoSection();
2358 Asm->EmitSectionOffset(Asm->GetTempSymbol(ISec->getLabelBeginName(),
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002359 TheCU->getUniqueID()),
Devang Patel163a9f72010-05-10 22:49:55 +00002360 DwarfInfoSectionSym);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002361
Devang Patel163a9f72010-05-10 22:49:55 +00002362 Asm->OutStreamer.AddComment("Compilation Unit Length");
Eric Christophercf6b8ad2012-12-15 00:04:04 +00002363 Asm->EmitLabelDifference(Asm->GetTempSymbol(ISec->getLabelEndName(),
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002364 TheCU->getUniqueID()),
Eric Christophercf6b8ad2012-12-15 00:04:04 +00002365 Asm->GetTempSymbol(ISec->getLabelBeginName(),
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002366 TheCU->getUniqueID()),
Devang Patel163a9f72010-05-10 22:49:55 +00002367 4);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002368
Devang Patel163a9f72010-05-10 22:49:55 +00002369 const StringMap<DIE*> &Globals = TheCU->getGlobalTypes();
2370 for (StringMap<DIE*>::const_iterator
2371 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2372 const char *Name = GI->getKeyData();
Nick Lewycky3bbb6f72011-07-29 03:49:23 +00002373 DIE *Entity = GI->second;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002374
Devang Patel163a9f72010-05-10 22:49:55 +00002375 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
2376 Asm->EmitInt32(Entity->getOffset());
Jim Grosbach1e20b962010-07-21 21:21:52 +00002377
Devang Patel163a9f72010-05-10 22:49:55 +00002378 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("External Name");
Benjamin Kramer983c4572011-11-09 18:16:11 +00002379 // Emit the name with a terminating null byte.
Eric Christopher68ca5622013-01-09 01:57:54 +00002380 Asm->OutStreamer.EmitBytes(StringRef(Name, GI->getKeyLength()+1));
Devang Patel163a9f72010-05-10 22:49:55 +00002381 }
Jim Grosbach1e20b962010-07-21 21:21:52 +00002382
Devang Patel163a9f72010-05-10 22:49:55 +00002383 Asm->OutStreamer.AddComment("End Mark");
Jim Grosbach1e20b962010-07-21 21:21:52 +00002384 Asm->EmitInt32(0);
Devang Patel163a9f72010-05-10 22:49:55 +00002385 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_end",
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002386 TheCU->getUniqueID()));
Devang Patel193f7202009-11-24 01:14:22 +00002387 }
Devang Patel193f7202009-11-24 01:14:22 +00002388}
2389
Eric Christopher64f824c2012-12-27 02:14:01 +00002390// Emit strings into a string section.
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002391void DwarfUnits::emitStrings(const MCSection *StrSection,
2392 const MCSection *OffsetSection = NULL,
2393 const MCSymbol *StrSecSym = NULL) {
Eric Christopher64f824c2012-12-27 02:14:01 +00002394
Eric Christopherb6714222013-01-08 22:22:06 +00002395 if (StringPool.empty()) return;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002396
Chris Lattner0d9d70f2010-03-09 23:38:23 +00002397 // Start the dwarf str section.
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002398 Asm->OutStreamer.SwitchSection(StrSection);
Bill Wendling94d04b82009-05-20 23:21:38 +00002399
Chris Lattnerbc733f52010-03-13 02:17:42 +00002400 // Get all of the string pool entries and put them in an array by their ID so
2401 // we can sort them.
Jim Grosbach1e20b962010-07-21 21:21:52 +00002402 SmallVector<std::pair<unsigned,
Eric Christopherff348452013-01-07 22:40:45 +00002403 StringMapEntry<std::pair<MCSymbol*, unsigned> >*>, 64> Entries;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002404
Chris Lattnerbc733f52010-03-13 02:17:42 +00002405 for (StringMap<std::pair<MCSymbol*, unsigned> >::iterator
Eric Christopherb6714222013-01-08 22:22:06 +00002406 I = StringPool.begin(), E = StringPool.end();
Eric Christopher72c16552012-12-20 21:58:40 +00002407 I != E; ++I)
Chris Lattnerbc733f52010-03-13 02:17:42 +00002408 Entries.push_back(std::make_pair(I->second.second, &*I));
Jim Grosbach1e20b962010-07-21 21:21:52 +00002409
Chris Lattnerbc733f52010-03-13 02:17:42 +00002410 array_pod_sort(Entries.begin(), Entries.end());
Jim Grosbach1e20b962010-07-21 21:21:52 +00002411
Chris Lattnerbc733f52010-03-13 02:17:42 +00002412 for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
Chris Lattner0d9d70f2010-03-09 23:38:23 +00002413 // Emit a label for reference from debug information entries.
Chris Lattnerbc733f52010-03-13 02:17:42 +00002414 Asm->OutStreamer.EmitLabel(Entries[i].second->getValue().first);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002415
Benjamin Kramer983c4572011-11-09 18:16:11 +00002416 // Emit the string itself with a terminating null byte.
Benjamin Kramer0c45f7d2011-11-09 12:12:04 +00002417 Asm->OutStreamer.EmitBytes(StringRef(Entries[i].second->getKeyData(),
Eric Christopherca1dd052013-01-09 01:35:34 +00002418 Entries[i].second->getKeyLength()+1));
Bill Wendling94d04b82009-05-20 23:21:38 +00002419 }
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002420
2421 // If we've got an offset section go ahead and emit that now as well.
2422 if (OffsetSection) {
2423 Asm->OutStreamer.SwitchSection(OffsetSection);
2424 unsigned offset = 0;
Eric Christopher72f7bfb2013-01-15 23:56:56 +00002425 unsigned size = 4; // FIXME: DWARF64 is 8.
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002426 for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
Eric Christopher1ced2082013-01-09 03:52:05 +00002427 Asm->OutStreamer.EmitIntValue(offset, size);
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002428 offset += Entries[i].second->getKeyLength() + 1;
2429 }
2430 }
Bill Wendling94d04b82009-05-20 23:21:38 +00002431}
2432
Eric Christopher72f7bfb2013-01-15 23:56:56 +00002433// Emit strings into a string section.
2434void DwarfUnits::emitAddresses(const MCSection *AddrSection) {
2435
2436 if (AddressPool.empty()) return;
2437
2438 // Start the dwarf addr section.
2439 Asm->OutStreamer.SwitchSection(AddrSection);
2440
David Blaikie66f464e2013-07-08 17:51:28 +00002441 // Order the address pool entries by ID
David Blaikie5ce40912013-07-08 17:33:10 +00002442 SmallVector<const MCExpr *, 64> Entries(AddressPool.size());
Eric Christopher72f7bfb2013-01-15 23:56:56 +00002443
David Blaikie66f464e2013-07-08 17:51:28 +00002444 for (DenseMap<const MCExpr *, unsigned>::iterator I = AddressPool.begin(),
2445 E = AddressPool.end();
Eric Christopher72f7bfb2013-01-15 23:56:56 +00002446 I != E; ++I)
David Blaikie5ce40912013-07-08 17:33:10 +00002447 Entries[I->second] = I->first;
Eric Christopher72f7bfb2013-01-15 23:56:56 +00002448
2449 for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
Ulrich Weigand18dbe502013-07-02 18:46:46 +00002450 // Emit an expression for reference from debug information entries.
David Blaikie5ce40912013-07-08 17:33:10 +00002451 if (const MCExpr *Expr = Entries[i])
Ulrich Weigand18dbe502013-07-02 18:46:46 +00002452 Asm->OutStreamer.EmitValue(Expr, Asm->getDataLayout().getPointerSize());
Eric Christopher72f7bfb2013-01-15 23:56:56 +00002453 else
2454 Asm->OutStreamer.EmitIntValue(0, Asm->getDataLayout().getPointerSize());
2455 }
2456
2457}
2458
Eric Christopher64f824c2012-12-27 02:14:01 +00002459// Emit visible names into a debug str section.
2460void DwarfDebug::emitDebugStr() {
2461 DwarfUnits &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
2462 Holder.emitStrings(Asm->getObjFileLowering().getDwarfStrSection());
2463}
2464
Eric Christopherd3b98532013-07-02 21:36:07 +00002465// Emit locations into the debug loc section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002466void DwarfDebug::emitDebugLoc() {
Devang Patel80250682010-05-26 23:55:23 +00002467 if (DotDebugLocEntries.empty())
2468 return;
2469
Eric Christopherf7cef702013-03-29 23:34:06 +00002470 for (SmallVectorImpl<DotDebugLocEntry>::iterator
Devang Patel6c3ea902011-02-04 22:57:18 +00002471 I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
2472 I != E; ++I) {
2473 DotDebugLocEntry &Entry = *I;
2474 if (I + 1 != DotDebugLocEntries.end())
2475 Entry.Merge(I+1);
2476 }
2477
Daniel Dunbar83320a02011-03-16 22:16:39 +00002478 // Start the dwarf loc section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002479 Asm->OutStreamer.SwitchSection(
Devang Patelc3f5f782010-05-25 23:40:22 +00002480 Asm->getObjFileLowering().getDwarfLocSection());
Chandler Carruth426c2bf2012-11-01 09:14:31 +00002481 unsigned char Size = Asm->getDataLayout().getPointerSize();
Devang Patel80250682010-05-26 23:55:23 +00002482 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", 0));
2483 unsigned index = 1;
Eric Christopherf7cef702013-03-29 23:34:06 +00002484 for (SmallVectorImpl<DotDebugLocEntry>::iterator
Jim Grosbach1e20b962010-07-21 21:21:52 +00002485 I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
Devang Patel61409622010-07-07 20:12:52 +00002486 I != E; ++I, ++index) {
Devang Patel6c3ea902011-02-04 22:57:18 +00002487 DotDebugLocEntry &Entry = *I;
2488 if (Entry.isMerged()) continue;
Devang Patelc3f5f782010-05-25 23:40:22 +00002489 if (Entry.isEmpty()) {
Eric Christopherca1dd052013-01-09 01:35:34 +00002490 Asm->OutStreamer.EmitIntValue(0, Size);
2491 Asm->OutStreamer.EmitIntValue(0, Size);
Devang Patel80250682010-05-26 23:55:23 +00002492 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", index));
Devang Patelc3f5f782010-05-25 23:40:22 +00002493 } else {
Eric Christopher0d0782a2013-07-03 22:40:18 +00002494 Asm->OutStreamer.EmitSymbolValue(Entry.getBeginSym(), Size);
2495 Asm->OutStreamer.EmitSymbolValue(Entry.getEndSym(), Size);
2496 DIVariable DV(Entry.getVariable());
Rafael Espindola5b23b7f2011-05-27 22:05:41 +00002497 Asm->OutStreamer.AddComment("Loc expr size");
2498 MCSymbol *begin = Asm->OutStreamer.getContext().CreateTempSymbol();
2499 MCSymbol *end = Asm->OutStreamer.getContext().CreateTempSymbol();
2500 Asm->EmitLabelDifference(end, begin, 2);
2501 Asm->OutStreamer.EmitLabel(begin);
Devang Patel80efd4e2011-07-08 16:49:43 +00002502 if (Entry.isInt()) {
Devang Patelc4329072011-06-01 22:03:25 +00002503 DIBasicType BTy(DV.getType());
2504 if (BTy.Verify() &&
Eric Christopher0f1c7f62012-11-19 22:42:10 +00002505 (BTy.getEncoding() == dwarf::DW_ATE_signed
Devang Patelc4329072011-06-01 22:03:25 +00002506 || BTy.getEncoding() == dwarf::DW_ATE_signed_char)) {
2507 Asm->OutStreamer.AddComment("DW_OP_consts");
2508 Asm->EmitInt8(dwarf::DW_OP_consts);
Devang Patel80efd4e2011-07-08 16:49:43 +00002509 Asm->EmitSLEB128(Entry.getInt());
Devang Patelc4329072011-06-01 22:03:25 +00002510 } else {
2511 Asm->OutStreamer.AddComment("DW_OP_constu");
2512 Asm->EmitInt8(dwarf::DW_OP_constu);
Devang Patel80efd4e2011-07-08 16:49:43 +00002513 Asm->EmitULEB128(Entry.getInt());
Devang Patelc4329072011-06-01 22:03:25 +00002514 }
Devang Patel80efd4e2011-07-08 16:49:43 +00002515 } else if (Entry.isLocation()) {
Eric Christopher7c2f3e82013-07-03 22:40:21 +00002516 MachineLocation Loc = Entry.getLoc();
Eric Christopher0f1c7f62012-11-19 22:42:10 +00002517 if (!DV.hasComplexAddress())
Devang Patel80efd4e2011-07-08 16:49:43 +00002518 // Regular entry.
Eric Christopher7c2f3e82013-07-03 22:40:21 +00002519 Asm->EmitDwarfRegOp(Loc, DV.isIndirect());
Devang Patel80efd4e2011-07-08 16:49:43 +00002520 else {
2521 // Complex address entry.
2522 unsigned N = DV.getNumAddrElements();
2523 unsigned i = 0;
2524 if (N >= 2 && DV.getAddrElement(0) == DIBuilder::OpPlus) {
Eric Christopher7c2f3e82013-07-03 22:40:21 +00002525 if (Loc.getOffset()) {
Devang Patel80efd4e2011-07-08 16:49:43 +00002526 i = 2;
Eric Christopher7c2f3e82013-07-03 22:40:21 +00002527 Asm->EmitDwarfRegOp(Loc, DV.isIndirect());
Devang Patel80efd4e2011-07-08 16:49:43 +00002528 Asm->OutStreamer.AddComment("DW_OP_deref");
2529 Asm->EmitInt8(dwarf::DW_OP_deref);
2530 Asm->OutStreamer.AddComment("DW_OP_plus_uconst");
2531 Asm->EmitInt8(dwarf::DW_OP_plus_uconst);
2532 Asm->EmitSLEB128(DV.getAddrElement(1));
2533 } else {
2534 // If first address element is OpPlus then emit
2535 // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
Eric Christopher7c2f3e82013-07-03 22:40:21 +00002536 MachineLocation TLoc(Loc.getReg(), DV.getAddrElement(1));
2537 Asm->EmitDwarfRegOp(TLoc, DV.isIndirect());
Devang Patel80efd4e2011-07-08 16:49:43 +00002538 i = 2;
2539 }
2540 } else {
Eric Christopher7c2f3e82013-07-03 22:40:21 +00002541 Asm->EmitDwarfRegOp(Loc, DV.isIndirect());
Devang Patel80efd4e2011-07-08 16:49:43 +00002542 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +00002543
Devang Patel80efd4e2011-07-08 16:49:43 +00002544 // Emit remaining complex address elements.
2545 for (; i < N; ++i) {
2546 uint64_t Element = DV.getAddrElement(i);
2547 if (Element == DIBuilder::OpPlus) {
2548 Asm->EmitInt8(dwarf::DW_OP_plus_uconst);
2549 Asm->EmitULEB128(DV.getAddrElement(++i));
Eric Christopher50120762012-05-08 18:56:00 +00002550 } else if (Element == DIBuilder::OpDeref) {
Eric Christopher7c2f3e82013-07-03 22:40:21 +00002551 if (!Loc.isReg())
Eric Christopher50120762012-05-08 18:56:00 +00002552 Asm->EmitInt8(dwarf::DW_OP_deref);
2553 } else
2554 llvm_unreachable("unknown Opcode found in complex address");
Devang Patel80efd4e2011-07-08 16:49:43 +00002555 }
Devang Patelc26f5442011-04-28 02:22:40 +00002556 }
Devang Patelc26f5442011-04-28 02:22:40 +00002557 }
Devang Patel80efd4e2011-07-08 16:49:43 +00002558 // else ... ignore constant fp. There is not any good way to
2559 // to represent them here in dwarf.
Rafael Espindola5b23b7f2011-05-27 22:05:41 +00002560 Asm->OutStreamer.EmitLabel(end);
Devang Patelc3f5f782010-05-25 23:40:22 +00002561 }
2562 }
Bill Wendling94d04b82009-05-20 23:21:38 +00002563}
2564
Eric Christopherb6dc8652012-11-27 22:43:45 +00002565// Emit visible names into a debug aranges section.
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00002566void DwarfDebug::emitDebugARanges() {
Bill Wendling94d04b82009-05-20 23:21:38 +00002567 // Start the dwarf aranges section.
Eric Christopherab6cd832013-08-30 00:39:57 +00002568 Asm->OutStreamer
2569 .SwitchSection(Asm->getObjFileLowering().getDwarfARangesSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002570}
2571
Eric Christopherb6dc8652012-11-27 22:43:45 +00002572// Emit visible names into a debug ranges section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002573void DwarfDebug::emitDebugRanges() {
Bill Wendling94d04b82009-05-20 23:21:38 +00002574 // Start the dwarf ranges section.
Eric Christopherab6cd832013-08-30 00:39:57 +00002575 Asm->OutStreamer
2576 .SwitchSection(Asm->getObjFileLowering().getDwarfRangesSection());
Chandler Carruth426c2bf2012-11-01 09:14:31 +00002577 unsigned char Size = Asm->getDataLayout().getPointerSize();
Eric Christopherf7cef702013-03-29 23:34:06 +00002578 for (SmallVectorImpl<const MCSymbol *>::iterator
Jim Grosbach1e20b962010-07-21 21:21:52 +00002579 I = DebugRangeSymbols.begin(), E = DebugRangeSymbols.end();
Devang Pateleac9c072010-04-27 19:46:33 +00002580 I != E; ++I) {
2581 if (*I)
Eric Christopher1ced2082013-01-09 03:52:05 +00002582 Asm->OutStreamer.EmitSymbolValue(const_cast<MCSymbol*>(*I), Size);
Devang Patelf2548ca2010-04-16 23:33:45 +00002583 else
Eric Christopherca1dd052013-01-09 01:35:34 +00002584 Asm->OutStreamer.EmitIntValue(0, Size);
Devang Patelf2548ca2010-04-16 23:33:45 +00002585 }
Bill Wendling94d04b82009-05-20 23:21:38 +00002586}
2587
Eric Christopherb6dc8652012-11-27 22:43:45 +00002588// Emit visible names into a debug macinfo section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002589void DwarfDebug::emitDebugMacInfo() {
Daniel Dunbarf612ff62009-09-19 20:40:05 +00002590 if (const MCSection *LineInfo =
Chris Lattner18a4c162009-08-02 07:24:22 +00002591 Asm->getObjFileLowering().getDwarfMacroInfoSection()) {
Bill Wendling94d04b82009-05-20 23:21:38 +00002592 // Start the dwarf macinfo section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002593 Asm->OutStreamer.SwitchSection(LineInfo);
Bill Wendling94d04b82009-05-20 23:21:38 +00002594 }
2595}
2596
Eric Christopher0b944ee2012-12-11 19:42:09 +00002597// DWARF5 Experimental Separate Dwarf emitters.
Eric Christopher98e237f2012-11-30 23:59:06 +00002598
2599// This DIE has the following attributes: DW_AT_comp_dir, DW_AT_stmt_list,
2600// DW_AT_low_pc, DW_AT_high_pc, DW_AT_ranges, DW_AT_dwo_name, DW_AT_dwo_id,
2601// DW_AT_ranges_base, DW_AT_addr_base. If DW_AT_ranges is present,
2602// DW_AT_low_pc and DW_AT_high_pc are not used, and vice versa.
Eric Christophera9b2c792013-08-26 23:50:43 +00002603CompileUnit *DwarfDebug::constructSkeletonCU(const CompileUnit *CU) {
Eric Christopher98e237f2012-11-30 23:59:06 +00002604
2605 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
Eric Christophera9b2c792013-08-26 23:50:43 +00002606 CompileUnit *NewCU = new CompileUnit(CU->getUniqueID(), Die, CU->getNode(),
2607 Asm, this, &SkeletonHolder);
Eric Christopher446b88f2013-01-17 03:00:04 +00002608
Eric Christopher3ce51a92013-02-22 23:50:08 +00002609 NewCU->addLocalString(Die, dwarf::DW_AT_GNU_dwo_name,
Eric Christopher30410d52013-08-26 23:57:03 +00002610 DICompileUnit(CU->getNode()).getSplitDebugFilename());
Eric Christopher98e237f2012-11-30 23:59:06 +00002611
Eric Christopher1b0cd2f2013-04-22 07:51:08 +00002612 // Relocate to the beginning of the addr_base section, else 0 for the
2613 // beginning of the one for this compile unit.
Eric Christopher9a9e73b2013-04-07 03:43:09 +00002614 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
2615 NewCU->addLabel(Die, dwarf::DW_AT_GNU_addr_base, dwarf::DW_FORM_sec_offset,
2616 DwarfAddrSectionSym);
2617 else
Eric Christopher1b0cd2f2013-04-22 07:51:08 +00002618 NewCU->addUInt(Die, dwarf::DW_AT_GNU_addr_base,
2619 dwarf::DW_FORM_sec_offset, 0);
Eric Christopher98e237f2012-11-30 23:59:06 +00002620
2621 // 2.17.1 requires that we use DW_AT_low_pc for a single entry point
Eric Christopher72f7bfb2013-01-15 23:56:56 +00002622 // into an entity. We're using 0, or a NULL label for this.
Eric Christopher98e237f2012-11-30 23:59:06 +00002623 NewCU->addUInt(Die, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, 0);
Eric Christopher72f7bfb2013-01-15 23:56:56 +00002624
Eric Christopher98e237f2012-11-30 23:59:06 +00002625 // DW_AT_stmt_list is a offset of line number information for this
2626 // compile unit in debug_line section.
Eric Christopher9a9e73b2013-04-07 03:43:09 +00002627 // FIXME: Should handle multiple compile units.
Eric Christopher98e237f2012-11-30 23:59:06 +00002628 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
Eric Christopher446b88f2013-01-17 03:00:04 +00002629 NewCU->addLabel(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_sec_offset,
Eric Christopher7a0103c2013-02-07 21:19:50 +00002630 DwarfLineSectionSym);
Eric Christopher98e237f2012-11-30 23:59:06 +00002631 else
Eric Christopher446b88f2013-01-17 03:00:04 +00002632 NewCU->addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_sec_offset, 0);
Eric Christopher98e237f2012-11-30 23:59:06 +00002633
2634 if (!CompilationDir.empty())
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002635 NewCU->addLocalString(Die, dwarf::DW_AT_comp_dir, CompilationDir);
Eric Christopher98e237f2012-11-30 23:59:06 +00002636
Eric Christopher0e3e9b72012-12-10 23:34:43 +00002637 SkeletonHolder.addUnit(NewCU);
Eric Christopher01776a52013-02-06 21:53:56 +00002638 SkeletonCUs.push_back(NewCU);
Eric Christopher0e3e9b72012-12-10 23:34:43 +00002639
Eric Christopher98e237f2012-11-30 23:59:06 +00002640 return NewCU;
2641}
2642
Eric Christopher6eebe472012-12-19 22:02:53 +00002643void DwarfDebug::emitSkeletonAbbrevs(const MCSection *Section) {
2644 assert(useSplitDwarf() && "No split dwarf debug info?");
2645 emitAbbrevs(Section, &SkeletonAbbrevs);
Eric Christopher98e237f2012-11-30 23:59:06 +00002646}
2647
Eric Christopher0b944ee2012-12-11 19:42:09 +00002648// Emit the .debug_info.dwo section for separated dwarf. This contains the
2649// compile units that would normally be in debug_info.
Eric Christopher98e237f2012-11-30 23:59:06 +00002650void DwarfDebug::emitDebugInfoDWO() {
Eric Christopher4daaed12012-12-10 19:51:21 +00002651 assert(useSplitDwarf() && "No split dwarf debug info?");
Eric Christopherb1e66d02012-12-15 00:04:07 +00002652 InfoHolder.emitUnits(this, Asm->getObjFileLowering().getDwarfInfoDWOSection(),
Eric Christopher6eebe472012-12-19 22:02:53 +00002653 Asm->getObjFileLowering().getDwarfAbbrevDWOSection(),
2654 DwarfAbbrevDWOSectionSym);
2655}
2656
2657// Emit the .debug_abbrev.dwo section for separated dwarf. This contains the
2658// abbreviations for the .debug_info.dwo section.
2659void DwarfDebug::emitDebugAbbrevDWO() {
2660 assert(useSplitDwarf() && "No split dwarf?");
Eric Christopher72c16552012-12-20 21:58:40 +00002661 emitAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevDWOSection(),
2662 &Abbreviations);
Eric Christopher98e237f2012-11-30 23:59:06 +00002663}
Eric Christopher64f824c2012-12-27 02:14:01 +00002664
2665// Emit the .debug_str.dwo section for separated dwarf. This contains the
2666// string section and is identical in format to traditional .debug_str
2667// sections.
2668void DwarfDebug::emitDebugStrDWO() {
2669 assert(useSplitDwarf() && "No split dwarf?");
Eric Christopherff348452013-01-07 22:40:45 +00002670 const MCSection *OffSec = Asm->getObjFileLowering()
2671 .getDwarfStrOffDWOSection();
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002672 const MCSymbol *StrSym = DwarfStrSectionSym;
2673 InfoHolder.emitStrings(Asm->getObjFileLowering().getDwarfStrDWOSection(),
2674 OffSec, StrSym);
Eric Christopher64f824c2012-12-27 02:14:01 +00002675}