blob: 79bb8849e23724f09013bd71466e0e736d1fa249 [file] [log] [blame]
Bill Wendling2f921f82009-05-15 09:23:25 +00001//===-- llvm/CodeGen/DwarfDebug.cpp - Dwarf Debug Framework ---------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file contains support for writing dwarf debug info into asm files.
11//
12//===----------------------------------------------------------------------===//
Chris Lattnerb14490d2010-03-09 00:39:24 +000013
Devang Patel80ae3492009-08-28 23:24:31 +000014#define DEBUG_TYPE "dwarfdebug"
Bill Wendling2f921f82009-05-15 09:23:25 +000015#include "DwarfDebug.h"
Chris Lattner3f3fb972010-04-05 05:24:55 +000016#include "DIE.h"
Eric Christopher45731982013-08-08 23:45:55 +000017#include "DIEHash.h"
Eric Christopher4996c702011-11-07 09:24:32 +000018#include "DwarfAccelTable.h"
Devang Patel5eb43192011-04-12 17:40:32 +000019#include "DwarfCompileUnit.h"
Chandler Carruthed0881b2012-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 Greene829b3e82009-08-19 21:52:55 +000024#include "llvm/CodeGen/MachineFunction.h"
Bill Wendling2f921f82009-05-15 09:23:25 +000025#include "llvm/CodeGen/MachineModuleInfo.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000026#include "llvm/DIBuilder.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000027#include "llvm/DebugInfo.h"
Chandler Carruth9fb823b2013-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 Lattnere13c3722010-03-09 01:58:53 +000032#include "llvm/MC/MCAsmInfo.h"
Chris Lattner4d2c0f92009-07-31 18:48:30 +000033#include "llvm/MC/MCSection.h"
Chris Lattner4b7dadb2009-08-19 05:49:37 +000034#include "llvm/MC/MCStreamer.h"
Chris Lattnere13c3722010-03-09 01:58:53 +000035#include "llvm/MC/MCSymbol.h"
Devang Patel6c74a872010-04-27 19:46:33 +000036#include "llvm/Support/CommandLine.h"
Daniel Dunbarcdf01b52009-10-13 06:47:08 +000037#include "llvm/Support/Debug.h"
David Majnemered89b5c2013-08-21 06:13:34 +000038#include "llvm/Support/Dwarf.h"
Daniel Dunbarcdf01b52009-10-13 06:47:08 +000039#include "llvm/Support/ErrorHandling.h"
Chris Lattnerf5c834f2010-01-22 22:09:00 +000040#include "llvm/Support/FormattedStream.h"
Eric Christopher67646432013-07-26 17:02:41 +000041#include "llvm/Support/MD5.h"
Michael J. Spencer447762d2010-11-29 18:16:10 +000042#include "llvm/Support/Path.h"
Chandler Carruthed0881b2012-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 Wendling2f921f82009-05-15 09:23:25 +000050using namespace llvm;
51
Eric Christopher7f2b5512013-07-23 22:16:41 +000052static cl::opt<bool>
53DisableDebugInfoPrinting("disable-debug-info-print", cl::Hidden,
54 cl::desc("Disable debug info printing"));
Devang Patel6c74a872010-04-27 19:46:33 +000055
Eric Christopher7f2b5512013-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 Gohman7421ae42010-05-07 01:08:53 +000060
Eric Christopher7f2b5512013-07-23 22:16:41 +000061static cl::opt<bool>
Eric Christopher67646432013-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 Christopherd29614f2013-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 Christopher20b76a72012-08-23 22:36:40 +000071namespace {
Eric Christopher7f2b5512013-07-23 22:16:41 +000072enum DefaultOnOff {
73 Default,
74 Enable,
75 Disable
76};
Eric Christopher20b76a72012-08-23 22:36:40 +000077}
Eric Christopher4996c702011-11-07 09:24:32 +000078
Eric Christopher7f2b5512013-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 Christopher20b76a72012-08-23 22:36:40 +000086
Eric Christopher7f2b5512013-07-23 22:16:41 +000087static cl::opt<DefaultOnOff>
Eric Christopher7f2b5512013-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 Christopher29424312012-11-12 22:22:20 +000094
Eric Christopher7da24882013-08-19 21:07:38 +000095static cl::opt<DefaultOnOff>
Eric Christopher4d36ca02013-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 Christopher7da24882013-08-19 21:07:38 +0000102
Benjamin Kramerb12cf012013-08-24 12:54:27 +0000103static const char *const DWARFGroupName = "DWARF Emission";
104static const char *const DbgTimerName = "DWARF Debug Writer";
Bill Wendlingfcc14142010-04-07 09:28:04 +0000105
Bill Wendling2f921f82009-05-15 09:23:25 +0000106//===----------------------------------------------------------------------===//
107
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000108// Configuration values for initial hash set sizes (log2).
109//
Bill Wendling2f921f82009-05-15 09:23:25 +0000110static const unsigned InitAbbreviationsSetSize = 9; // log2(512)
Bill Wendling2f921f82009-05-15 09:23:25 +0000111
112namespace llvm {
113
Nick Lewycky019d2552011-07-29 03:49:23 +0000114DIType DbgVariable::getType() const {
Devang Patelf20c4f72011-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 Christopher6a841382012-11-19 22:42:10 +0000125
Devang Patelf20c4f72011-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 Christopher6a841382012-11-19 22:42:10 +0000128
Devang Patelf20c4f72011-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 Christopher6a841382012-11-19 22:42:10 +0000134
Devang Patelf20c4f72011-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 Christopher6a841382012-11-19 22:42:10 +0000137
Devang Patelf20c4f72011-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 Christopher31b05762013-08-08 01:41:00 +0000144 uint16_t tag = Ty.getTag();
Eric Christopher6a841382012-11-19 22:42:10 +0000145
Eric Christopher9adc55f2013-09-04 19:53:21 +0000146 if (tag == dwarf::DW_TAG_pointer_type)
147 subType = DIDerivedType(Ty).getTypeDerivedFrom();
Eric Christopher6a841382012-11-19 22:42:10 +0000148
Eric Christopher9adc55f2013-09-04 19:53:21 +0000149 DIArray Elements = DICompositeType(subType).getTypeArray();
Devang Patelf20c4f72011-04-12 22:53:02 +0000150 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
Eric Christopher9adc55f2013-09-04 19:53:21 +0000151 DIDerivedType DT = DIDerivedType(Elements.getElement(i));
Devang Patelf20c4f72011-04-12 22:53:02 +0000152 if (getName() == DT.getName())
153 return (DT.getTypeDerivedFrom());
Devang Patel6d9f9fe2010-08-09 21:01:39 +0000154 }
Devang Patel6d9f9fe2010-08-09 21:01:39 +0000155 }
Devang Patelf20c4f72011-04-12 22:53:02 +0000156 return Ty;
157}
Bill Wendling2f921f82009-05-15 09:23:25 +0000158
Chris Lattnerf5d06362010-04-05 04:09:20 +0000159} // end llvm namespace
Bill Wendling2f921f82009-05-15 09:23:25 +0000160
Manman Renac8062b2013-07-02 23:40:10 +0000161/// Return Dwarf Version by checking module flags.
162static unsigned getDwarfVersionFromModule(const Module *M) {
Manman Ren8bfde892013-07-16 23:21:16 +0000163 Value *Val = M->getModuleFlag("Dwarf Version");
164 if (!Val)
Eric Christophere31e0722013-09-04 22:21:24 +0000165 return dwarf::DWARF_VERSION;
Manman Ren8bfde892013-07-16 23:21:16 +0000166 return cast<ConstantInt>(Val)->getZExtValue();
Manman Renac8062b2013-07-02 23:40:10 +0000167}
168
Chris Lattnerf0d6bd32010-04-05 05:11:15 +0000169DwarfDebug::DwarfDebug(AsmPrinter *A, Module *M)
Eric Christopherd79f5482012-12-10 19:51:13 +0000170 : Asm(A), MMI(Asm->MMI), FirstCU(0),
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000171 AbbreviationsSet(InitAbbreviationsSetSize),
Eric Christopher27614582013-01-08 22:22:06 +0000172 SourceIdMap(DIEValueAllocator),
Eric Christopherc8a310e2012-12-10 23:34:43 +0000173 PrevLabel(NULL), GlobalCUIndexCount(0),
Eric Christopher27614582013-01-08 22:22:06 +0000174 InfoHolder(A, &AbbreviationsSet, &Abbreviations, "info_string",
175 DIEValueAllocator),
Eric Christopher3c5a1912012-12-19 22:02:53 +0000176 SkeletonAbbrevSet(InitAbbreviationsSetSize),
Eric Christopher27614582013-01-08 22:22:06 +0000177 SkeletonHolder(A, &SkeletonAbbrevSet, &SkeletonAbbrevs, "skel_string",
178 DIEValueAllocator) {
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000179
Rafael Espindolaa7160962011-05-06 14:56:22 +0000180 DwarfInfoSectionSym = DwarfAbbrevSectionSym = 0;
Chris Lattnere58b5472010-04-04 23:10:38 +0000181 DwarfStrSectionSym = TextSectionSym = 0;
Eric Christopher74804332013-02-07 21:19:50 +0000182 DwarfDebugRangeSectionSym = DwarfDebugLocSectionSym = DwarfLineSectionSym = 0;
Eric Christopher55863be2013-04-07 03:43:09 +0000183 DwarfAddrSectionSym = 0;
Eric Christopher3bf29fd2012-12-27 02:14:01 +0000184 DwarfAbbrevDWOSectionSym = DwarfStrDWOSectionSym = 0;
Devang Patel9fc11702010-05-25 23:40:22 +0000185 FunctionBeginSym = FunctionEndSym = 0;
Eric Christopherad9fe892012-04-02 17:58:52 +0000186
Eric Christopher978fbff2012-08-23 07:10:46 +0000187 // Turn on accelerator tables and older gdb compatibility
Eric Christopher574b5c82013-08-19 21:41:38 +0000188 // for Darwin by default, pubnames by default for non-Darwin,
189 // and handle split dwarf.
Eric Christopher203e12b2013-04-27 01:07:52 +0000190 bool IsDarwin = Triple(A->getTargetTriple()).isOSDarwin();
Eric Christopher4977f212012-08-23 22:36:36 +0000191
Eric Christopher574b5c82013-08-19 21:41:38 +0000192 if (DwarfAccelTables == Default)
193 HasDwarfAccelTables = IsDarwin;
194 else
Eric Christopher5297df02013-08-26 20:58:35 +0000195 HasDwarfAccelTables = DwarfAccelTables == Enable;
Eric Christopher20b76a72012-08-23 22:36:40 +0000196
Eric Christophercdf218d2012-12-10 19:51:21 +0000197 if (SplitDwarf == Default)
198 HasSplitDwarf = false;
Eric Christopher29424312012-11-12 22:22:20 +0000199 else
Eric Christopher574b5c82013-08-19 21:41:38 +0000200 HasSplitDwarf = SplitDwarf == Enable;
Eric Christopher29424312012-11-12 22:22:20 +0000201
Eric Christopher4d36ca02013-08-26 23:24:35 +0000202 if (DwarfPubSections == Default)
203 HasDwarfPubSections = !IsDarwin;
Eric Christopher574b5c82013-08-19 21:41:38 +0000204 else
Eric Christopher4d36ca02013-08-26 23:24:35 +0000205 HasDwarfPubSections = DwarfPubSections == Enable;
Eric Christopher7da24882013-08-19 21:07:38 +0000206
Manman Renac8062b2013-07-02 23:40:10 +0000207 DwarfVersion = getDwarfVersionFromModule(MMI->getModule());
208
Dan Gohman6e681a52010-06-18 15:56:31 +0000209 {
210 NamedRegionTimer T(DbgTimerName, DWARFGroupName, TimePassesIsEnabled);
Eric Christopher58f41952012-11-19 22:42:15 +0000211 beginModule();
Torok Edwinf8dba242010-04-07 10:44:46 +0000212 }
Bill Wendling2f921f82009-05-15 09:23:25 +0000213}
214DwarfDebug::~DwarfDebug() {
Bill Wendling2f921f82009-05-15 09:23:25 +0000215}
216
Eric Christopheracdcbdb2012-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 Christopher7b30f2e42012-11-21 00:34:35 +0000219static MCSymbol *emitSectionSym(AsmPrinter *Asm, const MCSection *Section,
Eric Christophera7b61892011-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 Christophere698f532012-12-20 21:58:36 +0000229MCSymbol *DwarfUnits::getStringPoolSym() {
Eric Christopher3bf29fd2012-12-27 02:14:01 +0000230 return Asm->GetTempSymbol(StringPref);
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +0000231}
232
Eric Christophere698f532012-12-20 21:58:36 +0000233MCSymbol *DwarfUnits::getStringPoolEntry(StringRef Str) {
234 std::pair<MCSymbol*, unsigned> &Entry =
Eric Christopher27614582013-01-08 22:22:06 +0000235 StringPool.GetOrCreateValue(Str).getValue();
Chris Lattnerb7aa9522010-03-13 02:17:42 +0000236 if (Entry.first) return Entry.first;
237
238 Entry.second = NextStringPoolNumber++;
Eric Christopher3bf29fd2012-12-27 02:14:01 +0000239 return Entry.first = Asm->GetTempSymbol(StringPref, Entry.second);
Chris Lattnerb7aa9522010-03-13 02:17:42 +0000240}
241
Eric Christopher2cbd5762013-01-07 19:32:41 +0000242unsigned DwarfUnits::getStringPoolIndex(StringRef Str) {
243 std::pair<MCSymbol*, unsigned> &Entry =
Eric Christopher27614582013-01-08 22:22:06 +0000244 StringPool.GetOrCreateValue(Str).getValue();
Eric Christopher2cbd5762013-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 Blaikiedea547b2013-06-28 18:47:14 +0000252unsigned DwarfUnits::getAddrPoolIndex(const MCSymbol *Sym) {
David Blaikie8466ca82013-07-01 23:55:52 +0000253 return getAddrPoolIndex(MCSymbolRefExpr::Create(Sym, Asm->OutContext));
254}
255
Ulrich Weigand8b3d2262013-07-02 18:46:46 +0000256unsigned DwarfUnits::getAddrPoolIndex(const MCExpr *Sym) {
257 std::pair<DenseMap<const MCExpr *, unsigned>::iterator, bool> P =
David Blaikieb8ef7852013-06-28 18:47:19 +0000258 AddressPool.insert(std::make_pair(Sym, NextAddrPoolNumber));
David Blaikiea67de2b2013-06-28 18:55:13 +0000259 if (P.second)
260 ++NextAddrPoolNumber;
David Blaikieb8ef7852013-06-28 18:47:19 +0000261 return P.first->second;
Eric Christopher962c9082013-01-15 23:56:56 +0000262}
263
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000264// Define a unique number for the abbreviation.
265//
Eric Christopherc8a310e2012-12-10 23:34:43 +0000266void DwarfUnits::assignAbbrevNumber(DIEAbbrev &Abbrev) {
Bill Wendling2f921f82009-05-15 09:23:25 +0000267 // Check the set for priors.
Eric Christopherc8a310e2012-12-10 23:34:43 +0000268 DIEAbbrev *InSet = AbbreviationsSet->GetOrInsertNode(&Abbrev);
Bill Wendling2f921f82009-05-15 09:23:25 +0000269
270 // If it's newly added.
271 if (InSet == &Abbrev) {
272 // Add to abbreviation list.
Eric Christopherc8a310e2012-12-10 23:34:43 +0000273 Abbreviations->push_back(&Abbrev);
Bill Wendling2f921f82009-05-15 09:23:25 +0000274
275 // Assign the vector position + 1 as its number.
Eric Christopherc8a310e2012-12-10 23:34:43 +0000276 Abbrev.setNumber(Abbreviations->size());
Bill Wendling2f921f82009-05-15 09:23:25 +0000277 } else {
278 // Assign existing abbreviation number.
279 Abbrev.setNumber(InSet->getNumber());
280 }
281}
282
Eric Christopherd9843b32011-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 Kramer260de742013-08-24 12:15:54 +0000290 return Name.find(") ") != StringRef::npos;
Eric Christopherd9843b32011-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 Christopher6a841382012-11-19 22:42:10 +0000314
Eric Christopherd9843b32011-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 Ren3eb9dff2013-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 Ren116868e2013-09-09 19:47:11 +0000344 return isSubprogramContext(resolve(DIType(Context).getContext()));
Manman Ren3eb9dff2013-09-09 19:05:21 +0000345 return false;
346}
347
Eric Christopheracdcbdb2012-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 Pateld2dfc5e2011-08-15 22:24:32 +0000351DIE *DwarfDebug::updateSubprogramScopeDIE(CompileUnit *SPCU,
352 const MDNode *SPNode) {
Devang Patel1a0df9a2010-05-10 22:49:55 +0000353 DIE *SPDie = SPCU->getDIE(SPNode);
Devang Patela37a95e2010-07-07 22:20:57 +0000354
Chris Lattner3a383cb2010-04-05 00:13:49 +0000355 assert(SPDie && "Unable to find subprogram DIE!");
356 DISubprogram SP(SPNode);
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000357
Bill Wendlingf720bf62012-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 Ren14a029d2013-03-12 18:27:15 +0000361 DIE *AbsSPDIE = AbstractSPDies.lookup(SPNode);
362 if (AbsSPDIE) {
363 bool InSameCU = (AbsSPDIE->getCompileUnit() == SPCU->getCUDie());
Bill Wendlingf720bf62012-11-07 05:19:04 +0000364 // Pick up abstract subprogram DIE.
Devang Patela37a95e2010-07-07 22:20:57 +0000365 SPDie = new DIE(dwarf::DW_TAG_subprogram);
Manman Ren14a029d2013-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 Patelf20c4f72011-04-12 22:53:02 +0000368 SPCU->addDIEEntry(SPDie, dwarf::DW_AT_abstract_origin,
Manman Ren14a029d2013-03-12 18:27:15 +0000369 InSameCU ? dwarf::DW_FORM_ref4 : dwarf::DW_FORM_ref_addr,
370 AbsSPDIE);
Devang Patela37a95e2010-07-07 22:20:57 +0000371 SPCU->addDie(SPDie);
Bill Wendlingd9bb9b62012-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 Christopher31b05762013-08-08 01:41:00 +0000388 uint16_t SPTag = SPTy.getTag();
Bill Wendlingd9bb9b62012-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 Christopher6a841382012-11-19 22:42:10 +0000403 SPCU->addDIEEntry(SPDie, dwarf::DW_AT_specification,
404 dwarf::DW_FORM_ref4, SPDeclDie);
Bill Wendlingd9bb9b62012-11-07 04:42:18 +0000405 SPCU->addDie(SPDie);
406 }
407 }
Devang Patela37a95e2010-07-07 22:20:57 +0000408 }
409
Eric Christopher962c9082013-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 Lattner3a383cb2010-04-05 00:13:49 +0000416 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
417 MachineLocation Location(RI->getFrameRegister(*Asm->MF));
Devang Patelf20c4f72011-04-12 22:53:02 +0000418 SPCU->addAddress(SPDie, dwarf::DW_AT_frame_base, Location);
Devang Patel6efc8e52010-02-06 01:02:37 +0000419
Eric Christopherd9843b32011-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 Christopher6a841382012-11-19 22:42:10 +0000423
Chris Lattner3a383cb2010-04-05 00:13:49 +0000424 return SPDie;
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000425}
426
Eric Christopheracdcbdb2012-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 Christopher6a841382012-11-19 22:42:10 +0000429DIE *DwarfDebug::constructLexicalScopeDIE(CompileUnit *TheCU,
Devang Pateld2dfc5e2011-08-15 22:24:32 +0000430 LexicalScope *Scope) {
Devang Patel6c74a872010-04-27 19:46:33 +0000431 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_lexical_block);
432 if (Scope->isAbstractScope())
433 return ScopeDIE;
434
Craig Topper977e9cd2013-07-03 04:24:43 +0000435 const SmallVectorImpl<InsnRange> &Ranges = Scope->getRanges();
Devang Patel6c74a872010-04-27 19:46:33 +0000436 if (Ranges.empty())
437 return 0;
438
Eric Christopherdc42ea82013-07-03 01:57:28 +0000439 // If we have multiple ranges, emit them into the range section.
Devang Patel6c74a872010-04-27 19:46:33 +0000440 if (Ranges.size() > 1) {
441 // .debug_range section has not been laid out yet. Emit offset in
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000442 // .debug_range as a uint, size 4, for now. emitDIE will handle
Devang Patel6c74a872010-04-27 19:46:33 +0000443 // DW_AT_ranges appropriately.
Devang Patelf20c4f72011-04-12 22:53:02 +0000444 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_ranges, dwarf::DW_FORM_data4,
Eric Christopher6a841382012-11-19 22:42:10 +0000445 DebugRangeSymbols.size()
Chandler Carruth5da3f052012-11-01 09:14:31 +0000446 * Asm->getDataLayout().getPointerSize());
Craig Topperd8e43652013-07-03 04:17:25 +0000447 for (SmallVectorImpl<InsnRange>::const_iterator RI = Ranges.begin(),
Devang Patel6c74a872010-04-27 19:46:33 +0000448 RE = Ranges.end(); RI != RE; ++RI) {
Devang Patel9fc11702010-05-25 23:40:22 +0000449 DebugRangeSymbols.push_back(getLabelBeforeInsn(RI->first));
450 DebugRangeSymbols.push_back(getLabelAfterInsn(RI->second));
Devang Patel6c74a872010-04-27 19:46:33 +0000451 }
Eric Christopherc1110832013-07-03 01:22:29 +0000452
453 // Terminate the range list.
Devang Patel6c74a872010-04-27 19:46:33 +0000454 DebugRangeSymbols.push_back(NULL);
455 DebugRangeSymbols.push_back(NULL);
456 return ScopeDIE;
457 }
458
Eric Christopherdc42ea82013-07-03 01:57:28 +0000459 // Construct the address range for this DIE.
Craig Topperd8e43652013-07-03 04:17:25 +0000460 SmallVectorImpl<InsnRange>::const_iterator RI = Ranges.begin();
Eric Christopher962c9082013-01-15 23:56:56 +0000461 MCSymbol *Start = getLabelBeforeInsn(RI->first);
462 MCSymbol *End = getLabelAfterInsn(RI->second);
Devang Patel6c74a872010-04-27 19:46:33 +0000463
Devang Patel9fc11702010-05-25 23:40:22 +0000464 if (End == 0) return 0;
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000465
Chris Lattnere13c3722010-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 Grosbacha8683bb2010-07-21 21:21:52 +0000468
Eric Christopher962c9082013-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 Patelf6eeaeb2009-11-10 23:06:00 +0000471
472 return ScopeDIE;
473}
474
Eric Christopheracdcbdb2012-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 Pateld2dfc5e2011-08-15 22:24:32 +0000477DIE *DwarfDebug::constructInlinedScopeDIE(CompileUnit *TheCU,
478 LexicalScope *Scope) {
Craig Topper977e9cd2013-07-03 04:24:43 +0000479 const SmallVectorImpl<InsnRange> &Ranges = Scope->getRanges();
Nick Lewycky654f5ce2011-10-26 22:55:33 +0000480 assert(Ranges.empty() == false &&
481 "LexicalScope does not have instruction markers!");
Devang Patel6c74a872010-04-27 19:46:33 +0000482
Devang Patelf098ce22011-07-27 00:34:13 +0000483 if (!Scope->getScopeNode())
484 return NULL;
485 DIScope DS(Scope->getScopeNode());
486 DISubprogram InlinedSP = getDISubprogram(DS);
Manman Ren4213c392013-05-29 17:16:59 +0000487 DIE *OriginDIE = TheCU->getDIE(InlinedSP);
Devang Patelf098ce22011-07-27 00:34:13 +0000488 if (!OriginDIE) {
Bill Wendling10e0e2e2012-10-30 17:51:02 +0000489 DEBUG(dbgs() << "Unable to find original DIE for an inlined subprogram.");
Devang Patelf098ce22011-07-27 00:34:13 +0000490 return NULL;
491 }
492
Devang Patel73bc1722011-05-05 17:54:26 +0000493 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_inlined_subroutine);
Devang Patelf20c4f72011-04-12 22:53:02 +0000494 TheCU->addDIEEntry(ScopeDIE, dwarf::DW_AT_abstract_origin,
Manman Ren4213c392013-05-29 17:16:59 +0000495 dwarf::DW_FORM_ref4, OriginDIE);
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000496
Devang Patelf098ce22011-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 Christopher6a841382012-11-19 22:42:10 +0000502 DebugRangeSymbols.size()
Chandler Carruth5da3f052012-11-01 09:14:31 +0000503 * Asm->getDataLayout().getPointerSize());
Craig Topperd8e43652013-07-03 04:17:25 +0000504 for (SmallVectorImpl<InsnRange>::const_iterator RI = Ranges.begin(),
Devang Patelf098ce22011-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 Topperd8e43652013-07-03 04:17:25 +0000512 SmallVectorImpl<InsnRange>::const_iterator RI = Ranges.begin();
Eric Christopherf94eb2b2013-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 Christopher962c9082013-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 Patelf098ce22011-07-27 00:34:13 +0000525 }
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000526
527 InlinedSubprogramDIEs.insert(OriginDIE);
528
Eric Christopherf94eb2b2013-07-03 02:23:53 +0000529 // Add the call site information to the DIE.
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000530 DILocation DL(Scope->getInlinedAt());
Eric Christopher0925c622012-03-26 21:38:38 +0000531 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_call_file, 0,
Manman Ren1e427202013-03-07 01:42:00 +0000532 getOrCreateSourceID(DL.getFilename(), DL.getDirectory(),
533 TheCU->getUniqueID()));
Devang Patelf20c4f72011-04-12 22:53:02 +0000534 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_call_line, 0, DL.getLineNumber());
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000535
Eric Christopher8dda5d02011-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 Christopher6a841382012-11-19 22:42:10 +0000539
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000540 return ScopeDIE;
541}
542
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000543// Construct a DIE for this scope.
Devang Patel3acc70e2011-08-15 22:04:40 +0000544DIE *DwarfDebug::constructScopeDIE(CompileUnit *TheCU, LexicalScope *Scope) {
Devang Patel3b548aa2010-03-08 20:52:55 +0000545 if (!Scope || !Scope->getScopeNode())
546 return NULL;
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000547
Manman Ren53f3f9f2013-01-31 20:05:14 +0000548 DIScope DS(Scope->getScopeNode());
549 // Early return to avoid creating dangling variable|scope DIEs.
Manman Ren4213c392013-05-29 17:16:59 +0000550 if (!Scope->getInlinedAt() && DS.isSubprogram() && Scope->isAbstractScope() &&
551 !TheCU->getDIE(DS))
552 return NULL;
Manman Ren53f3f9f2013-01-31 20:05:14 +0000553
Nick Lewycky654f5ce2011-10-26 22:55:33 +0000554 SmallVector<DIE *, 8> Children;
Eric Christophere3417762012-09-12 23:36:19 +0000555 DIE *ObjectPointer = NULL;
Devang Patel6c622ef2011-03-01 22:58:55 +0000556
557 // Collect arguments for current function.
Devang Patel7e623022011-08-10 20:55:27 +0000558 if (LScopes.isCurrentFunctionScope(Scope))
Devang Patel6c622ef2011-03-01 22:58:55 +0000559 for (unsigned i = 0, N = CurrentFnArguments.size(); i < N; ++i)
560 if (DbgVariable *ArgDV = CurrentFnArguments[i])
Eric Christopher6a841382012-11-19 22:42:10 +0000561 if (DIE *Arg =
Eric Christophere3417762012-09-12 23:36:19 +0000562 TheCU->constructVariableDIE(ArgDV, Scope->isAbstractScope())) {
Devang Patel6c622ef2011-03-01 22:58:55 +0000563 Children.push_back(Arg);
Eric Christophere3417762012-09-12 23:36:19 +0000564 if (ArgDV->isObjectPointer()) ObjectPointer = Arg;
565 }
Devang Patel6c622ef2011-03-01 22:58:55 +0000566
Eric Christopherf84354b2011-10-03 15:49:16 +0000567 // Collect lexical scope children first.
Craig Topper977e9cd2013-07-03 04:24:43 +0000568 const SmallVectorImpl<DbgVariable *> &Variables =ScopeVariables.lookup(Scope);
Devang Patel5f1b4cd2011-02-19 01:31:27 +0000569 for (unsigned i = 0, N = Variables.size(); i < N; ++i)
Eric Christopher6a841382012-11-19 22:42:10 +0000570 if (DIE *Variable =
Eric Christopherc1c8a1b2012-09-21 22:18:52 +0000571 TheCU->constructVariableDIE(Variables[i], Scope->isAbstractScope())) {
Devang Patel5f1b4cd2011-02-19 01:31:27 +0000572 Children.push_back(Variable);
Eric Christopherc1c8a1b2012-09-21 22:18:52 +0000573 if (Variables[i]->isObjectPointer()) ObjectPointer = Variable;
574 }
Craig Topper977e9cd2013-07-03 04:24:43 +0000575 const SmallVectorImpl<LexicalScope *> &Scopes = Scope->getChildren();
Devang Patel5f1b4cd2011-02-19 01:31:27 +0000576 for (unsigned j = 0, M = Scopes.size(); j < M; ++j)
Devang Patel3acc70e2011-08-15 22:04:40 +0000577 if (DIE *Nested = constructScopeDIE(TheCU, Scopes[j]))
Devang Patel5f1b4cd2011-02-19 01:31:27 +0000578 Children.push_back(Nested);
Devang Patel3b548aa2010-03-08 20:52:55 +0000579 DIE *ScopeDIE = NULL;
580 if (Scope->getInlinedAt())
Devang Pateld2dfc5e2011-08-15 22:24:32 +0000581 ScopeDIE = constructInlinedScopeDIE(TheCU, Scope);
Devang Patel3b548aa2010-03-08 20:52:55 +0000582 else if (DS.isSubprogram()) {
Devang Pateld10b2af2010-06-28 20:53:04 +0000583 ProcessedSPNodes.insert(DS);
Devang Patela37a95e2010-07-07 22:20:57 +0000584 if (Scope->isAbstractScope()) {
Manman Ren4213c392013-05-29 17:16:59 +0000585 ScopeDIE = TheCU->getDIE(DS);
Devang Patela37a95e2010-07-07 22:20:57 +0000586 // Note down abstract DIE.
587 if (ScopeDIE)
588 AbstractSPDies.insert(std::make_pair(DS, ScopeDIE));
589 }
Devang Patel3b548aa2010-03-08 20:52:55 +0000590 else
Devang Pateld2dfc5e2011-08-15 22:24:32 +0000591 ScopeDIE = updateSubprogramScopeDIE(TheCU, DS);
Devang Patel3b548aa2010-03-08 20:52:55 +0000592 }
Devang Patel5f1b4cd2011-02-19 01:31:27 +0000593 else {
594 // There is no need to emit empty lexical block DIE.
David Blaikie684fc532013-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 Iskhodzhanovec4afe62013-05-07 07:47:47 +0000598 std::pair<const MDNode *, const MDNode *>(DS, (const MDNode*)0),
Benjamin Kramerb12cf012013-08-24 12:54:27 +0000599 less_first());
David Blaikie684fc532013-05-06 23:33:07 +0000600 if (Children.empty() && Range.first == Range.second)
Devang Patel5f1b4cd2011-02-19 01:31:27 +0000601 return NULL;
Devang Pateld2dfc5e2011-08-15 22:24:32 +0000602 ScopeDIE = constructLexicalScopeDIE(TheCU, Scope);
Eric Christopher5fdd68e2013-06-24 23:20:02 +0000603 for (ImportedEntityMap::const_iterator i = Range.first; i != Range.second;
604 ++i)
David Blaikie4dd2de72013-05-08 06:01:38 +0000605 constructImportedEntityDIE(TheCU, i->second, ScopeDIE);
Devang Patel5f1b4cd2011-02-19 01:31:27 +0000606 }
Eric Christopher6a841382012-11-19 22:42:10 +0000607
Benjamin Kramer892daba2013-08-24 11:55:49 +0000608 if (!ScopeDIE) {
609 std::for_each(Children.begin(), Children.end(), deleter<DIE>);
610 return NULL;
611 }
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000612
Devang Patel5f1b4cd2011-02-19 01:31:27 +0000613 // Add children
Craig Topperd8e43652013-07-03 04:17:25 +0000614 for (SmallVectorImpl<DIE *>::iterator I = Children.begin(),
Devang Patel5f1b4cd2011-02-19 01:31:27 +0000615 E = Children.end(); I != E; ++I)
616 ScopeDIE->addChild(*I);
Devang Patel04d2f2d2009-11-24 01:14:22 +0000617
Eric Christophere3417762012-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 Grosbacha8683bb2010-07-21 21:21:52 +0000622 if (DS.isSubprogram())
Eric Christopherd9843b32011-11-10 19:25:34 +0000623 TheCU->addPubTypes(DISubprogram(DS));
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000624
Eric Christopherd9843b32011-11-10 19:25:34 +0000625 return ScopeDIE;
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000626}
627
Eric Christopheracdcbdb2012-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 Christopher7b30f2e42012-11-21 00:34:35 +0000632unsigned DwarfDebug::getOrCreateSourceID(StringRef FileName,
Manman Ren1e427202013-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 Patel871d0b12010-09-16 20:57:49 +0000640 // If FE did not provide a file name, then assume stdin.
641 if (FileName.empty())
Manman Ren1e427202013-03-07 01:42:00 +0000642 return getOrCreateSourceID("<stdin>", StringRef(), CUID);
Devang Patele01b75c2011-03-24 20:30:50 +0000643
Nick Lewyckyd1ee7f82011-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 Ren1e427202013-03-07 01:42:00 +0000648 // FileIDCUMap stores the current ID for the given compile unit.
649 unsigned SrcId = FileIDCUMap[CUID] + 1;
Devang Patel871d0b12010-09-16 20:57:49 +0000650
Manman Ren1e427202013-03-07 01:42:00 +0000651 // We look up the CUID/file/dir by concatenating them with a zero byte.
Benjamin Kramer71b19732012-03-11 14:56:26 +0000652 SmallString<128> NamePair;
Manman Ren5b22f9f2013-04-06 01:02:38 +0000653 NamePair += utostr(CUID);
Manman Ren1e427202013-03-07 01:42:00 +0000654 NamePair += '\0';
Benjamin Kramer71b19732012-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 Wendling2b128d72009-05-20 23:19:06 +0000662
Manman Ren1e427202013-03-07 01:42:00 +0000663 FileIDCUMap[CUID] = SrcId;
Rafael Espindola67c6ab82010-11-18 02:04:25 +0000664 // Print out a .file directive to specify files for .loc directives.
Manman Ren1e427202013-03-07 01:42:00 +0000665 Asm->OutStreamer.EmitDwarfFileDirective(SrcId, DirName, FileName, CUID);
Bill Wendling2b128d72009-05-20 23:19:06 +0000666
667 return SrcId;
668}
669
Eric Christopher48fef592012-12-20 21:58:40 +0000670// Create new CompileUnit for the given metadata node with tag
671// DW_TAG_compile_unit.
Devang Pateleb1bb4e2011-08-16 22:09:43 +0000672CompileUnit *DwarfDebug::constructCompileUnit(const MDNode *N) {
Devang Patel80ae3492009-08-28 23:24:31 +0000673 DICompileUnit DIUnit(N);
Devang Patel2d9caf92009-11-25 17:36:49 +0000674 StringRef FN = DIUnit.getFilename();
Nick Lewyckyd1ee7f82011-11-02 20:55:33 +0000675 CompilationDir = DIUnit.getDirectory();
Bill Wendling2b128d72009-05-20 23:19:06 +0000676
677 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
Eric Christopherbfceb2f2013-08-26 23:50:38 +0000678 CompileUnit *NewCU =
679 new CompileUnit(GlobalCUIndexCount++, Die, N, Asm, this, &InfoHolder);
Manman Ren1e427202013-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 Lewyckyd59c0ca2011-10-27 06:44:11 +0000686 NewCU->addString(Die, dwarf::DW_AT_producer, DIUnit.getProducer());
Devang Patelf20c4f72011-04-12 22:53:02 +0000687 NewCU->addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data2,
688 DIUnit.getLanguage());
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +0000689 NewCU->addString(Die, dwarf::DW_AT_name, FN);
Eric Christopher52ce7182013-04-09 19:23:15 +0000690
Eric Christopherb1b94512012-08-01 18:19:01 +0000691 // 2.17.1 requires that we use DW_AT_low_pc for a single entry point
Eric Christopher52ce7182013-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 Ren4e042a62013-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 Ren9d4c7352013-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 Pateld22ed622010-03-22 23:11:36 +0000709 // DW_AT_stmt_list is a offset of line number information for this
Eric Christopher52ce7182013-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 Rend2c95eb2013-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 Christopher52ce7182013-04-09 19:23:15 +0000714 if (!useSplitDwarf()) {
715 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
Carlo Kokbac096a2013-08-13 17:46:57 +0000716 NewCU->addLabel(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_sec_offset,
Manman Ren9d4c7352013-05-21 00:57:22 +0000717 UseTheFirstCU ?
Eric Christopher52ce7182013-04-09 19:23:15 +0000718 Asm->GetTempSymbol("section_line") : LineTableStartSym);
Manman Ren9d4c7352013-05-21 00:57:22 +0000719 else if (UseTheFirstCU)
Eric Christopher52ce7182013-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 Wendling2b128d72009-05-20 23:19:06 +0000725
Eric Christopher52ce7182013-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 Lewyckyd1ee7f82011-11-02 20:55:33 +0000729 NewCU->addString(Die, dwarf::DW_AT_comp_dir, CompilationDir);
Bill Wendling2b128d72009-05-20 23:19:06 +0000730 if (DIUnit.isOptimized())
Eric Christopherbb69a272012-08-24 01:14:27 +0000731 NewCU->addFlag(Die, dwarf::DW_AT_APPLE_optimized);
Bill Wendling2b128d72009-05-20 23:19:06 +0000732
Devang Patel2d9caf92009-11-25 17:36:49 +0000733 StringRef Flags = DIUnit.getFlags();
734 if (!Flags.empty())
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +0000735 NewCU->addString(Die, dwarf::DW_AT_APPLE_flags, Flags);
Eric Christopher6a841382012-11-19 22:42:10 +0000736
Nick Lewycky479a8fe2011-10-17 23:27:36 +0000737 if (unsigned RVer = DIUnit.getRunTimeVersion())
Devang Patelf20c4f72011-04-12 22:53:02 +0000738 NewCU->addUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers,
Bill Wendling2b128d72009-05-20 23:19:06 +0000739 dwarf::DW_FORM_data1, RVer);
740
Devang Patel1a0df9a2010-05-10 22:49:55 +0000741 if (!FirstCU)
742 FirstCU = NewCU;
Eric Christopher7a2cdf72013-02-05 07:31:55 +0000743
Eric Christopherc8a310e2012-12-10 23:34:43 +0000744 InfoHolder.addUnit(NewCU);
745
Devang Patel1a0df9a2010-05-10 22:49:55 +0000746 CUMap.insert(std::make_pair(N, NewCU));
Devang Pateleb1bb4e2011-08-16 22:09:43 +0000747 return NewCU;
Devang Patel1a0df9a2010-05-10 22:49:55 +0000748}
749
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000750// Construct subprogram DIE.
Eric Christopher6a841382012-11-19 22:42:10 +0000751void DwarfDebug::constructSubprogramDIE(CompileUnit *TheCU,
Devang Patel1f4f98d2011-08-15 23:36:40 +0000752 const MDNode *N) {
Rafael Espindola6cf4e832011-11-04 19:00:29 +0000753 CompileUnit *&CURef = SPMap[N];
754 if (CURef)
755 return;
756 CURef = TheCU;
757
Devang Patel80ae3492009-08-28 23:24:31 +0000758 DISubprogram SP(N);
Bill Wendling2b128d72009-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 Patel0751a282009-06-26 01:49:18 +0000762 return;
Bill Wendling2b128d72009-05-20 23:19:06 +0000763
Devang Patel89543712011-08-15 17:24:54 +0000764 DIE *SubprogramDie = TheCU->getOrCreateSubprogramDIE(SP);
Stuart Hastings4bd3dd92010-04-06 21:38:29 +0000765
766 // Add to map.
Devang Patel1a0df9a2010-05-10 22:49:55 +0000767 TheCU->insertDIE(N, SubprogramDie);
Bill Wendling2b128d72009-05-20 23:19:06 +0000768
769 // Add to context owner.
Devang Patelf20c4f72011-04-12 22:53:02 +0000770 TheCU->addToContextOwner(SubprogramDie, SP.getContext());
Devang Patel512001a2009-12-08 23:21:45 +0000771
Eric Christopherba506db2013-09-09 20:03:20 +0000772 // Expose as a global name.
773 TheCU->addGlobalName(SP.getName(), SubprogramDie);
Bill Wendling2b128d72009-05-20 23:19:06 +0000774}
775
David Blaikie1fd43652013-05-07 21:35:53 +0000776void DwarfDebug::constructImportedEntityDIE(CompileUnit *TheCU,
David Blaikief55abea2013-04-22 06:12:31 +0000777 const MDNode *N) {
David Blaikie1fd43652013-05-07 21:35:53 +0000778 DIImportedEntity Module(N);
David Blaikief55abea2013-04-22 06:12:31 +0000779 if (!Module.Verify())
780 return;
David Blaikie684fc532013-05-06 23:33:07 +0000781 if (DIE *D = TheCU->getOrCreateContextDIE(Module.getContext()))
David Blaikie4dd2de72013-05-08 06:01:38 +0000782 constructImportedEntityDIE(TheCU, Module, D);
David Blaikie684fc532013-05-06 23:33:07 +0000783}
784
David Blaikie4dd2de72013-05-08 06:01:38 +0000785void DwarfDebug::constructImportedEntityDIE(CompileUnit *TheCU, const MDNode *N,
David Blaikie684fc532013-05-06 23:33:07 +0000786 DIE *Context) {
David Blaikie1fd43652013-05-07 21:35:53 +0000787 DIImportedEntity Module(N);
David Blaikie684fc532013-05-06 23:33:07 +0000788 if (!Module.Verify())
789 return;
David Blaikie4dd2de72013-05-08 06:01:38 +0000790 return constructImportedEntityDIE(TheCU, Module, Context);
David Blaikie684fc532013-05-06 23:33:07 +0000791}
792
David Blaikie4dd2de72013-05-08 06:01:38 +0000793void DwarfDebug::constructImportedEntityDIE(CompileUnit *TheCU,
David Blaikie1fd43652013-05-07 21:35:53 +0000794 const DIImportedEntity &Module,
David Blaikie684fc532013-05-06 23:33:07 +0000795 DIE *Context) {
796 assert(Module.Verify() &&
797 "Use one of the MDNode * overloads to handle invalid metadata");
798 assert(Context && "Should always have a context for an imported_module");
David Blaikie1fd43652013-05-07 21:35:53 +0000799 DIE *IMDie = new DIE(Module.getTag());
David Blaikief55abea2013-04-22 06:12:31 +0000800 TheCU->insertDIE(Module, IMDie);
David Blaikie1fd43652013-05-07 21:35:53 +0000801 DIE *EntityDie;
802 DIDescriptor Entity = Module.getEntity();
803 if (Entity.isNameSpace())
804 EntityDie = TheCU->getOrCreateNameSpace(DINameSpace(Entity));
805 else if (Entity.isSubprogram())
806 EntityDie = TheCU->getOrCreateSubprogramDIE(DISubprogram(Entity));
David Blaikie3b6038b2013-05-08 06:01:41 +0000807 else if (Entity.isType())
808 EntityDie = TheCU->getOrCreateTypeDIE(DIType(Entity));
David Blaikie1fd43652013-05-07 21:35:53 +0000809 else
David Blaikie3b6038b2013-05-08 06:01:41 +0000810 EntityDie = TheCU->getDIE(Entity);
David Blaikief55abea2013-04-22 06:12:31 +0000811 unsigned FileID = getOrCreateSourceID(Module.getContext().getFilename(),
812 Module.getContext().getDirectory(),
813 TheCU->getUniqueID());
814 TheCU->addUInt(IMDie, dwarf::DW_AT_decl_file, 0, FileID);
815 TheCU->addUInt(IMDie, dwarf::DW_AT_decl_line, 0, Module.getLineNumber());
Eric Christopher5fdd68e2013-06-24 23:20:02 +0000816 TheCU->addDIEEntry(IMDie, dwarf::DW_AT_import, dwarf::DW_FORM_ref4,
817 EntityDie);
David Blaikiee63d5d12013-05-20 22:50:35 +0000818 StringRef Name = Module.getName();
819 if (!Name.empty())
820 TheCU->addString(IMDie, dwarf::DW_AT_name, Name);
David Blaikie684fc532013-05-06 23:33:07 +0000821 Context->addChild(IMDie);
David Blaikief55abea2013-04-22 06:12:31 +0000822}
823
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000824// Emit all Dwarf sections that should come prior to the content. Create
825// global DIEs and emit initial debug info sections. This is invoked by
826// the target AsmPrinter.
Eric Christopher58f41952012-11-19 22:42:15 +0000827void DwarfDebug::beginModule() {
Devang Patel6c74a872010-04-27 19:46:33 +0000828 if (DisableDebugInfoPrinting)
829 return;
830
Eric Christopher58f41952012-11-19 22:42:15 +0000831 const Module *M = MMI->getModule();
832
Nick Lewycky019d2552011-07-29 03:49:23 +0000833 // If module has named metadata anchors then use them, otherwise scan the
834 // module using debug info finder to collect debug info.
Devang Patele02e5852011-05-03 16:45:22 +0000835 NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu");
David Blaikiedc69ebb2013-03-11 23:39:23 +0000836 if (!CU_Nodes)
Devang Patel07bb9ee2011-08-15 23:47:24 +0000837 return;
Manman Ren60352032013-09-05 18:48:31 +0000838 TypeIdentifierMap = generateDITypeIdentifierMap(CU_Nodes);
Devang Patele02e5852011-05-03 16:45:22 +0000839
David Blaikiedc69ebb2013-03-11 23:39:23 +0000840 // Emit initial sections so we can reference labels later.
841 emitSectionLabels();
842
843 for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i) {
844 DICompileUnit CUNode(CU_Nodes->getOperand(i));
845 CompileUnit *CU = constructCompileUnit(CUNode);
David Blaikie1fd43652013-05-07 21:35:53 +0000846 DIArray ImportedEntities = CUNode.getImportedEntities();
847 for (unsigned i = 0, e = ImportedEntities.getNumElements(); i != e; ++i)
David Blaikie684fc532013-05-06 23:33:07 +0000848 ScopesWithImportedEntities.push_back(std::make_pair(
David Blaikie1fd43652013-05-07 21:35:53 +0000849 DIImportedEntity(ImportedEntities.getElement(i)).getContext(),
850 ImportedEntities.getElement(i)));
David Blaikie684fc532013-05-06 23:33:07 +0000851 std::sort(ScopesWithImportedEntities.begin(),
Benjamin Kramerb12cf012013-08-24 12:54:27 +0000852 ScopesWithImportedEntities.end(), less_first());
David Blaikiedc69ebb2013-03-11 23:39:23 +0000853 DIArray GVs = CUNode.getGlobalVariables();
854 for (unsigned i = 0, e = GVs.getNumElements(); i != e; ++i)
855 CU->createGlobalVariableDIE(GVs.getElement(i));
856 DIArray SPs = CUNode.getSubprograms();
857 for (unsigned i = 0, e = SPs.getNumElements(); i != e; ++i)
858 constructSubprogramDIE(CU, SPs.getElement(i));
859 DIArray EnumTypes = CUNode.getEnumTypes();
860 for (unsigned i = 0, e = EnumTypes.getNumElements(); i != e; ++i)
861 CU->getOrCreateTypeDIE(EnumTypes.getElement(i));
862 DIArray RetainedTypes = CUNode.getRetainedTypes();
863 for (unsigned i = 0, e = RetainedTypes.getNumElements(); i != e; ++i)
864 CU->getOrCreateTypeDIE(RetainedTypes.getElement(i));
David Blaikief55abea2013-04-22 06:12:31 +0000865 // Emit imported_modules last so that the relevant context is already
866 // available.
David Blaikie1fd43652013-05-07 21:35:53 +0000867 for (unsigned i = 0, e = ImportedEntities.getNumElements(); i != e; ++i)
868 constructImportedEntityDIE(CU, ImportedEntities.getElement(i));
David Blaikiedc69ebb2013-03-11 23:39:23 +0000869 }
Eric Christopher6a841382012-11-19 22:42:10 +0000870
Chris Lattner7cfa70e2010-04-05 02:19:28 +0000871 // Tell MMI that we have debug info.
872 MMI->setDebugInfoAvailability(true);
Eric Christopher6a841382012-11-19 22:42:10 +0000873
Bill Wendling2b128d72009-05-20 23:19:06 +0000874 // Prime section data.
Chris Lattner5e693ed2009-07-28 03:13:23 +0000875 SectionMap.insert(Asm->getObjFileLowering().getTextSection());
Bill Wendling2b128d72009-05-20 23:19:06 +0000876}
877
Eric Christopher960ac372012-11-22 00:59:49 +0000878// Attach DW_AT_inline attribute with inlined subprogram DIEs.
879void DwarfDebug::computeInlinedDIEs() {
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000880 // Attach DW_AT_inline attribute with inlined subprogram DIEs.
881 for (SmallPtrSet<DIE *, 4>::iterator AI = InlinedSubprogramDIEs.begin(),
Eric Christopher735401c2012-11-27 00:13:51 +0000882 AE = InlinedSubprogramDIEs.end(); AI != AE; ++AI) {
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000883 DIE *ISP = *AI;
Devang Patelf20c4f72011-04-12 22:53:02 +0000884 FirstCU->addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000885 }
Rafael Espindolae7cc8bf2011-11-12 01:57:54 +0000886 for (DenseMap<const MDNode *, DIE *>::iterator AI = AbstractSPDies.begin(),
Eric Christopher735401c2012-11-27 00:13:51 +0000887 AE = AbstractSPDies.end(); AI != AE; ++AI) {
Rafael Espindolae7cc8bf2011-11-12 01:57:54 +0000888 DIE *ISP = AI->second;
889 if (InlinedSubprogramDIEs.count(ISP))
890 continue;
891 FirstCU->addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
892 }
Eric Christopher960ac372012-11-22 00:59:49 +0000893}
894
895// Collect info for variables that were optimized out.
896void DwarfDebug::collectDeadVariables() {
897 const Module *M = MMI->getModule();
898 DenseMap<const MDNode *, LexicalScope *> DeadFnScopeMap;
899
900 if (NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu")) {
901 for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i) {
902 DICompileUnit TheCU(CU_Nodes->getOperand(i));
903 DIArray Subprograms = TheCU.getSubprograms();
904 for (unsigned i = 0, e = Subprograms.getNumElements(); i != e; ++i) {
Eric Christopher735401c2012-11-27 00:13:51 +0000905 DISubprogram SP(Subprograms.getElement(i));
906 if (ProcessedSPNodes.count(SP) != 0) continue;
Manman Ren7504ed42013-07-08 18:33:29 +0000907 if (!SP.isSubprogram()) continue;
Eric Christopher735401c2012-11-27 00:13:51 +0000908 if (!SP.isDefinition()) continue;
909 DIArray Variables = SP.getVariables();
910 if (Variables.getNumElements() == 0) continue;
Eric Christopher960ac372012-11-22 00:59:49 +0000911
Eric Christopher735401c2012-11-27 00:13:51 +0000912 LexicalScope *Scope =
913 new LexicalScope(NULL, DIDescriptor(SP), NULL, false);
914 DeadFnScopeMap[SP] = Scope;
Eric Christopher960ac372012-11-22 00:59:49 +0000915
Eric Christopher735401c2012-11-27 00:13:51 +0000916 // Construct subprogram DIE and add variables DIEs.
917 CompileUnit *SPCU = CUMap.lookup(TheCU);
918 assert(SPCU && "Unable to find Compile Unit!");
919 constructSubprogramDIE(SPCU, SP);
920 DIE *ScopeDIE = SPCU->getDIE(SP);
921 for (unsigned vi = 0, ve = Variables.getNumElements(); vi != ve; ++vi) {
922 DIVariable DV(Variables.getElement(vi));
Manman Ren7504ed42013-07-08 18:33:29 +0000923 if (!DV.isVariable()) continue;
Chandler Carruth2a1c0d22013-07-27 11:09:58 +0000924 DbgVariable NewVar(DV, NULL);
Eric Christopher735401c2012-11-27 00:13:51 +0000925 if (DIE *VariableDIE =
Chandler Carruth2a1c0d22013-07-27 11:09:58 +0000926 SPCU->constructVariableDIE(&NewVar, Scope->isAbstractScope()))
Eric Christopher735401c2012-11-27 00:13:51 +0000927 ScopeDIE->addChild(VariableDIE);
928 }
Eric Christopher960ac372012-11-22 00:59:49 +0000929 }
930 }
931 }
932 DeleteContainerSeconds(DeadFnScopeMap);
933}
934
Eric Christopher45731982013-08-08 23:45:55 +0000935// Type Signature [7.27] and ODR Hash code.
Eric Christopher67646432013-07-26 17:02:41 +0000936
937/// \brief Grabs the string in whichever attribute is passed in and returns
Eric Christopher8552e222013-08-07 01:18:33 +0000938/// a reference to it. Returns "" if the attribute doesn't exist.
Eric Christopher67646432013-07-26 17:02:41 +0000939static StringRef getDIEStringAttr(DIE *Die, unsigned Attr) {
Eric Christopher8552e222013-08-07 01:18:33 +0000940 DIEValue *V = Die->findAttribute(Attr);
Eric Christopher67646432013-07-26 17:02:41 +0000941
Eric Christopher8552e222013-08-07 01:18:33 +0000942 if (DIEString *S = dyn_cast_or_null<DIEString>(V))
943 return S->getString();
944
Eric Christopher67646432013-07-26 17:02:41 +0000945 return StringRef("");
946}
947
Eric Christopher67646432013-07-26 17:02:41 +0000948/// Return true if the current DIE is contained within an anonymous namespace.
949static bool isContainedInAnonNamespace(DIE *Die) {
950 DIE *Parent = Die->getParent();
951
952 while (Parent) {
Eric Christophere414ece2013-07-29 23:53:08 +0000953 if (Parent->getTag() == dwarf::DW_TAG_namespace &&
954 getDIEStringAttr(Parent, dwarf::DW_AT_name) == "")
Eric Christopher67646432013-07-26 17:02:41 +0000955 return true;
956 Parent = Parent->getParent();
957 }
958
959 return false;
960}
961
Eric Christopheraf15f8d2013-08-07 01:18:24 +0000962/// Test if the current CU language is C++ and that we have
963/// a named type that is not contained in an anonymous namespace.
964static bool shouldAddODRHash(CompileUnit *CU, DIE *Die) {
Eric Christopher341770d2013-08-07 08:35:10 +0000965 return CU->getLanguage() == dwarf::DW_LANG_C_plus_plus &&
966 getDIEStringAttr(Die, dwarf::DW_AT_name) != "" &&
967 !isContainedInAnonNamespace(Die);
Eric Christopher45731982013-08-08 23:45:55 +0000968}
Eric Christopheraf15f8d2013-08-07 01:18:24 +0000969
Eric Christopher960ac372012-11-22 00:59:49 +0000970void DwarfDebug::finalizeModuleInfo() {
971 // Collect info for variables that were optimized out.
972 collectDeadVariables();
973
974 // Attach DW_AT_inline attribute with inlined subprogram DIEs.
975 computeInlinedDIEs();
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000976
Eric Christopherf8542ec2013-07-29 22:24:32 +0000977 // Split out type units and conditionally add an ODR tag to the split
978 // out type.
Eric Christopher67646432013-07-26 17:02:41 +0000979 // FIXME: Do type splitting.
980 for (unsigned i = 0, e = TypeUnits.size(); i != e; ++i) {
Eric Christopher67646432013-07-26 17:02:41 +0000981 DIE *Die = TypeUnits[i];
Eric Christopher45731982013-08-08 23:45:55 +0000982 DIEHash Hash;
Eric Christopheraf15f8d2013-08-07 01:18:24 +0000983 // If we've requested ODR hashes and it's applicable for an ODR hash then
984 // add the ODR signature now.
Eric Christopher45731982013-08-08 23:45:55 +0000985 // FIXME: This should be added onto the type unit, not the type, but this
986 // works as an intermediate stage.
Eric Christopheraf15f8d2013-08-07 01:18:24 +0000987 if (GenerateODRHash && shouldAddODRHash(CUMap.begin()->second, Die))
Eric Christopher45731982013-08-08 23:45:55 +0000988 CUMap.begin()->second->addUInt(Die, dwarf::DW_AT_GNU_odr_signature,
989 dwarf::DW_FORM_data8,
990 Hash.computeDIEODRSignature(Die));
Eric Christopher67646432013-07-26 17:02:41 +0000991 }
992
Eric Christopher60eb7692013-08-12 20:27:48 +0000993 // Handle anything that needs to be done on a per-cu basis.
994 for (DenseMap<const MDNode *, CompileUnit *>::iterator CUI = CUMap.begin(),
995 CUE = CUMap.end();
996 CUI != CUE; ++CUI) {
997 CompileUnit *TheCU = CUI->second;
998 // Emit DW_AT_containing_type attribute to connect types with their
999 // vtable holding type.
1000 TheCU->constructContainingTypeDIEs();
1001
1002 // If we're splitting the dwarf out now that we've got the entire
1003 // CU then construct a skeleton CU based upon it.
1004 if (useSplitDwarf()) {
Eric Christopherd29614f2013-08-13 01:21:55 +00001005 uint64_t ID = 0;
1006 if (GenerateCUHash) {
1007 DIEHash CUHash;
1008 ID = CUHash.computeCUSignature(TheCU->getCUDie());
1009 }
Eric Christopher60eb7692013-08-12 20:27:48 +00001010 // This should be a unique identifier when we want to build .dwp files.
1011 TheCU->addUInt(TheCU->getCUDie(), dwarf::DW_AT_GNU_dwo_id,
Eric Christopherd29614f2013-08-13 01:21:55 +00001012 dwarf::DW_FORM_data8, ID);
Eric Christopher60eb7692013-08-12 20:27:48 +00001013 // Now construct the skeleton CU associated.
Eric Christopher6fdf3242013-08-26 23:50:43 +00001014 CompileUnit *SkCU = constructSkeletonCU(TheCU);
Eric Christopher60eb7692013-08-12 20:27:48 +00001015 // This should be a unique identifier when we want to build .dwp files.
1016 SkCU->addUInt(SkCU->getCUDie(), dwarf::DW_AT_GNU_dwo_id,
Eric Christopherd29614f2013-08-13 01:21:55 +00001017 dwarf::DW_FORM_data8, ID);
Eric Christopher60eb7692013-08-12 20:27:48 +00001018 }
1019 }
1020
1021 // Compute DIE offsets and sizes.
Eric Christopherc8a310e2012-12-10 23:34:43 +00001022 InfoHolder.computeSizeAndOffsets();
1023 if (useSplitDwarf())
1024 SkeletonHolder.computeSizeAndOffsets();
Eric Christopher960ac372012-11-22 00:59:49 +00001025}
1026
1027void DwarfDebug::endSections() {
Bill Wendling2b128d72009-05-20 23:19:06 +00001028 // Standard sections final addresses.
Chris Lattner4b7dadb2009-08-19 05:49:37 +00001029 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getTextSection());
Chris Lattnera179b522010-04-04 19:25:43 +00001030 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("text_end"));
Chris Lattner4b7dadb2009-08-19 05:49:37 +00001031 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getDataSection());
Chris Lattnera179b522010-04-04 19:25:43 +00001032 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("data_end"));
Bill Wendling2b128d72009-05-20 23:19:06 +00001033
1034 // End text sections.
Benjamin Kramer15591272012-10-31 13:45:49 +00001035 for (unsigned I = 0, E = SectionMap.size(); I != E; ++I) {
1036 Asm->OutStreamer.SwitchSection(SectionMap[I]);
1037 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("section_end", I+1));
Bill Wendling2b128d72009-05-20 23:19:06 +00001038 }
Eric Christopher960ac372012-11-22 00:59:49 +00001039}
Bill Wendling2b128d72009-05-20 23:19:06 +00001040
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001041// Emit all Dwarf sections that should come after the content.
Eric Christopher960ac372012-11-22 00:59:49 +00001042void DwarfDebug::endModule() {
1043
1044 if (!FirstCU) return;
1045
1046 // End any existing sections.
1047 // TODO: Does this need to happen?
1048 endSections();
1049
1050 // Finalize the debug info for the module.
1051 finalizeModuleInfo();
Bill Wendling2b128d72009-05-20 23:19:06 +00001052
Eric Christophercdf218d2012-12-10 19:51:21 +00001053 if (!useSplitDwarf()) {
Eric Christopher95198f502012-11-27 22:43:42 +00001054 // Emit all the DIEs into a debug info section.
1055 emitDebugInfo();
Eric Christopher4c9b1192012-11-27 00:41:54 +00001056
Eric Christopher95198f502012-11-27 22:43:42 +00001057 // Corresponding abbreviations into a abbrev section.
1058 emitAbbreviations();
1059
1060 // Emit info into a debug loc section.
1061 emitDebugLoc();
1062
1063 // Emit info into a debug aranges section.
1064 emitDebugARanges();
1065
1066 // Emit info into a debug ranges section.
1067 emitDebugRanges();
1068
1069 // Emit info into a debug macinfo section.
1070 emitDebugMacInfo();
1071
Eric Christopher95198f502012-11-27 22:43:42 +00001072 } else {
Eric Christopherd692c1d2012-12-11 19:42:09 +00001073 // TODO: Fill this in for separated debug sections and separate
Eric Christopher95198f502012-11-27 22:43:42 +00001074 // out information into new sections.
1075
Eric Christopher9c2ecd92012-11-30 23:59:06 +00001076 // Emit the debug info section and compile units.
Eric Christopher95198f502012-11-27 22:43:42 +00001077 emitDebugInfo();
Eric Christopher9c2ecd92012-11-30 23:59:06 +00001078 emitDebugInfoDWO();
Eric Christopher95198f502012-11-27 22:43:42 +00001079
1080 // Corresponding abbreviations into a abbrev section.
1081 emitAbbreviations();
Eric Christopher3c5a1912012-12-19 22:02:53 +00001082 emitDebugAbbrevDWO();
Eric Christopher95198f502012-11-27 22:43:42 +00001083
1084 // Emit info into a debug loc section.
1085 emitDebugLoc();
1086
1087 // Emit info into a debug aranges section.
1088 emitDebugARanges();
1089
1090 // Emit info into a debug ranges section.
1091 emitDebugRanges();
1092
1093 // Emit info into a debug macinfo section.
1094 emitDebugMacInfo();
1095
Eric Christopher962c9082013-01-15 23:56:56 +00001096 // Emit DWO addresses.
1097 InfoHolder.emitAddresses(Asm->getObjFileLowering().getDwarfAddrSection());
1098
Eric Christopher95198f502012-11-27 22:43:42 +00001099 }
Bill Wendling2b128d72009-05-20 23:19:06 +00001100
Eric Christophera876b822012-08-23 07:32:06 +00001101 // Emit info into the dwarf accelerator table sections.
Eric Christopher20b76a72012-08-23 22:36:40 +00001102 if (useDwarfAccelTables()) {
Eric Christopher4996c702011-11-07 09:24:32 +00001103 emitAccelNames();
1104 emitAccelObjC();
1105 emitAccelNamespaces();
1106 emitAccelTypes();
1107 }
Eric Christopher6a841382012-11-19 22:42:10 +00001108
Eric Christopher4b358182013-08-30 00:40:17 +00001109 // Emit the pubnames and pubtypes sections if requested.
1110 if (HasDwarfPubSections) {
Eric Christopher5f93bb92013-09-09 20:03:17 +00001111 emitDebugPubNames();
Eric Christopher77826182012-08-23 07:10:56 +00001112 emitDebugPubTypes();
Eric Christopher4b358182013-08-30 00:40:17 +00001113 }
Devang Patel04d2f2d2009-11-24 01:14:22 +00001114
Eric Christopher95198f502012-11-27 22:43:42 +00001115 // Finally emit string information into a string table.
Eric Christopher6e20a162012-11-27 06:49:23 +00001116 emitDebugStr();
Eric Christopher3bf29fd2012-12-27 02:14:01 +00001117 if (useSplitDwarf())
1118 emitDebugStrDWO();
Eric Christopher6e20a162012-11-27 06:49:23 +00001119
Devang Pateld0701282010-08-02 17:32:15 +00001120 // clean up.
Devang Pateleb1bb4e2011-08-16 22:09:43 +00001121 SPMap.clear();
Devang Patel1a0df9a2010-05-10 22:49:55 +00001122 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
1123 E = CUMap.end(); I != E; ++I)
1124 delete I->second;
Eric Christopher8afd7b62012-12-10 19:51:18 +00001125
Craig Topperd8e43652013-07-03 04:17:25 +00001126 for (SmallVectorImpl<CompileUnit *>::iterator I = SkeletonCUs.begin(),
Eric Christopher5b33b3c2013-02-06 21:53:56 +00001127 E = SkeletonCUs.end(); I != E; ++I)
1128 delete *I;
Eric Christopher8afd7b62012-12-10 19:51:18 +00001129
Eric Christopher9c2ecd92012-11-30 23:59:06 +00001130 // Reset these for the next Module if we have one.
1131 FirstCU = NULL;
Bill Wendling2b128d72009-05-20 23:19:06 +00001132}
1133
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001134// Find abstract variable, if any, associated with Var.
Devang Patelbb23a4a2011-08-10 21:50:54 +00001135DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &DV,
Chris Lattner915c5f92010-04-02 19:42:39 +00001136 DebugLoc ScopeLoc) {
Devang Patelbb23a4a2011-08-10 21:50:54 +00001137 LLVMContext &Ctx = DV->getContext();
1138 // More then one inlined variable corresponds to one abstract variable.
1139 DIVariable Var = cleanseInlinedVariable(DV, Ctx);
Devang Patelcfa8e9d2010-05-07 18:11:54 +00001140 DbgVariable *AbsDbgVariable = AbstractVariables.lookup(Var);
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001141 if (AbsDbgVariable)
1142 return AbsDbgVariable;
1143
Devang Patel7e623022011-08-10 20:55:27 +00001144 LexicalScope *Scope = LScopes.findAbstractScope(ScopeLoc.getScope(Ctx));
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001145 if (!Scope)
1146 return NULL;
1147
Devang Patel99819b52011-08-15 19:01:20 +00001148 AbsDbgVariable = new DbgVariable(Var, NULL);
Devang Patel7e623022011-08-10 20:55:27 +00001149 addScopeVariable(Scope, AbsDbgVariable);
Devang Patelcfa8e9d2010-05-07 18:11:54 +00001150 AbstractVariables[Var] = AbsDbgVariable;
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001151 return AbsDbgVariable;
1152}
1153
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001154// If Var is a current function argument then add it to CurrentFnArguments list.
Devang Patel6c622ef2011-03-01 22:58:55 +00001155bool DwarfDebug::addCurrentFnArgument(const MachineFunction *MF,
Devang Patel7e623022011-08-10 20:55:27 +00001156 DbgVariable *Var, LexicalScope *Scope) {
1157 if (!LScopes.isCurrentFunctionScope(Scope))
Devang Patel6c622ef2011-03-01 22:58:55 +00001158 return false;
1159 DIVariable DV = Var->getVariable();
1160 if (DV.getTag() != dwarf::DW_TAG_arg_variable)
1161 return false;
1162 unsigned ArgNo = DV.getArgNumber();
Eric Christopher6a841382012-11-19 22:42:10 +00001163 if (ArgNo == 0)
Devang Patel6c622ef2011-03-01 22:58:55 +00001164 return false;
1165
Devang Patel4ab660b2011-03-03 20:02:02 +00001166 size_t Size = CurrentFnArguments.size();
1167 if (Size == 0)
Devang Patel6c622ef2011-03-01 22:58:55 +00001168 CurrentFnArguments.resize(MF->getFunction()->arg_size());
Devang Patel63b3e762011-03-03 21:49:41 +00001169 // llvm::Function argument size is not good indicator of how many
Devang Patel34a7ab42011-03-03 20:08:10 +00001170 // arguments does the function have at source level.
1171 if (ArgNo > Size)
Devang Patel4ab660b2011-03-03 20:02:02 +00001172 CurrentFnArguments.resize(ArgNo * 2);
Devang Patel6c622ef2011-03-01 22:58:55 +00001173 CurrentFnArguments[ArgNo - 1] = Var;
1174 return true;
1175}
1176
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001177// Collect variable information from side table maintained by MMI.
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001178void
Nick Lewycky019d2552011-07-29 03:49:23 +00001179DwarfDebug::collectVariableInfoFromMMITable(const MachineFunction *MF,
Devang Patel490c8ab2010-05-20 19:57:06 +00001180 SmallPtrSet<const MDNode *, 16> &Processed) {
Devang Patel475d32a2009-10-06 01:26:37 +00001181 MachineModuleInfo::VariableDbgInfoMapTy &VMap = MMI->getVariableDbgInfo();
1182 for (MachineModuleInfo::VariableDbgInfoMapTy::iterator VI = VMap.begin(),
1183 VE = VMap.end(); VI != VE; ++VI) {
Devang Patel32cc43c2010-05-07 20:54:48 +00001184 const MDNode *Var = VI->first;
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001185 if (!Var) continue;
Devang Patele0a94bf2010-05-14 21:01:35 +00001186 Processed.insert(Var);
Chris Lattner915c5f92010-04-02 19:42:39 +00001187 DIVariable DV(Var);
1188 const std::pair<unsigned, DebugLoc> &VP = VI->second;
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001189
Devang Patel7e623022011-08-10 20:55:27 +00001190 LexicalScope *Scope = LScopes.findLexicalScope(VP.second);
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001191
Devang Patelcdb7d442009-11-10 23:20:04 +00001192 // If variable scope is not found then skip this variable.
Chris Lattner915c5f92010-04-02 19:42:39 +00001193 if (Scope == 0)
Devang Patelcdb7d442009-11-10 23:20:04 +00001194 continue;
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001195
Devang Patele1c53f22010-05-20 16:36:41 +00001196 DbgVariable *AbsDbgVariable = findAbstractVariable(DV, VP.second);
Devang Patel99819b52011-08-15 19:01:20 +00001197 DbgVariable *RegVar = new DbgVariable(DV, AbsDbgVariable);
Devang Patel3e4a9652011-08-15 21:24:36 +00001198 RegVar->setFrameIndex(VP.first);
Devang Patel6c622ef2011-03-01 22:58:55 +00001199 if (!addCurrentFnArgument(MF, RegVar, Scope))
Devang Patel7e623022011-08-10 20:55:27 +00001200 addScopeVariable(Scope, RegVar);
Devang Patel99819b52011-08-15 19:01:20 +00001201 if (AbsDbgVariable)
Devang Patel3e4a9652011-08-15 21:24:36 +00001202 AbsDbgVariable->setFrameIndex(VP.first);
Devang Patel475d32a2009-10-06 01:26:37 +00001203 }
Devang Patel490c8ab2010-05-20 19:57:06 +00001204}
Devang Patela3e9c9c2010-03-15 18:33:46 +00001205
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001206// Return true if debug value, encoded by DBG_VALUE instruction, is in a
1207// defined reg.
Devang Patel9fc11702010-05-25 23:40:22 +00001208static bool isDbgValueInDefinedReg(const MachineInstr *MI) {
Nick Lewycky654f5ce2011-10-26 22:55:33 +00001209 assert(MI->isDebugValue() && "Invalid DBG_VALUE machine instruction!");
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001210 return MI->getNumOperands() == 3 &&
1211 MI->getOperand(0).isReg() && MI->getOperand(0).getReg() &&
Adrian Prantl418d1d12013-07-09 20:28:37 +00001212 (MI->getOperand(1).isImm() ||
1213 (MI->getOperand(1).isReg() && MI->getOperand(1).getReg() == 0U));
Devang Patel9fc11702010-05-25 23:40:22 +00001214}
1215
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001216// Get .debug_loc entry for the instruction range starting at MI.
Eric Christopher6a841382012-11-19 22:42:10 +00001217static DotDebugLocEntry getDebugLocEntry(AsmPrinter *Asm,
1218 const MCSymbol *FLabel,
Devang Patel2442a892011-07-08 17:09:57 +00001219 const MCSymbol *SLabel,
1220 const MachineInstr *MI) {
1221 const MDNode *Var = MI->getOperand(MI->getNumOperands() - 1).getMetadata();
1222
David Blaikie0252265b2013-06-16 20:34:15 +00001223 assert(MI->getNumOperands() == 3);
Adrian Prantl418d1d12013-07-09 20:28:37 +00001224 if (MI->getOperand(0).isReg()) {
Devang Patel2442a892011-07-08 17:09:57 +00001225 MachineLocation MLoc;
Adrian Prantl418d1d12013-07-09 20:28:37 +00001226 // If the second operand is an immediate, this is a
1227 // register-indirect address.
1228 if (!MI->getOperand(1).isImm())
Adrian Prantld4c0dd42013-04-26 21:57:17 +00001229 MLoc.set(MI->getOperand(0).getReg());
1230 else
1231 MLoc.set(MI->getOperand(0).getReg(), MI->getOperand(1).getImm());
Devang Patel2442a892011-07-08 17:09:57 +00001232 return DotDebugLocEntry(FLabel, SLabel, MLoc, Var);
1233 }
1234 if (MI->getOperand(0).isImm())
1235 return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getImm());
1236 if (MI->getOperand(0).isFPImm())
1237 return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getFPImm());
1238 if (MI->getOperand(0).isCImm())
1239 return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getCImm());
1240
Craig Topperee4dab52012-02-05 08:31:47 +00001241 llvm_unreachable("Unexpected 3 operand DBG_VALUE instruction!");
Devang Patel2442a892011-07-08 17:09:57 +00001242}
1243
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001244// Find variables for each lexical scope.
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001245void
Devang Patel5c0f85c2010-06-25 22:07:34 +00001246DwarfDebug::collectVariableInfo(const MachineFunction *MF,
1247 SmallPtrSet<const MDNode *, 16> &Processed) {
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001248
Eric Christopher270a12c2013-07-03 21:37:03 +00001249 // Grab the variable info that was squirreled away in the MMI side-table.
Devang Patel490c8ab2010-05-20 19:57:06 +00001250 collectVariableInfoFromMMITable(MF, Processed);
1251
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001252 for (SmallVectorImpl<const MDNode*>::const_iterator
1253 UVI = UserVariables.begin(), UVE = UserVariables.end(); UVI != UVE;
1254 ++UVI) {
1255 const MDNode *Var = *UVI;
1256 if (Processed.count(Var))
Devang Patel490c8ab2010-05-20 19:57:06 +00001257 continue;
1258
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001259 // History contains relevant DBG_VALUE instructions for Var and instructions
1260 // clobbering it.
1261 SmallVectorImpl<const MachineInstr*> &History = DbgValues[Var];
1262 if (History.empty())
1263 continue;
1264 const MachineInstr *MInsn = History.front();
Devang Patel9fc11702010-05-25 23:40:22 +00001265
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001266 DIVariable DV(Var);
Devang Patel7e623022011-08-10 20:55:27 +00001267 LexicalScope *Scope = NULL;
Devang Patel7a9dedf2010-05-27 20:25:04 +00001268 if (DV.getTag() == dwarf::DW_TAG_arg_variable &&
1269 DISubprogram(DV.getContext()).describes(MF->getFunction()))
Devang Patel7e623022011-08-10 20:55:27 +00001270 Scope = LScopes.getCurrentFunctionScope();
David Blaikiedc69ebb2013-03-11 23:39:23 +00001271 else if (MDNode *IA = DV.getInlinedAt())
1272 Scope = LScopes.findInlinedScope(DebugLoc::getFromDILocation(IA));
1273 else
1274 Scope = LScopes.findLexicalScope(cast<MDNode>(DV->getOperand(1)));
Devang Patel490c8ab2010-05-20 19:57:06 +00001275 // If variable scope is not found then skip this variable.
Devang Patelfbd6c452010-05-21 00:10:20 +00001276 if (!Scope)
Devang Patel490c8ab2010-05-20 19:57:06 +00001277 continue;
1278
1279 Processed.insert(DV);
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001280 assert(MInsn->isDebugValue() && "History must begin with debug value");
Devang Patel99819b52011-08-15 19:01:20 +00001281 DbgVariable *AbsVar = findAbstractVariable(DV, MInsn->getDebugLoc());
1282 DbgVariable *RegVar = new DbgVariable(DV, AbsVar);
Devang Patel6c622ef2011-03-01 22:58:55 +00001283 if (!addCurrentFnArgument(MF, RegVar, Scope))
Devang Patel7e623022011-08-10 20:55:27 +00001284 addScopeVariable(Scope, RegVar);
Devang Patel99819b52011-08-15 19:01:20 +00001285 if (AbsVar)
Devang Patel3e4a9652011-08-15 21:24:36 +00001286 AbsVar->setMInsn(MInsn);
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001287
Eric Christophercc10d202012-10-08 20:48:54 +00001288 // Simplify ranges that are fully coalesced.
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001289 if (History.size() <= 1 || (History.size() == 2 &&
1290 MInsn->isIdenticalTo(History.back()))) {
Devang Patel3e4a9652011-08-15 21:24:36 +00001291 RegVar->setMInsn(MInsn);
Devang Patel9fc11702010-05-25 23:40:22 +00001292 continue;
1293 }
1294
Eric Christopher59cc0712013-01-28 17:33:26 +00001295 // Handle multiple DBG_VALUE instructions describing one variable.
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001296 RegVar->setDotDebugLocOffset(DotDebugLocEntries.size());
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001297
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001298 for (SmallVectorImpl<const MachineInstr*>::const_iterator
1299 HI = History.begin(), HE = History.end(); HI != HE; ++HI) {
1300 const MachineInstr *Begin = *HI;
1301 assert(Begin->isDebugValue() && "Invalid History entry");
Jakob Stoklund Olesen9c057ee2011-03-22 00:21:41 +00001302
Devang Patele7181b52011-06-01 23:00:17 +00001303 // Check if DBG_VALUE is truncating a range.
1304 if (Begin->getNumOperands() > 1 && Begin->getOperand(0).isReg()
1305 && !Begin->getOperand(0).getReg())
1306 continue;
1307
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001308 // Compute the range for a register location.
1309 const MCSymbol *FLabel = getLabelBeforeInsn(Begin);
1310 const MCSymbol *SLabel = 0;
1311
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001312 if (HI + 1 == HE)
1313 // If Begin is the last instruction in History then its value is valid
Chris Lattner0ab5e2c2011-04-15 05:18:47 +00001314 // until the end of the function.
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001315 SLabel = FunctionEndSym;
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001316 else {
1317 const MachineInstr *End = HI[1];
Eric Christopher6a841382012-11-19 22:42:10 +00001318 DEBUG(dbgs() << "DotDebugLoc Pair:\n"
Devang Patel53b050a2011-07-07 21:44:42 +00001319 << "\t" << *Begin << "\t" << *End << "\n");
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001320 if (End->isDebugValue())
1321 SLabel = getLabelBeforeInsn(End);
1322 else {
1323 // End is a normal instruction clobbering the range.
1324 SLabel = getLabelAfterInsn(End);
1325 assert(SLabel && "Forgot label after clobber instruction");
1326 ++HI;
1327 }
1328 }
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001329
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001330 // The value is valid until the next DBG_VALUE or clobber.
Eric Christopher365d0832011-12-16 23:42:31 +00001331 DotDebugLocEntries.push_back(getDebugLocEntry(Asm, FLabel, SLabel,
1332 Begin));
Devang Patel9fc11702010-05-25 23:40:22 +00001333 }
1334 DotDebugLocEntries.push_back(DotDebugLocEntry());
Devang Patela3e9c9c2010-03-15 18:33:46 +00001335 }
Devang Patele0a94bf2010-05-14 21:01:35 +00001336
1337 // Collect info for variables that were optimized out.
Devang Patel59e27c52011-08-19 23:28:12 +00001338 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
1339 DIArray Variables = DISubprogram(FnScope->getScopeNode()).getVariables();
1340 for (unsigned i = 0, e = Variables.getNumElements(); i != e; ++i) {
1341 DIVariable DV(Variables.getElement(i));
Manman Ren7504ed42013-07-08 18:33:29 +00001342 if (!DV || !DV.isVariable() || !Processed.insert(DV))
Devang Patel59e27c52011-08-19 23:28:12 +00001343 continue;
1344 if (LexicalScope *Scope = LScopes.findLexicalScope(DV.getContext()))
1345 addScopeVariable(Scope, new DbgVariable(DV, NULL));
Devang Patele0a94bf2010-05-14 21:01:35 +00001346 }
Devang Patel9fc11702010-05-25 23:40:22 +00001347}
Devang Patele0a94bf2010-05-14 21:01:35 +00001348
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001349// Return Label preceding the instruction.
Eric Christopher962c9082013-01-15 23:56:56 +00001350MCSymbol *DwarfDebug::getLabelBeforeInsn(const MachineInstr *MI) {
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001351 MCSymbol *Label = LabelsBeforeInsn.lookup(MI);
1352 assert(Label && "Didn't insert label before instruction");
1353 return Label;
Devang Patel9fc11702010-05-25 23:40:22 +00001354}
1355
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001356// Return Label immediately following the instruction.
Eric Christopher962c9082013-01-15 23:56:56 +00001357MCSymbol *DwarfDebug::getLabelAfterInsn(const MachineInstr *MI) {
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001358 return LabelsAfterInsn.lookup(MI);
Devang Patel475d32a2009-10-06 01:26:37 +00001359}
1360
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001361// Process beginning of an instruction.
Devang Patelb5694e72010-10-26 17:49:02 +00001362void DwarfDebug::beginInstruction(const MachineInstr *MI) {
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001363 // Check if source location changes, but ignore DBG_VALUE locations.
1364 if (!MI->isDebugValue()) {
1365 DebugLoc DL = MI->getDebugLoc();
1366 if (DL != PrevInstLoc && (!DL.isUnknown() || UnknownLocations)) {
Eric Christopheraec8a822012-04-05 20:39:05 +00001367 unsigned Flags = 0;
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001368 PrevInstLoc = DL;
Devang Patel34a66202011-05-11 19:22:19 +00001369 if (DL == PrologEndLoc) {
1370 Flags |= DWARF2_FLAG_PROLOGUE_END;
1371 PrologEndLoc = DebugLoc();
1372 }
Eric Christopheraec8a822012-04-05 20:39:05 +00001373 if (PrologEndLoc.isUnknown())
1374 Flags |= DWARF2_FLAG_IS_STMT;
1375
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001376 if (!DL.isUnknown()) {
1377 const MDNode *Scope = DL.getScope(Asm->MF->getFunction()->getContext());
Devang Patel34a66202011-05-11 19:22:19 +00001378 recordSourceLine(DL.getLine(), DL.getCol(), Scope, Flags);
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001379 } else
Devang Patel34a66202011-05-11 19:22:19 +00001380 recordSourceLine(0, 0, 0, 0);
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001381 }
Devang Patel9fc11702010-05-25 23:40:22 +00001382 }
Devang Patel23b2ae62010-03-29 22:59:58 +00001383
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001384 // Insert labels where requested.
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001385 DenseMap<const MachineInstr*, MCSymbol*>::iterator I =
1386 LabelsBeforeInsn.find(MI);
1387
1388 // No label needed.
1389 if (I == LabelsBeforeInsn.end())
1390 return;
1391
1392 // Label already assigned.
1393 if (I->second)
Devang Patel002d54d2010-05-26 19:37:24 +00001394 return;
Devang Patelbd477be2010-03-29 17:20:31 +00001395
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001396 if (!PrevLabel) {
Devang Patelacc32a52010-05-26 21:23:46 +00001397 PrevLabel = MMI->getContext().CreateTempSymbol();
1398 Asm->OutStreamer.EmitLabel(PrevLabel);
Devang Patel002d54d2010-05-26 19:37:24 +00001399 }
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001400 I->second = PrevLabel;
Devang Patel8db360d2009-10-06 01:50:42 +00001401}
1402
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001403// Process end of an instruction.
Devang Patelb5694e72010-10-26 17:49:02 +00001404void DwarfDebug::endInstruction(const MachineInstr *MI) {
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001405 // Don't create a new label after DBG_VALUE instructions.
1406 // They don't generate code.
1407 if (!MI->isDebugValue())
1408 PrevLabel = 0;
1409
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001410 DenseMap<const MachineInstr*, MCSymbol*>::iterator I =
1411 LabelsAfterInsn.find(MI);
1412
1413 // No label needed.
1414 if (I == LabelsAfterInsn.end())
1415 return;
1416
1417 // Label already assigned.
1418 if (I->second)
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001419 return;
1420
1421 // We need a label after this instruction.
1422 if (!PrevLabel) {
1423 PrevLabel = MMI->getContext().CreateTempSymbol();
1424 Asm->OutStreamer.EmitLabel(PrevLabel);
Devang Patel3ebd8932010-04-08 16:50:29 +00001425 }
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001426 I->second = PrevLabel;
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001427}
1428
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001429// Each LexicalScope has first instruction and last instruction to mark
1430// beginning and end of a scope respectively. Create an inverse map that list
1431// scopes starts (and ends) with an instruction. One instruction may start (or
1432// end) multiple scopes. Ignore scopes that are not reachable.
Devang Patel359b0132010-04-08 18:43:56 +00001433void DwarfDebug::identifyScopeMarkers() {
Devang Patel7e623022011-08-10 20:55:27 +00001434 SmallVector<LexicalScope *, 4> WorkList;
1435 WorkList.push_back(LScopes.getCurrentFunctionScope());
Devang Patel7771b7c2010-01-20 02:05:23 +00001436 while (!WorkList.empty()) {
Devang Patel7e623022011-08-10 20:55:27 +00001437 LexicalScope *S = WorkList.pop_back_val();
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001438
Craig Topper977e9cd2013-07-03 04:24:43 +00001439 const SmallVectorImpl<LexicalScope *> &Children = S->getChildren();
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001440 if (!Children.empty())
Craig Topperd8e43652013-07-03 04:17:25 +00001441 for (SmallVectorImpl<LexicalScope *>::const_iterator SI = Children.begin(),
Devang Patel7771b7c2010-01-20 02:05:23 +00001442 SE = Children.end(); SI != SE; ++SI)
1443 WorkList.push_back(*SI);
1444
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001445 if (S->isAbstractScope())
1446 continue;
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001447
Craig Topper977e9cd2013-07-03 04:24:43 +00001448 const SmallVectorImpl<InsnRange> &Ranges = S->getRanges();
Devang Patel6c74a872010-04-27 19:46:33 +00001449 if (Ranges.empty())
1450 continue;
Craig Topperd8e43652013-07-03 04:17:25 +00001451 for (SmallVectorImpl<InsnRange>::const_iterator RI = Ranges.begin(),
Devang Patel6c74a872010-04-27 19:46:33 +00001452 RE = Ranges.end(); RI != RE; ++RI) {
Devang Patel7e623022011-08-10 20:55:27 +00001453 assert(RI->first && "InsnRange does not have first instruction!");
1454 assert(RI->second && "InsnRange does not have second instruction!");
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001455 requestLabelBeforeInsn(RI->first);
1456 requestLabelAfterInsn(RI->second);
Devang Patel6c74a872010-04-27 19:46:33 +00001457 }
Devang Patel75cc16c2009-10-01 20:31:14 +00001458 }
Devang Patel75cc16c2009-10-01 20:31:14 +00001459}
1460
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001461// Get MDNode for DebugLoc's scope.
Devang Patel589845d2011-05-09 22:14:49 +00001462static MDNode *getScopeNode(DebugLoc DL, const LLVMContext &Ctx) {
1463 if (MDNode *InlinedAt = DL.getInlinedAt(Ctx))
1464 return getScopeNode(DebugLoc::getFromDILocation(InlinedAt), Ctx);
1465 return DL.getScope(Ctx);
1466}
1467
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001468// Walk up the scope chain of given debug loc and find line number info
1469// for the function.
Devang Patel34a66202011-05-11 19:22:19 +00001470static DebugLoc getFnDebugLoc(DebugLoc DL, const LLVMContext &Ctx) {
1471 const MDNode *Scope = getScopeNode(DL, Ctx);
1472 DISubprogram SP = getDISubprogram(Scope);
Manman Ren7504ed42013-07-08 18:33:29 +00001473 if (SP.isSubprogram()) {
Eric Christopher34164192012-04-03 00:43:49 +00001474 // Check for number of operands since the compatibility is
1475 // cheap here.
Eric Christopherb81e2b42012-04-03 17:55:42 +00001476 if (SP->getNumOperands() > 19)
Eric Christopher34164192012-04-03 00:43:49 +00001477 return DebugLoc::get(SP.getScopeLineNumber(), 0, SP);
1478 else
1479 return DebugLoc::get(SP.getLineNumber(), 0, SP);
1480 }
1481
Devang Patel34a66202011-05-11 19:22:19 +00001482 return DebugLoc();
1483}
1484
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001485// Gather pre-function debug information. Assumes being called immediately
1486// after the function entry point has been emitted.
Chris Lattner76555b52010-01-26 23:18:02 +00001487void DwarfDebug::beginFunction(const MachineFunction *MF) {
Chris Lattner196dbdc2010-04-05 03:52:55 +00001488 if (!MMI->hasDebugInfo()) return;
Devang Patel7e623022011-08-10 20:55:27 +00001489 LScopes.initialize(*MF);
1490 if (LScopes.empty()) return;
1491 identifyScopeMarkers();
Devang Patel4598eb62009-10-06 18:37:31 +00001492
Manman Ren4e042a62013-02-05 21:52:47 +00001493 // Set DwarfCompileUnitID in MCContext to the Compile Unit this function
1494 // belongs to.
1495 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
1496 CompileUnit *TheCU = SPMap.lookup(FnScope->getScopeNode());
1497 assert(TheCU && "Unable to find compile unit!");
Manman Ren9d4c7352013-05-21 00:57:22 +00001498 if (Asm->TM.hasMCUseLoc() &&
1499 Asm->OutStreamer.getKind() == MCStreamer::SK_AsmStreamer)
1500 // Use a single line table if we are using .loc and generating assembly.
1501 Asm->OutStreamer.getContext().setDwarfCompileUnitID(0);
1502 else
1503 Asm->OutStreamer.getContext().setDwarfCompileUnitID(TheCU->getUniqueID());
Manman Ren4e042a62013-02-05 21:52:47 +00001504
Devang Patel6c74a872010-04-27 19:46:33 +00001505 FunctionBeginSym = Asm->GetTempSymbol("func_begin",
1506 Asm->getFunctionNumber());
Bill Wendling2b128d72009-05-20 23:19:06 +00001507 // Assumes in correct section after the entry point.
Devang Patel6c74a872010-04-27 19:46:33 +00001508 Asm->OutStreamer.EmitLabel(FunctionBeginSym);
Bill Wendling2b128d72009-05-20 23:19:06 +00001509
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001510 assert(UserVariables.empty() && DbgValues.empty() && "Maps weren't cleaned");
1511
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001512 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001513 // LiveUserVar - Map physreg numbers to the MDNode they contain.
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001514 std::vector<const MDNode*> LiveUserVar(TRI->getNumRegs());
1515
Devang Patel002d54d2010-05-26 19:37:24 +00001516 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001517 I != E; ++I) {
1518 bool AtBlockEntry = true;
Devang Patel002d54d2010-05-26 19:37:24 +00001519 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
1520 II != IE; ++II) {
1521 const MachineInstr *MI = II;
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001522
Devang Patel002d54d2010-05-26 19:37:24 +00001523 if (MI->isDebugValue()) {
Nick Lewycky654f5ce2011-10-26 22:55:33 +00001524 assert(MI->getNumOperands() > 1 && "Invalid machine instruction!");
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001525
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001526 // Keep track of user variables.
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001527 const MDNode *Var =
1528 MI->getOperand(MI->getNumOperands() - 1).getMetadata();
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001529
1530 // Variable is in a register, we need to check for clobbers.
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001531 if (isDbgValueInDefinedReg(MI))
1532 LiveUserVar[MI->getOperand(0).getReg()] = Var;
1533
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001534 // Check the history of this variable.
1535 SmallVectorImpl<const MachineInstr*> &History = DbgValues[Var];
1536 if (History.empty()) {
1537 UserVariables.push_back(Var);
1538 // The first mention of a function argument gets the FunctionBeginSym
1539 // label, so arguments are visible when breaking at function entry.
1540 DIVariable DV(Var);
Manman Ren7504ed42013-07-08 18:33:29 +00001541 if (DV.isVariable() && DV.getTag() == dwarf::DW_TAG_arg_variable &&
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001542 DISubprogram(getDISubprogram(DV.getContext()))
1543 .describes(MF->getFunction()))
1544 LabelsBeforeInsn[MI] = FunctionBeginSym;
1545 } else {
1546 // We have seen this variable before. Try to coalesce DBG_VALUEs.
1547 const MachineInstr *Prev = History.back();
1548 if (Prev->isDebugValue()) {
1549 // Coalesce identical entries at the end of History.
1550 if (History.size() >= 2 &&
Devang Patelb7a328e2011-07-07 00:14:27 +00001551 Prev->isIdenticalTo(History[History.size() - 2])) {
Eric Christopher85a495e2012-10-08 20:48:49 +00001552 DEBUG(dbgs() << "Coalescing identical DBG_VALUE entries:\n"
Eric Christopher6a841382012-11-19 22:42:10 +00001553 << "\t" << *Prev
Devang Patelb7a328e2011-07-07 00:14:27 +00001554 << "\t" << *History[History.size() - 2] << "\n");
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001555 History.pop_back();
Devang Patelb7a328e2011-07-07 00:14:27 +00001556 }
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001557
1558 // Terminate old register assignments that don't reach MI;
1559 MachineFunction::const_iterator PrevMBB = Prev->getParent();
1560 if (PrevMBB != I && (!AtBlockEntry || llvm::next(PrevMBB) != I) &&
1561 isDbgValueInDefinedReg(Prev)) {
1562 // Previous register assignment needs to terminate at the end of
1563 // its basic block.
1564 MachineBasicBlock::const_iterator LastMI =
1565 PrevMBB->getLastNonDebugInstr();
Devang Patelb7a328e2011-07-07 00:14:27 +00001566 if (LastMI == PrevMBB->end()) {
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001567 // Drop DBG_VALUE for empty range.
Eric Christopher85a495e2012-10-08 20:48:49 +00001568 DEBUG(dbgs() << "Dropping DBG_VALUE for empty range:\n"
Devang Patelb7a328e2011-07-07 00:14:27 +00001569 << "\t" << *Prev << "\n");
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001570 History.pop_back();
David Blaikieea2605d2013-06-20 00:25:24 +00001571 } else if (llvm::next(PrevMBB) != PrevMBB->getParent()->end())
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001572 // Terminate after LastMI.
1573 History.push_back(LastMI);
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001574 }
1575 }
1576 }
1577 History.push_back(MI);
Devang Patel002d54d2010-05-26 19:37:24 +00001578 } else {
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001579 // Not a DBG_VALUE instruction.
1580 if (!MI->isLabel())
1581 AtBlockEntry = false;
1582
Eric Christopher133195782012-10-04 20:46:14 +00001583 // First known non-DBG_VALUE and non-frame setup location marks
1584 // the beginning of the function body.
1585 if (!MI->getFlag(MachineInstr::FrameSetup) &&
1586 (PrologEndLoc.isUnknown() && !MI->getDebugLoc().isUnknown()))
Devang Patel34a66202011-05-11 19:22:19 +00001587 PrologEndLoc = MI->getDebugLoc();
1588
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001589 // Check if the instruction clobbers any registers with debug vars.
1590 for (MachineInstr::const_mop_iterator MOI = MI->operands_begin(),
1591 MOE = MI->operands_end(); MOI != MOE; ++MOI) {
1592 if (!MOI->isReg() || !MOI->isDef() || !MOI->getReg())
1593 continue;
Jakob Stoklund Olesen54038d72012-06-01 23:28:30 +00001594 for (MCRegAliasIterator AI(MOI->getReg(), TRI, true);
1595 AI.isValid(); ++AI) {
1596 unsigned Reg = *AI;
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001597 const MDNode *Var = LiveUserVar[Reg];
1598 if (!Var)
1599 continue;
1600 // Reg is now clobbered.
1601 LiveUserVar[Reg] = 0;
1602
1603 // Was MD last defined by a DBG_VALUE referring to Reg?
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001604 DbgValueHistoryMap::iterator HistI = DbgValues.find(Var);
1605 if (HistI == DbgValues.end())
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001606 continue;
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001607 SmallVectorImpl<const MachineInstr*> &History = HistI->second;
1608 if (History.empty())
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001609 continue;
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001610 const MachineInstr *Prev = History.back();
1611 // Sanity-check: Register assignments are terminated at the end of
1612 // their block.
1613 if (!Prev->isDebugValue() || Prev->getParent() != MI->getParent())
1614 continue;
1615 // Is the variable still in Reg?
1616 if (!isDbgValueInDefinedReg(Prev) ||
1617 Prev->getOperand(0).getReg() != Reg)
1618 continue;
1619 // Var is clobbered. Make sure the next instruction gets a label.
1620 History.push_back(MI);
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001621 }
1622 }
Devang Patel002d54d2010-05-26 19:37:24 +00001623 }
Devang Patel002d54d2010-05-26 19:37:24 +00001624 }
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001625 }
1626
1627 for (DbgValueHistoryMap::iterator I = DbgValues.begin(), E = DbgValues.end();
1628 I != E; ++I) {
1629 SmallVectorImpl<const MachineInstr*> &History = I->second;
1630 if (History.empty())
1631 continue;
1632
1633 // Make sure the final register assignments are terminated.
1634 const MachineInstr *Prev = History.back();
1635 if (Prev->isDebugValue() && isDbgValueInDefinedReg(Prev)) {
1636 const MachineBasicBlock *PrevMBB = Prev->getParent();
Eric Christopher6a841382012-11-19 22:42:10 +00001637 MachineBasicBlock::const_iterator LastMI =
Devang Patel784077e2011-08-10 23:58:09 +00001638 PrevMBB->getLastNonDebugInstr();
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001639 if (LastMI == PrevMBB->end())
1640 // Drop DBG_VALUE for empty range.
1641 History.pop_back();
David Blaikieea2605d2013-06-20 00:25:24 +00001642 else if (PrevMBB != &PrevMBB->getParent()->back()) {
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001643 // Terminate after LastMI.
1644 History.push_back(LastMI);
1645 }
1646 }
1647 // Request labels for the full history.
1648 for (unsigned i = 0, e = History.size(); i != e; ++i) {
1649 const MachineInstr *MI = History[i];
1650 if (MI->isDebugValue())
1651 requestLabelBeforeInsn(MI);
1652 else
1653 requestLabelAfterInsn(MI);
1654 }
1655 }
Devang Patel002d54d2010-05-26 19:37:24 +00001656
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001657 PrevInstLoc = DebugLoc();
Devang Patel002d54d2010-05-26 19:37:24 +00001658 PrevLabel = FunctionBeginSym;
Devang Patel34a66202011-05-11 19:22:19 +00001659
1660 // Record beginning of function.
1661 if (!PrologEndLoc.isUnknown()) {
1662 DebugLoc FnStartDL = getFnDebugLoc(PrologEndLoc,
1663 MF->getFunction()->getContext());
1664 recordSourceLine(FnStartDL.getLine(), FnStartDL.getCol(),
1665 FnStartDL.getScope(MF->getFunction()->getContext()),
David Blaikie67cb31e2012-12-04 22:02:33 +00001666 // We'd like to list the prologue as "not statements" but GDB behaves
1667 // poorly if we do that. Revisit this with caution/GDB (7.5+) testing.
David Blaikie5a773bb2012-12-04 21:05:36 +00001668 DWARF2_FLAG_IS_STMT);
Devang Patel34a66202011-05-11 19:22:19 +00001669 }
Bill Wendling2b128d72009-05-20 23:19:06 +00001670}
1671
Devang Patel7e623022011-08-10 20:55:27 +00001672void DwarfDebug::addScopeVariable(LexicalScope *LS, DbgVariable *Var) {
David Blaikie6f1a8062013-06-05 05:39:59 +00001673 SmallVectorImpl<DbgVariable *> &Vars = ScopeVariables[LS];
1674 DIVariable DV = Var->getVariable();
David Blaikie36d5d2f2013-06-06 21:04:51 +00001675 // Variables with positive arg numbers are parameters.
1676 if (unsigned ArgNum = DV.getArgNumber()) {
1677 // Keep all parameters in order at the start of the variable list to ensure
1678 // function types are correct (no out-of-order parameters)
1679 //
1680 // This could be improved by only doing it for optimized builds (unoptimized
1681 // builds have the right order to begin with), searching from the back (this
1682 // would catch the unoptimized case quickly), or doing a binary search
1683 // rather than linear search.
1684 SmallVectorImpl<DbgVariable *>::iterator I = Vars.begin();
1685 while (I != Vars.end()) {
1686 unsigned CurNum = (*I)->getVariable().getArgNumber();
1687 // A local (non-parameter) variable has been found, insert immediately
1688 // before it.
1689 if (CurNum == 0)
1690 break;
1691 // A later indexed parameter has been found, insert immediately before it.
David Blaikieb272a752013-06-06 22:28:26 +00001692 if (CurNum > ArgNum)
David Blaikie36d5d2f2013-06-06 21:04:51 +00001693 break;
David Blaikieb272a752013-06-06 22:28:26 +00001694 ++I;
David Blaikie6f1a8062013-06-05 05:39:59 +00001695 }
David Blaikie36d5d2f2013-06-06 21:04:51 +00001696 Vars.insert(I, Var);
1697 return;
David Blaikie6f1a8062013-06-05 05:39:59 +00001698 }
1699
1700 Vars.push_back(Var);
Devang Patel7e623022011-08-10 20:55:27 +00001701}
1702
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001703// Gather and emit post-function debug information.
Chris Lattner76555b52010-01-26 23:18:02 +00001704void DwarfDebug::endFunction(const MachineFunction *MF) {
Devang Patel7e623022011-08-10 20:55:27 +00001705 if (!MMI->hasDebugInfo() || LScopes.empty()) return;
Devang Patel2904aa92009-11-12 19:02:56 +00001706
Devang Patel7e623022011-08-10 20:55:27 +00001707 // Define end label for subprogram.
1708 FunctionEndSym = Asm->GetTempSymbol("func_end",
1709 Asm->getFunctionNumber());
1710 // Assumes in correct section after the entry point.
1711 Asm->OutStreamer.EmitLabel(FunctionEndSym);
Manman Ren4e042a62013-02-05 21:52:47 +00001712 // Set DwarfCompileUnitID in MCContext to default value.
1713 Asm->OutStreamer.getContext().setDwarfCompileUnitID(0);
Eric Christopher6a841382012-11-19 22:42:10 +00001714
Devang Patel7e623022011-08-10 20:55:27 +00001715 SmallPtrSet<const MDNode *, 16> ProcessedVars;
1716 collectVariableInfo(MF, ProcessedVars);
Eric Christopher6a841382012-11-19 22:42:10 +00001717
Devang Patel3acc70e2011-08-15 22:04:40 +00001718 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
Devang Pateleb1bb4e2011-08-16 22:09:43 +00001719 CompileUnit *TheCU = SPMap.lookup(FnScope->getScopeNode());
Nick Lewycky654f5ce2011-10-26 22:55:33 +00001720 assert(TheCU && "Unable to find compile unit!");
Devang Patel3acc70e2011-08-15 22:04:40 +00001721
Devang Patel7e623022011-08-10 20:55:27 +00001722 // Construct abstract scopes.
Devang Patel44403472011-08-12 18:10:19 +00001723 ArrayRef<LexicalScope *> AList = LScopes.getAbstractScopesList();
1724 for (unsigned i = 0, e = AList.size(); i != e; ++i) {
1725 LexicalScope *AScope = AList[i];
1726 DISubprogram SP(AScope->getScopeNode());
Manman Ren7504ed42013-07-08 18:33:29 +00001727 if (SP.isSubprogram()) {
Devang Patel7e623022011-08-10 20:55:27 +00001728 // Collect info for variables that were optimized out.
Devang Patel59e27c52011-08-19 23:28:12 +00001729 DIArray Variables = SP.getVariables();
1730 for (unsigned i = 0, e = Variables.getNumElements(); i != e; ++i) {
1731 DIVariable DV(Variables.getElement(i));
Manman Ren7504ed42013-07-08 18:33:29 +00001732 if (!DV || !DV.isVariable() || !ProcessedVars.insert(DV))
Devang Patel59e27c52011-08-19 23:28:12 +00001733 continue;
Alexey Samsonov39602782012-07-06 08:45:08 +00001734 // Check that DbgVariable for DV wasn't created earlier, when
1735 // findAbstractVariable() was called for inlined instance of DV.
1736 LLVMContext &Ctx = DV->getContext();
1737 DIVariable CleanDV = cleanseInlinedVariable(DV, Ctx);
1738 if (AbstractVariables.lookup(CleanDV))
1739 continue;
Devang Patel59e27c52011-08-19 23:28:12 +00001740 if (LexicalScope *Scope = LScopes.findAbstractScope(DV.getContext()))
1741 addScopeVariable(Scope, new DbgVariable(DV, NULL));
Devang Patel5c0f85c2010-06-25 22:07:34 +00001742 }
1743 }
Devang Patel44403472011-08-12 18:10:19 +00001744 if (ProcessedSPNodes.count(AScope->getScopeNode()) == 0)
Manman Ren4213c392013-05-29 17:16:59 +00001745 constructScopeDIE(TheCU, AScope);
Bill Wendling2b128d72009-05-20 23:19:06 +00001746 }
Eric Christopher6a841382012-11-19 22:42:10 +00001747
Devang Patel3acc70e2011-08-15 22:04:40 +00001748 DIE *CurFnDIE = constructScopeDIE(TheCU, FnScope);
Eric Christopher6a841382012-11-19 22:42:10 +00001749
Nick Lewycky50f02cb2011-12-02 22:16:29 +00001750 if (!MF->getTarget().Options.DisableFramePointerElim(*MF))
Eric Christopherbb69a272012-08-24 01:14:27 +00001751 TheCU->addFlag(CurFnDIE, dwarf::DW_AT_APPLE_omit_frame_ptr);
Devang Patel3acc70e2011-08-15 22:04:40 +00001752
Bill Wendling2b128d72009-05-20 23:19:06 +00001753 // Clear debug info
Craig Topper2b4a2012013-07-03 04:40:27 +00001754 for (ScopeVariablesMap::iterator
Devang Patel7e623022011-08-10 20:55:27 +00001755 I = ScopeVariables.begin(), E = ScopeVariables.end(); I != E; ++I)
1756 DeleteContainerPointers(I->second);
1757 ScopeVariables.clear();
Devang Patelad45d912011-04-22 18:09:57 +00001758 DeleteContainerPointers(CurrentFnArguments);
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001759 UserVariables.clear();
1760 DbgValues.clear();
Jeffrey Yasskin35b4e4f2010-03-12 17:45:06 +00001761 AbstractVariables.clear();
Devang Patel6c74a872010-04-27 19:46:33 +00001762 LabelsBeforeInsn.clear();
1763 LabelsAfterInsn.clear();
Devang Patel12563b32010-04-16 23:33:45 +00001764 PrevLabel = NULL;
Bill Wendling2b128d72009-05-20 23:19:06 +00001765}
1766
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001767// Register a source line with debug info. Returns the unique label that was
1768// emitted and which provides correspondence to the source line list.
Devang Patel34a66202011-05-11 19:22:19 +00001769void DwarfDebug::recordSourceLine(unsigned Line, unsigned Col, const MDNode *S,
1770 unsigned Flags) {
Devang Patel2d9caf92009-11-25 17:36:49 +00001771 StringRef Fn;
Devang Patele01b75c2011-03-24 20:30:50 +00001772 StringRef Dir;
Dan Gohman50849c62010-05-05 23:41:32 +00001773 unsigned Src = 1;
1774 if (S) {
1775 DIDescriptor Scope(S);
Devang Patel2089d162009-10-05 18:03:19 +00001776
Dan Gohman50849c62010-05-05 23:41:32 +00001777 if (Scope.isCompileUnit()) {
1778 DICompileUnit CU(S);
Dan Gohman50849c62010-05-05 23:41:32 +00001779 Fn = CU.getFilename();
Devang Patele01b75c2011-03-24 20:30:50 +00001780 Dir = CU.getDirectory();
Devang Patelc4b69052010-10-28 17:30:52 +00001781 } else if (Scope.isFile()) {
1782 DIFile F(S);
Devang Patelc4b69052010-10-28 17:30:52 +00001783 Fn = F.getFilename();
Devang Patele01b75c2011-03-24 20:30:50 +00001784 Dir = F.getDirectory();
Dan Gohman50849c62010-05-05 23:41:32 +00001785 } else if (Scope.isSubprogram()) {
1786 DISubprogram SP(S);
Dan Gohman50849c62010-05-05 23:41:32 +00001787 Fn = SP.getFilename();
Devang Patele01b75c2011-03-24 20:30:50 +00001788 Dir = SP.getDirectory();
Eric Christopher6647b832011-10-11 22:59:11 +00001789 } else if (Scope.isLexicalBlockFile()) {
1790 DILexicalBlockFile DBF(S);
1791 Fn = DBF.getFilename();
1792 Dir = DBF.getDirectory();
Dan Gohman50849c62010-05-05 23:41:32 +00001793 } else if (Scope.isLexicalBlock()) {
1794 DILexicalBlock DB(S);
Dan Gohman50849c62010-05-05 23:41:32 +00001795 Fn = DB.getFilename();
Devang Patele01b75c2011-03-24 20:30:50 +00001796 Dir = DB.getDirectory();
Dan Gohman50849c62010-05-05 23:41:32 +00001797 } else
Craig Topperee4dab52012-02-05 08:31:47 +00001798 llvm_unreachable("Unexpected scope info");
Dan Gohman50849c62010-05-05 23:41:32 +00001799
Manman Ren1e427202013-03-07 01:42:00 +00001800 Src = getOrCreateSourceID(Fn, Dir,
1801 Asm->OutStreamer.getContext().getDwarfCompileUnitID());
Dan Gohman50849c62010-05-05 23:41:32 +00001802 }
Nick Lewycky019d2552011-07-29 03:49:23 +00001803 Asm->OutStreamer.EmitDwarfLocDirective(Src, Line, Col, Flags, 0, 0, Fn);
Bill Wendling2b128d72009-05-20 23:19:06 +00001804}
1805
Bill Wendling806535f2009-05-20 23:22:40 +00001806//===----------------------------------------------------------------------===//
1807// Emit Methods
1808//===----------------------------------------------------------------------===//
1809
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001810// Compute the size and offset of a DIE.
Jim Grosbach00e9c612009-11-22 19:20:36 +00001811unsigned
Eric Christopherc8a310e2012-12-10 23:34:43 +00001812DwarfUnits::computeSizeAndOffset(DIE *Die, unsigned Offset) {
Bill Wendling480ff322009-05-20 23:21:38 +00001813 // Get the children.
1814 const std::vector<DIE *> &Children = Die->getChildren();
1815
Bill Wendling480ff322009-05-20 23:21:38 +00001816 // Record the abbreviation.
Devang Patel930143b2009-11-21 02:48:08 +00001817 assignAbbrevNumber(Die->getAbbrev());
Bill Wendling480ff322009-05-20 23:21:38 +00001818
1819 // Get the abbreviation for this DIE.
1820 unsigned AbbrevNumber = Die->getAbbrevNumber();
Eric Christopherc8a310e2012-12-10 23:34:43 +00001821 const DIEAbbrev *Abbrev = Abbreviations->at(AbbrevNumber - 1);
Bill Wendling480ff322009-05-20 23:21:38 +00001822
1823 // Set DIE offset
1824 Die->setOffset(Offset);
1825
1826 // Start the size with the size of abbreviation code.
Chris Lattner7b26fce2009-08-22 20:48:53 +00001827 Offset += MCAsmInfo::getULEB128Size(AbbrevNumber);
Bill Wendling480ff322009-05-20 23:21:38 +00001828
Eric Christopher4887c8f2013-03-29 23:34:06 +00001829 const SmallVectorImpl<DIEValue*> &Values = Die->getValues();
1830 const SmallVectorImpl<DIEAbbrevData> &AbbrevData = Abbrev->getData();
Bill Wendling480ff322009-05-20 23:21:38 +00001831
1832 // Size the DIE attribute values.
1833 for (unsigned i = 0, N = Values.size(); i < N; ++i)
1834 // Size attribute value.
Chris Lattner5a00dea2010-04-05 00:18:22 +00001835 Offset += Values[i]->SizeOf(Asm, AbbrevData[i].getForm());
Bill Wendling480ff322009-05-20 23:21:38 +00001836
1837 // Size the DIE children if any.
1838 if (!Children.empty()) {
1839 assert(Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes &&
1840 "Children flag not set");
1841
1842 for (unsigned j = 0, M = Children.size(); j < M; ++j)
Eric Christopher1f0cbb82012-11-20 22:14:13 +00001843 Offset = computeSizeAndOffset(Children[j], Offset);
Bill Wendling480ff322009-05-20 23:21:38 +00001844
1845 // End of children marker.
1846 Offset += sizeof(int8_t);
1847 }
1848
1849 Die->setSize(Offset - Die->getOffset());
1850 return Offset;
1851}
1852
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001853// Compute the size and offset of all the DIEs.
Eric Christopherc8a310e2012-12-10 23:34:43 +00001854void DwarfUnits::computeSizeAndOffsets() {
Manman Ren14a029d2013-03-12 18:27:15 +00001855 // Offset from the beginning of debug info section.
Eric Christopherd1c5a312013-05-30 00:43:35 +00001856 unsigned SecOffset = 0;
Eric Christopher4887c8f2013-03-29 23:34:06 +00001857 for (SmallVectorImpl<CompileUnit *>::iterator I = CUs.begin(),
Eric Christopherc8a310e2012-12-10 23:34:43 +00001858 E = CUs.end(); I != E; ++I) {
Eric Christopherd1c5a312013-05-30 00:43:35 +00001859 (*I)->setDebugInfoOffset(SecOffset);
Eric Christopher9c2ecd92012-11-30 23:59:06 +00001860 unsigned Offset =
1861 sizeof(int32_t) + // Length of Compilation Unit Info
1862 sizeof(int16_t) + // DWARF version number
1863 sizeof(int32_t) + // Offset Into Abbrev. Section
1864 sizeof(int8_t); // Pointer Size (in bytes)
1865
Manman Ren14a029d2013-03-12 18:27:15 +00001866 unsigned EndOffset = computeSizeAndOffset((*I)->getCUDie(), Offset);
Eric Christopherd1c5a312013-05-30 00:43:35 +00001867 SecOffset += EndOffset;
Devang Patel1a0df9a2010-05-10 22:49:55 +00001868 }
Bill Wendling480ff322009-05-20 23:21:38 +00001869}
1870
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001871// Emit initial Dwarf sections with a label at the start of each one.
Eric Christopher7b30f2e42012-11-21 00:34:35 +00001872void DwarfDebug::emitSectionLabels() {
Chris Lattner4b7dadb2009-08-19 05:49:37 +00001873 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
Daniel Dunbarc418d6b2009-09-19 20:40:05 +00001874
Bill Wendling480ff322009-05-20 23:21:38 +00001875 // Dwarf sections base addresses.
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001876 DwarfInfoSectionSym =
Eric Christopher7b30f2e42012-11-21 00:34:35 +00001877 emitSectionSym(Asm, TLOF.getDwarfInfoSection(), "section_info");
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001878 DwarfAbbrevSectionSym =
Eric Christopher7b30f2e42012-11-21 00:34:35 +00001879 emitSectionSym(Asm, TLOF.getDwarfAbbrevSection(), "section_abbrev");
Eric Christopher3c5a1912012-12-19 22:02:53 +00001880 if (useSplitDwarf())
1881 DwarfAbbrevDWOSectionSym =
1882 emitSectionSym(Asm, TLOF.getDwarfAbbrevDWOSection(),
1883 "section_abbrev_dwo");
Eric Christopher7b30f2e42012-11-21 00:34:35 +00001884 emitSectionSym(Asm, TLOF.getDwarfARangesSection());
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001885
Chris Lattner6629ca92010-04-04 22:59:04 +00001886 if (const MCSection *MacroInfo = TLOF.getDwarfMacroInfoSection())
Eric Christopher7b30f2e42012-11-21 00:34:35 +00001887 emitSectionSym(Asm, MacroInfo);
Bill Wendling480ff322009-05-20 23:21:38 +00001888
Eric Christopher74804332013-02-07 21:19:50 +00001889 DwarfLineSectionSym =
1890 emitSectionSym(Asm, TLOF.getDwarfLineSection(), "section_line");
Eric Christopher7b30f2e42012-11-21 00:34:35 +00001891 emitSectionSym(Asm, TLOF.getDwarfLocSection());
Michael Gottesmanc89466f2013-09-04 04:39:38 +00001892 if (HasDwarfPubSections) {
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00001893 emitSectionSym(Asm, TLOF.getDwarfPubNamesSection());
Eric Christopherbf1ea3c2013-08-26 23:24:31 +00001894 emitSectionSym(Asm, TLOF.getDwarfPubTypesSection());
Michael Gottesmanc89466f2013-09-04 04:39:38 +00001895 }
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001896 DwarfStrSectionSym =
Eric Christopher3bf29fd2012-12-27 02:14:01 +00001897 emitSectionSym(Asm, TLOF.getDwarfStrSection(), "info_string");
Eric Christopher55863be2013-04-07 03:43:09 +00001898 if (useSplitDwarf()) {
Eric Christopher3bf29fd2012-12-27 02:14:01 +00001899 DwarfStrDWOSectionSym =
1900 emitSectionSym(Asm, TLOF.getDwarfStrDWOSection(), "skel_string");
Eric Christopher55863be2013-04-07 03:43:09 +00001901 DwarfAddrSectionSym =
1902 emitSectionSym(Asm, TLOF.getDwarfAddrSection(), "addr_sec");
1903 }
Eric Christopher7b30f2e42012-11-21 00:34:35 +00001904 DwarfDebugRangeSectionSym = emitSectionSym(Asm, TLOF.getDwarfRangesSection(),
Devang Patel12563b32010-04-16 23:33:45 +00001905 "debug_range");
Bill Wendling480ff322009-05-20 23:21:38 +00001906
Eric Christopher7b30f2e42012-11-21 00:34:35 +00001907 DwarfDebugLocSectionSym = emitSectionSym(Asm, TLOF.getDwarfLocSection(),
Devang Patel9fc11702010-05-25 23:40:22 +00001908 "section_debug_loc");
1909
Eric Christopher7b30f2e42012-11-21 00:34:35 +00001910 TextSectionSym = emitSectionSym(Asm, TLOF.getTextSection(), "text_begin");
1911 emitSectionSym(Asm, TLOF.getDataSection());
Bill Wendling480ff322009-05-20 23:21:38 +00001912}
1913
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001914// Recursively emits a debug information entry.
Eric Christopher3c5a1912012-12-19 22:02:53 +00001915void DwarfDebug::emitDIE(DIE *Die, std::vector<DIEAbbrev *> *Abbrevs) {
Bill Wendling480ff322009-05-20 23:21:38 +00001916 // Get the abbreviation for this DIE.
1917 unsigned AbbrevNumber = Die->getAbbrevNumber();
Eric Christopher3c5a1912012-12-19 22:02:53 +00001918 const DIEAbbrev *Abbrev = Abbrevs->at(AbbrevNumber - 1);
Bill Wendling480ff322009-05-20 23:21:38 +00001919
Bill Wendling480ff322009-05-20 23:21:38 +00001920 // Emit the code (index) for the abbreviation.
Chris Lattner7bde8c02010-04-04 18:52:31 +00001921 if (Asm->isVerbose())
Chris Lattnerfa823552010-01-22 23:18:42 +00001922 Asm->OutStreamer.AddComment("Abbrev [" + Twine(AbbrevNumber) + "] 0x" +
1923 Twine::utohexstr(Die->getOffset()) + ":0x" +
1924 Twine::utohexstr(Die->getSize()) + " " +
1925 dwarf::TagString(Abbrev->getTag()));
Chris Lattner9efd1182010-04-04 19:09:29 +00001926 Asm->EmitULEB128(AbbrevNumber);
Bill Wendling480ff322009-05-20 23:21:38 +00001927
Eric Christopher4887c8f2013-03-29 23:34:06 +00001928 const SmallVectorImpl<DIEValue*> &Values = Die->getValues();
1929 const SmallVectorImpl<DIEAbbrevData> &AbbrevData = Abbrev->getData();
Bill Wendling480ff322009-05-20 23:21:38 +00001930
1931 // Emit the DIE attribute values.
1932 for (unsigned i = 0, N = Values.size(); i < N; ++i) {
1933 unsigned Attr = AbbrevData[i].getAttribute();
1934 unsigned Form = AbbrevData[i].getForm();
1935 assert(Form && "Too many attributes for DIE (check abbreviation)");
1936
Chris Lattner7bde8c02010-04-04 18:52:31 +00001937 if (Asm->isVerbose())
Chris Lattner5adf9872010-01-24 18:54:17 +00001938 Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr));
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001939
Bill Wendling480ff322009-05-20 23:21:38 +00001940 switch (Attr) {
Bill Wendling480ff322009-05-20 23:21:38 +00001941 case dwarf::DW_AT_abstract_origin: {
1942 DIEEntry *E = cast<DIEEntry>(Values[i]);
1943 DIE *Origin = E->getEntry();
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001944 unsigned Addr = Origin->getOffset();
Manman Ren14a029d2013-03-12 18:27:15 +00001945 if (Form == dwarf::DW_FORM_ref_addr) {
1946 // For DW_FORM_ref_addr, output the offset from beginning of debug info
1947 // section. Origin->getOffset() returns the offset from start of the
1948 // compile unit.
1949 DwarfUnits &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
1950 Addr += Holder.getCUOffset(Origin->getCompileUnit());
1951 }
Manman Renac8062b2013-07-02 23:40:10 +00001952 Asm->OutStreamer.EmitIntValue(Addr,
1953 Form == dwarf::DW_FORM_ref_addr ? DIEEntry::getRefAddrSize(Asm) : 4);
Bill Wendling480ff322009-05-20 23:21:38 +00001954 break;
1955 }
Devang Patel12563b32010-04-16 23:33:45 +00001956 case dwarf::DW_AT_ranges: {
1957 // DW_AT_range Value encodes offset in debug_range section.
1958 DIEInteger *V = cast<DIEInteger>(Values[i]);
Devang Patelda3ef852010-09-02 16:43:44 +00001959
Nick Lewycky33da3362012-06-22 01:25:12 +00001960 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections()) {
Devang Patelda3ef852010-09-02 16:43:44 +00001961 Asm->EmitLabelPlusOffset(DwarfDebugRangeSectionSym,
1962 V->getValue(),
1963 4);
1964 } else {
1965 Asm->EmitLabelOffsetDifference(DwarfDebugRangeSectionSym,
1966 V->getValue(),
1967 DwarfDebugRangeSectionSym,
1968 4);
1969 }
Devang Patel12563b32010-04-16 23:33:45 +00001970 break;
1971 }
Devang Patel9fc11702010-05-25 23:40:22 +00001972 case dwarf::DW_AT_location: {
Nick Lewycky33da3362012-06-22 01:25:12 +00001973 if (DIELabel *L = dyn_cast<DIELabel>(Values[i])) {
1974 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
Ulrich Weigand396ba8b2013-07-02 18:46:26 +00001975 Asm->EmitLabelReference(L->getValue(), 4);
Nick Lewycky33da3362012-06-22 01:25:12 +00001976 else
Ulrich Weigand396ba8b2013-07-02 18:46:26 +00001977 Asm->EmitLabelDifference(L->getValue(), DwarfDebugLocSectionSym, 4);
Nick Lewycky33da3362012-06-22 01:25:12 +00001978 } else {
Devang Patel9fc11702010-05-25 23:40:22 +00001979 Values[i]->EmitValue(Asm, Form);
Nick Lewycky33da3362012-06-22 01:25:12 +00001980 }
Devang Patel9fc11702010-05-25 23:40:22 +00001981 break;
1982 }
Devang Patela1bd5a12010-09-29 19:08:08 +00001983 case dwarf::DW_AT_accessibility: {
1984 if (Asm->isVerbose()) {
1985 DIEInteger *V = cast<DIEInteger>(Values[i]);
1986 Asm->OutStreamer.AddComment(dwarf::AccessibilityString(V->getValue()));
1987 }
1988 Values[i]->EmitValue(Asm, Form);
1989 break;
1990 }
Bill Wendling480ff322009-05-20 23:21:38 +00001991 default:
1992 // Emit an attribute using the defined form.
Chris Lattner3a383cb2010-04-05 00:13:49 +00001993 Values[i]->EmitValue(Asm, Form);
Bill Wendling480ff322009-05-20 23:21:38 +00001994 break;
1995 }
Bill Wendling480ff322009-05-20 23:21:38 +00001996 }
1997
1998 // Emit the DIE children if any.
1999 if (Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes) {
2000 const std::vector<DIE *> &Children = Die->getChildren();
2001
2002 for (unsigned j = 0, M = Children.size(); j < M; ++j)
Eric Christopher3c5a1912012-12-19 22:02:53 +00002003 emitDIE(Children[j], Abbrevs);
Bill Wendling480ff322009-05-20 23:21:38 +00002004
Chris Lattner7bde8c02010-04-04 18:52:31 +00002005 if (Asm->isVerbose())
Chris Lattner566cae92010-03-09 23:52:58 +00002006 Asm->OutStreamer.AddComment("End Of Children Mark");
2007 Asm->EmitInt8(0);
Bill Wendling480ff322009-05-20 23:21:38 +00002008 }
2009}
2010
Eric Christophera2de8262012-12-15 00:04:07 +00002011// Emit the various dwarf units to the unit section USection with
2012// the abbreviations going into ASection.
2013void DwarfUnits::emitUnits(DwarfDebug *DD,
2014 const MCSection *USection,
2015 const MCSection *ASection,
2016 const MCSymbol *ASectionSym) {
2017 Asm->OutStreamer.SwitchSection(USection);
Eric Christopher4887c8f2013-03-29 23:34:06 +00002018 for (SmallVectorImpl<CompileUnit *>::iterator I = CUs.begin(),
Eric Christophera2de8262012-12-15 00:04:07 +00002019 E = CUs.end(); I != E; ++I) {
2020 CompileUnit *TheCU = *I;
Devang Patel1a0df9a2010-05-10 22:49:55 +00002021 DIE *Die = TheCU->getCUDie();
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002022
Devang Patel1a0df9a2010-05-10 22:49:55 +00002023 // Emit the compile units header.
Eric Christophera2de8262012-12-15 00:04:07 +00002024 Asm->OutStreamer
2025 .EmitLabel(Asm->GetTempSymbol(USection->getLabelBeginName(),
2026 TheCU->getUniqueID()));
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002027
Devang Patel1a0df9a2010-05-10 22:49:55 +00002028 // Emit size of content not including length itself
2029 unsigned ContentSize = Die->getSize() +
2030 sizeof(int16_t) + // DWARF version number
2031 sizeof(int32_t) + // Offset Into Abbrev. Section
Devang Patele141234942011-04-13 19:41:17 +00002032 sizeof(int8_t); // Pointer Size (in bytes)
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002033
Devang Patel1a0df9a2010-05-10 22:49:55 +00002034 Asm->OutStreamer.AddComment("Length of Compilation Unit Info");
2035 Asm->EmitInt32(ContentSize);
2036 Asm->OutStreamer.AddComment("DWARF version number");
Manman Renac8062b2013-07-02 23:40:10 +00002037 Asm->EmitInt16(DD->getDwarfVersion());
Devang Patel1a0df9a2010-05-10 22:49:55 +00002038 Asm->OutStreamer.AddComment("Offset Into Abbrev. Section");
Eric Christophera2de8262012-12-15 00:04:07 +00002039 Asm->EmitSectionOffset(Asm->GetTempSymbol(ASection->getLabelBeginName()),
2040 ASectionSym);
Devang Patel1a0df9a2010-05-10 22:49:55 +00002041 Asm->OutStreamer.AddComment("Address Size (in bytes)");
Chandler Carruth5da3f052012-11-01 09:14:31 +00002042 Asm->EmitInt8(Asm->getDataLayout().getPointerSize());
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002043
Eric Christopher3c5a1912012-12-19 22:02:53 +00002044 DD->emitDIE(Die, Abbreviations);
Eric Christophera2de8262012-12-15 00:04:07 +00002045 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol(USection->getLabelEndName(),
Eli Benderskyb42d1462012-12-03 18:45:45 +00002046 TheCU->getUniqueID()));
Devang Patel1a0df9a2010-05-10 22:49:55 +00002047 }
Bill Wendling480ff322009-05-20 23:21:38 +00002048}
2049
Manman Ren14a029d2013-03-12 18:27:15 +00002050/// For a given compile unit DIE, returns offset from beginning of debug info.
2051unsigned DwarfUnits::getCUOffset(DIE *Die) {
Manman Ren11fec382013-03-13 18:41:27 +00002052 assert(Die->getTag() == dwarf::DW_TAG_compile_unit &&
2053 "Input DIE should be compile unit in getCUOffset.");
Eric Christopherd25f7fc2013-08-08 01:41:05 +00002054 for (SmallVectorImpl<CompileUnit *>::iterator I = CUs.begin(), E = CUs.end();
2055 I != E; ++I) {
Manman Ren14a029d2013-03-12 18:27:15 +00002056 CompileUnit *TheCU = *I;
2057 if (TheCU->getCUDie() == Die)
2058 return TheCU->getDebugInfoOffset();
2059 }
Manman Ren11fec382013-03-13 18:41:27 +00002060 llvm_unreachable("The compile unit DIE should belong to CUs in DwarfUnits.");
Manman Ren14a029d2013-03-12 18:27:15 +00002061}
2062
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002063// Emit the debug info section.
2064void DwarfDebug::emitDebugInfo() {
Eric Christophera2de8262012-12-15 00:04:07 +00002065 DwarfUnits &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
2066
2067 Holder.emitUnits(this, Asm->getObjFileLowering().getDwarfInfoSection(),
2068 Asm->getObjFileLowering().getDwarfAbbrevSection(),
2069 DwarfAbbrevSectionSym);
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002070}
2071
Eric Christopheracdcbdb2012-11-27 22:43:45 +00002072// Emit the abbreviation section.
Eric Christopher38371952012-11-20 23:30:11 +00002073void DwarfDebug::emitAbbreviations() {
Eric Christopher3c5a1912012-12-19 22:02:53 +00002074 if (!useSplitDwarf())
2075 emitAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevSection(),
2076 &Abbreviations);
2077 else
2078 emitSkeletonAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevSection());
2079}
Bill Wendling480ff322009-05-20 23:21:38 +00002080
Eric Christopher3c5a1912012-12-19 22:02:53 +00002081void DwarfDebug::emitAbbrevs(const MCSection *Section,
2082 std::vector<DIEAbbrev *> *Abbrevs) {
2083 // Check to see if it is worth the effort.
2084 if (!Abbrevs->empty()) {
2085 // Start the debug abbrev section.
2086 Asm->OutStreamer.SwitchSection(Section);
2087
2088 MCSymbol *Begin = Asm->GetTempSymbol(Section->getLabelBeginName());
Eric Christopher996b2b72012-12-13 03:00:38 +00002089 Asm->OutStreamer.EmitLabel(Begin);
Bill Wendling480ff322009-05-20 23:21:38 +00002090
2091 // For each abbrevation.
Eric Christopher3c5a1912012-12-19 22:02:53 +00002092 for (unsigned i = 0, N = Abbrevs->size(); i < N; ++i) {
Bill Wendling480ff322009-05-20 23:21:38 +00002093 // Get abbreviation data
Eric Christopher3c5a1912012-12-19 22:02:53 +00002094 const DIEAbbrev *Abbrev = Abbrevs->at(i);
Bill Wendling480ff322009-05-20 23:21:38 +00002095
2096 // Emit the abbrevations code (base 1 index.)
Chris Lattner9efd1182010-04-04 19:09:29 +00002097 Asm->EmitULEB128(Abbrev->getNumber(), "Abbreviation Code");
Bill Wendling480ff322009-05-20 23:21:38 +00002098
2099 // Emit the abbreviations data.
Chris Lattner3a383cb2010-04-05 00:13:49 +00002100 Abbrev->Emit(Asm);
Bill Wendling480ff322009-05-20 23:21:38 +00002101 }
2102
2103 // Mark end of abbreviations.
Chris Lattner9efd1182010-04-04 19:09:29 +00002104 Asm->EmitULEB128(0, "EOM(3)");
Bill Wendling480ff322009-05-20 23:21:38 +00002105
Eric Christopher3c5a1912012-12-19 22:02:53 +00002106 MCSymbol *End = Asm->GetTempSymbol(Section->getLabelEndName());
Eric Christopher996b2b72012-12-13 03:00:38 +00002107 Asm->OutStreamer.EmitLabel(End);
Bill Wendling480ff322009-05-20 23:21:38 +00002108 }
2109}
2110
Eric Christopheracdcbdb2012-11-27 22:43:45 +00002111// Emit the last address of the section and the end of the line matrix.
Devang Patel930143b2009-11-21 02:48:08 +00002112void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) {
Bill Wendling480ff322009-05-20 23:21:38 +00002113 // Define last address of section.
Chris Lattner566cae92010-03-09 23:52:58 +00002114 Asm->OutStreamer.AddComment("Extended Op");
2115 Asm->EmitInt8(0);
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002116
Chris Lattner566cae92010-03-09 23:52:58 +00002117 Asm->OutStreamer.AddComment("Op size");
Chandler Carruth5da3f052012-11-01 09:14:31 +00002118 Asm->EmitInt8(Asm->getDataLayout().getPointerSize() + 1);
Chris Lattner566cae92010-03-09 23:52:58 +00002119 Asm->OutStreamer.AddComment("DW_LNE_set_address");
2120 Asm->EmitInt8(dwarf::DW_LNE_set_address);
2121
2122 Asm->OutStreamer.AddComment("Section end label");
Chris Lattnerb245dfb2010-03-10 01:17:49 +00002123
Chris Lattnera179b522010-04-04 19:25:43 +00002124 Asm->OutStreamer.EmitSymbolValue(Asm->GetTempSymbol("section_end",SectionEnd),
Eric Christopherce0cfce2013-01-09 01:35:34 +00002125 Asm->getDataLayout().getPointerSize());
Bill Wendling480ff322009-05-20 23:21:38 +00002126
2127 // Mark end of matrix.
Chris Lattner566cae92010-03-09 23:52:58 +00002128 Asm->OutStreamer.AddComment("DW_LNE_end_sequence");
2129 Asm->EmitInt8(0);
Chris Lattnerf5c834f2010-01-22 22:09:00 +00002130 Asm->EmitInt8(1);
Chris Lattnerfa823552010-01-22 23:18:42 +00002131 Asm->EmitInt8(1);
Bill Wendling480ff322009-05-20 23:21:38 +00002132}
2133
Eric Christopheracdcbdb2012-11-27 22:43:45 +00002134// Emit visible names into a hashed accelerator table section.
Eric Christopher4996c702011-11-07 09:24:32 +00002135void DwarfDebug::emitAccelNames() {
Eric Christophercf7289f2013-09-05 18:20:16 +00002136 DwarfAccelTable AT(DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset,
Eric Christopher4996c702011-11-07 09:24:32 +00002137 dwarf::DW_FORM_data4));
2138 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2139 E = CUMap.end(); I != E; ++I) {
2140 CompileUnit *TheCU = I->second;
Eric Christopherd9843b32011-11-10 19:25:34 +00002141 const StringMap<std::vector<DIE*> > &Names = TheCU->getAccelNames();
2142 for (StringMap<std::vector<DIE*> >::const_iterator
Eric Christopher4996c702011-11-07 09:24:32 +00002143 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
Benjamin Kramer63e39eb2013-05-11 18:24:28 +00002144 StringRef Name = GI->getKey();
Eric Christopher090fcc12012-01-06 23:03:34 +00002145 const std::vector<DIE *> &Entities = GI->second;
Eric Christopherd9843b32011-11-10 19:25:34 +00002146 for (std::vector<DIE *>::const_iterator DI = Entities.begin(),
2147 DE = Entities.end(); DI != DE; ++DI)
2148 AT.AddName(Name, (*DI));
Eric Christopher4996c702011-11-07 09:24:32 +00002149 }
2150 }
2151
2152 AT.FinalizeTable(Asm, "Names");
2153 Asm->OutStreamer.SwitchSection(
2154 Asm->getObjFileLowering().getDwarfAccelNamesSection());
2155 MCSymbol *SectionBegin = Asm->GetTempSymbol("names_begin");
2156 Asm->OutStreamer.EmitLabel(SectionBegin);
2157
2158 // Emit the full data.
Eric Christophere698f532012-12-20 21:58:36 +00002159 AT.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher4996c702011-11-07 09:24:32 +00002160}
2161
Eric Christopher48fef592012-12-20 21:58:40 +00002162// Emit objective C classes and categories into a hashed accelerator table
2163// section.
Eric Christopher4996c702011-11-07 09:24:32 +00002164void DwarfDebug::emitAccelObjC() {
Eric Christophercf7289f2013-09-05 18:20:16 +00002165 DwarfAccelTable AT(DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset,
Eric Christopher4996c702011-11-07 09:24:32 +00002166 dwarf::DW_FORM_data4));
2167 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2168 E = CUMap.end(); I != E; ++I) {
2169 CompileUnit *TheCU = I->second;
2170 const StringMap<std::vector<DIE*> > &Names = TheCU->getAccelObjC();
2171 for (StringMap<std::vector<DIE*> >::const_iterator
2172 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
Benjamin Kramer63e39eb2013-05-11 18:24:28 +00002173 StringRef Name = GI->getKey();
Eric Christopher090fcc12012-01-06 23:03:34 +00002174 const std::vector<DIE *> &Entities = GI->second;
Eric Christopher4996c702011-11-07 09:24:32 +00002175 for (std::vector<DIE *>::const_iterator DI = Entities.begin(),
2176 DE = Entities.end(); DI != DE; ++DI)
2177 AT.AddName(Name, (*DI));
2178 }
2179 }
2180
2181 AT.FinalizeTable(Asm, "ObjC");
2182 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering()
2183 .getDwarfAccelObjCSection());
2184 MCSymbol *SectionBegin = Asm->GetTempSymbol("objc_begin");
2185 Asm->OutStreamer.EmitLabel(SectionBegin);
2186
2187 // Emit the full data.
Eric Christophere698f532012-12-20 21:58:36 +00002188 AT.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher4996c702011-11-07 09:24:32 +00002189}
2190
Eric Christopheracdcbdb2012-11-27 22:43:45 +00002191// Emit namespace dies into a hashed accelerator table.
Eric Christopher4996c702011-11-07 09:24:32 +00002192void DwarfDebug::emitAccelNamespaces() {
Eric Christophercf7289f2013-09-05 18:20:16 +00002193 DwarfAccelTable AT(DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset,
Eric Christopher4996c702011-11-07 09:24:32 +00002194 dwarf::DW_FORM_data4));
2195 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2196 E = CUMap.end(); I != E; ++I) {
2197 CompileUnit *TheCU = I->second;
Eric Christopher66b37db2011-11-10 21:47:55 +00002198 const StringMap<std::vector<DIE*> > &Names = TheCU->getAccelNamespace();
2199 for (StringMap<std::vector<DIE*> >::const_iterator
Eric Christopher4996c702011-11-07 09:24:32 +00002200 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
Benjamin Kramer63e39eb2013-05-11 18:24:28 +00002201 StringRef Name = GI->getKey();
Eric Christopher090fcc12012-01-06 23:03:34 +00002202 const std::vector<DIE *> &Entities = GI->second;
Eric Christopher66b37db2011-11-10 21:47:55 +00002203 for (std::vector<DIE *>::const_iterator DI = Entities.begin(),
2204 DE = Entities.end(); DI != DE; ++DI)
2205 AT.AddName(Name, (*DI));
Eric Christopher4996c702011-11-07 09:24:32 +00002206 }
2207 }
2208
2209 AT.FinalizeTable(Asm, "namespac");
2210 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering()
2211 .getDwarfAccelNamespaceSection());
2212 MCSymbol *SectionBegin = Asm->GetTempSymbol("namespac_begin");
2213 Asm->OutStreamer.EmitLabel(SectionBegin);
2214
2215 // Emit the full data.
Eric Christophere698f532012-12-20 21:58:36 +00002216 AT.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher4996c702011-11-07 09:24:32 +00002217}
2218
Eric Christopheracdcbdb2012-11-27 22:43:45 +00002219// Emit type dies into a hashed accelerator table.
Eric Christopher4996c702011-11-07 09:24:32 +00002220void DwarfDebug::emitAccelTypes() {
Eric Christopher21bde872012-01-06 04:35:23 +00002221 std::vector<DwarfAccelTable::Atom> Atoms;
Eric Christophercf7289f2013-09-05 18:20:16 +00002222 Atoms.push_back(DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset,
Eric Christopher21bde872012-01-06 04:35:23 +00002223 dwarf::DW_FORM_data4));
Eric Christophercf7289f2013-09-05 18:20:16 +00002224 Atoms.push_back(DwarfAccelTable::Atom(dwarf::DW_ATOM_die_tag,
Eric Christopher21bde872012-01-06 04:35:23 +00002225 dwarf::DW_FORM_data2));
Eric Christophercf7289f2013-09-05 18:20:16 +00002226 Atoms.push_back(DwarfAccelTable::Atom(dwarf::DW_ATOM_type_flags,
Eric Christopher21bde872012-01-06 04:35:23 +00002227 dwarf::DW_FORM_data1));
2228 DwarfAccelTable AT(Atoms);
Eric Christopher4996c702011-11-07 09:24:32 +00002229 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2230 E = CUMap.end(); I != E; ++I) {
2231 CompileUnit *TheCU = I->second;
Eric Christopher21bde872012-01-06 04:35:23 +00002232 const StringMap<std::vector<std::pair<DIE*, unsigned > > > &Names
2233 = TheCU->getAccelTypes();
2234 for (StringMap<std::vector<std::pair<DIE*, unsigned> > >::const_iterator
Eric Christopher4996c702011-11-07 09:24:32 +00002235 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
Benjamin Kramer63e39eb2013-05-11 18:24:28 +00002236 StringRef Name = GI->getKey();
Eric Christopher090fcc12012-01-06 23:03:34 +00002237 const std::vector<std::pair<DIE *, unsigned> > &Entities = GI->second;
Eric Christopher21bde872012-01-06 04:35:23 +00002238 for (std::vector<std::pair<DIE *, unsigned> >::const_iterator DI
2239 = Entities.begin(), DE = Entities.end(); DI !=DE; ++DI)
2240 AT.AddName(Name, (*DI).first, (*DI).second);
Eric Christopher4996c702011-11-07 09:24:32 +00002241 }
2242 }
2243
2244 AT.FinalizeTable(Asm, "types");
2245 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering()
2246 .getDwarfAccelTypesSection());
2247 MCSymbol *SectionBegin = Asm->GetTempSymbol("types_begin");
2248 Asm->OutStreamer.EmitLabel(SectionBegin);
2249
2250 // Emit the full data.
Eric Christophere698f532012-12-20 21:58:36 +00002251 AT.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher4996c702011-11-07 09:24:32 +00002252}
2253
Eric Christopher5f93bb92013-09-09 20:03:17 +00002254/// emitDebugPubNames - Emit visible names into a debug pubnames section.
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00002255///
Eric Christopher5f93bb92013-09-09 20:03:17 +00002256void DwarfDebug::emitDebugPubNames() {
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00002257 const MCSection *ISec = Asm->getObjFileLowering().getDwarfInfoSection();
2258
2259 typedef DenseMap<const MDNode*, CompileUnit*> CUMapType;
2260 for (CUMapType::iterator I = CUMap.begin(), E = CUMap.end(); I != E; ++I) {
2261 CompileUnit *TheCU = I->second;
2262 unsigned ID = TheCU->getUniqueID();
2263
2264 if (TheCU->getGlobalNames().empty())
2265 continue;
2266
2267 // Start the dwarf pubnames section.
Eric Christopher7da24882013-08-19 21:07:38 +00002268 Asm->OutStreamer
2269 .SwitchSection(Asm->getObjFileLowering().getDwarfPubNamesSection());
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00002270
2271 Asm->OutStreamer.AddComment("Length of Public Names Info");
2272 Asm->EmitLabelDifference(Asm->GetTempSymbol("pubnames_end", ID),
2273 Asm->GetTempSymbol("pubnames_begin", ID), 4);
2274
2275 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_begin", ID));
2276
2277 Asm->OutStreamer.AddComment("DWARF Version");
David Majnemered89b5c2013-08-21 06:13:34 +00002278 Asm->EmitInt16(dwarf::DW_PUBNAMES_VERSION);
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00002279
2280 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
2281 Asm->EmitSectionOffset(Asm->GetTempSymbol(ISec->getLabelBeginName(), ID),
2282 DwarfInfoSectionSym);
2283
2284 Asm->OutStreamer.AddComment("Compilation Unit Length");
2285 Asm->EmitLabelDifference(Asm->GetTempSymbol(ISec->getLabelEndName(), ID),
2286 Asm->GetTempSymbol(ISec->getLabelBeginName(), ID),
2287 4);
2288
2289 const StringMap<DIE*> &Globals = TheCU->getGlobalNames();
2290 for (StringMap<DIE*>::const_iterator
2291 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2292 const char *Name = GI->getKeyData();
2293 const DIE *Entity = GI->second;
2294
2295 Asm->OutStreamer.AddComment("DIE offset");
2296 Asm->EmitInt32(Entity->getOffset());
2297
2298 if (Asm->isVerbose())
2299 Asm->OutStreamer.AddComment("External Name");
Rafael Espindola64e1af82013-07-02 15:49:13 +00002300 Asm->OutStreamer.EmitBytes(StringRef(Name, GI->getKeyLength()+1));
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00002301 }
2302
2303 Asm->OutStreamer.AddComment("End Mark");
2304 Asm->EmitInt32(0);
2305 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_end", ID));
2306 }
2307}
2308
Devang Patel04d2f2d2009-11-24 01:14:22 +00002309void DwarfDebug::emitDebugPubTypes() {
Devang Patel1a0df9a2010-05-10 22:49:55 +00002310 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2311 E = CUMap.end(); I != E; ++I) {
2312 CompileUnit *TheCU = I->second;
Eric Christopher6abc9c52011-11-07 09:18:35 +00002313 // Start the dwarf pubtypes section.
Devang Patel1a0df9a2010-05-10 22:49:55 +00002314 Asm->OutStreamer.SwitchSection(
2315 Asm->getObjFileLowering().getDwarfPubTypesSection());
2316 Asm->OutStreamer.AddComment("Length of Public Types Info");
2317 Asm->EmitLabelDifference(
Eli Benderskyb42d1462012-12-03 18:45:45 +00002318 Asm->GetTempSymbol("pubtypes_end", TheCU->getUniqueID()),
2319 Asm->GetTempSymbol("pubtypes_begin", TheCU->getUniqueID()), 4);
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002320
Devang Patel1a0df9a2010-05-10 22:49:55 +00002321 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_begin",
Eli Benderskyb42d1462012-12-03 18:45:45 +00002322 TheCU->getUniqueID()));
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002323
Devang Patel1a0df9a2010-05-10 22:49:55 +00002324 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DWARF Version");
David Majnemered89b5c2013-08-21 06:13:34 +00002325 Asm->EmitInt16(dwarf::DW_PUBTYPES_VERSION);
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002326
Devang Patel1a0df9a2010-05-10 22:49:55 +00002327 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
Eric Christopher16485a52012-12-15 00:04:04 +00002328 const MCSection *ISec = Asm->getObjFileLowering().getDwarfInfoSection();
2329 Asm->EmitSectionOffset(Asm->GetTempSymbol(ISec->getLabelBeginName(),
Eli Benderskyb42d1462012-12-03 18:45:45 +00002330 TheCU->getUniqueID()),
Devang Patel1a0df9a2010-05-10 22:49:55 +00002331 DwarfInfoSectionSym);
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002332
Devang Patel1a0df9a2010-05-10 22:49:55 +00002333 Asm->OutStreamer.AddComment("Compilation Unit Length");
Eric Christopher16485a52012-12-15 00:04:04 +00002334 Asm->EmitLabelDifference(Asm->GetTempSymbol(ISec->getLabelEndName(),
Eli Benderskyb42d1462012-12-03 18:45:45 +00002335 TheCU->getUniqueID()),
Eric Christopher16485a52012-12-15 00:04:04 +00002336 Asm->GetTempSymbol(ISec->getLabelBeginName(),
Eli Benderskyb42d1462012-12-03 18:45:45 +00002337 TheCU->getUniqueID()),
Devang Patel1a0df9a2010-05-10 22:49:55 +00002338 4);
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002339
Devang Patel1a0df9a2010-05-10 22:49:55 +00002340 const StringMap<DIE*> &Globals = TheCU->getGlobalTypes();
2341 for (StringMap<DIE*>::const_iterator
2342 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2343 const char *Name = GI->getKeyData();
Nick Lewycky019d2552011-07-29 03:49:23 +00002344 DIE *Entity = GI->second;
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002345
Devang Patel1a0df9a2010-05-10 22:49:55 +00002346 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
2347 Asm->EmitInt32(Entity->getOffset());
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002348
Devang Patel1a0df9a2010-05-10 22:49:55 +00002349 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("External Name");
Benjamin Kramer966ed1b2011-11-09 18:16:11 +00002350 // Emit the name with a terminating null byte.
Eric Christophere3ab3d02013-01-09 01:57:54 +00002351 Asm->OutStreamer.EmitBytes(StringRef(Name, GI->getKeyLength()+1));
Devang Patel1a0df9a2010-05-10 22:49:55 +00002352 }
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002353
Devang Patel1a0df9a2010-05-10 22:49:55 +00002354 Asm->OutStreamer.AddComment("End Mark");
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002355 Asm->EmitInt32(0);
Devang Patel1a0df9a2010-05-10 22:49:55 +00002356 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_end",
Eli Benderskyb42d1462012-12-03 18:45:45 +00002357 TheCU->getUniqueID()));
Devang Patel04d2f2d2009-11-24 01:14:22 +00002358 }
Devang Patel04d2f2d2009-11-24 01:14:22 +00002359}
2360
Eric Christopher3bf29fd2012-12-27 02:14:01 +00002361// Emit strings into a string section.
Eric Christopher2cbd5762013-01-07 19:32:41 +00002362void DwarfUnits::emitStrings(const MCSection *StrSection,
2363 const MCSection *OffsetSection = NULL,
2364 const MCSymbol *StrSecSym = NULL) {
Eric Christopher3bf29fd2012-12-27 02:14:01 +00002365
Eric Christopher27614582013-01-08 22:22:06 +00002366 if (StringPool.empty()) return;
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002367
Chris Lattner3d72a672010-03-09 23:38:23 +00002368 // Start the dwarf str section.
Eric Christopher2cbd5762013-01-07 19:32:41 +00002369 Asm->OutStreamer.SwitchSection(StrSection);
Bill Wendling480ff322009-05-20 23:21:38 +00002370
Chris Lattnerb7aa9522010-03-13 02:17:42 +00002371 // Get all of the string pool entries and put them in an array by their ID so
2372 // we can sort them.
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002373 SmallVector<std::pair<unsigned,
Eric Christopherb800ff72013-01-07 22:40:45 +00002374 StringMapEntry<std::pair<MCSymbol*, unsigned> >*>, 64> Entries;
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002375
Chris Lattnerb7aa9522010-03-13 02:17:42 +00002376 for (StringMap<std::pair<MCSymbol*, unsigned> >::iterator
Eric Christopher27614582013-01-08 22:22:06 +00002377 I = StringPool.begin(), E = StringPool.end();
Eric Christopher48fef592012-12-20 21:58:40 +00002378 I != E; ++I)
Chris Lattnerb7aa9522010-03-13 02:17:42 +00002379 Entries.push_back(std::make_pair(I->second.second, &*I));
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002380
Chris Lattnerb7aa9522010-03-13 02:17:42 +00002381 array_pod_sort(Entries.begin(), Entries.end());
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002382
Chris Lattnerb7aa9522010-03-13 02:17:42 +00002383 for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
Chris Lattner3d72a672010-03-09 23:38:23 +00002384 // Emit a label for reference from debug information entries.
Chris Lattnerb7aa9522010-03-13 02:17:42 +00002385 Asm->OutStreamer.EmitLabel(Entries[i].second->getValue().first);
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002386
Benjamin Kramer966ed1b2011-11-09 18:16:11 +00002387 // Emit the string itself with a terminating null byte.
Benjamin Kramer148db362011-11-09 12:12:04 +00002388 Asm->OutStreamer.EmitBytes(StringRef(Entries[i].second->getKeyData(),
Eric Christopherce0cfce2013-01-09 01:35:34 +00002389 Entries[i].second->getKeyLength()+1));
Bill Wendling480ff322009-05-20 23:21:38 +00002390 }
Eric Christopher2cbd5762013-01-07 19:32:41 +00002391
2392 // If we've got an offset section go ahead and emit that now as well.
2393 if (OffsetSection) {
2394 Asm->OutStreamer.SwitchSection(OffsetSection);
2395 unsigned offset = 0;
Eric Christopher962c9082013-01-15 23:56:56 +00002396 unsigned size = 4; // FIXME: DWARF64 is 8.
Eric Christopher2cbd5762013-01-07 19:32:41 +00002397 for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
Eric Christopherbf7bc492013-01-09 03:52:05 +00002398 Asm->OutStreamer.EmitIntValue(offset, size);
Eric Christopher2cbd5762013-01-07 19:32:41 +00002399 offset += Entries[i].second->getKeyLength() + 1;
2400 }
2401 }
Bill Wendling480ff322009-05-20 23:21:38 +00002402}
2403
Eric Christopher962c9082013-01-15 23:56:56 +00002404// Emit strings into a string section.
2405void DwarfUnits::emitAddresses(const MCSection *AddrSection) {
2406
2407 if (AddressPool.empty()) return;
2408
2409 // Start the dwarf addr section.
2410 Asm->OutStreamer.SwitchSection(AddrSection);
2411
David Blaikiece1960f2013-07-08 17:51:28 +00002412 // Order the address pool entries by ID
David Blaikieac569a62013-07-08 17:33:10 +00002413 SmallVector<const MCExpr *, 64> Entries(AddressPool.size());
Eric Christopher962c9082013-01-15 23:56:56 +00002414
David Blaikiece1960f2013-07-08 17:51:28 +00002415 for (DenseMap<const MCExpr *, unsigned>::iterator I = AddressPool.begin(),
2416 E = AddressPool.end();
Eric Christopher962c9082013-01-15 23:56:56 +00002417 I != E; ++I)
David Blaikieac569a62013-07-08 17:33:10 +00002418 Entries[I->second] = I->first;
Eric Christopher962c9082013-01-15 23:56:56 +00002419
2420 for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
Ulrich Weigand8b3d2262013-07-02 18:46:46 +00002421 // Emit an expression for reference from debug information entries.
David Blaikieac569a62013-07-08 17:33:10 +00002422 if (const MCExpr *Expr = Entries[i])
Ulrich Weigand8b3d2262013-07-02 18:46:46 +00002423 Asm->OutStreamer.EmitValue(Expr, Asm->getDataLayout().getPointerSize());
Eric Christopher962c9082013-01-15 23:56:56 +00002424 else
2425 Asm->OutStreamer.EmitIntValue(0, Asm->getDataLayout().getPointerSize());
2426 }
2427
2428}
2429
Eric Christopher3bf29fd2012-12-27 02:14:01 +00002430// Emit visible names into a debug str section.
2431void DwarfDebug::emitDebugStr() {
2432 DwarfUnits &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
2433 Holder.emitStrings(Asm->getObjFileLowering().getDwarfStrSection());
2434}
2435
Eric Christopher9046f942013-07-02 21:36:07 +00002436// Emit locations into the debug loc section.
Devang Patel930143b2009-11-21 02:48:08 +00002437void DwarfDebug::emitDebugLoc() {
Devang Patel6b9a9fe2010-05-26 23:55:23 +00002438 if (DotDebugLocEntries.empty())
2439 return;
2440
Eric Christopher4887c8f2013-03-29 23:34:06 +00002441 for (SmallVectorImpl<DotDebugLocEntry>::iterator
Devang Patel116a9d72011-02-04 22:57:18 +00002442 I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
2443 I != E; ++I) {
2444 DotDebugLocEntry &Entry = *I;
2445 if (I + 1 != DotDebugLocEntries.end())
2446 Entry.Merge(I+1);
2447 }
2448
Daniel Dunbarfd95b012011-03-16 22:16:39 +00002449 // Start the dwarf loc section.
Chris Lattner4b7dadb2009-08-19 05:49:37 +00002450 Asm->OutStreamer.SwitchSection(
Devang Patel9fc11702010-05-25 23:40:22 +00002451 Asm->getObjFileLowering().getDwarfLocSection());
Chandler Carruth5da3f052012-11-01 09:14:31 +00002452 unsigned char Size = Asm->getDataLayout().getPointerSize();
Devang Patel6b9a9fe2010-05-26 23:55:23 +00002453 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", 0));
2454 unsigned index = 1;
Eric Christopher4887c8f2013-03-29 23:34:06 +00002455 for (SmallVectorImpl<DotDebugLocEntry>::iterator
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002456 I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
Devang Patel30265c42010-07-07 20:12:52 +00002457 I != E; ++I, ++index) {
Devang Patel116a9d72011-02-04 22:57:18 +00002458 DotDebugLocEntry &Entry = *I;
2459 if (Entry.isMerged()) continue;
Devang Patel9fc11702010-05-25 23:40:22 +00002460 if (Entry.isEmpty()) {
Eric Christopherce0cfce2013-01-09 01:35:34 +00002461 Asm->OutStreamer.EmitIntValue(0, Size);
2462 Asm->OutStreamer.EmitIntValue(0, Size);
Devang Patel6b9a9fe2010-05-26 23:55:23 +00002463 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", index));
Devang Patel9fc11702010-05-25 23:40:22 +00002464 } else {
Eric Christopher25f06422013-07-03 22:40:18 +00002465 Asm->OutStreamer.EmitSymbolValue(Entry.getBeginSym(), Size);
2466 Asm->OutStreamer.EmitSymbolValue(Entry.getEndSym(), Size);
2467 DIVariable DV(Entry.getVariable());
Rafael Espindolad23bfb82011-05-27 22:05:41 +00002468 Asm->OutStreamer.AddComment("Loc expr size");
2469 MCSymbol *begin = Asm->OutStreamer.getContext().CreateTempSymbol();
2470 MCSymbol *end = Asm->OutStreamer.getContext().CreateTempSymbol();
2471 Asm->EmitLabelDifference(end, begin, 2);
2472 Asm->OutStreamer.EmitLabel(begin);
Devang Pateled9fd452011-07-08 16:49:43 +00002473 if (Entry.isInt()) {
Devang Patel324f8432011-06-01 22:03:25 +00002474 DIBasicType BTy(DV.getType());
2475 if (BTy.Verify() &&
Eric Christopher6a841382012-11-19 22:42:10 +00002476 (BTy.getEncoding() == dwarf::DW_ATE_signed
Devang Patel324f8432011-06-01 22:03:25 +00002477 || BTy.getEncoding() == dwarf::DW_ATE_signed_char)) {
2478 Asm->OutStreamer.AddComment("DW_OP_consts");
2479 Asm->EmitInt8(dwarf::DW_OP_consts);
Devang Pateled9fd452011-07-08 16:49:43 +00002480 Asm->EmitSLEB128(Entry.getInt());
Devang Patel324f8432011-06-01 22:03:25 +00002481 } else {
2482 Asm->OutStreamer.AddComment("DW_OP_constu");
2483 Asm->EmitInt8(dwarf::DW_OP_constu);
Devang Pateled9fd452011-07-08 16:49:43 +00002484 Asm->EmitULEB128(Entry.getInt());
Devang Patel324f8432011-06-01 22:03:25 +00002485 }
Devang Pateled9fd452011-07-08 16:49:43 +00002486 } else if (Entry.isLocation()) {
Eric Christopher614a89f2013-07-03 22:40:21 +00002487 MachineLocation Loc = Entry.getLoc();
Eric Christopher6a841382012-11-19 22:42:10 +00002488 if (!DV.hasComplexAddress())
Devang Pateled9fd452011-07-08 16:49:43 +00002489 // Regular entry.
Eric Christopher614a89f2013-07-03 22:40:21 +00002490 Asm->EmitDwarfRegOp(Loc, DV.isIndirect());
Devang Pateled9fd452011-07-08 16:49:43 +00002491 else {
2492 // Complex address entry.
2493 unsigned N = DV.getNumAddrElements();
2494 unsigned i = 0;
2495 if (N >= 2 && DV.getAddrElement(0) == DIBuilder::OpPlus) {
Eric Christopher614a89f2013-07-03 22:40:21 +00002496 if (Loc.getOffset()) {
Devang Pateled9fd452011-07-08 16:49:43 +00002497 i = 2;
Eric Christopher614a89f2013-07-03 22:40:21 +00002498 Asm->EmitDwarfRegOp(Loc, DV.isIndirect());
Devang Pateled9fd452011-07-08 16:49:43 +00002499 Asm->OutStreamer.AddComment("DW_OP_deref");
2500 Asm->EmitInt8(dwarf::DW_OP_deref);
2501 Asm->OutStreamer.AddComment("DW_OP_plus_uconst");
2502 Asm->EmitInt8(dwarf::DW_OP_plus_uconst);
2503 Asm->EmitSLEB128(DV.getAddrElement(1));
2504 } else {
2505 // If first address element is OpPlus then emit
2506 // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
Eric Christopher614a89f2013-07-03 22:40:21 +00002507 MachineLocation TLoc(Loc.getReg(), DV.getAddrElement(1));
2508 Asm->EmitDwarfRegOp(TLoc, DV.isIndirect());
Devang Pateled9fd452011-07-08 16:49:43 +00002509 i = 2;
2510 }
2511 } else {
Eric Christopher614a89f2013-07-03 22:40:21 +00002512 Asm->EmitDwarfRegOp(Loc, DV.isIndirect());
Devang Pateled9fd452011-07-08 16:49:43 +00002513 }
Eric Christopher6a841382012-11-19 22:42:10 +00002514
Devang Pateled9fd452011-07-08 16:49:43 +00002515 // Emit remaining complex address elements.
2516 for (; i < N; ++i) {
2517 uint64_t Element = DV.getAddrElement(i);
2518 if (Element == DIBuilder::OpPlus) {
2519 Asm->EmitInt8(dwarf::DW_OP_plus_uconst);
2520 Asm->EmitULEB128(DV.getAddrElement(++i));
Eric Christopher4d250522012-05-08 18:56:00 +00002521 } else if (Element == DIBuilder::OpDeref) {
Eric Christopher614a89f2013-07-03 22:40:21 +00002522 if (!Loc.isReg())
Eric Christopher4d250522012-05-08 18:56:00 +00002523 Asm->EmitInt8(dwarf::DW_OP_deref);
2524 } else
2525 llvm_unreachable("unknown Opcode found in complex address");
Devang Pateled9fd452011-07-08 16:49:43 +00002526 }
Devang Patel3e021532011-04-28 02:22:40 +00002527 }
Devang Patel3e021532011-04-28 02:22:40 +00002528 }
Devang Pateled9fd452011-07-08 16:49:43 +00002529 // else ... ignore constant fp. There is not any good way to
2530 // to represent them here in dwarf.
Rafael Espindolad23bfb82011-05-27 22:05:41 +00002531 Asm->OutStreamer.EmitLabel(end);
Devang Patel9fc11702010-05-25 23:40:22 +00002532 }
2533 }
Bill Wendling480ff322009-05-20 23:21:38 +00002534}
2535
Eric Christopheracdcbdb2012-11-27 22:43:45 +00002536// Emit visible names into a debug aranges section.
Eric Christopher7b30f2e42012-11-21 00:34:35 +00002537void DwarfDebug::emitDebugARanges() {
Bill Wendling480ff322009-05-20 23:21:38 +00002538 // Start the dwarf aranges section.
Eric Christopherac8199b2013-08-30 00:39:57 +00002539 Asm->OutStreamer
2540 .SwitchSection(Asm->getObjFileLowering().getDwarfARangesSection());
Bill Wendling480ff322009-05-20 23:21:38 +00002541}
2542
Eric Christopheracdcbdb2012-11-27 22:43:45 +00002543// Emit visible names into a debug ranges section.
Devang Patel930143b2009-11-21 02:48:08 +00002544void DwarfDebug::emitDebugRanges() {
Bill Wendling480ff322009-05-20 23:21:38 +00002545 // Start the dwarf ranges section.
Eric Christopherac8199b2013-08-30 00:39:57 +00002546 Asm->OutStreamer
2547 .SwitchSection(Asm->getObjFileLowering().getDwarfRangesSection());
Chandler Carruth5da3f052012-11-01 09:14:31 +00002548 unsigned char Size = Asm->getDataLayout().getPointerSize();
Eric Christopher4887c8f2013-03-29 23:34:06 +00002549 for (SmallVectorImpl<const MCSymbol *>::iterator
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002550 I = DebugRangeSymbols.begin(), E = DebugRangeSymbols.end();
Devang Patel6c74a872010-04-27 19:46:33 +00002551 I != E; ++I) {
2552 if (*I)
Eric Christopherbf7bc492013-01-09 03:52:05 +00002553 Asm->OutStreamer.EmitSymbolValue(const_cast<MCSymbol*>(*I), Size);
Devang Patel12563b32010-04-16 23:33:45 +00002554 else
Eric Christopherce0cfce2013-01-09 01:35:34 +00002555 Asm->OutStreamer.EmitIntValue(0, Size);
Devang Patel12563b32010-04-16 23:33:45 +00002556 }
Bill Wendling480ff322009-05-20 23:21:38 +00002557}
2558
Eric Christopheracdcbdb2012-11-27 22:43:45 +00002559// Emit visible names into a debug macinfo section.
Devang Patel930143b2009-11-21 02:48:08 +00002560void DwarfDebug::emitDebugMacInfo() {
Daniel Dunbarc418d6b2009-09-19 20:40:05 +00002561 if (const MCSection *LineInfo =
Chris Lattner1472cf52009-08-02 07:24:22 +00002562 Asm->getObjFileLowering().getDwarfMacroInfoSection()) {
Bill Wendling480ff322009-05-20 23:21:38 +00002563 // Start the dwarf macinfo section.
Chris Lattner4b7dadb2009-08-19 05:49:37 +00002564 Asm->OutStreamer.SwitchSection(LineInfo);
Bill Wendling480ff322009-05-20 23:21:38 +00002565 }
2566}
2567
Eric Christopherd692c1d2012-12-11 19:42:09 +00002568// DWARF5 Experimental Separate Dwarf emitters.
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002569
2570// This DIE has the following attributes: DW_AT_comp_dir, DW_AT_stmt_list,
2571// DW_AT_low_pc, DW_AT_high_pc, DW_AT_ranges, DW_AT_dwo_name, DW_AT_dwo_id,
2572// DW_AT_ranges_base, DW_AT_addr_base. If DW_AT_ranges is present,
2573// DW_AT_low_pc and DW_AT_high_pc are not used, and vice versa.
Eric Christopher6fdf3242013-08-26 23:50:43 +00002574CompileUnit *DwarfDebug::constructSkeletonCU(const CompileUnit *CU) {
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002575
2576 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
Eric Christopher6fdf3242013-08-26 23:50:43 +00002577 CompileUnit *NewCU = new CompileUnit(CU->getUniqueID(), Die, CU->getNode(),
2578 Asm, this, &SkeletonHolder);
Eric Christopher4c7765f2013-01-17 03:00:04 +00002579
Eric Christopherdae389b2013-02-22 23:50:08 +00002580 NewCU->addLocalString(Die, dwarf::DW_AT_GNU_dwo_name,
Eric Christopher6b16b432013-08-26 23:57:03 +00002581 DICompileUnit(CU->getNode()).getSplitDebugFilename());
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002582
Eric Christopher44c6aa62013-04-22 07:51:08 +00002583 // Relocate to the beginning of the addr_base section, else 0 for the
2584 // beginning of the one for this compile unit.
Eric Christopher55863be2013-04-07 03:43:09 +00002585 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
2586 NewCU->addLabel(Die, dwarf::DW_AT_GNU_addr_base, dwarf::DW_FORM_sec_offset,
2587 DwarfAddrSectionSym);
2588 else
Eric Christopher44c6aa62013-04-22 07:51:08 +00002589 NewCU->addUInt(Die, dwarf::DW_AT_GNU_addr_base,
2590 dwarf::DW_FORM_sec_offset, 0);
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002591
2592 // 2.17.1 requires that we use DW_AT_low_pc for a single entry point
Eric Christopher962c9082013-01-15 23:56:56 +00002593 // into an entity. We're using 0, or a NULL label for this.
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002594 NewCU->addUInt(Die, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, 0);
Eric Christopher962c9082013-01-15 23:56:56 +00002595
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002596 // DW_AT_stmt_list is a offset of line number information for this
2597 // compile unit in debug_line section.
Eric Christopher55863be2013-04-07 03:43:09 +00002598 // FIXME: Should handle multiple compile units.
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002599 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
Eric Christopher4c7765f2013-01-17 03:00:04 +00002600 NewCU->addLabel(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_sec_offset,
Eric Christopher74804332013-02-07 21:19:50 +00002601 DwarfLineSectionSym);
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002602 else
Eric Christopher4c7765f2013-01-17 03:00:04 +00002603 NewCU->addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_sec_offset, 0);
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002604
2605 if (!CompilationDir.empty())
Eric Christopher2cbd5762013-01-07 19:32:41 +00002606 NewCU->addLocalString(Die, dwarf::DW_AT_comp_dir, CompilationDir);
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002607
Eric Christopherc8a310e2012-12-10 23:34:43 +00002608 SkeletonHolder.addUnit(NewCU);
Eric Christopher5b33b3c2013-02-06 21:53:56 +00002609 SkeletonCUs.push_back(NewCU);
Eric Christopherc8a310e2012-12-10 23:34:43 +00002610
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002611 return NewCU;
2612}
2613
Eric Christopher3c5a1912012-12-19 22:02:53 +00002614void DwarfDebug::emitSkeletonAbbrevs(const MCSection *Section) {
2615 assert(useSplitDwarf() && "No split dwarf debug info?");
2616 emitAbbrevs(Section, &SkeletonAbbrevs);
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002617}
2618
Eric Christopherd692c1d2012-12-11 19:42:09 +00002619// Emit the .debug_info.dwo section for separated dwarf. This contains the
2620// compile units that would normally be in debug_info.
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002621void DwarfDebug::emitDebugInfoDWO() {
Eric Christophercdf218d2012-12-10 19:51:21 +00002622 assert(useSplitDwarf() && "No split dwarf debug info?");
Eric Christophera2de8262012-12-15 00:04:07 +00002623 InfoHolder.emitUnits(this, Asm->getObjFileLowering().getDwarfInfoDWOSection(),
Eric Christopher3c5a1912012-12-19 22:02:53 +00002624 Asm->getObjFileLowering().getDwarfAbbrevDWOSection(),
2625 DwarfAbbrevDWOSectionSym);
2626}
2627
2628// Emit the .debug_abbrev.dwo section for separated dwarf. This contains the
2629// abbreviations for the .debug_info.dwo section.
2630void DwarfDebug::emitDebugAbbrevDWO() {
2631 assert(useSplitDwarf() && "No split dwarf?");
Eric Christopher48fef592012-12-20 21:58:40 +00002632 emitAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevDWOSection(),
2633 &Abbreviations);
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002634}
Eric Christopher3bf29fd2012-12-27 02:14:01 +00002635
2636// Emit the .debug_str.dwo section for separated dwarf. This contains the
2637// string section and is identical in format to traditional .debug_str
2638// sections.
2639void DwarfDebug::emitDebugStrDWO() {
2640 assert(useSplitDwarf() && "No split dwarf?");
Eric Christopherb800ff72013-01-07 22:40:45 +00002641 const MCSection *OffSec = Asm->getObjFileLowering()
2642 .getDwarfStrOffDWOSection();
Eric Christopher2cbd5762013-01-07 19:32:41 +00002643 const MCSymbol *StrSym = DwarfStrSectionSym;
2644 InfoHolder.emitStrings(Asm->getObjFileLowering().getDwarfStrDWOSection(),
2645 OffSec, StrSym);
Eric Christopher3bf29fd2012-12-27 02:14:01 +00002646}
Manman Ren60352032013-09-05 18:48:31 +00002647
Manman Ren856191b2013-09-09 19:03:51 +00002648/// Find the MDNode for the given scope reference.
2649DIScope DwarfDebug::resolve(DIScopeRef SRef) const {
2650 return SRef.resolve(TypeIdentifierMap);
Manman Ren60352032013-09-05 18:48:31 +00002651}
Manman Ren33796c52013-09-09 19:23:58 +00002652
2653// If the current node has a parent scope then return that,
2654// else return an empty scope.
2655DIScope DwarfDebug::getScopeContext(DIScope S) const {
2656
2657 if (S.isType())
Manman Ren116868e2013-09-09 19:47:11 +00002658 return resolve(DIType(S).getContext());
Manman Ren33796c52013-09-09 19:23:58 +00002659
2660 if (S.isSubprogram())
2661 return DISubprogram(S).getContext();
2662
2663 if (S.isLexicalBlock())
2664 return DILexicalBlock(S).getContext();
2665
2666 if (S.isLexicalBlockFile())
2667 return DILexicalBlockFile(S).getContext();
2668
2669 if (S.isNameSpace())
2670 return DINameSpace(S).getContext();
2671
2672 assert((S.isFile() || S.isCompileUnit()) && "Unhandled type of scope.");
2673 return DIScope();
2674}