blob: 608ce6a5688e911e5c24f6cbd1e42e424a7c419b [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
Eric Christopherb6dc8652012-11-27 22:43:45 +0000427// Construct new DW_TAG_lexical_block for this scope and attach
428// DW_AT_low_pc/DW_AT_high_pc labels.
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000429DIE *DwarfDebug::constructLexicalScopeDIE(CompileUnit *TheCU,
Devang Pateld3024342011-08-15 22:24:32 +0000430 LexicalScope *Scope) {
Devang Pateleac9c072010-04-27 19:46:33 +0000431 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_lexical_block);
432 if (Scope->isAbstractScope())
433 return ScopeDIE;
434
Craig Topper9f43ac62013-07-03 04:24:43 +0000435 const SmallVectorImpl<InsnRange> &Ranges = Scope->getRanges();
Devang Pateleac9c072010-04-27 19:46:33 +0000436 if (Ranges.empty())
437 return 0;
438
Eric Christopherf53d6432013-07-03 01:57:28 +0000439 // If we have multiple ranges, emit them into the range section.
Devang Pateleac9c072010-04-27 19:46:33 +0000440 if (Ranges.size() > 1) {
441 // .debug_range section has not been laid out yet. Emit offset in
Jim Grosbach1e20b962010-07-21 21:21:52 +0000442 // .debug_range as a uint, size 4, for now. emitDIE will handle
Devang Pateleac9c072010-04-27 19:46:33 +0000443 // DW_AT_ranges appropriately.
Devang Patel3cbee302011-04-12 22:53:02 +0000444 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_ranges, dwarf::DW_FORM_data4,
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000445 DebugRangeSymbols.size()
Chandler Carruth426c2bf2012-11-01 09:14:31 +0000446 * Asm->getDataLayout().getPointerSize());
Craig Topper2d785db2013-07-03 04:17:25 +0000447 for (SmallVectorImpl<InsnRange>::const_iterator RI = Ranges.begin(),
Devang Pateleac9c072010-04-27 19:46:33 +0000448 RE = Ranges.end(); RI != RE; ++RI) {
Devang Patelc3f5f782010-05-25 23:40:22 +0000449 DebugRangeSymbols.push_back(getLabelBeforeInsn(RI->first));
450 DebugRangeSymbols.push_back(getLabelAfterInsn(RI->second));
Devang Pateleac9c072010-04-27 19:46:33 +0000451 }
Eric Christopherda965de2013-07-03 01:22:29 +0000452
453 // Terminate the range list.
Devang Pateleac9c072010-04-27 19:46:33 +0000454 DebugRangeSymbols.push_back(NULL);
455 DebugRangeSymbols.push_back(NULL);
456 return ScopeDIE;
457 }
458
Eric Christopherf53d6432013-07-03 01:57:28 +0000459 // Construct the address range for this DIE.
Craig Topper2d785db2013-07-03 04:17:25 +0000460 SmallVectorImpl<InsnRange>::const_iterator RI = Ranges.begin();
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000461 MCSymbol *Start = getLabelBeforeInsn(RI->first);
462 MCSymbol *End = getLabelAfterInsn(RI->second);
Devang Pateleac9c072010-04-27 19:46:33 +0000463
Devang Patelc3f5f782010-05-25 23:40:22 +0000464 if (End == 0) return 0;
Devang Patel53bb5c92009-11-10 23:06:00 +0000465
Chris Lattnerb7db7332010-03-09 01:58:53 +0000466 assert(Start->isDefined() && "Invalid starting label for an inlined scope!");
467 assert(End->isDefined() && "Invalid end label for an inlined scope!");
Jim Grosbach1e20b962010-07-21 21:21:52 +0000468
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000469 TheCU->addLabelAddress(ScopeDIE, dwarf::DW_AT_low_pc, Start);
470 TheCU->addLabelAddress(ScopeDIE, dwarf::DW_AT_high_pc, End);
Devang Patel53bb5c92009-11-10 23:06:00 +0000471
472 return ScopeDIE;
473}
474
Eric Christopherb6dc8652012-11-27 22:43:45 +0000475// This scope represents inlined body of a function. Construct DIE to
476// represent this concrete inlined copy of the function.
Devang Pateld3024342011-08-15 22:24:32 +0000477DIE *DwarfDebug::constructInlinedScopeDIE(CompileUnit *TheCU,
478 LexicalScope *Scope) {
Craig Topper9f43ac62013-07-03 04:24:43 +0000479 const SmallVectorImpl<InsnRange> &Ranges = Scope->getRanges();
Nick Lewycky746cb672011-10-26 22:55:33 +0000480 assert(Ranges.empty() == false &&
481 "LexicalScope does not have instruction markers!");
Devang Pateleac9c072010-04-27 19:46:33 +0000482
Devang Patel26a92002011-07-27 00:34:13 +0000483 if (!Scope->getScopeNode())
484 return NULL;
485 DIScope DS(Scope->getScopeNode());
486 DISubprogram InlinedSP = getDISubprogram(DS);
Manman Ren742671b2013-05-29 17:16:59 +0000487 DIE *OriginDIE = TheCU->getDIE(InlinedSP);
Devang Patel26a92002011-07-27 00:34:13 +0000488 if (!OriginDIE) {
Bill Wendlinge0aae5b2012-10-30 17:51:02 +0000489 DEBUG(dbgs() << "Unable to find original DIE for an inlined subprogram.");
Devang Patel26a92002011-07-27 00:34:13 +0000490 return NULL;
491 }
492
Devang Pateld96efb82011-05-05 17:54:26 +0000493 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_inlined_subroutine);
Devang Patel3cbee302011-04-12 22:53:02 +0000494 TheCU->addDIEEntry(ScopeDIE, dwarf::DW_AT_abstract_origin,
Manman Ren742671b2013-05-29 17:16:59 +0000495 dwarf::DW_FORM_ref4, OriginDIE);
Devang Patel53bb5c92009-11-10 23:06:00 +0000496
Devang Patel26a92002011-07-27 00:34:13 +0000497 if (Ranges.size() > 1) {
498 // .debug_range section has not been laid out yet. Emit offset in
499 // .debug_range as a uint, size 4, for now. emitDIE will handle
500 // DW_AT_ranges appropriately.
501 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_ranges, dwarf::DW_FORM_data4,
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000502 DebugRangeSymbols.size()
Chandler Carruth426c2bf2012-11-01 09:14:31 +0000503 * Asm->getDataLayout().getPointerSize());
Craig Topper2d785db2013-07-03 04:17:25 +0000504 for (SmallVectorImpl<InsnRange>::const_iterator RI = Ranges.begin(),
Devang Patel26a92002011-07-27 00:34:13 +0000505 RE = Ranges.end(); RI != RE; ++RI) {
506 DebugRangeSymbols.push_back(getLabelBeforeInsn(RI->first));
507 DebugRangeSymbols.push_back(getLabelAfterInsn(RI->second));
508 }
509 DebugRangeSymbols.push_back(NULL);
510 DebugRangeSymbols.push_back(NULL);
511 } else {
Craig Topper2d785db2013-07-03 04:17:25 +0000512 SmallVectorImpl<InsnRange>::const_iterator RI = Ranges.begin();
Eric Christophere7177132013-07-03 02:23:53 +0000513 MCSymbol *StartLabel = getLabelBeforeInsn(RI->first);
514 MCSymbol *EndLabel = getLabelAfterInsn(RI->second);
515
516 if (StartLabel == 0 || EndLabel == 0)
517 llvm_unreachable("Unexpected Start and End labels for an inlined scope!");
518
519 assert(StartLabel->isDefined() &&
520 "Invalid starting label for an inlined scope!");
521 assert(EndLabel->isDefined() && "Invalid end label for an inlined scope!");
522
Eric Christopher72f7bfb2013-01-15 23:56:56 +0000523 TheCU->addLabelAddress(ScopeDIE, dwarf::DW_AT_low_pc, StartLabel);
524 TheCU->addLabelAddress(ScopeDIE, dwarf::DW_AT_high_pc, EndLabel);
Devang Patel26a92002011-07-27 00:34:13 +0000525 }
Devang Patel53bb5c92009-11-10 23:06:00 +0000526
527 InlinedSubprogramDIEs.insert(OriginDIE);
528
Eric Christophere7177132013-07-03 02:23:53 +0000529 // Add the call site information to the DIE.
Devang Patel53bb5c92009-11-10 23:06:00 +0000530 DILocation DL(Scope->getInlinedAt());
Eric Christopher08212002012-03-26 21:38:38 +0000531 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_call_file, 0,
Manman Ren3de61b42013-03-07 01:42:00 +0000532 getOrCreateSourceID(DL.getFilename(), DL.getDirectory(),
533 TheCU->getUniqueID()));
Devang Patel3cbee302011-04-12 22:53:02 +0000534 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_call_line, 0, DL.getLineNumber());
Devang Patel53bb5c92009-11-10 23:06:00 +0000535
Eric Christopher309bedd2011-12-04 06:02:38 +0000536 // Add name to the name table, we do this here because we're guaranteed
537 // to have concrete versions of our DW_TAG_inlined_subprogram nodes.
538 addSubprogramNames(TheCU, InlinedSP, ScopeDIE);
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000539
Devang Patel53bb5c92009-11-10 23:06:00 +0000540 return ScopeDIE;
541}
542
Eric Christopherb6dc8652012-11-27 22:43:45 +0000543// Construct a DIE for this scope.
Devang Pateld0b5a5e2011-08-15 22:04:40 +0000544DIE *DwarfDebug::constructScopeDIE(CompileUnit *TheCU, LexicalScope *Scope) {
Devang Patel3c91b052010-03-08 20:52:55 +0000545 if (!Scope || !Scope->getScopeNode())
546 return NULL;
Jim Grosbach1e20b962010-07-21 21:21:52 +0000547
Manman Ren8b15d742013-01-31 20:05:14 +0000548 DIScope DS(Scope->getScopeNode());
549 // Early return to avoid creating dangling variable|scope DIEs.
Manman Ren742671b2013-05-29 17:16:59 +0000550 if (!Scope->getInlinedAt() && DS.isSubprogram() && Scope->isAbstractScope() &&
551 !TheCU->getDIE(DS))
552 return NULL;
Manman Ren8b15d742013-01-31 20:05:14 +0000553
Nick Lewycky746cb672011-10-26 22:55:33 +0000554 SmallVector<DIE *, 8> Children;
Eric Christophere5212782012-09-12 23:36:19 +0000555 DIE *ObjectPointer = NULL;
Devang Patel0478c152011-03-01 22:58:55 +0000556
557 // Collect arguments for current function.
Devang Patelbf47fdb2011-08-10 20:55:27 +0000558 if (LScopes.isCurrentFunctionScope(Scope))
Devang Patel0478c152011-03-01 22:58:55 +0000559 for (unsigned i = 0, N = CurrentFnArguments.size(); i < N; ++i)
560 if (DbgVariable *ArgDV = CurrentFnArguments[i])
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000561 if (DIE *Arg =
Eric Christophere5212782012-09-12 23:36:19 +0000562 TheCU->constructVariableDIE(ArgDV, Scope->isAbstractScope())) {
Devang Patel0478c152011-03-01 22:58:55 +0000563 Children.push_back(Arg);
Eric Christophere5212782012-09-12 23:36:19 +0000564 if (ArgDV->isObjectPointer()) ObjectPointer = Arg;
565 }
Devang Patel0478c152011-03-01 22:58:55 +0000566
Eric Christopher1aeb7ac2011-10-03 15:49:16 +0000567 // Collect lexical scope children first.
Craig Topper9f43ac62013-07-03 04:24:43 +0000568 const SmallVectorImpl<DbgVariable *> &Variables =ScopeVariables.lookup(Scope);
Devang Patel5bc9fec2011-02-19 01:31:27 +0000569 for (unsigned i = 0, N = Variables.size(); i < N; ++i)
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000570 if (DIE *Variable =
Eric Christopher7b451cf2012-09-21 22:18:52 +0000571 TheCU->constructVariableDIE(Variables[i], Scope->isAbstractScope())) {
Devang Patel5bc9fec2011-02-19 01:31:27 +0000572 Children.push_back(Variable);
Eric Christopher7b451cf2012-09-21 22:18:52 +0000573 if (Variables[i]->isObjectPointer()) ObjectPointer = Variable;
574 }
Craig Topper9f43ac62013-07-03 04:24:43 +0000575 const SmallVectorImpl<LexicalScope *> &Scopes = Scope->getChildren();
Devang Patel5bc9fec2011-02-19 01:31:27 +0000576 for (unsigned j = 0, M = Scopes.size(); j < M; ++j)
Devang Pateld0b5a5e2011-08-15 22:04:40 +0000577 if (DIE *Nested = constructScopeDIE(TheCU, Scopes[j]))
Devang Patel5bc9fec2011-02-19 01:31:27 +0000578 Children.push_back(Nested);
Devang Patel3c91b052010-03-08 20:52:55 +0000579 DIE *ScopeDIE = NULL;
580 if (Scope->getInlinedAt())
Devang Pateld3024342011-08-15 22:24:32 +0000581 ScopeDIE = constructInlinedScopeDIE(TheCU, Scope);
Devang Patel3c91b052010-03-08 20:52:55 +0000582 else if (DS.isSubprogram()) {
Devang Patel0dd45582010-06-28 20:53:04 +0000583 ProcessedSPNodes.insert(DS);
Devang Patel8aa61472010-07-07 22:20:57 +0000584 if (Scope->isAbstractScope()) {
Manman Ren742671b2013-05-29 17:16:59 +0000585 ScopeDIE = TheCU->getDIE(DS);
Devang Patel8aa61472010-07-07 22:20:57 +0000586 // Note down abstract DIE.
587 if (ScopeDIE)
588 AbstractSPDies.insert(std::make_pair(DS, ScopeDIE));
589 }
Devang Patel3c91b052010-03-08 20:52:55 +0000590 else
Devang Pateld3024342011-08-15 22:24:32 +0000591 ScopeDIE = updateSubprogramScopeDIE(TheCU, DS);
Devang Patel3c91b052010-03-08 20:52:55 +0000592 }
Devang Patel5bc9fec2011-02-19 01:31:27 +0000593 else {
594 // There is no need to emit empty lexical block DIE.
David Blaikied2e0f7e2013-05-06 23:33:07 +0000595 std::pair<ImportedEntityMap::const_iterator,
596 ImportedEntityMap::const_iterator> Range = std::equal_range(
597 ScopesWithImportedEntities.begin(), ScopesWithImportedEntities.end(),
Timur Iskhodzhanov664fbee2013-05-07 07:47:47 +0000598 std::pair<const MDNode *, const MDNode *>(DS, (const MDNode*)0),
Benjamin Kramer0b6962f2013-08-24 12:54:27 +0000599 less_first());
David Blaikied2e0f7e2013-05-06 23:33:07 +0000600 if (Children.empty() && Range.first == Range.second)
Devang Patel5bc9fec2011-02-19 01:31:27 +0000601 return NULL;
Devang Pateld3024342011-08-15 22:24:32 +0000602 ScopeDIE = constructLexicalScopeDIE(TheCU, Scope);
Eric Christopherfdfc81f2013-06-24 23:20:02 +0000603 for (ImportedEntityMap::const_iterator i = Range.first; i != Range.second;
604 ++i)
David Blaikied1221e32013-05-08 06:01:38 +0000605 constructImportedEntityDIE(TheCU, i->second, ScopeDIE);
Devang Patel5bc9fec2011-02-19 01:31:27 +0000606 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000607
Benjamin Kramer6bee6312013-08-24 11:55:49 +0000608 if (!ScopeDIE) {
609 std::for_each(Children.begin(), Children.end(), deleter<DIE>);
610 return NULL;
611 }
Jim Grosbach1e20b962010-07-21 21:21:52 +0000612
Devang Patel5bc9fec2011-02-19 01:31:27 +0000613 // Add children
Craig Topper2d785db2013-07-03 04:17:25 +0000614 for (SmallVectorImpl<DIE *>::iterator I = Children.begin(),
Devang Patel5bc9fec2011-02-19 01:31:27 +0000615 E = Children.end(); I != E; ++I)
616 ScopeDIE->addChild(*I);
Devang Patel193f7202009-11-24 01:14:22 +0000617
Eric Christophere5212782012-09-12 23:36:19 +0000618 if (DS.isSubprogram() && ObjectPointer != NULL)
619 TheCU->addDIEEntry(ScopeDIE, dwarf::DW_AT_object_pointer,
620 dwarf::DW_FORM_ref4, ObjectPointer);
621
Jim Grosbach1e20b962010-07-21 21:21:52 +0000622 if (DS.isSubprogram())
Eric Christopher0ffe2b42011-11-10 19:25:34 +0000623 TheCU->addPubTypes(DISubprogram(DS));
Jim Grosbach1e20b962010-07-21 21:21:52 +0000624
Eric Christopher0ffe2b42011-11-10 19:25:34 +0000625 return ScopeDIE;
Devang Patel53bb5c92009-11-10 23:06:00 +0000626}
627
Eric Christopherb6dc8652012-11-27 22:43:45 +0000628// Look up the source id with the given directory and source file names.
629// If none currently exists, create a new id and insert it in the
630// SourceIds map. This can update DirectoryNames and SourceFileNames maps
631// as well.
Eric Christopher7ee5f5d2012-11-21 00:34:35 +0000632unsigned DwarfDebug::getOrCreateSourceID(StringRef FileName,
Manman Ren3de61b42013-03-07 01:42:00 +0000633 StringRef DirName, unsigned CUID) {
634 // If we use .loc in assembly, we can't separate .file entries according to
635 // compile units. Thus all files will belong to the default compile unit.
636 if (Asm->TM.hasMCUseLoc() &&
637 Asm->OutStreamer.getKind() == MCStreamer::SK_AsmStreamer)
638 CUID = 0;
639
Devang Patel1905a182010-09-16 20:57:49 +0000640 // If FE did not provide a file name, then assume stdin.
641 if (FileName.empty())
Manman Ren3de61b42013-03-07 01:42:00 +0000642 return getOrCreateSourceID("<stdin>", StringRef(), CUID);
Devang Patel23670e52011-03-24 20:30:50 +0000643
Nick Lewycky6c1a7032011-11-02 20:55:33 +0000644 // TODO: this might not belong here. See if we can factor this better.
645 if (DirName == CompilationDir)
646 DirName = "";
647
Manman Ren3de61b42013-03-07 01:42:00 +0000648 // FileIDCUMap stores the current ID for the given compile unit.
649 unsigned SrcId = FileIDCUMap[CUID] + 1;
Devang Patel1905a182010-09-16 20:57:49 +0000650
Manman Ren3de61b42013-03-07 01:42:00 +0000651 // We look up the CUID/file/dir by concatenating them with a zero byte.
Benjamin Kramer74612c22012-03-11 14:56:26 +0000652 SmallString<128> NamePair;
Manman Ren5044a932013-04-06 01:02:38 +0000653 NamePair += utostr(CUID);
Manman Ren3de61b42013-03-07 01:42:00 +0000654 NamePair += '\0';
Benjamin Kramer74612c22012-03-11 14:56:26 +0000655 NamePair += DirName;
656 NamePair += '\0'; // Zero bytes are not allowed in paths.
657 NamePair += FileName;
658
659 StringMapEntry<unsigned> &Ent = SourceIdMap.GetOrCreateValue(NamePair, SrcId);
660 if (Ent.getValue() != SrcId)
661 return Ent.getValue();
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000662
Manman Ren3de61b42013-03-07 01:42:00 +0000663 FileIDCUMap[CUID] = SrcId;
Rafael Espindola5c055632010-11-18 02:04:25 +0000664 // Print out a .file directive to specify files for .loc directives.
Manman Ren3de61b42013-03-07 01:42:00 +0000665 Asm->OutStreamer.EmitDwarfFileDirective(SrcId, DirName, FileName, CUID);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000666
667 return SrcId;
668}
669
Eric Christopher72c16552012-12-20 21:58:40 +0000670// Create new CompileUnit for the given metadata node with tag
671// DW_TAG_compile_unit.
Devang Patel94c7ddb2011-08-16 22:09:43 +0000672CompileUnit *DwarfDebug::constructCompileUnit(const MDNode *N) {
Devang Patele4b27562009-08-28 23:24:31 +0000673 DICompileUnit DIUnit(N);
Devang Patel65dbc902009-11-25 17:36:49 +0000674 StringRef FN = DIUnit.getFilename();
Nick Lewycky6c1a7032011-11-02 20:55:33 +0000675 CompilationDir = DIUnit.getDirectory();
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000676
677 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
Eric Christopher7b878952013-08-26 23:50:38 +0000678 CompileUnit *NewCU =
679 new CompileUnit(GlobalCUIndexCount++, Die, N, Asm, this, &InfoHolder);
Manman Ren3de61b42013-03-07 01:42:00 +0000680
681 FileIDCUMap[NewCU->getUniqueID()] = 0;
682 // Call this to emit a .file directive if it wasn't emitted for the source
683 // file this CU comes from yet.
684 getOrCreateSourceID(FN, CompilationDir, NewCU->getUniqueID());
685
Nick Lewycky390c40d2011-10-27 06:44:11 +0000686 NewCU->addString(Die, dwarf::DW_AT_producer, DIUnit.getProducer());
Devang Patel3cbee302011-04-12 22:53:02 +0000687 NewCU->addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data2,
688 DIUnit.getLanguage());
Nick Lewycky390c40d2011-10-27 06:44:11 +0000689 NewCU->addString(Die, dwarf::DW_AT_name, FN);
Eric Christophere0828ec2013-04-09 19:23:15 +0000690
Eric Christopher6635cad2012-08-01 18:19:01 +0000691 // 2.17.1 requires that we use DW_AT_low_pc for a single entry point
Eric Christophere0828ec2013-04-09 19:23:15 +0000692 // into an entity. We're using 0 (or a NULL label) for this. For
693 // split dwarf it's in the skeleton CU so omit it here.
694 if (!useSplitDwarf())
695 NewCU->addLabelAddress(Die, dwarf::DW_AT_low_pc, NULL);
Manman Ren43213cf2013-02-05 21:52:47 +0000696
697 // Define start line table label for each Compile Unit.
698 MCSymbol *LineTableStartSym = Asm->GetTempSymbol("line_table_start",
699 NewCU->getUniqueID());
700 Asm->OutStreamer.getContext().setMCLineTableSymbol(LineTableStartSym,
701 NewCU->getUniqueID());
702
Manman Ren01cb18e2013-05-21 00:57:22 +0000703 // Use a single line table if we are using .loc and generating assembly.
704 bool UseTheFirstCU =
705 (Asm->TM.hasMCUseLoc() &&
706 Asm->OutStreamer.getKind() == MCStreamer::SK_AsmStreamer) ||
707 (NewCU->getUniqueID() == 0);
708
Devang Patel4a602ca2010-03-22 23:11:36 +0000709 // DW_AT_stmt_list is a offset of line number information for this
Eric Christophere0828ec2013-04-09 19:23:15 +0000710 // compile unit in debug_line section. For split dwarf this is
711 // left in the skeleton CU and so not included.
Manman Renf2d89ff2013-02-09 00:41:44 +0000712 // The line table entries are not always emitted in assembly, so it
713 // is not okay to use line_table_start here.
Eric Christophere0828ec2013-04-09 19:23:15 +0000714 if (!useSplitDwarf()) {
715 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
Carlo Kok46f0b6f2013-08-13 17:46:57 +0000716 NewCU->addLabel(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_sec_offset,
Manman Ren01cb18e2013-05-21 00:57:22 +0000717 UseTheFirstCU ?
Eric Christophere0828ec2013-04-09 19:23:15 +0000718 Asm->GetTempSymbol("section_line") : LineTableStartSym);
Manman Ren01cb18e2013-05-21 00:57:22 +0000719 else if (UseTheFirstCU)
Eric Christophere0828ec2013-04-09 19:23:15 +0000720 NewCU->addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4, 0);
721 else
722 NewCU->addDelta(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4,
723 LineTableStartSym, DwarfLineSectionSym);
724 }
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000725
Eric Christophere0828ec2013-04-09 19:23:15 +0000726 // If we're using split dwarf the compilation dir is going to be in the
727 // skeleton CU and so we don't need to duplicate it here.
728 if (!useSplitDwarf() && !CompilationDir.empty())
Nick Lewycky6c1a7032011-11-02 20:55:33 +0000729 NewCU->addString(Die, dwarf::DW_AT_comp_dir, CompilationDir);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000730 if (DIUnit.isOptimized())
Eric Christopher873cf0a2012-08-24 01:14:27 +0000731 NewCU->addFlag(Die, dwarf::DW_AT_APPLE_optimized);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000732
Devang Patel65dbc902009-11-25 17:36:49 +0000733 StringRef Flags = DIUnit.getFlags();
734 if (!Flags.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +0000735 NewCU->addString(Die, dwarf::DW_AT_APPLE_flags, Flags);
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000736
Nick Lewyckyd5d52132011-10-17 23:27:36 +0000737 if (unsigned RVer = DIUnit.getRunTimeVersion())
Devang Patel3cbee302011-04-12 22:53:02 +0000738 NewCU->addUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers,
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000739 dwarf::DW_FORM_data1, RVer);
740
Devang Patel163a9f72010-05-10 22:49:55 +0000741 if (!FirstCU)
742 FirstCU = NewCU;
Eric Christopher208cc6f2013-02-05 07:31:55 +0000743
Eric Christopher0e3e9b72012-12-10 23:34:43 +0000744 InfoHolder.addUnit(NewCU);
745
Devang Patel163a9f72010-05-10 22:49:55 +0000746 CUMap.insert(std::make_pair(N, NewCU));
Devang Patel94c7ddb2011-08-16 22:09:43 +0000747 return NewCU;
Devang Patel163a9f72010-05-10 22:49:55 +0000748}
749
Eric Christopherb6dc8652012-11-27 22:43:45 +0000750// Construct subprogram DIE.
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000751void DwarfDebug::constructSubprogramDIE(CompileUnit *TheCU,
Devang Patel3655a212011-08-15 23:36:40 +0000752 const MDNode *N) {
Rafael Espindolab0527282011-11-04 19:00:29 +0000753 CompileUnit *&CURef = SPMap[N];
754 if (CURef)
755 return;
756 CURef = TheCU;
757
Devang Patele4b27562009-08-28 23:24:31 +0000758 DISubprogram SP(N);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000759 if (!SP.isDefinition())
760 // This is a method declaration which will be handled while constructing
761 // class type.
Devang Patel13e16b62009-06-26 01:49:18 +0000762 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000763
Devang Pateldbc64af2011-08-15 17:24:54 +0000764 DIE *SubprogramDie = TheCU->getOrCreateSubprogramDIE(SP);
Stuart Hastings639336e2010-04-06 21:38:29 +0000765
766 // Add to map.
Devang Patel163a9f72010-05-10 22:49:55 +0000767 TheCU->insertDIE(N, SubprogramDie);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000768
769 // Add to context owner.
Devang Patel3cbee302011-04-12 22:53:02 +0000770 TheCU->addToContextOwner(SubprogramDie, SP.getContext());
Devang Patel0000fad2009-12-08 23:21:45 +0000771
Eric Christopher28b020d2013-09-09 20:03:20 +0000772 // Expose as a global name.
773 TheCU->addGlobalName(SP.getName(), SubprogramDie);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000774}
775
David Blaikie20d9e412013-05-07 21:35:53 +0000776void DwarfDebug::constructImportedEntityDIE(CompileUnit *TheCU,
David Blaikiec462db62013-04-22 06:12:31 +0000777 const MDNode *N) {
David Blaikie20d9e412013-05-07 21:35:53 +0000778 DIImportedEntity Module(N);
David Blaikiec462db62013-04-22 06:12:31 +0000779 if (!Module.Verify())
780 return;
David Blaikied2e0f7e2013-05-06 23:33:07 +0000781 if (DIE *D = TheCU->getOrCreateContextDIE(Module.getContext()))
David Blaikied1221e32013-05-08 06:01:38 +0000782 constructImportedEntityDIE(TheCU, Module, D);
David Blaikied2e0f7e2013-05-06 23:33:07 +0000783}
784
David Blaikied1221e32013-05-08 06:01:38 +0000785void DwarfDebug::constructImportedEntityDIE(CompileUnit *TheCU, const MDNode *N,
David Blaikied2e0f7e2013-05-06 23:33:07 +0000786 DIE *Context) {
David Blaikie20d9e412013-05-07 21:35:53 +0000787 DIImportedEntity Module(N);
David Blaikied2e0f7e2013-05-06 23:33:07 +0000788 if (!Module.Verify())
789 return;
David Blaikied1221e32013-05-08 06:01:38 +0000790 return constructImportedEntityDIE(TheCU, Module, Context);
David Blaikied2e0f7e2013-05-06 23:33:07 +0000791}
792
David Blaikied1221e32013-05-08 06:01:38 +0000793void DwarfDebug::constructImportedEntityDIE(CompileUnit *TheCU,
David Blaikie20d9e412013-05-07 21:35:53 +0000794 const DIImportedEntity &Module,
David Blaikied2e0f7e2013-05-06 23:33:07 +0000795 DIE *Context) {
796 assert(Module.Verify() &&
797 "Use one of the MDNode * overloads to handle invalid metadata");
798 assert(Context && "Should always have a context for an imported_module");
David Blaikie20d9e412013-05-07 21:35:53 +0000799 DIE *IMDie = new DIE(Module.getTag());
David Blaikiec462db62013-04-22 06:12:31 +0000800 TheCU->insertDIE(Module, IMDie);
David Blaikie20d9e412013-05-07 21:35:53 +0000801 DIE *EntityDie;
802 DIDescriptor Entity = Module.getEntity();
803 if (Entity.isNameSpace())
804 EntityDie = TheCU->getOrCreateNameSpace(DINameSpace(Entity));
805 else if (Entity.isSubprogram())
806 EntityDie = TheCU->getOrCreateSubprogramDIE(DISubprogram(Entity));
David Blaikieaa76a932013-05-08 06:01:41 +0000807 else if (Entity.isType())
808 EntityDie = TheCU->getOrCreateTypeDIE(DIType(Entity));
David Blaikie20d9e412013-05-07 21:35:53 +0000809 else
David Blaikieaa76a932013-05-08 06:01:41 +0000810 EntityDie = TheCU->getDIE(Entity);
David Blaikiec462db62013-04-22 06:12:31 +0000811 unsigned FileID = getOrCreateSourceID(Module.getContext().getFilename(),
812 Module.getContext().getDirectory(),
813 TheCU->getUniqueID());
814 TheCU->addUInt(IMDie, dwarf::DW_AT_decl_file, 0, FileID);
815 TheCU->addUInt(IMDie, dwarf::DW_AT_decl_line, 0, Module.getLineNumber());
Eric Christopherfdfc81f2013-06-24 23:20:02 +0000816 TheCU->addDIEEntry(IMDie, dwarf::DW_AT_import, dwarf::DW_FORM_ref4,
817 EntityDie);
David Blaikie7b72cc72013-05-20 22:50:35 +0000818 StringRef Name = Module.getName();
819 if (!Name.empty())
820 TheCU->addString(IMDie, dwarf::DW_AT_name, Name);
David Blaikied2e0f7e2013-05-06 23:33:07 +0000821 Context->addChild(IMDie);
David Blaikiec462db62013-04-22 06:12:31 +0000822}
823
Eric Christopherb6dc8652012-11-27 22:43:45 +0000824// Emit all Dwarf sections that should come prior to the content. Create
825// global DIEs and emit initial debug info sections. This is invoked by
826// the target AsmPrinter.
Eric Christopherc4639d62012-11-19 22:42:15 +0000827void DwarfDebug::beginModule() {
Devang Pateleac9c072010-04-27 19:46:33 +0000828 if (DisableDebugInfoPrinting)
829 return;
830
Eric Christopherc4639d62012-11-19 22:42:15 +0000831 const Module *M = MMI->getModule();
832
Nick Lewycky3bbb6f72011-07-29 03:49:23 +0000833 // If module has named metadata anchors then use them, otherwise scan the
834 // module using debug info finder to collect debug info.
Devang Patel30692ab2011-05-03 16:45:22 +0000835 NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu");
David Blaikiec0ec8a42013-03-11 23:39:23 +0000836 if (!CU_Nodes)
Devang Patel02e603f2011-08-15 23:47:24 +0000837 return;
Manman Renbc660712013-09-05 18:48:31 +0000838 TypeIdentifierMap = generateDITypeIdentifierMap(CU_Nodes);
Devang Patel30692ab2011-05-03 16:45:22 +0000839
David Blaikiec0ec8a42013-03-11 23:39:23 +0000840 // Emit initial sections so we can reference labels later.
841 emitSectionLabels();
842
843 for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i) {
844 DICompileUnit CUNode(CU_Nodes->getOperand(i));
845 CompileUnit *CU = constructCompileUnit(CUNode);
David Blaikie20d9e412013-05-07 21:35:53 +0000846 DIArray ImportedEntities = CUNode.getImportedEntities();
847 for (unsigned i = 0, e = ImportedEntities.getNumElements(); i != e; ++i)
David Blaikied2e0f7e2013-05-06 23:33:07 +0000848 ScopesWithImportedEntities.push_back(std::make_pair(
David Blaikie20d9e412013-05-07 21:35:53 +0000849 DIImportedEntity(ImportedEntities.getElement(i)).getContext(),
850 ImportedEntities.getElement(i)));
David Blaikied2e0f7e2013-05-06 23:33:07 +0000851 std::sort(ScopesWithImportedEntities.begin(),
Benjamin Kramer0b6962f2013-08-24 12:54:27 +0000852 ScopesWithImportedEntities.end(), less_first());
David Blaikiec0ec8a42013-03-11 23:39:23 +0000853 DIArray GVs = CUNode.getGlobalVariables();
854 for (unsigned i = 0, e = GVs.getNumElements(); i != e; ++i)
855 CU->createGlobalVariableDIE(GVs.getElement(i));
856 DIArray SPs = CUNode.getSubprograms();
857 for (unsigned i = 0, e = SPs.getNumElements(); i != e; ++i)
858 constructSubprogramDIE(CU, SPs.getElement(i));
859 DIArray EnumTypes = CUNode.getEnumTypes();
860 for (unsigned i = 0, e = EnumTypes.getNumElements(); i != e; ++i)
861 CU->getOrCreateTypeDIE(EnumTypes.getElement(i));
862 DIArray RetainedTypes = CUNode.getRetainedTypes();
863 for (unsigned i = 0, e = RetainedTypes.getNumElements(); i != e; ++i)
864 CU->getOrCreateTypeDIE(RetainedTypes.getElement(i));
David Blaikiec462db62013-04-22 06:12:31 +0000865 // Emit imported_modules last so that the relevant context is already
866 // available.
David Blaikie20d9e412013-05-07 21:35:53 +0000867 for (unsigned i = 0, e = ImportedEntities.getNumElements(); i != e; ++i)
868 constructImportedEntityDIE(CU, ImportedEntities.getElement(i));
David Blaikiec0ec8a42013-03-11 23:39:23 +0000869 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000870
Chris Lattnerd850ac72010-04-05 02:19:28 +0000871 // Tell MMI that we have debug info.
872 MMI->setDebugInfoAvailability(true);
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000873
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000874 // Prime section data.
Chris Lattnerf0144122009-07-28 03:13:23 +0000875 SectionMap.insert(Asm->getObjFileLowering().getTextSection());
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000876}
877
Eric Christopher4117bec2012-11-22 00:59:49 +0000878// Attach DW_AT_inline attribute with inlined subprogram DIEs.
879void DwarfDebug::computeInlinedDIEs() {
Devang Patel53bb5c92009-11-10 23:06:00 +0000880 // Attach DW_AT_inline attribute with inlined subprogram DIEs.
881 for (SmallPtrSet<DIE *, 4>::iterator AI = InlinedSubprogramDIEs.begin(),
Eric Christopherbdab8002012-11-27 00:13:51 +0000882 AE = InlinedSubprogramDIEs.end(); AI != AE; ++AI) {
Devang Patel53bb5c92009-11-10 23:06:00 +0000883 DIE *ISP = *AI;
Devang Patel3cbee302011-04-12 22:53:02 +0000884 FirstCU->addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
Devang Patel53bb5c92009-11-10 23:06:00 +0000885 }
Rafael Espindolad1ac3a42011-11-12 01:57:54 +0000886 for (DenseMap<const MDNode *, DIE *>::iterator AI = AbstractSPDies.begin(),
Eric Christopherbdab8002012-11-27 00:13:51 +0000887 AE = AbstractSPDies.end(); AI != AE; ++AI) {
Rafael Espindolad1ac3a42011-11-12 01:57:54 +0000888 DIE *ISP = AI->second;
889 if (InlinedSubprogramDIEs.count(ISP))
890 continue;
891 FirstCU->addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
892 }
Eric Christopher4117bec2012-11-22 00:59:49 +0000893}
894
895// Collect info for variables that were optimized out.
896void DwarfDebug::collectDeadVariables() {
897 const Module *M = MMI->getModule();
898 DenseMap<const MDNode *, LexicalScope *> DeadFnScopeMap;
899
900 if (NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu")) {
901 for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i) {
902 DICompileUnit TheCU(CU_Nodes->getOperand(i));
903 DIArray Subprograms = TheCU.getSubprograms();
904 for (unsigned i = 0, e = Subprograms.getNumElements(); i != e; ++i) {
Eric Christopherbdab8002012-11-27 00:13:51 +0000905 DISubprogram SP(Subprograms.getElement(i));
906 if (ProcessedSPNodes.count(SP) != 0) continue;
Manman Rend03d2b22013-07-08 18:33:29 +0000907 if (!SP.isSubprogram()) continue;
Eric Christopherbdab8002012-11-27 00:13:51 +0000908 if (!SP.isDefinition()) continue;
909 DIArray Variables = SP.getVariables();
910 if (Variables.getNumElements() == 0) continue;
Eric Christopher4117bec2012-11-22 00:59:49 +0000911
Eric Christopherbdab8002012-11-27 00:13:51 +0000912 LexicalScope *Scope =
913 new LexicalScope(NULL, DIDescriptor(SP), NULL, false);
914 DeadFnScopeMap[SP] = Scope;
Eric Christopher4117bec2012-11-22 00:59:49 +0000915
Eric Christopherbdab8002012-11-27 00:13:51 +0000916 // Construct subprogram DIE and add variables DIEs.
917 CompileUnit *SPCU = CUMap.lookup(TheCU);
918 assert(SPCU && "Unable to find Compile Unit!");
919 constructSubprogramDIE(SPCU, SP);
920 DIE *ScopeDIE = SPCU->getDIE(SP);
921 for (unsigned vi = 0, ve = Variables.getNumElements(); vi != ve; ++vi) {
922 DIVariable DV(Variables.getElement(vi));
Manman Rend03d2b22013-07-08 18:33:29 +0000923 if (!DV.isVariable()) continue;
Chandler Carruth05497cc2013-07-27 11:09:58 +0000924 DbgVariable NewVar(DV, NULL);
Eric Christopherbdab8002012-11-27 00:13:51 +0000925 if (DIE *VariableDIE =
Chandler Carruth05497cc2013-07-27 11:09:58 +0000926 SPCU->constructVariableDIE(&NewVar, Scope->isAbstractScope()))
Eric Christopherbdab8002012-11-27 00:13:51 +0000927 ScopeDIE->addChild(VariableDIE);
928 }
Eric Christopher4117bec2012-11-22 00:59:49 +0000929 }
930 }
931 }
932 DeleteContainerSeconds(DeadFnScopeMap);
933}
934
Eric Christopher0d27ca12013-08-08 23:45:55 +0000935// Type Signature [7.27] and ODR Hash code.
Eric Christopher3dee5752013-07-26 17:02:41 +0000936
937/// \brief Grabs the string in whichever attribute is passed in and returns
Eric Christopherb7669132013-08-07 01:18:33 +0000938/// a reference to it. Returns "" if the attribute doesn't exist.
Eric Christopher3dee5752013-07-26 17:02:41 +0000939static StringRef getDIEStringAttr(DIE *Die, unsigned Attr) {
Eric Christopherb7669132013-08-07 01:18:33 +0000940 DIEValue *V = Die->findAttribute(Attr);
Eric Christopher3dee5752013-07-26 17:02:41 +0000941
Eric Christopherb7669132013-08-07 01:18:33 +0000942 if (DIEString *S = dyn_cast_or_null<DIEString>(V))
943 return S->getString();
944
Eric Christopher3dee5752013-07-26 17:02:41 +0000945 return StringRef("");
946}
947
Eric Christopher3dee5752013-07-26 17:02:41 +0000948/// Return true if the current DIE is contained within an anonymous namespace.
949static bool isContainedInAnonNamespace(DIE *Die) {
950 DIE *Parent = Die->getParent();
951
952 while (Parent) {
Eric Christopher86aa03d2013-07-29 23:53:08 +0000953 if (Parent->getTag() == dwarf::DW_TAG_namespace &&
954 getDIEStringAttr(Parent, dwarf::DW_AT_name) == "")
Eric Christopher3dee5752013-07-26 17:02:41 +0000955 return true;
956 Parent = Parent->getParent();
957 }
958
959 return false;
960}
961
Eric Christopher028f3472013-08-07 01:18:24 +0000962/// Test if the current CU language is C++ and that we have
963/// a named type that is not contained in an anonymous namespace.
964static bool shouldAddODRHash(CompileUnit *CU, DIE *Die) {
Eric Christopherf76e1182013-08-07 08:35:10 +0000965 return CU->getLanguage() == dwarf::DW_LANG_C_plus_plus &&
966 getDIEStringAttr(Die, dwarf::DW_AT_name) != "" &&
967 !isContainedInAnonNamespace(Die);
Eric Christopher0d27ca12013-08-08 23:45:55 +0000968}
Eric Christopher028f3472013-08-07 01:18:24 +0000969
Eric Christopher4117bec2012-11-22 00:59:49 +0000970void DwarfDebug::finalizeModuleInfo() {
971 // Collect info for variables that were optimized out.
972 collectDeadVariables();
973
974 // Attach DW_AT_inline attribute with inlined subprogram DIEs.
975 computeInlinedDIEs();
Devang Patel53bb5c92009-11-10 23:06:00 +0000976
Eric Christopherbe482042013-07-29 22:24:32 +0000977 // Split out type units and conditionally add an ODR tag to the split
978 // out type.
Eric Christopher3dee5752013-07-26 17:02:41 +0000979 // FIXME: Do type splitting.
980 for (unsigned i = 0, e = TypeUnits.size(); i != e; ++i) {
Eric Christopher3dee5752013-07-26 17:02:41 +0000981 DIE *Die = TypeUnits[i];
Eric Christopher0d27ca12013-08-08 23:45:55 +0000982 DIEHash Hash;
Eric Christopher028f3472013-08-07 01:18:24 +0000983 // If we've requested ODR hashes and it's applicable for an ODR hash then
984 // add the ODR signature now.
Eric Christopher0d27ca12013-08-08 23:45:55 +0000985 // FIXME: This should be added onto the type unit, not the type, but this
986 // works as an intermediate stage.
Eric Christopher028f3472013-08-07 01:18:24 +0000987 if (GenerateODRHash && shouldAddODRHash(CUMap.begin()->second, Die))
Eric Christopher0d27ca12013-08-08 23:45:55 +0000988 CUMap.begin()->second->addUInt(Die, dwarf::DW_AT_GNU_odr_signature,
989 dwarf::DW_FORM_data8,
990 Hash.computeDIEODRSignature(Die));
Eric Christopher3dee5752013-07-26 17:02:41 +0000991 }
992
Eric Christopherf962c022013-08-12 20:27:48 +0000993 // Handle anything that needs to be done on a per-cu basis.
994 for (DenseMap<const MDNode *, CompileUnit *>::iterator CUI = CUMap.begin(),
995 CUE = CUMap.end();
996 CUI != CUE; ++CUI) {
997 CompileUnit *TheCU = CUI->second;
998 // Emit DW_AT_containing_type attribute to connect types with their
999 // vtable holding type.
1000 TheCU->constructContainingTypeDIEs();
1001
1002 // If we're splitting the dwarf out now that we've got the entire
1003 // CU then construct a skeleton CU based upon it.
1004 if (useSplitDwarf()) {
Eric Christopher0710bfa2013-08-13 01:21:55 +00001005 uint64_t ID = 0;
1006 if (GenerateCUHash) {
1007 DIEHash CUHash;
1008 ID = CUHash.computeCUSignature(TheCU->getCUDie());
1009 }
Eric Christopherf962c022013-08-12 20:27:48 +00001010 // This should be a unique identifier when we want to build .dwp files.
1011 TheCU->addUInt(TheCU->getCUDie(), dwarf::DW_AT_GNU_dwo_id,
Eric Christopher0710bfa2013-08-13 01:21:55 +00001012 dwarf::DW_FORM_data8, ID);
Eric Christopherf962c022013-08-12 20:27:48 +00001013 // Now construct the skeleton CU associated.
Eric Christophera9b2c792013-08-26 23:50:43 +00001014 CompileUnit *SkCU = constructSkeletonCU(TheCU);
Eric Christopherf962c022013-08-12 20:27:48 +00001015 // This should be a unique identifier when we want to build .dwp files.
1016 SkCU->addUInt(SkCU->getCUDie(), dwarf::DW_AT_GNU_dwo_id,
Eric Christopher0710bfa2013-08-13 01:21:55 +00001017 dwarf::DW_FORM_data8, ID);
Eric Christopherf962c022013-08-12 20:27:48 +00001018 }
1019 }
1020
1021 // Compute DIE offsets and sizes.
Eric Christopher0e3e9b72012-12-10 23:34:43 +00001022 InfoHolder.computeSizeAndOffsets();
1023 if (useSplitDwarf())
1024 SkeletonHolder.computeSizeAndOffsets();
Eric Christopher4117bec2012-11-22 00:59:49 +00001025}
1026
1027void DwarfDebug::endSections() {
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001028 // Standard sections final addresses.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00001029 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getTextSection());
Chris Lattnerc0215722010-04-04 19:25:43 +00001030 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("text_end"));
Chris Lattner6c2f9e12009-08-19 05:49:37 +00001031 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getDataSection());
Chris Lattnerc0215722010-04-04 19:25:43 +00001032 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("data_end"));
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001033
1034 // End text sections.
Benjamin Kramerb4c9d9c2012-10-31 13:45:49 +00001035 for (unsigned I = 0, E = SectionMap.size(); I != E; ++I) {
1036 Asm->OutStreamer.SwitchSection(SectionMap[I]);
1037 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("section_end", I+1));
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001038 }
Eric Christopher4117bec2012-11-22 00:59:49 +00001039}
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001040
Eric Christopherb6dc8652012-11-27 22:43:45 +00001041// Emit all Dwarf sections that should come after the content.
Eric Christopher4117bec2012-11-22 00:59:49 +00001042void DwarfDebug::endModule() {
1043
1044 if (!FirstCU) return;
1045
1046 // End any existing sections.
1047 // TODO: Does this need to happen?
1048 endSections();
1049
1050 // Finalize the debug info for the module.
1051 finalizeModuleInfo();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001052
Eric Christopher4daaed12012-12-10 19:51:21 +00001053 if (!useSplitDwarf()) {
Eric Christopher42885022012-11-27 22:43:42 +00001054 // Emit all the DIEs into a debug info section.
1055 emitDebugInfo();
Eric Christopher74802f72012-11-27 00:41:54 +00001056
Eric Christopher42885022012-11-27 22:43:42 +00001057 // Corresponding abbreviations into a abbrev section.
1058 emitAbbreviations();
1059
1060 // Emit info into a debug loc section.
1061 emitDebugLoc();
1062
1063 // Emit info into a debug aranges section.
1064 emitDebugARanges();
1065
1066 // Emit info into a debug ranges section.
1067 emitDebugRanges();
1068
1069 // Emit info into a debug macinfo section.
1070 emitDebugMacInfo();
1071
Eric Christopher42885022012-11-27 22:43:42 +00001072 } else {
Eric Christopher0b944ee2012-12-11 19:42:09 +00001073 // TODO: Fill this in for separated debug sections and separate
Eric Christopher42885022012-11-27 22:43:42 +00001074 // out information into new sections.
1075
Eric Christopher98e237f2012-11-30 23:59:06 +00001076 // Emit the debug info section and compile units.
Eric Christopher42885022012-11-27 22:43:42 +00001077 emitDebugInfo();
Eric Christopher98e237f2012-11-30 23:59:06 +00001078 emitDebugInfoDWO();
Eric Christopher42885022012-11-27 22:43:42 +00001079
1080 // Corresponding abbreviations into a abbrev section.
1081 emitAbbreviations();
Eric Christopher6eebe472012-12-19 22:02:53 +00001082 emitDebugAbbrevDWO();
Eric Christopher42885022012-11-27 22:43:42 +00001083
1084 // Emit info into a debug loc section.
1085 emitDebugLoc();
1086
1087 // Emit info into a debug aranges section.
1088 emitDebugARanges();
1089
1090 // Emit info into a debug ranges section.
1091 emitDebugRanges();
1092
1093 // Emit info into a debug macinfo section.
1094 emitDebugMacInfo();
1095
Eric Christopher72f7bfb2013-01-15 23:56:56 +00001096 // Emit DWO addresses.
1097 InfoHolder.emitAddresses(Asm->getObjFileLowering().getDwarfAddrSection());
1098
Eric Christopher42885022012-11-27 22:43:42 +00001099 }
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001100
Eric Christopher9d9f5a52012-08-23 07:32:06 +00001101 // Emit info into the dwarf accelerator table sections.
Eric Christopher20f47ab2012-08-23 22:36:40 +00001102 if (useDwarfAccelTables()) {
Eric Christopher09ac3d82011-11-07 09:24:32 +00001103 emitAccelNames();
1104 emitAccelObjC();
1105 emitAccelNamespaces();
1106 emitAccelTypes();
1107 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001108
Eric Christopher26123542013-08-30 00:40:17 +00001109 // Emit the pubnames and pubtypes sections if requested.
1110 if (HasDwarfPubSections) {
Eric Christopher57479322013-09-09 20:03:17 +00001111 emitDebugPubNames();
Eric Christopher360f0062012-08-23 07:10:56 +00001112 emitDebugPubTypes();
Eric Christopher26123542013-08-30 00:40:17 +00001113 }
Devang Patel193f7202009-11-24 01:14:22 +00001114
Eric Christopher42885022012-11-27 22:43:42 +00001115 // Finally emit string information into a string table.
Eric Christopherfcdbecb2012-11-27 06:49:23 +00001116 emitDebugStr();
Eric Christopher64f824c2012-12-27 02:14:01 +00001117 if (useSplitDwarf())
1118 emitDebugStrDWO();
Eric Christopherfcdbecb2012-11-27 06:49:23 +00001119
Devang Patele9a1cca2010-08-02 17:32:15 +00001120 // clean up.
Devang Patel94c7ddb2011-08-16 22:09:43 +00001121 SPMap.clear();
Devang Patel163a9f72010-05-10 22:49:55 +00001122 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
1123 E = CUMap.end(); I != E; ++I)
1124 delete I->second;
Eric Christopher9ec87b32012-12-10 19:51:18 +00001125
Craig Topper2d785db2013-07-03 04:17:25 +00001126 for (SmallVectorImpl<CompileUnit *>::iterator I = SkeletonCUs.begin(),
Eric Christopher01776a52013-02-06 21:53:56 +00001127 E = SkeletonCUs.end(); I != E; ++I)
1128 delete *I;
Eric Christopher9ec87b32012-12-10 19:51:18 +00001129
Eric Christopher98e237f2012-11-30 23:59:06 +00001130 // Reset these for the next Module if we have one.
1131 FirstCU = NULL;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001132}
1133
Eric Christopherb6dc8652012-11-27 22:43:45 +00001134// Find abstract variable, if any, associated with Var.
Devang Patelb549bcf2011-08-10 21:50:54 +00001135DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &DV,
Chris Lattnerde4845c2010-04-02 19:42:39 +00001136 DebugLoc ScopeLoc) {
Devang Patelb549bcf2011-08-10 21:50:54 +00001137 LLVMContext &Ctx = DV->getContext();
1138 // More then one inlined variable corresponds to one abstract variable.
1139 DIVariable Var = cleanseInlinedVariable(DV, Ctx);
Devang Patel2db49d72010-05-07 18:11:54 +00001140 DbgVariable *AbsDbgVariable = AbstractVariables.lookup(Var);
Devang Patel53bb5c92009-11-10 23:06:00 +00001141 if (AbsDbgVariable)
1142 return AbsDbgVariable;
1143
Devang Patelbf47fdb2011-08-10 20:55:27 +00001144 LexicalScope *Scope = LScopes.findAbstractScope(ScopeLoc.getScope(Ctx));
Devang Patel53bb5c92009-11-10 23:06:00 +00001145 if (!Scope)
1146 return NULL;
1147
Devang Patel5a1a67c2011-08-15 19:01:20 +00001148 AbsDbgVariable = new DbgVariable(Var, NULL);
Devang Patelbf47fdb2011-08-10 20:55:27 +00001149 addScopeVariable(Scope, AbsDbgVariable);
Devang Patel2db49d72010-05-07 18:11:54 +00001150 AbstractVariables[Var] = AbsDbgVariable;
Devang Patel53bb5c92009-11-10 23:06:00 +00001151 return AbsDbgVariable;
1152}
1153
Eric Christopherb6dc8652012-11-27 22:43:45 +00001154// If Var is a current function argument then add it to CurrentFnArguments list.
Devang Patel0478c152011-03-01 22:58:55 +00001155bool DwarfDebug::addCurrentFnArgument(const MachineFunction *MF,
Devang Patelbf47fdb2011-08-10 20:55:27 +00001156 DbgVariable *Var, LexicalScope *Scope) {
1157 if (!LScopes.isCurrentFunctionScope(Scope))
Devang Patel0478c152011-03-01 22:58:55 +00001158 return false;
1159 DIVariable DV = Var->getVariable();
1160 if (DV.getTag() != dwarf::DW_TAG_arg_variable)
1161 return false;
1162 unsigned ArgNo = DV.getArgNumber();
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001163 if (ArgNo == 0)
Devang Patel0478c152011-03-01 22:58:55 +00001164 return false;
1165
Devang Patelcb3a6572011-03-03 20:02:02 +00001166 size_t Size = CurrentFnArguments.size();
1167 if (Size == 0)
Devang Patel0478c152011-03-01 22:58:55 +00001168 CurrentFnArguments.resize(MF->getFunction()->arg_size());
Devang Patelbbd0f452011-03-03 21:49:41 +00001169 // llvm::Function argument size is not good indicator of how many
Devang Patel6f676be2011-03-03 20:08:10 +00001170 // arguments does the function have at source level.
1171 if (ArgNo > Size)
Devang Patelcb3a6572011-03-03 20:02:02 +00001172 CurrentFnArguments.resize(ArgNo * 2);
Devang Patel0478c152011-03-01 22:58:55 +00001173 CurrentFnArguments[ArgNo - 1] = Var;
1174 return true;
1175}
1176
Eric Christopherb6dc8652012-11-27 22:43:45 +00001177// Collect variable information from side table maintained by MMI.
Jim Grosbach1e20b962010-07-21 21:21:52 +00001178void
Nick Lewycky3bbb6f72011-07-29 03:49:23 +00001179DwarfDebug::collectVariableInfoFromMMITable(const MachineFunction *MF,
Devang Patelee432862010-05-20 19:57:06 +00001180 SmallPtrSet<const MDNode *, 16> &Processed) {
Devang Patele717faa2009-10-06 01:26:37 +00001181 MachineModuleInfo::VariableDbgInfoMapTy &VMap = MMI->getVariableDbgInfo();
1182 for (MachineModuleInfo::VariableDbgInfoMapTy::iterator VI = VMap.begin(),
1183 VE = VMap.end(); VI != VE; ++VI) {
Devang Patele9f8f5e2010-05-07 20:54:48 +00001184 const MDNode *Var = VI->first;
Devang Patel53bb5c92009-11-10 23:06:00 +00001185 if (!Var) continue;
Devang Patel98e1cac2010-05-14 21:01:35 +00001186 Processed.insert(Var);
Chris Lattnerde4845c2010-04-02 19:42:39 +00001187 DIVariable DV(Var);
1188 const std::pair<unsigned, DebugLoc> &VP = VI->second;
Devang Patel53bb5c92009-11-10 23:06:00 +00001189
Devang Patelbf47fdb2011-08-10 20:55:27 +00001190 LexicalScope *Scope = LScopes.findLexicalScope(VP.second);
Jim Grosbach1e20b962010-07-21 21:21:52 +00001191
Devang Patelfb0ee432009-11-10 23:20:04 +00001192 // If variable scope is not found then skip this variable.
Chris Lattnerde4845c2010-04-02 19:42:39 +00001193 if (Scope == 0)
Devang Patelfb0ee432009-11-10 23:20:04 +00001194 continue;
Devang Patel53bb5c92009-11-10 23:06:00 +00001195
Devang Patel26c1e562010-05-20 16:36:41 +00001196 DbgVariable *AbsDbgVariable = findAbstractVariable(DV, VP.second);
Devang Patel5a1a67c2011-08-15 19:01:20 +00001197 DbgVariable *RegVar = new DbgVariable(DV, AbsDbgVariable);
Devang Patelff9dd0a2011-08-15 21:24:36 +00001198 RegVar->setFrameIndex(VP.first);
Devang Patel0478c152011-03-01 22:58:55 +00001199 if (!addCurrentFnArgument(MF, RegVar, Scope))
Devang Patelbf47fdb2011-08-10 20:55:27 +00001200 addScopeVariable(Scope, RegVar);
Devang Patel5a1a67c2011-08-15 19:01:20 +00001201 if (AbsDbgVariable)
Devang Patelff9dd0a2011-08-15 21:24:36 +00001202 AbsDbgVariable->setFrameIndex(VP.first);
Devang Patele717faa2009-10-06 01:26:37 +00001203 }
Devang Patelee432862010-05-20 19:57:06 +00001204}
Devang Patel90a48ad2010-03-15 18:33:46 +00001205
Eric Christopherb6dc8652012-11-27 22:43:45 +00001206// Return true if debug value, encoded by DBG_VALUE instruction, is in a
1207// defined reg.
Devang Patelc3f5f782010-05-25 23:40:22 +00001208static bool isDbgValueInDefinedReg(const MachineInstr *MI) {
Nick Lewycky746cb672011-10-26 22:55:33 +00001209 assert(MI->isDebugValue() && "Invalid DBG_VALUE machine instruction!");
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001210 return MI->getNumOperands() == 3 &&
1211 MI->getOperand(0).isReg() && MI->getOperand(0).getReg() &&
Adrian Prantl35176402013-07-09 20:28:37 +00001212 (MI->getOperand(1).isImm() ||
1213 (MI->getOperand(1).isReg() && MI->getOperand(1).getReg() == 0U));
Devang Patelc3f5f782010-05-25 23:40:22 +00001214}
1215
Eric Christopherb6dc8652012-11-27 22:43:45 +00001216// Get .debug_loc entry for the instruction range starting at MI.
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001217static DotDebugLocEntry getDebugLocEntry(AsmPrinter *Asm,
1218 const MCSymbol *FLabel,
Devang Patel90b40412011-07-08 17:09:57 +00001219 const MCSymbol *SLabel,
1220 const MachineInstr *MI) {
1221 const MDNode *Var = MI->getOperand(MI->getNumOperands() - 1).getMetadata();
1222
David Blaikie6d9dbd52013-06-16 20:34:15 +00001223 assert(MI->getNumOperands() == 3);
Adrian Prantl35176402013-07-09 20:28:37 +00001224 if (MI->getOperand(0).isReg()) {
Devang Patel90b40412011-07-08 17:09:57 +00001225 MachineLocation MLoc;
Adrian Prantl35176402013-07-09 20:28:37 +00001226 // If the second operand is an immediate, this is a
1227 // register-indirect address.
1228 if (!MI->getOperand(1).isImm())
Adrian Prantl13131e62013-04-26 21:57:17 +00001229 MLoc.set(MI->getOperand(0).getReg());
1230 else
1231 MLoc.set(MI->getOperand(0).getReg(), MI->getOperand(1).getImm());
Devang Patel90b40412011-07-08 17:09:57 +00001232 return DotDebugLocEntry(FLabel, SLabel, MLoc, Var);
1233 }
1234 if (MI->getOperand(0).isImm())
1235 return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getImm());
1236 if (MI->getOperand(0).isFPImm())
1237 return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getFPImm());
1238 if (MI->getOperand(0).isCImm())
1239 return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getCImm());
1240
Craig Topper5e25ee82012-02-05 08:31:47 +00001241 llvm_unreachable("Unexpected 3 operand DBG_VALUE instruction!");
Devang Patel90b40412011-07-08 17:09:57 +00001242}
1243
Eric Christopherb6dc8652012-11-27 22:43:45 +00001244// Find variables for each lexical scope.
Jim Grosbach1e20b962010-07-21 21:21:52 +00001245void
Devang Patel78e127d2010-06-25 22:07:34 +00001246DwarfDebug::collectVariableInfo(const MachineFunction *MF,
1247 SmallPtrSet<const MDNode *, 16> &Processed) {
Jim Grosbach1e20b962010-07-21 21:21:52 +00001248
Eric Christopher4e976452013-07-03 21:37:03 +00001249 // Grab the variable info that was squirreled away in the MMI side-table.
Devang Patelee432862010-05-20 19:57:06 +00001250 collectVariableInfoFromMMITable(MF, Processed);
1251
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001252 for (SmallVectorImpl<const MDNode*>::const_iterator
1253 UVI = UserVariables.begin(), UVE = UserVariables.end(); UVI != UVE;
1254 ++UVI) {
1255 const MDNode *Var = *UVI;
1256 if (Processed.count(Var))
Devang Patelee432862010-05-20 19:57:06 +00001257 continue;
1258
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001259 // History contains relevant DBG_VALUE instructions for Var and instructions
1260 // clobbering it.
1261 SmallVectorImpl<const MachineInstr*> &History = DbgValues[Var];
1262 if (History.empty())
1263 continue;
1264 const MachineInstr *MInsn = History.front();
Devang Patelc3f5f782010-05-25 23:40:22 +00001265
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001266 DIVariable DV(Var);
Devang Patelbf47fdb2011-08-10 20:55:27 +00001267 LexicalScope *Scope = NULL;
Devang Pateld8720f42010-05-27 20:25:04 +00001268 if (DV.getTag() == dwarf::DW_TAG_arg_variable &&
1269 DISubprogram(DV.getContext()).describes(MF->getFunction()))
Devang Patelbf47fdb2011-08-10 20:55:27 +00001270 Scope = LScopes.getCurrentFunctionScope();
David Blaikiec0ec8a42013-03-11 23:39:23 +00001271 else if (MDNode *IA = DV.getInlinedAt())
1272 Scope = LScopes.findInlinedScope(DebugLoc::getFromDILocation(IA));
1273 else
1274 Scope = LScopes.findLexicalScope(cast<MDNode>(DV->getOperand(1)));
Devang Patelee432862010-05-20 19:57:06 +00001275 // If variable scope is not found then skip this variable.
Devang Patelc0c5a262010-05-21 00:10:20 +00001276 if (!Scope)
Devang Patelee432862010-05-20 19:57:06 +00001277 continue;
1278
1279 Processed.insert(DV);
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001280 assert(MInsn->isDebugValue() && "History must begin with debug value");
Devang Patel5a1a67c2011-08-15 19:01:20 +00001281 DbgVariable *AbsVar = findAbstractVariable(DV, MInsn->getDebugLoc());
1282 DbgVariable *RegVar = new DbgVariable(DV, AbsVar);
Devang Patel0478c152011-03-01 22:58:55 +00001283 if (!addCurrentFnArgument(MF, RegVar, Scope))
Devang Patelbf47fdb2011-08-10 20:55:27 +00001284 addScopeVariable(Scope, RegVar);
Devang Patel5a1a67c2011-08-15 19:01:20 +00001285 if (AbsVar)
Devang Patelff9dd0a2011-08-15 21:24:36 +00001286 AbsVar->setMInsn(MInsn);
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001287
Eric Christopherc56e3f02012-10-08 20:48:54 +00001288 // Simplify ranges that are fully coalesced.
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001289 if (History.size() <= 1 || (History.size() == 2 &&
1290 MInsn->isIdenticalTo(History.back()))) {
Devang Patelff9dd0a2011-08-15 21:24:36 +00001291 RegVar->setMInsn(MInsn);
Devang Patelc3f5f782010-05-25 23:40:22 +00001292 continue;
1293 }
1294
Eric Christopher498703b2013-01-28 17:33:26 +00001295 // Handle multiple DBG_VALUE instructions describing one variable.
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001296 RegVar->setDotDebugLocOffset(DotDebugLocEntries.size());
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001297
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001298 for (SmallVectorImpl<const MachineInstr*>::const_iterator
1299 HI = History.begin(), HE = History.end(); HI != HE; ++HI) {
1300 const MachineInstr *Begin = *HI;
1301 assert(Begin->isDebugValue() && "Invalid History entry");
Jakob Stoklund Olesene17232e2011-03-22 00:21:41 +00001302
Devang Patel4ada1d72011-06-01 23:00:17 +00001303 // Check if DBG_VALUE is truncating a range.
1304 if (Begin->getNumOperands() > 1 && Begin->getOperand(0).isReg()
1305 && !Begin->getOperand(0).getReg())
1306 continue;
1307
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001308 // Compute the range for a register location.
1309 const MCSymbol *FLabel = getLabelBeforeInsn(Begin);
1310 const MCSymbol *SLabel = 0;
1311
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001312 if (HI + 1 == HE)
1313 // If Begin is the last instruction in History then its value is valid
Chris Lattner7a2bdde2011-04-15 05:18:47 +00001314 // until the end of the function.
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001315 SLabel = FunctionEndSym;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001316 else {
1317 const MachineInstr *End = HI[1];
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001318 DEBUG(dbgs() << "DotDebugLoc Pair:\n"
Devang Patel476df5f2011-07-07 21:44:42 +00001319 << "\t" << *Begin << "\t" << *End << "\n");
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001320 if (End->isDebugValue())
1321 SLabel = getLabelBeforeInsn(End);
1322 else {
1323 // End is a normal instruction clobbering the range.
1324 SLabel = getLabelAfterInsn(End);
1325 assert(SLabel && "Forgot label after clobber instruction");
1326 ++HI;
1327 }
1328 }
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001329
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001330 // The value is valid until the next DBG_VALUE or clobber.
Eric Christopherabbb2002011-12-16 23:42:31 +00001331 DotDebugLocEntries.push_back(getDebugLocEntry(Asm, FLabel, SLabel,
1332 Begin));
Devang Patelc3f5f782010-05-25 23:40:22 +00001333 }
1334 DotDebugLocEntries.push_back(DotDebugLocEntry());
Devang Patel90a48ad2010-03-15 18:33:46 +00001335 }
Devang Patel98e1cac2010-05-14 21:01:35 +00001336
1337 // Collect info for variables that were optimized out.
Devang Patel93d39be2011-08-19 23:28:12 +00001338 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
1339 DIArray Variables = DISubprogram(FnScope->getScopeNode()).getVariables();
1340 for (unsigned i = 0, e = Variables.getNumElements(); i != e; ++i) {
1341 DIVariable DV(Variables.getElement(i));
Manman Rend03d2b22013-07-08 18:33:29 +00001342 if (!DV || !DV.isVariable() || !Processed.insert(DV))
Devang Patel93d39be2011-08-19 23:28:12 +00001343 continue;
1344 if (LexicalScope *Scope = LScopes.findLexicalScope(DV.getContext()))
1345 addScopeVariable(Scope, new DbgVariable(DV, NULL));
Devang Patel98e1cac2010-05-14 21:01:35 +00001346 }
Devang Patelc3f5f782010-05-25 23:40:22 +00001347}
Devang Patel98e1cac2010-05-14 21:01:35 +00001348
Eric Christopherb6dc8652012-11-27 22:43:45 +00001349// Return Label preceding the instruction.
Eric Christopher72f7bfb2013-01-15 23:56:56 +00001350MCSymbol *DwarfDebug::getLabelBeforeInsn(const MachineInstr *MI) {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001351 MCSymbol *Label = LabelsBeforeInsn.lookup(MI);
1352 assert(Label && "Didn't insert label before instruction");
1353 return Label;
Devang Patelc3f5f782010-05-25 23:40:22 +00001354}
1355
Eric Christopherb6dc8652012-11-27 22:43:45 +00001356// Return Label immediately following the instruction.
Eric Christopher72f7bfb2013-01-15 23:56:56 +00001357MCSymbol *DwarfDebug::getLabelAfterInsn(const MachineInstr *MI) {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001358 return LabelsAfterInsn.lookup(MI);
Devang Patele717faa2009-10-06 01:26:37 +00001359}
1360
Eric Christopherb6dc8652012-11-27 22:43:45 +00001361// Process beginning of an instruction.
Devang Patelcbbe2872010-10-26 17:49:02 +00001362void DwarfDebug::beginInstruction(const MachineInstr *MI) {
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001363 // Check if source location changes, but ignore DBG_VALUE locations.
1364 if (!MI->isDebugValue()) {
1365 DebugLoc DL = MI->getDebugLoc();
1366 if (DL != PrevInstLoc && (!DL.isUnknown() || UnknownLocations)) {
Eric Christopher60b35f42012-04-05 20:39:05 +00001367 unsigned Flags = 0;
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001368 PrevInstLoc = DL;
Devang Patel4243e672011-05-11 19:22:19 +00001369 if (DL == PrologEndLoc) {
1370 Flags |= DWARF2_FLAG_PROLOGUE_END;
1371 PrologEndLoc = DebugLoc();
1372 }
Eric Christopher60b35f42012-04-05 20:39:05 +00001373 if (PrologEndLoc.isUnknown())
1374 Flags |= DWARF2_FLAG_IS_STMT;
1375
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001376 if (!DL.isUnknown()) {
1377 const MDNode *Scope = DL.getScope(Asm->MF->getFunction()->getContext());
Devang Patel4243e672011-05-11 19:22:19 +00001378 recordSourceLine(DL.getLine(), DL.getCol(), Scope, Flags);
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001379 } else
Devang Patel4243e672011-05-11 19:22:19 +00001380 recordSourceLine(0, 0, 0, 0);
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001381 }
Devang Patelc3f5f782010-05-25 23:40:22 +00001382 }
Devang Patelaead63c2010-03-29 22:59:58 +00001383
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001384 // Insert labels where requested.
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001385 DenseMap<const MachineInstr*, MCSymbol*>::iterator I =
1386 LabelsBeforeInsn.find(MI);
1387
1388 // No label needed.
1389 if (I == LabelsBeforeInsn.end())
1390 return;
1391
1392 // Label already assigned.
1393 if (I->second)
Devang Patelb2b31a62010-05-26 19:37:24 +00001394 return;
Devang Patel553881b2010-03-29 17:20:31 +00001395
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001396 if (!PrevLabel) {
Devang Patel77051f52010-05-26 21:23:46 +00001397 PrevLabel = MMI->getContext().CreateTempSymbol();
1398 Asm->OutStreamer.EmitLabel(PrevLabel);
Devang Patelb2b31a62010-05-26 19:37:24 +00001399 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001400 I->second = PrevLabel;
Devang Patel0d20ac82009-10-06 01:50:42 +00001401}
1402
Eric Christopherb6dc8652012-11-27 22:43:45 +00001403// Process end of an instruction.
Devang Patelcbbe2872010-10-26 17:49:02 +00001404void DwarfDebug::endInstruction(const MachineInstr *MI) {
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001405 // Don't create a new label after DBG_VALUE instructions.
1406 // They don't generate code.
1407 if (!MI->isDebugValue())
1408 PrevLabel = 0;
1409
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001410 DenseMap<const MachineInstr*, MCSymbol*>::iterator I =
1411 LabelsAfterInsn.find(MI);
1412
1413 // No label needed.
1414 if (I == LabelsAfterInsn.end())
1415 return;
1416
1417 // Label already assigned.
1418 if (I->second)
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001419 return;
1420
1421 // We need a label after this instruction.
1422 if (!PrevLabel) {
1423 PrevLabel = MMI->getContext().CreateTempSymbol();
1424 Asm->OutStreamer.EmitLabel(PrevLabel);
Devang Patel1c246352010-04-08 16:50:29 +00001425 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001426 I->second = PrevLabel;
Devang Patel53bb5c92009-11-10 23:06:00 +00001427}
1428
Eric Christopherb6dc8652012-11-27 22:43:45 +00001429// Each LexicalScope has first instruction and last instruction to mark
1430// beginning and end of a scope respectively. Create an inverse map that list
1431// scopes starts (and ends) with an instruction. One instruction may start (or
1432// end) multiple scopes. Ignore scopes that are not reachable.
Devang Patele37b0c62010-04-08 18:43:56 +00001433void DwarfDebug::identifyScopeMarkers() {
Devang Patelbf47fdb2011-08-10 20:55:27 +00001434 SmallVector<LexicalScope *, 4> WorkList;
1435 WorkList.push_back(LScopes.getCurrentFunctionScope());
Devang Patel42aafd72010-01-20 02:05:23 +00001436 while (!WorkList.empty()) {
Devang Patelbf47fdb2011-08-10 20:55:27 +00001437 LexicalScope *S = WorkList.pop_back_val();
Jim Grosbach1e20b962010-07-21 21:21:52 +00001438
Craig Topper9f43ac62013-07-03 04:24:43 +00001439 const SmallVectorImpl<LexicalScope *> &Children = S->getChildren();
Jim Grosbach1e20b962010-07-21 21:21:52 +00001440 if (!Children.empty())
Craig Topper2d785db2013-07-03 04:17:25 +00001441 for (SmallVectorImpl<LexicalScope *>::const_iterator SI = Children.begin(),
Devang Patel42aafd72010-01-20 02:05:23 +00001442 SE = Children.end(); SI != SE; ++SI)
1443 WorkList.push_back(*SI);
1444
Devang Patel53bb5c92009-11-10 23:06:00 +00001445 if (S->isAbstractScope())
1446 continue;
Jim Grosbach1e20b962010-07-21 21:21:52 +00001447
Craig Topper9f43ac62013-07-03 04:24:43 +00001448 const SmallVectorImpl<InsnRange> &Ranges = S->getRanges();
Devang Pateleac9c072010-04-27 19:46:33 +00001449 if (Ranges.empty())
1450 continue;
Craig Topper2d785db2013-07-03 04:17:25 +00001451 for (SmallVectorImpl<InsnRange>::const_iterator RI = Ranges.begin(),
Devang Pateleac9c072010-04-27 19:46:33 +00001452 RE = Ranges.end(); RI != RE; ++RI) {
Devang Patelbf47fdb2011-08-10 20:55:27 +00001453 assert(RI->first && "InsnRange does not have first instruction!");
1454 assert(RI->second && "InsnRange does not have second instruction!");
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001455 requestLabelBeforeInsn(RI->first);
1456 requestLabelAfterInsn(RI->second);
Devang Pateleac9c072010-04-27 19:46:33 +00001457 }
Devang Patelaf9e8472009-10-01 20:31:14 +00001458 }
Devang Patelaf9e8472009-10-01 20:31:14 +00001459}
1460
Eric Christopherb6dc8652012-11-27 22:43:45 +00001461// Get MDNode for DebugLoc's scope.
Devang Patela3f48672011-05-09 22:14:49 +00001462static MDNode *getScopeNode(DebugLoc DL, const LLVMContext &Ctx) {
1463 if (MDNode *InlinedAt = DL.getInlinedAt(Ctx))
1464 return getScopeNode(DebugLoc::getFromDILocation(InlinedAt), Ctx);
1465 return DL.getScope(Ctx);
1466}
1467
Eric Christopherb6dc8652012-11-27 22:43:45 +00001468// Walk up the scope chain of given debug loc and find line number info
1469// for the function.
Devang Patel4243e672011-05-11 19:22:19 +00001470static DebugLoc getFnDebugLoc(DebugLoc DL, const LLVMContext &Ctx) {
1471 const MDNode *Scope = getScopeNode(DL, Ctx);
1472 DISubprogram SP = getDISubprogram(Scope);
Manman Rend03d2b22013-07-08 18:33:29 +00001473 if (SP.isSubprogram()) {
Eric Christopher6126a1e2012-04-03 00:43:49 +00001474 // Check for number of operands since the compatibility is
1475 // cheap here.
Eric Christopherfa5b0502012-04-03 17:55:42 +00001476 if (SP->getNumOperands() > 19)
Eric Christopher6126a1e2012-04-03 00:43:49 +00001477 return DebugLoc::get(SP.getScopeLineNumber(), 0, SP);
1478 else
1479 return DebugLoc::get(SP.getLineNumber(), 0, SP);
1480 }
1481
Devang Patel4243e672011-05-11 19:22:19 +00001482 return DebugLoc();
1483}
1484
Eric Christopherb6dc8652012-11-27 22:43:45 +00001485// Gather pre-function debug information. Assumes being called immediately
1486// after the function entry point has been emitted.
Chris Lattnereec791a2010-01-26 23:18:02 +00001487void DwarfDebug::beginFunction(const MachineFunction *MF) {
Chris Lattner994cb122010-04-05 03:52:55 +00001488 if (!MMI->hasDebugInfo()) return;
Devang Patelbf47fdb2011-08-10 20:55:27 +00001489 LScopes.initialize(*MF);
1490 if (LScopes.empty()) return;
1491 identifyScopeMarkers();
Devang Patel60b35bd2009-10-06 18:37:31 +00001492
Manman Ren43213cf2013-02-05 21:52:47 +00001493 // Set DwarfCompileUnitID in MCContext to the Compile Unit this function
1494 // belongs to.
1495 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
1496 CompileUnit *TheCU = SPMap.lookup(FnScope->getScopeNode());
1497 assert(TheCU && "Unable to find compile unit!");
Manman Ren01cb18e2013-05-21 00:57:22 +00001498 if (Asm->TM.hasMCUseLoc() &&
1499 Asm->OutStreamer.getKind() == MCStreamer::SK_AsmStreamer)
1500 // Use a single line table if we are using .loc and generating assembly.
1501 Asm->OutStreamer.getContext().setDwarfCompileUnitID(0);
1502 else
1503 Asm->OutStreamer.getContext().setDwarfCompileUnitID(TheCU->getUniqueID());
Manman Ren43213cf2013-02-05 21:52:47 +00001504
Devang Pateleac9c072010-04-27 19:46:33 +00001505 FunctionBeginSym = Asm->GetTempSymbol("func_begin",
1506 Asm->getFunctionNumber());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001507 // Assumes in correct section after the entry point.
Devang Pateleac9c072010-04-27 19:46:33 +00001508 Asm->OutStreamer.EmitLabel(FunctionBeginSym);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001509
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001510 assert(UserVariables.empty() && DbgValues.empty() && "Maps weren't cleaned");
1511
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001512 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
Eric Christopherb6dc8652012-11-27 22:43:45 +00001513 // LiveUserVar - Map physreg numbers to the MDNode they contain.
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001514 std::vector<const MDNode*> LiveUserVar(TRI->getNumRegs());
1515
Devang Patelb2b31a62010-05-26 19:37:24 +00001516 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001517 I != E; ++I) {
1518 bool AtBlockEntry = true;
Devang Patelb2b31a62010-05-26 19:37:24 +00001519 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
1520 II != IE; ++II) {
1521 const MachineInstr *MI = II;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001522
Devang Patelb2b31a62010-05-26 19:37:24 +00001523 if (MI->isDebugValue()) {
Nick Lewycky746cb672011-10-26 22:55:33 +00001524 assert(MI->getNumOperands() > 1 && "Invalid machine instruction!");
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001525
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001526 // Keep track of user variables.
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001527 const MDNode *Var =
1528 MI->getOperand(MI->getNumOperands() - 1).getMetadata();
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001529
1530 // Variable is in a register, we need to check for clobbers.
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001531 if (isDbgValueInDefinedReg(MI))
1532 LiveUserVar[MI->getOperand(0).getReg()] = Var;
1533
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001534 // Check the history of this variable.
1535 SmallVectorImpl<const MachineInstr*> &History = DbgValues[Var];
1536 if (History.empty()) {
1537 UserVariables.push_back(Var);
1538 // The first mention of a function argument gets the FunctionBeginSym
1539 // label, so arguments are visible when breaking at function entry.
1540 DIVariable DV(Var);
Manman Rend03d2b22013-07-08 18:33:29 +00001541 if (DV.isVariable() && DV.getTag() == dwarf::DW_TAG_arg_variable &&
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001542 DISubprogram(getDISubprogram(DV.getContext()))
1543 .describes(MF->getFunction()))
1544 LabelsBeforeInsn[MI] = FunctionBeginSym;
1545 } else {
1546 // We have seen this variable before. Try to coalesce DBG_VALUEs.
1547 const MachineInstr *Prev = History.back();
1548 if (Prev->isDebugValue()) {
1549 // Coalesce identical entries at the end of History.
1550 if (History.size() >= 2 &&
Devang Patel79862892011-07-07 00:14:27 +00001551 Prev->isIdenticalTo(History[History.size() - 2])) {
Eric Christopher02c1a642012-10-08 20:48:49 +00001552 DEBUG(dbgs() << "Coalescing identical DBG_VALUE entries:\n"
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001553 << "\t" << *Prev
Devang Patel79862892011-07-07 00:14:27 +00001554 << "\t" << *History[History.size() - 2] << "\n");
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001555 History.pop_back();
Devang Patel79862892011-07-07 00:14:27 +00001556 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001557
1558 // Terminate old register assignments that don't reach MI;
1559 MachineFunction::const_iterator PrevMBB = Prev->getParent();
1560 if (PrevMBB != I && (!AtBlockEntry || llvm::next(PrevMBB) != I) &&
1561 isDbgValueInDefinedReg(Prev)) {
1562 // Previous register assignment needs to terminate at the end of
1563 // its basic block.
1564 MachineBasicBlock::const_iterator LastMI =
1565 PrevMBB->getLastNonDebugInstr();
Devang Patel79862892011-07-07 00:14:27 +00001566 if (LastMI == PrevMBB->end()) {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001567 // Drop DBG_VALUE for empty range.
Eric Christopher02c1a642012-10-08 20:48:49 +00001568 DEBUG(dbgs() << "Dropping DBG_VALUE for empty range:\n"
Devang Patel79862892011-07-07 00:14:27 +00001569 << "\t" << *Prev << "\n");
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001570 History.pop_back();
David Blaikie4532c282013-06-20 00:25:24 +00001571 } else if (llvm::next(PrevMBB) != PrevMBB->getParent()->end())
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001572 // Terminate after LastMI.
1573 History.push_back(LastMI);
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001574 }
1575 }
1576 }
1577 History.push_back(MI);
Devang Patelb2b31a62010-05-26 19:37:24 +00001578 } else {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001579 // Not a DBG_VALUE instruction.
1580 if (!MI->isLabel())
1581 AtBlockEntry = false;
1582
Eric Christopher0313ced2012-10-04 20:46:14 +00001583 // First known non-DBG_VALUE and non-frame setup location marks
1584 // the beginning of the function body.
1585 if (!MI->getFlag(MachineInstr::FrameSetup) &&
1586 (PrologEndLoc.isUnknown() && !MI->getDebugLoc().isUnknown()))
Devang Patel4243e672011-05-11 19:22:19 +00001587 PrologEndLoc = MI->getDebugLoc();
1588
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001589 // Check if the instruction clobbers any registers with debug vars.
1590 for (MachineInstr::const_mop_iterator MOI = MI->operands_begin(),
1591 MOE = MI->operands_end(); MOI != MOE; ++MOI) {
1592 if (!MOI->isReg() || !MOI->isDef() || !MOI->getReg())
1593 continue;
Jakob Stoklund Olesen396618b2012-06-01 23:28:30 +00001594 for (MCRegAliasIterator AI(MOI->getReg(), TRI, true);
1595 AI.isValid(); ++AI) {
1596 unsigned Reg = *AI;
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001597 const MDNode *Var = LiveUserVar[Reg];
1598 if (!Var)
1599 continue;
1600 // Reg is now clobbered.
1601 LiveUserVar[Reg] = 0;
1602
1603 // Was MD last defined by a DBG_VALUE referring to Reg?
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001604 DbgValueHistoryMap::iterator HistI = DbgValues.find(Var);
1605 if (HistI == DbgValues.end())
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001606 continue;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001607 SmallVectorImpl<const MachineInstr*> &History = HistI->second;
1608 if (History.empty())
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001609 continue;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001610 const MachineInstr *Prev = History.back();
1611 // Sanity-check: Register assignments are terminated at the end of
1612 // their block.
1613 if (!Prev->isDebugValue() || Prev->getParent() != MI->getParent())
1614 continue;
1615 // Is the variable still in Reg?
1616 if (!isDbgValueInDefinedReg(Prev) ||
1617 Prev->getOperand(0).getReg() != Reg)
1618 continue;
1619 // Var is clobbered. Make sure the next instruction gets a label.
1620 History.push_back(MI);
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001621 }
1622 }
Devang Patelb2b31a62010-05-26 19:37:24 +00001623 }
Devang Patelb2b31a62010-05-26 19:37:24 +00001624 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001625 }
1626
1627 for (DbgValueHistoryMap::iterator I = DbgValues.begin(), E = DbgValues.end();
1628 I != E; ++I) {
1629 SmallVectorImpl<const MachineInstr*> &History = I->second;
1630 if (History.empty())
1631 continue;
1632
1633 // Make sure the final register assignments are terminated.
1634 const MachineInstr *Prev = History.back();
1635 if (Prev->isDebugValue() && isDbgValueInDefinedReg(Prev)) {
1636 const MachineBasicBlock *PrevMBB = Prev->getParent();
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001637 MachineBasicBlock::const_iterator LastMI =
Devang Patel5bc942c2011-08-10 23:58:09 +00001638 PrevMBB->getLastNonDebugInstr();
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001639 if (LastMI == PrevMBB->end())
1640 // Drop DBG_VALUE for empty range.
1641 History.pop_back();
David Blaikie4532c282013-06-20 00:25:24 +00001642 else if (PrevMBB != &PrevMBB->getParent()->back()) {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001643 // Terminate after LastMI.
1644 History.push_back(LastMI);
1645 }
1646 }
1647 // Request labels for the full history.
1648 for (unsigned i = 0, e = History.size(); i != e; ++i) {
1649 const MachineInstr *MI = History[i];
1650 if (MI->isDebugValue())
1651 requestLabelBeforeInsn(MI);
1652 else
1653 requestLabelAfterInsn(MI);
1654 }
1655 }
Devang Patelb2b31a62010-05-26 19:37:24 +00001656
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001657 PrevInstLoc = DebugLoc();
Devang Patelb2b31a62010-05-26 19:37:24 +00001658 PrevLabel = FunctionBeginSym;
Devang Patel4243e672011-05-11 19:22:19 +00001659
1660 // Record beginning of function.
1661 if (!PrologEndLoc.isUnknown()) {
1662 DebugLoc FnStartDL = getFnDebugLoc(PrologEndLoc,
1663 MF->getFunction()->getContext());
1664 recordSourceLine(FnStartDL.getLine(), FnStartDL.getCol(),
1665 FnStartDL.getScope(MF->getFunction()->getContext()),
David Blaikie836cfc42012-12-04 22:02:33 +00001666 // We'd like to list the prologue as "not statements" but GDB behaves
1667 // poorly if we do that. Revisit this with caution/GDB (7.5+) testing.
David Blaikieb36c5312012-12-04 21:05:36 +00001668 DWARF2_FLAG_IS_STMT);
Devang Patel4243e672011-05-11 19:22:19 +00001669 }
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001670}
1671
Devang Patelbf47fdb2011-08-10 20:55:27 +00001672void DwarfDebug::addScopeVariable(LexicalScope *LS, DbgVariable *Var) {
David Blaikie032d6242013-06-05 05:39:59 +00001673 SmallVectorImpl<DbgVariable *> &Vars = ScopeVariables[LS];
1674 DIVariable DV = Var->getVariable();
David Blaikieb20fdff2013-06-06 21:04:51 +00001675 // Variables with positive arg numbers are parameters.
1676 if (unsigned ArgNum = DV.getArgNumber()) {
1677 // Keep all parameters in order at the start of the variable list to ensure
1678 // function types are correct (no out-of-order parameters)
1679 //
1680 // This could be improved by only doing it for optimized builds (unoptimized
1681 // builds have the right order to begin with), searching from the back (this
1682 // would catch the unoptimized case quickly), or doing a binary search
1683 // rather than linear search.
1684 SmallVectorImpl<DbgVariable *>::iterator I = Vars.begin();
1685 while (I != Vars.end()) {
1686 unsigned CurNum = (*I)->getVariable().getArgNumber();
1687 // A local (non-parameter) variable has been found, insert immediately
1688 // before it.
1689 if (CurNum == 0)
1690 break;
1691 // A later indexed parameter has been found, insert immediately before it.
David Blaikiebabfebb2013-06-06 22:28:26 +00001692 if (CurNum > ArgNum)
David Blaikieb20fdff2013-06-06 21:04:51 +00001693 break;
David Blaikiebabfebb2013-06-06 22:28:26 +00001694 ++I;
David Blaikie032d6242013-06-05 05:39:59 +00001695 }
David Blaikieb20fdff2013-06-06 21:04:51 +00001696 Vars.insert(I, Var);
1697 return;
David Blaikie032d6242013-06-05 05:39:59 +00001698 }
1699
1700 Vars.push_back(Var);
Devang Patelbf47fdb2011-08-10 20:55:27 +00001701}
1702
Eric Christopherb6dc8652012-11-27 22:43:45 +00001703// Gather and emit post-function debug information.
Chris Lattnereec791a2010-01-26 23:18:02 +00001704void DwarfDebug::endFunction(const MachineFunction *MF) {
Devang Patelbf47fdb2011-08-10 20:55:27 +00001705 if (!MMI->hasDebugInfo() || LScopes.empty()) return;
Devang Patel70d75ca2009-11-12 19:02:56 +00001706
Devang Patelbf47fdb2011-08-10 20:55:27 +00001707 // Define end label for subprogram.
1708 FunctionEndSym = Asm->GetTempSymbol("func_end",
1709 Asm->getFunctionNumber());
1710 // Assumes in correct section after the entry point.
1711 Asm->OutStreamer.EmitLabel(FunctionEndSym);
Manman Ren43213cf2013-02-05 21:52:47 +00001712 // Set DwarfCompileUnitID in MCContext to default value.
1713 Asm->OutStreamer.getContext().setDwarfCompileUnitID(0);
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001714
Devang Patelbf47fdb2011-08-10 20:55:27 +00001715 SmallPtrSet<const MDNode *, 16> ProcessedVars;
1716 collectVariableInfo(MF, ProcessedVars);
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001717
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001718 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
Devang Patel94c7ddb2011-08-16 22:09:43 +00001719 CompileUnit *TheCU = SPMap.lookup(FnScope->getScopeNode());
Nick Lewycky746cb672011-10-26 22:55:33 +00001720 assert(TheCU && "Unable to find compile unit!");
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001721
Devang Patelbf47fdb2011-08-10 20:55:27 +00001722 // Construct abstract scopes.
Devang Patelcd9f6c52011-08-12 18:10:19 +00001723 ArrayRef<LexicalScope *> AList = LScopes.getAbstractScopesList();
1724 for (unsigned i = 0, e = AList.size(); i != e; ++i) {
1725 LexicalScope *AScope = AList[i];
1726 DISubprogram SP(AScope->getScopeNode());
Manman Rend03d2b22013-07-08 18:33:29 +00001727 if (SP.isSubprogram()) {
Devang Patelbf47fdb2011-08-10 20:55:27 +00001728 // Collect info for variables that were optimized out.
Devang Patel93d39be2011-08-19 23:28:12 +00001729 DIArray Variables = SP.getVariables();
1730 for (unsigned i = 0, e = Variables.getNumElements(); i != e; ++i) {
1731 DIVariable DV(Variables.getElement(i));
Manman Rend03d2b22013-07-08 18:33:29 +00001732 if (!DV || !DV.isVariable() || !ProcessedVars.insert(DV))
Devang Patel93d39be2011-08-19 23:28:12 +00001733 continue;
Alexey Samsonovb67bd332012-07-06 08:45:08 +00001734 // Check that DbgVariable for DV wasn't created earlier, when
1735 // findAbstractVariable() was called for inlined instance of DV.
1736 LLVMContext &Ctx = DV->getContext();
1737 DIVariable CleanDV = cleanseInlinedVariable(DV, Ctx);
1738 if (AbstractVariables.lookup(CleanDV))
1739 continue;
Devang Patel93d39be2011-08-19 23:28:12 +00001740 if (LexicalScope *Scope = LScopes.findAbstractScope(DV.getContext()))
1741 addScopeVariable(Scope, new DbgVariable(DV, NULL));
Devang Patel78e127d2010-06-25 22:07:34 +00001742 }
1743 }
Devang Patelcd9f6c52011-08-12 18:10:19 +00001744 if (ProcessedSPNodes.count(AScope->getScopeNode()) == 0)
Manman Ren742671b2013-05-29 17:16:59 +00001745 constructScopeDIE(TheCU, AScope);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001746 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001747
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001748 DIE *CurFnDIE = constructScopeDIE(TheCU, FnScope);
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001749
Nick Lewycky8a8d4792011-12-02 22:16:29 +00001750 if (!MF->getTarget().Options.DisableFramePointerElim(*MF))
Eric Christopher873cf0a2012-08-24 01:14:27 +00001751 TheCU->addFlag(CurFnDIE, dwarf::DW_AT_APPLE_omit_frame_ptr);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001752
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001753 // Clear debug info
Craig Topper01eb99a2013-07-03 04:40:27 +00001754 for (ScopeVariablesMap::iterator
Devang Patelbf47fdb2011-08-10 20:55:27 +00001755 I = ScopeVariables.begin(), E = ScopeVariables.end(); I != E; ++I)
1756 DeleteContainerPointers(I->second);
1757 ScopeVariables.clear();
Devang Pateleac0c9d2011-04-22 18:09:57 +00001758 DeleteContainerPointers(CurrentFnArguments);
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001759 UserVariables.clear();
1760 DbgValues.clear();
Jeffrey Yasskin5c213dc2010-03-12 17:45:06 +00001761 AbstractVariables.clear();
Devang Pateleac9c072010-04-27 19:46:33 +00001762 LabelsBeforeInsn.clear();
1763 LabelsAfterInsn.clear();
Devang Patelf2548ca2010-04-16 23:33:45 +00001764 PrevLabel = NULL;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001765}
1766
Eric Christopherb6dc8652012-11-27 22:43:45 +00001767// Register a source line with debug info. Returns the unique label that was
1768// emitted and which provides correspondence to the source line list.
Devang Patel4243e672011-05-11 19:22:19 +00001769void DwarfDebug::recordSourceLine(unsigned Line, unsigned Col, const MDNode *S,
1770 unsigned Flags) {
Devang Patel65dbc902009-11-25 17:36:49 +00001771 StringRef Fn;
Devang Patel23670e52011-03-24 20:30:50 +00001772 StringRef Dir;
Dan Gohman1cc0d622010-05-05 23:41:32 +00001773 unsigned Src = 1;
1774 if (S) {
1775 DIDescriptor Scope(S);
Devang Patelf84548d2009-10-05 18:03:19 +00001776
Dan Gohman1cc0d622010-05-05 23:41:32 +00001777 if (Scope.isCompileUnit()) {
1778 DICompileUnit CU(S);
Dan Gohman1cc0d622010-05-05 23:41:32 +00001779 Fn = CU.getFilename();
Devang Patel23670e52011-03-24 20:30:50 +00001780 Dir = CU.getDirectory();
Devang Patel3cabc9d2010-10-28 17:30:52 +00001781 } else if (Scope.isFile()) {
1782 DIFile F(S);
Devang Patel3cabc9d2010-10-28 17:30:52 +00001783 Fn = F.getFilename();
Devang Patel23670e52011-03-24 20:30:50 +00001784 Dir = F.getDirectory();
Dan Gohman1cc0d622010-05-05 23:41:32 +00001785 } else if (Scope.isSubprogram()) {
1786 DISubprogram SP(S);
Dan Gohman1cc0d622010-05-05 23:41:32 +00001787 Fn = SP.getFilename();
Devang Patel23670e52011-03-24 20:30:50 +00001788 Dir = SP.getDirectory();
Eric Christopher6618a242011-10-11 22:59:11 +00001789 } else if (Scope.isLexicalBlockFile()) {
1790 DILexicalBlockFile DBF(S);
1791 Fn = DBF.getFilename();
1792 Dir = DBF.getDirectory();
Dan Gohman1cc0d622010-05-05 23:41:32 +00001793 } else if (Scope.isLexicalBlock()) {
1794 DILexicalBlock DB(S);
Dan Gohman1cc0d622010-05-05 23:41:32 +00001795 Fn = DB.getFilename();
Devang Patel23670e52011-03-24 20:30:50 +00001796 Dir = DB.getDirectory();
Dan Gohman1cc0d622010-05-05 23:41:32 +00001797 } else
Craig Topper5e25ee82012-02-05 08:31:47 +00001798 llvm_unreachable("Unexpected scope info");
Dan Gohman1cc0d622010-05-05 23:41:32 +00001799
Manman Ren3de61b42013-03-07 01:42:00 +00001800 Src = getOrCreateSourceID(Fn, Dir,
1801 Asm->OutStreamer.getContext().getDwarfCompileUnitID());
Dan Gohman1cc0d622010-05-05 23:41:32 +00001802 }
Nick Lewycky3bbb6f72011-07-29 03:49:23 +00001803 Asm->OutStreamer.EmitDwarfLocDirective(Src, Line, Col, Flags, 0, 0, Fn);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001804}
1805
Bill Wendling829e67b2009-05-20 23:22:40 +00001806//===----------------------------------------------------------------------===//
1807// Emit Methods
1808//===----------------------------------------------------------------------===//
1809
Eric Christopherb6dc8652012-11-27 22:43:45 +00001810// Compute the size and offset of a DIE.
Jim Grosbach7ab38df2009-11-22 19:20:36 +00001811unsigned
Eric Christopher0e3e9b72012-12-10 23:34:43 +00001812DwarfUnits::computeSizeAndOffset(DIE *Die, unsigned Offset) {
Bill Wendling94d04b82009-05-20 23:21:38 +00001813 // Get the children.
1814 const std::vector<DIE *> &Children = Die->getChildren();
1815
Bill Wendling94d04b82009-05-20 23:21:38 +00001816 // Record the abbreviation.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001817 assignAbbrevNumber(Die->getAbbrev());
Bill Wendling94d04b82009-05-20 23:21:38 +00001818
1819 // Get the abbreviation for this DIE.
1820 unsigned AbbrevNumber = Die->getAbbrevNumber();
Eric Christopher0e3e9b72012-12-10 23:34:43 +00001821 const DIEAbbrev *Abbrev = Abbreviations->at(AbbrevNumber - 1);
Bill Wendling94d04b82009-05-20 23:21:38 +00001822
1823 // Set DIE offset
1824 Die->setOffset(Offset);
1825
1826 // Start the size with the size of abbreviation code.
Chris Lattneraf76e592009-08-22 20:48:53 +00001827 Offset += MCAsmInfo::getULEB128Size(AbbrevNumber);
Bill Wendling94d04b82009-05-20 23:21:38 +00001828
Eric Christopherf7cef702013-03-29 23:34:06 +00001829 const SmallVectorImpl<DIEValue*> &Values = Die->getValues();
1830 const SmallVectorImpl<DIEAbbrevData> &AbbrevData = Abbrev->getData();
Bill Wendling94d04b82009-05-20 23:21:38 +00001831
1832 // Size the DIE attribute values.
1833 for (unsigned i = 0, N = Values.size(); i < N; ++i)
1834 // Size attribute value.
Chris Lattnera37d5382010-04-05 00:18:22 +00001835 Offset += Values[i]->SizeOf(Asm, AbbrevData[i].getForm());
Bill Wendling94d04b82009-05-20 23:21:38 +00001836
1837 // Size the DIE children if any.
1838 if (!Children.empty()) {
1839 assert(Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes &&
1840 "Children flag not set");
1841
1842 for (unsigned j = 0, M = Children.size(); j < M; ++j)
Eric Christopherfbd19752012-11-20 22:14:13 +00001843 Offset = computeSizeAndOffset(Children[j], Offset);
Bill Wendling94d04b82009-05-20 23:21:38 +00001844
1845 // End of children marker.
1846 Offset += sizeof(int8_t);
1847 }
1848
1849 Die->setSize(Offset - Die->getOffset());
1850 return Offset;
1851}
1852
Eric Christopherb6dc8652012-11-27 22:43:45 +00001853// Compute the size and offset of all the DIEs.
Eric Christopher0e3e9b72012-12-10 23:34:43 +00001854void DwarfUnits::computeSizeAndOffsets() {
Manman Renbc3e96f2013-03-12 18:27:15 +00001855 // Offset from the beginning of debug info section.
Eric Christopherd2df98f2013-05-30 00:43:35 +00001856 unsigned SecOffset = 0;
Eric Christopherf7cef702013-03-29 23:34:06 +00001857 for (SmallVectorImpl<CompileUnit *>::iterator I = CUs.begin(),
Eric Christopher0e3e9b72012-12-10 23:34:43 +00001858 E = CUs.end(); I != E; ++I) {
Eric Christopherd2df98f2013-05-30 00:43:35 +00001859 (*I)->setDebugInfoOffset(SecOffset);
Eric Christopher98e237f2012-11-30 23:59:06 +00001860 unsigned Offset =
1861 sizeof(int32_t) + // Length of Compilation Unit Info
1862 sizeof(int16_t) + // DWARF version number
1863 sizeof(int32_t) + // Offset Into Abbrev. Section
1864 sizeof(int8_t); // Pointer Size (in bytes)
1865
Manman Renbc3e96f2013-03-12 18:27:15 +00001866 unsigned EndOffset = computeSizeAndOffset((*I)->getCUDie(), Offset);
Eric Christopherd2df98f2013-05-30 00:43:35 +00001867 SecOffset += EndOffset;
Devang Patel163a9f72010-05-10 22:49:55 +00001868 }
Bill Wendling94d04b82009-05-20 23:21:38 +00001869}
1870
Eric Christopherb6dc8652012-11-27 22:43:45 +00001871// Emit initial Dwarf sections with a label at the start of each one.
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001872void DwarfDebug::emitSectionLabels() {
Chris Lattner6c2f9e12009-08-19 05:49:37 +00001873 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
Daniel Dunbarf612ff62009-09-19 20:40:05 +00001874
Bill Wendling94d04b82009-05-20 23:21:38 +00001875 // Dwarf sections base addresses.
Jim Grosbach1e20b962010-07-21 21:21:52 +00001876 DwarfInfoSectionSym =
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001877 emitSectionSym(Asm, TLOF.getDwarfInfoSection(), "section_info");
Jim Grosbach1e20b962010-07-21 21:21:52 +00001878 DwarfAbbrevSectionSym =
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001879 emitSectionSym(Asm, TLOF.getDwarfAbbrevSection(), "section_abbrev");
Eric Christopher6eebe472012-12-19 22:02:53 +00001880 if (useSplitDwarf())
1881 DwarfAbbrevDWOSectionSym =
1882 emitSectionSym(Asm, TLOF.getDwarfAbbrevDWOSection(),
1883 "section_abbrev_dwo");
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001884 emitSectionSym(Asm, TLOF.getDwarfARangesSection());
Jim Grosbach1e20b962010-07-21 21:21:52 +00001885
Chris Lattner9c69e285532010-04-04 22:59:04 +00001886 if (const MCSection *MacroInfo = TLOF.getDwarfMacroInfoSection())
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001887 emitSectionSym(Asm, MacroInfo);
Bill Wendling94d04b82009-05-20 23:21:38 +00001888
Eric Christopher7a0103c2013-02-07 21:19:50 +00001889 DwarfLineSectionSym =
1890 emitSectionSym(Asm, TLOF.getDwarfLineSection(), "section_line");
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001891 emitSectionSym(Asm, TLOF.getDwarfLocSection());
Michael Gottesmandc42d032013-09-04 04:39:38 +00001892 if (HasDwarfPubSections) {
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00001893 emitSectionSym(Asm, TLOF.getDwarfPubNamesSection());
Eric Christopher978046b2013-08-26 23:24:31 +00001894 emitSectionSym(Asm, TLOF.getDwarfPubTypesSection());
Michael Gottesmandc42d032013-09-04 04:39:38 +00001895 }
Jim Grosbach1e20b962010-07-21 21:21:52 +00001896 DwarfStrSectionSym =
Eric Christopher64f824c2012-12-27 02:14:01 +00001897 emitSectionSym(Asm, TLOF.getDwarfStrSection(), "info_string");
Eric Christopher9a9e73b2013-04-07 03:43:09 +00001898 if (useSplitDwarf()) {
Eric Christopher64f824c2012-12-27 02:14:01 +00001899 DwarfStrDWOSectionSym =
1900 emitSectionSym(Asm, TLOF.getDwarfStrDWOSection(), "skel_string");
Eric Christopher9a9e73b2013-04-07 03:43:09 +00001901 DwarfAddrSectionSym =
1902 emitSectionSym(Asm, TLOF.getDwarfAddrSection(), "addr_sec");
1903 }
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001904 DwarfDebugRangeSectionSym = emitSectionSym(Asm, TLOF.getDwarfRangesSection(),
Devang Patelf2548ca2010-04-16 23:33:45 +00001905 "debug_range");
Bill Wendling94d04b82009-05-20 23:21:38 +00001906
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001907 DwarfDebugLocSectionSym = emitSectionSym(Asm, TLOF.getDwarfLocSection(),
Devang Patelc3f5f782010-05-25 23:40:22 +00001908 "section_debug_loc");
1909
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001910 TextSectionSym = emitSectionSym(Asm, TLOF.getTextSection(), "text_begin");
1911 emitSectionSym(Asm, TLOF.getDataSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00001912}
1913
Eric Christopherb6dc8652012-11-27 22:43:45 +00001914// Recursively emits a debug information entry.
Eric Christopher6eebe472012-12-19 22:02:53 +00001915void DwarfDebug::emitDIE(DIE *Die, std::vector<DIEAbbrev *> *Abbrevs) {
Bill Wendling94d04b82009-05-20 23:21:38 +00001916 // Get the abbreviation for this DIE.
1917 unsigned AbbrevNumber = Die->getAbbrevNumber();
Eric Christopher6eebe472012-12-19 22:02:53 +00001918 const DIEAbbrev *Abbrev = Abbrevs->at(AbbrevNumber - 1);
Bill Wendling94d04b82009-05-20 23:21:38 +00001919
Bill Wendling94d04b82009-05-20 23:21:38 +00001920 // Emit the code (index) for the abbreviation.
Chris Lattner3f53c832010-04-04 18:52:31 +00001921 if (Asm->isVerbose())
Chris Lattner894d75a2010-01-22 23:18:42 +00001922 Asm->OutStreamer.AddComment("Abbrev [" + Twine(AbbrevNumber) + "] 0x" +
1923 Twine::utohexstr(Die->getOffset()) + ":0x" +
1924 Twine::utohexstr(Die->getSize()) + " " +
1925 dwarf::TagString(Abbrev->getTag()));
Chris Lattner7e1a8f82010-04-04 19:09:29 +00001926 Asm->EmitULEB128(AbbrevNumber);
Bill Wendling94d04b82009-05-20 23:21:38 +00001927
Eric Christopherf7cef702013-03-29 23:34:06 +00001928 const SmallVectorImpl<DIEValue*> &Values = Die->getValues();
1929 const SmallVectorImpl<DIEAbbrevData> &AbbrevData = Abbrev->getData();
Bill Wendling94d04b82009-05-20 23:21:38 +00001930
1931 // Emit the DIE attribute values.
1932 for (unsigned i = 0, N = Values.size(); i < N; ++i) {
1933 unsigned Attr = AbbrevData[i].getAttribute();
1934 unsigned Form = AbbrevData[i].getForm();
1935 assert(Form && "Too many attributes for DIE (check abbreviation)");
1936
Chris Lattner3f53c832010-04-04 18:52:31 +00001937 if (Asm->isVerbose())
Chris Lattnera8013622010-01-24 18:54:17 +00001938 Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr));
Jim Grosbach1e20b962010-07-21 21:21:52 +00001939
Bill Wendling94d04b82009-05-20 23:21:38 +00001940 switch (Attr) {
Bill Wendling94d04b82009-05-20 23:21:38 +00001941 case dwarf::DW_AT_abstract_origin: {
1942 DIEEntry *E = cast<DIEEntry>(Values[i]);
1943 DIE *Origin = E->getEntry();
Devang Patel53bb5c92009-11-10 23:06:00 +00001944 unsigned Addr = Origin->getOffset();
Manman Renbc3e96f2013-03-12 18:27:15 +00001945 if (Form == dwarf::DW_FORM_ref_addr) {
1946 // For DW_FORM_ref_addr, output the offset from beginning of debug info
1947 // section. Origin->getOffset() returns the offset from start of the
1948 // compile unit.
1949 DwarfUnits &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
1950 Addr += Holder.getCUOffset(Origin->getCompileUnit());
1951 }
Manman Ren0e6783f2013-07-02 23:40:10 +00001952 Asm->OutStreamer.EmitIntValue(Addr,
1953 Form == dwarf::DW_FORM_ref_addr ? DIEEntry::getRefAddrSize(Asm) : 4);
Bill Wendling94d04b82009-05-20 23:21:38 +00001954 break;
1955 }
Devang Patelf2548ca2010-04-16 23:33:45 +00001956 case dwarf::DW_AT_ranges: {
1957 // DW_AT_range Value encodes offset in debug_range section.
1958 DIEInteger *V = cast<DIEInteger>(Values[i]);
Devang Patelb1fcfbe2010-09-02 16:43:44 +00001959
Nick Lewyckyffccd922012-06-22 01:25:12 +00001960 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections()) {
Devang Patelb1fcfbe2010-09-02 16:43:44 +00001961 Asm->EmitLabelPlusOffset(DwarfDebugRangeSectionSym,
1962 V->getValue(),
1963 4);
1964 } else {
1965 Asm->EmitLabelOffsetDifference(DwarfDebugRangeSectionSym,
1966 V->getValue(),
1967 DwarfDebugRangeSectionSym,
1968 4);
1969 }
Devang Patelf2548ca2010-04-16 23:33:45 +00001970 break;
1971 }
Devang Patelc3f5f782010-05-25 23:40:22 +00001972 case dwarf::DW_AT_location: {
Nick Lewyckyffccd922012-06-22 01:25:12 +00001973 if (DIELabel *L = dyn_cast<DIELabel>(Values[i])) {
1974 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +00001975 Asm->EmitLabelReference(L->getValue(), 4);
Nick Lewyckyffccd922012-06-22 01:25:12 +00001976 else
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +00001977 Asm->EmitLabelDifference(L->getValue(), DwarfDebugLocSectionSym, 4);
Nick Lewyckyffccd922012-06-22 01:25:12 +00001978 } else {
Devang Patelc3f5f782010-05-25 23:40:22 +00001979 Values[i]->EmitValue(Asm, Form);
Nick Lewyckyffccd922012-06-22 01:25:12 +00001980 }
Devang Patelc3f5f782010-05-25 23:40:22 +00001981 break;
1982 }
Devang Patel2a361602010-09-29 19:08:08 +00001983 case dwarf::DW_AT_accessibility: {
1984 if (Asm->isVerbose()) {
1985 DIEInteger *V = cast<DIEInteger>(Values[i]);
1986 Asm->OutStreamer.AddComment(dwarf::AccessibilityString(V->getValue()));
1987 }
1988 Values[i]->EmitValue(Asm, Form);
1989 break;
1990 }
Bill Wendling94d04b82009-05-20 23:21:38 +00001991 default:
1992 // Emit an attribute using the defined form.
Chris Lattnerd38fee82010-04-05 00:13:49 +00001993 Values[i]->EmitValue(Asm, Form);
Bill Wendling94d04b82009-05-20 23:21:38 +00001994 break;
1995 }
Bill Wendling94d04b82009-05-20 23:21:38 +00001996 }
1997
1998 // Emit the DIE children if any.
1999 if (Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes) {
2000 const std::vector<DIE *> &Children = Die->getChildren();
2001
2002 for (unsigned j = 0, M = Children.size(); j < M; ++j)
Eric Christopher6eebe472012-12-19 22:02:53 +00002003 emitDIE(Children[j], Abbrevs);
Bill Wendling94d04b82009-05-20 23:21:38 +00002004
Chris Lattner3f53c832010-04-04 18:52:31 +00002005 if (Asm->isVerbose())
Chris Lattner233f52b2010-03-09 23:52:58 +00002006 Asm->OutStreamer.AddComment("End Of Children Mark");
2007 Asm->EmitInt8(0);
Bill Wendling94d04b82009-05-20 23:21:38 +00002008 }
2009}
2010
Eric Christopherb1e66d02012-12-15 00:04:07 +00002011// Emit the various dwarf units to the unit section USection with
2012// the abbreviations going into ASection.
2013void DwarfUnits::emitUnits(DwarfDebug *DD,
2014 const MCSection *USection,
2015 const MCSection *ASection,
2016 const MCSymbol *ASectionSym) {
2017 Asm->OutStreamer.SwitchSection(USection);
Eric Christopherf7cef702013-03-29 23:34:06 +00002018 for (SmallVectorImpl<CompileUnit *>::iterator I = CUs.begin(),
Eric Christopherb1e66d02012-12-15 00:04:07 +00002019 E = CUs.end(); I != E; ++I) {
2020 CompileUnit *TheCU = *I;
Devang Patel163a9f72010-05-10 22:49:55 +00002021 DIE *Die = TheCU->getCUDie();
Jim Grosbach1e20b962010-07-21 21:21:52 +00002022
Devang Patel163a9f72010-05-10 22:49:55 +00002023 // Emit the compile units header.
Eric Christopherb1e66d02012-12-15 00:04:07 +00002024 Asm->OutStreamer
2025 .EmitLabel(Asm->GetTempSymbol(USection->getLabelBeginName(),
2026 TheCU->getUniqueID()));
Jim Grosbach1e20b962010-07-21 21:21:52 +00002027
Devang Patel163a9f72010-05-10 22:49:55 +00002028 // Emit size of content not including length itself
2029 unsigned ContentSize = Die->getSize() +
2030 sizeof(int16_t) + // DWARF version number
2031 sizeof(int32_t) + // Offset Into Abbrev. Section
Devang Patel65705d52011-04-13 19:41:17 +00002032 sizeof(int8_t); // Pointer Size (in bytes)
Jim Grosbach1e20b962010-07-21 21:21:52 +00002033
Devang Patel163a9f72010-05-10 22:49:55 +00002034 Asm->OutStreamer.AddComment("Length of Compilation Unit Info");
2035 Asm->EmitInt32(ContentSize);
2036 Asm->OutStreamer.AddComment("DWARF version number");
Manman Ren0e6783f2013-07-02 23:40:10 +00002037 Asm->EmitInt16(DD->getDwarfVersion());
Devang Patel163a9f72010-05-10 22:49:55 +00002038 Asm->OutStreamer.AddComment("Offset Into Abbrev. Section");
Eric Christopherb1e66d02012-12-15 00:04:07 +00002039 Asm->EmitSectionOffset(Asm->GetTempSymbol(ASection->getLabelBeginName()),
2040 ASectionSym);
Devang Patel163a9f72010-05-10 22:49:55 +00002041 Asm->OutStreamer.AddComment("Address Size (in bytes)");
Chandler Carruth426c2bf2012-11-01 09:14:31 +00002042 Asm->EmitInt8(Asm->getDataLayout().getPointerSize());
Jim Grosbach1e20b962010-07-21 21:21:52 +00002043
Eric Christopher6eebe472012-12-19 22:02:53 +00002044 DD->emitDIE(Die, Abbreviations);
Eric Christopherb1e66d02012-12-15 00:04:07 +00002045 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol(USection->getLabelEndName(),
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002046 TheCU->getUniqueID()));
Devang Patel163a9f72010-05-10 22:49:55 +00002047 }
Bill Wendling94d04b82009-05-20 23:21:38 +00002048}
2049
Manman Renbc3e96f2013-03-12 18:27:15 +00002050/// For a given compile unit DIE, returns offset from beginning of debug info.
2051unsigned DwarfUnits::getCUOffset(DIE *Die) {
Manman Ren4c6f8952013-03-13 18:41:27 +00002052 assert(Die->getTag() == dwarf::DW_TAG_compile_unit &&
2053 "Input DIE should be compile unit in getCUOffset.");
Eric Christophera1eacd02013-08-08 01:41:05 +00002054 for (SmallVectorImpl<CompileUnit *>::iterator I = CUs.begin(), E = CUs.end();
2055 I != E; ++I) {
Manman Renbc3e96f2013-03-12 18:27:15 +00002056 CompileUnit *TheCU = *I;
2057 if (TheCU->getCUDie() == Die)
2058 return TheCU->getDebugInfoOffset();
2059 }
Manman Ren4c6f8952013-03-13 18:41:27 +00002060 llvm_unreachable("The compile unit DIE should belong to CUs in DwarfUnits.");
Manman Renbc3e96f2013-03-12 18:27:15 +00002061}
2062
Eric Christopher98e237f2012-11-30 23:59:06 +00002063// Emit the debug info section.
2064void DwarfDebug::emitDebugInfo() {
Eric Christopherb1e66d02012-12-15 00:04:07 +00002065 DwarfUnits &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
2066
2067 Holder.emitUnits(this, Asm->getObjFileLowering().getDwarfInfoSection(),
2068 Asm->getObjFileLowering().getDwarfAbbrevSection(),
2069 DwarfAbbrevSectionSym);
Eric Christopher98e237f2012-11-30 23:59:06 +00002070}
2071
Eric Christopherb6dc8652012-11-27 22:43:45 +00002072// Emit the abbreviation section.
Eric Christopher7dc68db2012-11-20 23:30:11 +00002073void DwarfDebug::emitAbbreviations() {
Eric Christopher6eebe472012-12-19 22:02:53 +00002074 if (!useSplitDwarf())
2075 emitAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevSection(),
2076 &Abbreviations);
2077 else
2078 emitSkeletonAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevSection());
2079}
Bill Wendling94d04b82009-05-20 23:21:38 +00002080
Eric Christopher6eebe472012-12-19 22:02:53 +00002081void DwarfDebug::emitAbbrevs(const MCSection *Section,
2082 std::vector<DIEAbbrev *> *Abbrevs) {
2083 // Check to see if it is worth the effort.
2084 if (!Abbrevs->empty()) {
2085 // Start the debug abbrev section.
2086 Asm->OutStreamer.SwitchSection(Section);
2087
2088 MCSymbol *Begin = Asm->GetTempSymbol(Section->getLabelBeginName());
Eric Christopher44fedba2012-12-13 03:00:38 +00002089 Asm->OutStreamer.EmitLabel(Begin);
Bill Wendling94d04b82009-05-20 23:21:38 +00002090
2091 // For each abbrevation.
Eric Christopher6eebe472012-12-19 22:02:53 +00002092 for (unsigned i = 0, N = Abbrevs->size(); i < N; ++i) {
Bill Wendling94d04b82009-05-20 23:21:38 +00002093 // Get abbreviation data
Eric Christopher6eebe472012-12-19 22:02:53 +00002094 const DIEAbbrev *Abbrev = Abbrevs->at(i);
Bill Wendling94d04b82009-05-20 23:21:38 +00002095
2096 // Emit the abbrevations code (base 1 index.)
Chris Lattner7e1a8f82010-04-04 19:09:29 +00002097 Asm->EmitULEB128(Abbrev->getNumber(), "Abbreviation Code");
Bill Wendling94d04b82009-05-20 23:21:38 +00002098
2099 // Emit the abbreviations data.
Chris Lattnerd38fee82010-04-05 00:13:49 +00002100 Abbrev->Emit(Asm);
Bill Wendling94d04b82009-05-20 23:21:38 +00002101 }
2102
2103 // Mark end of abbreviations.
Chris Lattner7e1a8f82010-04-04 19:09:29 +00002104 Asm->EmitULEB128(0, "EOM(3)");
Bill Wendling94d04b82009-05-20 23:21:38 +00002105
Eric Christopher6eebe472012-12-19 22:02:53 +00002106 MCSymbol *End = Asm->GetTempSymbol(Section->getLabelEndName());
Eric Christopher44fedba2012-12-13 03:00:38 +00002107 Asm->OutStreamer.EmitLabel(End);
Bill Wendling94d04b82009-05-20 23:21:38 +00002108 }
2109}
2110
Eric Christopherb6dc8652012-11-27 22:43:45 +00002111// Emit the last address of the section and the end of the line matrix.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002112void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) {
Bill Wendling94d04b82009-05-20 23:21:38 +00002113 // Define last address of section.
Chris Lattner233f52b2010-03-09 23:52:58 +00002114 Asm->OutStreamer.AddComment("Extended Op");
2115 Asm->EmitInt8(0);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002116
Chris Lattner233f52b2010-03-09 23:52:58 +00002117 Asm->OutStreamer.AddComment("Op size");
Chandler Carruth426c2bf2012-11-01 09:14:31 +00002118 Asm->EmitInt8(Asm->getDataLayout().getPointerSize() + 1);
Chris Lattner233f52b2010-03-09 23:52:58 +00002119 Asm->OutStreamer.AddComment("DW_LNE_set_address");
2120 Asm->EmitInt8(dwarf::DW_LNE_set_address);
2121
2122 Asm->OutStreamer.AddComment("Section end label");
Chris Lattnerd85fc6e2010-03-10 01:17:49 +00002123
Chris Lattnerc0215722010-04-04 19:25:43 +00002124 Asm->OutStreamer.EmitSymbolValue(Asm->GetTempSymbol("section_end",SectionEnd),
Eric Christopherca1dd052013-01-09 01:35:34 +00002125 Asm->getDataLayout().getPointerSize());
Bill Wendling94d04b82009-05-20 23:21:38 +00002126
2127 // Mark end of matrix.
Chris Lattner233f52b2010-03-09 23:52:58 +00002128 Asm->OutStreamer.AddComment("DW_LNE_end_sequence");
2129 Asm->EmitInt8(0);
Chris Lattner0ad9c912010-01-22 22:09:00 +00002130 Asm->EmitInt8(1);
Chris Lattner894d75a2010-01-22 23:18:42 +00002131 Asm->EmitInt8(1);
Bill Wendling94d04b82009-05-20 23:21:38 +00002132}
2133
Eric Christopherb6dc8652012-11-27 22:43:45 +00002134// Emit visible names into a hashed accelerator table section.
Eric Christopher09ac3d82011-11-07 09:24:32 +00002135void DwarfDebug::emitAccelNames() {
Eric Christopher577056f2013-09-05 18:20:16 +00002136 DwarfAccelTable AT(DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset,
Eric Christopher09ac3d82011-11-07 09:24:32 +00002137 dwarf::DW_FORM_data4));
2138 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2139 E = CUMap.end(); I != E; ++I) {
2140 CompileUnit *TheCU = I->second;
Eric Christopher0ffe2b42011-11-10 19:25:34 +00002141 const StringMap<std::vector<DIE*> > &Names = TheCU->getAccelNames();
2142 for (StringMap<std::vector<DIE*> >::const_iterator
Eric Christopher09ac3d82011-11-07 09:24:32 +00002143 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
Benjamin Kramer03406c42013-05-11 18:24:28 +00002144 StringRef Name = GI->getKey();
Eric Christopherfa03db02012-01-06 23:03:34 +00002145 const std::vector<DIE *> &Entities = GI->second;
Eric Christopher0ffe2b42011-11-10 19:25:34 +00002146 for (std::vector<DIE *>::const_iterator DI = Entities.begin(),
2147 DE = Entities.end(); DI != DE; ++DI)
2148 AT.AddName(Name, (*DI));
Eric Christopher09ac3d82011-11-07 09:24:32 +00002149 }
2150 }
2151
2152 AT.FinalizeTable(Asm, "Names");
2153 Asm->OutStreamer.SwitchSection(
2154 Asm->getObjFileLowering().getDwarfAccelNamesSection());
2155 MCSymbol *SectionBegin = Asm->GetTempSymbol("names_begin");
2156 Asm->OutStreamer.EmitLabel(SectionBegin);
2157
2158 // Emit the full data.
Eric Christopher2e5d8702012-12-20 21:58:36 +00002159 AT.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher09ac3d82011-11-07 09:24:32 +00002160}
2161
Eric Christopher72c16552012-12-20 21:58:40 +00002162// Emit objective C classes and categories into a hashed accelerator table
2163// section.
Eric Christopher09ac3d82011-11-07 09:24:32 +00002164void DwarfDebug::emitAccelObjC() {
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;
2170 const StringMap<std::vector<DIE*> > &Names = TheCU->getAccelObjC();
2171 for (StringMap<std::vector<DIE*> >::const_iterator
2172 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 Christopher09ac3d82011-11-07 09:24:32 +00002175 for (std::vector<DIE *>::const_iterator DI = Entities.begin(),
2176 DE = Entities.end(); DI != DE; ++DI)
2177 AT.AddName(Name, (*DI));
2178 }
2179 }
2180
2181 AT.FinalizeTable(Asm, "ObjC");
2182 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering()
2183 .getDwarfAccelObjCSection());
2184 MCSymbol *SectionBegin = Asm->GetTempSymbol("objc_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 Christopherb6dc8652012-11-27 22:43:45 +00002191// Emit namespace dies into a hashed accelerator table.
Eric Christopher09ac3d82011-11-07 09:24:32 +00002192void DwarfDebug::emitAccelNamespaces() {
Eric Christopher577056f2013-09-05 18:20:16 +00002193 DwarfAccelTable AT(DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset,
Eric Christopher09ac3d82011-11-07 09:24:32 +00002194 dwarf::DW_FORM_data4));
2195 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2196 E = CUMap.end(); I != E; ++I) {
2197 CompileUnit *TheCU = I->second;
Eric Christopher8bd36ea2011-11-10 21:47:55 +00002198 const StringMap<std::vector<DIE*> > &Names = TheCU->getAccelNamespace();
2199 for (StringMap<std::vector<DIE*> >::const_iterator
Eric Christopher09ac3d82011-11-07 09:24:32 +00002200 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
Benjamin Kramer03406c42013-05-11 18:24:28 +00002201 StringRef Name = GI->getKey();
Eric Christopherfa03db02012-01-06 23:03:34 +00002202 const std::vector<DIE *> &Entities = GI->second;
Eric Christopher8bd36ea2011-11-10 21:47:55 +00002203 for (std::vector<DIE *>::const_iterator DI = Entities.begin(),
2204 DE = Entities.end(); DI != DE; ++DI)
2205 AT.AddName(Name, (*DI));
Eric Christopher09ac3d82011-11-07 09:24:32 +00002206 }
2207 }
2208
2209 AT.FinalizeTable(Asm, "namespac");
2210 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering()
2211 .getDwarfAccelNamespaceSection());
2212 MCSymbol *SectionBegin = Asm->GetTempSymbol("namespac_begin");
2213 Asm->OutStreamer.EmitLabel(SectionBegin);
2214
2215 // Emit the full data.
Eric Christopher2e5d8702012-12-20 21:58:36 +00002216 AT.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher09ac3d82011-11-07 09:24:32 +00002217}
2218
Eric Christopherb6dc8652012-11-27 22:43:45 +00002219// Emit type dies into a hashed accelerator table.
Eric Christopher09ac3d82011-11-07 09:24:32 +00002220void DwarfDebug::emitAccelTypes() {
Eric Christopherc36145f2012-01-06 04:35:23 +00002221 std::vector<DwarfAccelTable::Atom> Atoms;
Eric Christopher577056f2013-09-05 18:20:16 +00002222 Atoms.push_back(DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset,
Eric Christopherc36145f2012-01-06 04:35:23 +00002223 dwarf::DW_FORM_data4));
Eric Christopher577056f2013-09-05 18:20:16 +00002224 Atoms.push_back(DwarfAccelTable::Atom(dwarf::DW_ATOM_die_tag,
Eric Christopherc36145f2012-01-06 04:35:23 +00002225 dwarf::DW_FORM_data2));
Eric Christopher577056f2013-09-05 18:20:16 +00002226 Atoms.push_back(DwarfAccelTable::Atom(dwarf::DW_ATOM_type_flags,
Eric Christopherc36145f2012-01-06 04:35:23 +00002227 dwarf::DW_FORM_data1));
2228 DwarfAccelTable AT(Atoms);
Eric Christopher09ac3d82011-11-07 09:24:32 +00002229 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2230 E = CUMap.end(); I != E; ++I) {
2231 CompileUnit *TheCU = I->second;
Eric Christopherc36145f2012-01-06 04:35:23 +00002232 const StringMap<std::vector<std::pair<DIE*, unsigned > > > &Names
2233 = TheCU->getAccelTypes();
2234 for (StringMap<std::vector<std::pair<DIE*, unsigned> > >::const_iterator
Eric Christopher09ac3d82011-11-07 09:24:32 +00002235 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
Benjamin Kramer03406c42013-05-11 18:24:28 +00002236 StringRef Name = GI->getKey();
Eric Christopherfa03db02012-01-06 23:03:34 +00002237 const std::vector<std::pair<DIE *, unsigned> > &Entities = GI->second;
Eric Christopherc36145f2012-01-06 04:35:23 +00002238 for (std::vector<std::pair<DIE *, unsigned> >::const_iterator DI
2239 = Entities.begin(), DE = Entities.end(); DI !=DE; ++DI)
2240 AT.AddName(Name, (*DI).first, (*DI).second);
Eric Christopher09ac3d82011-11-07 09:24:32 +00002241 }
2242 }
2243
2244 AT.FinalizeTable(Asm, "types");
2245 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering()
2246 .getDwarfAccelTypesSection());
2247 MCSymbol *SectionBegin = Asm->GetTempSymbol("types_begin");
2248 Asm->OutStreamer.EmitLabel(SectionBegin);
2249
2250 // Emit the full data.
Eric Christopher2e5d8702012-12-20 21:58:36 +00002251 AT.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher09ac3d82011-11-07 09:24:32 +00002252}
2253
Eric Christopher57479322013-09-09 20:03:17 +00002254/// emitDebugPubNames - Emit visible names into a debug pubnames section.
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00002255///
Eric Christopher57479322013-09-09 20:03:17 +00002256void DwarfDebug::emitDebugPubNames() {
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00002257 const MCSection *ISec = Asm->getObjFileLowering().getDwarfInfoSection();
2258
2259 typedef DenseMap<const MDNode*, CompileUnit*> CUMapType;
2260 for (CUMapType::iterator I = CUMap.begin(), E = CUMap.end(); I != E; ++I) {
2261 CompileUnit *TheCU = I->second;
2262 unsigned ID = TheCU->getUniqueID();
2263
2264 if (TheCU->getGlobalNames().empty())
2265 continue;
2266
2267 // Start the dwarf pubnames section.
Eric Christopherf04e4ef2013-08-19 21:07:38 +00002268 Asm->OutStreamer
2269 .SwitchSection(Asm->getObjFileLowering().getDwarfPubNamesSection());
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00002270
2271 Asm->OutStreamer.AddComment("Length of Public Names Info");
2272 Asm->EmitLabelDifference(Asm->GetTempSymbol("pubnames_end", ID),
2273 Asm->GetTempSymbol("pubnames_begin", ID), 4);
2274
2275 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_begin", ID));
2276
2277 Asm->OutStreamer.AddComment("DWARF Version");
David Majnemerd7d43dc2013-08-21 06:13:34 +00002278 Asm->EmitInt16(dwarf::DW_PUBNAMES_VERSION);
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00002279
2280 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
2281 Asm->EmitSectionOffset(Asm->GetTempSymbol(ISec->getLabelBeginName(), ID),
2282 DwarfInfoSectionSym);
2283
2284 Asm->OutStreamer.AddComment("Compilation Unit Length");
2285 Asm->EmitLabelDifference(Asm->GetTempSymbol(ISec->getLabelEndName(), ID),
2286 Asm->GetTempSymbol(ISec->getLabelBeginName(), ID),
2287 4);
2288
2289 const StringMap<DIE*> &Globals = TheCU->getGlobalNames();
2290 for (StringMap<DIE*>::const_iterator
2291 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2292 const char *Name = GI->getKeyData();
2293 const DIE *Entity = GI->second;
2294
2295 Asm->OutStreamer.AddComment("DIE offset");
2296 Asm->EmitInt32(Entity->getOffset());
2297
2298 if (Asm->isVerbose())
2299 Asm->OutStreamer.AddComment("External Name");
Rafael Espindolaa3863ea2013-07-02 15:49:13 +00002300 Asm->OutStreamer.EmitBytes(StringRef(Name, GI->getKeyLength()+1));
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00002301 }
2302
2303 Asm->OutStreamer.AddComment("End Mark");
2304 Asm->EmitInt32(0);
2305 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_end", ID));
2306 }
2307}
2308
Devang Patel193f7202009-11-24 01:14:22 +00002309void DwarfDebug::emitDebugPubTypes() {
Devang Patel163a9f72010-05-10 22:49:55 +00002310 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2311 E = CUMap.end(); I != E; ++I) {
2312 CompileUnit *TheCU = I->second;
Eric Christopher63701182011-11-07 09:18:35 +00002313 // Start the dwarf pubtypes section.
Devang Patel163a9f72010-05-10 22:49:55 +00002314 Asm->OutStreamer.SwitchSection(
2315 Asm->getObjFileLowering().getDwarfPubTypesSection());
2316 Asm->OutStreamer.AddComment("Length of Public Types Info");
2317 Asm->EmitLabelDifference(
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002318 Asm->GetTempSymbol("pubtypes_end", TheCU->getUniqueID()),
2319 Asm->GetTempSymbol("pubtypes_begin", TheCU->getUniqueID()), 4);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002320
Devang Patel163a9f72010-05-10 22:49:55 +00002321 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_begin",
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002322 TheCU->getUniqueID()));
Jim Grosbach1e20b962010-07-21 21:21:52 +00002323
Devang Patel163a9f72010-05-10 22:49:55 +00002324 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DWARF Version");
David Majnemerd7d43dc2013-08-21 06:13:34 +00002325 Asm->EmitInt16(dwarf::DW_PUBTYPES_VERSION);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002326
Devang Patel163a9f72010-05-10 22:49:55 +00002327 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
Eric Christophercf6b8ad2012-12-15 00:04:04 +00002328 const MCSection *ISec = Asm->getObjFileLowering().getDwarfInfoSection();
2329 Asm->EmitSectionOffset(Asm->GetTempSymbol(ISec->getLabelBeginName(),
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002330 TheCU->getUniqueID()),
Devang Patel163a9f72010-05-10 22:49:55 +00002331 DwarfInfoSectionSym);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002332
Devang Patel163a9f72010-05-10 22:49:55 +00002333 Asm->OutStreamer.AddComment("Compilation Unit Length");
Eric Christophercf6b8ad2012-12-15 00:04:04 +00002334 Asm->EmitLabelDifference(Asm->GetTempSymbol(ISec->getLabelEndName(),
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002335 TheCU->getUniqueID()),
Eric Christophercf6b8ad2012-12-15 00:04:04 +00002336 Asm->GetTempSymbol(ISec->getLabelBeginName(),
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002337 TheCU->getUniqueID()),
Devang Patel163a9f72010-05-10 22:49:55 +00002338 4);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002339
Devang Patel163a9f72010-05-10 22:49:55 +00002340 const StringMap<DIE*> &Globals = TheCU->getGlobalTypes();
2341 for (StringMap<DIE*>::const_iterator
2342 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2343 const char *Name = GI->getKeyData();
Nick Lewycky3bbb6f72011-07-29 03:49:23 +00002344 DIE *Entity = GI->second;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002345
Devang Patel163a9f72010-05-10 22:49:55 +00002346 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
2347 Asm->EmitInt32(Entity->getOffset());
Jim Grosbach1e20b962010-07-21 21:21:52 +00002348
Devang Patel163a9f72010-05-10 22:49:55 +00002349 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("External Name");
Benjamin Kramer983c4572011-11-09 18:16:11 +00002350 // Emit the name with a terminating null byte.
Eric Christopher68ca5622013-01-09 01:57:54 +00002351 Asm->OutStreamer.EmitBytes(StringRef(Name, GI->getKeyLength()+1));
Devang Patel163a9f72010-05-10 22:49:55 +00002352 }
Jim Grosbach1e20b962010-07-21 21:21:52 +00002353
Devang Patel163a9f72010-05-10 22:49:55 +00002354 Asm->OutStreamer.AddComment("End Mark");
Jim Grosbach1e20b962010-07-21 21:21:52 +00002355 Asm->EmitInt32(0);
Devang Patel163a9f72010-05-10 22:49:55 +00002356 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_end",
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002357 TheCU->getUniqueID()));
Devang Patel193f7202009-11-24 01:14:22 +00002358 }
Devang Patel193f7202009-11-24 01:14:22 +00002359}
2360
Eric Christopher64f824c2012-12-27 02:14:01 +00002361// Emit strings into a string section.
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002362void DwarfUnits::emitStrings(const MCSection *StrSection,
2363 const MCSection *OffsetSection = NULL,
2364 const MCSymbol *StrSecSym = NULL) {
Eric Christopher64f824c2012-12-27 02:14:01 +00002365
Eric Christopherb6714222013-01-08 22:22:06 +00002366 if (StringPool.empty()) return;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002367
Chris Lattner0d9d70f2010-03-09 23:38:23 +00002368 // Start the dwarf str section.
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002369 Asm->OutStreamer.SwitchSection(StrSection);
Bill Wendling94d04b82009-05-20 23:21:38 +00002370
Chris Lattnerbc733f52010-03-13 02:17:42 +00002371 // Get all of the string pool entries and put them in an array by their ID so
2372 // we can sort them.
Jim Grosbach1e20b962010-07-21 21:21:52 +00002373 SmallVector<std::pair<unsigned,
Eric Christopherff348452013-01-07 22:40:45 +00002374 StringMapEntry<std::pair<MCSymbol*, unsigned> >*>, 64> Entries;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002375
Chris Lattnerbc733f52010-03-13 02:17:42 +00002376 for (StringMap<std::pair<MCSymbol*, unsigned> >::iterator
Eric Christopherb6714222013-01-08 22:22:06 +00002377 I = StringPool.begin(), E = StringPool.end();
Eric Christopher72c16552012-12-20 21:58:40 +00002378 I != E; ++I)
Chris Lattnerbc733f52010-03-13 02:17:42 +00002379 Entries.push_back(std::make_pair(I->second.second, &*I));
Jim Grosbach1e20b962010-07-21 21:21:52 +00002380
Chris Lattnerbc733f52010-03-13 02:17:42 +00002381 array_pod_sort(Entries.begin(), Entries.end());
Jim Grosbach1e20b962010-07-21 21:21:52 +00002382
Chris Lattnerbc733f52010-03-13 02:17:42 +00002383 for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
Chris Lattner0d9d70f2010-03-09 23:38:23 +00002384 // Emit a label for reference from debug information entries.
Chris Lattnerbc733f52010-03-13 02:17:42 +00002385 Asm->OutStreamer.EmitLabel(Entries[i].second->getValue().first);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002386
Benjamin Kramer983c4572011-11-09 18:16:11 +00002387 // Emit the string itself with a terminating null byte.
Benjamin Kramer0c45f7d2011-11-09 12:12:04 +00002388 Asm->OutStreamer.EmitBytes(StringRef(Entries[i].second->getKeyData(),
Eric Christopherca1dd052013-01-09 01:35:34 +00002389 Entries[i].second->getKeyLength()+1));
Bill Wendling94d04b82009-05-20 23:21:38 +00002390 }
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002391
2392 // If we've got an offset section go ahead and emit that now as well.
2393 if (OffsetSection) {
2394 Asm->OutStreamer.SwitchSection(OffsetSection);
2395 unsigned offset = 0;
Eric Christopher72f7bfb2013-01-15 23:56:56 +00002396 unsigned size = 4; // FIXME: DWARF64 is 8.
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002397 for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
Eric Christopher1ced2082013-01-09 03:52:05 +00002398 Asm->OutStreamer.EmitIntValue(offset, size);
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002399 offset += Entries[i].second->getKeyLength() + 1;
2400 }
2401 }
Bill Wendling94d04b82009-05-20 23:21:38 +00002402}
2403
Eric Christopher72f7bfb2013-01-15 23:56:56 +00002404// Emit strings into a string section.
2405void DwarfUnits::emitAddresses(const MCSection *AddrSection) {
2406
2407 if (AddressPool.empty()) return;
2408
2409 // Start the dwarf addr section.
2410 Asm->OutStreamer.SwitchSection(AddrSection);
2411
David Blaikie66f464e2013-07-08 17:51:28 +00002412 // Order the address pool entries by ID
David Blaikie5ce40912013-07-08 17:33:10 +00002413 SmallVector<const MCExpr *, 64> Entries(AddressPool.size());
Eric Christopher72f7bfb2013-01-15 23:56:56 +00002414
David Blaikie66f464e2013-07-08 17:51:28 +00002415 for (DenseMap<const MCExpr *, unsigned>::iterator I = AddressPool.begin(),
2416 E = AddressPool.end();
Eric Christopher72f7bfb2013-01-15 23:56:56 +00002417 I != E; ++I)
David Blaikie5ce40912013-07-08 17:33:10 +00002418 Entries[I->second] = I->first;
Eric Christopher72f7bfb2013-01-15 23:56:56 +00002419
2420 for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
Ulrich Weigand18dbe502013-07-02 18:46:46 +00002421 // Emit an expression for reference from debug information entries.
David Blaikie5ce40912013-07-08 17:33:10 +00002422 if (const MCExpr *Expr = Entries[i])
Ulrich Weigand18dbe502013-07-02 18:46:46 +00002423 Asm->OutStreamer.EmitValue(Expr, Asm->getDataLayout().getPointerSize());
Eric Christopher72f7bfb2013-01-15 23:56:56 +00002424 else
2425 Asm->OutStreamer.EmitIntValue(0, Asm->getDataLayout().getPointerSize());
2426 }
2427
2428}
2429
Eric Christopher64f824c2012-12-27 02:14:01 +00002430// Emit visible names into a debug str section.
2431void DwarfDebug::emitDebugStr() {
2432 DwarfUnits &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
2433 Holder.emitStrings(Asm->getObjFileLowering().getDwarfStrSection());
2434}
2435
Eric Christopherd3b98532013-07-02 21:36:07 +00002436// Emit locations into the debug loc section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002437void DwarfDebug::emitDebugLoc() {
Devang Patel80250682010-05-26 23:55:23 +00002438 if (DotDebugLocEntries.empty())
2439 return;
2440
Eric Christopherf7cef702013-03-29 23:34:06 +00002441 for (SmallVectorImpl<DotDebugLocEntry>::iterator
Devang Patel6c3ea902011-02-04 22:57:18 +00002442 I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
2443 I != E; ++I) {
2444 DotDebugLocEntry &Entry = *I;
2445 if (I + 1 != DotDebugLocEntries.end())
2446 Entry.Merge(I+1);
2447 }
2448
Daniel Dunbar83320a02011-03-16 22:16:39 +00002449 // Start the dwarf loc section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002450 Asm->OutStreamer.SwitchSection(
Devang Patelc3f5f782010-05-25 23:40:22 +00002451 Asm->getObjFileLowering().getDwarfLocSection());
Chandler Carruth426c2bf2012-11-01 09:14:31 +00002452 unsigned char Size = Asm->getDataLayout().getPointerSize();
Devang Patel80250682010-05-26 23:55:23 +00002453 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", 0));
2454 unsigned index = 1;
Eric Christopherf7cef702013-03-29 23:34:06 +00002455 for (SmallVectorImpl<DotDebugLocEntry>::iterator
Jim Grosbach1e20b962010-07-21 21:21:52 +00002456 I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
Devang Patel61409622010-07-07 20:12:52 +00002457 I != E; ++I, ++index) {
Devang Patel6c3ea902011-02-04 22:57:18 +00002458 DotDebugLocEntry &Entry = *I;
2459 if (Entry.isMerged()) continue;
Devang Patelc3f5f782010-05-25 23:40:22 +00002460 if (Entry.isEmpty()) {
Eric Christopherca1dd052013-01-09 01:35:34 +00002461 Asm->OutStreamer.EmitIntValue(0, Size);
2462 Asm->OutStreamer.EmitIntValue(0, Size);
Devang Patel80250682010-05-26 23:55:23 +00002463 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", index));
Devang Patelc3f5f782010-05-25 23:40:22 +00002464 } else {
Eric Christopher0d0782a2013-07-03 22:40:18 +00002465 Asm->OutStreamer.EmitSymbolValue(Entry.getBeginSym(), Size);
2466 Asm->OutStreamer.EmitSymbolValue(Entry.getEndSym(), Size);
2467 DIVariable DV(Entry.getVariable());
Rafael Espindola5b23b7f2011-05-27 22:05:41 +00002468 Asm->OutStreamer.AddComment("Loc expr size");
2469 MCSymbol *begin = Asm->OutStreamer.getContext().CreateTempSymbol();
2470 MCSymbol *end = Asm->OutStreamer.getContext().CreateTempSymbol();
2471 Asm->EmitLabelDifference(end, begin, 2);
2472 Asm->OutStreamer.EmitLabel(begin);
Devang Patel80efd4e2011-07-08 16:49:43 +00002473 if (Entry.isInt()) {
Devang Patelc4329072011-06-01 22:03:25 +00002474 DIBasicType BTy(DV.getType());
2475 if (BTy.Verify() &&
Eric Christopher0f1c7f62012-11-19 22:42:10 +00002476 (BTy.getEncoding() == dwarf::DW_ATE_signed
Devang Patelc4329072011-06-01 22:03:25 +00002477 || BTy.getEncoding() == dwarf::DW_ATE_signed_char)) {
2478 Asm->OutStreamer.AddComment("DW_OP_consts");
2479 Asm->EmitInt8(dwarf::DW_OP_consts);
Devang Patel80efd4e2011-07-08 16:49:43 +00002480 Asm->EmitSLEB128(Entry.getInt());
Devang Patelc4329072011-06-01 22:03:25 +00002481 } else {
2482 Asm->OutStreamer.AddComment("DW_OP_constu");
2483 Asm->EmitInt8(dwarf::DW_OP_constu);
Devang Patel80efd4e2011-07-08 16:49:43 +00002484 Asm->EmitULEB128(Entry.getInt());
Devang Patelc4329072011-06-01 22:03:25 +00002485 }
Devang Patel80efd4e2011-07-08 16:49:43 +00002486 } else if (Entry.isLocation()) {
Eric Christopher7c2f3e82013-07-03 22:40:21 +00002487 MachineLocation Loc = Entry.getLoc();
Eric Christopher0f1c7f62012-11-19 22:42:10 +00002488 if (!DV.hasComplexAddress())
Devang Patel80efd4e2011-07-08 16:49:43 +00002489 // Regular entry.
Eric Christopher7c2f3e82013-07-03 22:40:21 +00002490 Asm->EmitDwarfRegOp(Loc, DV.isIndirect());
Devang Patel80efd4e2011-07-08 16:49:43 +00002491 else {
2492 // Complex address entry.
2493 unsigned N = DV.getNumAddrElements();
2494 unsigned i = 0;
2495 if (N >= 2 && DV.getAddrElement(0) == DIBuilder::OpPlus) {
Eric Christopher7c2f3e82013-07-03 22:40:21 +00002496 if (Loc.getOffset()) {
Devang Patel80efd4e2011-07-08 16:49:43 +00002497 i = 2;
Eric Christopher7c2f3e82013-07-03 22:40:21 +00002498 Asm->EmitDwarfRegOp(Loc, DV.isIndirect());
Devang Patel80efd4e2011-07-08 16:49:43 +00002499 Asm->OutStreamer.AddComment("DW_OP_deref");
2500 Asm->EmitInt8(dwarf::DW_OP_deref);
2501 Asm->OutStreamer.AddComment("DW_OP_plus_uconst");
2502 Asm->EmitInt8(dwarf::DW_OP_plus_uconst);
2503 Asm->EmitSLEB128(DV.getAddrElement(1));
2504 } else {
2505 // If first address element is OpPlus then emit
2506 // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
Eric Christopher7c2f3e82013-07-03 22:40:21 +00002507 MachineLocation TLoc(Loc.getReg(), DV.getAddrElement(1));
2508 Asm->EmitDwarfRegOp(TLoc, DV.isIndirect());
Devang Patel80efd4e2011-07-08 16:49:43 +00002509 i = 2;
2510 }
2511 } else {
Eric Christopher7c2f3e82013-07-03 22:40:21 +00002512 Asm->EmitDwarfRegOp(Loc, DV.isIndirect());
Devang Patel80efd4e2011-07-08 16:49:43 +00002513 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +00002514
Devang Patel80efd4e2011-07-08 16:49:43 +00002515 // Emit remaining complex address elements.
2516 for (; i < N; ++i) {
2517 uint64_t Element = DV.getAddrElement(i);
2518 if (Element == DIBuilder::OpPlus) {
2519 Asm->EmitInt8(dwarf::DW_OP_plus_uconst);
2520 Asm->EmitULEB128(DV.getAddrElement(++i));
Eric Christopher50120762012-05-08 18:56:00 +00002521 } else if (Element == DIBuilder::OpDeref) {
Eric Christopher7c2f3e82013-07-03 22:40:21 +00002522 if (!Loc.isReg())
Eric Christopher50120762012-05-08 18:56:00 +00002523 Asm->EmitInt8(dwarf::DW_OP_deref);
2524 } else
2525 llvm_unreachable("unknown Opcode found in complex address");
Devang Patel80efd4e2011-07-08 16:49:43 +00002526 }
Devang Patelc26f5442011-04-28 02:22:40 +00002527 }
Devang Patelc26f5442011-04-28 02:22:40 +00002528 }
Devang Patel80efd4e2011-07-08 16:49:43 +00002529 // else ... ignore constant fp. There is not any good way to
2530 // to represent them here in dwarf.
Rafael Espindola5b23b7f2011-05-27 22:05:41 +00002531 Asm->OutStreamer.EmitLabel(end);
Devang Patelc3f5f782010-05-25 23:40:22 +00002532 }
2533 }
Bill Wendling94d04b82009-05-20 23:21:38 +00002534}
2535
Eric Christopherb6dc8652012-11-27 22:43:45 +00002536// Emit visible names into a debug aranges section.
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00002537void DwarfDebug::emitDebugARanges() {
Bill Wendling94d04b82009-05-20 23:21:38 +00002538 // Start the dwarf aranges section.
Eric Christopherab6cd832013-08-30 00:39:57 +00002539 Asm->OutStreamer
2540 .SwitchSection(Asm->getObjFileLowering().getDwarfARangesSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002541}
2542
Eric Christopherb6dc8652012-11-27 22:43:45 +00002543// Emit visible names into a debug ranges section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002544void DwarfDebug::emitDebugRanges() {
Bill Wendling94d04b82009-05-20 23:21:38 +00002545 // Start the dwarf ranges section.
Eric Christopherab6cd832013-08-30 00:39:57 +00002546 Asm->OutStreamer
2547 .SwitchSection(Asm->getObjFileLowering().getDwarfRangesSection());
Chandler Carruth426c2bf2012-11-01 09:14:31 +00002548 unsigned char Size = Asm->getDataLayout().getPointerSize();
Eric Christopherf7cef702013-03-29 23:34:06 +00002549 for (SmallVectorImpl<const MCSymbol *>::iterator
Jim Grosbach1e20b962010-07-21 21:21:52 +00002550 I = DebugRangeSymbols.begin(), E = DebugRangeSymbols.end();
Devang Pateleac9c072010-04-27 19:46:33 +00002551 I != E; ++I) {
2552 if (*I)
Eric Christopher1ced2082013-01-09 03:52:05 +00002553 Asm->OutStreamer.EmitSymbolValue(const_cast<MCSymbol*>(*I), Size);
Devang Patelf2548ca2010-04-16 23:33:45 +00002554 else
Eric Christopherca1dd052013-01-09 01:35:34 +00002555 Asm->OutStreamer.EmitIntValue(0, Size);
Devang Patelf2548ca2010-04-16 23:33:45 +00002556 }
Bill Wendling94d04b82009-05-20 23:21:38 +00002557}
2558
Eric Christopherb6dc8652012-11-27 22:43:45 +00002559// Emit visible names into a debug macinfo section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002560void DwarfDebug::emitDebugMacInfo() {
Daniel Dunbarf612ff62009-09-19 20:40:05 +00002561 if (const MCSection *LineInfo =
Chris Lattner18a4c162009-08-02 07:24:22 +00002562 Asm->getObjFileLowering().getDwarfMacroInfoSection()) {
Bill Wendling94d04b82009-05-20 23:21:38 +00002563 // Start the dwarf macinfo section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002564 Asm->OutStreamer.SwitchSection(LineInfo);
Bill Wendling94d04b82009-05-20 23:21:38 +00002565 }
2566}
2567
Eric Christopher0b944ee2012-12-11 19:42:09 +00002568// DWARF5 Experimental Separate Dwarf emitters.
Eric Christopher98e237f2012-11-30 23:59:06 +00002569
2570// This DIE has the following attributes: DW_AT_comp_dir, DW_AT_stmt_list,
2571// DW_AT_low_pc, DW_AT_high_pc, DW_AT_ranges, DW_AT_dwo_name, DW_AT_dwo_id,
2572// DW_AT_ranges_base, DW_AT_addr_base. If DW_AT_ranges is present,
2573// DW_AT_low_pc and DW_AT_high_pc are not used, and vice versa.
Eric Christophera9b2c792013-08-26 23:50:43 +00002574CompileUnit *DwarfDebug::constructSkeletonCU(const CompileUnit *CU) {
Eric Christopher98e237f2012-11-30 23:59:06 +00002575
2576 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
Eric Christophera9b2c792013-08-26 23:50:43 +00002577 CompileUnit *NewCU = new CompileUnit(CU->getUniqueID(), Die, CU->getNode(),
2578 Asm, this, &SkeletonHolder);
Eric Christopher446b88f2013-01-17 03:00:04 +00002579
Eric Christopher3ce51a92013-02-22 23:50:08 +00002580 NewCU->addLocalString(Die, dwarf::DW_AT_GNU_dwo_name,
Eric Christopher30410d52013-08-26 23:57:03 +00002581 DICompileUnit(CU->getNode()).getSplitDebugFilename());
Eric Christopher98e237f2012-11-30 23:59:06 +00002582
Eric Christopher1b0cd2f2013-04-22 07:51:08 +00002583 // Relocate to the beginning of the addr_base section, else 0 for the
2584 // beginning of the one for this compile unit.
Eric Christopher9a9e73b2013-04-07 03:43:09 +00002585 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
2586 NewCU->addLabel(Die, dwarf::DW_AT_GNU_addr_base, dwarf::DW_FORM_sec_offset,
2587 DwarfAddrSectionSym);
2588 else
Eric Christopher1b0cd2f2013-04-22 07:51:08 +00002589 NewCU->addUInt(Die, dwarf::DW_AT_GNU_addr_base,
2590 dwarf::DW_FORM_sec_offset, 0);
Eric Christopher98e237f2012-11-30 23:59:06 +00002591
2592 // 2.17.1 requires that we use DW_AT_low_pc for a single entry point
Eric Christopher72f7bfb2013-01-15 23:56:56 +00002593 // into an entity. We're using 0, or a NULL label for this.
Eric Christopher98e237f2012-11-30 23:59:06 +00002594 NewCU->addUInt(Die, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, 0);
Eric Christopher72f7bfb2013-01-15 23:56:56 +00002595
Eric Christopher98e237f2012-11-30 23:59:06 +00002596 // DW_AT_stmt_list is a offset of line number information for this
2597 // compile unit in debug_line section.
Eric Christopher9a9e73b2013-04-07 03:43:09 +00002598 // FIXME: Should handle multiple compile units.
Eric Christopher98e237f2012-11-30 23:59:06 +00002599 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
Eric Christopher446b88f2013-01-17 03:00:04 +00002600 NewCU->addLabel(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_sec_offset,
Eric Christopher7a0103c2013-02-07 21:19:50 +00002601 DwarfLineSectionSym);
Eric Christopher98e237f2012-11-30 23:59:06 +00002602 else
Eric Christopher446b88f2013-01-17 03:00:04 +00002603 NewCU->addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_sec_offset, 0);
Eric Christopher98e237f2012-11-30 23:59:06 +00002604
2605 if (!CompilationDir.empty())
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002606 NewCU->addLocalString(Die, dwarf::DW_AT_comp_dir, CompilationDir);
Eric Christopher98e237f2012-11-30 23:59:06 +00002607
Eric Christopher0e3e9b72012-12-10 23:34:43 +00002608 SkeletonHolder.addUnit(NewCU);
Eric Christopher01776a52013-02-06 21:53:56 +00002609 SkeletonCUs.push_back(NewCU);
Eric Christopher0e3e9b72012-12-10 23:34:43 +00002610
Eric Christopher98e237f2012-11-30 23:59:06 +00002611 return NewCU;
2612}
2613
Eric Christopher6eebe472012-12-19 22:02:53 +00002614void DwarfDebug::emitSkeletonAbbrevs(const MCSection *Section) {
2615 assert(useSplitDwarf() && "No split dwarf debug info?");
2616 emitAbbrevs(Section, &SkeletonAbbrevs);
Eric Christopher98e237f2012-11-30 23:59:06 +00002617}
2618
Eric Christopher0b944ee2012-12-11 19:42:09 +00002619// Emit the .debug_info.dwo section for separated dwarf. This contains the
2620// compile units that would normally be in debug_info.
Eric Christopher98e237f2012-11-30 23:59:06 +00002621void DwarfDebug::emitDebugInfoDWO() {
Eric Christopher4daaed12012-12-10 19:51:21 +00002622 assert(useSplitDwarf() && "No split dwarf debug info?");
Eric Christopherb1e66d02012-12-15 00:04:07 +00002623 InfoHolder.emitUnits(this, Asm->getObjFileLowering().getDwarfInfoDWOSection(),
Eric Christopher6eebe472012-12-19 22:02:53 +00002624 Asm->getObjFileLowering().getDwarfAbbrevDWOSection(),
2625 DwarfAbbrevDWOSectionSym);
2626}
2627
2628// Emit the .debug_abbrev.dwo section for separated dwarf. This contains the
2629// abbreviations for the .debug_info.dwo section.
2630void DwarfDebug::emitDebugAbbrevDWO() {
2631 assert(useSplitDwarf() && "No split dwarf?");
Eric Christopher72c16552012-12-20 21:58:40 +00002632 emitAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevDWOSection(),
2633 &Abbreviations);
Eric Christopher98e237f2012-11-30 23:59:06 +00002634}
Eric Christopher64f824c2012-12-27 02:14:01 +00002635
2636// Emit the .debug_str.dwo section for separated dwarf. This contains the
2637// string section and is identical in format to traditional .debug_str
2638// sections.
2639void DwarfDebug::emitDebugStrDWO() {
2640 assert(useSplitDwarf() && "No split dwarf?");
Eric Christopherff348452013-01-07 22:40:45 +00002641 const MCSection *OffSec = Asm->getObjFileLowering()
2642 .getDwarfStrOffDWOSection();
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002643 const MCSymbol *StrSym = DwarfStrSectionSym;
2644 InfoHolder.emitStrings(Asm->getObjFileLowering().getDwarfStrDWOSection(),
2645 OffSec, StrSym);
Eric Christopher64f824c2012-12-27 02:14:01 +00002646}