blob: 6f6a7de5daa37d440a323d4d4d4daeb8a4dab169 [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
Manman Ren2312ed32013-09-10 18:40:41 +0000427bool DwarfDebug::isLexicalScopeDIENull(LexicalScope *Scope) {
428 if (Scope->isAbstractScope())
429 return false;
430
431 const SmallVectorImpl<InsnRange> &Ranges = Scope->getRanges();
432 if (Ranges.empty())
433 return true;
434
435 if (Ranges.size() > 1)
436 return false;
437
438 SmallVectorImpl<InsnRange>::const_iterator RI = Ranges.begin();
439 MCSymbol *End = getLabelAfterInsn(RI->second);
440 return !End;
441}
442
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000443// Construct new DW_TAG_lexical_block for this scope and attach
444// DW_AT_low_pc/DW_AT_high_pc labels.
Eric Christopher6a841382012-11-19 22:42:10 +0000445DIE *DwarfDebug::constructLexicalScopeDIE(CompileUnit *TheCU,
Devang Pateld2dfc5e2011-08-15 22:24:32 +0000446 LexicalScope *Scope) {
Manman Ren2312ed32013-09-10 18:40:41 +0000447 if (isLexicalScopeDIENull(Scope))
448 return 0;
449
Devang Patel6c74a872010-04-27 19:46:33 +0000450 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_lexical_block);
451 if (Scope->isAbstractScope())
452 return ScopeDIE;
453
Craig Topper977e9cd2013-07-03 04:24:43 +0000454 const SmallVectorImpl<InsnRange> &Ranges = Scope->getRanges();
Eric Christopherdc42ea82013-07-03 01:57:28 +0000455 // If we have multiple ranges, emit them into the range section.
Devang Patel6c74a872010-04-27 19:46:33 +0000456 if (Ranges.size() > 1) {
457 // .debug_range section has not been laid out yet. Emit offset in
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000458 // .debug_range as a uint, size 4, for now. emitDIE will handle
Devang Patel6c74a872010-04-27 19:46:33 +0000459 // DW_AT_ranges appropriately.
Devang Patelf20c4f72011-04-12 22:53:02 +0000460 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_ranges, dwarf::DW_FORM_data4,
Eric Christopher6a841382012-11-19 22:42:10 +0000461 DebugRangeSymbols.size()
Chandler Carruth5da3f052012-11-01 09:14:31 +0000462 * Asm->getDataLayout().getPointerSize());
Craig Topperd8e43652013-07-03 04:17:25 +0000463 for (SmallVectorImpl<InsnRange>::const_iterator RI = Ranges.begin(),
Devang Patel6c74a872010-04-27 19:46:33 +0000464 RE = Ranges.end(); RI != RE; ++RI) {
Devang Patel9fc11702010-05-25 23:40:22 +0000465 DebugRangeSymbols.push_back(getLabelBeforeInsn(RI->first));
466 DebugRangeSymbols.push_back(getLabelAfterInsn(RI->second));
Devang Patel6c74a872010-04-27 19:46:33 +0000467 }
Eric Christopherc1110832013-07-03 01:22:29 +0000468
469 // Terminate the range list.
Devang Patel6c74a872010-04-27 19:46:33 +0000470 DebugRangeSymbols.push_back(NULL);
471 DebugRangeSymbols.push_back(NULL);
472 return ScopeDIE;
473 }
474
Eric Christopherdc42ea82013-07-03 01:57:28 +0000475 // Construct the address range for this DIE.
Craig Topperd8e43652013-07-03 04:17:25 +0000476 SmallVectorImpl<InsnRange>::const_iterator RI = Ranges.begin();
Eric Christopher962c9082013-01-15 23:56:56 +0000477 MCSymbol *Start = getLabelBeforeInsn(RI->first);
478 MCSymbol *End = getLabelAfterInsn(RI->second);
Manman Ren2312ed32013-09-10 18:40:41 +0000479 assert(End && "End label should not be null!");
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000480
Chris Lattnere13c3722010-03-09 01:58:53 +0000481 assert(Start->isDefined() && "Invalid starting label for an inlined scope!");
482 assert(End->isDefined() && "Invalid end label for an inlined scope!");
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000483
Eric Christopher962c9082013-01-15 23:56:56 +0000484 TheCU->addLabelAddress(ScopeDIE, dwarf::DW_AT_low_pc, Start);
485 TheCU->addLabelAddress(ScopeDIE, dwarf::DW_AT_high_pc, End);
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000486
487 return ScopeDIE;
488}
489
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000490// This scope represents inlined body of a function. Construct DIE to
491// represent this concrete inlined copy of the function.
Devang Pateld2dfc5e2011-08-15 22:24:32 +0000492DIE *DwarfDebug::constructInlinedScopeDIE(CompileUnit *TheCU,
493 LexicalScope *Scope) {
Craig Topper977e9cd2013-07-03 04:24:43 +0000494 const SmallVectorImpl<InsnRange> &Ranges = Scope->getRanges();
Nick Lewycky654f5ce2011-10-26 22:55:33 +0000495 assert(Ranges.empty() == false &&
496 "LexicalScope does not have instruction markers!");
Devang Patel6c74a872010-04-27 19:46:33 +0000497
Devang Patelf098ce22011-07-27 00:34:13 +0000498 if (!Scope->getScopeNode())
499 return NULL;
500 DIScope DS(Scope->getScopeNode());
501 DISubprogram InlinedSP = getDISubprogram(DS);
Manman Ren4213c392013-05-29 17:16:59 +0000502 DIE *OriginDIE = TheCU->getDIE(InlinedSP);
Devang Patelf098ce22011-07-27 00:34:13 +0000503 if (!OriginDIE) {
Bill Wendling10e0e2e2012-10-30 17:51:02 +0000504 DEBUG(dbgs() << "Unable to find original DIE for an inlined subprogram.");
Devang Patelf098ce22011-07-27 00:34:13 +0000505 return NULL;
506 }
507
Devang Patel73bc1722011-05-05 17:54:26 +0000508 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_inlined_subroutine);
Devang Patelf20c4f72011-04-12 22:53:02 +0000509 TheCU->addDIEEntry(ScopeDIE, dwarf::DW_AT_abstract_origin,
Manman Ren4213c392013-05-29 17:16:59 +0000510 dwarf::DW_FORM_ref4, OriginDIE);
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000511
Devang Patelf098ce22011-07-27 00:34:13 +0000512 if (Ranges.size() > 1) {
513 // .debug_range section has not been laid out yet. Emit offset in
514 // .debug_range as a uint, size 4, for now. emitDIE will handle
515 // DW_AT_ranges appropriately.
516 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_ranges, dwarf::DW_FORM_data4,
Eric Christopher6a841382012-11-19 22:42:10 +0000517 DebugRangeSymbols.size()
Chandler Carruth5da3f052012-11-01 09:14:31 +0000518 * Asm->getDataLayout().getPointerSize());
Craig Topperd8e43652013-07-03 04:17:25 +0000519 for (SmallVectorImpl<InsnRange>::const_iterator RI = Ranges.begin(),
Devang Patelf098ce22011-07-27 00:34:13 +0000520 RE = Ranges.end(); RI != RE; ++RI) {
521 DebugRangeSymbols.push_back(getLabelBeforeInsn(RI->first));
522 DebugRangeSymbols.push_back(getLabelAfterInsn(RI->second));
523 }
524 DebugRangeSymbols.push_back(NULL);
525 DebugRangeSymbols.push_back(NULL);
526 } else {
Craig Topperd8e43652013-07-03 04:17:25 +0000527 SmallVectorImpl<InsnRange>::const_iterator RI = Ranges.begin();
Eric Christopherf94eb2b2013-07-03 02:23:53 +0000528 MCSymbol *StartLabel = getLabelBeforeInsn(RI->first);
529 MCSymbol *EndLabel = getLabelAfterInsn(RI->second);
530
531 if (StartLabel == 0 || EndLabel == 0)
532 llvm_unreachable("Unexpected Start and End labels for an inlined scope!");
533
534 assert(StartLabel->isDefined() &&
535 "Invalid starting label for an inlined scope!");
536 assert(EndLabel->isDefined() && "Invalid end label for an inlined scope!");
537
Eric Christopher962c9082013-01-15 23:56:56 +0000538 TheCU->addLabelAddress(ScopeDIE, dwarf::DW_AT_low_pc, StartLabel);
539 TheCU->addLabelAddress(ScopeDIE, dwarf::DW_AT_high_pc, EndLabel);
Devang Patelf098ce22011-07-27 00:34:13 +0000540 }
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000541
542 InlinedSubprogramDIEs.insert(OriginDIE);
543
Eric Christopherf94eb2b2013-07-03 02:23:53 +0000544 // Add the call site information to the DIE.
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000545 DILocation DL(Scope->getInlinedAt());
Eric Christopher0925c622012-03-26 21:38:38 +0000546 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_call_file, 0,
Manman Ren1e427202013-03-07 01:42:00 +0000547 getOrCreateSourceID(DL.getFilename(), DL.getDirectory(),
548 TheCU->getUniqueID()));
Devang Patelf20c4f72011-04-12 22:53:02 +0000549 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_call_line, 0, DL.getLineNumber());
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000550
Eric Christopher8dda5d02011-12-04 06:02:38 +0000551 // Add name to the name table, we do this here because we're guaranteed
552 // to have concrete versions of our DW_TAG_inlined_subprogram nodes.
553 addSubprogramNames(TheCU, InlinedSP, ScopeDIE);
Eric Christopher6a841382012-11-19 22:42:10 +0000554
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000555 return ScopeDIE;
556}
557
Manman Ren2312ed32013-09-10 18:40:41 +0000558DIE *DwarfDebug::createScopeChildrenDIE(CompileUnit *TheCU, LexicalScope *Scope,
559 SmallVectorImpl<DIE*> &Children) {
560 DIE *ObjectPointer = NULL;
Devang Patel6c622ef2011-03-01 22:58:55 +0000561
562 // Collect arguments for current function.
Devang Patel7e623022011-08-10 20:55:27 +0000563 if (LScopes.isCurrentFunctionScope(Scope))
Devang Patel6c622ef2011-03-01 22:58:55 +0000564 for (unsigned i = 0, N = CurrentFnArguments.size(); i < N; ++i)
565 if (DbgVariable *ArgDV = CurrentFnArguments[i])
Eric Christopher6a841382012-11-19 22:42:10 +0000566 if (DIE *Arg =
Eric Christophere3417762012-09-12 23:36:19 +0000567 TheCU->constructVariableDIE(ArgDV, Scope->isAbstractScope())) {
Devang Patel6c622ef2011-03-01 22:58:55 +0000568 Children.push_back(Arg);
Eric Christophere3417762012-09-12 23:36:19 +0000569 if (ArgDV->isObjectPointer()) ObjectPointer = Arg;
570 }
Devang Patel6c622ef2011-03-01 22:58:55 +0000571
Eric Christopherf84354b2011-10-03 15:49:16 +0000572 // Collect lexical scope children first.
Craig Topper977e9cd2013-07-03 04:24:43 +0000573 const SmallVectorImpl<DbgVariable *> &Variables =ScopeVariables.lookup(Scope);
Devang Patel5f1b4cd2011-02-19 01:31:27 +0000574 for (unsigned i = 0, N = Variables.size(); i < N; ++i)
Eric Christopher6a841382012-11-19 22:42:10 +0000575 if (DIE *Variable =
Eric Christopherc1c8a1b2012-09-21 22:18:52 +0000576 TheCU->constructVariableDIE(Variables[i], Scope->isAbstractScope())) {
Devang Patel5f1b4cd2011-02-19 01:31:27 +0000577 Children.push_back(Variable);
Eric Christopherc1c8a1b2012-09-21 22:18:52 +0000578 if (Variables[i]->isObjectPointer()) ObjectPointer = Variable;
579 }
Craig Topper977e9cd2013-07-03 04:24:43 +0000580 const SmallVectorImpl<LexicalScope *> &Scopes = Scope->getChildren();
Devang Patel5f1b4cd2011-02-19 01:31:27 +0000581 for (unsigned j = 0, M = Scopes.size(); j < M; ++j)
Devang Patel3acc70e2011-08-15 22:04:40 +0000582 if (DIE *Nested = constructScopeDIE(TheCU, Scopes[j]))
Devang Patel5f1b4cd2011-02-19 01:31:27 +0000583 Children.push_back(Nested);
Manman Ren2312ed32013-09-10 18:40:41 +0000584 return ObjectPointer;
585}
586
587// Construct a DIE for this scope.
588DIE *DwarfDebug::constructScopeDIE(CompileUnit *TheCU, LexicalScope *Scope) {
589 if (!Scope || !Scope->getScopeNode())
590 return NULL;
591
592 DIScope DS(Scope->getScopeNode());
593
594 SmallVector<DIE *, 8> Children;
595 DIE *ObjectPointer = NULL;
596 bool ChildrenCreated = false;
597
Devang Patel3b548aa2010-03-08 20:52:55 +0000598 DIE *ScopeDIE = NULL;
599 if (Scope->getInlinedAt())
Devang Pateld2dfc5e2011-08-15 22:24:32 +0000600 ScopeDIE = constructInlinedScopeDIE(TheCU, Scope);
Devang Patel3b548aa2010-03-08 20:52:55 +0000601 else if (DS.isSubprogram()) {
Devang Pateld10b2af2010-06-28 20:53:04 +0000602 ProcessedSPNodes.insert(DS);
Devang Patela37a95e2010-07-07 22:20:57 +0000603 if (Scope->isAbstractScope()) {
Manman Ren4213c392013-05-29 17:16:59 +0000604 ScopeDIE = TheCU->getDIE(DS);
Devang Patela37a95e2010-07-07 22:20:57 +0000605 // Note down abstract DIE.
606 if (ScopeDIE)
607 AbstractSPDies.insert(std::make_pair(DS, ScopeDIE));
608 }
Devang Patel3b548aa2010-03-08 20:52:55 +0000609 else
Devang Pateld2dfc5e2011-08-15 22:24:32 +0000610 ScopeDIE = updateSubprogramScopeDIE(TheCU, DS);
Devang Patel3b548aa2010-03-08 20:52:55 +0000611 }
Devang Patel5f1b4cd2011-02-19 01:31:27 +0000612 else {
Manman Ren2312ed32013-09-10 18:40:41 +0000613 if (isLexicalScopeDIENull(Scope))
614 return NULL;
615 // We create children only when we know the scope DIE is not going to be
616 // null.
617 ObjectPointer = createScopeChildrenDIE(TheCU, Scope, Children);
618 ChildrenCreated = true;
Devang Patel5f1b4cd2011-02-19 01:31:27 +0000619 // There is no need to emit empty lexical block DIE.
David Blaikie684fc532013-05-06 23:33:07 +0000620 std::pair<ImportedEntityMap::const_iterator,
621 ImportedEntityMap::const_iterator> Range = std::equal_range(
622 ScopesWithImportedEntities.begin(), ScopesWithImportedEntities.end(),
Timur Iskhodzhanovec4afe62013-05-07 07:47:47 +0000623 std::pair<const MDNode *, const MDNode *>(DS, (const MDNode*)0),
Benjamin Kramerb12cf012013-08-24 12:54:27 +0000624 less_first());
David Blaikie684fc532013-05-06 23:33:07 +0000625 if (Children.empty() && Range.first == Range.second)
Devang Patel5f1b4cd2011-02-19 01:31:27 +0000626 return NULL;
Devang Pateld2dfc5e2011-08-15 22:24:32 +0000627 ScopeDIE = constructLexicalScopeDIE(TheCU, Scope);
Manman Ren2312ed32013-09-10 18:40:41 +0000628 assert(ScopeDIE && "Scope DIE should not be null.");
Eric Christopher5fdd68e2013-06-24 23:20:02 +0000629 for (ImportedEntityMap::const_iterator i = Range.first; i != Range.second;
630 ++i)
David Blaikie4dd2de72013-05-08 06:01:38 +0000631 constructImportedEntityDIE(TheCU, i->second, ScopeDIE);
Devang Patel5f1b4cd2011-02-19 01:31:27 +0000632 }
Eric Christopher6a841382012-11-19 22:42:10 +0000633
Benjamin Kramer892daba2013-08-24 11:55:49 +0000634 if (!ScopeDIE) {
Manman Ren2312ed32013-09-10 18:40:41 +0000635 assert(Children.empty() &&
636 "We create children only when the scope DIE is not null.");
Benjamin Kramer892daba2013-08-24 11:55:49 +0000637 return NULL;
638 }
Manman Ren2312ed32013-09-10 18:40:41 +0000639 if (!ChildrenCreated)
640 ObjectPointer = createScopeChildrenDIE(TheCU, Scope, Children);
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000641
Devang Patel5f1b4cd2011-02-19 01:31:27 +0000642 // Add children
Craig Topperd8e43652013-07-03 04:17:25 +0000643 for (SmallVectorImpl<DIE *>::iterator I = Children.begin(),
Devang Patel5f1b4cd2011-02-19 01:31:27 +0000644 E = Children.end(); I != E; ++I)
645 ScopeDIE->addChild(*I);
Devang Patel04d2f2d2009-11-24 01:14:22 +0000646
Eric Christophere3417762012-09-12 23:36:19 +0000647 if (DS.isSubprogram() && ObjectPointer != NULL)
648 TheCU->addDIEEntry(ScopeDIE, dwarf::DW_AT_object_pointer,
649 dwarf::DW_FORM_ref4, ObjectPointer);
650
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000651 if (DS.isSubprogram())
Eric Christopherd9843b32011-11-10 19:25:34 +0000652 TheCU->addPubTypes(DISubprogram(DS));
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000653
Eric Christopherd9843b32011-11-10 19:25:34 +0000654 return ScopeDIE;
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000655}
656
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000657// Look up the source id with the given directory and source file names.
658// If none currently exists, create a new id and insert it in the
659// SourceIds map. This can update DirectoryNames and SourceFileNames maps
660// as well.
Eric Christopher7b30f2e42012-11-21 00:34:35 +0000661unsigned DwarfDebug::getOrCreateSourceID(StringRef FileName,
Manman Ren1e427202013-03-07 01:42:00 +0000662 StringRef DirName, unsigned CUID) {
663 // If we use .loc in assembly, we can't separate .file entries according to
664 // compile units. Thus all files will belong to the default compile unit.
665 if (Asm->TM.hasMCUseLoc() &&
666 Asm->OutStreamer.getKind() == MCStreamer::SK_AsmStreamer)
667 CUID = 0;
668
Devang Patel871d0b12010-09-16 20:57:49 +0000669 // If FE did not provide a file name, then assume stdin.
670 if (FileName.empty())
Manman Ren1e427202013-03-07 01:42:00 +0000671 return getOrCreateSourceID("<stdin>", StringRef(), CUID);
Devang Patele01b75c2011-03-24 20:30:50 +0000672
Nick Lewyckyd1ee7f82011-11-02 20:55:33 +0000673 // TODO: this might not belong here. See if we can factor this better.
674 if (DirName == CompilationDir)
675 DirName = "";
676
Manman Ren1e427202013-03-07 01:42:00 +0000677 // FileIDCUMap stores the current ID for the given compile unit.
678 unsigned SrcId = FileIDCUMap[CUID] + 1;
Devang Patel871d0b12010-09-16 20:57:49 +0000679
Manman Ren1e427202013-03-07 01:42:00 +0000680 // We look up the CUID/file/dir by concatenating them with a zero byte.
Benjamin Kramer71b19732012-03-11 14:56:26 +0000681 SmallString<128> NamePair;
Manman Ren5b22f9f2013-04-06 01:02:38 +0000682 NamePair += utostr(CUID);
Manman Ren1e427202013-03-07 01:42:00 +0000683 NamePair += '\0';
Benjamin Kramer71b19732012-03-11 14:56:26 +0000684 NamePair += DirName;
685 NamePair += '\0'; // Zero bytes are not allowed in paths.
686 NamePair += FileName;
687
688 StringMapEntry<unsigned> &Ent = SourceIdMap.GetOrCreateValue(NamePair, SrcId);
689 if (Ent.getValue() != SrcId)
690 return Ent.getValue();
Bill Wendling2b128d72009-05-20 23:19:06 +0000691
Manman Ren1e427202013-03-07 01:42:00 +0000692 FileIDCUMap[CUID] = SrcId;
Rafael Espindola67c6ab82010-11-18 02:04:25 +0000693 // Print out a .file directive to specify files for .loc directives.
Manman Ren1e427202013-03-07 01:42:00 +0000694 Asm->OutStreamer.EmitDwarfFileDirective(SrcId, DirName, FileName, CUID);
Bill Wendling2b128d72009-05-20 23:19:06 +0000695
696 return SrcId;
697}
698
Eric Christopher48fef592012-12-20 21:58:40 +0000699// Create new CompileUnit for the given metadata node with tag
700// DW_TAG_compile_unit.
Devang Pateleb1bb4e2011-08-16 22:09:43 +0000701CompileUnit *DwarfDebug::constructCompileUnit(const MDNode *N) {
Devang Patel80ae3492009-08-28 23:24:31 +0000702 DICompileUnit DIUnit(N);
Devang Patel2d9caf92009-11-25 17:36:49 +0000703 StringRef FN = DIUnit.getFilename();
Nick Lewyckyd1ee7f82011-11-02 20:55:33 +0000704 CompilationDir = DIUnit.getDirectory();
Bill Wendling2b128d72009-05-20 23:19:06 +0000705
706 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
Eric Christopherbfceb2f2013-08-26 23:50:38 +0000707 CompileUnit *NewCU =
708 new CompileUnit(GlobalCUIndexCount++, Die, N, Asm, this, &InfoHolder);
Manman Ren1e427202013-03-07 01:42:00 +0000709
710 FileIDCUMap[NewCU->getUniqueID()] = 0;
711 // Call this to emit a .file directive if it wasn't emitted for the source
712 // file this CU comes from yet.
713 getOrCreateSourceID(FN, CompilationDir, NewCU->getUniqueID());
714
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +0000715 NewCU->addString(Die, dwarf::DW_AT_producer, DIUnit.getProducer());
Devang Patelf20c4f72011-04-12 22:53:02 +0000716 NewCU->addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data2,
717 DIUnit.getLanguage());
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +0000718 NewCU->addString(Die, dwarf::DW_AT_name, FN);
Eric Christopher52ce7182013-04-09 19:23:15 +0000719
Eric Christopherb1b94512012-08-01 18:19:01 +0000720 // 2.17.1 requires that we use DW_AT_low_pc for a single entry point
Eric Christopher52ce7182013-04-09 19:23:15 +0000721 // into an entity. We're using 0 (or a NULL label) for this. For
722 // split dwarf it's in the skeleton CU so omit it here.
723 if (!useSplitDwarf())
724 NewCU->addLabelAddress(Die, dwarf::DW_AT_low_pc, NULL);
Manman Ren4e042a62013-02-05 21:52:47 +0000725
726 // Define start line table label for each Compile Unit.
727 MCSymbol *LineTableStartSym = Asm->GetTempSymbol("line_table_start",
728 NewCU->getUniqueID());
729 Asm->OutStreamer.getContext().setMCLineTableSymbol(LineTableStartSym,
730 NewCU->getUniqueID());
731
Manman Ren9d4c7352013-05-21 00:57:22 +0000732 // Use a single line table if we are using .loc and generating assembly.
733 bool UseTheFirstCU =
734 (Asm->TM.hasMCUseLoc() &&
735 Asm->OutStreamer.getKind() == MCStreamer::SK_AsmStreamer) ||
736 (NewCU->getUniqueID() == 0);
737
Devang Pateld22ed622010-03-22 23:11:36 +0000738 // DW_AT_stmt_list is a offset of line number information for this
Eric Christopher52ce7182013-04-09 19:23:15 +0000739 // compile unit in debug_line section. For split dwarf this is
740 // left in the skeleton CU and so not included.
Manman Rend2c95eb2013-02-09 00:41:44 +0000741 // The line table entries are not always emitted in assembly, so it
742 // is not okay to use line_table_start here.
Eric Christopher52ce7182013-04-09 19:23:15 +0000743 if (!useSplitDwarf()) {
744 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
Carlo Kokbac096a2013-08-13 17:46:57 +0000745 NewCU->addLabel(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_sec_offset,
Manman Ren9d4c7352013-05-21 00:57:22 +0000746 UseTheFirstCU ?
Eric Christopher52ce7182013-04-09 19:23:15 +0000747 Asm->GetTempSymbol("section_line") : LineTableStartSym);
Manman Ren9d4c7352013-05-21 00:57:22 +0000748 else if (UseTheFirstCU)
Eric Christopher52ce7182013-04-09 19:23:15 +0000749 NewCU->addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4, 0);
750 else
751 NewCU->addDelta(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4,
752 LineTableStartSym, DwarfLineSectionSym);
753 }
Bill Wendling2b128d72009-05-20 23:19:06 +0000754
Eric Christopher52ce7182013-04-09 19:23:15 +0000755 // If we're using split dwarf the compilation dir is going to be in the
756 // skeleton CU and so we don't need to duplicate it here.
757 if (!useSplitDwarf() && !CompilationDir.empty())
Nick Lewyckyd1ee7f82011-11-02 20:55:33 +0000758 NewCU->addString(Die, dwarf::DW_AT_comp_dir, CompilationDir);
Bill Wendling2b128d72009-05-20 23:19:06 +0000759 if (DIUnit.isOptimized())
Eric Christopherbb69a272012-08-24 01:14:27 +0000760 NewCU->addFlag(Die, dwarf::DW_AT_APPLE_optimized);
Bill Wendling2b128d72009-05-20 23:19:06 +0000761
Devang Patel2d9caf92009-11-25 17:36:49 +0000762 StringRef Flags = DIUnit.getFlags();
763 if (!Flags.empty())
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +0000764 NewCU->addString(Die, dwarf::DW_AT_APPLE_flags, Flags);
Eric Christopher6a841382012-11-19 22:42:10 +0000765
Nick Lewycky479a8fe2011-10-17 23:27:36 +0000766 if (unsigned RVer = DIUnit.getRunTimeVersion())
Devang Patelf20c4f72011-04-12 22:53:02 +0000767 NewCU->addUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers,
Bill Wendling2b128d72009-05-20 23:19:06 +0000768 dwarf::DW_FORM_data1, RVer);
769
Devang Patel1a0df9a2010-05-10 22:49:55 +0000770 if (!FirstCU)
771 FirstCU = NewCU;
Eric Christopher7a2cdf72013-02-05 07:31:55 +0000772
Eric Christopherc8a310e2012-12-10 23:34:43 +0000773 InfoHolder.addUnit(NewCU);
774
Devang Patel1a0df9a2010-05-10 22:49:55 +0000775 CUMap.insert(std::make_pair(N, NewCU));
Devang Pateleb1bb4e2011-08-16 22:09:43 +0000776 return NewCU;
Devang Patel1a0df9a2010-05-10 22:49:55 +0000777}
778
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000779// Construct subprogram DIE.
Eric Christopher6a841382012-11-19 22:42:10 +0000780void DwarfDebug::constructSubprogramDIE(CompileUnit *TheCU,
Devang Patel1f4f98d2011-08-15 23:36:40 +0000781 const MDNode *N) {
Rafael Espindola6cf4e832011-11-04 19:00:29 +0000782 CompileUnit *&CURef = SPMap[N];
783 if (CURef)
784 return;
785 CURef = TheCU;
786
Devang Patel80ae3492009-08-28 23:24:31 +0000787 DISubprogram SP(N);
Bill Wendling2b128d72009-05-20 23:19:06 +0000788 if (!SP.isDefinition())
789 // This is a method declaration which will be handled while constructing
790 // class type.
Devang Patel0751a282009-06-26 01:49:18 +0000791 return;
Bill Wendling2b128d72009-05-20 23:19:06 +0000792
Devang Patel89543712011-08-15 17:24:54 +0000793 DIE *SubprogramDie = TheCU->getOrCreateSubprogramDIE(SP);
Stuart Hastings4bd3dd92010-04-06 21:38:29 +0000794
795 // Add to map.
Devang Patel1a0df9a2010-05-10 22:49:55 +0000796 TheCU->insertDIE(N, SubprogramDie);
Bill Wendling2b128d72009-05-20 23:19:06 +0000797
798 // Add to context owner.
Devang Patelf20c4f72011-04-12 22:53:02 +0000799 TheCU->addToContextOwner(SubprogramDie, SP.getContext());
Devang Patel512001a2009-12-08 23:21:45 +0000800
Eric Christopherba506db2013-09-09 20:03:20 +0000801 // Expose as a global name.
802 TheCU->addGlobalName(SP.getName(), SubprogramDie);
Bill Wendling2b128d72009-05-20 23:19:06 +0000803}
804
David Blaikie1fd43652013-05-07 21:35:53 +0000805void DwarfDebug::constructImportedEntityDIE(CompileUnit *TheCU,
David Blaikief55abea2013-04-22 06:12:31 +0000806 const MDNode *N) {
David Blaikie1fd43652013-05-07 21:35:53 +0000807 DIImportedEntity Module(N);
David Blaikief55abea2013-04-22 06:12:31 +0000808 if (!Module.Verify())
809 return;
David Blaikie684fc532013-05-06 23:33:07 +0000810 if (DIE *D = TheCU->getOrCreateContextDIE(Module.getContext()))
David Blaikie4dd2de72013-05-08 06:01:38 +0000811 constructImportedEntityDIE(TheCU, Module, D);
David Blaikie684fc532013-05-06 23:33:07 +0000812}
813
David Blaikie4dd2de72013-05-08 06:01:38 +0000814void DwarfDebug::constructImportedEntityDIE(CompileUnit *TheCU, const MDNode *N,
David Blaikie684fc532013-05-06 23:33:07 +0000815 DIE *Context) {
David Blaikie1fd43652013-05-07 21:35:53 +0000816 DIImportedEntity Module(N);
David Blaikie684fc532013-05-06 23:33:07 +0000817 if (!Module.Verify())
818 return;
David Blaikie4dd2de72013-05-08 06:01:38 +0000819 return constructImportedEntityDIE(TheCU, Module, Context);
David Blaikie684fc532013-05-06 23:33:07 +0000820}
821
David Blaikie4dd2de72013-05-08 06:01:38 +0000822void DwarfDebug::constructImportedEntityDIE(CompileUnit *TheCU,
David Blaikie1fd43652013-05-07 21:35:53 +0000823 const DIImportedEntity &Module,
David Blaikie684fc532013-05-06 23:33:07 +0000824 DIE *Context) {
825 assert(Module.Verify() &&
826 "Use one of the MDNode * overloads to handle invalid metadata");
827 assert(Context && "Should always have a context for an imported_module");
David Blaikie1fd43652013-05-07 21:35:53 +0000828 DIE *IMDie = new DIE(Module.getTag());
David Blaikief55abea2013-04-22 06:12:31 +0000829 TheCU->insertDIE(Module, IMDie);
David Blaikie1fd43652013-05-07 21:35:53 +0000830 DIE *EntityDie;
831 DIDescriptor Entity = Module.getEntity();
832 if (Entity.isNameSpace())
833 EntityDie = TheCU->getOrCreateNameSpace(DINameSpace(Entity));
834 else if (Entity.isSubprogram())
835 EntityDie = TheCU->getOrCreateSubprogramDIE(DISubprogram(Entity));
David Blaikie3b6038b2013-05-08 06:01:41 +0000836 else if (Entity.isType())
837 EntityDie = TheCU->getOrCreateTypeDIE(DIType(Entity));
David Blaikie1fd43652013-05-07 21:35:53 +0000838 else
David Blaikie3b6038b2013-05-08 06:01:41 +0000839 EntityDie = TheCU->getDIE(Entity);
David Blaikief55abea2013-04-22 06:12:31 +0000840 unsigned FileID = getOrCreateSourceID(Module.getContext().getFilename(),
841 Module.getContext().getDirectory(),
842 TheCU->getUniqueID());
843 TheCU->addUInt(IMDie, dwarf::DW_AT_decl_file, 0, FileID);
844 TheCU->addUInt(IMDie, dwarf::DW_AT_decl_line, 0, Module.getLineNumber());
Eric Christopher5fdd68e2013-06-24 23:20:02 +0000845 TheCU->addDIEEntry(IMDie, dwarf::DW_AT_import, dwarf::DW_FORM_ref4,
846 EntityDie);
David Blaikiee63d5d12013-05-20 22:50:35 +0000847 StringRef Name = Module.getName();
848 if (!Name.empty())
849 TheCU->addString(IMDie, dwarf::DW_AT_name, Name);
David Blaikie684fc532013-05-06 23:33:07 +0000850 Context->addChild(IMDie);
David Blaikief55abea2013-04-22 06:12:31 +0000851}
852
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000853// Emit all Dwarf sections that should come prior to the content. Create
854// global DIEs and emit initial debug info sections. This is invoked by
855// the target AsmPrinter.
Eric Christopher58f41952012-11-19 22:42:15 +0000856void DwarfDebug::beginModule() {
Devang Patel6c74a872010-04-27 19:46:33 +0000857 if (DisableDebugInfoPrinting)
858 return;
859
Eric Christopher58f41952012-11-19 22:42:15 +0000860 const Module *M = MMI->getModule();
861
Nick Lewycky019d2552011-07-29 03:49:23 +0000862 // If module has named metadata anchors then use them, otherwise scan the
863 // module using debug info finder to collect debug info.
Devang Patele02e5852011-05-03 16:45:22 +0000864 NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu");
David Blaikiedc69ebb2013-03-11 23:39:23 +0000865 if (!CU_Nodes)
Devang Patel07bb9ee2011-08-15 23:47:24 +0000866 return;
Manman Ren60352032013-09-05 18:48:31 +0000867 TypeIdentifierMap = generateDITypeIdentifierMap(CU_Nodes);
Devang Patele02e5852011-05-03 16:45:22 +0000868
David Blaikiedc69ebb2013-03-11 23:39:23 +0000869 // Emit initial sections so we can reference labels later.
870 emitSectionLabels();
871
872 for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i) {
873 DICompileUnit CUNode(CU_Nodes->getOperand(i));
874 CompileUnit *CU = constructCompileUnit(CUNode);
David Blaikie1fd43652013-05-07 21:35:53 +0000875 DIArray ImportedEntities = CUNode.getImportedEntities();
876 for (unsigned i = 0, e = ImportedEntities.getNumElements(); i != e; ++i)
David Blaikie684fc532013-05-06 23:33:07 +0000877 ScopesWithImportedEntities.push_back(std::make_pair(
David Blaikie1fd43652013-05-07 21:35:53 +0000878 DIImportedEntity(ImportedEntities.getElement(i)).getContext(),
879 ImportedEntities.getElement(i)));
David Blaikie684fc532013-05-06 23:33:07 +0000880 std::sort(ScopesWithImportedEntities.begin(),
Benjamin Kramerb12cf012013-08-24 12:54:27 +0000881 ScopesWithImportedEntities.end(), less_first());
David Blaikiedc69ebb2013-03-11 23:39:23 +0000882 DIArray GVs = CUNode.getGlobalVariables();
883 for (unsigned i = 0, e = GVs.getNumElements(); i != e; ++i)
884 CU->createGlobalVariableDIE(GVs.getElement(i));
885 DIArray SPs = CUNode.getSubprograms();
886 for (unsigned i = 0, e = SPs.getNumElements(); i != e; ++i)
887 constructSubprogramDIE(CU, SPs.getElement(i));
888 DIArray EnumTypes = CUNode.getEnumTypes();
889 for (unsigned i = 0, e = EnumTypes.getNumElements(); i != e; ++i)
890 CU->getOrCreateTypeDIE(EnumTypes.getElement(i));
891 DIArray RetainedTypes = CUNode.getRetainedTypes();
892 for (unsigned i = 0, e = RetainedTypes.getNumElements(); i != e; ++i)
893 CU->getOrCreateTypeDIE(RetainedTypes.getElement(i));
David Blaikief55abea2013-04-22 06:12:31 +0000894 // Emit imported_modules last so that the relevant context is already
895 // available.
David Blaikie1fd43652013-05-07 21:35:53 +0000896 for (unsigned i = 0, e = ImportedEntities.getNumElements(); i != e; ++i)
897 constructImportedEntityDIE(CU, ImportedEntities.getElement(i));
David Blaikiedc69ebb2013-03-11 23:39:23 +0000898 }
Eric Christopher6a841382012-11-19 22:42:10 +0000899
Chris Lattner7cfa70e2010-04-05 02:19:28 +0000900 // Tell MMI that we have debug info.
901 MMI->setDebugInfoAvailability(true);
Eric Christopher6a841382012-11-19 22:42:10 +0000902
Bill Wendling2b128d72009-05-20 23:19:06 +0000903 // Prime section data.
Chris Lattner5e693ed2009-07-28 03:13:23 +0000904 SectionMap.insert(Asm->getObjFileLowering().getTextSection());
Bill Wendling2b128d72009-05-20 23:19:06 +0000905}
906
Eric Christopher960ac372012-11-22 00:59:49 +0000907// Attach DW_AT_inline attribute with inlined subprogram DIEs.
908void DwarfDebug::computeInlinedDIEs() {
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000909 // Attach DW_AT_inline attribute with inlined subprogram DIEs.
910 for (SmallPtrSet<DIE *, 4>::iterator AI = InlinedSubprogramDIEs.begin(),
Eric Christopher735401c2012-11-27 00:13:51 +0000911 AE = InlinedSubprogramDIEs.end(); AI != AE; ++AI) {
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000912 DIE *ISP = *AI;
Devang Patelf20c4f72011-04-12 22:53:02 +0000913 FirstCU->addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000914 }
Rafael Espindolae7cc8bf2011-11-12 01:57:54 +0000915 for (DenseMap<const MDNode *, DIE *>::iterator AI = AbstractSPDies.begin(),
Eric Christopher735401c2012-11-27 00:13:51 +0000916 AE = AbstractSPDies.end(); AI != AE; ++AI) {
Rafael Espindolae7cc8bf2011-11-12 01:57:54 +0000917 DIE *ISP = AI->second;
918 if (InlinedSubprogramDIEs.count(ISP))
919 continue;
920 FirstCU->addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
921 }
Eric Christopher960ac372012-11-22 00:59:49 +0000922}
923
924// Collect info for variables that were optimized out.
925void DwarfDebug::collectDeadVariables() {
926 const Module *M = MMI->getModule();
927 DenseMap<const MDNode *, LexicalScope *> DeadFnScopeMap;
928
929 if (NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu")) {
930 for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i) {
931 DICompileUnit TheCU(CU_Nodes->getOperand(i));
932 DIArray Subprograms = TheCU.getSubprograms();
933 for (unsigned i = 0, e = Subprograms.getNumElements(); i != e; ++i) {
Eric Christopher735401c2012-11-27 00:13:51 +0000934 DISubprogram SP(Subprograms.getElement(i));
935 if (ProcessedSPNodes.count(SP) != 0) continue;
Manman Ren7504ed42013-07-08 18:33:29 +0000936 if (!SP.isSubprogram()) continue;
Eric Christopher735401c2012-11-27 00:13:51 +0000937 if (!SP.isDefinition()) continue;
938 DIArray Variables = SP.getVariables();
939 if (Variables.getNumElements() == 0) continue;
Eric Christopher960ac372012-11-22 00:59:49 +0000940
Eric Christopher735401c2012-11-27 00:13:51 +0000941 LexicalScope *Scope =
942 new LexicalScope(NULL, DIDescriptor(SP), NULL, false);
943 DeadFnScopeMap[SP] = Scope;
Eric Christopher960ac372012-11-22 00:59:49 +0000944
Eric Christopher735401c2012-11-27 00:13:51 +0000945 // Construct subprogram DIE and add variables DIEs.
946 CompileUnit *SPCU = CUMap.lookup(TheCU);
947 assert(SPCU && "Unable to find Compile Unit!");
948 constructSubprogramDIE(SPCU, SP);
949 DIE *ScopeDIE = SPCU->getDIE(SP);
950 for (unsigned vi = 0, ve = Variables.getNumElements(); vi != ve; ++vi) {
951 DIVariable DV(Variables.getElement(vi));
Manman Ren7504ed42013-07-08 18:33:29 +0000952 if (!DV.isVariable()) continue;
Chandler Carruth2a1c0d22013-07-27 11:09:58 +0000953 DbgVariable NewVar(DV, NULL);
Eric Christopher735401c2012-11-27 00:13:51 +0000954 if (DIE *VariableDIE =
Chandler Carruth2a1c0d22013-07-27 11:09:58 +0000955 SPCU->constructVariableDIE(&NewVar, Scope->isAbstractScope()))
Eric Christopher735401c2012-11-27 00:13:51 +0000956 ScopeDIE->addChild(VariableDIE);
957 }
Eric Christopher960ac372012-11-22 00:59:49 +0000958 }
959 }
960 }
961 DeleteContainerSeconds(DeadFnScopeMap);
962}
963
Eric Christopher45731982013-08-08 23:45:55 +0000964// Type Signature [7.27] and ODR Hash code.
Eric Christopher67646432013-07-26 17:02:41 +0000965
966/// \brief Grabs the string in whichever attribute is passed in and returns
Eric Christopher8552e222013-08-07 01:18:33 +0000967/// a reference to it. Returns "" if the attribute doesn't exist.
Eric Christopher67646432013-07-26 17:02:41 +0000968static StringRef getDIEStringAttr(DIE *Die, unsigned Attr) {
Eric Christopher8552e222013-08-07 01:18:33 +0000969 DIEValue *V = Die->findAttribute(Attr);
Eric Christopher67646432013-07-26 17:02:41 +0000970
Eric Christopher8552e222013-08-07 01:18:33 +0000971 if (DIEString *S = dyn_cast_or_null<DIEString>(V))
972 return S->getString();
973
Eric Christopher67646432013-07-26 17:02:41 +0000974 return StringRef("");
975}
976
Eric Christopher67646432013-07-26 17:02:41 +0000977/// Return true if the current DIE is contained within an anonymous namespace.
978static bool isContainedInAnonNamespace(DIE *Die) {
979 DIE *Parent = Die->getParent();
980
981 while (Parent) {
Eric Christophere414ece2013-07-29 23:53:08 +0000982 if (Parent->getTag() == dwarf::DW_TAG_namespace &&
983 getDIEStringAttr(Parent, dwarf::DW_AT_name) == "")
Eric Christopher67646432013-07-26 17:02:41 +0000984 return true;
985 Parent = Parent->getParent();
986 }
987
988 return false;
989}
990
Eric Christopheraf15f8d2013-08-07 01:18:24 +0000991/// Test if the current CU language is C++ and that we have
992/// a named type that is not contained in an anonymous namespace.
993static bool shouldAddODRHash(CompileUnit *CU, DIE *Die) {
Eric Christopher341770d2013-08-07 08:35:10 +0000994 return CU->getLanguage() == dwarf::DW_LANG_C_plus_plus &&
995 getDIEStringAttr(Die, dwarf::DW_AT_name) != "" &&
996 !isContainedInAnonNamespace(Die);
Eric Christopher45731982013-08-08 23:45:55 +0000997}
Eric Christopheraf15f8d2013-08-07 01:18:24 +0000998
Eric Christopher960ac372012-11-22 00:59:49 +0000999void DwarfDebug::finalizeModuleInfo() {
1000 // Collect info for variables that were optimized out.
1001 collectDeadVariables();
1002
1003 // Attach DW_AT_inline attribute with inlined subprogram DIEs.
1004 computeInlinedDIEs();
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001005
Eric Christopherf8542ec2013-07-29 22:24:32 +00001006 // Split out type units and conditionally add an ODR tag to the split
1007 // out type.
Eric Christopher67646432013-07-26 17:02:41 +00001008 // FIXME: Do type splitting.
1009 for (unsigned i = 0, e = TypeUnits.size(); i != e; ++i) {
Eric Christopher67646432013-07-26 17:02:41 +00001010 DIE *Die = TypeUnits[i];
Eric Christopher45731982013-08-08 23:45:55 +00001011 DIEHash Hash;
Eric Christopheraf15f8d2013-08-07 01:18:24 +00001012 // If we've requested ODR hashes and it's applicable for an ODR hash then
1013 // add the ODR signature now.
Eric Christopher45731982013-08-08 23:45:55 +00001014 // FIXME: This should be added onto the type unit, not the type, but this
1015 // works as an intermediate stage.
Eric Christopheraf15f8d2013-08-07 01:18:24 +00001016 if (GenerateODRHash && shouldAddODRHash(CUMap.begin()->second, Die))
Eric Christopher45731982013-08-08 23:45:55 +00001017 CUMap.begin()->second->addUInt(Die, dwarf::DW_AT_GNU_odr_signature,
1018 dwarf::DW_FORM_data8,
1019 Hash.computeDIEODRSignature(Die));
Eric Christopher67646432013-07-26 17:02:41 +00001020 }
1021
Eric Christopher60eb7692013-08-12 20:27:48 +00001022 // Handle anything that needs to be done on a per-cu basis.
1023 for (DenseMap<const MDNode *, CompileUnit *>::iterator CUI = CUMap.begin(),
1024 CUE = CUMap.end();
1025 CUI != CUE; ++CUI) {
1026 CompileUnit *TheCU = CUI->second;
1027 // Emit DW_AT_containing_type attribute to connect types with their
1028 // vtable holding type.
1029 TheCU->constructContainingTypeDIEs();
1030
1031 // If we're splitting the dwarf out now that we've got the entire
1032 // CU then construct a skeleton CU based upon it.
1033 if (useSplitDwarf()) {
Eric Christopherd29614f2013-08-13 01:21:55 +00001034 uint64_t ID = 0;
1035 if (GenerateCUHash) {
1036 DIEHash CUHash;
1037 ID = CUHash.computeCUSignature(TheCU->getCUDie());
1038 }
Eric Christopher60eb7692013-08-12 20:27:48 +00001039 // This should be a unique identifier when we want to build .dwp files.
1040 TheCU->addUInt(TheCU->getCUDie(), dwarf::DW_AT_GNU_dwo_id,
Eric Christopherd29614f2013-08-13 01:21:55 +00001041 dwarf::DW_FORM_data8, ID);
Eric Christopher60eb7692013-08-12 20:27:48 +00001042 // Now construct the skeleton CU associated.
Eric Christopher6fdf3242013-08-26 23:50:43 +00001043 CompileUnit *SkCU = constructSkeletonCU(TheCU);
Eric Christopher60eb7692013-08-12 20:27:48 +00001044 // This should be a unique identifier when we want to build .dwp files.
1045 SkCU->addUInt(SkCU->getCUDie(), dwarf::DW_AT_GNU_dwo_id,
Eric Christopherd29614f2013-08-13 01:21:55 +00001046 dwarf::DW_FORM_data8, ID);
Eric Christopher60eb7692013-08-12 20:27:48 +00001047 }
1048 }
1049
1050 // Compute DIE offsets and sizes.
Eric Christopherc8a310e2012-12-10 23:34:43 +00001051 InfoHolder.computeSizeAndOffsets();
1052 if (useSplitDwarf())
1053 SkeletonHolder.computeSizeAndOffsets();
Eric Christopher960ac372012-11-22 00:59:49 +00001054}
1055
1056void DwarfDebug::endSections() {
Bill Wendling2b128d72009-05-20 23:19:06 +00001057 // Standard sections final addresses.
Chris Lattner4b7dadb2009-08-19 05:49:37 +00001058 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getTextSection());
Chris Lattnera179b522010-04-04 19:25:43 +00001059 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("text_end"));
Chris Lattner4b7dadb2009-08-19 05:49:37 +00001060 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getDataSection());
Chris Lattnera179b522010-04-04 19:25:43 +00001061 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("data_end"));
Bill Wendling2b128d72009-05-20 23:19:06 +00001062
1063 // End text sections.
Benjamin Kramer15591272012-10-31 13:45:49 +00001064 for (unsigned I = 0, E = SectionMap.size(); I != E; ++I) {
1065 Asm->OutStreamer.SwitchSection(SectionMap[I]);
1066 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("section_end", I+1));
Bill Wendling2b128d72009-05-20 23:19:06 +00001067 }
Eric Christopher960ac372012-11-22 00:59:49 +00001068}
Bill Wendling2b128d72009-05-20 23:19:06 +00001069
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001070// Emit all Dwarf sections that should come after the content.
Eric Christopher960ac372012-11-22 00:59:49 +00001071void DwarfDebug::endModule() {
1072
1073 if (!FirstCU) return;
1074
1075 // End any existing sections.
1076 // TODO: Does this need to happen?
1077 endSections();
1078
1079 // Finalize the debug info for the module.
1080 finalizeModuleInfo();
Bill Wendling2b128d72009-05-20 23:19:06 +00001081
Eric Christophercdf218d2012-12-10 19:51:21 +00001082 if (!useSplitDwarf()) {
Eric Christopher95198f502012-11-27 22:43:42 +00001083 // Emit all the DIEs into a debug info section.
1084 emitDebugInfo();
Eric Christopher4c9b1192012-11-27 00:41:54 +00001085
Eric Christopher95198f502012-11-27 22:43:42 +00001086 // Corresponding abbreviations into a abbrev section.
1087 emitAbbreviations();
1088
1089 // Emit info into a debug loc section.
1090 emitDebugLoc();
1091
1092 // Emit info into a debug aranges section.
1093 emitDebugARanges();
1094
1095 // Emit info into a debug ranges section.
1096 emitDebugRanges();
1097
1098 // Emit info into a debug macinfo section.
1099 emitDebugMacInfo();
1100
Eric Christopher95198f502012-11-27 22:43:42 +00001101 } else {
Eric Christopherd692c1d2012-12-11 19:42:09 +00001102 // TODO: Fill this in for separated debug sections and separate
Eric Christopher95198f502012-11-27 22:43:42 +00001103 // out information into new sections.
1104
Eric Christopher9c2ecd92012-11-30 23:59:06 +00001105 // Emit the debug info section and compile units.
Eric Christopher95198f502012-11-27 22:43:42 +00001106 emitDebugInfo();
Eric Christopher9c2ecd92012-11-30 23:59:06 +00001107 emitDebugInfoDWO();
Eric Christopher95198f502012-11-27 22:43:42 +00001108
1109 // Corresponding abbreviations into a abbrev section.
1110 emitAbbreviations();
Eric Christopher3c5a1912012-12-19 22:02:53 +00001111 emitDebugAbbrevDWO();
Eric Christopher95198f502012-11-27 22:43:42 +00001112
1113 // Emit info into a debug loc section.
1114 emitDebugLoc();
1115
1116 // Emit info into a debug aranges section.
1117 emitDebugARanges();
1118
1119 // Emit info into a debug ranges section.
1120 emitDebugRanges();
1121
1122 // Emit info into a debug macinfo section.
1123 emitDebugMacInfo();
1124
Eric Christopher962c9082013-01-15 23:56:56 +00001125 // Emit DWO addresses.
1126 InfoHolder.emitAddresses(Asm->getObjFileLowering().getDwarfAddrSection());
1127
Eric Christopher95198f502012-11-27 22:43:42 +00001128 }
Bill Wendling2b128d72009-05-20 23:19:06 +00001129
Eric Christophera876b822012-08-23 07:32:06 +00001130 // Emit info into the dwarf accelerator table sections.
Eric Christopher20b76a72012-08-23 22:36:40 +00001131 if (useDwarfAccelTables()) {
Eric Christopher4996c702011-11-07 09:24:32 +00001132 emitAccelNames();
1133 emitAccelObjC();
1134 emitAccelNamespaces();
1135 emitAccelTypes();
1136 }
Eric Christopher6a841382012-11-19 22:42:10 +00001137
Eric Christopher4b358182013-08-30 00:40:17 +00001138 // Emit the pubnames and pubtypes sections if requested.
1139 if (HasDwarfPubSections) {
Eric Christopher5f93bb92013-09-09 20:03:17 +00001140 emitDebugPubNames();
Eric Christopher77826182012-08-23 07:10:56 +00001141 emitDebugPubTypes();
Eric Christopher4b358182013-08-30 00:40:17 +00001142 }
Devang Patel04d2f2d2009-11-24 01:14:22 +00001143
Eric Christopher95198f502012-11-27 22:43:42 +00001144 // Finally emit string information into a string table.
Eric Christopher6e20a162012-11-27 06:49:23 +00001145 emitDebugStr();
Eric Christopher3bf29fd2012-12-27 02:14:01 +00001146 if (useSplitDwarf())
1147 emitDebugStrDWO();
Eric Christopher6e20a162012-11-27 06:49:23 +00001148
Devang Pateld0701282010-08-02 17:32:15 +00001149 // clean up.
Devang Pateleb1bb4e2011-08-16 22:09:43 +00001150 SPMap.clear();
Devang Patel1a0df9a2010-05-10 22:49:55 +00001151 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
1152 E = CUMap.end(); I != E; ++I)
1153 delete I->second;
Eric Christopher8afd7b62012-12-10 19:51:18 +00001154
Craig Topperd8e43652013-07-03 04:17:25 +00001155 for (SmallVectorImpl<CompileUnit *>::iterator I = SkeletonCUs.begin(),
Eric Christopher5b33b3c2013-02-06 21:53:56 +00001156 E = SkeletonCUs.end(); I != E; ++I)
1157 delete *I;
Eric Christopher8afd7b62012-12-10 19:51:18 +00001158
Eric Christopher9c2ecd92012-11-30 23:59:06 +00001159 // Reset these for the next Module if we have one.
1160 FirstCU = NULL;
Bill Wendling2b128d72009-05-20 23:19:06 +00001161}
1162
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001163// Find abstract variable, if any, associated with Var.
Devang Patelbb23a4a2011-08-10 21:50:54 +00001164DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &DV,
Chris Lattner915c5f92010-04-02 19:42:39 +00001165 DebugLoc ScopeLoc) {
Devang Patelbb23a4a2011-08-10 21:50:54 +00001166 LLVMContext &Ctx = DV->getContext();
1167 // More then one inlined variable corresponds to one abstract variable.
1168 DIVariable Var = cleanseInlinedVariable(DV, Ctx);
Devang Patelcfa8e9d2010-05-07 18:11:54 +00001169 DbgVariable *AbsDbgVariable = AbstractVariables.lookup(Var);
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001170 if (AbsDbgVariable)
1171 return AbsDbgVariable;
1172
Devang Patel7e623022011-08-10 20:55:27 +00001173 LexicalScope *Scope = LScopes.findAbstractScope(ScopeLoc.getScope(Ctx));
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001174 if (!Scope)
1175 return NULL;
1176
Devang Patel99819b52011-08-15 19:01:20 +00001177 AbsDbgVariable = new DbgVariable(Var, NULL);
Devang Patel7e623022011-08-10 20:55:27 +00001178 addScopeVariable(Scope, AbsDbgVariable);
Devang Patelcfa8e9d2010-05-07 18:11:54 +00001179 AbstractVariables[Var] = AbsDbgVariable;
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001180 return AbsDbgVariable;
1181}
1182
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001183// If Var is a current function argument then add it to CurrentFnArguments list.
Devang Patel6c622ef2011-03-01 22:58:55 +00001184bool DwarfDebug::addCurrentFnArgument(const MachineFunction *MF,
Devang Patel7e623022011-08-10 20:55:27 +00001185 DbgVariable *Var, LexicalScope *Scope) {
1186 if (!LScopes.isCurrentFunctionScope(Scope))
Devang Patel6c622ef2011-03-01 22:58:55 +00001187 return false;
1188 DIVariable DV = Var->getVariable();
1189 if (DV.getTag() != dwarf::DW_TAG_arg_variable)
1190 return false;
1191 unsigned ArgNo = DV.getArgNumber();
Eric Christopher6a841382012-11-19 22:42:10 +00001192 if (ArgNo == 0)
Devang Patel6c622ef2011-03-01 22:58:55 +00001193 return false;
1194
Devang Patel4ab660b2011-03-03 20:02:02 +00001195 size_t Size = CurrentFnArguments.size();
1196 if (Size == 0)
Devang Patel6c622ef2011-03-01 22:58:55 +00001197 CurrentFnArguments.resize(MF->getFunction()->arg_size());
Devang Patel63b3e762011-03-03 21:49:41 +00001198 // llvm::Function argument size is not good indicator of how many
Devang Patel34a7ab42011-03-03 20:08:10 +00001199 // arguments does the function have at source level.
1200 if (ArgNo > Size)
Devang Patel4ab660b2011-03-03 20:02:02 +00001201 CurrentFnArguments.resize(ArgNo * 2);
Devang Patel6c622ef2011-03-01 22:58:55 +00001202 CurrentFnArguments[ArgNo - 1] = Var;
1203 return true;
1204}
1205
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001206// Collect variable information from side table maintained by MMI.
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001207void
Nick Lewycky019d2552011-07-29 03:49:23 +00001208DwarfDebug::collectVariableInfoFromMMITable(const MachineFunction *MF,
Devang Patel490c8ab2010-05-20 19:57:06 +00001209 SmallPtrSet<const MDNode *, 16> &Processed) {
Devang Patel475d32a2009-10-06 01:26:37 +00001210 MachineModuleInfo::VariableDbgInfoMapTy &VMap = MMI->getVariableDbgInfo();
1211 for (MachineModuleInfo::VariableDbgInfoMapTy::iterator VI = VMap.begin(),
1212 VE = VMap.end(); VI != VE; ++VI) {
Devang Patel32cc43c2010-05-07 20:54:48 +00001213 const MDNode *Var = VI->first;
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001214 if (!Var) continue;
Devang Patele0a94bf2010-05-14 21:01:35 +00001215 Processed.insert(Var);
Chris Lattner915c5f92010-04-02 19:42:39 +00001216 DIVariable DV(Var);
1217 const std::pair<unsigned, DebugLoc> &VP = VI->second;
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001218
Devang Patel7e623022011-08-10 20:55:27 +00001219 LexicalScope *Scope = LScopes.findLexicalScope(VP.second);
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001220
Devang Patelcdb7d442009-11-10 23:20:04 +00001221 // If variable scope is not found then skip this variable.
Chris Lattner915c5f92010-04-02 19:42:39 +00001222 if (Scope == 0)
Devang Patelcdb7d442009-11-10 23:20:04 +00001223 continue;
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001224
Devang Patele1c53f22010-05-20 16:36:41 +00001225 DbgVariable *AbsDbgVariable = findAbstractVariable(DV, VP.second);
Devang Patel99819b52011-08-15 19:01:20 +00001226 DbgVariable *RegVar = new DbgVariable(DV, AbsDbgVariable);
Devang Patel3e4a9652011-08-15 21:24:36 +00001227 RegVar->setFrameIndex(VP.first);
Devang Patel6c622ef2011-03-01 22:58:55 +00001228 if (!addCurrentFnArgument(MF, RegVar, Scope))
Devang Patel7e623022011-08-10 20:55:27 +00001229 addScopeVariable(Scope, RegVar);
Devang Patel99819b52011-08-15 19:01:20 +00001230 if (AbsDbgVariable)
Devang Patel3e4a9652011-08-15 21:24:36 +00001231 AbsDbgVariable->setFrameIndex(VP.first);
Devang Patel475d32a2009-10-06 01:26:37 +00001232 }
Devang Patel490c8ab2010-05-20 19:57:06 +00001233}
Devang Patela3e9c9c2010-03-15 18:33:46 +00001234
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001235// Return true if debug value, encoded by DBG_VALUE instruction, is in a
1236// defined reg.
Devang Patel9fc11702010-05-25 23:40:22 +00001237static bool isDbgValueInDefinedReg(const MachineInstr *MI) {
Nick Lewycky654f5ce2011-10-26 22:55:33 +00001238 assert(MI->isDebugValue() && "Invalid DBG_VALUE machine instruction!");
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001239 return MI->getNumOperands() == 3 &&
1240 MI->getOperand(0).isReg() && MI->getOperand(0).getReg() &&
Adrian Prantl418d1d12013-07-09 20:28:37 +00001241 (MI->getOperand(1).isImm() ||
1242 (MI->getOperand(1).isReg() && MI->getOperand(1).getReg() == 0U));
Devang Patel9fc11702010-05-25 23:40:22 +00001243}
1244
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001245// Get .debug_loc entry for the instruction range starting at MI.
Eric Christopher6a841382012-11-19 22:42:10 +00001246static DotDebugLocEntry getDebugLocEntry(AsmPrinter *Asm,
1247 const MCSymbol *FLabel,
Devang Patel2442a892011-07-08 17:09:57 +00001248 const MCSymbol *SLabel,
1249 const MachineInstr *MI) {
1250 const MDNode *Var = MI->getOperand(MI->getNumOperands() - 1).getMetadata();
1251
David Blaikie0252265b2013-06-16 20:34:15 +00001252 assert(MI->getNumOperands() == 3);
Adrian Prantl418d1d12013-07-09 20:28:37 +00001253 if (MI->getOperand(0).isReg()) {
Devang Patel2442a892011-07-08 17:09:57 +00001254 MachineLocation MLoc;
Adrian Prantl418d1d12013-07-09 20:28:37 +00001255 // If the second operand is an immediate, this is a
1256 // register-indirect address.
1257 if (!MI->getOperand(1).isImm())
Adrian Prantld4c0dd42013-04-26 21:57:17 +00001258 MLoc.set(MI->getOperand(0).getReg());
1259 else
1260 MLoc.set(MI->getOperand(0).getReg(), MI->getOperand(1).getImm());
Devang Patel2442a892011-07-08 17:09:57 +00001261 return DotDebugLocEntry(FLabel, SLabel, MLoc, Var);
1262 }
1263 if (MI->getOperand(0).isImm())
1264 return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getImm());
1265 if (MI->getOperand(0).isFPImm())
1266 return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getFPImm());
1267 if (MI->getOperand(0).isCImm())
1268 return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getCImm());
1269
Craig Topperee4dab52012-02-05 08:31:47 +00001270 llvm_unreachable("Unexpected 3 operand DBG_VALUE instruction!");
Devang Patel2442a892011-07-08 17:09:57 +00001271}
1272
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001273// Find variables for each lexical scope.
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001274void
Devang Patel5c0f85c2010-06-25 22:07:34 +00001275DwarfDebug::collectVariableInfo(const MachineFunction *MF,
1276 SmallPtrSet<const MDNode *, 16> &Processed) {
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001277
Eric Christopher270a12c2013-07-03 21:37:03 +00001278 // Grab the variable info that was squirreled away in the MMI side-table.
Devang Patel490c8ab2010-05-20 19:57:06 +00001279 collectVariableInfoFromMMITable(MF, Processed);
1280
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001281 for (SmallVectorImpl<const MDNode*>::const_iterator
1282 UVI = UserVariables.begin(), UVE = UserVariables.end(); UVI != UVE;
1283 ++UVI) {
1284 const MDNode *Var = *UVI;
1285 if (Processed.count(Var))
Devang Patel490c8ab2010-05-20 19:57:06 +00001286 continue;
1287
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001288 // History contains relevant DBG_VALUE instructions for Var and instructions
1289 // clobbering it.
1290 SmallVectorImpl<const MachineInstr*> &History = DbgValues[Var];
1291 if (History.empty())
1292 continue;
1293 const MachineInstr *MInsn = History.front();
Devang Patel9fc11702010-05-25 23:40:22 +00001294
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001295 DIVariable DV(Var);
Devang Patel7e623022011-08-10 20:55:27 +00001296 LexicalScope *Scope = NULL;
Devang Patel7a9dedf2010-05-27 20:25:04 +00001297 if (DV.getTag() == dwarf::DW_TAG_arg_variable &&
1298 DISubprogram(DV.getContext()).describes(MF->getFunction()))
Devang Patel7e623022011-08-10 20:55:27 +00001299 Scope = LScopes.getCurrentFunctionScope();
David Blaikiedc69ebb2013-03-11 23:39:23 +00001300 else if (MDNode *IA = DV.getInlinedAt())
1301 Scope = LScopes.findInlinedScope(DebugLoc::getFromDILocation(IA));
1302 else
1303 Scope = LScopes.findLexicalScope(cast<MDNode>(DV->getOperand(1)));
Devang Patel490c8ab2010-05-20 19:57:06 +00001304 // If variable scope is not found then skip this variable.
Devang Patelfbd6c452010-05-21 00:10:20 +00001305 if (!Scope)
Devang Patel490c8ab2010-05-20 19:57:06 +00001306 continue;
1307
1308 Processed.insert(DV);
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001309 assert(MInsn->isDebugValue() && "History must begin with debug value");
Devang Patel99819b52011-08-15 19:01:20 +00001310 DbgVariable *AbsVar = findAbstractVariable(DV, MInsn->getDebugLoc());
1311 DbgVariable *RegVar = new DbgVariable(DV, AbsVar);
Devang Patel6c622ef2011-03-01 22:58:55 +00001312 if (!addCurrentFnArgument(MF, RegVar, Scope))
Devang Patel7e623022011-08-10 20:55:27 +00001313 addScopeVariable(Scope, RegVar);
Devang Patel99819b52011-08-15 19:01:20 +00001314 if (AbsVar)
Devang Patel3e4a9652011-08-15 21:24:36 +00001315 AbsVar->setMInsn(MInsn);
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001316
Eric Christophercc10d202012-10-08 20:48:54 +00001317 // Simplify ranges that are fully coalesced.
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001318 if (History.size() <= 1 || (History.size() == 2 &&
1319 MInsn->isIdenticalTo(History.back()))) {
Devang Patel3e4a9652011-08-15 21:24:36 +00001320 RegVar->setMInsn(MInsn);
Devang Patel9fc11702010-05-25 23:40:22 +00001321 continue;
1322 }
1323
Eric Christopher59cc0712013-01-28 17:33:26 +00001324 // Handle multiple DBG_VALUE instructions describing one variable.
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001325 RegVar->setDotDebugLocOffset(DotDebugLocEntries.size());
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001326
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001327 for (SmallVectorImpl<const MachineInstr*>::const_iterator
1328 HI = History.begin(), HE = History.end(); HI != HE; ++HI) {
1329 const MachineInstr *Begin = *HI;
1330 assert(Begin->isDebugValue() && "Invalid History entry");
Jakob Stoklund Olesen9c057ee2011-03-22 00:21:41 +00001331
Devang Patele7181b52011-06-01 23:00:17 +00001332 // Check if DBG_VALUE is truncating a range.
1333 if (Begin->getNumOperands() > 1 && Begin->getOperand(0).isReg()
1334 && !Begin->getOperand(0).getReg())
1335 continue;
1336
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001337 // Compute the range for a register location.
1338 const MCSymbol *FLabel = getLabelBeforeInsn(Begin);
1339 const MCSymbol *SLabel = 0;
1340
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001341 if (HI + 1 == HE)
1342 // If Begin is the last instruction in History then its value is valid
Chris Lattner0ab5e2c2011-04-15 05:18:47 +00001343 // until the end of the function.
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001344 SLabel = FunctionEndSym;
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001345 else {
1346 const MachineInstr *End = HI[1];
Eric Christopher6a841382012-11-19 22:42:10 +00001347 DEBUG(dbgs() << "DotDebugLoc Pair:\n"
Devang Patel53b050a2011-07-07 21:44:42 +00001348 << "\t" << *Begin << "\t" << *End << "\n");
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001349 if (End->isDebugValue())
1350 SLabel = getLabelBeforeInsn(End);
1351 else {
1352 // End is a normal instruction clobbering the range.
1353 SLabel = getLabelAfterInsn(End);
1354 assert(SLabel && "Forgot label after clobber instruction");
1355 ++HI;
1356 }
1357 }
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001358
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001359 // The value is valid until the next DBG_VALUE or clobber.
Eric Christopher365d0832011-12-16 23:42:31 +00001360 DotDebugLocEntries.push_back(getDebugLocEntry(Asm, FLabel, SLabel,
1361 Begin));
Devang Patel9fc11702010-05-25 23:40:22 +00001362 }
1363 DotDebugLocEntries.push_back(DotDebugLocEntry());
Devang Patela3e9c9c2010-03-15 18:33:46 +00001364 }
Devang Patele0a94bf2010-05-14 21:01:35 +00001365
1366 // Collect info for variables that were optimized out.
Devang Patel59e27c52011-08-19 23:28:12 +00001367 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
1368 DIArray Variables = DISubprogram(FnScope->getScopeNode()).getVariables();
1369 for (unsigned i = 0, e = Variables.getNumElements(); i != e; ++i) {
1370 DIVariable DV(Variables.getElement(i));
Manman Ren7504ed42013-07-08 18:33:29 +00001371 if (!DV || !DV.isVariable() || !Processed.insert(DV))
Devang Patel59e27c52011-08-19 23:28:12 +00001372 continue;
1373 if (LexicalScope *Scope = LScopes.findLexicalScope(DV.getContext()))
1374 addScopeVariable(Scope, new DbgVariable(DV, NULL));
Devang Patele0a94bf2010-05-14 21:01:35 +00001375 }
Devang Patel9fc11702010-05-25 23:40:22 +00001376}
Devang Patele0a94bf2010-05-14 21:01:35 +00001377
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001378// Return Label preceding the instruction.
Eric Christopher962c9082013-01-15 23:56:56 +00001379MCSymbol *DwarfDebug::getLabelBeforeInsn(const MachineInstr *MI) {
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001380 MCSymbol *Label = LabelsBeforeInsn.lookup(MI);
1381 assert(Label && "Didn't insert label before instruction");
1382 return Label;
Devang Patel9fc11702010-05-25 23:40:22 +00001383}
1384
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001385// Return Label immediately following the instruction.
Eric Christopher962c9082013-01-15 23:56:56 +00001386MCSymbol *DwarfDebug::getLabelAfterInsn(const MachineInstr *MI) {
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001387 return LabelsAfterInsn.lookup(MI);
Devang Patel475d32a2009-10-06 01:26:37 +00001388}
1389
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001390// Process beginning of an instruction.
Devang Patelb5694e72010-10-26 17:49:02 +00001391void DwarfDebug::beginInstruction(const MachineInstr *MI) {
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001392 // Check if source location changes, but ignore DBG_VALUE locations.
1393 if (!MI->isDebugValue()) {
1394 DebugLoc DL = MI->getDebugLoc();
1395 if (DL != PrevInstLoc && (!DL.isUnknown() || UnknownLocations)) {
Eric Christopheraec8a822012-04-05 20:39:05 +00001396 unsigned Flags = 0;
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001397 PrevInstLoc = DL;
Devang Patel34a66202011-05-11 19:22:19 +00001398 if (DL == PrologEndLoc) {
1399 Flags |= DWARF2_FLAG_PROLOGUE_END;
1400 PrologEndLoc = DebugLoc();
1401 }
Eric Christopheraec8a822012-04-05 20:39:05 +00001402 if (PrologEndLoc.isUnknown())
1403 Flags |= DWARF2_FLAG_IS_STMT;
1404
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001405 if (!DL.isUnknown()) {
1406 const MDNode *Scope = DL.getScope(Asm->MF->getFunction()->getContext());
Devang Patel34a66202011-05-11 19:22:19 +00001407 recordSourceLine(DL.getLine(), DL.getCol(), Scope, Flags);
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001408 } else
Devang Patel34a66202011-05-11 19:22:19 +00001409 recordSourceLine(0, 0, 0, 0);
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001410 }
Devang Patel9fc11702010-05-25 23:40:22 +00001411 }
Devang Patel23b2ae62010-03-29 22:59:58 +00001412
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001413 // Insert labels where requested.
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001414 DenseMap<const MachineInstr*, MCSymbol*>::iterator I =
1415 LabelsBeforeInsn.find(MI);
1416
1417 // No label needed.
1418 if (I == LabelsBeforeInsn.end())
1419 return;
1420
1421 // Label already assigned.
1422 if (I->second)
Devang Patel002d54d2010-05-26 19:37:24 +00001423 return;
Devang Patelbd477be2010-03-29 17:20:31 +00001424
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001425 if (!PrevLabel) {
Devang Patelacc32a52010-05-26 21:23:46 +00001426 PrevLabel = MMI->getContext().CreateTempSymbol();
1427 Asm->OutStreamer.EmitLabel(PrevLabel);
Devang Patel002d54d2010-05-26 19:37:24 +00001428 }
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001429 I->second = PrevLabel;
Devang Patel8db360d2009-10-06 01:50:42 +00001430}
1431
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001432// Process end of an instruction.
Devang Patelb5694e72010-10-26 17:49:02 +00001433void DwarfDebug::endInstruction(const MachineInstr *MI) {
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001434 // Don't create a new label after DBG_VALUE instructions.
1435 // They don't generate code.
1436 if (!MI->isDebugValue())
1437 PrevLabel = 0;
1438
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001439 DenseMap<const MachineInstr*, MCSymbol*>::iterator I =
1440 LabelsAfterInsn.find(MI);
1441
1442 // No label needed.
1443 if (I == LabelsAfterInsn.end())
1444 return;
1445
1446 // Label already assigned.
1447 if (I->second)
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001448 return;
1449
1450 // We need a label after this instruction.
1451 if (!PrevLabel) {
1452 PrevLabel = MMI->getContext().CreateTempSymbol();
1453 Asm->OutStreamer.EmitLabel(PrevLabel);
Devang Patel3ebd8932010-04-08 16:50:29 +00001454 }
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001455 I->second = PrevLabel;
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001456}
1457
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001458// Each LexicalScope has first instruction and last instruction to mark
1459// beginning and end of a scope respectively. Create an inverse map that list
1460// scopes starts (and ends) with an instruction. One instruction may start (or
1461// end) multiple scopes. Ignore scopes that are not reachable.
Devang Patel359b0132010-04-08 18:43:56 +00001462void DwarfDebug::identifyScopeMarkers() {
Devang Patel7e623022011-08-10 20:55:27 +00001463 SmallVector<LexicalScope *, 4> WorkList;
1464 WorkList.push_back(LScopes.getCurrentFunctionScope());
Devang Patel7771b7c2010-01-20 02:05:23 +00001465 while (!WorkList.empty()) {
Devang Patel7e623022011-08-10 20:55:27 +00001466 LexicalScope *S = WorkList.pop_back_val();
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001467
Craig Topper977e9cd2013-07-03 04:24:43 +00001468 const SmallVectorImpl<LexicalScope *> &Children = S->getChildren();
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001469 if (!Children.empty())
Craig Topperd8e43652013-07-03 04:17:25 +00001470 for (SmallVectorImpl<LexicalScope *>::const_iterator SI = Children.begin(),
Devang Patel7771b7c2010-01-20 02:05:23 +00001471 SE = Children.end(); SI != SE; ++SI)
1472 WorkList.push_back(*SI);
1473
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001474 if (S->isAbstractScope())
1475 continue;
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001476
Craig Topper977e9cd2013-07-03 04:24:43 +00001477 const SmallVectorImpl<InsnRange> &Ranges = S->getRanges();
Devang Patel6c74a872010-04-27 19:46:33 +00001478 if (Ranges.empty())
1479 continue;
Craig Topperd8e43652013-07-03 04:17:25 +00001480 for (SmallVectorImpl<InsnRange>::const_iterator RI = Ranges.begin(),
Devang Patel6c74a872010-04-27 19:46:33 +00001481 RE = Ranges.end(); RI != RE; ++RI) {
Devang Patel7e623022011-08-10 20:55:27 +00001482 assert(RI->first && "InsnRange does not have first instruction!");
1483 assert(RI->second && "InsnRange does not have second instruction!");
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001484 requestLabelBeforeInsn(RI->first);
1485 requestLabelAfterInsn(RI->second);
Devang Patel6c74a872010-04-27 19:46:33 +00001486 }
Devang Patel75cc16c2009-10-01 20:31:14 +00001487 }
Devang Patel75cc16c2009-10-01 20:31:14 +00001488}
1489
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001490// Get MDNode for DebugLoc's scope.
Devang Patel589845d2011-05-09 22:14:49 +00001491static MDNode *getScopeNode(DebugLoc DL, const LLVMContext &Ctx) {
1492 if (MDNode *InlinedAt = DL.getInlinedAt(Ctx))
1493 return getScopeNode(DebugLoc::getFromDILocation(InlinedAt), Ctx);
1494 return DL.getScope(Ctx);
1495}
1496
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001497// Walk up the scope chain of given debug loc and find line number info
1498// for the function.
Devang Patel34a66202011-05-11 19:22:19 +00001499static DebugLoc getFnDebugLoc(DebugLoc DL, const LLVMContext &Ctx) {
1500 const MDNode *Scope = getScopeNode(DL, Ctx);
1501 DISubprogram SP = getDISubprogram(Scope);
Manman Ren7504ed42013-07-08 18:33:29 +00001502 if (SP.isSubprogram()) {
Eric Christopher34164192012-04-03 00:43:49 +00001503 // Check for number of operands since the compatibility is
1504 // cheap here.
Eric Christopherb81e2b42012-04-03 17:55:42 +00001505 if (SP->getNumOperands() > 19)
Eric Christopher34164192012-04-03 00:43:49 +00001506 return DebugLoc::get(SP.getScopeLineNumber(), 0, SP);
1507 else
1508 return DebugLoc::get(SP.getLineNumber(), 0, SP);
1509 }
1510
Devang Patel34a66202011-05-11 19:22:19 +00001511 return DebugLoc();
1512}
1513
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001514// Gather pre-function debug information. Assumes being called immediately
1515// after the function entry point has been emitted.
Chris Lattner76555b52010-01-26 23:18:02 +00001516void DwarfDebug::beginFunction(const MachineFunction *MF) {
Chris Lattner196dbdc2010-04-05 03:52:55 +00001517 if (!MMI->hasDebugInfo()) return;
Devang Patel7e623022011-08-10 20:55:27 +00001518 LScopes.initialize(*MF);
1519 if (LScopes.empty()) return;
1520 identifyScopeMarkers();
Devang Patel4598eb62009-10-06 18:37:31 +00001521
Manman Ren4e042a62013-02-05 21:52:47 +00001522 // Set DwarfCompileUnitID in MCContext to the Compile Unit this function
1523 // belongs to.
1524 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
1525 CompileUnit *TheCU = SPMap.lookup(FnScope->getScopeNode());
1526 assert(TheCU && "Unable to find compile unit!");
Manman Ren9d4c7352013-05-21 00:57:22 +00001527 if (Asm->TM.hasMCUseLoc() &&
1528 Asm->OutStreamer.getKind() == MCStreamer::SK_AsmStreamer)
1529 // Use a single line table if we are using .loc and generating assembly.
1530 Asm->OutStreamer.getContext().setDwarfCompileUnitID(0);
1531 else
1532 Asm->OutStreamer.getContext().setDwarfCompileUnitID(TheCU->getUniqueID());
Manman Ren4e042a62013-02-05 21:52:47 +00001533
Devang Patel6c74a872010-04-27 19:46:33 +00001534 FunctionBeginSym = Asm->GetTempSymbol("func_begin",
1535 Asm->getFunctionNumber());
Bill Wendling2b128d72009-05-20 23:19:06 +00001536 // Assumes in correct section after the entry point.
Devang Patel6c74a872010-04-27 19:46:33 +00001537 Asm->OutStreamer.EmitLabel(FunctionBeginSym);
Bill Wendling2b128d72009-05-20 23:19:06 +00001538
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001539 assert(UserVariables.empty() && DbgValues.empty() && "Maps weren't cleaned");
1540
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001541 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001542 // LiveUserVar - Map physreg numbers to the MDNode they contain.
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001543 std::vector<const MDNode*> LiveUserVar(TRI->getNumRegs());
1544
Devang Patel002d54d2010-05-26 19:37:24 +00001545 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001546 I != E; ++I) {
1547 bool AtBlockEntry = true;
Devang Patel002d54d2010-05-26 19:37:24 +00001548 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
1549 II != IE; ++II) {
1550 const MachineInstr *MI = II;
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001551
Devang Patel002d54d2010-05-26 19:37:24 +00001552 if (MI->isDebugValue()) {
Nick Lewycky654f5ce2011-10-26 22:55:33 +00001553 assert(MI->getNumOperands() > 1 && "Invalid machine instruction!");
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001554
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001555 // Keep track of user variables.
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001556 const MDNode *Var =
1557 MI->getOperand(MI->getNumOperands() - 1).getMetadata();
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001558
1559 // Variable is in a register, we need to check for clobbers.
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001560 if (isDbgValueInDefinedReg(MI))
1561 LiveUserVar[MI->getOperand(0).getReg()] = Var;
1562
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001563 // Check the history of this variable.
1564 SmallVectorImpl<const MachineInstr*> &History = DbgValues[Var];
1565 if (History.empty()) {
1566 UserVariables.push_back(Var);
1567 // The first mention of a function argument gets the FunctionBeginSym
1568 // label, so arguments are visible when breaking at function entry.
1569 DIVariable DV(Var);
Manman Ren7504ed42013-07-08 18:33:29 +00001570 if (DV.isVariable() && DV.getTag() == dwarf::DW_TAG_arg_variable &&
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001571 DISubprogram(getDISubprogram(DV.getContext()))
1572 .describes(MF->getFunction()))
1573 LabelsBeforeInsn[MI] = FunctionBeginSym;
1574 } else {
1575 // We have seen this variable before. Try to coalesce DBG_VALUEs.
1576 const MachineInstr *Prev = History.back();
1577 if (Prev->isDebugValue()) {
1578 // Coalesce identical entries at the end of History.
1579 if (History.size() >= 2 &&
Devang Patelb7a328e2011-07-07 00:14:27 +00001580 Prev->isIdenticalTo(History[History.size() - 2])) {
Eric Christopher85a495e2012-10-08 20:48:49 +00001581 DEBUG(dbgs() << "Coalescing identical DBG_VALUE entries:\n"
Eric Christopher6a841382012-11-19 22:42:10 +00001582 << "\t" << *Prev
Devang Patelb7a328e2011-07-07 00:14:27 +00001583 << "\t" << *History[History.size() - 2] << "\n");
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001584 History.pop_back();
Devang Patelb7a328e2011-07-07 00:14:27 +00001585 }
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001586
1587 // Terminate old register assignments that don't reach MI;
1588 MachineFunction::const_iterator PrevMBB = Prev->getParent();
1589 if (PrevMBB != I && (!AtBlockEntry || llvm::next(PrevMBB) != I) &&
1590 isDbgValueInDefinedReg(Prev)) {
1591 // Previous register assignment needs to terminate at the end of
1592 // its basic block.
1593 MachineBasicBlock::const_iterator LastMI =
1594 PrevMBB->getLastNonDebugInstr();
Devang Patelb7a328e2011-07-07 00:14:27 +00001595 if (LastMI == PrevMBB->end()) {
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001596 // Drop DBG_VALUE for empty range.
Eric Christopher85a495e2012-10-08 20:48:49 +00001597 DEBUG(dbgs() << "Dropping DBG_VALUE for empty range:\n"
Devang Patelb7a328e2011-07-07 00:14:27 +00001598 << "\t" << *Prev << "\n");
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001599 History.pop_back();
David Blaikieea2605d2013-06-20 00:25:24 +00001600 } else if (llvm::next(PrevMBB) != PrevMBB->getParent()->end())
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001601 // Terminate after LastMI.
1602 History.push_back(LastMI);
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001603 }
1604 }
1605 }
1606 History.push_back(MI);
Devang Patel002d54d2010-05-26 19:37:24 +00001607 } else {
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001608 // Not a DBG_VALUE instruction.
1609 if (!MI->isLabel())
1610 AtBlockEntry = false;
1611
Eric Christopher133195782012-10-04 20:46:14 +00001612 // First known non-DBG_VALUE and non-frame setup location marks
1613 // the beginning of the function body.
1614 if (!MI->getFlag(MachineInstr::FrameSetup) &&
1615 (PrologEndLoc.isUnknown() && !MI->getDebugLoc().isUnknown()))
Devang Patel34a66202011-05-11 19:22:19 +00001616 PrologEndLoc = MI->getDebugLoc();
1617
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001618 // Check if the instruction clobbers any registers with debug vars.
1619 for (MachineInstr::const_mop_iterator MOI = MI->operands_begin(),
1620 MOE = MI->operands_end(); MOI != MOE; ++MOI) {
1621 if (!MOI->isReg() || !MOI->isDef() || !MOI->getReg())
1622 continue;
Jakob Stoklund Olesen54038d72012-06-01 23:28:30 +00001623 for (MCRegAliasIterator AI(MOI->getReg(), TRI, true);
1624 AI.isValid(); ++AI) {
1625 unsigned Reg = *AI;
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001626 const MDNode *Var = LiveUserVar[Reg];
1627 if (!Var)
1628 continue;
1629 // Reg is now clobbered.
1630 LiveUserVar[Reg] = 0;
1631
1632 // Was MD last defined by a DBG_VALUE referring to Reg?
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001633 DbgValueHistoryMap::iterator HistI = DbgValues.find(Var);
1634 if (HistI == DbgValues.end())
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001635 continue;
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001636 SmallVectorImpl<const MachineInstr*> &History = HistI->second;
1637 if (History.empty())
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001638 continue;
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001639 const MachineInstr *Prev = History.back();
1640 // Sanity-check: Register assignments are terminated at the end of
1641 // their block.
1642 if (!Prev->isDebugValue() || Prev->getParent() != MI->getParent())
1643 continue;
1644 // Is the variable still in Reg?
1645 if (!isDbgValueInDefinedReg(Prev) ||
1646 Prev->getOperand(0).getReg() != Reg)
1647 continue;
1648 // Var is clobbered. Make sure the next instruction gets a label.
1649 History.push_back(MI);
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001650 }
1651 }
Devang Patel002d54d2010-05-26 19:37:24 +00001652 }
Devang Patel002d54d2010-05-26 19:37:24 +00001653 }
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001654 }
1655
1656 for (DbgValueHistoryMap::iterator I = DbgValues.begin(), E = DbgValues.end();
1657 I != E; ++I) {
1658 SmallVectorImpl<const MachineInstr*> &History = I->second;
1659 if (History.empty())
1660 continue;
1661
1662 // Make sure the final register assignments are terminated.
1663 const MachineInstr *Prev = History.back();
1664 if (Prev->isDebugValue() && isDbgValueInDefinedReg(Prev)) {
1665 const MachineBasicBlock *PrevMBB = Prev->getParent();
Eric Christopher6a841382012-11-19 22:42:10 +00001666 MachineBasicBlock::const_iterator LastMI =
Devang Patel784077e2011-08-10 23:58:09 +00001667 PrevMBB->getLastNonDebugInstr();
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001668 if (LastMI == PrevMBB->end())
1669 // Drop DBG_VALUE for empty range.
1670 History.pop_back();
David Blaikieea2605d2013-06-20 00:25:24 +00001671 else if (PrevMBB != &PrevMBB->getParent()->back()) {
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001672 // Terminate after LastMI.
1673 History.push_back(LastMI);
1674 }
1675 }
1676 // Request labels for the full history.
1677 for (unsigned i = 0, e = History.size(); i != e; ++i) {
1678 const MachineInstr *MI = History[i];
1679 if (MI->isDebugValue())
1680 requestLabelBeforeInsn(MI);
1681 else
1682 requestLabelAfterInsn(MI);
1683 }
1684 }
Devang Patel002d54d2010-05-26 19:37:24 +00001685
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001686 PrevInstLoc = DebugLoc();
Devang Patel002d54d2010-05-26 19:37:24 +00001687 PrevLabel = FunctionBeginSym;
Devang Patel34a66202011-05-11 19:22:19 +00001688
1689 // Record beginning of function.
1690 if (!PrologEndLoc.isUnknown()) {
1691 DebugLoc FnStartDL = getFnDebugLoc(PrologEndLoc,
1692 MF->getFunction()->getContext());
1693 recordSourceLine(FnStartDL.getLine(), FnStartDL.getCol(),
1694 FnStartDL.getScope(MF->getFunction()->getContext()),
David Blaikie67cb31e2012-12-04 22:02:33 +00001695 // We'd like to list the prologue as "not statements" but GDB behaves
1696 // poorly if we do that. Revisit this with caution/GDB (7.5+) testing.
David Blaikie5a773bb2012-12-04 21:05:36 +00001697 DWARF2_FLAG_IS_STMT);
Devang Patel34a66202011-05-11 19:22:19 +00001698 }
Bill Wendling2b128d72009-05-20 23:19:06 +00001699}
1700
Devang Patel7e623022011-08-10 20:55:27 +00001701void DwarfDebug::addScopeVariable(LexicalScope *LS, DbgVariable *Var) {
David Blaikie6f1a8062013-06-05 05:39:59 +00001702 SmallVectorImpl<DbgVariable *> &Vars = ScopeVariables[LS];
1703 DIVariable DV = Var->getVariable();
David Blaikie36d5d2f2013-06-06 21:04:51 +00001704 // Variables with positive arg numbers are parameters.
1705 if (unsigned ArgNum = DV.getArgNumber()) {
1706 // Keep all parameters in order at the start of the variable list to ensure
1707 // function types are correct (no out-of-order parameters)
1708 //
1709 // This could be improved by only doing it for optimized builds (unoptimized
1710 // builds have the right order to begin with), searching from the back (this
1711 // would catch the unoptimized case quickly), or doing a binary search
1712 // rather than linear search.
1713 SmallVectorImpl<DbgVariable *>::iterator I = Vars.begin();
1714 while (I != Vars.end()) {
1715 unsigned CurNum = (*I)->getVariable().getArgNumber();
1716 // A local (non-parameter) variable has been found, insert immediately
1717 // before it.
1718 if (CurNum == 0)
1719 break;
1720 // A later indexed parameter has been found, insert immediately before it.
David Blaikieb272a752013-06-06 22:28:26 +00001721 if (CurNum > ArgNum)
David Blaikie36d5d2f2013-06-06 21:04:51 +00001722 break;
David Blaikieb272a752013-06-06 22:28:26 +00001723 ++I;
David Blaikie6f1a8062013-06-05 05:39:59 +00001724 }
David Blaikie36d5d2f2013-06-06 21:04:51 +00001725 Vars.insert(I, Var);
1726 return;
David Blaikie6f1a8062013-06-05 05:39:59 +00001727 }
1728
1729 Vars.push_back(Var);
Devang Patel7e623022011-08-10 20:55:27 +00001730}
1731
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001732// Gather and emit post-function debug information.
Chris Lattner76555b52010-01-26 23:18:02 +00001733void DwarfDebug::endFunction(const MachineFunction *MF) {
Devang Patel7e623022011-08-10 20:55:27 +00001734 if (!MMI->hasDebugInfo() || LScopes.empty()) return;
Devang Patel2904aa92009-11-12 19:02:56 +00001735
Devang Patel7e623022011-08-10 20:55:27 +00001736 // Define end label for subprogram.
1737 FunctionEndSym = Asm->GetTempSymbol("func_end",
1738 Asm->getFunctionNumber());
1739 // Assumes in correct section after the entry point.
1740 Asm->OutStreamer.EmitLabel(FunctionEndSym);
Manman Ren4e042a62013-02-05 21:52:47 +00001741 // Set DwarfCompileUnitID in MCContext to default value.
1742 Asm->OutStreamer.getContext().setDwarfCompileUnitID(0);
Eric Christopher6a841382012-11-19 22:42:10 +00001743
Devang Patel7e623022011-08-10 20:55:27 +00001744 SmallPtrSet<const MDNode *, 16> ProcessedVars;
1745 collectVariableInfo(MF, ProcessedVars);
Eric Christopher6a841382012-11-19 22:42:10 +00001746
Devang Patel3acc70e2011-08-15 22:04:40 +00001747 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
Devang Pateleb1bb4e2011-08-16 22:09:43 +00001748 CompileUnit *TheCU = SPMap.lookup(FnScope->getScopeNode());
Nick Lewycky654f5ce2011-10-26 22:55:33 +00001749 assert(TheCU && "Unable to find compile unit!");
Devang Patel3acc70e2011-08-15 22:04:40 +00001750
Devang Patel7e623022011-08-10 20:55:27 +00001751 // Construct abstract scopes.
Devang Patel44403472011-08-12 18:10:19 +00001752 ArrayRef<LexicalScope *> AList = LScopes.getAbstractScopesList();
1753 for (unsigned i = 0, e = AList.size(); i != e; ++i) {
1754 LexicalScope *AScope = AList[i];
1755 DISubprogram SP(AScope->getScopeNode());
Manman Ren7504ed42013-07-08 18:33:29 +00001756 if (SP.isSubprogram()) {
Devang Patel7e623022011-08-10 20:55:27 +00001757 // Collect info for variables that were optimized out.
Devang Patel59e27c52011-08-19 23:28:12 +00001758 DIArray Variables = SP.getVariables();
1759 for (unsigned i = 0, e = Variables.getNumElements(); i != e; ++i) {
1760 DIVariable DV(Variables.getElement(i));
Manman Ren7504ed42013-07-08 18:33:29 +00001761 if (!DV || !DV.isVariable() || !ProcessedVars.insert(DV))
Devang Patel59e27c52011-08-19 23:28:12 +00001762 continue;
Alexey Samsonov39602782012-07-06 08:45:08 +00001763 // Check that DbgVariable for DV wasn't created earlier, when
1764 // findAbstractVariable() was called for inlined instance of DV.
1765 LLVMContext &Ctx = DV->getContext();
1766 DIVariable CleanDV = cleanseInlinedVariable(DV, Ctx);
1767 if (AbstractVariables.lookup(CleanDV))
1768 continue;
Devang Patel59e27c52011-08-19 23:28:12 +00001769 if (LexicalScope *Scope = LScopes.findAbstractScope(DV.getContext()))
1770 addScopeVariable(Scope, new DbgVariable(DV, NULL));
Devang Patel5c0f85c2010-06-25 22:07:34 +00001771 }
1772 }
Devang Patel44403472011-08-12 18:10:19 +00001773 if (ProcessedSPNodes.count(AScope->getScopeNode()) == 0)
Manman Ren4213c392013-05-29 17:16:59 +00001774 constructScopeDIE(TheCU, AScope);
Bill Wendling2b128d72009-05-20 23:19:06 +00001775 }
Eric Christopher6a841382012-11-19 22:42:10 +00001776
Devang Patel3acc70e2011-08-15 22:04:40 +00001777 DIE *CurFnDIE = constructScopeDIE(TheCU, FnScope);
Eric Christopher6a841382012-11-19 22:42:10 +00001778
Nick Lewycky50f02cb2011-12-02 22:16:29 +00001779 if (!MF->getTarget().Options.DisableFramePointerElim(*MF))
Eric Christopherbb69a272012-08-24 01:14:27 +00001780 TheCU->addFlag(CurFnDIE, dwarf::DW_AT_APPLE_omit_frame_ptr);
Devang Patel3acc70e2011-08-15 22:04:40 +00001781
Bill Wendling2b128d72009-05-20 23:19:06 +00001782 // Clear debug info
Craig Topper2b4a2012013-07-03 04:40:27 +00001783 for (ScopeVariablesMap::iterator
Devang Patel7e623022011-08-10 20:55:27 +00001784 I = ScopeVariables.begin(), E = ScopeVariables.end(); I != E; ++I)
1785 DeleteContainerPointers(I->second);
1786 ScopeVariables.clear();
Devang Patelad45d912011-04-22 18:09:57 +00001787 DeleteContainerPointers(CurrentFnArguments);
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001788 UserVariables.clear();
1789 DbgValues.clear();
Jeffrey Yasskin35b4e4f2010-03-12 17:45:06 +00001790 AbstractVariables.clear();
Devang Patel6c74a872010-04-27 19:46:33 +00001791 LabelsBeforeInsn.clear();
1792 LabelsAfterInsn.clear();
Devang Patel12563b32010-04-16 23:33:45 +00001793 PrevLabel = NULL;
Bill Wendling2b128d72009-05-20 23:19:06 +00001794}
1795
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001796// Register a source line with debug info. Returns the unique label that was
1797// emitted and which provides correspondence to the source line list.
Devang Patel34a66202011-05-11 19:22:19 +00001798void DwarfDebug::recordSourceLine(unsigned Line, unsigned Col, const MDNode *S,
1799 unsigned Flags) {
Devang Patel2d9caf92009-11-25 17:36:49 +00001800 StringRef Fn;
Devang Patele01b75c2011-03-24 20:30:50 +00001801 StringRef Dir;
Dan Gohman50849c62010-05-05 23:41:32 +00001802 unsigned Src = 1;
1803 if (S) {
1804 DIDescriptor Scope(S);
Devang Patel2089d162009-10-05 18:03:19 +00001805
Dan Gohman50849c62010-05-05 23:41:32 +00001806 if (Scope.isCompileUnit()) {
1807 DICompileUnit CU(S);
Dan Gohman50849c62010-05-05 23:41:32 +00001808 Fn = CU.getFilename();
Devang Patele01b75c2011-03-24 20:30:50 +00001809 Dir = CU.getDirectory();
Devang Patelc4b69052010-10-28 17:30:52 +00001810 } else if (Scope.isFile()) {
1811 DIFile F(S);
Devang Patelc4b69052010-10-28 17:30:52 +00001812 Fn = F.getFilename();
Devang Patele01b75c2011-03-24 20:30:50 +00001813 Dir = F.getDirectory();
Dan Gohman50849c62010-05-05 23:41:32 +00001814 } else if (Scope.isSubprogram()) {
1815 DISubprogram SP(S);
Dan Gohman50849c62010-05-05 23:41:32 +00001816 Fn = SP.getFilename();
Devang Patele01b75c2011-03-24 20:30:50 +00001817 Dir = SP.getDirectory();
Eric Christopher6647b832011-10-11 22:59:11 +00001818 } else if (Scope.isLexicalBlockFile()) {
1819 DILexicalBlockFile DBF(S);
1820 Fn = DBF.getFilename();
1821 Dir = DBF.getDirectory();
Dan Gohman50849c62010-05-05 23:41:32 +00001822 } else if (Scope.isLexicalBlock()) {
1823 DILexicalBlock DB(S);
Dan Gohman50849c62010-05-05 23:41:32 +00001824 Fn = DB.getFilename();
Devang Patele01b75c2011-03-24 20:30:50 +00001825 Dir = DB.getDirectory();
Dan Gohman50849c62010-05-05 23:41:32 +00001826 } else
Craig Topperee4dab52012-02-05 08:31:47 +00001827 llvm_unreachable("Unexpected scope info");
Dan Gohman50849c62010-05-05 23:41:32 +00001828
Manman Ren1e427202013-03-07 01:42:00 +00001829 Src = getOrCreateSourceID(Fn, Dir,
1830 Asm->OutStreamer.getContext().getDwarfCompileUnitID());
Dan Gohman50849c62010-05-05 23:41:32 +00001831 }
Nick Lewycky019d2552011-07-29 03:49:23 +00001832 Asm->OutStreamer.EmitDwarfLocDirective(Src, Line, Col, Flags, 0, 0, Fn);
Bill Wendling2b128d72009-05-20 23:19:06 +00001833}
1834
Bill Wendling806535f2009-05-20 23:22:40 +00001835//===----------------------------------------------------------------------===//
1836// Emit Methods
1837//===----------------------------------------------------------------------===//
1838
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001839// Compute the size and offset of a DIE.
Jim Grosbach00e9c612009-11-22 19:20:36 +00001840unsigned
Eric Christopherc8a310e2012-12-10 23:34:43 +00001841DwarfUnits::computeSizeAndOffset(DIE *Die, unsigned Offset) {
Bill Wendling480ff322009-05-20 23:21:38 +00001842 // Get the children.
1843 const std::vector<DIE *> &Children = Die->getChildren();
1844
Bill Wendling480ff322009-05-20 23:21:38 +00001845 // Record the abbreviation.
Devang Patel930143b2009-11-21 02:48:08 +00001846 assignAbbrevNumber(Die->getAbbrev());
Bill Wendling480ff322009-05-20 23:21:38 +00001847
1848 // Get the abbreviation for this DIE.
1849 unsigned AbbrevNumber = Die->getAbbrevNumber();
Eric Christopherc8a310e2012-12-10 23:34:43 +00001850 const DIEAbbrev *Abbrev = Abbreviations->at(AbbrevNumber - 1);
Bill Wendling480ff322009-05-20 23:21:38 +00001851
1852 // Set DIE offset
1853 Die->setOffset(Offset);
1854
1855 // Start the size with the size of abbreviation code.
Chris Lattner7b26fce2009-08-22 20:48:53 +00001856 Offset += MCAsmInfo::getULEB128Size(AbbrevNumber);
Bill Wendling480ff322009-05-20 23:21:38 +00001857
Eric Christopher4887c8f2013-03-29 23:34:06 +00001858 const SmallVectorImpl<DIEValue*> &Values = Die->getValues();
1859 const SmallVectorImpl<DIEAbbrevData> &AbbrevData = Abbrev->getData();
Bill Wendling480ff322009-05-20 23:21:38 +00001860
1861 // Size the DIE attribute values.
1862 for (unsigned i = 0, N = Values.size(); i < N; ++i)
1863 // Size attribute value.
Chris Lattner5a00dea2010-04-05 00:18:22 +00001864 Offset += Values[i]->SizeOf(Asm, AbbrevData[i].getForm());
Bill Wendling480ff322009-05-20 23:21:38 +00001865
1866 // Size the DIE children if any.
1867 if (!Children.empty()) {
1868 assert(Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes &&
1869 "Children flag not set");
1870
1871 for (unsigned j = 0, M = Children.size(); j < M; ++j)
Eric Christopher1f0cbb82012-11-20 22:14:13 +00001872 Offset = computeSizeAndOffset(Children[j], Offset);
Bill Wendling480ff322009-05-20 23:21:38 +00001873
1874 // End of children marker.
1875 Offset += sizeof(int8_t);
1876 }
1877
1878 Die->setSize(Offset - Die->getOffset());
1879 return Offset;
1880}
1881
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001882// Compute the size and offset of all the DIEs.
Eric Christopherc8a310e2012-12-10 23:34:43 +00001883void DwarfUnits::computeSizeAndOffsets() {
Manman Ren14a029d2013-03-12 18:27:15 +00001884 // Offset from the beginning of debug info section.
Eric Christopherd1c5a312013-05-30 00:43:35 +00001885 unsigned SecOffset = 0;
Eric Christopher4887c8f2013-03-29 23:34:06 +00001886 for (SmallVectorImpl<CompileUnit *>::iterator I = CUs.begin(),
Eric Christopherc8a310e2012-12-10 23:34:43 +00001887 E = CUs.end(); I != E; ++I) {
Eric Christopherd1c5a312013-05-30 00:43:35 +00001888 (*I)->setDebugInfoOffset(SecOffset);
Eric Christopher9c2ecd92012-11-30 23:59:06 +00001889 unsigned Offset =
1890 sizeof(int32_t) + // Length of Compilation Unit Info
1891 sizeof(int16_t) + // DWARF version number
1892 sizeof(int32_t) + // Offset Into Abbrev. Section
1893 sizeof(int8_t); // Pointer Size (in bytes)
1894
Manman Ren14a029d2013-03-12 18:27:15 +00001895 unsigned EndOffset = computeSizeAndOffset((*I)->getCUDie(), Offset);
Eric Christopherd1c5a312013-05-30 00:43:35 +00001896 SecOffset += EndOffset;
Devang Patel1a0df9a2010-05-10 22:49:55 +00001897 }
Bill Wendling480ff322009-05-20 23:21:38 +00001898}
1899
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001900// Emit initial Dwarf sections with a label at the start of each one.
Eric Christopher7b30f2e42012-11-21 00:34:35 +00001901void DwarfDebug::emitSectionLabels() {
Chris Lattner4b7dadb2009-08-19 05:49:37 +00001902 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
Daniel Dunbarc418d6b2009-09-19 20:40:05 +00001903
Bill Wendling480ff322009-05-20 23:21:38 +00001904 // Dwarf sections base addresses.
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001905 DwarfInfoSectionSym =
Eric Christopher7b30f2e42012-11-21 00:34:35 +00001906 emitSectionSym(Asm, TLOF.getDwarfInfoSection(), "section_info");
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001907 DwarfAbbrevSectionSym =
Eric Christopher7b30f2e42012-11-21 00:34:35 +00001908 emitSectionSym(Asm, TLOF.getDwarfAbbrevSection(), "section_abbrev");
Eric Christopher3c5a1912012-12-19 22:02:53 +00001909 if (useSplitDwarf())
1910 DwarfAbbrevDWOSectionSym =
1911 emitSectionSym(Asm, TLOF.getDwarfAbbrevDWOSection(),
1912 "section_abbrev_dwo");
Eric Christopher7b30f2e42012-11-21 00:34:35 +00001913 emitSectionSym(Asm, TLOF.getDwarfARangesSection());
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001914
Chris Lattner6629ca92010-04-04 22:59:04 +00001915 if (const MCSection *MacroInfo = TLOF.getDwarfMacroInfoSection())
Eric Christopher7b30f2e42012-11-21 00:34:35 +00001916 emitSectionSym(Asm, MacroInfo);
Bill Wendling480ff322009-05-20 23:21:38 +00001917
Eric Christopher74804332013-02-07 21:19:50 +00001918 DwarfLineSectionSym =
1919 emitSectionSym(Asm, TLOF.getDwarfLineSection(), "section_line");
Eric Christopher7b30f2e42012-11-21 00:34:35 +00001920 emitSectionSym(Asm, TLOF.getDwarfLocSection());
Michael Gottesmanc89466f2013-09-04 04:39:38 +00001921 if (HasDwarfPubSections) {
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00001922 emitSectionSym(Asm, TLOF.getDwarfPubNamesSection());
Eric Christopherbf1ea3c2013-08-26 23:24:31 +00001923 emitSectionSym(Asm, TLOF.getDwarfPubTypesSection());
Michael Gottesmanc89466f2013-09-04 04:39:38 +00001924 }
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001925 DwarfStrSectionSym =
Eric Christopher3bf29fd2012-12-27 02:14:01 +00001926 emitSectionSym(Asm, TLOF.getDwarfStrSection(), "info_string");
Eric Christopher55863be2013-04-07 03:43:09 +00001927 if (useSplitDwarf()) {
Eric Christopher3bf29fd2012-12-27 02:14:01 +00001928 DwarfStrDWOSectionSym =
1929 emitSectionSym(Asm, TLOF.getDwarfStrDWOSection(), "skel_string");
Eric Christopher55863be2013-04-07 03:43:09 +00001930 DwarfAddrSectionSym =
1931 emitSectionSym(Asm, TLOF.getDwarfAddrSection(), "addr_sec");
1932 }
Eric Christopher7b30f2e42012-11-21 00:34:35 +00001933 DwarfDebugRangeSectionSym = emitSectionSym(Asm, TLOF.getDwarfRangesSection(),
Devang Patel12563b32010-04-16 23:33:45 +00001934 "debug_range");
Bill Wendling480ff322009-05-20 23:21:38 +00001935
Eric Christopher7b30f2e42012-11-21 00:34:35 +00001936 DwarfDebugLocSectionSym = emitSectionSym(Asm, TLOF.getDwarfLocSection(),
Devang Patel9fc11702010-05-25 23:40:22 +00001937 "section_debug_loc");
1938
Eric Christopher7b30f2e42012-11-21 00:34:35 +00001939 TextSectionSym = emitSectionSym(Asm, TLOF.getTextSection(), "text_begin");
1940 emitSectionSym(Asm, TLOF.getDataSection());
Bill Wendling480ff322009-05-20 23:21:38 +00001941}
1942
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001943// Recursively emits a debug information entry.
Eric Christopher3c5a1912012-12-19 22:02:53 +00001944void DwarfDebug::emitDIE(DIE *Die, std::vector<DIEAbbrev *> *Abbrevs) {
Bill Wendling480ff322009-05-20 23:21:38 +00001945 // Get the abbreviation for this DIE.
1946 unsigned AbbrevNumber = Die->getAbbrevNumber();
Eric Christopher3c5a1912012-12-19 22:02:53 +00001947 const DIEAbbrev *Abbrev = Abbrevs->at(AbbrevNumber - 1);
Bill Wendling480ff322009-05-20 23:21:38 +00001948
Bill Wendling480ff322009-05-20 23:21:38 +00001949 // Emit the code (index) for the abbreviation.
Chris Lattner7bde8c02010-04-04 18:52:31 +00001950 if (Asm->isVerbose())
Chris Lattnerfa823552010-01-22 23:18:42 +00001951 Asm->OutStreamer.AddComment("Abbrev [" + Twine(AbbrevNumber) + "] 0x" +
1952 Twine::utohexstr(Die->getOffset()) + ":0x" +
1953 Twine::utohexstr(Die->getSize()) + " " +
1954 dwarf::TagString(Abbrev->getTag()));
Chris Lattner9efd1182010-04-04 19:09:29 +00001955 Asm->EmitULEB128(AbbrevNumber);
Bill Wendling480ff322009-05-20 23:21:38 +00001956
Eric Christopher4887c8f2013-03-29 23:34:06 +00001957 const SmallVectorImpl<DIEValue*> &Values = Die->getValues();
1958 const SmallVectorImpl<DIEAbbrevData> &AbbrevData = Abbrev->getData();
Bill Wendling480ff322009-05-20 23:21:38 +00001959
1960 // Emit the DIE attribute values.
1961 for (unsigned i = 0, N = Values.size(); i < N; ++i) {
1962 unsigned Attr = AbbrevData[i].getAttribute();
1963 unsigned Form = AbbrevData[i].getForm();
1964 assert(Form && "Too many attributes for DIE (check abbreviation)");
1965
Chris Lattner7bde8c02010-04-04 18:52:31 +00001966 if (Asm->isVerbose())
Chris Lattner5adf9872010-01-24 18:54:17 +00001967 Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr));
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001968
Bill Wendling480ff322009-05-20 23:21:38 +00001969 switch (Attr) {
Bill Wendling480ff322009-05-20 23:21:38 +00001970 case dwarf::DW_AT_abstract_origin: {
1971 DIEEntry *E = cast<DIEEntry>(Values[i]);
1972 DIE *Origin = E->getEntry();
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001973 unsigned Addr = Origin->getOffset();
Manman Ren14a029d2013-03-12 18:27:15 +00001974 if (Form == dwarf::DW_FORM_ref_addr) {
1975 // For DW_FORM_ref_addr, output the offset from beginning of debug info
1976 // section. Origin->getOffset() returns the offset from start of the
1977 // compile unit.
1978 DwarfUnits &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
1979 Addr += Holder.getCUOffset(Origin->getCompileUnit());
1980 }
Manman Renac8062b2013-07-02 23:40:10 +00001981 Asm->OutStreamer.EmitIntValue(Addr,
1982 Form == dwarf::DW_FORM_ref_addr ? DIEEntry::getRefAddrSize(Asm) : 4);
Bill Wendling480ff322009-05-20 23:21:38 +00001983 break;
1984 }
Devang Patel12563b32010-04-16 23:33:45 +00001985 case dwarf::DW_AT_ranges: {
1986 // DW_AT_range Value encodes offset in debug_range section.
1987 DIEInteger *V = cast<DIEInteger>(Values[i]);
Devang Patelda3ef852010-09-02 16:43:44 +00001988
Nick Lewycky33da3362012-06-22 01:25:12 +00001989 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections()) {
Devang Patelda3ef852010-09-02 16:43:44 +00001990 Asm->EmitLabelPlusOffset(DwarfDebugRangeSectionSym,
1991 V->getValue(),
1992 4);
1993 } else {
1994 Asm->EmitLabelOffsetDifference(DwarfDebugRangeSectionSym,
1995 V->getValue(),
1996 DwarfDebugRangeSectionSym,
1997 4);
1998 }
Devang Patel12563b32010-04-16 23:33:45 +00001999 break;
2000 }
Devang Patel9fc11702010-05-25 23:40:22 +00002001 case dwarf::DW_AT_location: {
Nick Lewycky33da3362012-06-22 01:25:12 +00002002 if (DIELabel *L = dyn_cast<DIELabel>(Values[i])) {
2003 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
Ulrich Weigand396ba8b2013-07-02 18:46:26 +00002004 Asm->EmitLabelReference(L->getValue(), 4);
Nick Lewycky33da3362012-06-22 01:25:12 +00002005 else
Ulrich Weigand396ba8b2013-07-02 18:46:26 +00002006 Asm->EmitLabelDifference(L->getValue(), DwarfDebugLocSectionSym, 4);
Nick Lewycky33da3362012-06-22 01:25:12 +00002007 } else {
Devang Patel9fc11702010-05-25 23:40:22 +00002008 Values[i]->EmitValue(Asm, Form);
Nick Lewycky33da3362012-06-22 01:25:12 +00002009 }
Devang Patel9fc11702010-05-25 23:40:22 +00002010 break;
2011 }
Devang Patela1bd5a12010-09-29 19:08:08 +00002012 case dwarf::DW_AT_accessibility: {
2013 if (Asm->isVerbose()) {
2014 DIEInteger *V = cast<DIEInteger>(Values[i]);
2015 Asm->OutStreamer.AddComment(dwarf::AccessibilityString(V->getValue()));
2016 }
2017 Values[i]->EmitValue(Asm, Form);
2018 break;
2019 }
Bill Wendling480ff322009-05-20 23:21:38 +00002020 default:
2021 // Emit an attribute using the defined form.
Chris Lattner3a383cb2010-04-05 00:13:49 +00002022 Values[i]->EmitValue(Asm, Form);
Bill Wendling480ff322009-05-20 23:21:38 +00002023 break;
2024 }
Bill Wendling480ff322009-05-20 23:21:38 +00002025 }
2026
2027 // Emit the DIE children if any.
2028 if (Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes) {
2029 const std::vector<DIE *> &Children = Die->getChildren();
2030
2031 for (unsigned j = 0, M = Children.size(); j < M; ++j)
Eric Christopher3c5a1912012-12-19 22:02:53 +00002032 emitDIE(Children[j], Abbrevs);
Bill Wendling480ff322009-05-20 23:21:38 +00002033
Chris Lattner7bde8c02010-04-04 18:52:31 +00002034 if (Asm->isVerbose())
Chris Lattner566cae92010-03-09 23:52:58 +00002035 Asm->OutStreamer.AddComment("End Of Children Mark");
2036 Asm->EmitInt8(0);
Bill Wendling480ff322009-05-20 23:21:38 +00002037 }
2038}
2039
Eric Christophera2de8262012-12-15 00:04:07 +00002040// Emit the various dwarf units to the unit section USection with
2041// the abbreviations going into ASection.
2042void DwarfUnits::emitUnits(DwarfDebug *DD,
2043 const MCSection *USection,
2044 const MCSection *ASection,
2045 const MCSymbol *ASectionSym) {
2046 Asm->OutStreamer.SwitchSection(USection);
Eric Christopher4887c8f2013-03-29 23:34:06 +00002047 for (SmallVectorImpl<CompileUnit *>::iterator I = CUs.begin(),
Eric Christophera2de8262012-12-15 00:04:07 +00002048 E = CUs.end(); I != E; ++I) {
2049 CompileUnit *TheCU = *I;
Devang Patel1a0df9a2010-05-10 22:49:55 +00002050 DIE *Die = TheCU->getCUDie();
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002051
Devang Patel1a0df9a2010-05-10 22:49:55 +00002052 // Emit the compile units header.
Eric Christophera2de8262012-12-15 00:04:07 +00002053 Asm->OutStreamer
2054 .EmitLabel(Asm->GetTempSymbol(USection->getLabelBeginName(),
2055 TheCU->getUniqueID()));
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002056
Devang Patel1a0df9a2010-05-10 22:49:55 +00002057 // Emit size of content not including length itself
2058 unsigned ContentSize = Die->getSize() +
2059 sizeof(int16_t) + // DWARF version number
2060 sizeof(int32_t) + // Offset Into Abbrev. Section
Devang Patele141234942011-04-13 19:41:17 +00002061 sizeof(int8_t); // Pointer Size (in bytes)
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002062
Devang Patel1a0df9a2010-05-10 22:49:55 +00002063 Asm->OutStreamer.AddComment("Length of Compilation Unit Info");
2064 Asm->EmitInt32(ContentSize);
2065 Asm->OutStreamer.AddComment("DWARF version number");
Manman Renac8062b2013-07-02 23:40:10 +00002066 Asm->EmitInt16(DD->getDwarfVersion());
Devang Patel1a0df9a2010-05-10 22:49:55 +00002067 Asm->OutStreamer.AddComment("Offset Into Abbrev. Section");
Eric Christophera2de8262012-12-15 00:04:07 +00002068 Asm->EmitSectionOffset(Asm->GetTempSymbol(ASection->getLabelBeginName()),
2069 ASectionSym);
Devang Patel1a0df9a2010-05-10 22:49:55 +00002070 Asm->OutStreamer.AddComment("Address Size (in bytes)");
Chandler Carruth5da3f052012-11-01 09:14:31 +00002071 Asm->EmitInt8(Asm->getDataLayout().getPointerSize());
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002072
Eric Christopher3c5a1912012-12-19 22:02:53 +00002073 DD->emitDIE(Die, Abbreviations);
Eric Christophera2de8262012-12-15 00:04:07 +00002074 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol(USection->getLabelEndName(),
Eli Benderskyb42d1462012-12-03 18:45:45 +00002075 TheCU->getUniqueID()));
Devang Patel1a0df9a2010-05-10 22:49:55 +00002076 }
Bill Wendling480ff322009-05-20 23:21:38 +00002077}
2078
Manman Ren14a029d2013-03-12 18:27:15 +00002079/// For a given compile unit DIE, returns offset from beginning of debug info.
2080unsigned DwarfUnits::getCUOffset(DIE *Die) {
Manman Ren11fec382013-03-13 18:41:27 +00002081 assert(Die->getTag() == dwarf::DW_TAG_compile_unit &&
2082 "Input DIE should be compile unit in getCUOffset.");
Eric Christopherd25f7fc2013-08-08 01:41:05 +00002083 for (SmallVectorImpl<CompileUnit *>::iterator I = CUs.begin(), E = CUs.end();
2084 I != E; ++I) {
Manman Ren14a029d2013-03-12 18:27:15 +00002085 CompileUnit *TheCU = *I;
2086 if (TheCU->getCUDie() == Die)
2087 return TheCU->getDebugInfoOffset();
2088 }
Manman Ren11fec382013-03-13 18:41:27 +00002089 llvm_unreachable("The compile unit DIE should belong to CUs in DwarfUnits.");
Manman Ren14a029d2013-03-12 18:27:15 +00002090}
2091
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002092// Emit the debug info section.
2093void DwarfDebug::emitDebugInfo() {
Eric Christophera2de8262012-12-15 00:04:07 +00002094 DwarfUnits &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
2095
2096 Holder.emitUnits(this, Asm->getObjFileLowering().getDwarfInfoSection(),
2097 Asm->getObjFileLowering().getDwarfAbbrevSection(),
2098 DwarfAbbrevSectionSym);
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002099}
2100
Eric Christopheracdcbdb2012-11-27 22:43:45 +00002101// Emit the abbreviation section.
Eric Christopher38371952012-11-20 23:30:11 +00002102void DwarfDebug::emitAbbreviations() {
Eric Christopher3c5a1912012-12-19 22:02:53 +00002103 if (!useSplitDwarf())
2104 emitAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevSection(),
2105 &Abbreviations);
2106 else
2107 emitSkeletonAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevSection());
2108}
Bill Wendling480ff322009-05-20 23:21:38 +00002109
Eric Christopher3c5a1912012-12-19 22:02:53 +00002110void DwarfDebug::emitAbbrevs(const MCSection *Section,
2111 std::vector<DIEAbbrev *> *Abbrevs) {
2112 // Check to see if it is worth the effort.
2113 if (!Abbrevs->empty()) {
2114 // Start the debug abbrev section.
2115 Asm->OutStreamer.SwitchSection(Section);
2116
2117 MCSymbol *Begin = Asm->GetTempSymbol(Section->getLabelBeginName());
Eric Christopher996b2b72012-12-13 03:00:38 +00002118 Asm->OutStreamer.EmitLabel(Begin);
Bill Wendling480ff322009-05-20 23:21:38 +00002119
2120 // For each abbrevation.
Eric Christopher3c5a1912012-12-19 22:02:53 +00002121 for (unsigned i = 0, N = Abbrevs->size(); i < N; ++i) {
Bill Wendling480ff322009-05-20 23:21:38 +00002122 // Get abbreviation data
Eric Christopher3c5a1912012-12-19 22:02:53 +00002123 const DIEAbbrev *Abbrev = Abbrevs->at(i);
Bill Wendling480ff322009-05-20 23:21:38 +00002124
2125 // Emit the abbrevations code (base 1 index.)
Chris Lattner9efd1182010-04-04 19:09:29 +00002126 Asm->EmitULEB128(Abbrev->getNumber(), "Abbreviation Code");
Bill Wendling480ff322009-05-20 23:21:38 +00002127
2128 // Emit the abbreviations data.
Chris Lattner3a383cb2010-04-05 00:13:49 +00002129 Abbrev->Emit(Asm);
Bill Wendling480ff322009-05-20 23:21:38 +00002130 }
2131
2132 // Mark end of abbreviations.
Chris Lattner9efd1182010-04-04 19:09:29 +00002133 Asm->EmitULEB128(0, "EOM(3)");
Bill Wendling480ff322009-05-20 23:21:38 +00002134
Eric Christopher3c5a1912012-12-19 22:02:53 +00002135 MCSymbol *End = Asm->GetTempSymbol(Section->getLabelEndName());
Eric Christopher996b2b72012-12-13 03:00:38 +00002136 Asm->OutStreamer.EmitLabel(End);
Bill Wendling480ff322009-05-20 23:21:38 +00002137 }
2138}
2139
Eric Christopheracdcbdb2012-11-27 22:43:45 +00002140// Emit the last address of the section and the end of the line matrix.
Devang Patel930143b2009-11-21 02:48:08 +00002141void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) {
Bill Wendling480ff322009-05-20 23:21:38 +00002142 // Define last address of section.
Chris Lattner566cae92010-03-09 23:52:58 +00002143 Asm->OutStreamer.AddComment("Extended Op");
2144 Asm->EmitInt8(0);
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002145
Chris Lattner566cae92010-03-09 23:52:58 +00002146 Asm->OutStreamer.AddComment("Op size");
Chandler Carruth5da3f052012-11-01 09:14:31 +00002147 Asm->EmitInt8(Asm->getDataLayout().getPointerSize() + 1);
Chris Lattner566cae92010-03-09 23:52:58 +00002148 Asm->OutStreamer.AddComment("DW_LNE_set_address");
2149 Asm->EmitInt8(dwarf::DW_LNE_set_address);
2150
2151 Asm->OutStreamer.AddComment("Section end label");
Chris Lattnerb245dfb2010-03-10 01:17:49 +00002152
Chris Lattnera179b522010-04-04 19:25:43 +00002153 Asm->OutStreamer.EmitSymbolValue(Asm->GetTempSymbol("section_end",SectionEnd),
Eric Christopherce0cfce2013-01-09 01:35:34 +00002154 Asm->getDataLayout().getPointerSize());
Bill Wendling480ff322009-05-20 23:21:38 +00002155
2156 // Mark end of matrix.
Chris Lattner566cae92010-03-09 23:52:58 +00002157 Asm->OutStreamer.AddComment("DW_LNE_end_sequence");
2158 Asm->EmitInt8(0);
Chris Lattnerf5c834f2010-01-22 22:09:00 +00002159 Asm->EmitInt8(1);
Chris Lattnerfa823552010-01-22 23:18:42 +00002160 Asm->EmitInt8(1);
Bill Wendling480ff322009-05-20 23:21:38 +00002161}
2162
Eric Christopheracdcbdb2012-11-27 22:43:45 +00002163// Emit visible names into a hashed accelerator table section.
Eric Christopher4996c702011-11-07 09:24:32 +00002164void DwarfDebug::emitAccelNames() {
Eric Christophercf7289f2013-09-05 18:20:16 +00002165 DwarfAccelTable AT(DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset,
Eric Christopher4996c702011-11-07 09:24:32 +00002166 dwarf::DW_FORM_data4));
2167 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2168 E = CUMap.end(); I != E; ++I) {
2169 CompileUnit *TheCU = I->second;
Eric Christopherd9843b32011-11-10 19:25:34 +00002170 const StringMap<std::vector<DIE*> > &Names = TheCU->getAccelNames();
2171 for (StringMap<std::vector<DIE*> >::const_iterator
Eric Christopher4996c702011-11-07 09:24:32 +00002172 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
Benjamin Kramer63e39eb2013-05-11 18:24:28 +00002173 StringRef Name = GI->getKey();
Eric Christopher090fcc12012-01-06 23:03:34 +00002174 const std::vector<DIE *> &Entities = GI->second;
Eric Christopherd9843b32011-11-10 19:25:34 +00002175 for (std::vector<DIE *>::const_iterator DI = Entities.begin(),
2176 DE = Entities.end(); DI != DE; ++DI)
2177 AT.AddName(Name, (*DI));
Eric Christopher4996c702011-11-07 09:24:32 +00002178 }
2179 }
2180
2181 AT.FinalizeTable(Asm, "Names");
2182 Asm->OutStreamer.SwitchSection(
2183 Asm->getObjFileLowering().getDwarfAccelNamesSection());
2184 MCSymbol *SectionBegin = Asm->GetTempSymbol("names_begin");
2185 Asm->OutStreamer.EmitLabel(SectionBegin);
2186
2187 // Emit the full data.
Eric Christophere698f532012-12-20 21:58:36 +00002188 AT.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher4996c702011-11-07 09:24:32 +00002189}
2190
Eric Christopher48fef592012-12-20 21:58:40 +00002191// Emit objective C classes and categories into a hashed accelerator table
2192// section.
Eric Christopher4996c702011-11-07 09:24:32 +00002193void DwarfDebug::emitAccelObjC() {
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;
2199 const StringMap<std::vector<DIE*> > &Names = TheCU->getAccelObjC();
2200 for (StringMap<std::vector<DIE*> >::const_iterator
2201 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
Benjamin 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 Christopher4996c702011-11-07 09:24:32 +00002204 for (std::vector<DIE *>::const_iterator DI = Entities.begin(),
2205 DE = Entities.end(); DI != DE; ++DI)
2206 AT.AddName(Name, (*DI));
2207 }
2208 }
2209
2210 AT.FinalizeTable(Asm, "ObjC");
2211 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering()
2212 .getDwarfAccelObjCSection());
2213 MCSymbol *SectionBegin = Asm->GetTempSymbol("objc_begin");
2214 Asm->OutStreamer.EmitLabel(SectionBegin);
2215
2216 // Emit the full data.
Eric 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 namespace dies into a hashed accelerator table.
Eric Christopher4996c702011-11-07 09:24:32 +00002221void DwarfDebug::emitAccelNamespaces() {
Eric Christophercf7289f2013-09-05 18:20:16 +00002222 DwarfAccelTable AT(DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset,
Eric Christopher4996c702011-11-07 09:24:32 +00002223 dwarf::DW_FORM_data4));
2224 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2225 E = CUMap.end(); I != E; ++I) {
2226 CompileUnit *TheCU = I->second;
Eric Christopher66b37db2011-11-10 21:47:55 +00002227 const StringMap<std::vector<DIE*> > &Names = TheCU->getAccelNamespace();
2228 for (StringMap<std::vector<DIE*> >::const_iterator
Eric Christopher4996c702011-11-07 09:24:32 +00002229 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
Benjamin Kramer63e39eb2013-05-11 18:24:28 +00002230 StringRef Name = GI->getKey();
Eric Christopher090fcc12012-01-06 23:03:34 +00002231 const std::vector<DIE *> &Entities = GI->second;
Eric Christopher66b37db2011-11-10 21:47:55 +00002232 for (std::vector<DIE *>::const_iterator DI = Entities.begin(),
2233 DE = Entities.end(); DI != DE; ++DI)
2234 AT.AddName(Name, (*DI));
Eric Christopher4996c702011-11-07 09:24:32 +00002235 }
2236 }
2237
2238 AT.FinalizeTable(Asm, "namespac");
2239 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering()
2240 .getDwarfAccelNamespaceSection());
2241 MCSymbol *SectionBegin = Asm->GetTempSymbol("namespac_begin");
2242 Asm->OutStreamer.EmitLabel(SectionBegin);
2243
2244 // Emit the full data.
Eric Christophere698f532012-12-20 21:58:36 +00002245 AT.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher4996c702011-11-07 09:24:32 +00002246}
2247
Eric Christopheracdcbdb2012-11-27 22:43:45 +00002248// Emit type dies into a hashed accelerator table.
Eric Christopher4996c702011-11-07 09:24:32 +00002249void DwarfDebug::emitAccelTypes() {
Eric Christopher21bde872012-01-06 04:35:23 +00002250 std::vector<DwarfAccelTable::Atom> Atoms;
Eric Christophercf7289f2013-09-05 18:20:16 +00002251 Atoms.push_back(DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset,
Eric Christopher21bde872012-01-06 04:35:23 +00002252 dwarf::DW_FORM_data4));
Eric Christophercf7289f2013-09-05 18:20:16 +00002253 Atoms.push_back(DwarfAccelTable::Atom(dwarf::DW_ATOM_die_tag,
Eric Christopher21bde872012-01-06 04:35:23 +00002254 dwarf::DW_FORM_data2));
Eric Christophercf7289f2013-09-05 18:20:16 +00002255 Atoms.push_back(DwarfAccelTable::Atom(dwarf::DW_ATOM_type_flags,
Eric Christopher21bde872012-01-06 04:35:23 +00002256 dwarf::DW_FORM_data1));
2257 DwarfAccelTable AT(Atoms);
Eric Christopher4996c702011-11-07 09:24:32 +00002258 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2259 E = CUMap.end(); I != E; ++I) {
2260 CompileUnit *TheCU = I->second;
Eric Christopher21bde872012-01-06 04:35:23 +00002261 const StringMap<std::vector<std::pair<DIE*, unsigned > > > &Names
2262 = TheCU->getAccelTypes();
2263 for (StringMap<std::vector<std::pair<DIE*, unsigned> > >::const_iterator
Eric Christopher4996c702011-11-07 09:24:32 +00002264 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
Benjamin Kramer63e39eb2013-05-11 18:24:28 +00002265 StringRef Name = GI->getKey();
Eric Christopher090fcc12012-01-06 23:03:34 +00002266 const std::vector<std::pair<DIE *, unsigned> > &Entities = GI->second;
Eric Christopher21bde872012-01-06 04:35:23 +00002267 for (std::vector<std::pair<DIE *, unsigned> >::const_iterator DI
2268 = Entities.begin(), DE = Entities.end(); DI !=DE; ++DI)
2269 AT.AddName(Name, (*DI).first, (*DI).second);
Eric Christopher4996c702011-11-07 09:24:32 +00002270 }
2271 }
2272
2273 AT.FinalizeTable(Asm, "types");
2274 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering()
2275 .getDwarfAccelTypesSection());
2276 MCSymbol *SectionBegin = Asm->GetTempSymbol("types_begin");
2277 Asm->OutStreamer.EmitLabel(SectionBegin);
2278
2279 // Emit the full data.
Eric Christophere698f532012-12-20 21:58:36 +00002280 AT.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher4996c702011-11-07 09:24:32 +00002281}
2282
Eric Christopher5f93bb92013-09-09 20:03:17 +00002283/// emitDebugPubNames - Emit visible names into a debug pubnames section.
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00002284///
Eric Christopher5f93bb92013-09-09 20:03:17 +00002285void DwarfDebug::emitDebugPubNames() {
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00002286 const MCSection *ISec = Asm->getObjFileLowering().getDwarfInfoSection();
Eric Christopher13b99d22013-09-10 21:49:37 +00002287 const MCSection *PSec = Asm->getObjFileLowering().getDwarfPubNamesSection();
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00002288
2289 typedef DenseMap<const MDNode*, CompileUnit*> CUMapType;
2290 for (CUMapType::iterator I = CUMap.begin(), E = CUMap.end(); I != E; ++I) {
2291 CompileUnit *TheCU = I->second;
2292 unsigned ID = TheCU->getUniqueID();
2293
2294 if (TheCU->getGlobalNames().empty())
2295 continue;
2296
2297 // Start the dwarf pubnames section.
Eric Christopher13b99d22013-09-10 21:49:37 +00002298 Asm->OutStreamer.SwitchSection(PSec);
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00002299
2300 Asm->OutStreamer.AddComment("Length of Public Names Info");
2301 Asm->EmitLabelDifference(Asm->GetTempSymbol("pubnames_end", ID),
2302 Asm->GetTempSymbol("pubnames_begin", ID), 4);
2303
2304 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_begin", ID));
2305
2306 Asm->OutStreamer.AddComment("DWARF Version");
David Majnemered89b5c2013-08-21 06:13:34 +00002307 Asm->EmitInt16(dwarf::DW_PUBNAMES_VERSION);
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00002308
2309 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
2310 Asm->EmitSectionOffset(Asm->GetTempSymbol(ISec->getLabelBeginName(), ID),
2311 DwarfInfoSectionSym);
2312
2313 Asm->OutStreamer.AddComment("Compilation Unit Length");
2314 Asm->EmitLabelDifference(Asm->GetTempSymbol(ISec->getLabelEndName(), ID),
2315 Asm->GetTempSymbol(ISec->getLabelBeginName(), ID),
2316 4);
2317
2318 const StringMap<DIE*> &Globals = TheCU->getGlobalNames();
2319 for (StringMap<DIE*>::const_iterator
2320 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2321 const char *Name = GI->getKeyData();
2322 const DIE *Entity = GI->second;
2323
2324 Asm->OutStreamer.AddComment("DIE offset");
2325 Asm->EmitInt32(Entity->getOffset());
2326
2327 if (Asm->isVerbose())
2328 Asm->OutStreamer.AddComment("External Name");
Rafael Espindola64e1af82013-07-02 15:49:13 +00002329 Asm->OutStreamer.EmitBytes(StringRef(Name, GI->getKeyLength()+1));
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00002330 }
2331
2332 Asm->OutStreamer.AddComment("End Mark");
2333 Asm->EmitInt32(0);
2334 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_end", ID));
2335 }
2336}
2337
Devang Patel04d2f2d2009-11-24 01:14:22 +00002338void DwarfDebug::emitDebugPubTypes() {
Devang Patel1a0df9a2010-05-10 22:49:55 +00002339 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2340 E = CUMap.end(); I != E; ++I) {
2341 CompileUnit *TheCU = I->second;
Eric Christopher6abc9c52011-11-07 09:18:35 +00002342 // Start the dwarf pubtypes section.
Devang Patel1a0df9a2010-05-10 22:49:55 +00002343 Asm->OutStreamer.SwitchSection(
2344 Asm->getObjFileLowering().getDwarfPubTypesSection());
2345 Asm->OutStreamer.AddComment("Length of Public Types Info");
2346 Asm->EmitLabelDifference(
Eli Benderskyb42d1462012-12-03 18:45:45 +00002347 Asm->GetTempSymbol("pubtypes_end", TheCU->getUniqueID()),
2348 Asm->GetTempSymbol("pubtypes_begin", TheCU->getUniqueID()), 4);
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002349
Devang Patel1a0df9a2010-05-10 22:49:55 +00002350 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_begin",
Eli Benderskyb42d1462012-12-03 18:45:45 +00002351 TheCU->getUniqueID()));
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002352
Devang Patel1a0df9a2010-05-10 22:49:55 +00002353 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DWARF Version");
David Majnemered89b5c2013-08-21 06:13:34 +00002354 Asm->EmitInt16(dwarf::DW_PUBTYPES_VERSION);
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002355
Devang Patel1a0df9a2010-05-10 22:49:55 +00002356 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
Eric Christopher16485a52012-12-15 00:04:04 +00002357 const MCSection *ISec = Asm->getObjFileLowering().getDwarfInfoSection();
2358 Asm->EmitSectionOffset(Asm->GetTempSymbol(ISec->getLabelBeginName(),
Eli Benderskyb42d1462012-12-03 18:45:45 +00002359 TheCU->getUniqueID()),
Devang Patel1a0df9a2010-05-10 22:49:55 +00002360 DwarfInfoSectionSym);
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002361
Devang Patel1a0df9a2010-05-10 22:49:55 +00002362 Asm->OutStreamer.AddComment("Compilation Unit Length");
Eric Christopher16485a52012-12-15 00:04:04 +00002363 Asm->EmitLabelDifference(Asm->GetTempSymbol(ISec->getLabelEndName(),
Eli Benderskyb42d1462012-12-03 18:45:45 +00002364 TheCU->getUniqueID()),
Eric Christopher16485a52012-12-15 00:04:04 +00002365 Asm->GetTempSymbol(ISec->getLabelBeginName(),
Eli Benderskyb42d1462012-12-03 18:45:45 +00002366 TheCU->getUniqueID()),
Devang Patel1a0df9a2010-05-10 22:49:55 +00002367 4);
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002368
Devang Patel1a0df9a2010-05-10 22:49:55 +00002369 const StringMap<DIE*> &Globals = TheCU->getGlobalTypes();
2370 for (StringMap<DIE*>::const_iterator
2371 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2372 const char *Name = GI->getKeyData();
Nick Lewycky019d2552011-07-29 03:49:23 +00002373 DIE *Entity = GI->second;
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002374
Devang Patel1a0df9a2010-05-10 22:49:55 +00002375 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
2376 Asm->EmitInt32(Entity->getOffset());
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002377
Devang Patel1a0df9a2010-05-10 22:49:55 +00002378 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("External Name");
Benjamin Kramer966ed1b2011-11-09 18:16:11 +00002379 // Emit the name with a terminating null byte.
Eric Christophere3ab3d02013-01-09 01:57:54 +00002380 Asm->OutStreamer.EmitBytes(StringRef(Name, GI->getKeyLength()+1));
Devang Patel1a0df9a2010-05-10 22:49:55 +00002381 }
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002382
Devang Patel1a0df9a2010-05-10 22:49:55 +00002383 Asm->OutStreamer.AddComment("End Mark");
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002384 Asm->EmitInt32(0);
Devang Patel1a0df9a2010-05-10 22:49:55 +00002385 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_end",
Eli Benderskyb42d1462012-12-03 18:45:45 +00002386 TheCU->getUniqueID()));
Devang Patel04d2f2d2009-11-24 01:14:22 +00002387 }
Devang Patel04d2f2d2009-11-24 01:14:22 +00002388}
2389
Eric Christopher3bf29fd2012-12-27 02:14:01 +00002390// Emit strings into a string section.
Eric Christopher2cbd5762013-01-07 19:32:41 +00002391void DwarfUnits::emitStrings(const MCSection *StrSection,
2392 const MCSection *OffsetSection = NULL,
2393 const MCSymbol *StrSecSym = NULL) {
Eric Christopher3bf29fd2012-12-27 02:14:01 +00002394
Eric Christopher27614582013-01-08 22:22:06 +00002395 if (StringPool.empty()) return;
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002396
Chris Lattner3d72a672010-03-09 23:38:23 +00002397 // Start the dwarf str section.
Eric Christopher2cbd5762013-01-07 19:32:41 +00002398 Asm->OutStreamer.SwitchSection(StrSection);
Bill Wendling480ff322009-05-20 23:21:38 +00002399
Chris Lattnerb7aa9522010-03-13 02:17:42 +00002400 // Get all of the string pool entries and put them in an array by their ID so
2401 // we can sort them.
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002402 SmallVector<std::pair<unsigned,
Eric Christopherb800ff72013-01-07 22:40:45 +00002403 StringMapEntry<std::pair<MCSymbol*, unsigned> >*>, 64> Entries;
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002404
Chris Lattnerb7aa9522010-03-13 02:17:42 +00002405 for (StringMap<std::pair<MCSymbol*, unsigned> >::iterator
Eric Christopher27614582013-01-08 22:22:06 +00002406 I = StringPool.begin(), E = StringPool.end();
Eric Christopher48fef592012-12-20 21:58:40 +00002407 I != E; ++I)
Chris Lattnerb7aa9522010-03-13 02:17:42 +00002408 Entries.push_back(std::make_pair(I->second.second, &*I));
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002409
Chris Lattnerb7aa9522010-03-13 02:17:42 +00002410 array_pod_sort(Entries.begin(), Entries.end());
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002411
Chris Lattnerb7aa9522010-03-13 02:17:42 +00002412 for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
Chris Lattner3d72a672010-03-09 23:38:23 +00002413 // Emit a label for reference from debug information entries.
Chris Lattnerb7aa9522010-03-13 02:17:42 +00002414 Asm->OutStreamer.EmitLabel(Entries[i].second->getValue().first);
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002415
Benjamin Kramer966ed1b2011-11-09 18:16:11 +00002416 // Emit the string itself with a terminating null byte.
Benjamin Kramer148db362011-11-09 12:12:04 +00002417 Asm->OutStreamer.EmitBytes(StringRef(Entries[i].second->getKeyData(),
Eric Christopherce0cfce2013-01-09 01:35:34 +00002418 Entries[i].second->getKeyLength()+1));
Bill Wendling480ff322009-05-20 23:21:38 +00002419 }
Eric Christopher2cbd5762013-01-07 19:32:41 +00002420
2421 // If we've got an offset section go ahead and emit that now as well.
2422 if (OffsetSection) {
2423 Asm->OutStreamer.SwitchSection(OffsetSection);
2424 unsigned offset = 0;
Eric Christopher962c9082013-01-15 23:56:56 +00002425 unsigned size = 4; // FIXME: DWARF64 is 8.
Eric Christopher2cbd5762013-01-07 19:32:41 +00002426 for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
Eric Christopherbf7bc492013-01-09 03:52:05 +00002427 Asm->OutStreamer.EmitIntValue(offset, size);
Eric Christopher2cbd5762013-01-07 19:32:41 +00002428 offset += Entries[i].second->getKeyLength() + 1;
2429 }
2430 }
Bill Wendling480ff322009-05-20 23:21:38 +00002431}
2432
Eric Christopher962c9082013-01-15 23:56:56 +00002433// Emit strings into a string section.
2434void DwarfUnits::emitAddresses(const MCSection *AddrSection) {
2435
2436 if (AddressPool.empty()) return;
2437
2438 // Start the dwarf addr section.
2439 Asm->OutStreamer.SwitchSection(AddrSection);
2440
David Blaikiece1960f2013-07-08 17:51:28 +00002441 // Order the address pool entries by ID
David Blaikieac569a62013-07-08 17:33:10 +00002442 SmallVector<const MCExpr *, 64> Entries(AddressPool.size());
Eric Christopher962c9082013-01-15 23:56:56 +00002443
David Blaikiece1960f2013-07-08 17:51:28 +00002444 for (DenseMap<const MCExpr *, unsigned>::iterator I = AddressPool.begin(),
2445 E = AddressPool.end();
Eric Christopher962c9082013-01-15 23:56:56 +00002446 I != E; ++I)
David Blaikieac569a62013-07-08 17:33:10 +00002447 Entries[I->second] = I->first;
Eric Christopher962c9082013-01-15 23:56:56 +00002448
2449 for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
Ulrich Weigand8b3d2262013-07-02 18:46:46 +00002450 // Emit an expression for reference from debug information entries.
David Blaikieac569a62013-07-08 17:33:10 +00002451 if (const MCExpr *Expr = Entries[i])
Ulrich Weigand8b3d2262013-07-02 18:46:46 +00002452 Asm->OutStreamer.EmitValue(Expr, Asm->getDataLayout().getPointerSize());
Eric Christopher962c9082013-01-15 23:56:56 +00002453 else
2454 Asm->OutStreamer.EmitIntValue(0, Asm->getDataLayout().getPointerSize());
2455 }
2456
2457}
2458
Eric Christopher3bf29fd2012-12-27 02:14:01 +00002459// Emit visible names into a debug str section.
2460void DwarfDebug::emitDebugStr() {
2461 DwarfUnits &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
2462 Holder.emitStrings(Asm->getObjFileLowering().getDwarfStrSection());
2463}
2464
Eric Christopher9046f942013-07-02 21:36:07 +00002465// Emit locations into the debug loc section.
Devang Patel930143b2009-11-21 02:48:08 +00002466void DwarfDebug::emitDebugLoc() {
Devang Patel6b9a9fe2010-05-26 23:55:23 +00002467 if (DotDebugLocEntries.empty())
2468 return;
2469
Eric Christopher4887c8f2013-03-29 23:34:06 +00002470 for (SmallVectorImpl<DotDebugLocEntry>::iterator
Devang Patel116a9d72011-02-04 22:57:18 +00002471 I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
2472 I != E; ++I) {
2473 DotDebugLocEntry &Entry = *I;
2474 if (I + 1 != DotDebugLocEntries.end())
2475 Entry.Merge(I+1);
2476 }
2477
Daniel Dunbarfd95b012011-03-16 22:16:39 +00002478 // Start the dwarf loc section.
Chris Lattner4b7dadb2009-08-19 05:49:37 +00002479 Asm->OutStreamer.SwitchSection(
Devang Patel9fc11702010-05-25 23:40:22 +00002480 Asm->getObjFileLowering().getDwarfLocSection());
Chandler Carruth5da3f052012-11-01 09:14:31 +00002481 unsigned char Size = Asm->getDataLayout().getPointerSize();
Devang Patel6b9a9fe2010-05-26 23:55:23 +00002482 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", 0));
2483 unsigned index = 1;
Eric Christopher4887c8f2013-03-29 23:34:06 +00002484 for (SmallVectorImpl<DotDebugLocEntry>::iterator
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002485 I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
Devang Patel30265c42010-07-07 20:12:52 +00002486 I != E; ++I, ++index) {
Devang Patel116a9d72011-02-04 22:57:18 +00002487 DotDebugLocEntry &Entry = *I;
2488 if (Entry.isMerged()) continue;
Devang Patel9fc11702010-05-25 23:40:22 +00002489 if (Entry.isEmpty()) {
Eric Christopherce0cfce2013-01-09 01:35:34 +00002490 Asm->OutStreamer.EmitIntValue(0, Size);
2491 Asm->OutStreamer.EmitIntValue(0, Size);
Devang Patel6b9a9fe2010-05-26 23:55:23 +00002492 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", index));
Devang Patel9fc11702010-05-25 23:40:22 +00002493 } else {
Eric Christopher25f06422013-07-03 22:40:18 +00002494 Asm->OutStreamer.EmitSymbolValue(Entry.getBeginSym(), Size);
2495 Asm->OutStreamer.EmitSymbolValue(Entry.getEndSym(), Size);
2496 DIVariable DV(Entry.getVariable());
Rafael Espindolad23bfb82011-05-27 22:05:41 +00002497 Asm->OutStreamer.AddComment("Loc expr size");
2498 MCSymbol *begin = Asm->OutStreamer.getContext().CreateTempSymbol();
2499 MCSymbol *end = Asm->OutStreamer.getContext().CreateTempSymbol();
2500 Asm->EmitLabelDifference(end, begin, 2);
2501 Asm->OutStreamer.EmitLabel(begin);
Devang Pateled9fd452011-07-08 16:49:43 +00002502 if (Entry.isInt()) {
Devang Patel324f8432011-06-01 22:03:25 +00002503 DIBasicType BTy(DV.getType());
2504 if (BTy.Verify() &&
Eric Christopher6a841382012-11-19 22:42:10 +00002505 (BTy.getEncoding() == dwarf::DW_ATE_signed
Devang Patel324f8432011-06-01 22:03:25 +00002506 || BTy.getEncoding() == dwarf::DW_ATE_signed_char)) {
2507 Asm->OutStreamer.AddComment("DW_OP_consts");
2508 Asm->EmitInt8(dwarf::DW_OP_consts);
Devang Pateled9fd452011-07-08 16:49:43 +00002509 Asm->EmitSLEB128(Entry.getInt());
Devang Patel324f8432011-06-01 22:03:25 +00002510 } else {
2511 Asm->OutStreamer.AddComment("DW_OP_constu");
2512 Asm->EmitInt8(dwarf::DW_OP_constu);
Devang Pateled9fd452011-07-08 16:49:43 +00002513 Asm->EmitULEB128(Entry.getInt());
Devang Patel324f8432011-06-01 22:03:25 +00002514 }
Devang Pateled9fd452011-07-08 16:49:43 +00002515 } else if (Entry.isLocation()) {
Eric Christopher614a89f2013-07-03 22:40:21 +00002516 MachineLocation Loc = Entry.getLoc();
Eric Christopher6a841382012-11-19 22:42:10 +00002517 if (!DV.hasComplexAddress())
Devang Pateled9fd452011-07-08 16:49:43 +00002518 // Regular entry.
Eric Christopher614a89f2013-07-03 22:40:21 +00002519 Asm->EmitDwarfRegOp(Loc, DV.isIndirect());
Devang Pateled9fd452011-07-08 16:49:43 +00002520 else {
2521 // Complex address entry.
2522 unsigned N = DV.getNumAddrElements();
2523 unsigned i = 0;
2524 if (N >= 2 && DV.getAddrElement(0) == DIBuilder::OpPlus) {
Eric Christopher614a89f2013-07-03 22:40:21 +00002525 if (Loc.getOffset()) {
Devang Pateled9fd452011-07-08 16:49:43 +00002526 i = 2;
Eric Christopher614a89f2013-07-03 22:40:21 +00002527 Asm->EmitDwarfRegOp(Loc, DV.isIndirect());
Devang Pateled9fd452011-07-08 16:49:43 +00002528 Asm->OutStreamer.AddComment("DW_OP_deref");
2529 Asm->EmitInt8(dwarf::DW_OP_deref);
2530 Asm->OutStreamer.AddComment("DW_OP_plus_uconst");
2531 Asm->EmitInt8(dwarf::DW_OP_plus_uconst);
2532 Asm->EmitSLEB128(DV.getAddrElement(1));
2533 } else {
2534 // If first address element is OpPlus then emit
2535 // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
Eric Christopher614a89f2013-07-03 22:40:21 +00002536 MachineLocation TLoc(Loc.getReg(), DV.getAddrElement(1));
2537 Asm->EmitDwarfRegOp(TLoc, DV.isIndirect());
Devang Pateled9fd452011-07-08 16:49:43 +00002538 i = 2;
2539 }
2540 } else {
Eric Christopher614a89f2013-07-03 22:40:21 +00002541 Asm->EmitDwarfRegOp(Loc, DV.isIndirect());
Devang Pateled9fd452011-07-08 16:49:43 +00002542 }
Eric Christopher6a841382012-11-19 22:42:10 +00002543
Devang Pateled9fd452011-07-08 16:49:43 +00002544 // Emit remaining complex address elements.
2545 for (; i < N; ++i) {
2546 uint64_t Element = DV.getAddrElement(i);
2547 if (Element == DIBuilder::OpPlus) {
2548 Asm->EmitInt8(dwarf::DW_OP_plus_uconst);
2549 Asm->EmitULEB128(DV.getAddrElement(++i));
Eric Christopher4d250522012-05-08 18:56:00 +00002550 } else if (Element == DIBuilder::OpDeref) {
Eric Christopher614a89f2013-07-03 22:40:21 +00002551 if (!Loc.isReg())
Eric Christopher4d250522012-05-08 18:56:00 +00002552 Asm->EmitInt8(dwarf::DW_OP_deref);
2553 } else
2554 llvm_unreachable("unknown Opcode found in complex address");
Devang Pateled9fd452011-07-08 16:49:43 +00002555 }
Devang Patel3e021532011-04-28 02:22:40 +00002556 }
Devang Patel3e021532011-04-28 02:22:40 +00002557 }
Devang Pateled9fd452011-07-08 16:49:43 +00002558 // else ... ignore constant fp. There is not any good way to
2559 // to represent them here in dwarf.
Rafael Espindolad23bfb82011-05-27 22:05:41 +00002560 Asm->OutStreamer.EmitLabel(end);
Devang Patel9fc11702010-05-25 23:40:22 +00002561 }
2562 }
Bill Wendling480ff322009-05-20 23:21:38 +00002563}
2564
Eric Christopheracdcbdb2012-11-27 22:43:45 +00002565// Emit visible names into a debug aranges section.
Eric Christopher7b30f2e42012-11-21 00:34:35 +00002566void DwarfDebug::emitDebugARanges() {
Bill Wendling480ff322009-05-20 23:21:38 +00002567 // Start the dwarf aranges section.
Eric Christopherac8199b2013-08-30 00:39:57 +00002568 Asm->OutStreamer
2569 .SwitchSection(Asm->getObjFileLowering().getDwarfARangesSection());
Bill Wendling480ff322009-05-20 23:21:38 +00002570}
2571
Eric Christopheracdcbdb2012-11-27 22:43:45 +00002572// Emit visible names into a debug ranges section.
Devang Patel930143b2009-11-21 02:48:08 +00002573void DwarfDebug::emitDebugRanges() {
Bill Wendling480ff322009-05-20 23:21:38 +00002574 // Start the dwarf ranges section.
Eric Christopherac8199b2013-08-30 00:39:57 +00002575 Asm->OutStreamer
2576 .SwitchSection(Asm->getObjFileLowering().getDwarfRangesSection());
Chandler Carruth5da3f052012-11-01 09:14:31 +00002577 unsigned char Size = Asm->getDataLayout().getPointerSize();
Eric Christopher4887c8f2013-03-29 23:34:06 +00002578 for (SmallVectorImpl<const MCSymbol *>::iterator
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002579 I = DebugRangeSymbols.begin(), E = DebugRangeSymbols.end();
Devang Patel6c74a872010-04-27 19:46:33 +00002580 I != E; ++I) {
2581 if (*I)
Eric Christopherbf7bc492013-01-09 03:52:05 +00002582 Asm->OutStreamer.EmitSymbolValue(const_cast<MCSymbol*>(*I), Size);
Devang Patel12563b32010-04-16 23:33:45 +00002583 else
Eric Christopherce0cfce2013-01-09 01:35:34 +00002584 Asm->OutStreamer.EmitIntValue(0, Size);
Devang Patel12563b32010-04-16 23:33:45 +00002585 }
Bill Wendling480ff322009-05-20 23:21:38 +00002586}
2587
Eric Christopheracdcbdb2012-11-27 22:43:45 +00002588// Emit visible names into a debug macinfo section.
Devang Patel930143b2009-11-21 02:48:08 +00002589void DwarfDebug::emitDebugMacInfo() {
Daniel Dunbarc418d6b2009-09-19 20:40:05 +00002590 if (const MCSection *LineInfo =
Chris Lattner1472cf52009-08-02 07:24:22 +00002591 Asm->getObjFileLowering().getDwarfMacroInfoSection()) {
Bill Wendling480ff322009-05-20 23:21:38 +00002592 // Start the dwarf macinfo section.
Chris Lattner4b7dadb2009-08-19 05:49:37 +00002593 Asm->OutStreamer.SwitchSection(LineInfo);
Bill Wendling480ff322009-05-20 23:21:38 +00002594 }
2595}
2596
Eric Christopherd692c1d2012-12-11 19:42:09 +00002597// DWARF5 Experimental Separate Dwarf emitters.
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002598
2599// This DIE has the following attributes: DW_AT_comp_dir, DW_AT_stmt_list,
2600// DW_AT_low_pc, DW_AT_high_pc, DW_AT_ranges, DW_AT_dwo_name, DW_AT_dwo_id,
2601// DW_AT_ranges_base, DW_AT_addr_base. If DW_AT_ranges is present,
2602// DW_AT_low_pc and DW_AT_high_pc are not used, and vice versa.
Eric Christopher6fdf3242013-08-26 23:50:43 +00002603CompileUnit *DwarfDebug::constructSkeletonCU(const CompileUnit *CU) {
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002604
2605 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
Eric Christopher6fdf3242013-08-26 23:50:43 +00002606 CompileUnit *NewCU = new CompileUnit(CU->getUniqueID(), Die, CU->getNode(),
2607 Asm, this, &SkeletonHolder);
Eric Christopher4c7765f2013-01-17 03:00:04 +00002608
Eric Christopherdae389b2013-02-22 23:50:08 +00002609 NewCU->addLocalString(Die, dwarf::DW_AT_GNU_dwo_name,
Eric Christopher6b16b432013-08-26 23:57:03 +00002610 DICompileUnit(CU->getNode()).getSplitDebugFilename());
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002611
Eric Christopher44c6aa62013-04-22 07:51:08 +00002612 // Relocate to the beginning of the addr_base section, else 0 for the
2613 // beginning of the one for this compile unit.
Eric Christopher55863be2013-04-07 03:43:09 +00002614 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
2615 NewCU->addLabel(Die, dwarf::DW_AT_GNU_addr_base, dwarf::DW_FORM_sec_offset,
2616 DwarfAddrSectionSym);
2617 else
Eric Christopher44c6aa62013-04-22 07:51:08 +00002618 NewCU->addUInt(Die, dwarf::DW_AT_GNU_addr_base,
2619 dwarf::DW_FORM_sec_offset, 0);
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002620
2621 // 2.17.1 requires that we use DW_AT_low_pc for a single entry point
Eric Christopher962c9082013-01-15 23:56:56 +00002622 // into an entity. We're using 0, or a NULL label for this.
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002623 NewCU->addUInt(Die, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, 0);
Eric Christopher962c9082013-01-15 23:56:56 +00002624
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002625 // DW_AT_stmt_list is a offset of line number information for this
2626 // compile unit in debug_line section.
Eric Christopher55863be2013-04-07 03:43:09 +00002627 // FIXME: Should handle multiple compile units.
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002628 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
Eric Christopher4c7765f2013-01-17 03:00:04 +00002629 NewCU->addLabel(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_sec_offset,
Eric Christopher74804332013-02-07 21:19:50 +00002630 DwarfLineSectionSym);
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002631 else
Eric Christopher4c7765f2013-01-17 03:00:04 +00002632 NewCU->addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_sec_offset, 0);
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002633
2634 if (!CompilationDir.empty())
Eric Christopher2cbd5762013-01-07 19:32:41 +00002635 NewCU->addLocalString(Die, dwarf::DW_AT_comp_dir, CompilationDir);
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002636
Eric Christopherc8a310e2012-12-10 23:34:43 +00002637 SkeletonHolder.addUnit(NewCU);
Eric Christopher5b33b3c2013-02-06 21:53:56 +00002638 SkeletonCUs.push_back(NewCU);
Eric Christopherc8a310e2012-12-10 23:34:43 +00002639
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002640 return NewCU;
2641}
2642
Eric Christopher3c5a1912012-12-19 22:02:53 +00002643void DwarfDebug::emitSkeletonAbbrevs(const MCSection *Section) {
2644 assert(useSplitDwarf() && "No split dwarf debug info?");
2645 emitAbbrevs(Section, &SkeletonAbbrevs);
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002646}
2647
Eric Christopherd692c1d2012-12-11 19:42:09 +00002648// Emit the .debug_info.dwo section for separated dwarf. This contains the
2649// compile units that would normally be in debug_info.
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002650void DwarfDebug::emitDebugInfoDWO() {
Eric Christophercdf218d2012-12-10 19:51:21 +00002651 assert(useSplitDwarf() && "No split dwarf debug info?");
Eric Christophera2de8262012-12-15 00:04:07 +00002652 InfoHolder.emitUnits(this, Asm->getObjFileLowering().getDwarfInfoDWOSection(),
Eric Christopher3c5a1912012-12-19 22:02:53 +00002653 Asm->getObjFileLowering().getDwarfAbbrevDWOSection(),
2654 DwarfAbbrevDWOSectionSym);
2655}
2656
2657// Emit the .debug_abbrev.dwo section for separated dwarf. This contains the
2658// abbreviations for the .debug_info.dwo section.
2659void DwarfDebug::emitDebugAbbrevDWO() {
2660 assert(useSplitDwarf() && "No split dwarf?");
Eric Christopher48fef592012-12-20 21:58:40 +00002661 emitAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevDWOSection(),
2662 &Abbreviations);
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002663}
Eric Christopher3bf29fd2012-12-27 02:14:01 +00002664
2665// Emit the .debug_str.dwo section for separated dwarf. This contains the
2666// string section and is identical in format to traditional .debug_str
2667// sections.
2668void DwarfDebug::emitDebugStrDWO() {
2669 assert(useSplitDwarf() && "No split dwarf?");
Eric Christopherb800ff72013-01-07 22:40:45 +00002670 const MCSection *OffSec = Asm->getObjFileLowering()
2671 .getDwarfStrOffDWOSection();
Eric Christopher2cbd5762013-01-07 19:32:41 +00002672 const MCSymbol *StrSym = DwarfStrSectionSym;
2673 InfoHolder.emitStrings(Asm->getObjFileLowering().getDwarfStrDWOSection(),
2674 OffSec, StrSym);
Eric Christopher3bf29fd2012-12-27 02:14:01 +00002675}