blob: 547d25351806f660ab349b540261d2f6a1a64b7c [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
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +0000772 // Expose as global, if requested.
Eric Christopher63ae7c92013-08-26 23:24:35 +0000773 if (HasDwarfPubSections)
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +0000774 TheCU->addGlobalName(SP.getName(), SubprogramDie);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000775}
776
David Blaikie20d9e412013-05-07 21:35:53 +0000777void DwarfDebug::constructImportedEntityDIE(CompileUnit *TheCU,
David Blaikiec462db62013-04-22 06:12:31 +0000778 const MDNode *N) {
David Blaikie20d9e412013-05-07 21:35:53 +0000779 DIImportedEntity Module(N);
David Blaikiec462db62013-04-22 06:12:31 +0000780 if (!Module.Verify())
781 return;
David Blaikied2e0f7e2013-05-06 23:33:07 +0000782 if (DIE *D = TheCU->getOrCreateContextDIE(Module.getContext()))
David Blaikied1221e32013-05-08 06:01:38 +0000783 constructImportedEntityDIE(TheCU, Module, D);
David Blaikied2e0f7e2013-05-06 23:33:07 +0000784}
785
David Blaikied1221e32013-05-08 06:01:38 +0000786void DwarfDebug::constructImportedEntityDIE(CompileUnit *TheCU, const MDNode *N,
David Blaikied2e0f7e2013-05-06 23:33:07 +0000787 DIE *Context) {
David Blaikie20d9e412013-05-07 21:35:53 +0000788 DIImportedEntity Module(N);
David Blaikied2e0f7e2013-05-06 23:33:07 +0000789 if (!Module.Verify())
790 return;
David Blaikied1221e32013-05-08 06:01:38 +0000791 return constructImportedEntityDIE(TheCU, Module, Context);
David Blaikied2e0f7e2013-05-06 23:33:07 +0000792}
793
David Blaikied1221e32013-05-08 06:01:38 +0000794void DwarfDebug::constructImportedEntityDIE(CompileUnit *TheCU,
David Blaikie20d9e412013-05-07 21:35:53 +0000795 const DIImportedEntity &Module,
David Blaikied2e0f7e2013-05-06 23:33:07 +0000796 DIE *Context) {
797 assert(Module.Verify() &&
798 "Use one of the MDNode * overloads to handle invalid metadata");
799 assert(Context && "Should always have a context for an imported_module");
David Blaikie20d9e412013-05-07 21:35:53 +0000800 DIE *IMDie = new DIE(Module.getTag());
David Blaikiec462db62013-04-22 06:12:31 +0000801 TheCU->insertDIE(Module, IMDie);
David Blaikie20d9e412013-05-07 21:35:53 +0000802 DIE *EntityDie;
803 DIDescriptor Entity = Module.getEntity();
804 if (Entity.isNameSpace())
805 EntityDie = TheCU->getOrCreateNameSpace(DINameSpace(Entity));
806 else if (Entity.isSubprogram())
807 EntityDie = TheCU->getOrCreateSubprogramDIE(DISubprogram(Entity));
David Blaikieaa76a932013-05-08 06:01:41 +0000808 else if (Entity.isType())
809 EntityDie = TheCU->getOrCreateTypeDIE(DIType(Entity));
David Blaikie20d9e412013-05-07 21:35:53 +0000810 else
David Blaikieaa76a932013-05-08 06:01:41 +0000811 EntityDie = TheCU->getDIE(Entity);
David Blaikiec462db62013-04-22 06:12:31 +0000812 unsigned FileID = getOrCreateSourceID(Module.getContext().getFilename(),
813 Module.getContext().getDirectory(),
814 TheCU->getUniqueID());
815 TheCU->addUInt(IMDie, dwarf::DW_AT_decl_file, 0, FileID);
816 TheCU->addUInt(IMDie, dwarf::DW_AT_decl_line, 0, Module.getLineNumber());
Eric Christopherfdfc81f2013-06-24 23:20:02 +0000817 TheCU->addDIEEntry(IMDie, dwarf::DW_AT_import, dwarf::DW_FORM_ref4,
818 EntityDie);
David Blaikie7b72cc72013-05-20 22:50:35 +0000819 StringRef Name = Module.getName();
820 if (!Name.empty())
821 TheCU->addString(IMDie, dwarf::DW_AT_name, Name);
David Blaikied2e0f7e2013-05-06 23:33:07 +0000822 Context->addChild(IMDie);
David Blaikiec462db62013-04-22 06:12:31 +0000823}
824
Eric Christopherb6dc8652012-11-27 22:43:45 +0000825// Emit all Dwarf sections that should come prior to the content. Create
826// global DIEs and emit initial debug info sections. This is invoked by
827// the target AsmPrinter.
Eric Christopherc4639d62012-11-19 22:42:15 +0000828void DwarfDebug::beginModule() {
Devang Pateleac9c072010-04-27 19:46:33 +0000829 if (DisableDebugInfoPrinting)
830 return;
831
Eric Christopherc4639d62012-11-19 22:42:15 +0000832 const Module *M = MMI->getModule();
833
Nick Lewycky3bbb6f72011-07-29 03:49:23 +0000834 // If module has named metadata anchors then use them, otherwise scan the
835 // module using debug info finder to collect debug info.
Devang Patel30692ab2011-05-03 16:45:22 +0000836 NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu");
David Blaikiec0ec8a42013-03-11 23:39:23 +0000837 if (!CU_Nodes)
Devang Patel02e603f2011-08-15 23:47:24 +0000838 return;
Manman Renbc660712013-09-05 18:48:31 +0000839 TypeIdentifierMap = generateDITypeIdentifierMap(CU_Nodes);
Devang Patel30692ab2011-05-03 16:45:22 +0000840
David Blaikiec0ec8a42013-03-11 23:39:23 +0000841 // Emit initial sections so we can reference labels later.
842 emitSectionLabels();
843
844 for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i) {
845 DICompileUnit CUNode(CU_Nodes->getOperand(i));
846 CompileUnit *CU = constructCompileUnit(CUNode);
David Blaikie20d9e412013-05-07 21:35:53 +0000847 DIArray ImportedEntities = CUNode.getImportedEntities();
848 for (unsigned i = 0, e = ImportedEntities.getNumElements(); i != e; ++i)
David Blaikied2e0f7e2013-05-06 23:33:07 +0000849 ScopesWithImportedEntities.push_back(std::make_pair(
David Blaikie20d9e412013-05-07 21:35:53 +0000850 DIImportedEntity(ImportedEntities.getElement(i)).getContext(),
851 ImportedEntities.getElement(i)));
David Blaikied2e0f7e2013-05-06 23:33:07 +0000852 std::sort(ScopesWithImportedEntities.begin(),
Benjamin Kramer0b6962f2013-08-24 12:54:27 +0000853 ScopesWithImportedEntities.end(), less_first());
David Blaikiec0ec8a42013-03-11 23:39:23 +0000854 DIArray GVs = CUNode.getGlobalVariables();
855 for (unsigned i = 0, e = GVs.getNumElements(); i != e; ++i)
856 CU->createGlobalVariableDIE(GVs.getElement(i));
857 DIArray SPs = CUNode.getSubprograms();
858 for (unsigned i = 0, e = SPs.getNumElements(); i != e; ++i)
859 constructSubprogramDIE(CU, SPs.getElement(i));
860 DIArray EnumTypes = CUNode.getEnumTypes();
861 for (unsigned i = 0, e = EnumTypes.getNumElements(); i != e; ++i)
862 CU->getOrCreateTypeDIE(EnumTypes.getElement(i));
863 DIArray RetainedTypes = CUNode.getRetainedTypes();
864 for (unsigned i = 0, e = RetainedTypes.getNumElements(); i != e; ++i)
865 CU->getOrCreateTypeDIE(RetainedTypes.getElement(i));
David Blaikiec462db62013-04-22 06:12:31 +0000866 // Emit imported_modules last so that the relevant context is already
867 // available.
David Blaikie20d9e412013-05-07 21:35:53 +0000868 for (unsigned i = 0, e = ImportedEntities.getNumElements(); i != e; ++i)
869 constructImportedEntityDIE(CU, ImportedEntities.getElement(i));
David Blaikiec0ec8a42013-03-11 23:39:23 +0000870 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000871
Chris Lattnerd850ac72010-04-05 02:19:28 +0000872 // Tell MMI that we have debug info.
873 MMI->setDebugInfoAvailability(true);
Eric Christopher0f1c7f62012-11-19 22:42:10 +0000874
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000875 // Prime section data.
Chris Lattnerf0144122009-07-28 03:13:23 +0000876 SectionMap.insert(Asm->getObjFileLowering().getTextSection());
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000877}
878
Eric Christopher4117bec2012-11-22 00:59:49 +0000879// Attach DW_AT_inline attribute with inlined subprogram DIEs.
880void DwarfDebug::computeInlinedDIEs() {
Devang Patel53bb5c92009-11-10 23:06:00 +0000881 // Attach DW_AT_inline attribute with inlined subprogram DIEs.
882 for (SmallPtrSet<DIE *, 4>::iterator AI = InlinedSubprogramDIEs.begin(),
Eric Christopherbdab8002012-11-27 00:13:51 +0000883 AE = InlinedSubprogramDIEs.end(); AI != AE; ++AI) {
Devang Patel53bb5c92009-11-10 23:06:00 +0000884 DIE *ISP = *AI;
Devang Patel3cbee302011-04-12 22:53:02 +0000885 FirstCU->addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
Devang Patel53bb5c92009-11-10 23:06:00 +0000886 }
Rafael Espindolad1ac3a42011-11-12 01:57:54 +0000887 for (DenseMap<const MDNode *, DIE *>::iterator AI = AbstractSPDies.begin(),
Eric Christopherbdab8002012-11-27 00:13:51 +0000888 AE = AbstractSPDies.end(); AI != AE; ++AI) {
Rafael Espindolad1ac3a42011-11-12 01:57:54 +0000889 DIE *ISP = AI->second;
890 if (InlinedSubprogramDIEs.count(ISP))
891 continue;
892 FirstCU->addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
893 }
Eric Christopher4117bec2012-11-22 00:59:49 +0000894}
895
896// Collect info for variables that were optimized out.
897void DwarfDebug::collectDeadVariables() {
898 const Module *M = MMI->getModule();
899 DenseMap<const MDNode *, LexicalScope *> DeadFnScopeMap;
900
901 if (NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu")) {
902 for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i) {
903 DICompileUnit TheCU(CU_Nodes->getOperand(i));
904 DIArray Subprograms = TheCU.getSubprograms();
905 for (unsigned i = 0, e = Subprograms.getNumElements(); i != e; ++i) {
Eric Christopherbdab8002012-11-27 00:13:51 +0000906 DISubprogram SP(Subprograms.getElement(i));
907 if (ProcessedSPNodes.count(SP) != 0) continue;
Manman Rend03d2b22013-07-08 18:33:29 +0000908 if (!SP.isSubprogram()) continue;
Eric Christopherbdab8002012-11-27 00:13:51 +0000909 if (!SP.isDefinition()) continue;
910 DIArray Variables = SP.getVariables();
911 if (Variables.getNumElements() == 0) continue;
Eric Christopher4117bec2012-11-22 00:59:49 +0000912
Eric Christopherbdab8002012-11-27 00:13:51 +0000913 LexicalScope *Scope =
914 new LexicalScope(NULL, DIDescriptor(SP), NULL, false);
915 DeadFnScopeMap[SP] = Scope;
Eric Christopher4117bec2012-11-22 00:59:49 +0000916
Eric Christopherbdab8002012-11-27 00:13:51 +0000917 // Construct subprogram DIE and add variables DIEs.
918 CompileUnit *SPCU = CUMap.lookup(TheCU);
919 assert(SPCU && "Unable to find Compile Unit!");
920 constructSubprogramDIE(SPCU, SP);
921 DIE *ScopeDIE = SPCU->getDIE(SP);
922 for (unsigned vi = 0, ve = Variables.getNumElements(); vi != ve; ++vi) {
923 DIVariable DV(Variables.getElement(vi));
Manman Rend03d2b22013-07-08 18:33:29 +0000924 if (!DV.isVariable()) continue;
Chandler Carruth05497cc2013-07-27 11:09:58 +0000925 DbgVariable NewVar(DV, NULL);
Eric Christopherbdab8002012-11-27 00:13:51 +0000926 if (DIE *VariableDIE =
Chandler Carruth05497cc2013-07-27 11:09:58 +0000927 SPCU->constructVariableDIE(&NewVar, Scope->isAbstractScope()))
Eric Christopherbdab8002012-11-27 00:13:51 +0000928 ScopeDIE->addChild(VariableDIE);
929 }
Eric Christopher4117bec2012-11-22 00:59:49 +0000930 }
931 }
932 }
933 DeleteContainerSeconds(DeadFnScopeMap);
934}
935
Eric Christopher0d27ca12013-08-08 23:45:55 +0000936// Type Signature [7.27] and ODR Hash code.
Eric Christopher3dee5752013-07-26 17:02:41 +0000937
938/// \brief Grabs the string in whichever attribute is passed in and returns
Eric Christopherb7669132013-08-07 01:18:33 +0000939/// a reference to it. Returns "" if the attribute doesn't exist.
Eric Christopher3dee5752013-07-26 17:02:41 +0000940static StringRef getDIEStringAttr(DIE *Die, unsigned Attr) {
Eric Christopherb7669132013-08-07 01:18:33 +0000941 DIEValue *V = Die->findAttribute(Attr);
Eric Christopher3dee5752013-07-26 17:02:41 +0000942
Eric Christopherb7669132013-08-07 01:18:33 +0000943 if (DIEString *S = dyn_cast_or_null<DIEString>(V))
944 return S->getString();
945
Eric Christopher3dee5752013-07-26 17:02:41 +0000946 return StringRef("");
947}
948
Eric Christopher3dee5752013-07-26 17:02:41 +0000949/// Return true if the current DIE is contained within an anonymous namespace.
950static bool isContainedInAnonNamespace(DIE *Die) {
951 DIE *Parent = Die->getParent();
952
953 while (Parent) {
Eric Christopher86aa03d2013-07-29 23:53:08 +0000954 if (Parent->getTag() == dwarf::DW_TAG_namespace &&
955 getDIEStringAttr(Parent, dwarf::DW_AT_name) == "")
Eric Christopher3dee5752013-07-26 17:02:41 +0000956 return true;
957 Parent = Parent->getParent();
958 }
959
960 return false;
961}
962
Eric Christopher028f3472013-08-07 01:18:24 +0000963/// Test if the current CU language is C++ and that we have
964/// a named type that is not contained in an anonymous namespace.
965static bool shouldAddODRHash(CompileUnit *CU, DIE *Die) {
Eric Christopherf76e1182013-08-07 08:35:10 +0000966 return CU->getLanguage() == dwarf::DW_LANG_C_plus_plus &&
967 getDIEStringAttr(Die, dwarf::DW_AT_name) != "" &&
968 !isContainedInAnonNamespace(Die);
Eric Christopher0d27ca12013-08-08 23:45:55 +0000969}
Eric Christopher028f3472013-08-07 01:18:24 +0000970
Eric Christopher4117bec2012-11-22 00:59:49 +0000971void DwarfDebug::finalizeModuleInfo() {
972 // Collect info for variables that were optimized out.
973 collectDeadVariables();
974
975 // Attach DW_AT_inline attribute with inlined subprogram DIEs.
976 computeInlinedDIEs();
Devang Patel53bb5c92009-11-10 23:06:00 +0000977
Eric Christopherbe482042013-07-29 22:24:32 +0000978 // Split out type units and conditionally add an ODR tag to the split
979 // out type.
Eric Christopher3dee5752013-07-26 17:02:41 +0000980 // FIXME: Do type splitting.
981 for (unsigned i = 0, e = TypeUnits.size(); i != e; ++i) {
Eric Christopher3dee5752013-07-26 17:02:41 +0000982 DIE *Die = TypeUnits[i];
Eric Christopher0d27ca12013-08-08 23:45:55 +0000983 DIEHash Hash;
Eric Christopher028f3472013-08-07 01:18:24 +0000984 // If we've requested ODR hashes and it's applicable for an ODR hash then
985 // add the ODR signature now.
Eric Christopher0d27ca12013-08-08 23:45:55 +0000986 // FIXME: This should be added onto the type unit, not the type, but this
987 // works as an intermediate stage.
Eric Christopher028f3472013-08-07 01:18:24 +0000988 if (GenerateODRHash && shouldAddODRHash(CUMap.begin()->second, Die))
Eric Christopher0d27ca12013-08-08 23:45:55 +0000989 CUMap.begin()->second->addUInt(Die, dwarf::DW_AT_GNU_odr_signature,
990 dwarf::DW_FORM_data8,
991 Hash.computeDIEODRSignature(Die));
Eric Christopher3dee5752013-07-26 17:02:41 +0000992 }
993
Eric Christopherf962c022013-08-12 20:27:48 +0000994 // Handle anything that needs to be done on a per-cu basis.
995 for (DenseMap<const MDNode *, CompileUnit *>::iterator CUI = CUMap.begin(),
996 CUE = CUMap.end();
997 CUI != CUE; ++CUI) {
998 CompileUnit *TheCU = CUI->second;
999 // Emit DW_AT_containing_type attribute to connect types with their
1000 // vtable holding type.
1001 TheCU->constructContainingTypeDIEs();
1002
1003 // If we're splitting the dwarf out now that we've got the entire
1004 // CU then construct a skeleton CU based upon it.
1005 if (useSplitDwarf()) {
Eric Christopher0710bfa2013-08-13 01:21:55 +00001006 uint64_t ID = 0;
1007 if (GenerateCUHash) {
1008 DIEHash CUHash;
1009 ID = CUHash.computeCUSignature(TheCU->getCUDie());
1010 }
Eric Christopherf962c022013-08-12 20:27:48 +00001011 // This should be a unique identifier when we want to build .dwp files.
1012 TheCU->addUInt(TheCU->getCUDie(), dwarf::DW_AT_GNU_dwo_id,
Eric Christopher0710bfa2013-08-13 01:21:55 +00001013 dwarf::DW_FORM_data8, ID);
Eric Christopherf962c022013-08-12 20:27:48 +00001014 // Now construct the skeleton CU associated.
Eric Christophera9b2c792013-08-26 23:50:43 +00001015 CompileUnit *SkCU = constructSkeletonCU(TheCU);
Eric Christopherf962c022013-08-12 20:27:48 +00001016 // This should be a unique identifier when we want to build .dwp files.
1017 SkCU->addUInt(SkCU->getCUDie(), dwarf::DW_AT_GNU_dwo_id,
Eric Christopher0710bfa2013-08-13 01:21:55 +00001018 dwarf::DW_FORM_data8, ID);
Eric Christopherf962c022013-08-12 20:27:48 +00001019 }
1020 }
1021
1022 // Compute DIE offsets and sizes.
Eric Christopher0e3e9b72012-12-10 23:34:43 +00001023 InfoHolder.computeSizeAndOffsets();
1024 if (useSplitDwarf())
1025 SkeletonHolder.computeSizeAndOffsets();
Eric Christopher4117bec2012-11-22 00:59:49 +00001026}
1027
1028void DwarfDebug::endSections() {
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001029 // Standard sections final addresses.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00001030 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getTextSection());
Chris Lattnerc0215722010-04-04 19:25:43 +00001031 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("text_end"));
Chris Lattner6c2f9e12009-08-19 05:49:37 +00001032 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getDataSection());
Chris Lattnerc0215722010-04-04 19:25:43 +00001033 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("data_end"));
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001034
1035 // End text sections.
Benjamin Kramerb4c9d9c2012-10-31 13:45:49 +00001036 for (unsigned I = 0, E = SectionMap.size(); I != E; ++I) {
1037 Asm->OutStreamer.SwitchSection(SectionMap[I]);
1038 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("section_end", I+1));
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001039 }
Eric Christopher4117bec2012-11-22 00:59:49 +00001040}
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001041
Eric Christopherb6dc8652012-11-27 22:43:45 +00001042// Emit all Dwarf sections that should come after the content.
Eric Christopher4117bec2012-11-22 00:59:49 +00001043void DwarfDebug::endModule() {
1044
1045 if (!FirstCU) return;
1046
1047 // End any existing sections.
1048 // TODO: Does this need to happen?
1049 endSections();
1050
1051 // Finalize the debug info for the module.
1052 finalizeModuleInfo();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001053
Eric Christopher4daaed12012-12-10 19:51:21 +00001054 if (!useSplitDwarf()) {
Eric Christopher42885022012-11-27 22:43:42 +00001055 // Emit all the DIEs into a debug info section.
1056 emitDebugInfo();
Eric Christopher74802f72012-11-27 00:41:54 +00001057
Eric Christopher42885022012-11-27 22:43:42 +00001058 // Corresponding abbreviations into a abbrev section.
1059 emitAbbreviations();
1060
1061 // Emit info into a debug loc section.
1062 emitDebugLoc();
1063
1064 // Emit info into a debug aranges section.
1065 emitDebugARanges();
1066
1067 // Emit info into a debug ranges section.
1068 emitDebugRanges();
1069
1070 // Emit info into a debug macinfo section.
1071 emitDebugMacInfo();
1072
Eric Christopher42885022012-11-27 22:43:42 +00001073 } else {
Eric Christopher0b944ee2012-12-11 19:42:09 +00001074 // TODO: Fill this in for separated debug sections and separate
Eric Christopher42885022012-11-27 22:43:42 +00001075 // out information into new sections.
1076
Eric Christopher98e237f2012-11-30 23:59:06 +00001077 // Emit the debug info section and compile units.
Eric Christopher42885022012-11-27 22:43:42 +00001078 emitDebugInfo();
Eric Christopher98e237f2012-11-30 23:59:06 +00001079 emitDebugInfoDWO();
Eric Christopher42885022012-11-27 22:43:42 +00001080
1081 // Corresponding abbreviations into a abbrev section.
1082 emitAbbreviations();
Eric Christopher6eebe472012-12-19 22:02:53 +00001083 emitDebugAbbrevDWO();
Eric Christopher42885022012-11-27 22:43:42 +00001084
1085 // Emit info into a debug loc section.
1086 emitDebugLoc();
1087
1088 // Emit info into a debug aranges section.
1089 emitDebugARanges();
1090
1091 // Emit info into a debug ranges section.
1092 emitDebugRanges();
1093
1094 // Emit info into a debug macinfo section.
1095 emitDebugMacInfo();
1096
Eric Christopher72f7bfb2013-01-15 23:56:56 +00001097 // Emit DWO addresses.
1098 InfoHolder.emitAddresses(Asm->getObjFileLowering().getDwarfAddrSection());
1099
Eric Christopher42885022012-11-27 22:43:42 +00001100 }
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001101
Eric Christopher9d9f5a52012-08-23 07:32:06 +00001102 // Emit info into the dwarf accelerator table sections.
Eric Christopher20f47ab2012-08-23 22:36:40 +00001103 if (useDwarfAccelTables()) {
Eric Christopher09ac3d82011-11-07 09:24:32 +00001104 emitAccelNames();
1105 emitAccelObjC();
1106 emitAccelNamespaces();
1107 emitAccelTypes();
1108 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001109
Eric Christopher26123542013-08-30 00:40:17 +00001110 // Emit the pubnames and pubtypes sections if requested.
1111 if (HasDwarfPubSections) {
Eric Christopher57479322013-09-09 20:03:17 +00001112 emitDebugPubNames();
Eric Christopher360f0062012-08-23 07:10:56 +00001113 emitDebugPubTypes();
Eric Christopher26123542013-08-30 00:40:17 +00001114 }
Devang Patel193f7202009-11-24 01:14:22 +00001115
Eric Christopher42885022012-11-27 22:43:42 +00001116 // Finally emit string information into a string table.
Eric Christopherfcdbecb2012-11-27 06:49:23 +00001117 emitDebugStr();
Eric Christopher64f824c2012-12-27 02:14:01 +00001118 if (useSplitDwarf())
1119 emitDebugStrDWO();
Eric Christopherfcdbecb2012-11-27 06:49:23 +00001120
Devang Patele9a1cca2010-08-02 17:32:15 +00001121 // clean up.
Devang Patel94c7ddb2011-08-16 22:09:43 +00001122 SPMap.clear();
Devang Patel163a9f72010-05-10 22:49:55 +00001123 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
1124 E = CUMap.end(); I != E; ++I)
1125 delete I->second;
Eric Christopher9ec87b32012-12-10 19:51:18 +00001126
Craig Topper2d785db2013-07-03 04:17:25 +00001127 for (SmallVectorImpl<CompileUnit *>::iterator I = SkeletonCUs.begin(),
Eric Christopher01776a52013-02-06 21:53:56 +00001128 E = SkeletonCUs.end(); I != E; ++I)
1129 delete *I;
Eric Christopher9ec87b32012-12-10 19:51:18 +00001130
Eric Christopher98e237f2012-11-30 23:59:06 +00001131 // Reset these for the next Module if we have one.
1132 FirstCU = NULL;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001133}
1134
Eric Christopherb6dc8652012-11-27 22:43:45 +00001135// Find abstract variable, if any, associated with Var.
Devang Patelb549bcf2011-08-10 21:50:54 +00001136DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &DV,
Chris Lattnerde4845c2010-04-02 19:42:39 +00001137 DebugLoc ScopeLoc) {
Devang Patelb549bcf2011-08-10 21:50:54 +00001138 LLVMContext &Ctx = DV->getContext();
1139 // More then one inlined variable corresponds to one abstract variable.
1140 DIVariable Var = cleanseInlinedVariable(DV, Ctx);
Devang Patel2db49d72010-05-07 18:11:54 +00001141 DbgVariable *AbsDbgVariable = AbstractVariables.lookup(Var);
Devang Patel53bb5c92009-11-10 23:06:00 +00001142 if (AbsDbgVariable)
1143 return AbsDbgVariable;
1144
Devang Patelbf47fdb2011-08-10 20:55:27 +00001145 LexicalScope *Scope = LScopes.findAbstractScope(ScopeLoc.getScope(Ctx));
Devang Patel53bb5c92009-11-10 23:06:00 +00001146 if (!Scope)
1147 return NULL;
1148
Devang Patel5a1a67c2011-08-15 19:01:20 +00001149 AbsDbgVariable = new DbgVariable(Var, NULL);
Devang Patelbf47fdb2011-08-10 20:55:27 +00001150 addScopeVariable(Scope, AbsDbgVariable);
Devang Patel2db49d72010-05-07 18:11:54 +00001151 AbstractVariables[Var] = AbsDbgVariable;
Devang Patel53bb5c92009-11-10 23:06:00 +00001152 return AbsDbgVariable;
1153}
1154
Eric Christopherb6dc8652012-11-27 22:43:45 +00001155// If Var is a current function argument then add it to CurrentFnArguments list.
Devang Patel0478c152011-03-01 22:58:55 +00001156bool DwarfDebug::addCurrentFnArgument(const MachineFunction *MF,
Devang Patelbf47fdb2011-08-10 20:55:27 +00001157 DbgVariable *Var, LexicalScope *Scope) {
1158 if (!LScopes.isCurrentFunctionScope(Scope))
Devang Patel0478c152011-03-01 22:58:55 +00001159 return false;
1160 DIVariable DV = Var->getVariable();
1161 if (DV.getTag() != dwarf::DW_TAG_arg_variable)
1162 return false;
1163 unsigned ArgNo = DV.getArgNumber();
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001164 if (ArgNo == 0)
Devang Patel0478c152011-03-01 22:58:55 +00001165 return false;
1166
Devang Patelcb3a6572011-03-03 20:02:02 +00001167 size_t Size = CurrentFnArguments.size();
1168 if (Size == 0)
Devang Patel0478c152011-03-01 22:58:55 +00001169 CurrentFnArguments.resize(MF->getFunction()->arg_size());
Devang Patelbbd0f452011-03-03 21:49:41 +00001170 // llvm::Function argument size is not good indicator of how many
Devang Patel6f676be2011-03-03 20:08:10 +00001171 // arguments does the function have at source level.
1172 if (ArgNo > Size)
Devang Patelcb3a6572011-03-03 20:02:02 +00001173 CurrentFnArguments.resize(ArgNo * 2);
Devang Patel0478c152011-03-01 22:58:55 +00001174 CurrentFnArguments[ArgNo - 1] = Var;
1175 return true;
1176}
1177
Eric Christopherb6dc8652012-11-27 22:43:45 +00001178// Collect variable information from side table maintained by MMI.
Jim Grosbach1e20b962010-07-21 21:21:52 +00001179void
Nick Lewycky3bbb6f72011-07-29 03:49:23 +00001180DwarfDebug::collectVariableInfoFromMMITable(const MachineFunction *MF,
Devang Patelee432862010-05-20 19:57:06 +00001181 SmallPtrSet<const MDNode *, 16> &Processed) {
Devang Patele717faa2009-10-06 01:26:37 +00001182 MachineModuleInfo::VariableDbgInfoMapTy &VMap = MMI->getVariableDbgInfo();
1183 for (MachineModuleInfo::VariableDbgInfoMapTy::iterator VI = VMap.begin(),
1184 VE = VMap.end(); VI != VE; ++VI) {
Devang Patele9f8f5e2010-05-07 20:54:48 +00001185 const MDNode *Var = VI->first;
Devang Patel53bb5c92009-11-10 23:06:00 +00001186 if (!Var) continue;
Devang Patel98e1cac2010-05-14 21:01:35 +00001187 Processed.insert(Var);
Chris Lattnerde4845c2010-04-02 19:42:39 +00001188 DIVariable DV(Var);
1189 const std::pair<unsigned, DebugLoc> &VP = VI->second;
Devang Patel53bb5c92009-11-10 23:06:00 +00001190
Devang Patelbf47fdb2011-08-10 20:55:27 +00001191 LexicalScope *Scope = LScopes.findLexicalScope(VP.second);
Jim Grosbach1e20b962010-07-21 21:21:52 +00001192
Devang Patelfb0ee432009-11-10 23:20:04 +00001193 // If variable scope is not found then skip this variable.
Chris Lattnerde4845c2010-04-02 19:42:39 +00001194 if (Scope == 0)
Devang Patelfb0ee432009-11-10 23:20:04 +00001195 continue;
Devang Patel53bb5c92009-11-10 23:06:00 +00001196
Devang Patel26c1e562010-05-20 16:36:41 +00001197 DbgVariable *AbsDbgVariable = findAbstractVariable(DV, VP.second);
Devang Patel5a1a67c2011-08-15 19:01:20 +00001198 DbgVariable *RegVar = new DbgVariable(DV, AbsDbgVariable);
Devang Patelff9dd0a2011-08-15 21:24:36 +00001199 RegVar->setFrameIndex(VP.first);
Devang Patel0478c152011-03-01 22:58:55 +00001200 if (!addCurrentFnArgument(MF, RegVar, Scope))
Devang Patelbf47fdb2011-08-10 20:55:27 +00001201 addScopeVariable(Scope, RegVar);
Devang Patel5a1a67c2011-08-15 19:01:20 +00001202 if (AbsDbgVariable)
Devang Patelff9dd0a2011-08-15 21:24:36 +00001203 AbsDbgVariable->setFrameIndex(VP.first);
Devang Patele717faa2009-10-06 01:26:37 +00001204 }
Devang Patelee432862010-05-20 19:57:06 +00001205}
Devang Patel90a48ad2010-03-15 18:33:46 +00001206
Eric Christopherb6dc8652012-11-27 22:43:45 +00001207// Return true if debug value, encoded by DBG_VALUE instruction, is in a
1208// defined reg.
Devang Patelc3f5f782010-05-25 23:40:22 +00001209static bool isDbgValueInDefinedReg(const MachineInstr *MI) {
Nick Lewycky746cb672011-10-26 22:55:33 +00001210 assert(MI->isDebugValue() && "Invalid DBG_VALUE machine instruction!");
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001211 return MI->getNumOperands() == 3 &&
1212 MI->getOperand(0).isReg() && MI->getOperand(0).getReg() &&
Adrian Prantl35176402013-07-09 20:28:37 +00001213 (MI->getOperand(1).isImm() ||
1214 (MI->getOperand(1).isReg() && MI->getOperand(1).getReg() == 0U));
Devang Patelc3f5f782010-05-25 23:40:22 +00001215}
1216
Eric Christopherb6dc8652012-11-27 22:43:45 +00001217// Get .debug_loc entry for the instruction range starting at MI.
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001218static DotDebugLocEntry getDebugLocEntry(AsmPrinter *Asm,
1219 const MCSymbol *FLabel,
Devang Patel90b40412011-07-08 17:09:57 +00001220 const MCSymbol *SLabel,
1221 const MachineInstr *MI) {
1222 const MDNode *Var = MI->getOperand(MI->getNumOperands() - 1).getMetadata();
1223
David Blaikie6d9dbd52013-06-16 20:34:15 +00001224 assert(MI->getNumOperands() == 3);
Adrian Prantl35176402013-07-09 20:28:37 +00001225 if (MI->getOperand(0).isReg()) {
Devang Patel90b40412011-07-08 17:09:57 +00001226 MachineLocation MLoc;
Adrian Prantl35176402013-07-09 20:28:37 +00001227 // If the second operand is an immediate, this is a
1228 // register-indirect address.
1229 if (!MI->getOperand(1).isImm())
Adrian Prantl13131e62013-04-26 21:57:17 +00001230 MLoc.set(MI->getOperand(0).getReg());
1231 else
1232 MLoc.set(MI->getOperand(0).getReg(), MI->getOperand(1).getImm());
Devang Patel90b40412011-07-08 17:09:57 +00001233 return DotDebugLocEntry(FLabel, SLabel, MLoc, Var);
1234 }
1235 if (MI->getOperand(0).isImm())
1236 return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getImm());
1237 if (MI->getOperand(0).isFPImm())
1238 return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getFPImm());
1239 if (MI->getOperand(0).isCImm())
1240 return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getCImm());
1241
Craig Topper5e25ee82012-02-05 08:31:47 +00001242 llvm_unreachable("Unexpected 3 operand DBG_VALUE instruction!");
Devang Patel90b40412011-07-08 17:09:57 +00001243}
1244
Eric Christopherb6dc8652012-11-27 22:43:45 +00001245// Find variables for each lexical scope.
Jim Grosbach1e20b962010-07-21 21:21:52 +00001246void
Devang Patel78e127d2010-06-25 22:07:34 +00001247DwarfDebug::collectVariableInfo(const MachineFunction *MF,
1248 SmallPtrSet<const MDNode *, 16> &Processed) {
Jim Grosbach1e20b962010-07-21 21:21:52 +00001249
Eric Christopher4e976452013-07-03 21:37:03 +00001250 // Grab the variable info that was squirreled away in the MMI side-table.
Devang Patelee432862010-05-20 19:57:06 +00001251 collectVariableInfoFromMMITable(MF, Processed);
1252
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001253 for (SmallVectorImpl<const MDNode*>::const_iterator
1254 UVI = UserVariables.begin(), UVE = UserVariables.end(); UVI != UVE;
1255 ++UVI) {
1256 const MDNode *Var = *UVI;
1257 if (Processed.count(Var))
Devang Patelee432862010-05-20 19:57:06 +00001258 continue;
1259
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001260 // History contains relevant DBG_VALUE instructions for Var and instructions
1261 // clobbering it.
1262 SmallVectorImpl<const MachineInstr*> &History = DbgValues[Var];
1263 if (History.empty())
1264 continue;
1265 const MachineInstr *MInsn = History.front();
Devang Patelc3f5f782010-05-25 23:40:22 +00001266
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001267 DIVariable DV(Var);
Devang Patelbf47fdb2011-08-10 20:55:27 +00001268 LexicalScope *Scope = NULL;
Devang Pateld8720f42010-05-27 20:25:04 +00001269 if (DV.getTag() == dwarf::DW_TAG_arg_variable &&
1270 DISubprogram(DV.getContext()).describes(MF->getFunction()))
Devang Patelbf47fdb2011-08-10 20:55:27 +00001271 Scope = LScopes.getCurrentFunctionScope();
David Blaikiec0ec8a42013-03-11 23:39:23 +00001272 else if (MDNode *IA = DV.getInlinedAt())
1273 Scope = LScopes.findInlinedScope(DebugLoc::getFromDILocation(IA));
1274 else
1275 Scope = LScopes.findLexicalScope(cast<MDNode>(DV->getOperand(1)));
Devang Patelee432862010-05-20 19:57:06 +00001276 // If variable scope is not found then skip this variable.
Devang Patelc0c5a262010-05-21 00:10:20 +00001277 if (!Scope)
Devang Patelee432862010-05-20 19:57:06 +00001278 continue;
1279
1280 Processed.insert(DV);
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001281 assert(MInsn->isDebugValue() && "History must begin with debug value");
Devang Patel5a1a67c2011-08-15 19:01:20 +00001282 DbgVariable *AbsVar = findAbstractVariable(DV, MInsn->getDebugLoc());
1283 DbgVariable *RegVar = new DbgVariable(DV, AbsVar);
Devang Patel0478c152011-03-01 22:58:55 +00001284 if (!addCurrentFnArgument(MF, RegVar, Scope))
Devang Patelbf47fdb2011-08-10 20:55:27 +00001285 addScopeVariable(Scope, RegVar);
Devang Patel5a1a67c2011-08-15 19:01:20 +00001286 if (AbsVar)
Devang Patelff9dd0a2011-08-15 21:24:36 +00001287 AbsVar->setMInsn(MInsn);
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001288
Eric Christopherc56e3f02012-10-08 20:48:54 +00001289 // Simplify ranges that are fully coalesced.
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001290 if (History.size() <= 1 || (History.size() == 2 &&
1291 MInsn->isIdenticalTo(History.back()))) {
Devang Patelff9dd0a2011-08-15 21:24:36 +00001292 RegVar->setMInsn(MInsn);
Devang Patelc3f5f782010-05-25 23:40:22 +00001293 continue;
1294 }
1295
Eric Christopher498703b2013-01-28 17:33:26 +00001296 // Handle multiple DBG_VALUE instructions describing one variable.
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001297 RegVar->setDotDebugLocOffset(DotDebugLocEntries.size());
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001298
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001299 for (SmallVectorImpl<const MachineInstr*>::const_iterator
1300 HI = History.begin(), HE = History.end(); HI != HE; ++HI) {
1301 const MachineInstr *Begin = *HI;
1302 assert(Begin->isDebugValue() && "Invalid History entry");
Jakob Stoklund Olesene17232e2011-03-22 00:21:41 +00001303
Devang Patel4ada1d72011-06-01 23:00:17 +00001304 // Check if DBG_VALUE is truncating a range.
1305 if (Begin->getNumOperands() > 1 && Begin->getOperand(0).isReg()
1306 && !Begin->getOperand(0).getReg())
1307 continue;
1308
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001309 // Compute the range for a register location.
1310 const MCSymbol *FLabel = getLabelBeforeInsn(Begin);
1311 const MCSymbol *SLabel = 0;
1312
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001313 if (HI + 1 == HE)
1314 // If Begin is the last instruction in History then its value is valid
Chris Lattner7a2bdde2011-04-15 05:18:47 +00001315 // until the end of the function.
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001316 SLabel = FunctionEndSym;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001317 else {
1318 const MachineInstr *End = HI[1];
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001319 DEBUG(dbgs() << "DotDebugLoc Pair:\n"
Devang Patel476df5f2011-07-07 21:44:42 +00001320 << "\t" << *Begin << "\t" << *End << "\n");
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001321 if (End->isDebugValue())
1322 SLabel = getLabelBeforeInsn(End);
1323 else {
1324 // End is a normal instruction clobbering the range.
1325 SLabel = getLabelAfterInsn(End);
1326 assert(SLabel && "Forgot label after clobber instruction");
1327 ++HI;
1328 }
1329 }
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001330
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001331 // The value is valid until the next DBG_VALUE or clobber.
Eric Christopherabbb2002011-12-16 23:42:31 +00001332 DotDebugLocEntries.push_back(getDebugLocEntry(Asm, FLabel, SLabel,
1333 Begin));
Devang Patelc3f5f782010-05-25 23:40:22 +00001334 }
1335 DotDebugLocEntries.push_back(DotDebugLocEntry());
Devang Patel90a48ad2010-03-15 18:33:46 +00001336 }
Devang Patel98e1cac2010-05-14 21:01:35 +00001337
1338 // Collect info for variables that were optimized out.
Devang Patel93d39be2011-08-19 23:28:12 +00001339 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
1340 DIArray Variables = DISubprogram(FnScope->getScopeNode()).getVariables();
1341 for (unsigned i = 0, e = Variables.getNumElements(); i != e; ++i) {
1342 DIVariable DV(Variables.getElement(i));
Manman Rend03d2b22013-07-08 18:33:29 +00001343 if (!DV || !DV.isVariable() || !Processed.insert(DV))
Devang Patel93d39be2011-08-19 23:28:12 +00001344 continue;
1345 if (LexicalScope *Scope = LScopes.findLexicalScope(DV.getContext()))
1346 addScopeVariable(Scope, new DbgVariable(DV, NULL));
Devang Patel98e1cac2010-05-14 21:01:35 +00001347 }
Devang Patelc3f5f782010-05-25 23:40:22 +00001348}
Devang Patel98e1cac2010-05-14 21:01:35 +00001349
Eric Christopherb6dc8652012-11-27 22:43:45 +00001350// Return Label preceding the instruction.
Eric Christopher72f7bfb2013-01-15 23:56:56 +00001351MCSymbol *DwarfDebug::getLabelBeforeInsn(const MachineInstr *MI) {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001352 MCSymbol *Label = LabelsBeforeInsn.lookup(MI);
1353 assert(Label && "Didn't insert label before instruction");
1354 return Label;
Devang Patelc3f5f782010-05-25 23:40:22 +00001355}
1356
Eric Christopherb6dc8652012-11-27 22:43:45 +00001357// Return Label immediately following the instruction.
Eric Christopher72f7bfb2013-01-15 23:56:56 +00001358MCSymbol *DwarfDebug::getLabelAfterInsn(const MachineInstr *MI) {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001359 return LabelsAfterInsn.lookup(MI);
Devang Patele717faa2009-10-06 01:26:37 +00001360}
1361
Eric Christopherb6dc8652012-11-27 22:43:45 +00001362// Process beginning of an instruction.
Devang Patelcbbe2872010-10-26 17:49:02 +00001363void DwarfDebug::beginInstruction(const MachineInstr *MI) {
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001364 // Check if source location changes, but ignore DBG_VALUE locations.
1365 if (!MI->isDebugValue()) {
1366 DebugLoc DL = MI->getDebugLoc();
1367 if (DL != PrevInstLoc && (!DL.isUnknown() || UnknownLocations)) {
Eric Christopher60b35f42012-04-05 20:39:05 +00001368 unsigned Flags = 0;
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001369 PrevInstLoc = DL;
Devang Patel4243e672011-05-11 19:22:19 +00001370 if (DL == PrologEndLoc) {
1371 Flags |= DWARF2_FLAG_PROLOGUE_END;
1372 PrologEndLoc = DebugLoc();
1373 }
Eric Christopher60b35f42012-04-05 20:39:05 +00001374 if (PrologEndLoc.isUnknown())
1375 Flags |= DWARF2_FLAG_IS_STMT;
1376
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001377 if (!DL.isUnknown()) {
1378 const MDNode *Scope = DL.getScope(Asm->MF->getFunction()->getContext());
Devang Patel4243e672011-05-11 19:22:19 +00001379 recordSourceLine(DL.getLine(), DL.getCol(), Scope, Flags);
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001380 } else
Devang Patel4243e672011-05-11 19:22:19 +00001381 recordSourceLine(0, 0, 0, 0);
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001382 }
Devang Patelc3f5f782010-05-25 23:40:22 +00001383 }
Devang Patelaead63c2010-03-29 22:59:58 +00001384
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001385 // Insert labels where requested.
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001386 DenseMap<const MachineInstr*, MCSymbol*>::iterator I =
1387 LabelsBeforeInsn.find(MI);
1388
1389 // No label needed.
1390 if (I == LabelsBeforeInsn.end())
1391 return;
1392
1393 // Label already assigned.
1394 if (I->second)
Devang Patelb2b31a62010-05-26 19:37:24 +00001395 return;
Devang Patel553881b2010-03-29 17:20:31 +00001396
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001397 if (!PrevLabel) {
Devang Patel77051f52010-05-26 21:23:46 +00001398 PrevLabel = MMI->getContext().CreateTempSymbol();
1399 Asm->OutStreamer.EmitLabel(PrevLabel);
Devang Patelb2b31a62010-05-26 19:37:24 +00001400 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001401 I->second = PrevLabel;
Devang Patel0d20ac82009-10-06 01:50:42 +00001402}
1403
Eric Christopherb6dc8652012-11-27 22:43:45 +00001404// Process end of an instruction.
Devang Patelcbbe2872010-10-26 17:49:02 +00001405void DwarfDebug::endInstruction(const MachineInstr *MI) {
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001406 // Don't create a new label after DBG_VALUE instructions.
1407 // They don't generate code.
1408 if (!MI->isDebugValue())
1409 PrevLabel = 0;
1410
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001411 DenseMap<const MachineInstr*, MCSymbol*>::iterator I =
1412 LabelsAfterInsn.find(MI);
1413
1414 // No label needed.
1415 if (I == LabelsAfterInsn.end())
1416 return;
1417
1418 // Label already assigned.
1419 if (I->second)
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001420 return;
1421
1422 // We need a label after this instruction.
1423 if (!PrevLabel) {
1424 PrevLabel = MMI->getContext().CreateTempSymbol();
1425 Asm->OutStreamer.EmitLabel(PrevLabel);
Devang Patel1c246352010-04-08 16:50:29 +00001426 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001427 I->second = PrevLabel;
Devang Patel53bb5c92009-11-10 23:06:00 +00001428}
1429
Eric Christopherb6dc8652012-11-27 22:43:45 +00001430// Each LexicalScope has first instruction and last instruction to mark
1431// beginning and end of a scope respectively. Create an inverse map that list
1432// scopes starts (and ends) with an instruction. One instruction may start (or
1433// end) multiple scopes. Ignore scopes that are not reachable.
Devang Patele37b0c62010-04-08 18:43:56 +00001434void DwarfDebug::identifyScopeMarkers() {
Devang Patelbf47fdb2011-08-10 20:55:27 +00001435 SmallVector<LexicalScope *, 4> WorkList;
1436 WorkList.push_back(LScopes.getCurrentFunctionScope());
Devang Patel42aafd72010-01-20 02:05:23 +00001437 while (!WorkList.empty()) {
Devang Patelbf47fdb2011-08-10 20:55:27 +00001438 LexicalScope *S = WorkList.pop_back_val();
Jim Grosbach1e20b962010-07-21 21:21:52 +00001439
Craig Topper9f43ac62013-07-03 04:24:43 +00001440 const SmallVectorImpl<LexicalScope *> &Children = S->getChildren();
Jim Grosbach1e20b962010-07-21 21:21:52 +00001441 if (!Children.empty())
Craig Topper2d785db2013-07-03 04:17:25 +00001442 for (SmallVectorImpl<LexicalScope *>::const_iterator SI = Children.begin(),
Devang Patel42aafd72010-01-20 02:05:23 +00001443 SE = Children.end(); SI != SE; ++SI)
1444 WorkList.push_back(*SI);
1445
Devang Patel53bb5c92009-11-10 23:06:00 +00001446 if (S->isAbstractScope())
1447 continue;
Jim Grosbach1e20b962010-07-21 21:21:52 +00001448
Craig Topper9f43ac62013-07-03 04:24:43 +00001449 const SmallVectorImpl<InsnRange> &Ranges = S->getRanges();
Devang Pateleac9c072010-04-27 19:46:33 +00001450 if (Ranges.empty())
1451 continue;
Craig Topper2d785db2013-07-03 04:17:25 +00001452 for (SmallVectorImpl<InsnRange>::const_iterator RI = Ranges.begin(),
Devang Pateleac9c072010-04-27 19:46:33 +00001453 RE = Ranges.end(); RI != RE; ++RI) {
Devang Patelbf47fdb2011-08-10 20:55:27 +00001454 assert(RI->first && "InsnRange does not have first instruction!");
1455 assert(RI->second && "InsnRange does not have second instruction!");
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001456 requestLabelBeforeInsn(RI->first);
1457 requestLabelAfterInsn(RI->second);
Devang Pateleac9c072010-04-27 19:46:33 +00001458 }
Devang Patelaf9e8472009-10-01 20:31:14 +00001459 }
Devang Patelaf9e8472009-10-01 20:31:14 +00001460}
1461
Eric Christopherb6dc8652012-11-27 22:43:45 +00001462// Get MDNode for DebugLoc's scope.
Devang Patela3f48672011-05-09 22:14:49 +00001463static MDNode *getScopeNode(DebugLoc DL, const LLVMContext &Ctx) {
1464 if (MDNode *InlinedAt = DL.getInlinedAt(Ctx))
1465 return getScopeNode(DebugLoc::getFromDILocation(InlinedAt), Ctx);
1466 return DL.getScope(Ctx);
1467}
1468
Eric Christopherb6dc8652012-11-27 22:43:45 +00001469// Walk up the scope chain of given debug loc and find line number info
1470// for the function.
Devang Patel4243e672011-05-11 19:22:19 +00001471static DebugLoc getFnDebugLoc(DebugLoc DL, const LLVMContext &Ctx) {
1472 const MDNode *Scope = getScopeNode(DL, Ctx);
1473 DISubprogram SP = getDISubprogram(Scope);
Manman Rend03d2b22013-07-08 18:33:29 +00001474 if (SP.isSubprogram()) {
Eric Christopher6126a1e2012-04-03 00:43:49 +00001475 // Check for number of operands since the compatibility is
1476 // cheap here.
Eric Christopherfa5b0502012-04-03 17:55:42 +00001477 if (SP->getNumOperands() > 19)
Eric Christopher6126a1e2012-04-03 00:43:49 +00001478 return DebugLoc::get(SP.getScopeLineNumber(), 0, SP);
1479 else
1480 return DebugLoc::get(SP.getLineNumber(), 0, SP);
1481 }
1482
Devang Patel4243e672011-05-11 19:22:19 +00001483 return DebugLoc();
1484}
1485
Eric Christopherb6dc8652012-11-27 22:43:45 +00001486// Gather pre-function debug information. Assumes being called immediately
1487// after the function entry point has been emitted.
Chris Lattnereec791a2010-01-26 23:18:02 +00001488void DwarfDebug::beginFunction(const MachineFunction *MF) {
Chris Lattner994cb122010-04-05 03:52:55 +00001489 if (!MMI->hasDebugInfo()) return;
Devang Patelbf47fdb2011-08-10 20:55:27 +00001490 LScopes.initialize(*MF);
1491 if (LScopes.empty()) return;
1492 identifyScopeMarkers();
Devang Patel60b35bd2009-10-06 18:37:31 +00001493
Manman Ren43213cf2013-02-05 21:52:47 +00001494 // Set DwarfCompileUnitID in MCContext to the Compile Unit this function
1495 // belongs to.
1496 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
1497 CompileUnit *TheCU = SPMap.lookup(FnScope->getScopeNode());
1498 assert(TheCU && "Unable to find compile unit!");
Manman Ren01cb18e2013-05-21 00:57:22 +00001499 if (Asm->TM.hasMCUseLoc() &&
1500 Asm->OutStreamer.getKind() == MCStreamer::SK_AsmStreamer)
1501 // Use a single line table if we are using .loc and generating assembly.
1502 Asm->OutStreamer.getContext().setDwarfCompileUnitID(0);
1503 else
1504 Asm->OutStreamer.getContext().setDwarfCompileUnitID(TheCU->getUniqueID());
Manman Ren43213cf2013-02-05 21:52:47 +00001505
Devang Pateleac9c072010-04-27 19:46:33 +00001506 FunctionBeginSym = Asm->GetTempSymbol("func_begin",
1507 Asm->getFunctionNumber());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001508 // Assumes in correct section after the entry point.
Devang Pateleac9c072010-04-27 19:46:33 +00001509 Asm->OutStreamer.EmitLabel(FunctionBeginSym);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001510
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001511 assert(UserVariables.empty() && DbgValues.empty() && "Maps weren't cleaned");
1512
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001513 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
Eric Christopherb6dc8652012-11-27 22:43:45 +00001514 // LiveUserVar - Map physreg numbers to the MDNode they contain.
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001515 std::vector<const MDNode*> LiveUserVar(TRI->getNumRegs());
1516
Devang Patelb2b31a62010-05-26 19:37:24 +00001517 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001518 I != E; ++I) {
1519 bool AtBlockEntry = true;
Devang Patelb2b31a62010-05-26 19:37:24 +00001520 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
1521 II != IE; ++II) {
1522 const MachineInstr *MI = II;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001523
Devang Patelb2b31a62010-05-26 19:37:24 +00001524 if (MI->isDebugValue()) {
Nick Lewycky746cb672011-10-26 22:55:33 +00001525 assert(MI->getNumOperands() > 1 && "Invalid machine instruction!");
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001526
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001527 // Keep track of user variables.
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001528 const MDNode *Var =
1529 MI->getOperand(MI->getNumOperands() - 1).getMetadata();
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001530
1531 // Variable is in a register, we need to check for clobbers.
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001532 if (isDbgValueInDefinedReg(MI))
1533 LiveUserVar[MI->getOperand(0).getReg()] = Var;
1534
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001535 // Check the history of this variable.
1536 SmallVectorImpl<const MachineInstr*> &History = DbgValues[Var];
1537 if (History.empty()) {
1538 UserVariables.push_back(Var);
1539 // The first mention of a function argument gets the FunctionBeginSym
1540 // label, so arguments are visible when breaking at function entry.
1541 DIVariable DV(Var);
Manman Rend03d2b22013-07-08 18:33:29 +00001542 if (DV.isVariable() && DV.getTag() == dwarf::DW_TAG_arg_variable &&
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001543 DISubprogram(getDISubprogram(DV.getContext()))
1544 .describes(MF->getFunction()))
1545 LabelsBeforeInsn[MI] = FunctionBeginSym;
1546 } else {
1547 // We have seen this variable before. Try to coalesce DBG_VALUEs.
1548 const MachineInstr *Prev = History.back();
1549 if (Prev->isDebugValue()) {
1550 // Coalesce identical entries at the end of History.
1551 if (History.size() >= 2 &&
Devang Patel79862892011-07-07 00:14:27 +00001552 Prev->isIdenticalTo(History[History.size() - 2])) {
Eric Christopher02c1a642012-10-08 20:48:49 +00001553 DEBUG(dbgs() << "Coalescing identical DBG_VALUE entries:\n"
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001554 << "\t" << *Prev
Devang Patel79862892011-07-07 00:14:27 +00001555 << "\t" << *History[History.size() - 2] << "\n");
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001556 History.pop_back();
Devang Patel79862892011-07-07 00:14:27 +00001557 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001558
1559 // Terminate old register assignments that don't reach MI;
1560 MachineFunction::const_iterator PrevMBB = Prev->getParent();
1561 if (PrevMBB != I && (!AtBlockEntry || llvm::next(PrevMBB) != I) &&
1562 isDbgValueInDefinedReg(Prev)) {
1563 // Previous register assignment needs to terminate at the end of
1564 // its basic block.
1565 MachineBasicBlock::const_iterator LastMI =
1566 PrevMBB->getLastNonDebugInstr();
Devang Patel79862892011-07-07 00:14:27 +00001567 if (LastMI == PrevMBB->end()) {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001568 // Drop DBG_VALUE for empty range.
Eric Christopher02c1a642012-10-08 20:48:49 +00001569 DEBUG(dbgs() << "Dropping DBG_VALUE for empty range:\n"
Devang Patel79862892011-07-07 00:14:27 +00001570 << "\t" << *Prev << "\n");
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001571 History.pop_back();
David Blaikie4532c282013-06-20 00:25:24 +00001572 } else if (llvm::next(PrevMBB) != PrevMBB->getParent()->end())
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001573 // Terminate after LastMI.
1574 History.push_back(LastMI);
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001575 }
1576 }
1577 }
1578 History.push_back(MI);
Devang Patelb2b31a62010-05-26 19:37:24 +00001579 } else {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001580 // Not a DBG_VALUE instruction.
1581 if (!MI->isLabel())
1582 AtBlockEntry = false;
1583
Eric Christopher0313ced2012-10-04 20:46:14 +00001584 // First known non-DBG_VALUE and non-frame setup location marks
1585 // the beginning of the function body.
1586 if (!MI->getFlag(MachineInstr::FrameSetup) &&
1587 (PrologEndLoc.isUnknown() && !MI->getDebugLoc().isUnknown()))
Devang Patel4243e672011-05-11 19:22:19 +00001588 PrologEndLoc = MI->getDebugLoc();
1589
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001590 // Check if the instruction clobbers any registers with debug vars.
1591 for (MachineInstr::const_mop_iterator MOI = MI->operands_begin(),
1592 MOE = MI->operands_end(); MOI != MOE; ++MOI) {
1593 if (!MOI->isReg() || !MOI->isDef() || !MOI->getReg())
1594 continue;
Jakob Stoklund Olesen396618b2012-06-01 23:28:30 +00001595 for (MCRegAliasIterator AI(MOI->getReg(), TRI, true);
1596 AI.isValid(); ++AI) {
1597 unsigned Reg = *AI;
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001598 const MDNode *Var = LiveUserVar[Reg];
1599 if (!Var)
1600 continue;
1601 // Reg is now clobbered.
1602 LiveUserVar[Reg] = 0;
1603
1604 // Was MD last defined by a DBG_VALUE referring to Reg?
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001605 DbgValueHistoryMap::iterator HistI = DbgValues.find(Var);
1606 if (HistI == DbgValues.end())
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001607 continue;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001608 SmallVectorImpl<const MachineInstr*> &History = HistI->second;
1609 if (History.empty())
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001610 continue;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001611 const MachineInstr *Prev = History.back();
1612 // Sanity-check: Register assignments are terminated at the end of
1613 // their block.
1614 if (!Prev->isDebugValue() || Prev->getParent() != MI->getParent())
1615 continue;
1616 // Is the variable still in Reg?
1617 if (!isDbgValueInDefinedReg(Prev) ||
1618 Prev->getOperand(0).getReg() != Reg)
1619 continue;
1620 // Var is clobbered. Make sure the next instruction gets a label.
1621 History.push_back(MI);
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001622 }
1623 }
Devang Patelb2b31a62010-05-26 19:37:24 +00001624 }
Devang Patelb2b31a62010-05-26 19:37:24 +00001625 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001626 }
1627
1628 for (DbgValueHistoryMap::iterator I = DbgValues.begin(), E = DbgValues.end();
1629 I != E; ++I) {
1630 SmallVectorImpl<const MachineInstr*> &History = I->second;
1631 if (History.empty())
1632 continue;
1633
1634 // Make sure the final register assignments are terminated.
1635 const MachineInstr *Prev = History.back();
1636 if (Prev->isDebugValue() && isDbgValueInDefinedReg(Prev)) {
1637 const MachineBasicBlock *PrevMBB = Prev->getParent();
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001638 MachineBasicBlock::const_iterator LastMI =
Devang Patel5bc942c2011-08-10 23:58:09 +00001639 PrevMBB->getLastNonDebugInstr();
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001640 if (LastMI == PrevMBB->end())
1641 // Drop DBG_VALUE for empty range.
1642 History.pop_back();
David Blaikie4532c282013-06-20 00:25:24 +00001643 else if (PrevMBB != &PrevMBB->getParent()->back()) {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001644 // Terminate after LastMI.
1645 History.push_back(LastMI);
1646 }
1647 }
1648 // Request labels for the full history.
1649 for (unsigned i = 0, e = History.size(); i != e; ++i) {
1650 const MachineInstr *MI = History[i];
1651 if (MI->isDebugValue())
1652 requestLabelBeforeInsn(MI);
1653 else
1654 requestLabelAfterInsn(MI);
1655 }
1656 }
Devang Patelb2b31a62010-05-26 19:37:24 +00001657
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001658 PrevInstLoc = DebugLoc();
Devang Patelb2b31a62010-05-26 19:37:24 +00001659 PrevLabel = FunctionBeginSym;
Devang Patel4243e672011-05-11 19:22:19 +00001660
1661 // Record beginning of function.
1662 if (!PrologEndLoc.isUnknown()) {
1663 DebugLoc FnStartDL = getFnDebugLoc(PrologEndLoc,
1664 MF->getFunction()->getContext());
1665 recordSourceLine(FnStartDL.getLine(), FnStartDL.getCol(),
1666 FnStartDL.getScope(MF->getFunction()->getContext()),
David Blaikie836cfc42012-12-04 22:02:33 +00001667 // We'd like to list the prologue as "not statements" but GDB behaves
1668 // poorly if we do that. Revisit this with caution/GDB (7.5+) testing.
David Blaikieb36c5312012-12-04 21:05:36 +00001669 DWARF2_FLAG_IS_STMT);
Devang Patel4243e672011-05-11 19:22:19 +00001670 }
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001671}
1672
Devang Patelbf47fdb2011-08-10 20:55:27 +00001673void DwarfDebug::addScopeVariable(LexicalScope *LS, DbgVariable *Var) {
David Blaikie032d6242013-06-05 05:39:59 +00001674 SmallVectorImpl<DbgVariable *> &Vars = ScopeVariables[LS];
1675 DIVariable DV = Var->getVariable();
David Blaikieb20fdff2013-06-06 21:04:51 +00001676 // Variables with positive arg numbers are parameters.
1677 if (unsigned ArgNum = DV.getArgNumber()) {
1678 // Keep all parameters in order at the start of the variable list to ensure
1679 // function types are correct (no out-of-order parameters)
1680 //
1681 // This could be improved by only doing it for optimized builds (unoptimized
1682 // builds have the right order to begin with), searching from the back (this
1683 // would catch the unoptimized case quickly), or doing a binary search
1684 // rather than linear search.
1685 SmallVectorImpl<DbgVariable *>::iterator I = Vars.begin();
1686 while (I != Vars.end()) {
1687 unsigned CurNum = (*I)->getVariable().getArgNumber();
1688 // A local (non-parameter) variable has been found, insert immediately
1689 // before it.
1690 if (CurNum == 0)
1691 break;
1692 // A later indexed parameter has been found, insert immediately before it.
David Blaikiebabfebb2013-06-06 22:28:26 +00001693 if (CurNum > ArgNum)
David Blaikieb20fdff2013-06-06 21:04:51 +00001694 break;
David Blaikiebabfebb2013-06-06 22:28:26 +00001695 ++I;
David Blaikie032d6242013-06-05 05:39:59 +00001696 }
David Blaikieb20fdff2013-06-06 21:04:51 +00001697 Vars.insert(I, Var);
1698 return;
David Blaikie032d6242013-06-05 05:39:59 +00001699 }
1700
1701 Vars.push_back(Var);
Devang Patelbf47fdb2011-08-10 20:55:27 +00001702}
1703
Eric Christopherb6dc8652012-11-27 22:43:45 +00001704// Gather and emit post-function debug information.
Chris Lattnereec791a2010-01-26 23:18:02 +00001705void DwarfDebug::endFunction(const MachineFunction *MF) {
Devang Patelbf47fdb2011-08-10 20:55:27 +00001706 if (!MMI->hasDebugInfo() || LScopes.empty()) return;
Devang Patel70d75ca2009-11-12 19:02:56 +00001707
Devang Patelbf47fdb2011-08-10 20:55:27 +00001708 // Define end label for subprogram.
1709 FunctionEndSym = Asm->GetTempSymbol("func_end",
1710 Asm->getFunctionNumber());
1711 // Assumes in correct section after the entry point.
1712 Asm->OutStreamer.EmitLabel(FunctionEndSym);
Manman Ren43213cf2013-02-05 21:52:47 +00001713 // Set DwarfCompileUnitID in MCContext to default value.
1714 Asm->OutStreamer.getContext().setDwarfCompileUnitID(0);
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001715
Devang Patelbf47fdb2011-08-10 20:55:27 +00001716 SmallPtrSet<const MDNode *, 16> ProcessedVars;
1717 collectVariableInfo(MF, ProcessedVars);
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001718
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001719 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
Devang Patel94c7ddb2011-08-16 22:09:43 +00001720 CompileUnit *TheCU = SPMap.lookup(FnScope->getScopeNode());
Nick Lewycky746cb672011-10-26 22:55:33 +00001721 assert(TheCU && "Unable to find compile unit!");
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001722
Devang Patelbf47fdb2011-08-10 20:55:27 +00001723 // Construct abstract scopes.
Devang Patelcd9f6c52011-08-12 18:10:19 +00001724 ArrayRef<LexicalScope *> AList = LScopes.getAbstractScopesList();
1725 for (unsigned i = 0, e = AList.size(); i != e; ++i) {
1726 LexicalScope *AScope = AList[i];
1727 DISubprogram SP(AScope->getScopeNode());
Manman Rend03d2b22013-07-08 18:33:29 +00001728 if (SP.isSubprogram()) {
Devang Patelbf47fdb2011-08-10 20:55:27 +00001729 // Collect info for variables that were optimized out.
Devang Patel93d39be2011-08-19 23:28:12 +00001730 DIArray Variables = SP.getVariables();
1731 for (unsigned i = 0, e = Variables.getNumElements(); i != e; ++i) {
1732 DIVariable DV(Variables.getElement(i));
Manman Rend03d2b22013-07-08 18:33:29 +00001733 if (!DV || !DV.isVariable() || !ProcessedVars.insert(DV))
Devang Patel93d39be2011-08-19 23:28:12 +00001734 continue;
Alexey Samsonovb67bd332012-07-06 08:45:08 +00001735 // Check that DbgVariable for DV wasn't created earlier, when
1736 // findAbstractVariable() was called for inlined instance of DV.
1737 LLVMContext &Ctx = DV->getContext();
1738 DIVariable CleanDV = cleanseInlinedVariable(DV, Ctx);
1739 if (AbstractVariables.lookup(CleanDV))
1740 continue;
Devang Patel93d39be2011-08-19 23:28:12 +00001741 if (LexicalScope *Scope = LScopes.findAbstractScope(DV.getContext()))
1742 addScopeVariable(Scope, new DbgVariable(DV, NULL));
Devang Patel78e127d2010-06-25 22:07:34 +00001743 }
1744 }
Devang Patelcd9f6c52011-08-12 18:10:19 +00001745 if (ProcessedSPNodes.count(AScope->getScopeNode()) == 0)
Manman Ren742671b2013-05-29 17:16:59 +00001746 constructScopeDIE(TheCU, AScope);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001747 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001748
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001749 DIE *CurFnDIE = constructScopeDIE(TheCU, FnScope);
Eric Christopher0f1c7f62012-11-19 22:42:10 +00001750
Nick Lewycky8a8d4792011-12-02 22:16:29 +00001751 if (!MF->getTarget().Options.DisableFramePointerElim(*MF))
Eric Christopher873cf0a2012-08-24 01:14:27 +00001752 TheCU->addFlag(CurFnDIE, dwarf::DW_AT_APPLE_omit_frame_ptr);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001753
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001754 // Clear debug info
Craig Topper01eb99a2013-07-03 04:40:27 +00001755 for (ScopeVariablesMap::iterator
Devang Patelbf47fdb2011-08-10 20:55:27 +00001756 I = ScopeVariables.begin(), E = ScopeVariables.end(); I != E; ++I)
1757 DeleteContainerPointers(I->second);
1758 ScopeVariables.clear();
Devang Pateleac0c9d2011-04-22 18:09:57 +00001759 DeleteContainerPointers(CurrentFnArguments);
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001760 UserVariables.clear();
1761 DbgValues.clear();
Jeffrey Yasskin5c213dc2010-03-12 17:45:06 +00001762 AbstractVariables.clear();
Devang Pateleac9c072010-04-27 19:46:33 +00001763 LabelsBeforeInsn.clear();
1764 LabelsAfterInsn.clear();
Devang Patelf2548ca2010-04-16 23:33:45 +00001765 PrevLabel = NULL;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001766}
1767
Eric Christopherb6dc8652012-11-27 22:43:45 +00001768// Register a source line with debug info. Returns the unique label that was
1769// emitted and which provides correspondence to the source line list.
Devang Patel4243e672011-05-11 19:22:19 +00001770void DwarfDebug::recordSourceLine(unsigned Line, unsigned Col, const MDNode *S,
1771 unsigned Flags) {
Devang Patel65dbc902009-11-25 17:36:49 +00001772 StringRef Fn;
Devang Patel23670e52011-03-24 20:30:50 +00001773 StringRef Dir;
Dan Gohman1cc0d622010-05-05 23:41:32 +00001774 unsigned Src = 1;
1775 if (S) {
1776 DIDescriptor Scope(S);
Devang Patelf84548d2009-10-05 18:03:19 +00001777
Dan Gohman1cc0d622010-05-05 23:41:32 +00001778 if (Scope.isCompileUnit()) {
1779 DICompileUnit CU(S);
Dan Gohman1cc0d622010-05-05 23:41:32 +00001780 Fn = CU.getFilename();
Devang Patel23670e52011-03-24 20:30:50 +00001781 Dir = CU.getDirectory();
Devang Patel3cabc9d2010-10-28 17:30:52 +00001782 } else if (Scope.isFile()) {
1783 DIFile F(S);
Devang Patel3cabc9d2010-10-28 17:30:52 +00001784 Fn = F.getFilename();
Devang Patel23670e52011-03-24 20:30:50 +00001785 Dir = F.getDirectory();
Dan Gohman1cc0d622010-05-05 23:41:32 +00001786 } else if (Scope.isSubprogram()) {
1787 DISubprogram SP(S);
Dan Gohman1cc0d622010-05-05 23:41:32 +00001788 Fn = SP.getFilename();
Devang Patel23670e52011-03-24 20:30:50 +00001789 Dir = SP.getDirectory();
Eric Christopher6618a242011-10-11 22:59:11 +00001790 } else if (Scope.isLexicalBlockFile()) {
1791 DILexicalBlockFile DBF(S);
1792 Fn = DBF.getFilename();
1793 Dir = DBF.getDirectory();
Dan Gohman1cc0d622010-05-05 23:41:32 +00001794 } else if (Scope.isLexicalBlock()) {
1795 DILexicalBlock DB(S);
Dan Gohman1cc0d622010-05-05 23:41:32 +00001796 Fn = DB.getFilename();
Devang Patel23670e52011-03-24 20:30:50 +00001797 Dir = DB.getDirectory();
Dan Gohman1cc0d622010-05-05 23:41:32 +00001798 } else
Craig Topper5e25ee82012-02-05 08:31:47 +00001799 llvm_unreachable("Unexpected scope info");
Dan Gohman1cc0d622010-05-05 23:41:32 +00001800
Manman Ren3de61b42013-03-07 01:42:00 +00001801 Src = getOrCreateSourceID(Fn, Dir,
1802 Asm->OutStreamer.getContext().getDwarfCompileUnitID());
Dan Gohman1cc0d622010-05-05 23:41:32 +00001803 }
Nick Lewycky3bbb6f72011-07-29 03:49:23 +00001804 Asm->OutStreamer.EmitDwarfLocDirective(Src, Line, Col, Flags, 0, 0, Fn);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001805}
1806
Bill Wendling829e67b2009-05-20 23:22:40 +00001807//===----------------------------------------------------------------------===//
1808// Emit Methods
1809//===----------------------------------------------------------------------===//
1810
Eric Christopherb6dc8652012-11-27 22:43:45 +00001811// Compute the size and offset of a DIE.
Jim Grosbach7ab38df2009-11-22 19:20:36 +00001812unsigned
Eric Christopher0e3e9b72012-12-10 23:34:43 +00001813DwarfUnits::computeSizeAndOffset(DIE *Die, unsigned Offset) {
Bill Wendling94d04b82009-05-20 23:21:38 +00001814 // Get the children.
1815 const std::vector<DIE *> &Children = Die->getChildren();
1816
Bill Wendling94d04b82009-05-20 23:21:38 +00001817 // Record the abbreviation.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001818 assignAbbrevNumber(Die->getAbbrev());
Bill Wendling94d04b82009-05-20 23:21:38 +00001819
1820 // Get the abbreviation for this DIE.
1821 unsigned AbbrevNumber = Die->getAbbrevNumber();
Eric Christopher0e3e9b72012-12-10 23:34:43 +00001822 const DIEAbbrev *Abbrev = Abbreviations->at(AbbrevNumber - 1);
Bill Wendling94d04b82009-05-20 23:21:38 +00001823
1824 // Set DIE offset
1825 Die->setOffset(Offset);
1826
1827 // Start the size with the size of abbreviation code.
Chris Lattneraf76e592009-08-22 20:48:53 +00001828 Offset += MCAsmInfo::getULEB128Size(AbbrevNumber);
Bill Wendling94d04b82009-05-20 23:21:38 +00001829
Eric Christopherf7cef702013-03-29 23:34:06 +00001830 const SmallVectorImpl<DIEValue*> &Values = Die->getValues();
1831 const SmallVectorImpl<DIEAbbrevData> &AbbrevData = Abbrev->getData();
Bill Wendling94d04b82009-05-20 23:21:38 +00001832
1833 // Size the DIE attribute values.
1834 for (unsigned i = 0, N = Values.size(); i < N; ++i)
1835 // Size attribute value.
Chris Lattnera37d5382010-04-05 00:18:22 +00001836 Offset += Values[i]->SizeOf(Asm, AbbrevData[i].getForm());
Bill Wendling94d04b82009-05-20 23:21:38 +00001837
1838 // Size the DIE children if any.
1839 if (!Children.empty()) {
1840 assert(Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes &&
1841 "Children flag not set");
1842
1843 for (unsigned j = 0, M = Children.size(); j < M; ++j)
Eric Christopherfbd19752012-11-20 22:14:13 +00001844 Offset = computeSizeAndOffset(Children[j], Offset);
Bill Wendling94d04b82009-05-20 23:21:38 +00001845
1846 // End of children marker.
1847 Offset += sizeof(int8_t);
1848 }
1849
1850 Die->setSize(Offset - Die->getOffset());
1851 return Offset;
1852}
1853
Eric Christopherb6dc8652012-11-27 22:43:45 +00001854// Compute the size and offset of all the DIEs.
Eric Christopher0e3e9b72012-12-10 23:34:43 +00001855void DwarfUnits::computeSizeAndOffsets() {
Manman Renbc3e96f2013-03-12 18:27:15 +00001856 // Offset from the beginning of debug info section.
Eric Christopherd2df98f2013-05-30 00:43:35 +00001857 unsigned SecOffset = 0;
Eric Christopherf7cef702013-03-29 23:34:06 +00001858 for (SmallVectorImpl<CompileUnit *>::iterator I = CUs.begin(),
Eric Christopher0e3e9b72012-12-10 23:34:43 +00001859 E = CUs.end(); I != E; ++I) {
Eric Christopherd2df98f2013-05-30 00:43:35 +00001860 (*I)->setDebugInfoOffset(SecOffset);
Eric Christopher98e237f2012-11-30 23:59:06 +00001861 unsigned Offset =
1862 sizeof(int32_t) + // Length of Compilation Unit Info
1863 sizeof(int16_t) + // DWARF version number
1864 sizeof(int32_t) + // Offset Into Abbrev. Section
1865 sizeof(int8_t); // Pointer Size (in bytes)
1866
Manman Renbc3e96f2013-03-12 18:27:15 +00001867 unsigned EndOffset = computeSizeAndOffset((*I)->getCUDie(), Offset);
Eric Christopherd2df98f2013-05-30 00:43:35 +00001868 SecOffset += EndOffset;
Devang Patel163a9f72010-05-10 22:49:55 +00001869 }
Bill Wendling94d04b82009-05-20 23:21:38 +00001870}
1871
Eric Christopherb6dc8652012-11-27 22:43:45 +00001872// Emit initial Dwarf sections with a label at the start of each one.
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001873void DwarfDebug::emitSectionLabels() {
Chris Lattner6c2f9e12009-08-19 05:49:37 +00001874 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
Daniel Dunbarf612ff62009-09-19 20:40:05 +00001875
Bill Wendling94d04b82009-05-20 23:21:38 +00001876 // Dwarf sections base addresses.
Jim Grosbach1e20b962010-07-21 21:21:52 +00001877 DwarfInfoSectionSym =
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001878 emitSectionSym(Asm, TLOF.getDwarfInfoSection(), "section_info");
Jim Grosbach1e20b962010-07-21 21:21:52 +00001879 DwarfAbbrevSectionSym =
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001880 emitSectionSym(Asm, TLOF.getDwarfAbbrevSection(), "section_abbrev");
Eric Christopher6eebe472012-12-19 22:02:53 +00001881 if (useSplitDwarf())
1882 DwarfAbbrevDWOSectionSym =
1883 emitSectionSym(Asm, TLOF.getDwarfAbbrevDWOSection(),
1884 "section_abbrev_dwo");
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001885 emitSectionSym(Asm, TLOF.getDwarfARangesSection());
Jim Grosbach1e20b962010-07-21 21:21:52 +00001886
Chris Lattner9c69e285532010-04-04 22:59:04 +00001887 if (const MCSection *MacroInfo = TLOF.getDwarfMacroInfoSection())
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001888 emitSectionSym(Asm, MacroInfo);
Bill Wendling94d04b82009-05-20 23:21:38 +00001889
Eric Christopher7a0103c2013-02-07 21:19:50 +00001890 DwarfLineSectionSym =
1891 emitSectionSym(Asm, TLOF.getDwarfLineSection(), "section_line");
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001892 emitSectionSym(Asm, TLOF.getDwarfLocSection());
Michael Gottesmandc42d032013-09-04 04:39:38 +00001893 if (HasDwarfPubSections) {
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00001894 emitSectionSym(Asm, TLOF.getDwarfPubNamesSection());
Eric Christopher978046b2013-08-26 23:24:31 +00001895 emitSectionSym(Asm, TLOF.getDwarfPubTypesSection());
Michael Gottesmandc42d032013-09-04 04:39:38 +00001896 }
Jim Grosbach1e20b962010-07-21 21:21:52 +00001897 DwarfStrSectionSym =
Eric Christopher64f824c2012-12-27 02:14:01 +00001898 emitSectionSym(Asm, TLOF.getDwarfStrSection(), "info_string");
Eric Christopher9a9e73b2013-04-07 03:43:09 +00001899 if (useSplitDwarf()) {
Eric Christopher64f824c2012-12-27 02:14:01 +00001900 DwarfStrDWOSectionSym =
1901 emitSectionSym(Asm, TLOF.getDwarfStrDWOSection(), "skel_string");
Eric Christopher9a9e73b2013-04-07 03:43:09 +00001902 DwarfAddrSectionSym =
1903 emitSectionSym(Asm, TLOF.getDwarfAddrSection(), "addr_sec");
1904 }
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001905 DwarfDebugRangeSectionSym = emitSectionSym(Asm, TLOF.getDwarfRangesSection(),
Devang Patelf2548ca2010-04-16 23:33:45 +00001906 "debug_range");
Bill Wendling94d04b82009-05-20 23:21:38 +00001907
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001908 DwarfDebugLocSectionSym = emitSectionSym(Asm, TLOF.getDwarfLocSection(),
Devang Patelc3f5f782010-05-25 23:40:22 +00001909 "section_debug_loc");
1910
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00001911 TextSectionSym = emitSectionSym(Asm, TLOF.getTextSection(), "text_begin");
1912 emitSectionSym(Asm, TLOF.getDataSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00001913}
1914
Eric Christopherb6dc8652012-11-27 22:43:45 +00001915// Recursively emits a debug information entry.
Eric Christopher6eebe472012-12-19 22:02:53 +00001916void DwarfDebug::emitDIE(DIE *Die, std::vector<DIEAbbrev *> *Abbrevs) {
Bill Wendling94d04b82009-05-20 23:21:38 +00001917 // Get the abbreviation for this DIE.
1918 unsigned AbbrevNumber = Die->getAbbrevNumber();
Eric Christopher6eebe472012-12-19 22:02:53 +00001919 const DIEAbbrev *Abbrev = Abbrevs->at(AbbrevNumber - 1);
Bill Wendling94d04b82009-05-20 23:21:38 +00001920
Bill Wendling94d04b82009-05-20 23:21:38 +00001921 // Emit the code (index) for the abbreviation.
Chris Lattner3f53c832010-04-04 18:52:31 +00001922 if (Asm->isVerbose())
Chris Lattner894d75a2010-01-22 23:18:42 +00001923 Asm->OutStreamer.AddComment("Abbrev [" + Twine(AbbrevNumber) + "] 0x" +
1924 Twine::utohexstr(Die->getOffset()) + ":0x" +
1925 Twine::utohexstr(Die->getSize()) + " " +
1926 dwarf::TagString(Abbrev->getTag()));
Chris Lattner7e1a8f82010-04-04 19:09:29 +00001927 Asm->EmitULEB128(AbbrevNumber);
Bill Wendling94d04b82009-05-20 23:21:38 +00001928
Eric Christopherf7cef702013-03-29 23:34:06 +00001929 const SmallVectorImpl<DIEValue*> &Values = Die->getValues();
1930 const SmallVectorImpl<DIEAbbrevData> &AbbrevData = Abbrev->getData();
Bill Wendling94d04b82009-05-20 23:21:38 +00001931
1932 // Emit the DIE attribute values.
1933 for (unsigned i = 0, N = Values.size(); i < N; ++i) {
1934 unsigned Attr = AbbrevData[i].getAttribute();
1935 unsigned Form = AbbrevData[i].getForm();
1936 assert(Form && "Too many attributes for DIE (check abbreviation)");
1937
Chris Lattner3f53c832010-04-04 18:52:31 +00001938 if (Asm->isVerbose())
Chris Lattnera8013622010-01-24 18:54:17 +00001939 Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr));
Jim Grosbach1e20b962010-07-21 21:21:52 +00001940
Bill Wendling94d04b82009-05-20 23:21:38 +00001941 switch (Attr) {
Bill Wendling94d04b82009-05-20 23:21:38 +00001942 case dwarf::DW_AT_abstract_origin: {
1943 DIEEntry *E = cast<DIEEntry>(Values[i]);
1944 DIE *Origin = E->getEntry();
Devang Patel53bb5c92009-11-10 23:06:00 +00001945 unsigned Addr = Origin->getOffset();
Manman Renbc3e96f2013-03-12 18:27:15 +00001946 if (Form == dwarf::DW_FORM_ref_addr) {
1947 // For DW_FORM_ref_addr, output the offset from beginning of debug info
1948 // section. Origin->getOffset() returns the offset from start of the
1949 // compile unit.
1950 DwarfUnits &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
1951 Addr += Holder.getCUOffset(Origin->getCompileUnit());
1952 }
Manman Ren0e6783f2013-07-02 23:40:10 +00001953 Asm->OutStreamer.EmitIntValue(Addr,
1954 Form == dwarf::DW_FORM_ref_addr ? DIEEntry::getRefAddrSize(Asm) : 4);
Bill Wendling94d04b82009-05-20 23:21:38 +00001955 break;
1956 }
Devang Patelf2548ca2010-04-16 23:33:45 +00001957 case dwarf::DW_AT_ranges: {
1958 // DW_AT_range Value encodes offset in debug_range section.
1959 DIEInteger *V = cast<DIEInteger>(Values[i]);
Devang Patelb1fcfbe2010-09-02 16:43:44 +00001960
Nick Lewyckyffccd922012-06-22 01:25:12 +00001961 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections()) {
Devang Patelb1fcfbe2010-09-02 16:43:44 +00001962 Asm->EmitLabelPlusOffset(DwarfDebugRangeSectionSym,
1963 V->getValue(),
1964 4);
1965 } else {
1966 Asm->EmitLabelOffsetDifference(DwarfDebugRangeSectionSym,
1967 V->getValue(),
1968 DwarfDebugRangeSectionSym,
1969 4);
1970 }
Devang Patelf2548ca2010-04-16 23:33:45 +00001971 break;
1972 }
Devang Patelc3f5f782010-05-25 23:40:22 +00001973 case dwarf::DW_AT_location: {
Nick Lewyckyffccd922012-06-22 01:25:12 +00001974 if (DIELabel *L = dyn_cast<DIELabel>(Values[i])) {
1975 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +00001976 Asm->EmitLabelReference(L->getValue(), 4);
Nick Lewyckyffccd922012-06-22 01:25:12 +00001977 else
Ulrich Weigand1f8aacd2013-07-02 18:46:26 +00001978 Asm->EmitLabelDifference(L->getValue(), DwarfDebugLocSectionSym, 4);
Nick Lewyckyffccd922012-06-22 01:25:12 +00001979 } else {
Devang Patelc3f5f782010-05-25 23:40:22 +00001980 Values[i]->EmitValue(Asm, Form);
Nick Lewyckyffccd922012-06-22 01:25:12 +00001981 }
Devang Patelc3f5f782010-05-25 23:40:22 +00001982 break;
1983 }
Devang Patel2a361602010-09-29 19:08:08 +00001984 case dwarf::DW_AT_accessibility: {
1985 if (Asm->isVerbose()) {
1986 DIEInteger *V = cast<DIEInteger>(Values[i]);
1987 Asm->OutStreamer.AddComment(dwarf::AccessibilityString(V->getValue()));
1988 }
1989 Values[i]->EmitValue(Asm, Form);
1990 break;
1991 }
Bill Wendling94d04b82009-05-20 23:21:38 +00001992 default:
1993 // Emit an attribute using the defined form.
Chris Lattnerd38fee82010-04-05 00:13:49 +00001994 Values[i]->EmitValue(Asm, Form);
Bill Wendling94d04b82009-05-20 23:21:38 +00001995 break;
1996 }
Bill Wendling94d04b82009-05-20 23:21:38 +00001997 }
1998
1999 // Emit the DIE children if any.
2000 if (Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes) {
2001 const std::vector<DIE *> &Children = Die->getChildren();
2002
2003 for (unsigned j = 0, M = Children.size(); j < M; ++j)
Eric Christopher6eebe472012-12-19 22:02:53 +00002004 emitDIE(Children[j], Abbrevs);
Bill Wendling94d04b82009-05-20 23:21:38 +00002005
Chris Lattner3f53c832010-04-04 18:52:31 +00002006 if (Asm->isVerbose())
Chris Lattner233f52b2010-03-09 23:52:58 +00002007 Asm->OutStreamer.AddComment("End Of Children Mark");
2008 Asm->EmitInt8(0);
Bill Wendling94d04b82009-05-20 23:21:38 +00002009 }
2010}
2011
Eric Christopherb1e66d02012-12-15 00:04:07 +00002012// Emit the various dwarf units to the unit section USection with
2013// the abbreviations going into ASection.
2014void DwarfUnits::emitUnits(DwarfDebug *DD,
2015 const MCSection *USection,
2016 const MCSection *ASection,
2017 const MCSymbol *ASectionSym) {
2018 Asm->OutStreamer.SwitchSection(USection);
Eric Christopherf7cef702013-03-29 23:34:06 +00002019 for (SmallVectorImpl<CompileUnit *>::iterator I = CUs.begin(),
Eric Christopherb1e66d02012-12-15 00:04:07 +00002020 E = CUs.end(); I != E; ++I) {
2021 CompileUnit *TheCU = *I;
Devang Patel163a9f72010-05-10 22:49:55 +00002022 DIE *Die = TheCU->getCUDie();
Jim Grosbach1e20b962010-07-21 21:21:52 +00002023
Devang Patel163a9f72010-05-10 22:49:55 +00002024 // Emit the compile units header.
Eric Christopherb1e66d02012-12-15 00:04:07 +00002025 Asm->OutStreamer
2026 .EmitLabel(Asm->GetTempSymbol(USection->getLabelBeginName(),
2027 TheCU->getUniqueID()));
Jim Grosbach1e20b962010-07-21 21:21:52 +00002028
Devang Patel163a9f72010-05-10 22:49:55 +00002029 // Emit size of content not including length itself
2030 unsigned ContentSize = Die->getSize() +
2031 sizeof(int16_t) + // DWARF version number
2032 sizeof(int32_t) + // Offset Into Abbrev. Section
Devang Patel65705d52011-04-13 19:41:17 +00002033 sizeof(int8_t); // Pointer Size (in bytes)
Jim Grosbach1e20b962010-07-21 21:21:52 +00002034
Devang Patel163a9f72010-05-10 22:49:55 +00002035 Asm->OutStreamer.AddComment("Length of Compilation Unit Info");
2036 Asm->EmitInt32(ContentSize);
2037 Asm->OutStreamer.AddComment("DWARF version number");
Manman Ren0e6783f2013-07-02 23:40:10 +00002038 Asm->EmitInt16(DD->getDwarfVersion());
Devang Patel163a9f72010-05-10 22:49:55 +00002039 Asm->OutStreamer.AddComment("Offset Into Abbrev. Section");
Eric Christopherb1e66d02012-12-15 00:04:07 +00002040 Asm->EmitSectionOffset(Asm->GetTempSymbol(ASection->getLabelBeginName()),
2041 ASectionSym);
Devang Patel163a9f72010-05-10 22:49:55 +00002042 Asm->OutStreamer.AddComment("Address Size (in bytes)");
Chandler Carruth426c2bf2012-11-01 09:14:31 +00002043 Asm->EmitInt8(Asm->getDataLayout().getPointerSize());
Jim Grosbach1e20b962010-07-21 21:21:52 +00002044
Eric Christopher6eebe472012-12-19 22:02:53 +00002045 DD->emitDIE(Die, Abbreviations);
Eric Christopherb1e66d02012-12-15 00:04:07 +00002046 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol(USection->getLabelEndName(),
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002047 TheCU->getUniqueID()));
Devang Patel163a9f72010-05-10 22:49:55 +00002048 }
Bill Wendling94d04b82009-05-20 23:21:38 +00002049}
2050
Manman Renbc3e96f2013-03-12 18:27:15 +00002051/// For a given compile unit DIE, returns offset from beginning of debug info.
2052unsigned DwarfUnits::getCUOffset(DIE *Die) {
Manman Ren4c6f8952013-03-13 18:41:27 +00002053 assert(Die->getTag() == dwarf::DW_TAG_compile_unit &&
2054 "Input DIE should be compile unit in getCUOffset.");
Eric Christophera1eacd02013-08-08 01:41:05 +00002055 for (SmallVectorImpl<CompileUnit *>::iterator I = CUs.begin(), E = CUs.end();
2056 I != E; ++I) {
Manman Renbc3e96f2013-03-12 18:27:15 +00002057 CompileUnit *TheCU = *I;
2058 if (TheCU->getCUDie() == Die)
2059 return TheCU->getDebugInfoOffset();
2060 }
Manman Ren4c6f8952013-03-13 18:41:27 +00002061 llvm_unreachable("The compile unit DIE should belong to CUs in DwarfUnits.");
Manman Renbc3e96f2013-03-12 18:27:15 +00002062}
2063
Eric Christopher98e237f2012-11-30 23:59:06 +00002064// Emit the debug info section.
2065void DwarfDebug::emitDebugInfo() {
Eric Christopherb1e66d02012-12-15 00:04:07 +00002066 DwarfUnits &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
2067
2068 Holder.emitUnits(this, Asm->getObjFileLowering().getDwarfInfoSection(),
2069 Asm->getObjFileLowering().getDwarfAbbrevSection(),
2070 DwarfAbbrevSectionSym);
Eric Christopher98e237f2012-11-30 23:59:06 +00002071}
2072
Eric Christopherb6dc8652012-11-27 22:43:45 +00002073// Emit the abbreviation section.
Eric Christopher7dc68db2012-11-20 23:30:11 +00002074void DwarfDebug::emitAbbreviations() {
Eric Christopher6eebe472012-12-19 22:02:53 +00002075 if (!useSplitDwarf())
2076 emitAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevSection(),
2077 &Abbreviations);
2078 else
2079 emitSkeletonAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevSection());
2080}
Bill Wendling94d04b82009-05-20 23:21:38 +00002081
Eric Christopher6eebe472012-12-19 22:02:53 +00002082void DwarfDebug::emitAbbrevs(const MCSection *Section,
2083 std::vector<DIEAbbrev *> *Abbrevs) {
2084 // Check to see if it is worth the effort.
2085 if (!Abbrevs->empty()) {
2086 // Start the debug abbrev section.
2087 Asm->OutStreamer.SwitchSection(Section);
2088
2089 MCSymbol *Begin = Asm->GetTempSymbol(Section->getLabelBeginName());
Eric Christopher44fedba2012-12-13 03:00:38 +00002090 Asm->OutStreamer.EmitLabel(Begin);
Bill Wendling94d04b82009-05-20 23:21:38 +00002091
2092 // For each abbrevation.
Eric Christopher6eebe472012-12-19 22:02:53 +00002093 for (unsigned i = 0, N = Abbrevs->size(); i < N; ++i) {
Bill Wendling94d04b82009-05-20 23:21:38 +00002094 // Get abbreviation data
Eric Christopher6eebe472012-12-19 22:02:53 +00002095 const DIEAbbrev *Abbrev = Abbrevs->at(i);
Bill Wendling94d04b82009-05-20 23:21:38 +00002096
2097 // Emit the abbrevations code (base 1 index.)
Chris Lattner7e1a8f82010-04-04 19:09:29 +00002098 Asm->EmitULEB128(Abbrev->getNumber(), "Abbreviation Code");
Bill Wendling94d04b82009-05-20 23:21:38 +00002099
2100 // Emit the abbreviations data.
Chris Lattnerd38fee82010-04-05 00:13:49 +00002101 Abbrev->Emit(Asm);
Bill Wendling94d04b82009-05-20 23:21:38 +00002102 }
2103
2104 // Mark end of abbreviations.
Chris Lattner7e1a8f82010-04-04 19:09:29 +00002105 Asm->EmitULEB128(0, "EOM(3)");
Bill Wendling94d04b82009-05-20 23:21:38 +00002106
Eric Christopher6eebe472012-12-19 22:02:53 +00002107 MCSymbol *End = Asm->GetTempSymbol(Section->getLabelEndName());
Eric Christopher44fedba2012-12-13 03:00:38 +00002108 Asm->OutStreamer.EmitLabel(End);
Bill Wendling94d04b82009-05-20 23:21:38 +00002109 }
2110}
2111
Eric Christopherb6dc8652012-11-27 22:43:45 +00002112// Emit the last address of the section and the end of the line matrix.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002113void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) {
Bill Wendling94d04b82009-05-20 23:21:38 +00002114 // Define last address of section.
Chris Lattner233f52b2010-03-09 23:52:58 +00002115 Asm->OutStreamer.AddComment("Extended Op");
2116 Asm->EmitInt8(0);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002117
Chris Lattner233f52b2010-03-09 23:52:58 +00002118 Asm->OutStreamer.AddComment("Op size");
Chandler Carruth426c2bf2012-11-01 09:14:31 +00002119 Asm->EmitInt8(Asm->getDataLayout().getPointerSize() + 1);
Chris Lattner233f52b2010-03-09 23:52:58 +00002120 Asm->OutStreamer.AddComment("DW_LNE_set_address");
2121 Asm->EmitInt8(dwarf::DW_LNE_set_address);
2122
2123 Asm->OutStreamer.AddComment("Section end label");
Chris Lattnerd85fc6e2010-03-10 01:17:49 +00002124
Chris Lattnerc0215722010-04-04 19:25:43 +00002125 Asm->OutStreamer.EmitSymbolValue(Asm->GetTempSymbol("section_end",SectionEnd),
Eric Christopherca1dd052013-01-09 01:35:34 +00002126 Asm->getDataLayout().getPointerSize());
Bill Wendling94d04b82009-05-20 23:21:38 +00002127
2128 // Mark end of matrix.
Chris Lattner233f52b2010-03-09 23:52:58 +00002129 Asm->OutStreamer.AddComment("DW_LNE_end_sequence");
2130 Asm->EmitInt8(0);
Chris Lattner0ad9c912010-01-22 22:09:00 +00002131 Asm->EmitInt8(1);
Chris Lattner894d75a2010-01-22 23:18:42 +00002132 Asm->EmitInt8(1);
Bill Wendling94d04b82009-05-20 23:21:38 +00002133}
2134
Eric Christopherb6dc8652012-11-27 22:43:45 +00002135// Emit visible names into a hashed accelerator table section.
Eric Christopher09ac3d82011-11-07 09:24:32 +00002136void DwarfDebug::emitAccelNames() {
Eric Christopher577056f2013-09-05 18:20:16 +00002137 DwarfAccelTable AT(DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset,
Eric Christopher09ac3d82011-11-07 09:24:32 +00002138 dwarf::DW_FORM_data4));
2139 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2140 E = CUMap.end(); I != E; ++I) {
2141 CompileUnit *TheCU = I->second;
Eric Christopher0ffe2b42011-11-10 19:25:34 +00002142 const StringMap<std::vector<DIE*> > &Names = TheCU->getAccelNames();
2143 for (StringMap<std::vector<DIE*> >::const_iterator
Eric Christopher09ac3d82011-11-07 09:24:32 +00002144 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
Benjamin Kramer03406c42013-05-11 18:24:28 +00002145 StringRef Name = GI->getKey();
Eric Christopherfa03db02012-01-06 23:03:34 +00002146 const std::vector<DIE *> &Entities = GI->second;
Eric Christopher0ffe2b42011-11-10 19:25:34 +00002147 for (std::vector<DIE *>::const_iterator DI = Entities.begin(),
2148 DE = Entities.end(); DI != DE; ++DI)
2149 AT.AddName(Name, (*DI));
Eric Christopher09ac3d82011-11-07 09:24:32 +00002150 }
2151 }
2152
2153 AT.FinalizeTable(Asm, "Names");
2154 Asm->OutStreamer.SwitchSection(
2155 Asm->getObjFileLowering().getDwarfAccelNamesSection());
2156 MCSymbol *SectionBegin = Asm->GetTempSymbol("names_begin");
2157 Asm->OutStreamer.EmitLabel(SectionBegin);
2158
2159 // Emit the full data.
Eric Christopher2e5d8702012-12-20 21:58:36 +00002160 AT.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher09ac3d82011-11-07 09:24:32 +00002161}
2162
Eric Christopher72c16552012-12-20 21:58:40 +00002163// Emit objective C classes and categories into a hashed accelerator table
2164// section.
Eric Christopher09ac3d82011-11-07 09:24:32 +00002165void DwarfDebug::emitAccelObjC() {
Eric Christopher577056f2013-09-05 18:20:16 +00002166 DwarfAccelTable AT(DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset,
Eric Christopher09ac3d82011-11-07 09:24:32 +00002167 dwarf::DW_FORM_data4));
2168 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2169 E = CUMap.end(); I != E; ++I) {
2170 CompileUnit *TheCU = I->second;
2171 const StringMap<std::vector<DIE*> > &Names = TheCU->getAccelObjC();
2172 for (StringMap<std::vector<DIE*> >::const_iterator
2173 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
Benjamin Kramer03406c42013-05-11 18:24:28 +00002174 StringRef Name = GI->getKey();
Eric Christopherfa03db02012-01-06 23:03:34 +00002175 const std::vector<DIE *> &Entities = GI->second;
Eric Christopher09ac3d82011-11-07 09:24:32 +00002176 for (std::vector<DIE *>::const_iterator DI = Entities.begin(),
2177 DE = Entities.end(); DI != DE; ++DI)
2178 AT.AddName(Name, (*DI));
2179 }
2180 }
2181
2182 AT.FinalizeTable(Asm, "ObjC");
2183 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering()
2184 .getDwarfAccelObjCSection());
2185 MCSymbol *SectionBegin = Asm->GetTempSymbol("objc_begin");
2186 Asm->OutStreamer.EmitLabel(SectionBegin);
2187
2188 // Emit the full data.
Eric Christopher2e5d8702012-12-20 21:58:36 +00002189 AT.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher09ac3d82011-11-07 09:24:32 +00002190}
2191
Eric Christopherb6dc8652012-11-27 22:43:45 +00002192// Emit namespace dies into a hashed accelerator table.
Eric Christopher09ac3d82011-11-07 09:24:32 +00002193void DwarfDebug::emitAccelNamespaces() {
Eric Christopher577056f2013-09-05 18:20:16 +00002194 DwarfAccelTable AT(DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset,
Eric Christopher09ac3d82011-11-07 09:24:32 +00002195 dwarf::DW_FORM_data4));
2196 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2197 E = CUMap.end(); I != E; ++I) {
2198 CompileUnit *TheCU = I->second;
Eric Christopher8bd36ea2011-11-10 21:47:55 +00002199 const StringMap<std::vector<DIE*> > &Names = TheCU->getAccelNamespace();
2200 for (StringMap<std::vector<DIE*> >::const_iterator
Eric Christopher09ac3d82011-11-07 09:24:32 +00002201 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
Benjamin Kramer03406c42013-05-11 18:24:28 +00002202 StringRef Name = GI->getKey();
Eric Christopherfa03db02012-01-06 23:03:34 +00002203 const std::vector<DIE *> &Entities = GI->second;
Eric Christopher8bd36ea2011-11-10 21:47:55 +00002204 for (std::vector<DIE *>::const_iterator DI = Entities.begin(),
2205 DE = Entities.end(); DI != DE; ++DI)
2206 AT.AddName(Name, (*DI));
Eric Christopher09ac3d82011-11-07 09:24:32 +00002207 }
2208 }
2209
2210 AT.FinalizeTable(Asm, "namespac");
2211 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering()
2212 .getDwarfAccelNamespaceSection());
2213 MCSymbol *SectionBegin = Asm->GetTempSymbol("namespac_begin");
2214 Asm->OutStreamer.EmitLabel(SectionBegin);
2215
2216 // Emit the full data.
Eric Christopher2e5d8702012-12-20 21:58:36 +00002217 AT.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher09ac3d82011-11-07 09:24:32 +00002218}
2219
Eric Christopherb6dc8652012-11-27 22:43:45 +00002220// Emit type dies into a hashed accelerator table.
Eric Christopher09ac3d82011-11-07 09:24:32 +00002221void DwarfDebug::emitAccelTypes() {
Eric Christopherc36145f2012-01-06 04:35:23 +00002222 std::vector<DwarfAccelTable::Atom> Atoms;
Eric Christopher577056f2013-09-05 18:20:16 +00002223 Atoms.push_back(DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset,
Eric Christopherc36145f2012-01-06 04:35:23 +00002224 dwarf::DW_FORM_data4));
Eric Christopher577056f2013-09-05 18:20:16 +00002225 Atoms.push_back(DwarfAccelTable::Atom(dwarf::DW_ATOM_die_tag,
Eric Christopherc36145f2012-01-06 04:35:23 +00002226 dwarf::DW_FORM_data2));
Eric Christopher577056f2013-09-05 18:20:16 +00002227 Atoms.push_back(DwarfAccelTable::Atom(dwarf::DW_ATOM_type_flags,
Eric Christopherc36145f2012-01-06 04:35:23 +00002228 dwarf::DW_FORM_data1));
2229 DwarfAccelTable AT(Atoms);
Eric Christopher09ac3d82011-11-07 09:24:32 +00002230 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2231 E = CUMap.end(); I != E; ++I) {
2232 CompileUnit *TheCU = I->second;
Eric Christopherc36145f2012-01-06 04:35:23 +00002233 const StringMap<std::vector<std::pair<DIE*, unsigned > > > &Names
2234 = TheCU->getAccelTypes();
2235 for (StringMap<std::vector<std::pair<DIE*, unsigned> > >::const_iterator
Eric Christopher09ac3d82011-11-07 09:24:32 +00002236 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
Benjamin Kramer03406c42013-05-11 18:24:28 +00002237 StringRef Name = GI->getKey();
Eric Christopherfa03db02012-01-06 23:03:34 +00002238 const std::vector<std::pair<DIE *, unsigned> > &Entities = GI->second;
Eric Christopherc36145f2012-01-06 04:35:23 +00002239 for (std::vector<std::pair<DIE *, unsigned> >::const_iterator DI
2240 = Entities.begin(), DE = Entities.end(); DI !=DE; ++DI)
2241 AT.AddName(Name, (*DI).first, (*DI).second);
Eric Christopher09ac3d82011-11-07 09:24:32 +00002242 }
2243 }
2244
2245 AT.FinalizeTable(Asm, "types");
2246 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering()
2247 .getDwarfAccelTypesSection());
2248 MCSymbol *SectionBegin = Asm->GetTempSymbol("types_begin");
2249 Asm->OutStreamer.EmitLabel(SectionBegin);
2250
2251 // Emit the full data.
Eric Christopher2e5d8702012-12-20 21:58:36 +00002252 AT.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher09ac3d82011-11-07 09:24:32 +00002253}
2254
Eric Christopher57479322013-09-09 20:03:17 +00002255/// emitDebugPubNames - Emit visible names into a debug pubnames section.
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00002256///
Eric Christopher57479322013-09-09 20:03:17 +00002257void DwarfDebug::emitDebugPubNames() {
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00002258 const MCSection *ISec = Asm->getObjFileLowering().getDwarfInfoSection();
2259
2260 typedef DenseMap<const MDNode*, CompileUnit*> CUMapType;
2261 for (CUMapType::iterator I = CUMap.begin(), E = CUMap.end(); I != E; ++I) {
2262 CompileUnit *TheCU = I->second;
2263 unsigned ID = TheCU->getUniqueID();
2264
2265 if (TheCU->getGlobalNames().empty())
2266 continue;
2267
2268 // Start the dwarf pubnames section.
Eric Christopherf04e4ef2013-08-19 21:07:38 +00002269 Asm->OutStreamer
2270 .SwitchSection(Asm->getObjFileLowering().getDwarfPubNamesSection());
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00002271
2272 Asm->OutStreamer.AddComment("Length of Public Names Info");
2273 Asm->EmitLabelDifference(Asm->GetTempSymbol("pubnames_end", ID),
2274 Asm->GetTempSymbol("pubnames_begin", ID), 4);
2275
2276 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_begin", ID));
2277
2278 Asm->OutStreamer.AddComment("DWARF Version");
David Majnemerd7d43dc2013-08-21 06:13:34 +00002279 Asm->EmitInt16(dwarf::DW_PUBNAMES_VERSION);
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00002280
2281 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
2282 Asm->EmitSectionOffset(Asm->GetTempSymbol(ISec->getLabelBeginName(), ID),
2283 DwarfInfoSectionSym);
2284
2285 Asm->OutStreamer.AddComment("Compilation Unit Length");
2286 Asm->EmitLabelDifference(Asm->GetTempSymbol(ISec->getLabelEndName(), ID),
2287 Asm->GetTempSymbol(ISec->getLabelBeginName(), ID),
2288 4);
2289
2290 const StringMap<DIE*> &Globals = TheCU->getGlobalNames();
2291 for (StringMap<DIE*>::const_iterator
2292 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2293 const char *Name = GI->getKeyData();
2294 const DIE *Entity = GI->second;
2295
2296 Asm->OutStreamer.AddComment("DIE offset");
2297 Asm->EmitInt32(Entity->getOffset());
2298
2299 if (Asm->isVerbose())
2300 Asm->OutStreamer.AddComment("External Name");
Rafael Espindolaa3863ea2013-07-02 15:49:13 +00002301 Asm->OutStreamer.EmitBytes(StringRef(Name, GI->getKeyLength()+1));
Krzysztof Parzyszekc5ef7ee2013-02-12 18:00:14 +00002302 }
2303
2304 Asm->OutStreamer.AddComment("End Mark");
2305 Asm->EmitInt32(0);
2306 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_end", ID));
2307 }
2308}
2309
Devang Patel193f7202009-11-24 01:14:22 +00002310void DwarfDebug::emitDebugPubTypes() {
Devang Patel163a9f72010-05-10 22:49:55 +00002311 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2312 E = CUMap.end(); I != E; ++I) {
2313 CompileUnit *TheCU = I->second;
Eric Christopher63701182011-11-07 09:18:35 +00002314 // Start the dwarf pubtypes section.
Devang Patel163a9f72010-05-10 22:49:55 +00002315 Asm->OutStreamer.SwitchSection(
2316 Asm->getObjFileLowering().getDwarfPubTypesSection());
2317 Asm->OutStreamer.AddComment("Length of Public Types Info");
2318 Asm->EmitLabelDifference(
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002319 Asm->GetTempSymbol("pubtypes_end", TheCU->getUniqueID()),
2320 Asm->GetTempSymbol("pubtypes_begin", TheCU->getUniqueID()), 4);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002321
Devang Patel163a9f72010-05-10 22:49:55 +00002322 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_begin",
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002323 TheCU->getUniqueID()));
Jim Grosbach1e20b962010-07-21 21:21:52 +00002324
Devang Patel163a9f72010-05-10 22:49:55 +00002325 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DWARF Version");
David Majnemerd7d43dc2013-08-21 06:13:34 +00002326 Asm->EmitInt16(dwarf::DW_PUBTYPES_VERSION);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002327
Devang Patel163a9f72010-05-10 22:49:55 +00002328 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
Eric Christophercf6b8ad2012-12-15 00:04:04 +00002329 const MCSection *ISec = Asm->getObjFileLowering().getDwarfInfoSection();
2330 Asm->EmitSectionOffset(Asm->GetTempSymbol(ISec->getLabelBeginName(),
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002331 TheCU->getUniqueID()),
Devang Patel163a9f72010-05-10 22:49:55 +00002332 DwarfInfoSectionSym);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002333
Devang Patel163a9f72010-05-10 22:49:55 +00002334 Asm->OutStreamer.AddComment("Compilation Unit Length");
Eric Christophercf6b8ad2012-12-15 00:04:04 +00002335 Asm->EmitLabelDifference(Asm->GetTempSymbol(ISec->getLabelEndName(),
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002336 TheCU->getUniqueID()),
Eric Christophercf6b8ad2012-12-15 00:04:04 +00002337 Asm->GetTempSymbol(ISec->getLabelBeginName(),
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002338 TheCU->getUniqueID()),
Devang Patel163a9f72010-05-10 22:49:55 +00002339 4);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002340
Devang Patel163a9f72010-05-10 22:49:55 +00002341 const StringMap<DIE*> &Globals = TheCU->getGlobalTypes();
2342 for (StringMap<DIE*>::const_iterator
2343 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2344 const char *Name = GI->getKeyData();
Nick Lewycky3bbb6f72011-07-29 03:49:23 +00002345 DIE *Entity = GI->second;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002346
Devang Patel163a9f72010-05-10 22:49:55 +00002347 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
2348 Asm->EmitInt32(Entity->getOffset());
Jim Grosbach1e20b962010-07-21 21:21:52 +00002349
Devang Patel163a9f72010-05-10 22:49:55 +00002350 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("External Name");
Benjamin Kramer983c4572011-11-09 18:16:11 +00002351 // Emit the name with a terminating null byte.
Eric Christopher68ca5622013-01-09 01:57:54 +00002352 Asm->OutStreamer.EmitBytes(StringRef(Name, GI->getKeyLength()+1));
Devang Patel163a9f72010-05-10 22:49:55 +00002353 }
Jim Grosbach1e20b962010-07-21 21:21:52 +00002354
Devang Patel163a9f72010-05-10 22:49:55 +00002355 Asm->OutStreamer.AddComment("End Mark");
Jim Grosbach1e20b962010-07-21 21:21:52 +00002356 Asm->EmitInt32(0);
Devang Patel163a9f72010-05-10 22:49:55 +00002357 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_end",
Eli Benderskyd4a05e02012-12-03 18:45:45 +00002358 TheCU->getUniqueID()));
Devang Patel193f7202009-11-24 01:14:22 +00002359 }
Devang Patel193f7202009-11-24 01:14:22 +00002360}
2361
Eric Christopher64f824c2012-12-27 02:14:01 +00002362// Emit strings into a string section.
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002363void DwarfUnits::emitStrings(const MCSection *StrSection,
2364 const MCSection *OffsetSection = NULL,
2365 const MCSymbol *StrSecSym = NULL) {
Eric Christopher64f824c2012-12-27 02:14:01 +00002366
Eric Christopherb6714222013-01-08 22:22:06 +00002367 if (StringPool.empty()) return;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002368
Chris Lattner0d9d70f2010-03-09 23:38:23 +00002369 // Start the dwarf str section.
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002370 Asm->OutStreamer.SwitchSection(StrSection);
Bill Wendling94d04b82009-05-20 23:21:38 +00002371
Chris Lattnerbc733f52010-03-13 02:17:42 +00002372 // Get all of the string pool entries and put them in an array by their ID so
2373 // we can sort them.
Jim Grosbach1e20b962010-07-21 21:21:52 +00002374 SmallVector<std::pair<unsigned,
Eric Christopherff348452013-01-07 22:40:45 +00002375 StringMapEntry<std::pair<MCSymbol*, unsigned> >*>, 64> Entries;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002376
Chris Lattnerbc733f52010-03-13 02:17:42 +00002377 for (StringMap<std::pair<MCSymbol*, unsigned> >::iterator
Eric Christopherb6714222013-01-08 22:22:06 +00002378 I = StringPool.begin(), E = StringPool.end();
Eric Christopher72c16552012-12-20 21:58:40 +00002379 I != E; ++I)
Chris Lattnerbc733f52010-03-13 02:17:42 +00002380 Entries.push_back(std::make_pair(I->second.second, &*I));
Jim Grosbach1e20b962010-07-21 21:21:52 +00002381
Chris Lattnerbc733f52010-03-13 02:17:42 +00002382 array_pod_sort(Entries.begin(), Entries.end());
Jim Grosbach1e20b962010-07-21 21:21:52 +00002383
Chris Lattnerbc733f52010-03-13 02:17:42 +00002384 for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
Chris Lattner0d9d70f2010-03-09 23:38:23 +00002385 // Emit a label for reference from debug information entries.
Chris Lattnerbc733f52010-03-13 02:17:42 +00002386 Asm->OutStreamer.EmitLabel(Entries[i].second->getValue().first);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002387
Benjamin Kramer983c4572011-11-09 18:16:11 +00002388 // Emit the string itself with a terminating null byte.
Benjamin Kramer0c45f7d2011-11-09 12:12:04 +00002389 Asm->OutStreamer.EmitBytes(StringRef(Entries[i].second->getKeyData(),
Eric Christopherca1dd052013-01-09 01:35:34 +00002390 Entries[i].second->getKeyLength()+1));
Bill Wendling94d04b82009-05-20 23:21:38 +00002391 }
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002392
2393 // If we've got an offset section go ahead and emit that now as well.
2394 if (OffsetSection) {
2395 Asm->OutStreamer.SwitchSection(OffsetSection);
2396 unsigned offset = 0;
Eric Christopher72f7bfb2013-01-15 23:56:56 +00002397 unsigned size = 4; // FIXME: DWARF64 is 8.
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002398 for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
Eric Christopher1ced2082013-01-09 03:52:05 +00002399 Asm->OutStreamer.EmitIntValue(offset, size);
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002400 offset += Entries[i].second->getKeyLength() + 1;
2401 }
2402 }
Bill Wendling94d04b82009-05-20 23:21:38 +00002403}
2404
Eric Christopher72f7bfb2013-01-15 23:56:56 +00002405// Emit strings into a string section.
2406void DwarfUnits::emitAddresses(const MCSection *AddrSection) {
2407
2408 if (AddressPool.empty()) return;
2409
2410 // Start the dwarf addr section.
2411 Asm->OutStreamer.SwitchSection(AddrSection);
2412
David Blaikie66f464e2013-07-08 17:51:28 +00002413 // Order the address pool entries by ID
David Blaikie5ce40912013-07-08 17:33:10 +00002414 SmallVector<const MCExpr *, 64> Entries(AddressPool.size());
Eric Christopher72f7bfb2013-01-15 23:56:56 +00002415
David Blaikie66f464e2013-07-08 17:51:28 +00002416 for (DenseMap<const MCExpr *, unsigned>::iterator I = AddressPool.begin(),
2417 E = AddressPool.end();
Eric Christopher72f7bfb2013-01-15 23:56:56 +00002418 I != E; ++I)
David Blaikie5ce40912013-07-08 17:33:10 +00002419 Entries[I->second] = I->first;
Eric Christopher72f7bfb2013-01-15 23:56:56 +00002420
2421 for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
Ulrich Weigand18dbe502013-07-02 18:46:46 +00002422 // Emit an expression for reference from debug information entries.
David Blaikie5ce40912013-07-08 17:33:10 +00002423 if (const MCExpr *Expr = Entries[i])
Ulrich Weigand18dbe502013-07-02 18:46:46 +00002424 Asm->OutStreamer.EmitValue(Expr, Asm->getDataLayout().getPointerSize());
Eric Christopher72f7bfb2013-01-15 23:56:56 +00002425 else
2426 Asm->OutStreamer.EmitIntValue(0, Asm->getDataLayout().getPointerSize());
2427 }
2428
2429}
2430
Eric Christopher64f824c2012-12-27 02:14:01 +00002431// Emit visible names into a debug str section.
2432void DwarfDebug::emitDebugStr() {
2433 DwarfUnits &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
2434 Holder.emitStrings(Asm->getObjFileLowering().getDwarfStrSection());
2435}
2436
Eric Christopherd3b98532013-07-02 21:36:07 +00002437// Emit locations into the debug loc section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002438void DwarfDebug::emitDebugLoc() {
Devang Patel80250682010-05-26 23:55:23 +00002439 if (DotDebugLocEntries.empty())
2440 return;
2441
Eric Christopherf7cef702013-03-29 23:34:06 +00002442 for (SmallVectorImpl<DotDebugLocEntry>::iterator
Devang Patel6c3ea902011-02-04 22:57:18 +00002443 I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
2444 I != E; ++I) {
2445 DotDebugLocEntry &Entry = *I;
2446 if (I + 1 != DotDebugLocEntries.end())
2447 Entry.Merge(I+1);
2448 }
2449
Daniel Dunbar83320a02011-03-16 22:16:39 +00002450 // Start the dwarf loc section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002451 Asm->OutStreamer.SwitchSection(
Devang Patelc3f5f782010-05-25 23:40:22 +00002452 Asm->getObjFileLowering().getDwarfLocSection());
Chandler Carruth426c2bf2012-11-01 09:14:31 +00002453 unsigned char Size = Asm->getDataLayout().getPointerSize();
Devang Patel80250682010-05-26 23:55:23 +00002454 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", 0));
2455 unsigned index = 1;
Eric Christopherf7cef702013-03-29 23:34:06 +00002456 for (SmallVectorImpl<DotDebugLocEntry>::iterator
Jim Grosbach1e20b962010-07-21 21:21:52 +00002457 I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
Devang Patel61409622010-07-07 20:12:52 +00002458 I != E; ++I, ++index) {
Devang Patel6c3ea902011-02-04 22:57:18 +00002459 DotDebugLocEntry &Entry = *I;
2460 if (Entry.isMerged()) continue;
Devang Patelc3f5f782010-05-25 23:40:22 +00002461 if (Entry.isEmpty()) {
Eric Christopherca1dd052013-01-09 01:35:34 +00002462 Asm->OutStreamer.EmitIntValue(0, Size);
2463 Asm->OutStreamer.EmitIntValue(0, Size);
Devang Patel80250682010-05-26 23:55:23 +00002464 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", index));
Devang Patelc3f5f782010-05-25 23:40:22 +00002465 } else {
Eric Christopher0d0782a2013-07-03 22:40:18 +00002466 Asm->OutStreamer.EmitSymbolValue(Entry.getBeginSym(), Size);
2467 Asm->OutStreamer.EmitSymbolValue(Entry.getEndSym(), Size);
2468 DIVariable DV(Entry.getVariable());
Rafael Espindola5b23b7f2011-05-27 22:05:41 +00002469 Asm->OutStreamer.AddComment("Loc expr size");
2470 MCSymbol *begin = Asm->OutStreamer.getContext().CreateTempSymbol();
2471 MCSymbol *end = Asm->OutStreamer.getContext().CreateTempSymbol();
2472 Asm->EmitLabelDifference(end, begin, 2);
2473 Asm->OutStreamer.EmitLabel(begin);
Devang Patel80efd4e2011-07-08 16:49:43 +00002474 if (Entry.isInt()) {
Devang Patelc4329072011-06-01 22:03:25 +00002475 DIBasicType BTy(DV.getType());
2476 if (BTy.Verify() &&
Eric Christopher0f1c7f62012-11-19 22:42:10 +00002477 (BTy.getEncoding() == dwarf::DW_ATE_signed
Devang Patelc4329072011-06-01 22:03:25 +00002478 || BTy.getEncoding() == dwarf::DW_ATE_signed_char)) {
2479 Asm->OutStreamer.AddComment("DW_OP_consts");
2480 Asm->EmitInt8(dwarf::DW_OP_consts);
Devang Patel80efd4e2011-07-08 16:49:43 +00002481 Asm->EmitSLEB128(Entry.getInt());
Devang Patelc4329072011-06-01 22:03:25 +00002482 } else {
2483 Asm->OutStreamer.AddComment("DW_OP_constu");
2484 Asm->EmitInt8(dwarf::DW_OP_constu);
Devang Patel80efd4e2011-07-08 16:49:43 +00002485 Asm->EmitULEB128(Entry.getInt());
Devang Patelc4329072011-06-01 22:03:25 +00002486 }
Devang Patel80efd4e2011-07-08 16:49:43 +00002487 } else if (Entry.isLocation()) {
Eric Christopher7c2f3e82013-07-03 22:40:21 +00002488 MachineLocation Loc = Entry.getLoc();
Eric Christopher0f1c7f62012-11-19 22:42:10 +00002489 if (!DV.hasComplexAddress())
Devang Patel80efd4e2011-07-08 16:49:43 +00002490 // Regular entry.
Eric Christopher7c2f3e82013-07-03 22:40:21 +00002491 Asm->EmitDwarfRegOp(Loc, DV.isIndirect());
Devang Patel80efd4e2011-07-08 16:49:43 +00002492 else {
2493 // Complex address entry.
2494 unsigned N = DV.getNumAddrElements();
2495 unsigned i = 0;
2496 if (N >= 2 && DV.getAddrElement(0) == DIBuilder::OpPlus) {
Eric Christopher7c2f3e82013-07-03 22:40:21 +00002497 if (Loc.getOffset()) {
Devang Patel80efd4e2011-07-08 16:49:43 +00002498 i = 2;
Eric Christopher7c2f3e82013-07-03 22:40:21 +00002499 Asm->EmitDwarfRegOp(Loc, DV.isIndirect());
Devang Patel80efd4e2011-07-08 16:49:43 +00002500 Asm->OutStreamer.AddComment("DW_OP_deref");
2501 Asm->EmitInt8(dwarf::DW_OP_deref);
2502 Asm->OutStreamer.AddComment("DW_OP_plus_uconst");
2503 Asm->EmitInt8(dwarf::DW_OP_plus_uconst);
2504 Asm->EmitSLEB128(DV.getAddrElement(1));
2505 } else {
2506 // If first address element is OpPlus then emit
2507 // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
Eric Christopher7c2f3e82013-07-03 22:40:21 +00002508 MachineLocation TLoc(Loc.getReg(), DV.getAddrElement(1));
2509 Asm->EmitDwarfRegOp(TLoc, DV.isIndirect());
Devang Patel80efd4e2011-07-08 16:49:43 +00002510 i = 2;
2511 }
2512 } else {
Eric Christopher7c2f3e82013-07-03 22:40:21 +00002513 Asm->EmitDwarfRegOp(Loc, DV.isIndirect());
Devang Patel80efd4e2011-07-08 16:49:43 +00002514 }
Eric Christopher0f1c7f62012-11-19 22:42:10 +00002515
Devang Patel80efd4e2011-07-08 16:49:43 +00002516 // Emit remaining complex address elements.
2517 for (; i < N; ++i) {
2518 uint64_t Element = DV.getAddrElement(i);
2519 if (Element == DIBuilder::OpPlus) {
2520 Asm->EmitInt8(dwarf::DW_OP_plus_uconst);
2521 Asm->EmitULEB128(DV.getAddrElement(++i));
Eric Christopher50120762012-05-08 18:56:00 +00002522 } else if (Element == DIBuilder::OpDeref) {
Eric Christopher7c2f3e82013-07-03 22:40:21 +00002523 if (!Loc.isReg())
Eric Christopher50120762012-05-08 18:56:00 +00002524 Asm->EmitInt8(dwarf::DW_OP_deref);
2525 } else
2526 llvm_unreachable("unknown Opcode found in complex address");
Devang Patel80efd4e2011-07-08 16:49:43 +00002527 }
Devang Patelc26f5442011-04-28 02:22:40 +00002528 }
Devang Patelc26f5442011-04-28 02:22:40 +00002529 }
Devang Patel80efd4e2011-07-08 16:49:43 +00002530 // else ... ignore constant fp. There is not any good way to
2531 // to represent them here in dwarf.
Rafael Espindola5b23b7f2011-05-27 22:05:41 +00002532 Asm->OutStreamer.EmitLabel(end);
Devang Patelc3f5f782010-05-25 23:40:22 +00002533 }
2534 }
Bill Wendling94d04b82009-05-20 23:21:38 +00002535}
2536
Eric Christopherb6dc8652012-11-27 22:43:45 +00002537// Emit visible names into a debug aranges section.
Eric Christopher7ee5f5d2012-11-21 00:34:35 +00002538void DwarfDebug::emitDebugARanges() {
Bill Wendling94d04b82009-05-20 23:21:38 +00002539 // Start the dwarf aranges section.
Eric Christopherab6cd832013-08-30 00:39:57 +00002540 Asm->OutStreamer
2541 .SwitchSection(Asm->getObjFileLowering().getDwarfARangesSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002542}
2543
Eric Christopherb6dc8652012-11-27 22:43:45 +00002544// Emit visible names into a debug ranges section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002545void DwarfDebug::emitDebugRanges() {
Bill Wendling94d04b82009-05-20 23:21:38 +00002546 // Start the dwarf ranges section.
Eric Christopherab6cd832013-08-30 00:39:57 +00002547 Asm->OutStreamer
2548 .SwitchSection(Asm->getObjFileLowering().getDwarfRangesSection());
Chandler Carruth426c2bf2012-11-01 09:14:31 +00002549 unsigned char Size = Asm->getDataLayout().getPointerSize();
Eric Christopherf7cef702013-03-29 23:34:06 +00002550 for (SmallVectorImpl<const MCSymbol *>::iterator
Jim Grosbach1e20b962010-07-21 21:21:52 +00002551 I = DebugRangeSymbols.begin(), E = DebugRangeSymbols.end();
Devang Pateleac9c072010-04-27 19:46:33 +00002552 I != E; ++I) {
2553 if (*I)
Eric Christopher1ced2082013-01-09 03:52:05 +00002554 Asm->OutStreamer.EmitSymbolValue(const_cast<MCSymbol*>(*I), Size);
Devang Patelf2548ca2010-04-16 23:33:45 +00002555 else
Eric Christopherca1dd052013-01-09 01:35:34 +00002556 Asm->OutStreamer.EmitIntValue(0, Size);
Devang Patelf2548ca2010-04-16 23:33:45 +00002557 }
Bill Wendling94d04b82009-05-20 23:21:38 +00002558}
2559
Eric Christopherb6dc8652012-11-27 22:43:45 +00002560// Emit visible names into a debug macinfo section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002561void DwarfDebug::emitDebugMacInfo() {
Daniel Dunbarf612ff62009-09-19 20:40:05 +00002562 if (const MCSection *LineInfo =
Chris Lattner18a4c162009-08-02 07:24:22 +00002563 Asm->getObjFileLowering().getDwarfMacroInfoSection()) {
Bill Wendling94d04b82009-05-20 23:21:38 +00002564 // Start the dwarf macinfo section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002565 Asm->OutStreamer.SwitchSection(LineInfo);
Bill Wendling94d04b82009-05-20 23:21:38 +00002566 }
2567}
2568
Eric Christopher0b944ee2012-12-11 19:42:09 +00002569// DWARF5 Experimental Separate Dwarf emitters.
Eric Christopher98e237f2012-11-30 23:59:06 +00002570
2571// This DIE has the following attributes: DW_AT_comp_dir, DW_AT_stmt_list,
2572// DW_AT_low_pc, DW_AT_high_pc, DW_AT_ranges, DW_AT_dwo_name, DW_AT_dwo_id,
2573// DW_AT_ranges_base, DW_AT_addr_base. If DW_AT_ranges is present,
2574// DW_AT_low_pc and DW_AT_high_pc are not used, and vice versa.
Eric Christophera9b2c792013-08-26 23:50:43 +00002575CompileUnit *DwarfDebug::constructSkeletonCU(const CompileUnit *CU) {
Eric Christopher98e237f2012-11-30 23:59:06 +00002576
2577 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
Eric Christophera9b2c792013-08-26 23:50:43 +00002578 CompileUnit *NewCU = new CompileUnit(CU->getUniqueID(), Die, CU->getNode(),
2579 Asm, this, &SkeletonHolder);
Eric Christopher446b88f2013-01-17 03:00:04 +00002580
Eric Christopher3ce51a92013-02-22 23:50:08 +00002581 NewCU->addLocalString(Die, dwarf::DW_AT_GNU_dwo_name,
Eric Christopher30410d52013-08-26 23:57:03 +00002582 DICompileUnit(CU->getNode()).getSplitDebugFilename());
Eric Christopher98e237f2012-11-30 23:59:06 +00002583
Eric Christopher1b0cd2f2013-04-22 07:51:08 +00002584 // Relocate to the beginning of the addr_base section, else 0 for the
2585 // beginning of the one for this compile unit.
Eric Christopher9a9e73b2013-04-07 03:43:09 +00002586 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
2587 NewCU->addLabel(Die, dwarf::DW_AT_GNU_addr_base, dwarf::DW_FORM_sec_offset,
2588 DwarfAddrSectionSym);
2589 else
Eric Christopher1b0cd2f2013-04-22 07:51:08 +00002590 NewCU->addUInt(Die, dwarf::DW_AT_GNU_addr_base,
2591 dwarf::DW_FORM_sec_offset, 0);
Eric Christopher98e237f2012-11-30 23:59:06 +00002592
2593 // 2.17.1 requires that we use DW_AT_low_pc for a single entry point
Eric Christopher72f7bfb2013-01-15 23:56:56 +00002594 // into an entity. We're using 0, or a NULL label for this.
Eric Christopher98e237f2012-11-30 23:59:06 +00002595 NewCU->addUInt(Die, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, 0);
Eric Christopher72f7bfb2013-01-15 23:56:56 +00002596
Eric Christopher98e237f2012-11-30 23:59:06 +00002597 // DW_AT_stmt_list is a offset of line number information for this
2598 // compile unit in debug_line section.
Eric Christopher9a9e73b2013-04-07 03:43:09 +00002599 // FIXME: Should handle multiple compile units.
Eric Christopher98e237f2012-11-30 23:59:06 +00002600 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
Eric Christopher446b88f2013-01-17 03:00:04 +00002601 NewCU->addLabel(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_sec_offset,
Eric Christopher7a0103c2013-02-07 21:19:50 +00002602 DwarfLineSectionSym);
Eric Christopher98e237f2012-11-30 23:59:06 +00002603 else
Eric Christopher446b88f2013-01-17 03:00:04 +00002604 NewCU->addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_sec_offset, 0);
Eric Christopher98e237f2012-11-30 23:59:06 +00002605
2606 if (!CompilationDir.empty())
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002607 NewCU->addLocalString(Die, dwarf::DW_AT_comp_dir, CompilationDir);
Eric Christopher98e237f2012-11-30 23:59:06 +00002608
Eric Christopher0e3e9b72012-12-10 23:34:43 +00002609 SkeletonHolder.addUnit(NewCU);
Eric Christopher01776a52013-02-06 21:53:56 +00002610 SkeletonCUs.push_back(NewCU);
Eric Christopher0e3e9b72012-12-10 23:34:43 +00002611
Eric Christopher98e237f2012-11-30 23:59:06 +00002612 return NewCU;
2613}
2614
Eric Christopher6eebe472012-12-19 22:02:53 +00002615void DwarfDebug::emitSkeletonAbbrevs(const MCSection *Section) {
2616 assert(useSplitDwarf() && "No split dwarf debug info?");
2617 emitAbbrevs(Section, &SkeletonAbbrevs);
Eric Christopher98e237f2012-11-30 23:59:06 +00002618}
2619
Eric Christopher0b944ee2012-12-11 19:42:09 +00002620// Emit the .debug_info.dwo section for separated dwarf. This contains the
2621// compile units that would normally be in debug_info.
Eric Christopher98e237f2012-11-30 23:59:06 +00002622void DwarfDebug::emitDebugInfoDWO() {
Eric Christopher4daaed12012-12-10 19:51:21 +00002623 assert(useSplitDwarf() && "No split dwarf debug info?");
Eric Christopherb1e66d02012-12-15 00:04:07 +00002624 InfoHolder.emitUnits(this, Asm->getObjFileLowering().getDwarfInfoDWOSection(),
Eric Christopher6eebe472012-12-19 22:02:53 +00002625 Asm->getObjFileLowering().getDwarfAbbrevDWOSection(),
2626 DwarfAbbrevDWOSectionSym);
2627}
2628
2629// Emit the .debug_abbrev.dwo section for separated dwarf. This contains the
2630// abbreviations for the .debug_info.dwo section.
2631void DwarfDebug::emitDebugAbbrevDWO() {
2632 assert(useSplitDwarf() && "No split dwarf?");
Eric Christopher72c16552012-12-20 21:58:40 +00002633 emitAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevDWOSection(),
2634 &Abbreviations);
Eric Christopher98e237f2012-11-30 23:59:06 +00002635}
Eric Christopher64f824c2012-12-27 02:14:01 +00002636
2637// Emit the .debug_str.dwo section for separated dwarf. This contains the
2638// string section and is identical in format to traditional .debug_str
2639// sections.
2640void DwarfDebug::emitDebugStrDWO() {
2641 assert(useSplitDwarf() && "No split dwarf?");
Eric Christopherff348452013-01-07 22:40:45 +00002642 const MCSection *OffSec = Asm->getObjFileLowering()
2643 .getDwarfStrOffDWOSection();
Eric Christopherdd8e9f32013-01-07 19:32:41 +00002644 const MCSymbol *StrSym = DwarfStrSectionSym;
2645 InfoHolder.emitStrings(Asm->getObjFileLowering().getDwarfStrDWOSection(),
2646 OffSec, StrSym);
Eric Christopher64f824c2012-12-27 02:14:01 +00002647}
Manman Renbc660712013-09-05 18:48:31 +00002648
Manman Renc5733052013-09-09 19:03:51 +00002649/// Find the MDNode for the given scope reference.
2650DIScope DwarfDebug::resolve(DIScopeRef SRef) const {
2651 return SRef.resolve(TypeIdentifierMap);
Manman Renbc660712013-09-05 18:48:31 +00002652}
Manman Ren18eb2452013-09-09 19:23:58 +00002653
2654// If the current node has a parent scope then return that,
2655// else return an empty scope.
2656DIScope DwarfDebug::getScopeContext(DIScope S) const {
2657
2658 if (S.isType())
Manman Ren2c9905a2013-09-09 19:47:11 +00002659 return resolve(DIType(S).getContext());
Manman Ren18eb2452013-09-09 19:23:58 +00002660
2661 if (S.isSubprogram())
2662 return DISubprogram(S).getContext();
2663
2664 if (S.isLexicalBlock())
2665 return DILexicalBlock(S).getContext();
2666
2667 if (S.isLexicalBlockFile())
2668 return DILexicalBlockFile(S).getContext();
2669
2670 if (S.isNameSpace())
2671 return DINameSpace(S).getContext();
2672
2673 assert((S.isFile() || S.isCompileUnit()) && "Unhandled type of scope.");
2674 return DIScope();
2675}