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