blob: 01980e6f5edaf4656db4317503b4b37d88595d8e [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"
38#include "llvm/Support/ErrorHandling.h"
Chris Lattnerf5c834f2010-01-22 22:09:00 +000039#include "llvm/Support/FormattedStream.h"
Eric Christopher67646432013-07-26 17:02:41 +000040#include "llvm/Support/MD5.h"
Michael J. Spencer447762d2010-11-29 18:16:10 +000041#include "llvm/Support/Path.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000042#include "llvm/Support/Timer.h"
43#include "llvm/Support/ValueHandle.h"
44#include "llvm/Target/TargetFrameLowering.h"
45#include "llvm/Target/TargetLoweringObjectFile.h"
46#include "llvm/Target/TargetMachine.h"
47#include "llvm/Target/TargetOptions.h"
48#include "llvm/Target/TargetRegisterInfo.h"
Bill Wendling2f921f82009-05-15 09:23:25 +000049using namespace llvm;
50
Eric Christopher7f2b5512013-07-23 22:16:41 +000051static cl::opt<bool>
52DisableDebugInfoPrinting("disable-debug-info-print", cl::Hidden,
53 cl::desc("Disable debug info printing"));
Devang Patel6c74a872010-04-27 19:46:33 +000054
Eric Christopher7f2b5512013-07-23 22:16:41 +000055static cl::opt<bool> UnknownLocations(
56 "use-unknown-locations", cl::Hidden,
57 cl::desc("Make an absence of debug location information explicit."),
58 cl::init(false));
Dan Gohman7421ae42010-05-07 01:08:53 +000059
Eric Christopher7f2b5512013-07-23 22:16:41 +000060static cl::opt<bool>
Eric Christopher67646432013-07-26 17:02:41 +000061GenerateODRHash("generate-odr-hash", cl::Hidden,
62 cl::desc("Add an ODR hash to external type DIEs."),
63 cl::init(false));
64
Eric Christopherd29614f2013-08-13 01:21:55 +000065static cl::opt<bool>
66GenerateCUHash("generate-cu-hash", cl::Hidden,
67 cl::desc("Add the CU hash as the dwo_id."),
68 cl::init(false));
69
Eric Christopher20b76a72012-08-23 22:36:40 +000070namespace {
Eric Christopher7f2b5512013-07-23 22:16:41 +000071enum DefaultOnOff {
72 Default,
73 Enable,
74 Disable
75};
Eric Christopher20b76a72012-08-23 22:36:40 +000076}
Eric Christopher4996c702011-11-07 09:24:32 +000077
Eric Christopher7f2b5512013-07-23 22:16:41 +000078static cl::opt<DefaultOnOff>
79DwarfAccelTables("dwarf-accel-tables", cl::Hidden,
80 cl::desc("Output prototype dwarf accelerator tables."),
81 cl::values(clEnumVal(Default, "Default for platform"),
82 clEnumVal(Enable, "Enabled"),
83 clEnumVal(Disable, "Disabled"), clEnumValEnd),
84 cl::init(Default));
Eric Christopher20b76a72012-08-23 22:36:40 +000085
Eric Christopher7f2b5512013-07-23 22:16:41 +000086static cl::opt<DefaultOnOff>
87DarwinGDBCompat("darwin-gdb-compat", cl::Hidden,
88 cl::desc("Compatibility with Darwin gdb."),
89 cl::values(clEnumVal(Default, "Default for platform"),
90 clEnumVal(Enable, "Enabled"),
91 clEnumVal(Disable, "Disabled"), clEnumValEnd),
92 cl::init(Default));
Eric Christopher978fbff2012-08-23 07:10:46 +000093
Eric Christopher7f2b5512013-07-23 22:16:41 +000094static cl::opt<DefaultOnOff>
95SplitDwarf("split-dwarf", cl::Hidden,
96 cl::desc("Output prototype dwarf split debug info."),
97 cl::values(clEnumVal(Default, "Default for platform"),
98 clEnumVal(Enable, "Enabled"),
99 clEnumVal(Disable, "Disabled"), clEnumValEnd),
100 cl::init(Default));
Eric Christopher29424312012-11-12 22:22:20 +0000101
Eric Christopher7da24882013-08-19 21:07:38 +0000102static cl::opt<DefaultOnOff>
103DwarfPubNames("generate-dwarf-pubnames", cl::Hidden,
104 cl::desc("Generate DWARF pubnames section"),
105 cl::values(clEnumVal(Default, "Default for platform"),
106 clEnumVal(Enable, "Enabled"),
107 clEnumVal(Disable, "Disabled"), clEnumValEnd),
108 cl::init(Default));
109
Bill Wendlingfcc14142010-04-07 09:28:04 +0000110namespace {
Craig Topperd3a34f82013-07-16 01:17:10 +0000111 const char *const DWARFGroupName = "DWARF Emission";
112 const char *const DbgTimerName = "DWARF Debug Writer";
David Blaikie684fc532013-05-06 23:33:07 +0000113
114 struct CompareFirst {
115 template <typename T> bool operator()(const T &lhs, const T &rhs) const {
116 return lhs.first < rhs.first;
117 }
118 };
Bill Wendlingfcc14142010-04-07 09:28:04 +0000119} // end anonymous namespace
120
Bill Wendling2f921f82009-05-15 09:23:25 +0000121//===----------------------------------------------------------------------===//
122
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000123// Configuration values for initial hash set sizes (log2).
124//
Bill Wendling2f921f82009-05-15 09:23:25 +0000125static const unsigned InitAbbreviationsSetSize = 9; // log2(512)
Bill Wendling2f921f82009-05-15 09:23:25 +0000126
127namespace llvm {
128
Nick Lewycky019d2552011-07-29 03:49:23 +0000129DIType DbgVariable::getType() const {
Devang Patelf20c4f72011-04-12 22:53:02 +0000130 DIType Ty = Var.getType();
131 // FIXME: isBlockByrefVariable should be reformulated in terms of complex
132 // addresses instead.
133 if (Var.isBlockByrefVariable()) {
134 /* Byref variables, in Blocks, are declared by the programmer as
135 "SomeType VarName;", but the compiler creates a
136 __Block_byref_x_VarName struct, and gives the variable VarName
137 either the struct, or a pointer to the struct, as its type. This
138 is necessary for various behind-the-scenes things the compiler
139 needs to do with by-reference variables in blocks.
Eric Christopher6a841382012-11-19 22:42:10 +0000140
Devang Patelf20c4f72011-04-12 22:53:02 +0000141 However, as far as the original *programmer* is concerned, the
142 variable should still have type 'SomeType', as originally declared.
Eric Christopher6a841382012-11-19 22:42:10 +0000143
Devang Patelf20c4f72011-04-12 22:53:02 +0000144 The following function dives into the __Block_byref_x_VarName
145 struct to find the original type of the variable. This will be
146 passed back to the code generating the type for the Debug
147 Information Entry for the variable 'VarName'. 'VarName' will then
148 have the original type 'SomeType' in its debug information.
Eric Christopher6a841382012-11-19 22:42:10 +0000149
Devang Patelf20c4f72011-04-12 22:53:02 +0000150 The original type 'SomeType' will be the type of the field named
151 'VarName' inside the __Block_byref_x_VarName struct.
Eric Christopher6a841382012-11-19 22:42:10 +0000152
Devang Patelf20c4f72011-04-12 22:53:02 +0000153 NOTE: In order for this to not completely fail on the debugger
154 side, the Debug Information Entry for the variable VarName needs to
155 have a DW_AT_location that tells the debugger how to unwind through
156 the pointers and __Block_byref_x_VarName struct to find the actual
157 value of the variable. The function addBlockByrefType does this. */
158 DIType subType = Ty;
Eric Christopher31b05762013-08-08 01:41:00 +0000159 uint16_t tag = Ty.getTag();
Eric Christopher6a841382012-11-19 22:42:10 +0000160
Devang Patelf20c4f72011-04-12 22:53:02 +0000161 if (tag == dwarf::DW_TAG_pointer_type) {
162 DIDerivedType DTy = DIDerivedType(Ty);
163 subType = DTy.getTypeDerivedFrom();
164 }
Eric Christopher6a841382012-11-19 22:42:10 +0000165
Devang Patelf20c4f72011-04-12 22:53:02 +0000166 DICompositeType blockStruct = DICompositeType(subType);
167 DIArray Elements = blockStruct.getTypeArray();
Eric Christopher6a841382012-11-19 22:42:10 +0000168
Devang Patelf20c4f72011-04-12 22:53:02 +0000169 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
170 DIDescriptor Element = Elements.getElement(i);
171 DIDerivedType DT = DIDerivedType(Element);
172 if (getName() == DT.getName())
173 return (DT.getTypeDerivedFrom());
Devang Patel6d9f9fe2010-08-09 21:01:39 +0000174 }
Devang Patel6d9f9fe2010-08-09 21:01:39 +0000175 }
Devang Patelf20c4f72011-04-12 22:53:02 +0000176 return Ty;
177}
Bill Wendling2f921f82009-05-15 09:23:25 +0000178
Chris Lattnerf5d06362010-04-05 04:09:20 +0000179} // end llvm namespace
Bill Wendling2f921f82009-05-15 09:23:25 +0000180
Manman Renac8062b2013-07-02 23:40:10 +0000181/// Return Dwarf Version by checking module flags.
182static unsigned getDwarfVersionFromModule(const Module *M) {
Manman Ren8bfde892013-07-16 23:21:16 +0000183 Value *Val = M->getModuleFlag("Dwarf Version");
184 if (!Val)
185 return dwarf::DWARF_VERSION;
186 return cast<ConstantInt>(Val)->getZExtValue();
Manman Renac8062b2013-07-02 23:40:10 +0000187}
188
Chris Lattnerf0d6bd32010-04-05 05:11:15 +0000189DwarfDebug::DwarfDebug(AsmPrinter *A, Module *M)
Eric Christopherd79f5482012-12-10 19:51:13 +0000190 : Asm(A), MMI(Asm->MMI), FirstCU(0),
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000191 AbbreviationsSet(InitAbbreviationsSetSize),
Eric Christopher27614582013-01-08 22:22:06 +0000192 SourceIdMap(DIEValueAllocator),
Eric Christopherc8a310e2012-12-10 23:34:43 +0000193 PrevLabel(NULL), GlobalCUIndexCount(0),
Eric Christopher27614582013-01-08 22:22:06 +0000194 InfoHolder(A, &AbbreviationsSet, &Abbreviations, "info_string",
195 DIEValueAllocator),
Eric Christopher3c5a1912012-12-19 22:02:53 +0000196 SkeletonAbbrevSet(InitAbbreviationsSetSize),
Eric Christopher27614582013-01-08 22:22:06 +0000197 SkeletonHolder(A, &SkeletonAbbrevSet, &SkeletonAbbrevs, "skel_string",
198 DIEValueAllocator) {
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000199
Rafael Espindolaa7160962011-05-06 14:56:22 +0000200 DwarfInfoSectionSym = DwarfAbbrevSectionSym = 0;
Chris Lattnere58b5472010-04-04 23:10:38 +0000201 DwarfStrSectionSym = TextSectionSym = 0;
Eric Christopher74804332013-02-07 21:19:50 +0000202 DwarfDebugRangeSectionSym = DwarfDebugLocSectionSym = DwarfLineSectionSym = 0;
Eric Christopher55863be2013-04-07 03:43:09 +0000203 DwarfAddrSectionSym = 0;
Eric Christopher3bf29fd2012-12-27 02:14:01 +0000204 DwarfAbbrevDWOSectionSym = DwarfStrDWOSectionSym = 0;
Devang Patel9fc11702010-05-25 23:40:22 +0000205 FunctionBeginSym = FunctionEndSym = 0;
Eric Christopherad9fe892012-04-02 17:58:52 +0000206
Eric Christopher978fbff2012-08-23 07:10:46 +0000207 // Turn on accelerator tables and older gdb compatibility
Eric Christopher574b5c82013-08-19 21:41:38 +0000208 // for Darwin by default, pubnames by default for non-Darwin,
209 // and handle split dwarf.
Eric Christopher203e12b2013-04-27 01:07:52 +0000210 bool IsDarwin = Triple(A->getTargetTriple()).isOSDarwin();
Eric Christopher4977f212012-08-23 22:36:36 +0000211
Eric Christopher574b5c82013-08-19 21:41:38 +0000212 if (DarwinGDBCompat == Default)
213 IsDarwinGDBCompat = IsDarwin;
214 else
215 IsDarwinGDBCompat = DarwinGDBCompat == Enable;
216
217 if (DwarfAccelTables == Default)
218 HasDwarfAccelTables = IsDarwin;
219 else
220 HasDwarfAccelTables = DwarfAccelTables = Enable;
Eric Christopher20b76a72012-08-23 22:36:40 +0000221
Eric Christophercdf218d2012-12-10 19:51:21 +0000222 if (SplitDwarf == Default)
223 HasSplitDwarf = false;
Eric Christopher29424312012-11-12 22:22:20 +0000224 else
Eric Christopher574b5c82013-08-19 21:41:38 +0000225 HasSplitDwarf = SplitDwarf == Enable;
Eric Christopher29424312012-11-12 22:22:20 +0000226
Eric Christopher574b5c82013-08-19 21:41:38 +0000227 if (DwarfPubNames == Default)
228 HasDwarfPubNames = !IsDarwin;
229 else
230 HasDwarfPubNames = DwarfPubNames == Enable;
Eric Christopher7da24882013-08-19 21:07:38 +0000231
Manman Renac8062b2013-07-02 23:40:10 +0000232 DwarfVersion = getDwarfVersionFromModule(MMI->getModule());
233
Dan Gohman6e681a52010-06-18 15:56:31 +0000234 {
235 NamedRegionTimer T(DbgTimerName, DWARFGroupName, TimePassesIsEnabled);
Eric Christopher58f41952012-11-19 22:42:15 +0000236 beginModule();
Torok Edwinf8dba242010-04-07 10:44:46 +0000237 }
Bill Wendling2f921f82009-05-15 09:23:25 +0000238}
239DwarfDebug::~DwarfDebug() {
Bill Wendling2f921f82009-05-15 09:23:25 +0000240}
241
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000242// Switch to the specified MCSection and emit an assembler
243// temporary label to it if SymbolStem is specified.
Eric Christopher7b30f2e42012-11-21 00:34:35 +0000244static MCSymbol *emitSectionSym(AsmPrinter *Asm, const MCSection *Section,
Eric Christophera7b61892011-11-07 09:18:38 +0000245 const char *SymbolStem = 0) {
246 Asm->OutStreamer.SwitchSection(Section);
247 if (!SymbolStem) return 0;
248
249 MCSymbol *TmpSym = Asm->GetTempSymbol(SymbolStem);
250 Asm->OutStreamer.EmitLabel(TmpSym);
251 return TmpSym;
252}
253
Eric Christophere698f532012-12-20 21:58:36 +0000254MCSymbol *DwarfUnits::getStringPoolSym() {
Eric Christopher3bf29fd2012-12-27 02:14:01 +0000255 return Asm->GetTempSymbol(StringPref);
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +0000256}
257
Eric Christophere698f532012-12-20 21:58:36 +0000258MCSymbol *DwarfUnits::getStringPoolEntry(StringRef Str) {
259 std::pair<MCSymbol*, unsigned> &Entry =
Eric Christopher27614582013-01-08 22:22:06 +0000260 StringPool.GetOrCreateValue(Str).getValue();
Chris Lattnerb7aa9522010-03-13 02:17:42 +0000261 if (Entry.first) return Entry.first;
262
263 Entry.second = NextStringPoolNumber++;
Eric Christopher3bf29fd2012-12-27 02:14:01 +0000264 return Entry.first = Asm->GetTempSymbol(StringPref, Entry.second);
Chris Lattnerb7aa9522010-03-13 02:17:42 +0000265}
266
Eric Christopher2cbd5762013-01-07 19:32:41 +0000267unsigned DwarfUnits::getStringPoolIndex(StringRef Str) {
268 std::pair<MCSymbol*, unsigned> &Entry =
Eric Christopher27614582013-01-08 22:22:06 +0000269 StringPool.GetOrCreateValue(Str).getValue();
Eric Christopher2cbd5762013-01-07 19:32:41 +0000270 if (Entry.first) return Entry.second;
271
272 Entry.second = NextStringPoolNumber++;
273 Entry.first = Asm->GetTempSymbol(StringPref, Entry.second);
274 return Entry.second;
275}
276
David Blaikiedea547b2013-06-28 18:47:14 +0000277unsigned DwarfUnits::getAddrPoolIndex(const MCSymbol *Sym) {
David Blaikie8466ca82013-07-01 23:55:52 +0000278 return getAddrPoolIndex(MCSymbolRefExpr::Create(Sym, Asm->OutContext));
279}
280
Ulrich Weigand8b3d2262013-07-02 18:46:46 +0000281unsigned DwarfUnits::getAddrPoolIndex(const MCExpr *Sym) {
282 std::pair<DenseMap<const MCExpr *, unsigned>::iterator, bool> P =
David Blaikieb8ef7852013-06-28 18:47:19 +0000283 AddressPool.insert(std::make_pair(Sym, NextAddrPoolNumber));
David Blaikiea67de2b2013-06-28 18:55:13 +0000284 if (P.second)
285 ++NextAddrPoolNumber;
David Blaikieb8ef7852013-06-28 18:47:19 +0000286 return P.first->second;
Eric Christopher962c9082013-01-15 23:56:56 +0000287}
288
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000289// Define a unique number for the abbreviation.
290//
Eric Christopherc8a310e2012-12-10 23:34:43 +0000291void DwarfUnits::assignAbbrevNumber(DIEAbbrev &Abbrev) {
Bill Wendling2f921f82009-05-15 09:23:25 +0000292 // Check the set for priors.
Eric Christopherc8a310e2012-12-10 23:34:43 +0000293 DIEAbbrev *InSet = AbbreviationsSet->GetOrInsertNode(&Abbrev);
Bill Wendling2f921f82009-05-15 09:23:25 +0000294
295 // If it's newly added.
296 if (InSet == &Abbrev) {
297 // Add to abbreviation list.
Eric Christopherc8a310e2012-12-10 23:34:43 +0000298 Abbreviations->push_back(&Abbrev);
Bill Wendling2f921f82009-05-15 09:23:25 +0000299
300 // Assign the vector position + 1 as its number.
Eric Christopherc8a310e2012-12-10 23:34:43 +0000301 Abbrev.setNumber(Abbreviations->size());
Bill Wendling2f921f82009-05-15 09:23:25 +0000302 } else {
303 // Assign existing abbreviation number.
304 Abbrev.setNumber(InSet->getNumber());
305 }
306}
307
Eric Christopherd9843b32011-11-10 19:25:34 +0000308static bool isObjCClass(StringRef Name) {
309 return Name.startswith("+") || Name.startswith("-");
310}
311
312static bool hasObjCCategory(StringRef Name) {
313 if (!isObjCClass(Name)) return false;
314
315 size_t pos = Name.find(')');
316 if (pos != std::string::npos) {
317 if (Name[pos+1] != ' ') return false;
318 return true;
319 }
320 return false;
321}
322
323static void getObjCClassCategory(StringRef In, StringRef &Class,
324 StringRef &Category) {
325 if (!hasObjCCategory(In)) {
326 Class = In.slice(In.find('[') + 1, In.find(' '));
327 Category = "";
328 return;
329 }
330
331 Class = In.slice(In.find('[') + 1, In.find('('));
332 Category = In.slice(In.find('[') + 1, In.find(' '));
333 return;
334}
335
336static StringRef getObjCMethodName(StringRef In) {
337 return In.slice(In.find(' ') + 1, In.find(']'));
338}
339
340// Add the various names to the Dwarf accelerator table names.
341static void addSubprogramNames(CompileUnit *TheCU, DISubprogram SP,
342 DIE* Die) {
343 if (!SP.isDefinition()) return;
Eric Christopher6a841382012-11-19 22:42:10 +0000344
Eric Christopherd9843b32011-11-10 19:25:34 +0000345 TheCU->addAccelName(SP.getName(), Die);
346
347 // If the linkage name is different than the name, go ahead and output
348 // that as well into the name table.
349 if (SP.getLinkageName() != "" && SP.getName() != SP.getLinkageName())
350 TheCU->addAccelName(SP.getLinkageName(), Die);
351
352 // If this is an Objective-C selector name add it to the ObjC accelerator
353 // too.
354 if (isObjCClass(SP.getName())) {
355 StringRef Class, Category;
356 getObjCClassCategory(SP.getName(), Class, Category);
357 TheCU->addAccelObjC(Class, Die);
358 if (Category != "")
359 TheCU->addAccelObjC(Category, Die);
360 // Also add the base method name to the name table.
361 TheCU->addAccelName(getObjCMethodName(SP.getName()), Die);
362 }
363}
364
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000365// Find DIE for the given subprogram and attach appropriate DW_AT_low_pc
366// and DW_AT_high_pc attributes. If there are global variables in this
367// scope then create and insert DIEs for these variables.
Devang Pateld2dfc5e2011-08-15 22:24:32 +0000368DIE *DwarfDebug::updateSubprogramScopeDIE(CompileUnit *SPCU,
369 const MDNode *SPNode) {
Devang Patel1a0df9a2010-05-10 22:49:55 +0000370 DIE *SPDie = SPCU->getDIE(SPNode);
Devang Patela37a95e2010-07-07 22:20:57 +0000371
Chris Lattner3a383cb2010-04-05 00:13:49 +0000372 assert(SPDie && "Unable to find subprogram DIE!");
373 DISubprogram SP(SPNode);
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000374
Bill Wendlingf720bf62012-11-07 05:19:04 +0000375 // If we're updating an abstract DIE, then we will be adding the children and
376 // object pointer later on. But what we don't want to do is process the
377 // concrete DIE twice.
Manman Ren14a029d2013-03-12 18:27:15 +0000378 DIE *AbsSPDIE = AbstractSPDies.lookup(SPNode);
379 if (AbsSPDIE) {
380 bool InSameCU = (AbsSPDIE->getCompileUnit() == SPCU->getCUDie());
Bill Wendlingf720bf62012-11-07 05:19:04 +0000381 // Pick up abstract subprogram DIE.
Devang Patela37a95e2010-07-07 22:20:57 +0000382 SPDie = new DIE(dwarf::DW_TAG_subprogram);
Manman Ren14a029d2013-03-12 18:27:15 +0000383 // If AbsSPDIE belongs to a different CU, use DW_FORM_ref_addr instead of
384 // DW_FORM_ref4.
Devang Patelf20c4f72011-04-12 22:53:02 +0000385 SPCU->addDIEEntry(SPDie, dwarf::DW_AT_abstract_origin,
Manman Ren14a029d2013-03-12 18:27:15 +0000386 InSameCU ? dwarf::DW_FORM_ref4 : dwarf::DW_FORM_ref_addr,
387 AbsSPDIE);
Devang Patela37a95e2010-07-07 22:20:57 +0000388 SPCU->addDie(SPDie);
Bill Wendlingd9bb9b62012-11-07 04:42:18 +0000389 } else {
390 DISubprogram SPDecl = SP.getFunctionDeclaration();
391 if (!SPDecl.isSubprogram()) {
392 // There is not any need to generate specification DIE for a function
393 // defined at compile unit level. If a function is defined inside another
394 // function then gdb prefers the definition at top level and but does not
395 // expect specification DIE in parent function. So avoid creating
396 // specification DIE for a function defined inside a function.
397 if (SP.isDefinition() && !SP.getContext().isCompileUnit() &&
398 !SP.getContext().isFile() &&
399 !isSubprogramContext(SP.getContext())) {
400 SPCU->addFlag(SPDie, dwarf::DW_AT_declaration);
401
402 // Add arguments.
403 DICompositeType SPTy = SP.getType();
404 DIArray Args = SPTy.getTypeArray();
Eric Christopher31b05762013-08-08 01:41:00 +0000405 uint16_t SPTag = SPTy.getTag();
Bill Wendlingd9bb9b62012-11-07 04:42:18 +0000406 if (SPTag == dwarf::DW_TAG_subroutine_type)
407 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
408 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
409 DIType ATy = DIType(Args.getElement(i));
410 SPCU->addType(Arg, ATy);
411 if (ATy.isArtificial())
412 SPCU->addFlag(Arg, dwarf::DW_AT_artificial);
413 if (ATy.isObjectPointer())
414 SPCU->addDIEEntry(SPDie, dwarf::DW_AT_object_pointer,
415 dwarf::DW_FORM_ref4, Arg);
416 SPDie->addChild(Arg);
417 }
418 DIE *SPDeclDie = SPDie;
419 SPDie = new DIE(dwarf::DW_TAG_subprogram);
Eric Christopher6a841382012-11-19 22:42:10 +0000420 SPCU->addDIEEntry(SPDie, dwarf::DW_AT_specification,
421 dwarf::DW_FORM_ref4, SPDeclDie);
Bill Wendlingd9bb9b62012-11-07 04:42:18 +0000422 SPCU->addDie(SPDie);
423 }
424 }
Devang Patela37a95e2010-07-07 22:20:57 +0000425 }
426
Eric Christopher962c9082013-01-15 23:56:56 +0000427 SPCU->addLabelAddress(SPDie, dwarf::DW_AT_low_pc,
428 Asm->GetTempSymbol("func_begin",
429 Asm->getFunctionNumber()));
430 SPCU->addLabelAddress(SPDie, dwarf::DW_AT_high_pc,
431 Asm->GetTempSymbol("func_end",
432 Asm->getFunctionNumber()));
Chris Lattner3a383cb2010-04-05 00:13:49 +0000433 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
434 MachineLocation Location(RI->getFrameRegister(*Asm->MF));
Devang Patelf20c4f72011-04-12 22:53:02 +0000435 SPCU->addAddress(SPDie, dwarf::DW_AT_frame_base, Location);
Devang Patel6efc8e52010-02-06 01:02:37 +0000436
Eric Christopherd9843b32011-11-10 19:25:34 +0000437 // Add name to the name table, we do this here because we're guaranteed
438 // to have concrete versions of our DW_TAG_subprogram nodes.
439 addSubprogramNames(SPCU, SP, SPDie);
Eric Christopher6a841382012-11-19 22:42:10 +0000440
Chris Lattner3a383cb2010-04-05 00:13:49 +0000441 return SPDie;
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000442}
443
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000444// Construct new DW_TAG_lexical_block for this scope and attach
445// DW_AT_low_pc/DW_AT_high_pc labels.
Eric Christopher6a841382012-11-19 22:42:10 +0000446DIE *DwarfDebug::constructLexicalScopeDIE(CompileUnit *TheCU,
Devang Pateld2dfc5e2011-08-15 22:24:32 +0000447 LexicalScope *Scope) {
Devang Patel6c74a872010-04-27 19:46:33 +0000448 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_lexical_block);
449 if (Scope->isAbstractScope())
450 return ScopeDIE;
451
Craig Topper977e9cd2013-07-03 04:24:43 +0000452 const SmallVectorImpl<InsnRange> &Ranges = Scope->getRanges();
Devang Patel6c74a872010-04-27 19:46:33 +0000453 if (Ranges.empty())
454 return 0;
455
Eric Christopherdc42ea82013-07-03 01:57:28 +0000456 // If we have multiple ranges, emit them into the range section.
Devang Patel6c74a872010-04-27 19:46:33 +0000457 if (Ranges.size() > 1) {
458 // .debug_range section has not been laid out yet. Emit offset in
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000459 // .debug_range as a uint, size 4, for now. emitDIE will handle
Devang Patel6c74a872010-04-27 19:46:33 +0000460 // DW_AT_ranges appropriately.
Devang Patelf20c4f72011-04-12 22:53:02 +0000461 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_ranges, dwarf::DW_FORM_data4,
Eric Christopher6a841382012-11-19 22:42:10 +0000462 DebugRangeSymbols.size()
Chandler Carruth5da3f052012-11-01 09:14:31 +0000463 * Asm->getDataLayout().getPointerSize());
Craig Topperd8e43652013-07-03 04:17:25 +0000464 for (SmallVectorImpl<InsnRange>::const_iterator RI = Ranges.begin(),
Devang Patel6c74a872010-04-27 19:46:33 +0000465 RE = Ranges.end(); RI != RE; ++RI) {
Devang Patel9fc11702010-05-25 23:40:22 +0000466 DebugRangeSymbols.push_back(getLabelBeforeInsn(RI->first));
467 DebugRangeSymbols.push_back(getLabelAfterInsn(RI->second));
Devang Patel6c74a872010-04-27 19:46:33 +0000468 }
Eric Christopherc1110832013-07-03 01:22:29 +0000469
470 // Terminate the range list.
Devang Patel6c74a872010-04-27 19:46:33 +0000471 DebugRangeSymbols.push_back(NULL);
472 DebugRangeSymbols.push_back(NULL);
473 return ScopeDIE;
474 }
475
Eric Christopherdc42ea82013-07-03 01:57:28 +0000476 // Construct the address range for this DIE.
Craig Topperd8e43652013-07-03 04:17:25 +0000477 SmallVectorImpl<InsnRange>::const_iterator RI = Ranges.begin();
Eric Christopher962c9082013-01-15 23:56:56 +0000478 MCSymbol *Start = getLabelBeforeInsn(RI->first);
479 MCSymbol *End = getLabelAfterInsn(RI->second);
Devang Patel6c74a872010-04-27 19:46:33 +0000480
Devang Patel9fc11702010-05-25 23:40:22 +0000481 if (End == 0) return 0;
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000482
Chris Lattnere13c3722010-03-09 01:58:53 +0000483 assert(Start->isDefined() && "Invalid starting label for an inlined scope!");
484 assert(End->isDefined() && "Invalid end label for an inlined scope!");
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000485
Eric Christopher962c9082013-01-15 23:56:56 +0000486 TheCU->addLabelAddress(ScopeDIE, dwarf::DW_AT_low_pc, Start);
487 TheCU->addLabelAddress(ScopeDIE, dwarf::DW_AT_high_pc, End);
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000488
489 return ScopeDIE;
490}
491
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000492// This scope represents inlined body of a function. Construct DIE to
493// represent this concrete inlined copy of the function.
Devang Pateld2dfc5e2011-08-15 22:24:32 +0000494DIE *DwarfDebug::constructInlinedScopeDIE(CompileUnit *TheCU,
495 LexicalScope *Scope) {
Craig Topper977e9cd2013-07-03 04:24:43 +0000496 const SmallVectorImpl<InsnRange> &Ranges = Scope->getRanges();
Nick Lewycky654f5ce2011-10-26 22:55:33 +0000497 assert(Ranges.empty() == false &&
498 "LexicalScope does not have instruction markers!");
Devang Patel6c74a872010-04-27 19:46:33 +0000499
Devang Patelf098ce22011-07-27 00:34:13 +0000500 if (!Scope->getScopeNode())
501 return NULL;
502 DIScope DS(Scope->getScopeNode());
503 DISubprogram InlinedSP = getDISubprogram(DS);
Manman Ren4213c392013-05-29 17:16:59 +0000504 DIE *OriginDIE = TheCU->getDIE(InlinedSP);
Devang Patelf098ce22011-07-27 00:34:13 +0000505 if (!OriginDIE) {
Bill Wendling10e0e2e2012-10-30 17:51:02 +0000506 DEBUG(dbgs() << "Unable to find original DIE for an inlined subprogram.");
Devang Patelf098ce22011-07-27 00:34:13 +0000507 return NULL;
508 }
509
Devang Patel73bc1722011-05-05 17:54:26 +0000510 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_inlined_subroutine);
Devang Patelf20c4f72011-04-12 22:53:02 +0000511 TheCU->addDIEEntry(ScopeDIE, dwarf::DW_AT_abstract_origin,
Manman Ren4213c392013-05-29 17:16:59 +0000512 dwarf::DW_FORM_ref4, OriginDIE);
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000513
Devang Patelf098ce22011-07-27 00:34:13 +0000514 if (Ranges.size() > 1) {
515 // .debug_range section has not been laid out yet. Emit offset in
516 // .debug_range as a uint, size 4, for now. emitDIE will handle
517 // DW_AT_ranges appropriately.
518 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_ranges, dwarf::DW_FORM_data4,
Eric Christopher6a841382012-11-19 22:42:10 +0000519 DebugRangeSymbols.size()
Chandler Carruth5da3f052012-11-01 09:14:31 +0000520 * Asm->getDataLayout().getPointerSize());
Craig Topperd8e43652013-07-03 04:17:25 +0000521 for (SmallVectorImpl<InsnRange>::const_iterator RI = Ranges.begin(),
Devang Patelf098ce22011-07-27 00:34:13 +0000522 RE = Ranges.end(); RI != RE; ++RI) {
523 DebugRangeSymbols.push_back(getLabelBeforeInsn(RI->first));
524 DebugRangeSymbols.push_back(getLabelAfterInsn(RI->second));
525 }
526 DebugRangeSymbols.push_back(NULL);
527 DebugRangeSymbols.push_back(NULL);
528 } else {
Craig Topperd8e43652013-07-03 04:17:25 +0000529 SmallVectorImpl<InsnRange>::const_iterator RI = Ranges.begin();
Eric Christopherf94eb2b2013-07-03 02:23:53 +0000530 MCSymbol *StartLabel = getLabelBeforeInsn(RI->first);
531 MCSymbol *EndLabel = getLabelAfterInsn(RI->second);
532
533 if (StartLabel == 0 || EndLabel == 0)
534 llvm_unreachable("Unexpected Start and End labels for an inlined scope!");
535
536 assert(StartLabel->isDefined() &&
537 "Invalid starting label for an inlined scope!");
538 assert(EndLabel->isDefined() && "Invalid end label for an inlined scope!");
539
Eric Christopher962c9082013-01-15 23:56:56 +0000540 TheCU->addLabelAddress(ScopeDIE, dwarf::DW_AT_low_pc, StartLabel);
541 TheCU->addLabelAddress(ScopeDIE, dwarf::DW_AT_high_pc, EndLabel);
Devang Patelf098ce22011-07-27 00:34:13 +0000542 }
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000543
544 InlinedSubprogramDIEs.insert(OriginDIE);
545
Eric Christopherf94eb2b2013-07-03 02:23:53 +0000546 // Add the call site information to the DIE.
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000547 DILocation DL(Scope->getInlinedAt());
Eric Christopher0925c622012-03-26 21:38:38 +0000548 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_call_file, 0,
Manman Ren1e427202013-03-07 01:42:00 +0000549 getOrCreateSourceID(DL.getFilename(), DL.getDirectory(),
550 TheCU->getUniqueID()));
Devang Patelf20c4f72011-04-12 22:53:02 +0000551 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_call_line, 0, DL.getLineNumber());
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000552
Eric Christopherf94eb2b2013-07-03 02:23:53 +0000553 // Track the start label for this inlined function.
554 //.debug_inlined section specification does not clearly state how
555 // to emit inlined scopes that are split into multiple instruction ranges.
556 // For now, use the first instruction range and emit low_pc/high_pc pair and
557 // corresponding the .debug_inlined section entry for this pair.
558 if (Asm->MAI->doesDwarfUseInlineInfoSection()) {
559 MCSymbol *StartLabel = getLabelBeforeInsn(Ranges.begin()->first);
Craig Topper2b4a2012013-07-03 04:40:27 +0000560 InlineInfoMap::iterator I = InlineInfo.find(InlinedSP);
Eric Christopherf94eb2b2013-07-03 02:23:53 +0000561
562 if (I == InlineInfo.end()) {
563 InlineInfo[InlinedSP].push_back(std::make_pair(StartLabel, ScopeDIE));
564 InlinedSPNodes.push_back(InlinedSP);
565 } else
566 I->second.push_back(std::make_pair(StartLabel, ScopeDIE));
567 }
568
Eric Christopher8dda5d02011-12-04 06:02:38 +0000569 // Add name to the name table, we do this here because we're guaranteed
570 // to have concrete versions of our DW_TAG_inlined_subprogram nodes.
571 addSubprogramNames(TheCU, InlinedSP, ScopeDIE);
Eric Christopher6a841382012-11-19 22:42:10 +0000572
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000573 return ScopeDIE;
574}
575
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000576// Construct a DIE for this scope.
Devang Patel3acc70e2011-08-15 22:04:40 +0000577DIE *DwarfDebug::constructScopeDIE(CompileUnit *TheCU, LexicalScope *Scope) {
Devang Patel3b548aa2010-03-08 20:52:55 +0000578 if (!Scope || !Scope->getScopeNode())
579 return NULL;
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000580
Manman Ren53f3f9f2013-01-31 20:05:14 +0000581 DIScope DS(Scope->getScopeNode());
582 // Early return to avoid creating dangling variable|scope DIEs.
Manman Ren4213c392013-05-29 17:16:59 +0000583 if (!Scope->getInlinedAt() && DS.isSubprogram() && Scope->isAbstractScope() &&
584 !TheCU->getDIE(DS))
585 return NULL;
Manman Ren53f3f9f2013-01-31 20:05:14 +0000586
Nick Lewycky654f5ce2011-10-26 22:55:33 +0000587 SmallVector<DIE *, 8> Children;
Eric Christophere3417762012-09-12 23:36:19 +0000588 DIE *ObjectPointer = NULL;
Devang Patel6c622ef2011-03-01 22:58:55 +0000589
590 // Collect arguments for current function.
Devang Patel7e623022011-08-10 20:55:27 +0000591 if (LScopes.isCurrentFunctionScope(Scope))
Devang Patel6c622ef2011-03-01 22:58:55 +0000592 for (unsigned i = 0, N = CurrentFnArguments.size(); i < N; ++i)
593 if (DbgVariable *ArgDV = CurrentFnArguments[i])
Eric Christopher6a841382012-11-19 22:42:10 +0000594 if (DIE *Arg =
Eric Christophere3417762012-09-12 23:36:19 +0000595 TheCU->constructVariableDIE(ArgDV, Scope->isAbstractScope())) {
Devang Patel6c622ef2011-03-01 22:58:55 +0000596 Children.push_back(Arg);
Eric Christophere3417762012-09-12 23:36:19 +0000597 if (ArgDV->isObjectPointer()) ObjectPointer = Arg;
598 }
Devang Patel6c622ef2011-03-01 22:58:55 +0000599
Eric Christopherf84354b2011-10-03 15:49:16 +0000600 // Collect lexical scope children first.
Craig Topper977e9cd2013-07-03 04:24:43 +0000601 const SmallVectorImpl<DbgVariable *> &Variables =ScopeVariables.lookup(Scope);
Devang Patel5f1b4cd2011-02-19 01:31:27 +0000602 for (unsigned i = 0, N = Variables.size(); i < N; ++i)
Eric Christopher6a841382012-11-19 22:42:10 +0000603 if (DIE *Variable =
Eric Christopherc1c8a1b2012-09-21 22:18:52 +0000604 TheCU->constructVariableDIE(Variables[i], Scope->isAbstractScope())) {
Devang Patel5f1b4cd2011-02-19 01:31:27 +0000605 Children.push_back(Variable);
Eric Christopherc1c8a1b2012-09-21 22:18:52 +0000606 if (Variables[i]->isObjectPointer()) ObjectPointer = Variable;
607 }
Craig Topper977e9cd2013-07-03 04:24:43 +0000608 const SmallVectorImpl<LexicalScope *> &Scopes = Scope->getChildren();
Devang Patel5f1b4cd2011-02-19 01:31:27 +0000609 for (unsigned j = 0, M = Scopes.size(); j < M; ++j)
Devang Patel3acc70e2011-08-15 22:04:40 +0000610 if (DIE *Nested = constructScopeDIE(TheCU, Scopes[j]))
Devang Patel5f1b4cd2011-02-19 01:31:27 +0000611 Children.push_back(Nested);
Devang Patel3b548aa2010-03-08 20:52:55 +0000612 DIE *ScopeDIE = NULL;
613 if (Scope->getInlinedAt())
Devang Pateld2dfc5e2011-08-15 22:24:32 +0000614 ScopeDIE = constructInlinedScopeDIE(TheCU, Scope);
Devang Patel3b548aa2010-03-08 20:52:55 +0000615 else if (DS.isSubprogram()) {
Devang Pateld10b2af2010-06-28 20:53:04 +0000616 ProcessedSPNodes.insert(DS);
Devang Patela37a95e2010-07-07 22:20:57 +0000617 if (Scope->isAbstractScope()) {
Manman Ren4213c392013-05-29 17:16:59 +0000618 ScopeDIE = TheCU->getDIE(DS);
Devang Patela37a95e2010-07-07 22:20:57 +0000619 // Note down abstract DIE.
620 if (ScopeDIE)
621 AbstractSPDies.insert(std::make_pair(DS, ScopeDIE));
622 }
Devang Patel3b548aa2010-03-08 20:52:55 +0000623 else
Devang Pateld2dfc5e2011-08-15 22:24:32 +0000624 ScopeDIE = updateSubprogramScopeDIE(TheCU, DS);
Devang Patel3b548aa2010-03-08 20:52:55 +0000625 }
Devang Patel5f1b4cd2011-02-19 01:31:27 +0000626 else {
627 // There is no need to emit empty lexical block DIE.
David Blaikie684fc532013-05-06 23:33:07 +0000628 std::pair<ImportedEntityMap::const_iterator,
629 ImportedEntityMap::const_iterator> Range = std::equal_range(
630 ScopesWithImportedEntities.begin(), ScopesWithImportedEntities.end(),
Timur Iskhodzhanovec4afe62013-05-07 07:47:47 +0000631 std::pair<const MDNode *, const MDNode *>(DS, (const MDNode*)0),
632 CompareFirst());
David Blaikie684fc532013-05-06 23:33:07 +0000633 if (Children.empty() && Range.first == Range.second)
Devang Patel5f1b4cd2011-02-19 01:31:27 +0000634 return NULL;
Devang Pateld2dfc5e2011-08-15 22:24:32 +0000635 ScopeDIE = constructLexicalScopeDIE(TheCU, Scope);
Eric Christopher5fdd68e2013-06-24 23:20:02 +0000636 for (ImportedEntityMap::const_iterator i = Range.first; i != Range.second;
637 ++i)
David Blaikie4dd2de72013-05-08 06:01:38 +0000638 constructImportedEntityDIE(TheCU, i->second, ScopeDIE);
Devang Patel5f1b4cd2011-02-19 01:31:27 +0000639 }
Eric Christopher6a841382012-11-19 22:42:10 +0000640
Devang Patel23b2ae62010-03-29 22:59:58 +0000641 if (!ScopeDIE) return NULL;
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000642
Devang Patel5f1b4cd2011-02-19 01:31:27 +0000643 // Add children
Craig Topperd8e43652013-07-03 04:17:25 +0000644 for (SmallVectorImpl<DIE *>::iterator I = Children.begin(),
Devang Patel5f1b4cd2011-02-19 01:31:27 +0000645 E = Children.end(); I != E; ++I)
646 ScopeDIE->addChild(*I);
Devang Patel04d2f2d2009-11-24 01:14:22 +0000647
Eric Christophere3417762012-09-12 23:36:19 +0000648 if (DS.isSubprogram() && ObjectPointer != NULL)
649 TheCU->addDIEEntry(ScopeDIE, dwarf::DW_AT_object_pointer,
650 dwarf::DW_FORM_ref4, ObjectPointer);
651
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000652 if (DS.isSubprogram())
Eric Christopherd9843b32011-11-10 19:25:34 +0000653 TheCU->addPubTypes(DISubprogram(DS));
Jim Grosbacha8683bb2010-07-21 21:21:52 +0000654
Eric Christopherd9843b32011-11-10 19:25:34 +0000655 return ScopeDIE;
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000656}
657
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000658// Look up the source id with the given directory and source file names.
659// If none currently exists, create a new id and insert it in the
660// SourceIds map. This can update DirectoryNames and SourceFileNames maps
661// as well.
Eric Christopher7b30f2e42012-11-21 00:34:35 +0000662unsigned DwarfDebug::getOrCreateSourceID(StringRef FileName,
Manman Ren1e427202013-03-07 01:42:00 +0000663 StringRef DirName, unsigned CUID) {
664 // If we use .loc in assembly, we can't separate .file entries according to
665 // compile units. Thus all files will belong to the default compile unit.
666 if (Asm->TM.hasMCUseLoc() &&
667 Asm->OutStreamer.getKind() == MCStreamer::SK_AsmStreamer)
668 CUID = 0;
669
Devang Patel871d0b12010-09-16 20:57:49 +0000670 // If FE did not provide a file name, then assume stdin.
671 if (FileName.empty())
Manman Ren1e427202013-03-07 01:42:00 +0000672 return getOrCreateSourceID("<stdin>", StringRef(), CUID);
Devang Patele01b75c2011-03-24 20:30:50 +0000673
Nick Lewyckyd1ee7f82011-11-02 20:55:33 +0000674 // TODO: this might not belong here. See if we can factor this better.
675 if (DirName == CompilationDir)
676 DirName = "";
677
Manman Ren1e427202013-03-07 01:42:00 +0000678 // FileIDCUMap stores the current ID for the given compile unit.
679 unsigned SrcId = FileIDCUMap[CUID] + 1;
Devang Patel871d0b12010-09-16 20:57:49 +0000680
Manman Ren1e427202013-03-07 01:42:00 +0000681 // We look up the CUID/file/dir by concatenating them with a zero byte.
Benjamin Kramer71b19732012-03-11 14:56:26 +0000682 SmallString<128> NamePair;
Manman Ren5b22f9f2013-04-06 01:02:38 +0000683 NamePair += utostr(CUID);
Manman Ren1e427202013-03-07 01:42:00 +0000684 NamePair += '\0';
Benjamin Kramer71b19732012-03-11 14:56:26 +0000685 NamePair += DirName;
686 NamePair += '\0'; // Zero bytes are not allowed in paths.
687 NamePair += FileName;
688
689 StringMapEntry<unsigned> &Ent = SourceIdMap.GetOrCreateValue(NamePair, SrcId);
690 if (Ent.getValue() != SrcId)
691 return Ent.getValue();
Bill Wendling2b128d72009-05-20 23:19:06 +0000692
Manman Ren1e427202013-03-07 01:42:00 +0000693 FileIDCUMap[CUID] = SrcId;
Rafael Espindola67c6ab82010-11-18 02:04:25 +0000694 // Print out a .file directive to specify files for .loc directives.
Manman Ren1e427202013-03-07 01:42:00 +0000695 Asm->OutStreamer.EmitDwarfFileDirective(SrcId, DirName, FileName, CUID);
Bill Wendling2b128d72009-05-20 23:19:06 +0000696
697 return SrcId;
698}
699
Eric Christopher48fef592012-12-20 21:58:40 +0000700// Create new CompileUnit for the given metadata node with tag
701// DW_TAG_compile_unit.
Devang Pateleb1bb4e2011-08-16 22:09:43 +0000702CompileUnit *DwarfDebug::constructCompileUnit(const MDNode *N) {
Devang Patel80ae3492009-08-28 23:24:31 +0000703 DICompileUnit DIUnit(N);
Devang Patel2d9caf92009-11-25 17:36:49 +0000704 StringRef FN = DIUnit.getFilename();
Nick Lewyckyd1ee7f82011-11-02 20:55:33 +0000705 CompilationDir = DIUnit.getDirectory();
Bill Wendling2b128d72009-05-20 23:19:06 +0000706
707 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
Eli Benderskyb42d1462012-12-03 18:45:45 +0000708 CompileUnit *NewCU = new CompileUnit(GlobalCUIndexCount++,
Eric Christopherc57baee2013-05-08 00:58:51 +0000709 DIUnit.getLanguage(), Die, N, Asm,
Eric Christophere698f532012-12-20 21:58:36 +0000710 this, &InfoHolder);
Manman Ren1e427202013-03-07 01:42:00 +0000711
712 FileIDCUMap[NewCU->getUniqueID()] = 0;
713 // Call this to emit a .file directive if it wasn't emitted for the source
714 // file this CU comes from yet.
715 getOrCreateSourceID(FN, CompilationDir, NewCU->getUniqueID());
716
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +0000717 NewCU->addString(Die, dwarf::DW_AT_producer, DIUnit.getProducer());
Devang Patelf20c4f72011-04-12 22:53:02 +0000718 NewCU->addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data2,
719 DIUnit.getLanguage());
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +0000720 NewCU->addString(Die, dwarf::DW_AT_name, FN);
Eric Christopher52ce7182013-04-09 19:23:15 +0000721
Eric Christopherb1b94512012-08-01 18:19:01 +0000722 // 2.17.1 requires that we use DW_AT_low_pc for a single entry point
Eric Christopher52ce7182013-04-09 19:23:15 +0000723 // into an entity. We're using 0 (or a NULL label) for this. For
724 // split dwarf it's in the skeleton CU so omit it here.
725 if (!useSplitDwarf())
726 NewCU->addLabelAddress(Die, dwarf::DW_AT_low_pc, NULL);
Manman Ren4e042a62013-02-05 21:52:47 +0000727
728 // Define start line table label for each Compile Unit.
729 MCSymbol *LineTableStartSym = Asm->GetTempSymbol("line_table_start",
730 NewCU->getUniqueID());
731 Asm->OutStreamer.getContext().setMCLineTableSymbol(LineTableStartSym,
732 NewCU->getUniqueID());
733
Manman Ren9d4c7352013-05-21 00:57:22 +0000734 // Use a single line table if we are using .loc and generating assembly.
735 bool UseTheFirstCU =
736 (Asm->TM.hasMCUseLoc() &&
737 Asm->OutStreamer.getKind() == MCStreamer::SK_AsmStreamer) ||
738 (NewCU->getUniqueID() == 0);
739
Devang Pateld22ed622010-03-22 23:11:36 +0000740 // DW_AT_stmt_list is a offset of line number information for this
Eric Christopher52ce7182013-04-09 19:23:15 +0000741 // compile unit in debug_line section. For split dwarf this is
742 // left in the skeleton CU and so not included.
Manman Rend2c95eb2013-02-09 00:41:44 +0000743 // The line table entries are not always emitted in assembly, so it
744 // is not okay to use line_table_start here.
Eric Christopher52ce7182013-04-09 19:23:15 +0000745 if (!useSplitDwarf()) {
746 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
Carlo Kokbac096a2013-08-13 17:46:57 +0000747 NewCU->addLabel(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_sec_offset,
Manman Ren9d4c7352013-05-21 00:57:22 +0000748 UseTheFirstCU ?
Eric Christopher52ce7182013-04-09 19:23:15 +0000749 Asm->GetTempSymbol("section_line") : LineTableStartSym);
Manman Ren9d4c7352013-05-21 00:57:22 +0000750 else if (UseTheFirstCU)
Eric Christopher52ce7182013-04-09 19:23:15 +0000751 NewCU->addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4, 0);
752 else
753 NewCU->addDelta(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4,
754 LineTableStartSym, DwarfLineSectionSym);
755 }
Bill Wendling2b128d72009-05-20 23:19:06 +0000756
Eric Christopher52ce7182013-04-09 19:23:15 +0000757 // If we're using split dwarf the compilation dir is going to be in the
758 // skeleton CU and so we don't need to duplicate it here.
759 if (!useSplitDwarf() && !CompilationDir.empty())
Nick Lewyckyd1ee7f82011-11-02 20:55:33 +0000760 NewCU->addString(Die, dwarf::DW_AT_comp_dir, CompilationDir);
Bill Wendling2b128d72009-05-20 23:19:06 +0000761 if (DIUnit.isOptimized())
Eric Christopherbb69a272012-08-24 01:14:27 +0000762 NewCU->addFlag(Die, dwarf::DW_AT_APPLE_optimized);
Bill Wendling2b128d72009-05-20 23:19:06 +0000763
Devang Patel2d9caf92009-11-25 17:36:49 +0000764 StringRef Flags = DIUnit.getFlags();
765 if (!Flags.empty())
Nick Lewyckyd59c0ca2011-10-27 06:44:11 +0000766 NewCU->addString(Die, dwarf::DW_AT_APPLE_flags, Flags);
Eric Christopher6a841382012-11-19 22:42:10 +0000767
Nick Lewycky479a8fe2011-10-17 23:27:36 +0000768 if (unsigned RVer = DIUnit.getRunTimeVersion())
Devang Patelf20c4f72011-04-12 22:53:02 +0000769 NewCU->addUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers,
Bill Wendling2b128d72009-05-20 23:19:06 +0000770 dwarf::DW_FORM_data1, RVer);
771
Devang Patel1a0df9a2010-05-10 22:49:55 +0000772 if (!FirstCU)
773 FirstCU = NewCU;
Eric Christopher7a2cdf72013-02-05 07:31:55 +0000774
Eric Christopherc8a310e2012-12-10 23:34:43 +0000775 InfoHolder.addUnit(NewCU);
776
Devang Patel1a0df9a2010-05-10 22:49:55 +0000777 CUMap.insert(std::make_pair(N, NewCU));
Devang Pateleb1bb4e2011-08-16 22:09:43 +0000778 return NewCU;
Devang Patel1a0df9a2010-05-10 22:49:55 +0000779}
780
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000781// Construct subprogram DIE.
Eric Christopher6a841382012-11-19 22:42:10 +0000782void DwarfDebug::constructSubprogramDIE(CompileUnit *TheCU,
Devang Patel1f4f98d2011-08-15 23:36:40 +0000783 const MDNode *N) {
Rafael Espindola6cf4e832011-11-04 19:00:29 +0000784 CompileUnit *&CURef = SPMap[N];
785 if (CURef)
786 return;
787 CURef = TheCU;
788
Devang Patel80ae3492009-08-28 23:24:31 +0000789 DISubprogram SP(N);
Bill Wendling2b128d72009-05-20 23:19:06 +0000790 if (!SP.isDefinition())
791 // This is a method declaration which will be handled while constructing
792 // class type.
Devang Patel0751a282009-06-26 01:49:18 +0000793 return;
Bill Wendling2b128d72009-05-20 23:19:06 +0000794
Devang Patel89543712011-08-15 17:24:54 +0000795 DIE *SubprogramDie = TheCU->getOrCreateSubprogramDIE(SP);
Stuart Hastings4bd3dd92010-04-06 21:38:29 +0000796
797 // Add to map.
Devang Patel1a0df9a2010-05-10 22:49:55 +0000798 TheCU->insertDIE(N, SubprogramDie);
Bill Wendling2b128d72009-05-20 23:19:06 +0000799
800 // Add to context owner.
Devang Patelf20c4f72011-04-12 22:53:02 +0000801 TheCU->addToContextOwner(SubprogramDie, SP.getContext());
Devang Patel512001a2009-12-08 23:21:45 +0000802
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +0000803 // Expose as global, if requested.
Eric Christopher7da24882013-08-19 21:07:38 +0000804 if (HasDwarfPubNames)
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +0000805 TheCU->addGlobalName(SP.getName(), SubprogramDie);
Bill Wendling2b128d72009-05-20 23:19:06 +0000806}
807
David Blaikie1fd43652013-05-07 21:35:53 +0000808void DwarfDebug::constructImportedEntityDIE(CompileUnit *TheCU,
David Blaikief55abea2013-04-22 06:12:31 +0000809 const MDNode *N) {
David Blaikie1fd43652013-05-07 21:35:53 +0000810 DIImportedEntity Module(N);
David Blaikief55abea2013-04-22 06:12:31 +0000811 if (!Module.Verify())
812 return;
David Blaikie684fc532013-05-06 23:33:07 +0000813 if (DIE *D = TheCU->getOrCreateContextDIE(Module.getContext()))
David Blaikie4dd2de72013-05-08 06:01:38 +0000814 constructImportedEntityDIE(TheCU, Module, D);
David Blaikie684fc532013-05-06 23:33:07 +0000815}
816
David Blaikie4dd2de72013-05-08 06:01:38 +0000817void DwarfDebug::constructImportedEntityDIE(CompileUnit *TheCU, const MDNode *N,
David Blaikie684fc532013-05-06 23:33:07 +0000818 DIE *Context) {
David Blaikie1fd43652013-05-07 21:35:53 +0000819 DIImportedEntity Module(N);
David Blaikie684fc532013-05-06 23:33:07 +0000820 if (!Module.Verify())
821 return;
David Blaikie4dd2de72013-05-08 06:01:38 +0000822 return constructImportedEntityDIE(TheCU, Module, Context);
David Blaikie684fc532013-05-06 23:33:07 +0000823}
824
David Blaikie4dd2de72013-05-08 06:01:38 +0000825void DwarfDebug::constructImportedEntityDIE(CompileUnit *TheCU,
David Blaikie1fd43652013-05-07 21:35:53 +0000826 const DIImportedEntity &Module,
David Blaikie684fc532013-05-06 23:33:07 +0000827 DIE *Context) {
828 assert(Module.Verify() &&
829 "Use one of the MDNode * overloads to handle invalid metadata");
830 assert(Context && "Should always have a context for an imported_module");
David Blaikie1fd43652013-05-07 21:35:53 +0000831 DIE *IMDie = new DIE(Module.getTag());
David Blaikief55abea2013-04-22 06:12:31 +0000832 TheCU->insertDIE(Module, IMDie);
David Blaikie1fd43652013-05-07 21:35:53 +0000833 DIE *EntityDie;
834 DIDescriptor Entity = Module.getEntity();
835 if (Entity.isNameSpace())
836 EntityDie = TheCU->getOrCreateNameSpace(DINameSpace(Entity));
837 else if (Entity.isSubprogram())
838 EntityDie = TheCU->getOrCreateSubprogramDIE(DISubprogram(Entity));
David Blaikie3b6038b2013-05-08 06:01:41 +0000839 else if (Entity.isType())
840 EntityDie = TheCU->getOrCreateTypeDIE(DIType(Entity));
David Blaikie1fd43652013-05-07 21:35:53 +0000841 else
David Blaikie3b6038b2013-05-08 06:01:41 +0000842 EntityDie = TheCU->getDIE(Entity);
David Blaikief55abea2013-04-22 06:12:31 +0000843 unsigned FileID = getOrCreateSourceID(Module.getContext().getFilename(),
844 Module.getContext().getDirectory(),
845 TheCU->getUniqueID());
846 TheCU->addUInt(IMDie, dwarf::DW_AT_decl_file, 0, FileID);
847 TheCU->addUInt(IMDie, dwarf::DW_AT_decl_line, 0, Module.getLineNumber());
Eric Christopher5fdd68e2013-06-24 23:20:02 +0000848 TheCU->addDIEEntry(IMDie, dwarf::DW_AT_import, dwarf::DW_FORM_ref4,
849 EntityDie);
David Blaikiee63d5d12013-05-20 22:50:35 +0000850 StringRef Name = Module.getName();
851 if (!Name.empty())
852 TheCU->addString(IMDie, dwarf::DW_AT_name, Name);
David Blaikie684fc532013-05-06 23:33:07 +0000853 Context->addChild(IMDie);
David Blaikief55abea2013-04-22 06:12:31 +0000854}
855
Eric Christopheracdcbdb2012-11-27 22:43:45 +0000856// Emit all Dwarf sections that should come prior to the content. Create
857// global DIEs and emit initial debug info sections. This is invoked by
858// the target AsmPrinter.
Eric Christopher58f41952012-11-19 22:42:15 +0000859void DwarfDebug::beginModule() {
Devang Patel6c74a872010-04-27 19:46:33 +0000860 if (DisableDebugInfoPrinting)
861 return;
862
Eric Christopher58f41952012-11-19 22:42:15 +0000863 const Module *M = MMI->getModule();
864
Nick Lewycky019d2552011-07-29 03:49:23 +0000865 // If module has named metadata anchors then use them, otherwise scan the
866 // module using debug info finder to collect debug info.
Devang Patele02e5852011-05-03 16:45:22 +0000867 NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu");
David Blaikiedc69ebb2013-03-11 23:39:23 +0000868 if (!CU_Nodes)
Devang Patel07bb9ee2011-08-15 23:47:24 +0000869 return;
Devang Patele02e5852011-05-03 16:45:22 +0000870
David Blaikiedc69ebb2013-03-11 23:39:23 +0000871 // Emit initial sections so we can reference labels later.
872 emitSectionLabels();
873
874 for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i) {
875 DICompileUnit CUNode(CU_Nodes->getOperand(i));
876 CompileUnit *CU = constructCompileUnit(CUNode);
David Blaikie1fd43652013-05-07 21:35:53 +0000877 DIArray ImportedEntities = CUNode.getImportedEntities();
878 for (unsigned i = 0, e = ImportedEntities.getNumElements(); i != e; ++i)
David Blaikie684fc532013-05-06 23:33:07 +0000879 ScopesWithImportedEntities.push_back(std::make_pair(
David Blaikie1fd43652013-05-07 21:35:53 +0000880 DIImportedEntity(ImportedEntities.getElement(i)).getContext(),
881 ImportedEntities.getElement(i)));
David Blaikie684fc532013-05-06 23:33:07 +0000882 std::sort(ScopesWithImportedEntities.begin(),
883 ScopesWithImportedEntities.end(), CompareFirst());
David Blaikiedc69ebb2013-03-11 23:39:23 +0000884 DIArray GVs = CUNode.getGlobalVariables();
885 for (unsigned i = 0, e = GVs.getNumElements(); i != e; ++i)
886 CU->createGlobalVariableDIE(GVs.getElement(i));
887 DIArray SPs = CUNode.getSubprograms();
888 for (unsigned i = 0, e = SPs.getNumElements(); i != e; ++i)
889 constructSubprogramDIE(CU, SPs.getElement(i));
890 DIArray EnumTypes = CUNode.getEnumTypes();
891 for (unsigned i = 0, e = EnumTypes.getNumElements(); i != e; ++i)
892 CU->getOrCreateTypeDIE(EnumTypes.getElement(i));
893 DIArray RetainedTypes = CUNode.getRetainedTypes();
894 for (unsigned i = 0, e = RetainedTypes.getNumElements(); i != e; ++i)
895 CU->getOrCreateTypeDIE(RetainedTypes.getElement(i));
David Blaikief55abea2013-04-22 06:12:31 +0000896 // Emit imported_modules last so that the relevant context is already
897 // available.
David Blaikie1fd43652013-05-07 21:35:53 +0000898 for (unsigned i = 0, e = ImportedEntities.getNumElements(); i != e; ++i)
899 constructImportedEntityDIE(CU, ImportedEntities.getElement(i));
David Blaikiedc69ebb2013-03-11 23:39:23 +0000900 }
Eric Christopher6a841382012-11-19 22:42:10 +0000901
Chris Lattner7cfa70e2010-04-05 02:19:28 +0000902 // Tell MMI that we have debug info.
903 MMI->setDebugInfoAvailability(true);
Eric Christopher6a841382012-11-19 22:42:10 +0000904
Bill Wendling2b128d72009-05-20 23:19:06 +0000905 // Prime section data.
Chris Lattner5e693ed2009-07-28 03:13:23 +0000906 SectionMap.insert(Asm->getObjFileLowering().getTextSection());
Bill Wendling2b128d72009-05-20 23:19:06 +0000907}
908
Eric Christopher960ac372012-11-22 00:59:49 +0000909// Attach DW_AT_inline attribute with inlined subprogram DIEs.
910void DwarfDebug::computeInlinedDIEs() {
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000911 // Attach DW_AT_inline attribute with inlined subprogram DIEs.
912 for (SmallPtrSet<DIE *, 4>::iterator AI = InlinedSubprogramDIEs.begin(),
Eric Christopher735401c2012-11-27 00:13:51 +0000913 AE = InlinedSubprogramDIEs.end(); AI != AE; ++AI) {
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000914 DIE *ISP = *AI;
Devang Patelf20c4f72011-04-12 22:53:02 +0000915 FirstCU->addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000916 }
Rafael Espindolae7cc8bf2011-11-12 01:57:54 +0000917 for (DenseMap<const MDNode *, DIE *>::iterator AI = AbstractSPDies.begin(),
Eric Christopher735401c2012-11-27 00:13:51 +0000918 AE = AbstractSPDies.end(); AI != AE; ++AI) {
Rafael Espindolae7cc8bf2011-11-12 01:57:54 +0000919 DIE *ISP = AI->second;
920 if (InlinedSubprogramDIEs.count(ISP))
921 continue;
922 FirstCU->addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
923 }
Eric Christopher960ac372012-11-22 00:59:49 +0000924}
925
926// Collect info for variables that were optimized out.
927void DwarfDebug::collectDeadVariables() {
928 const Module *M = MMI->getModule();
929 DenseMap<const MDNode *, LexicalScope *> DeadFnScopeMap;
930
931 if (NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu")) {
932 for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i) {
933 DICompileUnit TheCU(CU_Nodes->getOperand(i));
934 DIArray Subprograms = TheCU.getSubprograms();
935 for (unsigned i = 0, e = Subprograms.getNumElements(); i != e; ++i) {
Eric Christopher735401c2012-11-27 00:13:51 +0000936 DISubprogram SP(Subprograms.getElement(i));
937 if (ProcessedSPNodes.count(SP) != 0) continue;
Manman Ren7504ed42013-07-08 18:33:29 +0000938 if (!SP.isSubprogram()) continue;
Eric Christopher735401c2012-11-27 00:13:51 +0000939 if (!SP.isDefinition()) continue;
940 DIArray Variables = SP.getVariables();
941 if (Variables.getNumElements() == 0) continue;
Eric Christopher960ac372012-11-22 00:59:49 +0000942
Eric Christopher735401c2012-11-27 00:13:51 +0000943 LexicalScope *Scope =
944 new LexicalScope(NULL, DIDescriptor(SP), NULL, false);
945 DeadFnScopeMap[SP] = Scope;
Eric Christopher960ac372012-11-22 00:59:49 +0000946
Eric Christopher735401c2012-11-27 00:13:51 +0000947 // Construct subprogram DIE and add variables DIEs.
948 CompileUnit *SPCU = CUMap.lookup(TheCU);
949 assert(SPCU && "Unable to find Compile Unit!");
950 constructSubprogramDIE(SPCU, SP);
951 DIE *ScopeDIE = SPCU->getDIE(SP);
952 for (unsigned vi = 0, ve = Variables.getNumElements(); vi != ve; ++vi) {
953 DIVariable DV(Variables.getElement(vi));
Manman Ren7504ed42013-07-08 18:33:29 +0000954 if (!DV.isVariable()) continue;
Chandler Carruth2a1c0d22013-07-27 11:09:58 +0000955 DbgVariable NewVar(DV, NULL);
Eric Christopher735401c2012-11-27 00:13:51 +0000956 if (DIE *VariableDIE =
Chandler Carruth2a1c0d22013-07-27 11:09:58 +0000957 SPCU->constructVariableDIE(&NewVar, Scope->isAbstractScope()))
Eric Christopher735401c2012-11-27 00:13:51 +0000958 ScopeDIE->addChild(VariableDIE);
959 }
Eric Christopher960ac372012-11-22 00:59:49 +0000960 }
961 }
962 }
963 DeleteContainerSeconds(DeadFnScopeMap);
964}
965
Eric Christopher45731982013-08-08 23:45:55 +0000966// Type Signature [7.27] and ODR Hash code.
Eric Christopher67646432013-07-26 17:02:41 +0000967
968/// \brief Grabs the string in whichever attribute is passed in and returns
Eric Christopher8552e222013-08-07 01:18:33 +0000969/// a reference to it. Returns "" if the attribute doesn't exist.
Eric Christopher67646432013-07-26 17:02:41 +0000970static StringRef getDIEStringAttr(DIE *Die, unsigned Attr) {
Eric Christopher8552e222013-08-07 01:18:33 +0000971 DIEValue *V = Die->findAttribute(Attr);
Eric Christopher67646432013-07-26 17:02:41 +0000972
Eric Christopher8552e222013-08-07 01:18:33 +0000973 if (DIEString *S = dyn_cast_or_null<DIEString>(V))
974 return S->getString();
975
Eric Christopher67646432013-07-26 17:02:41 +0000976 return StringRef("");
977}
978
Eric Christopher67646432013-07-26 17:02:41 +0000979/// Return true if the current DIE is contained within an anonymous namespace.
980static bool isContainedInAnonNamespace(DIE *Die) {
981 DIE *Parent = Die->getParent();
982
983 while (Parent) {
Eric Christophere414ece2013-07-29 23:53:08 +0000984 if (Parent->getTag() == dwarf::DW_TAG_namespace &&
985 getDIEStringAttr(Parent, dwarf::DW_AT_name) == "")
Eric Christopher67646432013-07-26 17:02:41 +0000986 return true;
987 Parent = Parent->getParent();
988 }
989
990 return false;
991}
992
Eric Christopheraf15f8d2013-08-07 01:18:24 +0000993/// Test if the current CU language is C++ and that we have
994/// a named type that is not contained in an anonymous namespace.
995static bool shouldAddODRHash(CompileUnit *CU, DIE *Die) {
Eric Christopher341770d2013-08-07 08:35:10 +0000996 return CU->getLanguage() == dwarf::DW_LANG_C_plus_plus &&
997 getDIEStringAttr(Die, dwarf::DW_AT_name) != "" &&
998 !isContainedInAnonNamespace(Die);
Eric Christopher45731982013-08-08 23:45:55 +0000999}
Eric Christopheraf15f8d2013-08-07 01:18:24 +00001000
Eric Christopher960ac372012-11-22 00:59:49 +00001001void DwarfDebug::finalizeModuleInfo() {
1002 // Collect info for variables that were optimized out.
1003 collectDeadVariables();
1004
1005 // Attach DW_AT_inline attribute with inlined subprogram DIEs.
1006 computeInlinedDIEs();
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001007
Eric Christopherf8542ec2013-07-29 22:24:32 +00001008 // Split out type units and conditionally add an ODR tag to the split
1009 // out type.
Eric Christopher67646432013-07-26 17:02:41 +00001010 // FIXME: Do type splitting.
1011 for (unsigned i = 0, e = TypeUnits.size(); i != e; ++i) {
Eric Christopher67646432013-07-26 17:02:41 +00001012 DIE *Die = TypeUnits[i];
Eric Christopher45731982013-08-08 23:45:55 +00001013 DIEHash Hash;
Eric Christopheraf15f8d2013-08-07 01:18:24 +00001014 // If we've requested ODR hashes and it's applicable for an ODR hash then
1015 // add the ODR signature now.
Eric Christopher45731982013-08-08 23:45:55 +00001016 // FIXME: This should be added onto the type unit, not the type, but this
1017 // works as an intermediate stage.
Eric Christopheraf15f8d2013-08-07 01:18:24 +00001018 if (GenerateODRHash && shouldAddODRHash(CUMap.begin()->second, Die))
Eric Christopher45731982013-08-08 23:45:55 +00001019 CUMap.begin()->second->addUInt(Die, dwarf::DW_AT_GNU_odr_signature,
1020 dwarf::DW_FORM_data8,
1021 Hash.computeDIEODRSignature(Die));
Eric Christopher67646432013-07-26 17:02:41 +00001022 }
1023
Eric Christopher60eb7692013-08-12 20:27:48 +00001024 // Handle anything that needs to be done on a per-cu basis.
1025 for (DenseMap<const MDNode *, CompileUnit *>::iterator CUI = CUMap.begin(),
1026 CUE = CUMap.end();
1027 CUI != CUE; ++CUI) {
1028 CompileUnit *TheCU = CUI->second;
1029 // Emit DW_AT_containing_type attribute to connect types with their
1030 // vtable holding type.
1031 TheCU->constructContainingTypeDIEs();
1032
1033 // If we're splitting the dwarf out now that we've got the entire
1034 // CU then construct a skeleton CU based upon it.
1035 if (useSplitDwarf()) {
Eric Christopherd29614f2013-08-13 01:21:55 +00001036 uint64_t ID = 0;
1037 if (GenerateCUHash) {
1038 DIEHash CUHash;
1039 ID = CUHash.computeCUSignature(TheCU->getCUDie());
1040 }
Eric Christopher60eb7692013-08-12 20:27:48 +00001041 // This should be a unique identifier when we want to build .dwp files.
1042 TheCU->addUInt(TheCU->getCUDie(), dwarf::DW_AT_GNU_dwo_id,
Eric Christopherd29614f2013-08-13 01:21:55 +00001043 dwarf::DW_FORM_data8, ID);
Eric Christopher60eb7692013-08-12 20:27:48 +00001044 // Now construct the skeleton CU associated.
1045 CompileUnit *SkCU = constructSkeletonCU(CUI->first);
1046 // This should be a unique identifier when we want to build .dwp files.
1047 SkCU->addUInt(SkCU->getCUDie(), dwarf::DW_AT_GNU_dwo_id,
Eric Christopherd29614f2013-08-13 01:21:55 +00001048 dwarf::DW_FORM_data8, ID);
Eric Christopher60eb7692013-08-12 20:27:48 +00001049 }
1050 }
1051
1052 // Compute DIE offsets and sizes.
Eric Christopherc8a310e2012-12-10 23:34:43 +00001053 InfoHolder.computeSizeAndOffsets();
1054 if (useSplitDwarf())
1055 SkeletonHolder.computeSizeAndOffsets();
Eric Christopher960ac372012-11-22 00:59:49 +00001056}
1057
1058void DwarfDebug::endSections() {
Bill Wendling2b128d72009-05-20 23:19:06 +00001059 // Standard sections final addresses.
Chris Lattner4b7dadb2009-08-19 05:49:37 +00001060 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getTextSection());
Chris Lattnera179b522010-04-04 19:25:43 +00001061 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("text_end"));
Chris Lattner4b7dadb2009-08-19 05:49:37 +00001062 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getDataSection());
Chris Lattnera179b522010-04-04 19:25:43 +00001063 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("data_end"));
Bill Wendling2b128d72009-05-20 23:19:06 +00001064
1065 // End text sections.
Benjamin Kramer15591272012-10-31 13:45:49 +00001066 for (unsigned I = 0, E = SectionMap.size(); I != E; ++I) {
1067 Asm->OutStreamer.SwitchSection(SectionMap[I]);
1068 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("section_end", I+1));
Bill Wendling2b128d72009-05-20 23:19:06 +00001069 }
Eric Christopher960ac372012-11-22 00:59:49 +00001070}
Bill Wendling2b128d72009-05-20 23:19:06 +00001071
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001072// Emit all Dwarf sections that should come after the content.
Eric Christopher960ac372012-11-22 00:59:49 +00001073void DwarfDebug::endModule() {
1074
1075 if (!FirstCU) return;
1076
1077 // End any existing sections.
1078 // TODO: Does this need to happen?
1079 endSections();
1080
1081 // Finalize the debug info for the module.
1082 finalizeModuleInfo();
Bill Wendling2b128d72009-05-20 23:19:06 +00001083
Eric Christophercdf218d2012-12-10 19:51:21 +00001084 if (!useSplitDwarf()) {
Eric Christopher95198f502012-11-27 22:43:42 +00001085 // Emit all the DIEs into a debug info section.
1086 emitDebugInfo();
Eric Christopher4c9b1192012-11-27 00:41:54 +00001087
Eric Christopher95198f502012-11-27 22:43:42 +00001088 // Corresponding abbreviations into a abbrev section.
1089 emitAbbreviations();
1090
1091 // Emit info into a debug loc section.
1092 emitDebugLoc();
1093
1094 // Emit info into a debug aranges section.
1095 emitDebugARanges();
1096
1097 // Emit info into a debug ranges section.
1098 emitDebugRanges();
1099
1100 // Emit info into a debug macinfo section.
1101 emitDebugMacInfo();
1102
1103 // Emit inline info.
1104 // TODO: When we don't need the option anymore we
1105 // can remove all of the code that this section
1106 // depends upon.
1107 if (useDarwinGDBCompat())
1108 emitDebugInlineInfo();
1109 } else {
Eric Christopherd692c1d2012-12-11 19:42:09 +00001110 // TODO: Fill this in for separated debug sections and separate
Eric Christopher95198f502012-11-27 22:43:42 +00001111 // out information into new sections.
1112
Eric Christopher9c2ecd92012-11-30 23:59:06 +00001113 // Emit the debug info section and compile units.
Eric Christopher95198f502012-11-27 22:43:42 +00001114 emitDebugInfo();
Eric Christopher9c2ecd92012-11-30 23:59:06 +00001115 emitDebugInfoDWO();
Eric Christopher95198f502012-11-27 22:43:42 +00001116
1117 // Corresponding abbreviations into a abbrev section.
1118 emitAbbreviations();
Eric Christopher3c5a1912012-12-19 22:02:53 +00001119 emitDebugAbbrevDWO();
Eric Christopher95198f502012-11-27 22:43:42 +00001120
1121 // Emit info into a debug loc section.
1122 emitDebugLoc();
1123
1124 // Emit info into a debug aranges section.
1125 emitDebugARanges();
1126
1127 // Emit info into a debug ranges section.
1128 emitDebugRanges();
1129
1130 // Emit info into a debug macinfo section.
1131 emitDebugMacInfo();
1132
Eric Christopher962c9082013-01-15 23:56:56 +00001133 // Emit DWO addresses.
1134 InfoHolder.emitAddresses(Asm->getObjFileLowering().getDwarfAddrSection());
1135
Eric Christopher95198f502012-11-27 22:43:42 +00001136 // Emit inline info.
1137 // TODO: When we don't need the option anymore we
1138 // can remove all of the code that this section
1139 // depends upon.
1140 if (useDarwinGDBCompat())
1141 emitDebugInlineInfo();
1142 }
Bill Wendling2b128d72009-05-20 23:19:06 +00001143
Eric Christophera876b822012-08-23 07:32:06 +00001144 // Emit info into the dwarf accelerator table sections.
Eric Christopher20b76a72012-08-23 22:36:40 +00001145 if (useDwarfAccelTables()) {
Eric Christopher4996c702011-11-07 09:24:32 +00001146 emitAccelNames();
1147 emitAccelObjC();
1148 emitAccelNamespaces();
1149 emitAccelTypes();
1150 }
Eric Christopher6a841382012-11-19 22:42:10 +00001151
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00001152 // Emit info into a debug pubnames section, if requested.
Eric Christopher7da24882013-08-19 21:07:38 +00001153 if (HasDwarfPubNames)
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00001154 emitDebugPubnames();
1155
Devang Patel04d2f2d2009-11-24 01:14:22 +00001156 // Emit info into a debug pubtypes section.
Eric Christopher77826182012-08-23 07:10:56 +00001157 // TODO: When we don't need the option anymore we can
1158 // remove all of the code that adds to the table.
Eric Christopher20b76a72012-08-23 22:36:40 +00001159 if (useDarwinGDBCompat())
Eric Christopher77826182012-08-23 07:10:56 +00001160 emitDebugPubTypes();
Devang Patel04d2f2d2009-11-24 01:14:22 +00001161
Eric Christopher95198f502012-11-27 22:43:42 +00001162 // Finally emit string information into a string table.
Eric Christopher6e20a162012-11-27 06:49:23 +00001163 emitDebugStr();
Eric Christopher3bf29fd2012-12-27 02:14:01 +00001164 if (useSplitDwarf())
1165 emitDebugStrDWO();
Eric Christopher6e20a162012-11-27 06:49:23 +00001166
Devang Pateld0701282010-08-02 17:32:15 +00001167 // clean up.
Devang Pateleb1bb4e2011-08-16 22:09:43 +00001168 SPMap.clear();
Devang Patel1a0df9a2010-05-10 22:49:55 +00001169 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
1170 E = CUMap.end(); I != E; ++I)
1171 delete I->second;
Eric Christopher8afd7b62012-12-10 19:51:18 +00001172
Craig Topperd8e43652013-07-03 04:17:25 +00001173 for (SmallVectorImpl<CompileUnit *>::iterator I = SkeletonCUs.begin(),
Eric Christopher5b33b3c2013-02-06 21:53:56 +00001174 E = SkeletonCUs.end(); I != E; ++I)
1175 delete *I;
Eric Christopher8afd7b62012-12-10 19:51:18 +00001176
Eric Christopher9c2ecd92012-11-30 23:59:06 +00001177 // Reset these for the next Module if we have one.
1178 FirstCU = NULL;
Bill Wendling2b128d72009-05-20 23:19:06 +00001179}
1180
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001181// Find abstract variable, if any, associated with Var.
Devang Patelbb23a4a2011-08-10 21:50:54 +00001182DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &DV,
Chris Lattner915c5f92010-04-02 19:42:39 +00001183 DebugLoc ScopeLoc) {
Devang Patelbb23a4a2011-08-10 21:50:54 +00001184 LLVMContext &Ctx = DV->getContext();
1185 // More then one inlined variable corresponds to one abstract variable.
1186 DIVariable Var = cleanseInlinedVariable(DV, Ctx);
Devang Patelcfa8e9d2010-05-07 18:11:54 +00001187 DbgVariable *AbsDbgVariable = AbstractVariables.lookup(Var);
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001188 if (AbsDbgVariable)
1189 return AbsDbgVariable;
1190
Devang Patel7e623022011-08-10 20:55:27 +00001191 LexicalScope *Scope = LScopes.findAbstractScope(ScopeLoc.getScope(Ctx));
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001192 if (!Scope)
1193 return NULL;
1194
Devang Patel99819b52011-08-15 19:01:20 +00001195 AbsDbgVariable = new DbgVariable(Var, NULL);
Devang Patel7e623022011-08-10 20:55:27 +00001196 addScopeVariable(Scope, AbsDbgVariable);
Devang Patelcfa8e9d2010-05-07 18:11:54 +00001197 AbstractVariables[Var] = AbsDbgVariable;
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001198 return AbsDbgVariable;
1199}
1200
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001201// If Var is a current function argument then add it to CurrentFnArguments list.
Devang Patel6c622ef2011-03-01 22:58:55 +00001202bool DwarfDebug::addCurrentFnArgument(const MachineFunction *MF,
Devang Patel7e623022011-08-10 20:55:27 +00001203 DbgVariable *Var, LexicalScope *Scope) {
1204 if (!LScopes.isCurrentFunctionScope(Scope))
Devang Patel6c622ef2011-03-01 22:58:55 +00001205 return false;
1206 DIVariable DV = Var->getVariable();
1207 if (DV.getTag() != dwarf::DW_TAG_arg_variable)
1208 return false;
1209 unsigned ArgNo = DV.getArgNumber();
Eric Christopher6a841382012-11-19 22:42:10 +00001210 if (ArgNo == 0)
Devang Patel6c622ef2011-03-01 22:58:55 +00001211 return false;
1212
Devang Patel4ab660b2011-03-03 20:02:02 +00001213 size_t Size = CurrentFnArguments.size();
1214 if (Size == 0)
Devang Patel6c622ef2011-03-01 22:58:55 +00001215 CurrentFnArguments.resize(MF->getFunction()->arg_size());
Devang Patel63b3e762011-03-03 21:49:41 +00001216 // llvm::Function argument size is not good indicator of how many
Devang Patel34a7ab42011-03-03 20:08:10 +00001217 // arguments does the function have at source level.
1218 if (ArgNo > Size)
Devang Patel4ab660b2011-03-03 20:02:02 +00001219 CurrentFnArguments.resize(ArgNo * 2);
Devang Patel6c622ef2011-03-01 22:58:55 +00001220 CurrentFnArguments[ArgNo - 1] = Var;
1221 return true;
1222}
1223
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001224// Collect variable information from side table maintained by MMI.
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001225void
Nick Lewycky019d2552011-07-29 03:49:23 +00001226DwarfDebug::collectVariableInfoFromMMITable(const MachineFunction *MF,
Devang Patel490c8ab2010-05-20 19:57:06 +00001227 SmallPtrSet<const MDNode *, 16> &Processed) {
Devang Patel475d32a2009-10-06 01:26:37 +00001228 MachineModuleInfo::VariableDbgInfoMapTy &VMap = MMI->getVariableDbgInfo();
1229 for (MachineModuleInfo::VariableDbgInfoMapTy::iterator VI = VMap.begin(),
1230 VE = VMap.end(); VI != VE; ++VI) {
Devang Patel32cc43c2010-05-07 20:54:48 +00001231 const MDNode *Var = VI->first;
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001232 if (!Var) continue;
Devang Patele0a94bf2010-05-14 21:01:35 +00001233 Processed.insert(Var);
Chris Lattner915c5f92010-04-02 19:42:39 +00001234 DIVariable DV(Var);
1235 const std::pair<unsigned, DebugLoc> &VP = VI->second;
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001236
Devang Patel7e623022011-08-10 20:55:27 +00001237 LexicalScope *Scope = LScopes.findLexicalScope(VP.second);
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001238
Devang Patelcdb7d442009-11-10 23:20:04 +00001239 // If variable scope is not found then skip this variable.
Chris Lattner915c5f92010-04-02 19:42:39 +00001240 if (Scope == 0)
Devang Patelcdb7d442009-11-10 23:20:04 +00001241 continue;
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001242
Devang Patele1c53f22010-05-20 16:36:41 +00001243 DbgVariable *AbsDbgVariable = findAbstractVariable(DV, VP.second);
Devang Patel99819b52011-08-15 19:01:20 +00001244 DbgVariable *RegVar = new DbgVariable(DV, AbsDbgVariable);
Devang Patel3e4a9652011-08-15 21:24:36 +00001245 RegVar->setFrameIndex(VP.first);
Devang Patel6c622ef2011-03-01 22:58:55 +00001246 if (!addCurrentFnArgument(MF, RegVar, Scope))
Devang Patel7e623022011-08-10 20:55:27 +00001247 addScopeVariable(Scope, RegVar);
Devang Patel99819b52011-08-15 19:01:20 +00001248 if (AbsDbgVariable)
Devang Patel3e4a9652011-08-15 21:24:36 +00001249 AbsDbgVariable->setFrameIndex(VP.first);
Devang Patel475d32a2009-10-06 01:26:37 +00001250 }
Devang Patel490c8ab2010-05-20 19:57:06 +00001251}
Devang Patela3e9c9c2010-03-15 18:33:46 +00001252
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001253// Return true if debug value, encoded by DBG_VALUE instruction, is in a
1254// defined reg.
Devang Patel9fc11702010-05-25 23:40:22 +00001255static bool isDbgValueInDefinedReg(const MachineInstr *MI) {
Nick Lewycky654f5ce2011-10-26 22:55:33 +00001256 assert(MI->isDebugValue() && "Invalid DBG_VALUE machine instruction!");
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001257 return MI->getNumOperands() == 3 &&
1258 MI->getOperand(0).isReg() && MI->getOperand(0).getReg() &&
Adrian Prantl418d1d12013-07-09 20:28:37 +00001259 (MI->getOperand(1).isImm() ||
1260 (MI->getOperand(1).isReg() && MI->getOperand(1).getReg() == 0U));
Devang Patel9fc11702010-05-25 23:40:22 +00001261}
1262
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001263// Get .debug_loc entry for the instruction range starting at MI.
Eric Christopher6a841382012-11-19 22:42:10 +00001264static DotDebugLocEntry getDebugLocEntry(AsmPrinter *Asm,
1265 const MCSymbol *FLabel,
Devang Patel2442a892011-07-08 17:09:57 +00001266 const MCSymbol *SLabel,
1267 const MachineInstr *MI) {
1268 const MDNode *Var = MI->getOperand(MI->getNumOperands() - 1).getMetadata();
1269
David Blaikie0252265b2013-06-16 20:34:15 +00001270 assert(MI->getNumOperands() == 3);
Adrian Prantl418d1d12013-07-09 20:28:37 +00001271 if (MI->getOperand(0).isReg()) {
Devang Patel2442a892011-07-08 17:09:57 +00001272 MachineLocation MLoc;
Adrian Prantl418d1d12013-07-09 20:28:37 +00001273 // If the second operand is an immediate, this is a
1274 // register-indirect address.
1275 if (!MI->getOperand(1).isImm())
Adrian Prantld4c0dd42013-04-26 21:57:17 +00001276 MLoc.set(MI->getOperand(0).getReg());
1277 else
1278 MLoc.set(MI->getOperand(0).getReg(), MI->getOperand(1).getImm());
Devang Patel2442a892011-07-08 17:09:57 +00001279 return DotDebugLocEntry(FLabel, SLabel, MLoc, Var);
1280 }
1281 if (MI->getOperand(0).isImm())
1282 return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getImm());
1283 if (MI->getOperand(0).isFPImm())
1284 return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getFPImm());
1285 if (MI->getOperand(0).isCImm())
1286 return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getCImm());
1287
Craig Topperee4dab52012-02-05 08:31:47 +00001288 llvm_unreachable("Unexpected 3 operand DBG_VALUE instruction!");
Devang Patel2442a892011-07-08 17:09:57 +00001289}
1290
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001291// Find variables for each lexical scope.
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001292void
Devang Patel5c0f85c2010-06-25 22:07:34 +00001293DwarfDebug::collectVariableInfo(const MachineFunction *MF,
1294 SmallPtrSet<const MDNode *, 16> &Processed) {
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001295
Eric Christopher270a12c2013-07-03 21:37:03 +00001296 // Grab the variable info that was squirreled away in the MMI side-table.
Devang Patel490c8ab2010-05-20 19:57:06 +00001297 collectVariableInfoFromMMITable(MF, Processed);
1298
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001299 for (SmallVectorImpl<const MDNode*>::const_iterator
1300 UVI = UserVariables.begin(), UVE = UserVariables.end(); UVI != UVE;
1301 ++UVI) {
1302 const MDNode *Var = *UVI;
1303 if (Processed.count(Var))
Devang Patel490c8ab2010-05-20 19:57:06 +00001304 continue;
1305
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001306 // History contains relevant DBG_VALUE instructions for Var and instructions
1307 // clobbering it.
1308 SmallVectorImpl<const MachineInstr*> &History = DbgValues[Var];
1309 if (History.empty())
1310 continue;
1311 const MachineInstr *MInsn = History.front();
Devang Patel9fc11702010-05-25 23:40:22 +00001312
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001313 DIVariable DV(Var);
Devang Patel7e623022011-08-10 20:55:27 +00001314 LexicalScope *Scope = NULL;
Devang Patel7a9dedf2010-05-27 20:25:04 +00001315 if (DV.getTag() == dwarf::DW_TAG_arg_variable &&
1316 DISubprogram(DV.getContext()).describes(MF->getFunction()))
Devang Patel7e623022011-08-10 20:55:27 +00001317 Scope = LScopes.getCurrentFunctionScope();
David Blaikiedc69ebb2013-03-11 23:39:23 +00001318 else if (MDNode *IA = DV.getInlinedAt())
1319 Scope = LScopes.findInlinedScope(DebugLoc::getFromDILocation(IA));
1320 else
1321 Scope = LScopes.findLexicalScope(cast<MDNode>(DV->getOperand(1)));
Devang Patel490c8ab2010-05-20 19:57:06 +00001322 // If variable scope is not found then skip this variable.
Devang Patelfbd6c452010-05-21 00:10:20 +00001323 if (!Scope)
Devang Patel490c8ab2010-05-20 19:57:06 +00001324 continue;
1325
1326 Processed.insert(DV);
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001327 assert(MInsn->isDebugValue() && "History must begin with debug value");
Devang Patel99819b52011-08-15 19:01:20 +00001328 DbgVariable *AbsVar = findAbstractVariable(DV, MInsn->getDebugLoc());
1329 DbgVariable *RegVar = new DbgVariable(DV, AbsVar);
Devang Patel6c622ef2011-03-01 22:58:55 +00001330 if (!addCurrentFnArgument(MF, RegVar, Scope))
Devang Patel7e623022011-08-10 20:55:27 +00001331 addScopeVariable(Scope, RegVar);
Devang Patel99819b52011-08-15 19:01:20 +00001332 if (AbsVar)
Devang Patel3e4a9652011-08-15 21:24:36 +00001333 AbsVar->setMInsn(MInsn);
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001334
Eric Christophercc10d202012-10-08 20:48:54 +00001335 // Simplify ranges that are fully coalesced.
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001336 if (History.size() <= 1 || (History.size() == 2 &&
1337 MInsn->isIdenticalTo(History.back()))) {
Devang Patel3e4a9652011-08-15 21:24:36 +00001338 RegVar->setMInsn(MInsn);
Devang Patel9fc11702010-05-25 23:40:22 +00001339 continue;
1340 }
1341
Eric Christopher59cc0712013-01-28 17:33:26 +00001342 // Handle multiple DBG_VALUE instructions describing one variable.
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001343 RegVar->setDotDebugLocOffset(DotDebugLocEntries.size());
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001344
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001345 for (SmallVectorImpl<const MachineInstr*>::const_iterator
1346 HI = History.begin(), HE = History.end(); HI != HE; ++HI) {
1347 const MachineInstr *Begin = *HI;
1348 assert(Begin->isDebugValue() && "Invalid History entry");
Jakob Stoklund Olesen9c057ee2011-03-22 00:21:41 +00001349
Devang Patele7181b52011-06-01 23:00:17 +00001350 // Check if DBG_VALUE is truncating a range.
1351 if (Begin->getNumOperands() > 1 && Begin->getOperand(0).isReg()
1352 && !Begin->getOperand(0).getReg())
1353 continue;
1354
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001355 // Compute the range for a register location.
1356 const MCSymbol *FLabel = getLabelBeforeInsn(Begin);
1357 const MCSymbol *SLabel = 0;
1358
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001359 if (HI + 1 == HE)
1360 // If Begin is the last instruction in History then its value is valid
Chris Lattner0ab5e2c2011-04-15 05:18:47 +00001361 // until the end of the function.
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001362 SLabel = FunctionEndSym;
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001363 else {
1364 const MachineInstr *End = HI[1];
Eric Christopher6a841382012-11-19 22:42:10 +00001365 DEBUG(dbgs() << "DotDebugLoc Pair:\n"
Devang Patel53b050a2011-07-07 21:44:42 +00001366 << "\t" << *Begin << "\t" << *End << "\n");
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001367 if (End->isDebugValue())
1368 SLabel = getLabelBeforeInsn(End);
1369 else {
1370 // End is a normal instruction clobbering the range.
1371 SLabel = getLabelAfterInsn(End);
1372 assert(SLabel && "Forgot label after clobber instruction");
1373 ++HI;
1374 }
1375 }
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001376
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001377 // The value is valid until the next DBG_VALUE or clobber.
Eric Christopher365d0832011-12-16 23:42:31 +00001378 DotDebugLocEntries.push_back(getDebugLocEntry(Asm, FLabel, SLabel,
1379 Begin));
Devang Patel9fc11702010-05-25 23:40:22 +00001380 }
1381 DotDebugLocEntries.push_back(DotDebugLocEntry());
Devang Patela3e9c9c2010-03-15 18:33:46 +00001382 }
Devang Patele0a94bf2010-05-14 21:01:35 +00001383
1384 // Collect info for variables that were optimized out.
Devang Patel59e27c52011-08-19 23:28:12 +00001385 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
1386 DIArray Variables = DISubprogram(FnScope->getScopeNode()).getVariables();
1387 for (unsigned i = 0, e = Variables.getNumElements(); i != e; ++i) {
1388 DIVariable DV(Variables.getElement(i));
Manman Ren7504ed42013-07-08 18:33:29 +00001389 if (!DV || !DV.isVariable() || !Processed.insert(DV))
Devang Patel59e27c52011-08-19 23:28:12 +00001390 continue;
1391 if (LexicalScope *Scope = LScopes.findLexicalScope(DV.getContext()))
1392 addScopeVariable(Scope, new DbgVariable(DV, NULL));
Devang Patele0a94bf2010-05-14 21:01:35 +00001393 }
Devang Patel9fc11702010-05-25 23:40:22 +00001394}
Devang Patele0a94bf2010-05-14 21:01:35 +00001395
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001396// Return Label preceding the instruction.
Eric Christopher962c9082013-01-15 23:56:56 +00001397MCSymbol *DwarfDebug::getLabelBeforeInsn(const MachineInstr *MI) {
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001398 MCSymbol *Label = LabelsBeforeInsn.lookup(MI);
1399 assert(Label && "Didn't insert label before instruction");
1400 return Label;
Devang Patel9fc11702010-05-25 23:40:22 +00001401}
1402
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001403// Return Label immediately following the instruction.
Eric Christopher962c9082013-01-15 23:56:56 +00001404MCSymbol *DwarfDebug::getLabelAfterInsn(const MachineInstr *MI) {
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001405 return LabelsAfterInsn.lookup(MI);
Devang Patel475d32a2009-10-06 01:26:37 +00001406}
1407
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001408// Process beginning of an instruction.
Devang Patelb5694e72010-10-26 17:49:02 +00001409void DwarfDebug::beginInstruction(const MachineInstr *MI) {
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001410 // Check if source location changes, but ignore DBG_VALUE locations.
1411 if (!MI->isDebugValue()) {
1412 DebugLoc DL = MI->getDebugLoc();
1413 if (DL != PrevInstLoc && (!DL.isUnknown() || UnknownLocations)) {
Eric Christopheraec8a822012-04-05 20:39:05 +00001414 unsigned Flags = 0;
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001415 PrevInstLoc = DL;
Devang Patel34a66202011-05-11 19:22:19 +00001416 if (DL == PrologEndLoc) {
1417 Flags |= DWARF2_FLAG_PROLOGUE_END;
1418 PrologEndLoc = DebugLoc();
1419 }
Eric Christopheraec8a822012-04-05 20:39:05 +00001420 if (PrologEndLoc.isUnknown())
1421 Flags |= DWARF2_FLAG_IS_STMT;
1422
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001423 if (!DL.isUnknown()) {
1424 const MDNode *Scope = DL.getScope(Asm->MF->getFunction()->getContext());
Devang Patel34a66202011-05-11 19:22:19 +00001425 recordSourceLine(DL.getLine(), DL.getCol(), Scope, Flags);
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001426 } else
Devang Patel34a66202011-05-11 19:22:19 +00001427 recordSourceLine(0, 0, 0, 0);
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001428 }
Devang Patel9fc11702010-05-25 23:40:22 +00001429 }
Devang Patel23b2ae62010-03-29 22:59:58 +00001430
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001431 // Insert labels where requested.
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001432 DenseMap<const MachineInstr*, MCSymbol*>::iterator I =
1433 LabelsBeforeInsn.find(MI);
1434
1435 // No label needed.
1436 if (I == LabelsBeforeInsn.end())
1437 return;
1438
1439 // Label already assigned.
1440 if (I->second)
Devang Patel002d54d2010-05-26 19:37:24 +00001441 return;
Devang Patelbd477be2010-03-29 17:20:31 +00001442
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001443 if (!PrevLabel) {
Devang Patelacc32a52010-05-26 21:23:46 +00001444 PrevLabel = MMI->getContext().CreateTempSymbol();
1445 Asm->OutStreamer.EmitLabel(PrevLabel);
Devang Patel002d54d2010-05-26 19:37:24 +00001446 }
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001447 I->second = PrevLabel;
Devang Patel8db360d2009-10-06 01:50:42 +00001448}
1449
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001450// Process end of an instruction.
Devang Patelb5694e72010-10-26 17:49:02 +00001451void DwarfDebug::endInstruction(const MachineInstr *MI) {
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001452 // Don't create a new label after DBG_VALUE instructions.
1453 // They don't generate code.
1454 if (!MI->isDebugValue())
1455 PrevLabel = 0;
1456
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001457 DenseMap<const MachineInstr*, MCSymbol*>::iterator I =
1458 LabelsAfterInsn.find(MI);
1459
1460 // No label needed.
1461 if (I == LabelsAfterInsn.end())
1462 return;
1463
1464 // Label already assigned.
1465 if (I->second)
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001466 return;
1467
1468 // We need a label after this instruction.
1469 if (!PrevLabel) {
1470 PrevLabel = MMI->getContext().CreateTempSymbol();
1471 Asm->OutStreamer.EmitLabel(PrevLabel);
Devang Patel3ebd8932010-04-08 16:50:29 +00001472 }
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001473 I->second = PrevLabel;
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001474}
1475
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001476// Each LexicalScope has first instruction and last instruction to mark
1477// beginning and end of a scope respectively. Create an inverse map that list
1478// scopes starts (and ends) with an instruction. One instruction may start (or
1479// end) multiple scopes. Ignore scopes that are not reachable.
Devang Patel359b0132010-04-08 18:43:56 +00001480void DwarfDebug::identifyScopeMarkers() {
Devang Patel7e623022011-08-10 20:55:27 +00001481 SmallVector<LexicalScope *, 4> WorkList;
1482 WorkList.push_back(LScopes.getCurrentFunctionScope());
Devang Patel7771b7c2010-01-20 02:05:23 +00001483 while (!WorkList.empty()) {
Devang Patel7e623022011-08-10 20:55:27 +00001484 LexicalScope *S = WorkList.pop_back_val();
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001485
Craig Topper977e9cd2013-07-03 04:24:43 +00001486 const SmallVectorImpl<LexicalScope *> &Children = S->getChildren();
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001487 if (!Children.empty())
Craig Topperd8e43652013-07-03 04:17:25 +00001488 for (SmallVectorImpl<LexicalScope *>::const_iterator SI = Children.begin(),
Devang Patel7771b7c2010-01-20 02:05:23 +00001489 SE = Children.end(); SI != SE; ++SI)
1490 WorkList.push_back(*SI);
1491
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001492 if (S->isAbstractScope())
1493 continue;
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001494
Craig Topper977e9cd2013-07-03 04:24:43 +00001495 const SmallVectorImpl<InsnRange> &Ranges = S->getRanges();
Devang Patel6c74a872010-04-27 19:46:33 +00001496 if (Ranges.empty())
1497 continue;
Craig Topperd8e43652013-07-03 04:17:25 +00001498 for (SmallVectorImpl<InsnRange>::const_iterator RI = Ranges.begin(),
Devang Patel6c74a872010-04-27 19:46:33 +00001499 RE = Ranges.end(); RI != RE; ++RI) {
Devang Patel7e623022011-08-10 20:55:27 +00001500 assert(RI->first && "InsnRange does not have first instruction!");
1501 assert(RI->second && "InsnRange does not have second instruction!");
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001502 requestLabelBeforeInsn(RI->first);
1503 requestLabelAfterInsn(RI->second);
Devang Patel6c74a872010-04-27 19:46:33 +00001504 }
Devang Patel75cc16c2009-10-01 20:31:14 +00001505 }
Devang Patel75cc16c2009-10-01 20:31:14 +00001506}
1507
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001508// Get MDNode for DebugLoc's scope.
Devang Patel589845d2011-05-09 22:14:49 +00001509static MDNode *getScopeNode(DebugLoc DL, const LLVMContext &Ctx) {
1510 if (MDNode *InlinedAt = DL.getInlinedAt(Ctx))
1511 return getScopeNode(DebugLoc::getFromDILocation(InlinedAt), Ctx);
1512 return DL.getScope(Ctx);
1513}
1514
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001515// Walk up the scope chain of given debug loc and find line number info
1516// for the function.
Devang Patel34a66202011-05-11 19:22:19 +00001517static DebugLoc getFnDebugLoc(DebugLoc DL, const LLVMContext &Ctx) {
1518 const MDNode *Scope = getScopeNode(DL, Ctx);
1519 DISubprogram SP = getDISubprogram(Scope);
Manman Ren7504ed42013-07-08 18:33:29 +00001520 if (SP.isSubprogram()) {
Eric Christopher34164192012-04-03 00:43:49 +00001521 // Check for number of operands since the compatibility is
1522 // cheap here.
Eric Christopherb81e2b42012-04-03 17:55:42 +00001523 if (SP->getNumOperands() > 19)
Eric Christopher34164192012-04-03 00:43:49 +00001524 return DebugLoc::get(SP.getScopeLineNumber(), 0, SP);
1525 else
1526 return DebugLoc::get(SP.getLineNumber(), 0, SP);
1527 }
1528
Devang Patel34a66202011-05-11 19:22:19 +00001529 return DebugLoc();
1530}
1531
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001532// Gather pre-function debug information. Assumes being called immediately
1533// after the function entry point has been emitted.
Chris Lattner76555b52010-01-26 23:18:02 +00001534void DwarfDebug::beginFunction(const MachineFunction *MF) {
Chris Lattner196dbdc2010-04-05 03:52:55 +00001535 if (!MMI->hasDebugInfo()) return;
Devang Patel7e623022011-08-10 20:55:27 +00001536 LScopes.initialize(*MF);
1537 if (LScopes.empty()) return;
1538 identifyScopeMarkers();
Devang Patel4598eb62009-10-06 18:37:31 +00001539
Manman Ren4e042a62013-02-05 21:52:47 +00001540 // Set DwarfCompileUnitID in MCContext to the Compile Unit this function
1541 // belongs to.
1542 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
1543 CompileUnit *TheCU = SPMap.lookup(FnScope->getScopeNode());
1544 assert(TheCU && "Unable to find compile unit!");
Manman Ren9d4c7352013-05-21 00:57:22 +00001545 if (Asm->TM.hasMCUseLoc() &&
1546 Asm->OutStreamer.getKind() == MCStreamer::SK_AsmStreamer)
1547 // Use a single line table if we are using .loc and generating assembly.
1548 Asm->OutStreamer.getContext().setDwarfCompileUnitID(0);
1549 else
1550 Asm->OutStreamer.getContext().setDwarfCompileUnitID(TheCU->getUniqueID());
Manman Ren4e042a62013-02-05 21:52:47 +00001551
Devang Patel6c74a872010-04-27 19:46:33 +00001552 FunctionBeginSym = Asm->GetTempSymbol("func_begin",
1553 Asm->getFunctionNumber());
Bill Wendling2b128d72009-05-20 23:19:06 +00001554 // Assumes in correct section after the entry point.
Devang Patel6c74a872010-04-27 19:46:33 +00001555 Asm->OutStreamer.EmitLabel(FunctionBeginSym);
Bill Wendling2b128d72009-05-20 23:19:06 +00001556
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001557 assert(UserVariables.empty() && DbgValues.empty() && "Maps weren't cleaned");
1558
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001559 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001560 // LiveUserVar - Map physreg numbers to the MDNode they contain.
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001561 std::vector<const MDNode*> LiveUserVar(TRI->getNumRegs());
1562
Devang Patel002d54d2010-05-26 19:37:24 +00001563 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001564 I != E; ++I) {
1565 bool AtBlockEntry = true;
Devang Patel002d54d2010-05-26 19:37:24 +00001566 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
1567 II != IE; ++II) {
1568 const MachineInstr *MI = II;
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001569
Devang Patel002d54d2010-05-26 19:37:24 +00001570 if (MI->isDebugValue()) {
Nick Lewycky654f5ce2011-10-26 22:55:33 +00001571 assert(MI->getNumOperands() > 1 && "Invalid machine instruction!");
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001572
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001573 // Keep track of user variables.
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001574 const MDNode *Var =
1575 MI->getOperand(MI->getNumOperands() - 1).getMetadata();
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001576
1577 // Variable is in a register, we need to check for clobbers.
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001578 if (isDbgValueInDefinedReg(MI))
1579 LiveUserVar[MI->getOperand(0).getReg()] = Var;
1580
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001581 // Check the history of this variable.
1582 SmallVectorImpl<const MachineInstr*> &History = DbgValues[Var];
1583 if (History.empty()) {
1584 UserVariables.push_back(Var);
1585 // The first mention of a function argument gets the FunctionBeginSym
1586 // label, so arguments are visible when breaking at function entry.
1587 DIVariable DV(Var);
Manman Ren7504ed42013-07-08 18:33:29 +00001588 if (DV.isVariable() && DV.getTag() == dwarf::DW_TAG_arg_variable &&
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001589 DISubprogram(getDISubprogram(DV.getContext()))
1590 .describes(MF->getFunction()))
1591 LabelsBeforeInsn[MI] = FunctionBeginSym;
1592 } else {
1593 // We have seen this variable before. Try to coalesce DBG_VALUEs.
1594 const MachineInstr *Prev = History.back();
1595 if (Prev->isDebugValue()) {
1596 // Coalesce identical entries at the end of History.
1597 if (History.size() >= 2 &&
Devang Patelb7a328e2011-07-07 00:14:27 +00001598 Prev->isIdenticalTo(History[History.size() - 2])) {
Eric Christopher85a495e2012-10-08 20:48:49 +00001599 DEBUG(dbgs() << "Coalescing identical DBG_VALUE entries:\n"
Eric Christopher6a841382012-11-19 22:42:10 +00001600 << "\t" << *Prev
Devang Patelb7a328e2011-07-07 00:14:27 +00001601 << "\t" << *History[History.size() - 2] << "\n");
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001602 History.pop_back();
Devang Patelb7a328e2011-07-07 00:14:27 +00001603 }
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001604
1605 // Terminate old register assignments that don't reach MI;
1606 MachineFunction::const_iterator PrevMBB = Prev->getParent();
1607 if (PrevMBB != I && (!AtBlockEntry || llvm::next(PrevMBB) != I) &&
1608 isDbgValueInDefinedReg(Prev)) {
1609 // Previous register assignment needs to terminate at the end of
1610 // its basic block.
1611 MachineBasicBlock::const_iterator LastMI =
1612 PrevMBB->getLastNonDebugInstr();
Devang Patelb7a328e2011-07-07 00:14:27 +00001613 if (LastMI == PrevMBB->end()) {
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001614 // Drop DBG_VALUE for empty range.
Eric Christopher85a495e2012-10-08 20:48:49 +00001615 DEBUG(dbgs() << "Dropping DBG_VALUE for empty range:\n"
Devang Patelb7a328e2011-07-07 00:14:27 +00001616 << "\t" << *Prev << "\n");
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001617 History.pop_back();
David Blaikieea2605d2013-06-20 00:25:24 +00001618 } else if (llvm::next(PrevMBB) != PrevMBB->getParent()->end())
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001619 // Terminate after LastMI.
1620 History.push_back(LastMI);
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001621 }
1622 }
1623 }
1624 History.push_back(MI);
Devang Patel002d54d2010-05-26 19:37:24 +00001625 } else {
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001626 // Not a DBG_VALUE instruction.
1627 if (!MI->isLabel())
1628 AtBlockEntry = false;
1629
Eric Christopher133195782012-10-04 20:46:14 +00001630 // First known non-DBG_VALUE and non-frame setup location marks
1631 // the beginning of the function body.
1632 if (!MI->getFlag(MachineInstr::FrameSetup) &&
1633 (PrologEndLoc.isUnknown() && !MI->getDebugLoc().isUnknown()))
Devang Patel34a66202011-05-11 19:22:19 +00001634 PrologEndLoc = MI->getDebugLoc();
1635
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001636 // Check if the instruction clobbers any registers with debug vars.
1637 for (MachineInstr::const_mop_iterator MOI = MI->operands_begin(),
1638 MOE = MI->operands_end(); MOI != MOE; ++MOI) {
1639 if (!MOI->isReg() || !MOI->isDef() || !MOI->getReg())
1640 continue;
Jakob Stoklund Olesen54038d72012-06-01 23:28:30 +00001641 for (MCRegAliasIterator AI(MOI->getReg(), TRI, true);
1642 AI.isValid(); ++AI) {
1643 unsigned Reg = *AI;
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001644 const MDNode *Var = LiveUserVar[Reg];
1645 if (!Var)
1646 continue;
1647 // Reg is now clobbered.
1648 LiveUserVar[Reg] = 0;
1649
1650 // Was MD last defined by a DBG_VALUE referring to Reg?
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001651 DbgValueHistoryMap::iterator HistI = DbgValues.find(Var);
1652 if (HistI == DbgValues.end())
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001653 continue;
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001654 SmallVectorImpl<const MachineInstr*> &History = HistI->second;
1655 if (History.empty())
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001656 continue;
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001657 const MachineInstr *Prev = History.back();
1658 // Sanity-check: Register assignments are terminated at the end of
1659 // their block.
1660 if (!Prev->isDebugValue() || Prev->getParent() != MI->getParent())
1661 continue;
1662 // Is the variable still in Reg?
1663 if (!isDbgValueInDefinedReg(Prev) ||
1664 Prev->getOperand(0).getReg() != Reg)
1665 continue;
1666 // Var is clobbered. Make sure the next instruction gets a label.
1667 History.push_back(MI);
Jakob Stoklund Olesenec0ac3c2011-03-22 22:33:08 +00001668 }
1669 }
Devang Patel002d54d2010-05-26 19:37:24 +00001670 }
Devang Patel002d54d2010-05-26 19:37:24 +00001671 }
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001672 }
1673
1674 for (DbgValueHistoryMap::iterator I = DbgValues.begin(), E = DbgValues.end();
1675 I != E; ++I) {
1676 SmallVectorImpl<const MachineInstr*> &History = I->second;
1677 if (History.empty())
1678 continue;
1679
1680 // Make sure the final register assignments are terminated.
1681 const MachineInstr *Prev = History.back();
1682 if (Prev->isDebugValue() && isDbgValueInDefinedReg(Prev)) {
1683 const MachineBasicBlock *PrevMBB = Prev->getParent();
Eric Christopher6a841382012-11-19 22:42:10 +00001684 MachineBasicBlock::const_iterator LastMI =
Devang Patel784077e2011-08-10 23:58:09 +00001685 PrevMBB->getLastNonDebugInstr();
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001686 if (LastMI == PrevMBB->end())
1687 // Drop DBG_VALUE for empty range.
1688 History.pop_back();
David Blaikieea2605d2013-06-20 00:25:24 +00001689 else if (PrevMBB != &PrevMBB->getParent()->back()) {
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001690 // Terminate after LastMI.
1691 History.push_back(LastMI);
1692 }
1693 }
1694 // Request labels for the full history.
1695 for (unsigned i = 0, e = History.size(); i != e; ++i) {
1696 const MachineInstr *MI = History[i];
1697 if (MI->isDebugValue())
1698 requestLabelBeforeInsn(MI);
1699 else
1700 requestLabelAfterInsn(MI);
1701 }
1702 }
Devang Patel002d54d2010-05-26 19:37:24 +00001703
Jakob Stoklund Olesen1886a4c2011-03-25 17:20:59 +00001704 PrevInstLoc = DebugLoc();
Devang Patel002d54d2010-05-26 19:37:24 +00001705 PrevLabel = FunctionBeginSym;
Devang Patel34a66202011-05-11 19:22:19 +00001706
1707 // Record beginning of function.
1708 if (!PrologEndLoc.isUnknown()) {
1709 DebugLoc FnStartDL = getFnDebugLoc(PrologEndLoc,
1710 MF->getFunction()->getContext());
1711 recordSourceLine(FnStartDL.getLine(), FnStartDL.getCol(),
1712 FnStartDL.getScope(MF->getFunction()->getContext()),
David Blaikie67cb31e2012-12-04 22:02:33 +00001713 // We'd like to list the prologue as "not statements" but GDB behaves
1714 // poorly if we do that. Revisit this with caution/GDB (7.5+) testing.
David Blaikie5a773bb2012-12-04 21:05:36 +00001715 DWARF2_FLAG_IS_STMT);
Devang Patel34a66202011-05-11 19:22:19 +00001716 }
Bill Wendling2b128d72009-05-20 23:19:06 +00001717}
1718
Devang Patel7e623022011-08-10 20:55:27 +00001719void DwarfDebug::addScopeVariable(LexicalScope *LS, DbgVariable *Var) {
David Blaikie6f1a8062013-06-05 05:39:59 +00001720 SmallVectorImpl<DbgVariable *> &Vars = ScopeVariables[LS];
1721 DIVariable DV = Var->getVariable();
David Blaikie36d5d2f2013-06-06 21:04:51 +00001722 // Variables with positive arg numbers are parameters.
1723 if (unsigned ArgNum = DV.getArgNumber()) {
1724 // Keep all parameters in order at the start of the variable list to ensure
1725 // function types are correct (no out-of-order parameters)
1726 //
1727 // This could be improved by only doing it for optimized builds (unoptimized
1728 // builds have the right order to begin with), searching from the back (this
1729 // would catch the unoptimized case quickly), or doing a binary search
1730 // rather than linear search.
1731 SmallVectorImpl<DbgVariable *>::iterator I = Vars.begin();
1732 while (I != Vars.end()) {
1733 unsigned CurNum = (*I)->getVariable().getArgNumber();
1734 // A local (non-parameter) variable has been found, insert immediately
1735 // before it.
1736 if (CurNum == 0)
1737 break;
1738 // A later indexed parameter has been found, insert immediately before it.
David Blaikieb272a752013-06-06 22:28:26 +00001739 if (CurNum > ArgNum)
David Blaikie36d5d2f2013-06-06 21:04:51 +00001740 break;
David Blaikieb272a752013-06-06 22:28:26 +00001741 ++I;
David Blaikie6f1a8062013-06-05 05:39:59 +00001742 }
David Blaikie36d5d2f2013-06-06 21:04:51 +00001743 Vars.insert(I, Var);
1744 return;
David Blaikie6f1a8062013-06-05 05:39:59 +00001745 }
1746
1747 Vars.push_back(Var);
Devang Patel7e623022011-08-10 20:55:27 +00001748}
1749
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001750// Gather and emit post-function debug information.
Chris Lattner76555b52010-01-26 23:18:02 +00001751void DwarfDebug::endFunction(const MachineFunction *MF) {
Devang Patel7e623022011-08-10 20:55:27 +00001752 if (!MMI->hasDebugInfo() || LScopes.empty()) return;
Devang Patel2904aa92009-11-12 19:02:56 +00001753
Devang Patel7e623022011-08-10 20:55:27 +00001754 // Define end label for subprogram.
1755 FunctionEndSym = Asm->GetTempSymbol("func_end",
1756 Asm->getFunctionNumber());
1757 // Assumes in correct section after the entry point.
1758 Asm->OutStreamer.EmitLabel(FunctionEndSym);
Manman Ren4e042a62013-02-05 21:52:47 +00001759 // Set DwarfCompileUnitID in MCContext to default value.
1760 Asm->OutStreamer.getContext().setDwarfCompileUnitID(0);
Eric Christopher6a841382012-11-19 22:42:10 +00001761
Devang Patel7e623022011-08-10 20:55:27 +00001762 SmallPtrSet<const MDNode *, 16> ProcessedVars;
1763 collectVariableInfo(MF, ProcessedVars);
Eric Christopher6a841382012-11-19 22:42:10 +00001764
Devang Patel3acc70e2011-08-15 22:04:40 +00001765 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
Devang Pateleb1bb4e2011-08-16 22:09:43 +00001766 CompileUnit *TheCU = SPMap.lookup(FnScope->getScopeNode());
Nick Lewycky654f5ce2011-10-26 22:55:33 +00001767 assert(TheCU && "Unable to find compile unit!");
Devang Patel3acc70e2011-08-15 22:04:40 +00001768
Devang Patel7e623022011-08-10 20:55:27 +00001769 // Construct abstract scopes.
Devang Patel44403472011-08-12 18:10:19 +00001770 ArrayRef<LexicalScope *> AList = LScopes.getAbstractScopesList();
1771 for (unsigned i = 0, e = AList.size(); i != e; ++i) {
1772 LexicalScope *AScope = AList[i];
1773 DISubprogram SP(AScope->getScopeNode());
Manman Ren7504ed42013-07-08 18:33:29 +00001774 if (SP.isSubprogram()) {
Devang Patel7e623022011-08-10 20:55:27 +00001775 // Collect info for variables that were optimized out.
Devang Patel59e27c52011-08-19 23:28:12 +00001776 DIArray Variables = SP.getVariables();
1777 for (unsigned i = 0, e = Variables.getNumElements(); i != e; ++i) {
1778 DIVariable DV(Variables.getElement(i));
Manman Ren7504ed42013-07-08 18:33:29 +00001779 if (!DV || !DV.isVariable() || !ProcessedVars.insert(DV))
Devang Patel59e27c52011-08-19 23:28:12 +00001780 continue;
Alexey Samsonov39602782012-07-06 08:45:08 +00001781 // Check that DbgVariable for DV wasn't created earlier, when
1782 // findAbstractVariable() was called for inlined instance of DV.
1783 LLVMContext &Ctx = DV->getContext();
1784 DIVariable CleanDV = cleanseInlinedVariable(DV, Ctx);
1785 if (AbstractVariables.lookup(CleanDV))
1786 continue;
Devang Patel59e27c52011-08-19 23:28:12 +00001787 if (LexicalScope *Scope = LScopes.findAbstractScope(DV.getContext()))
1788 addScopeVariable(Scope, new DbgVariable(DV, NULL));
Devang Patel5c0f85c2010-06-25 22:07:34 +00001789 }
1790 }
Devang Patel44403472011-08-12 18:10:19 +00001791 if (ProcessedSPNodes.count(AScope->getScopeNode()) == 0)
Manman Ren4213c392013-05-29 17:16:59 +00001792 constructScopeDIE(TheCU, AScope);
Bill Wendling2b128d72009-05-20 23:19:06 +00001793 }
Eric Christopher6a841382012-11-19 22:42:10 +00001794
Devang Patel3acc70e2011-08-15 22:04:40 +00001795 DIE *CurFnDIE = constructScopeDIE(TheCU, FnScope);
Eric Christopher6a841382012-11-19 22:42:10 +00001796
Nick Lewycky50f02cb2011-12-02 22:16:29 +00001797 if (!MF->getTarget().Options.DisableFramePointerElim(*MF))
Eric Christopherbb69a272012-08-24 01:14:27 +00001798 TheCU->addFlag(CurFnDIE, dwarf::DW_AT_APPLE_omit_frame_ptr);
Devang Patel3acc70e2011-08-15 22:04:40 +00001799
Bill Wendling2b128d72009-05-20 23:19:06 +00001800 // Clear debug info
Craig Topper2b4a2012013-07-03 04:40:27 +00001801 for (ScopeVariablesMap::iterator
Devang Patel7e623022011-08-10 20:55:27 +00001802 I = ScopeVariables.begin(), E = ScopeVariables.end(); I != E; ++I)
1803 DeleteContainerPointers(I->second);
1804 ScopeVariables.clear();
Devang Patelad45d912011-04-22 18:09:57 +00001805 DeleteContainerPointers(CurrentFnArguments);
Jakob Stoklund Olesen9a624fa2011-03-26 02:19:36 +00001806 UserVariables.clear();
1807 DbgValues.clear();
Jeffrey Yasskin35b4e4f2010-03-12 17:45:06 +00001808 AbstractVariables.clear();
Devang Patel6c74a872010-04-27 19:46:33 +00001809 LabelsBeforeInsn.clear();
1810 LabelsAfterInsn.clear();
Devang Patel12563b32010-04-16 23:33:45 +00001811 PrevLabel = NULL;
Bill Wendling2b128d72009-05-20 23:19:06 +00001812}
1813
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001814// Register a source line with debug info. Returns the unique label that was
1815// emitted and which provides correspondence to the source line list.
Devang Patel34a66202011-05-11 19:22:19 +00001816void DwarfDebug::recordSourceLine(unsigned Line, unsigned Col, const MDNode *S,
1817 unsigned Flags) {
Devang Patel2d9caf92009-11-25 17:36:49 +00001818 StringRef Fn;
Devang Patele01b75c2011-03-24 20:30:50 +00001819 StringRef Dir;
Dan Gohman50849c62010-05-05 23:41:32 +00001820 unsigned Src = 1;
1821 if (S) {
1822 DIDescriptor Scope(S);
Devang Patel2089d162009-10-05 18:03:19 +00001823
Dan Gohman50849c62010-05-05 23:41:32 +00001824 if (Scope.isCompileUnit()) {
1825 DICompileUnit CU(S);
Dan Gohman50849c62010-05-05 23:41:32 +00001826 Fn = CU.getFilename();
Devang Patele01b75c2011-03-24 20:30:50 +00001827 Dir = CU.getDirectory();
Devang Patelc4b69052010-10-28 17:30:52 +00001828 } else if (Scope.isFile()) {
1829 DIFile F(S);
Devang Patelc4b69052010-10-28 17:30:52 +00001830 Fn = F.getFilename();
Devang Patele01b75c2011-03-24 20:30:50 +00001831 Dir = F.getDirectory();
Dan Gohman50849c62010-05-05 23:41:32 +00001832 } else if (Scope.isSubprogram()) {
1833 DISubprogram SP(S);
Dan Gohman50849c62010-05-05 23:41:32 +00001834 Fn = SP.getFilename();
Devang Patele01b75c2011-03-24 20:30:50 +00001835 Dir = SP.getDirectory();
Eric Christopher6647b832011-10-11 22:59:11 +00001836 } else if (Scope.isLexicalBlockFile()) {
1837 DILexicalBlockFile DBF(S);
1838 Fn = DBF.getFilename();
1839 Dir = DBF.getDirectory();
Dan Gohman50849c62010-05-05 23:41:32 +00001840 } else if (Scope.isLexicalBlock()) {
1841 DILexicalBlock DB(S);
Dan Gohman50849c62010-05-05 23:41:32 +00001842 Fn = DB.getFilename();
Devang Patele01b75c2011-03-24 20:30:50 +00001843 Dir = DB.getDirectory();
Dan Gohman50849c62010-05-05 23:41:32 +00001844 } else
Craig Topperee4dab52012-02-05 08:31:47 +00001845 llvm_unreachable("Unexpected scope info");
Dan Gohman50849c62010-05-05 23:41:32 +00001846
Manman Ren1e427202013-03-07 01:42:00 +00001847 Src = getOrCreateSourceID(Fn, Dir,
1848 Asm->OutStreamer.getContext().getDwarfCompileUnitID());
Dan Gohman50849c62010-05-05 23:41:32 +00001849 }
Nick Lewycky019d2552011-07-29 03:49:23 +00001850 Asm->OutStreamer.EmitDwarfLocDirective(Src, Line, Col, Flags, 0, 0, Fn);
Bill Wendling2b128d72009-05-20 23:19:06 +00001851}
1852
Bill Wendling806535f2009-05-20 23:22:40 +00001853//===----------------------------------------------------------------------===//
1854// Emit Methods
1855//===----------------------------------------------------------------------===//
1856
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001857// Compute the size and offset of a DIE.
Jim Grosbach00e9c612009-11-22 19:20:36 +00001858unsigned
Eric Christopherc8a310e2012-12-10 23:34:43 +00001859DwarfUnits::computeSizeAndOffset(DIE *Die, unsigned Offset) {
Bill Wendling480ff322009-05-20 23:21:38 +00001860 // Get the children.
1861 const std::vector<DIE *> &Children = Die->getChildren();
1862
Bill Wendling480ff322009-05-20 23:21:38 +00001863 // Record the abbreviation.
Devang Patel930143b2009-11-21 02:48:08 +00001864 assignAbbrevNumber(Die->getAbbrev());
Bill Wendling480ff322009-05-20 23:21:38 +00001865
1866 // Get the abbreviation for this DIE.
1867 unsigned AbbrevNumber = Die->getAbbrevNumber();
Eric Christopherc8a310e2012-12-10 23:34:43 +00001868 const DIEAbbrev *Abbrev = Abbreviations->at(AbbrevNumber - 1);
Bill Wendling480ff322009-05-20 23:21:38 +00001869
1870 // Set DIE offset
1871 Die->setOffset(Offset);
1872
1873 // Start the size with the size of abbreviation code.
Chris Lattner7b26fce2009-08-22 20:48:53 +00001874 Offset += MCAsmInfo::getULEB128Size(AbbrevNumber);
Bill Wendling480ff322009-05-20 23:21:38 +00001875
Eric Christopher4887c8f2013-03-29 23:34:06 +00001876 const SmallVectorImpl<DIEValue*> &Values = Die->getValues();
1877 const SmallVectorImpl<DIEAbbrevData> &AbbrevData = Abbrev->getData();
Bill Wendling480ff322009-05-20 23:21:38 +00001878
1879 // Size the DIE attribute values.
1880 for (unsigned i = 0, N = Values.size(); i < N; ++i)
1881 // Size attribute value.
Chris Lattner5a00dea2010-04-05 00:18:22 +00001882 Offset += Values[i]->SizeOf(Asm, AbbrevData[i].getForm());
Bill Wendling480ff322009-05-20 23:21:38 +00001883
1884 // Size the DIE children if any.
1885 if (!Children.empty()) {
1886 assert(Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes &&
1887 "Children flag not set");
1888
1889 for (unsigned j = 0, M = Children.size(); j < M; ++j)
Eric Christopher1f0cbb82012-11-20 22:14:13 +00001890 Offset = computeSizeAndOffset(Children[j], Offset);
Bill Wendling480ff322009-05-20 23:21:38 +00001891
1892 // End of children marker.
1893 Offset += sizeof(int8_t);
1894 }
1895
1896 Die->setSize(Offset - Die->getOffset());
1897 return Offset;
1898}
1899
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001900// Compute the size and offset of all the DIEs.
Eric Christopherc8a310e2012-12-10 23:34:43 +00001901void DwarfUnits::computeSizeAndOffsets() {
Manman Ren14a029d2013-03-12 18:27:15 +00001902 // Offset from the beginning of debug info section.
Eric Christopherd1c5a312013-05-30 00:43:35 +00001903 unsigned SecOffset = 0;
Eric Christopher4887c8f2013-03-29 23:34:06 +00001904 for (SmallVectorImpl<CompileUnit *>::iterator I = CUs.begin(),
Eric Christopherc8a310e2012-12-10 23:34:43 +00001905 E = CUs.end(); I != E; ++I) {
Eric Christopherd1c5a312013-05-30 00:43:35 +00001906 (*I)->setDebugInfoOffset(SecOffset);
Eric Christopher9c2ecd92012-11-30 23:59:06 +00001907 unsigned Offset =
1908 sizeof(int32_t) + // Length of Compilation Unit Info
1909 sizeof(int16_t) + // DWARF version number
1910 sizeof(int32_t) + // Offset Into Abbrev. Section
1911 sizeof(int8_t); // Pointer Size (in bytes)
1912
Manman Ren14a029d2013-03-12 18:27:15 +00001913 unsigned EndOffset = computeSizeAndOffset((*I)->getCUDie(), Offset);
Eric Christopherd1c5a312013-05-30 00:43:35 +00001914 SecOffset += EndOffset;
Devang Patel1a0df9a2010-05-10 22:49:55 +00001915 }
Bill Wendling480ff322009-05-20 23:21:38 +00001916}
1917
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001918// Emit initial Dwarf sections with a label at the start of each one.
Eric Christopher7b30f2e42012-11-21 00:34:35 +00001919void DwarfDebug::emitSectionLabels() {
Chris Lattner4b7dadb2009-08-19 05:49:37 +00001920 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
Daniel Dunbarc418d6b2009-09-19 20:40:05 +00001921
Bill Wendling480ff322009-05-20 23:21:38 +00001922 // Dwarf sections base addresses.
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001923 DwarfInfoSectionSym =
Eric Christopher7b30f2e42012-11-21 00:34:35 +00001924 emitSectionSym(Asm, TLOF.getDwarfInfoSection(), "section_info");
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001925 DwarfAbbrevSectionSym =
Eric Christopher7b30f2e42012-11-21 00:34:35 +00001926 emitSectionSym(Asm, TLOF.getDwarfAbbrevSection(), "section_abbrev");
Eric Christopher3c5a1912012-12-19 22:02:53 +00001927 if (useSplitDwarf())
1928 DwarfAbbrevDWOSectionSym =
1929 emitSectionSym(Asm, TLOF.getDwarfAbbrevDWOSection(),
1930 "section_abbrev_dwo");
Eric Christopher7b30f2e42012-11-21 00:34:35 +00001931 emitSectionSym(Asm, TLOF.getDwarfARangesSection());
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001932
Chris Lattner6629ca92010-04-04 22:59:04 +00001933 if (const MCSection *MacroInfo = TLOF.getDwarfMacroInfoSection())
Eric Christopher7b30f2e42012-11-21 00:34:35 +00001934 emitSectionSym(Asm, MacroInfo);
Bill Wendling480ff322009-05-20 23:21:38 +00001935
Eric Christopher74804332013-02-07 21:19:50 +00001936 DwarfLineSectionSym =
1937 emitSectionSym(Asm, TLOF.getDwarfLineSection(), "section_line");
Eric Christopher7b30f2e42012-11-21 00:34:35 +00001938 emitSectionSym(Asm, TLOF.getDwarfLocSection());
Eric Christopher7da24882013-08-19 21:07:38 +00001939 if (HasDwarfPubNames)
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00001940 emitSectionSym(Asm, TLOF.getDwarfPubNamesSection());
Eric Christopher7b30f2e42012-11-21 00:34:35 +00001941 emitSectionSym(Asm, TLOF.getDwarfPubTypesSection());
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001942 DwarfStrSectionSym =
Eric Christopher3bf29fd2012-12-27 02:14:01 +00001943 emitSectionSym(Asm, TLOF.getDwarfStrSection(), "info_string");
Eric Christopher55863be2013-04-07 03:43:09 +00001944 if (useSplitDwarf()) {
Eric Christopher3bf29fd2012-12-27 02:14:01 +00001945 DwarfStrDWOSectionSym =
1946 emitSectionSym(Asm, TLOF.getDwarfStrDWOSection(), "skel_string");
Eric Christopher55863be2013-04-07 03:43:09 +00001947 DwarfAddrSectionSym =
1948 emitSectionSym(Asm, TLOF.getDwarfAddrSection(), "addr_sec");
1949 }
Eric Christopher7b30f2e42012-11-21 00:34:35 +00001950 DwarfDebugRangeSectionSym = emitSectionSym(Asm, TLOF.getDwarfRangesSection(),
Devang Patel12563b32010-04-16 23:33:45 +00001951 "debug_range");
Bill Wendling480ff322009-05-20 23:21:38 +00001952
Eric Christopher7b30f2e42012-11-21 00:34:35 +00001953 DwarfDebugLocSectionSym = emitSectionSym(Asm, TLOF.getDwarfLocSection(),
Devang Patel9fc11702010-05-25 23:40:22 +00001954 "section_debug_loc");
1955
Eric Christopher7b30f2e42012-11-21 00:34:35 +00001956 TextSectionSym = emitSectionSym(Asm, TLOF.getTextSection(), "text_begin");
1957 emitSectionSym(Asm, TLOF.getDataSection());
Bill Wendling480ff322009-05-20 23:21:38 +00001958}
1959
Eric Christopheracdcbdb2012-11-27 22:43:45 +00001960// Recursively emits a debug information entry.
Eric Christopher3c5a1912012-12-19 22:02:53 +00001961void DwarfDebug::emitDIE(DIE *Die, std::vector<DIEAbbrev *> *Abbrevs) {
Bill Wendling480ff322009-05-20 23:21:38 +00001962 // Get the abbreviation for this DIE.
1963 unsigned AbbrevNumber = Die->getAbbrevNumber();
Eric Christopher3c5a1912012-12-19 22:02:53 +00001964 const DIEAbbrev *Abbrev = Abbrevs->at(AbbrevNumber - 1);
Bill Wendling480ff322009-05-20 23:21:38 +00001965
Bill Wendling480ff322009-05-20 23:21:38 +00001966 // Emit the code (index) for the abbreviation.
Chris Lattner7bde8c02010-04-04 18:52:31 +00001967 if (Asm->isVerbose())
Chris Lattnerfa823552010-01-22 23:18:42 +00001968 Asm->OutStreamer.AddComment("Abbrev [" + Twine(AbbrevNumber) + "] 0x" +
1969 Twine::utohexstr(Die->getOffset()) + ":0x" +
1970 Twine::utohexstr(Die->getSize()) + " " +
1971 dwarf::TagString(Abbrev->getTag()));
Chris Lattner9efd1182010-04-04 19:09:29 +00001972 Asm->EmitULEB128(AbbrevNumber);
Bill Wendling480ff322009-05-20 23:21:38 +00001973
Eric Christopher4887c8f2013-03-29 23:34:06 +00001974 const SmallVectorImpl<DIEValue*> &Values = Die->getValues();
1975 const SmallVectorImpl<DIEAbbrevData> &AbbrevData = Abbrev->getData();
Bill Wendling480ff322009-05-20 23:21:38 +00001976
1977 // Emit the DIE attribute values.
1978 for (unsigned i = 0, N = Values.size(); i < N; ++i) {
1979 unsigned Attr = AbbrevData[i].getAttribute();
1980 unsigned Form = AbbrevData[i].getForm();
1981 assert(Form && "Too many attributes for DIE (check abbreviation)");
1982
Chris Lattner7bde8c02010-04-04 18:52:31 +00001983 if (Asm->isVerbose())
Chris Lattner5adf9872010-01-24 18:54:17 +00001984 Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr));
Jim Grosbacha8683bb2010-07-21 21:21:52 +00001985
Bill Wendling480ff322009-05-20 23:21:38 +00001986 switch (Attr) {
Bill Wendling480ff322009-05-20 23:21:38 +00001987 case dwarf::DW_AT_abstract_origin: {
1988 DIEEntry *E = cast<DIEEntry>(Values[i]);
1989 DIE *Origin = E->getEntry();
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001990 unsigned Addr = Origin->getOffset();
Manman Ren14a029d2013-03-12 18:27:15 +00001991 if (Form == dwarf::DW_FORM_ref_addr) {
1992 // For DW_FORM_ref_addr, output the offset from beginning of debug info
1993 // section. Origin->getOffset() returns the offset from start of the
1994 // compile unit.
1995 DwarfUnits &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
1996 Addr += Holder.getCUOffset(Origin->getCompileUnit());
1997 }
Manman Renac8062b2013-07-02 23:40:10 +00001998 Asm->OutStreamer.EmitIntValue(Addr,
1999 Form == dwarf::DW_FORM_ref_addr ? DIEEntry::getRefAddrSize(Asm) : 4);
Bill Wendling480ff322009-05-20 23:21:38 +00002000 break;
2001 }
Devang Patel12563b32010-04-16 23:33:45 +00002002 case dwarf::DW_AT_ranges: {
2003 // DW_AT_range Value encodes offset in debug_range section.
2004 DIEInteger *V = cast<DIEInteger>(Values[i]);
Devang Patelda3ef852010-09-02 16:43:44 +00002005
Nick Lewycky33da3362012-06-22 01:25:12 +00002006 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections()) {
Devang Patelda3ef852010-09-02 16:43:44 +00002007 Asm->EmitLabelPlusOffset(DwarfDebugRangeSectionSym,
2008 V->getValue(),
2009 4);
2010 } else {
2011 Asm->EmitLabelOffsetDifference(DwarfDebugRangeSectionSym,
2012 V->getValue(),
2013 DwarfDebugRangeSectionSym,
2014 4);
2015 }
Devang Patel12563b32010-04-16 23:33:45 +00002016 break;
2017 }
Devang Patel9fc11702010-05-25 23:40:22 +00002018 case dwarf::DW_AT_location: {
Nick Lewycky33da3362012-06-22 01:25:12 +00002019 if (DIELabel *L = dyn_cast<DIELabel>(Values[i])) {
2020 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
Ulrich Weigand396ba8b2013-07-02 18:46:26 +00002021 Asm->EmitLabelReference(L->getValue(), 4);
Nick Lewycky33da3362012-06-22 01:25:12 +00002022 else
Ulrich Weigand396ba8b2013-07-02 18:46:26 +00002023 Asm->EmitLabelDifference(L->getValue(), DwarfDebugLocSectionSym, 4);
Nick Lewycky33da3362012-06-22 01:25:12 +00002024 } else {
Devang Patel9fc11702010-05-25 23:40:22 +00002025 Values[i]->EmitValue(Asm, Form);
Nick Lewycky33da3362012-06-22 01:25:12 +00002026 }
Devang Patel9fc11702010-05-25 23:40:22 +00002027 break;
2028 }
Devang Patela1bd5a12010-09-29 19:08:08 +00002029 case dwarf::DW_AT_accessibility: {
2030 if (Asm->isVerbose()) {
2031 DIEInteger *V = cast<DIEInteger>(Values[i]);
2032 Asm->OutStreamer.AddComment(dwarf::AccessibilityString(V->getValue()));
2033 }
2034 Values[i]->EmitValue(Asm, Form);
2035 break;
2036 }
Bill Wendling480ff322009-05-20 23:21:38 +00002037 default:
2038 // Emit an attribute using the defined form.
Chris Lattner3a383cb2010-04-05 00:13:49 +00002039 Values[i]->EmitValue(Asm, Form);
Bill Wendling480ff322009-05-20 23:21:38 +00002040 break;
2041 }
Bill Wendling480ff322009-05-20 23:21:38 +00002042 }
2043
2044 // Emit the DIE children if any.
2045 if (Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes) {
2046 const std::vector<DIE *> &Children = Die->getChildren();
2047
2048 for (unsigned j = 0, M = Children.size(); j < M; ++j)
Eric Christopher3c5a1912012-12-19 22:02:53 +00002049 emitDIE(Children[j], Abbrevs);
Bill Wendling480ff322009-05-20 23:21:38 +00002050
Chris Lattner7bde8c02010-04-04 18:52:31 +00002051 if (Asm->isVerbose())
Chris Lattner566cae92010-03-09 23:52:58 +00002052 Asm->OutStreamer.AddComment("End Of Children Mark");
2053 Asm->EmitInt8(0);
Bill Wendling480ff322009-05-20 23:21:38 +00002054 }
2055}
2056
Eric Christophera2de8262012-12-15 00:04:07 +00002057// Emit the various dwarf units to the unit section USection with
2058// the abbreviations going into ASection.
2059void DwarfUnits::emitUnits(DwarfDebug *DD,
2060 const MCSection *USection,
2061 const MCSection *ASection,
2062 const MCSymbol *ASectionSym) {
2063 Asm->OutStreamer.SwitchSection(USection);
Eric Christopher4887c8f2013-03-29 23:34:06 +00002064 for (SmallVectorImpl<CompileUnit *>::iterator I = CUs.begin(),
Eric Christophera2de8262012-12-15 00:04:07 +00002065 E = CUs.end(); I != E; ++I) {
2066 CompileUnit *TheCU = *I;
Devang Patel1a0df9a2010-05-10 22:49:55 +00002067 DIE *Die = TheCU->getCUDie();
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002068
Devang Patel1a0df9a2010-05-10 22:49:55 +00002069 // Emit the compile units header.
Eric Christophera2de8262012-12-15 00:04:07 +00002070 Asm->OutStreamer
2071 .EmitLabel(Asm->GetTempSymbol(USection->getLabelBeginName(),
2072 TheCU->getUniqueID()));
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002073
Devang Patel1a0df9a2010-05-10 22:49:55 +00002074 // Emit size of content not including length itself
2075 unsigned ContentSize = Die->getSize() +
2076 sizeof(int16_t) + // DWARF version number
2077 sizeof(int32_t) + // Offset Into Abbrev. Section
Devang Patele141234942011-04-13 19:41:17 +00002078 sizeof(int8_t); // Pointer Size (in bytes)
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002079
Devang Patel1a0df9a2010-05-10 22:49:55 +00002080 Asm->OutStreamer.AddComment("Length of Compilation Unit Info");
2081 Asm->EmitInt32(ContentSize);
2082 Asm->OutStreamer.AddComment("DWARF version number");
Manman Renac8062b2013-07-02 23:40:10 +00002083 Asm->EmitInt16(DD->getDwarfVersion());
Devang Patel1a0df9a2010-05-10 22:49:55 +00002084 Asm->OutStreamer.AddComment("Offset Into Abbrev. Section");
Eric Christophera2de8262012-12-15 00:04:07 +00002085 Asm->EmitSectionOffset(Asm->GetTempSymbol(ASection->getLabelBeginName()),
2086 ASectionSym);
Devang Patel1a0df9a2010-05-10 22:49:55 +00002087 Asm->OutStreamer.AddComment("Address Size (in bytes)");
Chandler Carruth5da3f052012-11-01 09:14:31 +00002088 Asm->EmitInt8(Asm->getDataLayout().getPointerSize());
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002089
Eric Christopher3c5a1912012-12-19 22:02:53 +00002090 DD->emitDIE(Die, Abbreviations);
Eric Christophera2de8262012-12-15 00:04:07 +00002091 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol(USection->getLabelEndName(),
Eli Benderskyb42d1462012-12-03 18:45:45 +00002092 TheCU->getUniqueID()));
Devang Patel1a0df9a2010-05-10 22:49:55 +00002093 }
Bill Wendling480ff322009-05-20 23:21:38 +00002094}
2095
Manman Ren14a029d2013-03-12 18:27:15 +00002096/// For a given compile unit DIE, returns offset from beginning of debug info.
2097unsigned DwarfUnits::getCUOffset(DIE *Die) {
Manman Ren11fec382013-03-13 18:41:27 +00002098 assert(Die->getTag() == dwarf::DW_TAG_compile_unit &&
2099 "Input DIE should be compile unit in getCUOffset.");
Eric Christopherd25f7fc2013-08-08 01:41:05 +00002100 for (SmallVectorImpl<CompileUnit *>::iterator I = CUs.begin(), E = CUs.end();
2101 I != E; ++I) {
Manman Ren14a029d2013-03-12 18:27:15 +00002102 CompileUnit *TheCU = *I;
2103 if (TheCU->getCUDie() == Die)
2104 return TheCU->getDebugInfoOffset();
2105 }
Manman Ren11fec382013-03-13 18:41:27 +00002106 llvm_unreachable("The compile unit DIE should belong to CUs in DwarfUnits.");
Manman Ren14a029d2013-03-12 18:27:15 +00002107}
2108
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002109// Emit the debug info section.
2110void DwarfDebug::emitDebugInfo() {
Eric Christophera2de8262012-12-15 00:04:07 +00002111 DwarfUnits &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
2112
2113 Holder.emitUnits(this, Asm->getObjFileLowering().getDwarfInfoSection(),
2114 Asm->getObjFileLowering().getDwarfAbbrevSection(),
2115 DwarfAbbrevSectionSym);
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002116}
2117
Eric Christopheracdcbdb2012-11-27 22:43:45 +00002118// Emit the abbreviation section.
Eric Christopher38371952012-11-20 23:30:11 +00002119void DwarfDebug::emitAbbreviations() {
Eric Christopher3c5a1912012-12-19 22:02:53 +00002120 if (!useSplitDwarf())
2121 emitAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevSection(),
2122 &Abbreviations);
2123 else
2124 emitSkeletonAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevSection());
2125}
Bill Wendling480ff322009-05-20 23:21:38 +00002126
Eric Christopher3c5a1912012-12-19 22:02:53 +00002127void DwarfDebug::emitAbbrevs(const MCSection *Section,
2128 std::vector<DIEAbbrev *> *Abbrevs) {
2129 // Check to see if it is worth the effort.
2130 if (!Abbrevs->empty()) {
2131 // Start the debug abbrev section.
2132 Asm->OutStreamer.SwitchSection(Section);
2133
2134 MCSymbol *Begin = Asm->GetTempSymbol(Section->getLabelBeginName());
Eric Christopher996b2b72012-12-13 03:00:38 +00002135 Asm->OutStreamer.EmitLabel(Begin);
Bill Wendling480ff322009-05-20 23:21:38 +00002136
2137 // For each abbrevation.
Eric Christopher3c5a1912012-12-19 22:02:53 +00002138 for (unsigned i = 0, N = Abbrevs->size(); i < N; ++i) {
Bill Wendling480ff322009-05-20 23:21:38 +00002139 // Get abbreviation data
Eric Christopher3c5a1912012-12-19 22:02:53 +00002140 const DIEAbbrev *Abbrev = Abbrevs->at(i);
Bill Wendling480ff322009-05-20 23:21:38 +00002141
2142 // Emit the abbrevations code (base 1 index.)
Chris Lattner9efd1182010-04-04 19:09:29 +00002143 Asm->EmitULEB128(Abbrev->getNumber(), "Abbreviation Code");
Bill Wendling480ff322009-05-20 23:21:38 +00002144
2145 // Emit the abbreviations data.
Chris Lattner3a383cb2010-04-05 00:13:49 +00002146 Abbrev->Emit(Asm);
Bill Wendling480ff322009-05-20 23:21:38 +00002147 }
2148
2149 // Mark end of abbreviations.
Chris Lattner9efd1182010-04-04 19:09:29 +00002150 Asm->EmitULEB128(0, "EOM(3)");
Bill Wendling480ff322009-05-20 23:21:38 +00002151
Eric Christopher3c5a1912012-12-19 22:02:53 +00002152 MCSymbol *End = Asm->GetTempSymbol(Section->getLabelEndName());
Eric Christopher996b2b72012-12-13 03:00:38 +00002153 Asm->OutStreamer.EmitLabel(End);
Bill Wendling480ff322009-05-20 23:21:38 +00002154 }
2155}
2156
Eric Christopheracdcbdb2012-11-27 22:43:45 +00002157// Emit the last address of the section and the end of the line matrix.
Devang Patel930143b2009-11-21 02:48:08 +00002158void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) {
Bill Wendling480ff322009-05-20 23:21:38 +00002159 // Define last address of section.
Chris Lattner566cae92010-03-09 23:52:58 +00002160 Asm->OutStreamer.AddComment("Extended Op");
2161 Asm->EmitInt8(0);
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002162
Chris Lattner566cae92010-03-09 23:52:58 +00002163 Asm->OutStreamer.AddComment("Op size");
Chandler Carruth5da3f052012-11-01 09:14:31 +00002164 Asm->EmitInt8(Asm->getDataLayout().getPointerSize() + 1);
Chris Lattner566cae92010-03-09 23:52:58 +00002165 Asm->OutStreamer.AddComment("DW_LNE_set_address");
2166 Asm->EmitInt8(dwarf::DW_LNE_set_address);
2167
2168 Asm->OutStreamer.AddComment("Section end label");
Chris Lattnerb245dfb2010-03-10 01:17:49 +00002169
Chris Lattnera179b522010-04-04 19:25:43 +00002170 Asm->OutStreamer.EmitSymbolValue(Asm->GetTempSymbol("section_end",SectionEnd),
Eric Christopherce0cfce2013-01-09 01:35:34 +00002171 Asm->getDataLayout().getPointerSize());
Bill Wendling480ff322009-05-20 23:21:38 +00002172
2173 // Mark end of matrix.
Chris Lattner566cae92010-03-09 23:52:58 +00002174 Asm->OutStreamer.AddComment("DW_LNE_end_sequence");
2175 Asm->EmitInt8(0);
Chris Lattnerf5c834f2010-01-22 22:09:00 +00002176 Asm->EmitInt8(1);
Chris Lattnerfa823552010-01-22 23:18:42 +00002177 Asm->EmitInt8(1);
Bill Wendling480ff322009-05-20 23:21:38 +00002178}
2179
Eric Christopheracdcbdb2012-11-27 22:43:45 +00002180// Emit visible names into a hashed accelerator table section.
Eric Christopher4996c702011-11-07 09:24:32 +00002181void DwarfDebug::emitAccelNames() {
2182 DwarfAccelTable AT(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset,
2183 dwarf::DW_FORM_data4));
2184 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2185 E = CUMap.end(); I != E; ++I) {
2186 CompileUnit *TheCU = I->second;
Eric Christopherd9843b32011-11-10 19:25:34 +00002187 const StringMap<std::vector<DIE*> > &Names = TheCU->getAccelNames();
2188 for (StringMap<std::vector<DIE*> >::const_iterator
Eric Christopher4996c702011-11-07 09:24:32 +00002189 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
Benjamin Kramer63e39eb2013-05-11 18:24:28 +00002190 StringRef Name = GI->getKey();
Eric Christopher090fcc12012-01-06 23:03:34 +00002191 const std::vector<DIE *> &Entities = GI->second;
Eric Christopherd9843b32011-11-10 19:25:34 +00002192 for (std::vector<DIE *>::const_iterator DI = Entities.begin(),
2193 DE = Entities.end(); DI != DE; ++DI)
2194 AT.AddName(Name, (*DI));
Eric Christopher4996c702011-11-07 09:24:32 +00002195 }
2196 }
2197
2198 AT.FinalizeTable(Asm, "Names");
2199 Asm->OutStreamer.SwitchSection(
2200 Asm->getObjFileLowering().getDwarfAccelNamesSection());
2201 MCSymbol *SectionBegin = Asm->GetTempSymbol("names_begin");
2202 Asm->OutStreamer.EmitLabel(SectionBegin);
2203
2204 // Emit the full data.
Eric Christophere698f532012-12-20 21:58:36 +00002205 AT.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher4996c702011-11-07 09:24:32 +00002206}
2207
Eric Christopher48fef592012-12-20 21:58:40 +00002208// Emit objective C classes and categories into a hashed accelerator table
2209// section.
Eric Christopher4996c702011-11-07 09:24:32 +00002210void DwarfDebug::emitAccelObjC() {
2211 DwarfAccelTable AT(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset,
2212 dwarf::DW_FORM_data4));
2213 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2214 E = CUMap.end(); I != E; ++I) {
2215 CompileUnit *TheCU = I->second;
2216 const StringMap<std::vector<DIE*> > &Names = TheCU->getAccelObjC();
2217 for (StringMap<std::vector<DIE*> >::const_iterator
2218 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
Benjamin Kramer63e39eb2013-05-11 18:24:28 +00002219 StringRef Name = GI->getKey();
Eric Christopher090fcc12012-01-06 23:03:34 +00002220 const std::vector<DIE *> &Entities = GI->second;
Eric Christopher4996c702011-11-07 09:24:32 +00002221 for (std::vector<DIE *>::const_iterator DI = Entities.begin(),
2222 DE = Entities.end(); DI != DE; ++DI)
2223 AT.AddName(Name, (*DI));
2224 }
2225 }
2226
2227 AT.FinalizeTable(Asm, "ObjC");
2228 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering()
2229 .getDwarfAccelObjCSection());
2230 MCSymbol *SectionBegin = Asm->GetTempSymbol("objc_begin");
2231 Asm->OutStreamer.EmitLabel(SectionBegin);
2232
2233 // Emit the full data.
Eric Christophere698f532012-12-20 21:58:36 +00002234 AT.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher4996c702011-11-07 09:24:32 +00002235}
2236
Eric Christopheracdcbdb2012-11-27 22:43:45 +00002237// Emit namespace dies into a hashed accelerator table.
Eric Christopher4996c702011-11-07 09:24:32 +00002238void DwarfDebug::emitAccelNamespaces() {
2239 DwarfAccelTable AT(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset,
2240 dwarf::DW_FORM_data4));
2241 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2242 E = CUMap.end(); I != E; ++I) {
2243 CompileUnit *TheCU = I->second;
Eric Christopher66b37db2011-11-10 21:47:55 +00002244 const StringMap<std::vector<DIE*> > &Names = TheCU->getAccelNamespace();
2245 for (StringMap<std::vector<DIE*> >::const_iterator
Eric Christopher4996c702011-11-07 09:24:32 +00002246 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
Benjamin Kramer63e39eb2013-05-11 18:24:28 +00002247 StringRef Name = GI->getKey();
Eric Christopher090fcc12012-01-06 23:03:34 +00002248 const std::vector<DIE *> &Entities = GI->second;
Eric Christopher66b37db2011-11-10 21:47:55 +00002249 for (std::vector<DIE *>::const_iterator DI = Entities.begin(),
2250 DE = Entities.end(); DI != DE; ++DI)
2251 AT.AddName(Name, (*DI));
Eric Christopher4996c702011-11-07 09:24:32 +00002252 }
2253 }
2254
2255 AT.FinalizeTable(Asm, "namespac");
2256 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering()
2257 .getDwarfAccelNamespaceSection());
2258 MCSymbol *SectionBegin = Asm->GetTempSymbol("namespac_begin");
2259 Asm->OutStreamer.EmitLabel(SectionBegin);
2260
2261 // Emit the full data.
Eric Christophere698f532012-12-20 21:58:36 +00002262 AT.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher4996c702011-11-07 09:24:32 +00002263}
2264
Eric Christopheracdcbdb2012-11-27 22:43:45 +00002265// Emit type dies into a hashed accelerator table.
Eric Christopher4996c702011-11-07 09:24:32 +00002266void DwarfDebug::emitAccelTypes() {
Eric Christopher21bde872012-01-06 04:35:23 +00002267 std::vector<DwarfAccelTable::Atom> Atoms;
2268 Atoms.push_back(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset,
2269 dwarf::DW_FORM_data4));
2270 Atoms.push_back(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeTag,
2271 dwarf::DW_FORM_data2));
2272 Atoms.push_back(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeTypeFlags,
2273 dwarf::DW_FORM_data1));
2274 DwarfAccelTable AT(Atoms);
Eric Christopher4996c702011-11-07 09:24:32 +00002275 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2276 E = CUMap.end(); I != E; ++I) {
2277 CompileUnit *TheCU = I->second;
Eric Christopher21bde872012-01-06 04:35:23 +00002278 const StringMap<std::vector<std::pair<DIE*, unsigned > > > &Names
2279 = TheCU->getAccelTypes();
2280 for (StringMap<std::vector<std::pair<DIE*, unsigned> > >::const_iterator
Eric Christopher4996c702011-11-07 09:24:32 +00002281 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
Benjamin Kramer63e39eb2013-05-11 18:24:28 +00002282 StringRef Name = GI->getKey();
Eric Christopher090fcc12012-01-06 23:03:34 +00002283 const std::vector<std::pair<DIE *, unsigned> > &Entities = GI->second;
Eric Christopher21bde872012-01-06 04:35:23 +00002284 for (std::vector<std::pair<DIE *, unsigned> >::const_iterator DI
2285 = Entities.begin(), DE = Entities.end(); DI !=DE; ++DI)
2286 AT.AddName(Name, (*DI).first, (*DI).second);
Eric Christopher4996c702011-11-07 09:24:32 +00002287 }
2288 }
2289
2290 AT.FinalizeTable(Asm, "types");
2291 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering()
2292 .getDwarfAccelTypesSection());
2293 MCSymbol *SectionBegin = Asm->GetTempSymbol("types_begin");
2294 Asm->OutStreamer.EmitLabel(SectionBegin);
2295
2296 // Emit the full data.
Eric Christophere698f532012-12-20 21:58:36 +00002297 AT.Emit(Asm, SectionBegin, &InfoHolder);
Eric Christopher4996c702011-11-07 09:24:32 +00002298}
2299
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00002300/// emitDebugPubnames - Emit visible names into a debug pubnames section.
2301///
2302void DwarfDebug::emitDebugPubnames() {
2303 const MCSection *ISec = Asm->getObjFileLowering().getDwarfInfoSection();
2304
2305 typedef DenseMap<const MDNode*, CompileUnit*> CUMapType;
2306 for (CUMapType::iterator I = CUMap.begin(), E = CUMap.end(); I != E; ++I) {
2307 CompileUnit *TheCU = I->second;
2308 unsigned ID = TheCU->getUniqueID();
2309
2310 if (TheCU->getGlobalNames().empty())
2311 continue;
2312
2313 // Start the dwarf pubnames section.
Eric Christopher7da24882013-08-19 21:07:38 +00002314 Asm->OutStreamer
2315 .SwitchSection(Asm->getObjFileLowering().getDwarfPubNamesSection());
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00002316
2317 Asm->OutStreamer.AddComment("Length of Public Names Info");
2318 Asm->EmitLabelDifference(Asm->GetTempSymbol("pubnames_end", ID),
2319 Asm->GetTempSymbol("pubnames_begin", ID), 4);
2320
2321 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_begin", ID));
2322
2323 Asm->OutStreamer.AddComment("DWARF Version");
Manman Renac8062b2013-07-02 23:40:10 +00002324 Asm->EmitInt16(DwarfVersion);
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00002325
2326 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
2327 Asm->EmitSectionOffset(Asm->GetTempSymbol(ISec->getLabelBeginName(), ID),
2328 DwarfInfoSectionSym);
2329
2330 Asm->OutStreamer.AddComment("Compilation Unit Length");
2331 Asm->EmitLabelDifference(Asm->GetTempSymbol(ISec->getLabelEndName(), ID),
2332 Asm->GetTempSymbol(ISec->getLabelBeginName(), ID),
2333 4);
2334
2335 const StringMap<DIE*> &Globals = TheCU->getGlobalNames();
2336 for (StringMap<DIE*>::const_iterator
2337 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2338 const char *Name = GI->getKeyData();
2339 const DIE *Entity = GI->second;
2340
2341 Asm->OutStreamer.AddComment("DIE offset");
2342 Asm->EmitInt32(Entity->getOffset());
2343
2344 if (Asm->isVerbose())
2345 Asm->OutStreamer.AddComment("External Name");
Rafael Espindola64e1af82013-07-02 15:49:13 +00002346 Asm->OutStreamer.EmitBytes(StringRef(Name, GI->getKeyLength()+1));
Krzysztof Parzyszek228daa62013-02-12 18:00:14 +00002347 }
2348
2349 Asm->OutStreamer.AddComment("End Mark");
2350 Asm->EmitInt32(0);
2351 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_end", ID));
2352 }
2353}
2354
Devang Patel04d2f2d2009-11-24 01:14:22 +00002355void DwarfDebug::emitDebugPubTypes() {
Devang Patel1a0df9a2010-05-10 22:49:55 +00002356 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2357 E = CUMap.end(); I != E; ++I) {
2358 CompileUnit *TheCU = I->second;
Eric Christopher6abc9c52011-11-07 09:18:35 +00002359 // Start the dwarf pubtypes section.
Devang Patel1a0df9a2010-05-10 22:49:55 +00002360 Asm->OutStreamer.SwitchSection(
2361 Asm->getObjFileLowering().getDwarfPubTypesSection());
2362 Asm->OutStreamer.AddComment("Length of Public Types Info");
2363 Asm->EmitLabelDifference(
Eli Benderskyb42d1462012-12-03 18:45:45 +00002364 Asm->GetTempSymbol("pubtypes_end", TheCU->getUniqueID()),
2365 Asm->GetTempSymbol("pubtypes_begin", TheCU->getUniqueID()), 4);
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002366
Devang Patel1a0df9a2010-05-10 22:49:55 +00002367 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_begin",
Eli Benderskyb42d1462012-12-03 18:45:45 +00002368 TheCU->getUniqueID()));
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002369
Devang Patel1a0df9a2010-05-10 22:49:55 +00002370 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DWARF Version");
Manman Renac8062b2013-07-02 23:40:10 +00002371 Asm->EmitInt16(DwarfVersion);
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002372
Devang Patel1a0df9a2010-05-10 22:49:55 +00002373 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
Eric Christopher16485a52012-12-15 00:04:04 +00002374 const MCSection *ISec = Asm->getObjFileLowering().getDwarfInfoSection();
2375 Asm->EmitSectionOffset(Asm->GetTempSymbol(ISec->getLabelBeginName(),
Eli Benderskyb42d1462012-12-03 18:45:45 +00002376 TheCU->getUniqueID()),
Devang Patel1a0df9a2010-05-10 22:49:55 +00002377 DwarfInfoSectionSym);
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002378
Devang Patel1a0df9a2010-05-10 22:49:55 +00002379 Asm->OutStreamer.AddComment("Compilation Unit Length");
Eric Christopher16485a52012-12-15 00:04:04 +00002380 Asm->EmitLabelDifference(Asm->GetTempSymbol(ISec->getLabelEndName(),
Eli Benderskyb42d1462012-12-03 18:45:45 +00002381 TheCU->getUniqueID()),
Eric Christopher16485a52012-12-15 00:04:04 +00002382 Asm->GetTempSymbol(ISec->getLabelBeginName(),
Eli Benderskyb42d1462012-12-03 18:45:45 +00002383 TheCU->getUniqueID()),
Devang Patel1a0df9a2010-05-10 22:49:55 +00002384 4);
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002385
Devang Patel1a0df9a2010-05-10 22:49:55 +00002386 const StringMap<DIE*> &Globals = TheCU->getGlobalTypes();
2387 for (StringMap<DIE*>::const_iterator
2388 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2389 const char *Name = GI->getKeyData();
Nick Lewycky019d2552011-07-29 03:49:23 +00002390 DIE *Entity = GI->second;
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002391
Devang Patel1a0df9a2010-05-10 22:49:55 +00002392 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
2393 Asm->EmitInt32(Entity->getOffset());
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002394
Devang Patel1a0df9a2010-05-10 22:49:55 +00002395 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("External Name");
Benjamin Kramer966ed1b2011-11-09 18:16:11 +00002396 // Emit the name with a terminating null byte.
Eric Christophere3ab3d02013-01-09 01:57:54 +00002397 Asm->OutStreamer.EmitBytes(StringRef(Name, GI->getKeyLength()+1));
Devang Patel1a0df9a2010-05-10 22:49:55 +00002398 }
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002399
Devang Patel1a0df9a2010-05-10 22:49:55 +00002400 Asm->OutStreamer.AddComment("End Mark");
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002401 Asm->EmitInt32(0);
Devang Patel1a0df9a2010-05-10 22:49:55 +00002402 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_end",
Eli Benderskyb42d1462012-12-03 18:45:45 +00002403 TheCU->getUniqueID()));
Devang Patel04d2f2d2009-11-24 01:14:22 +00002404 }
Devang Patel04d2f2d2009-11-24 01:14:22 +00002405}
2406
Eric Christopher3bf29fd2012-12-27 02:14:01 +00002407// Emit strings into a string section.
Eric Christopher2cbd5762013-01-07 19:32:41 +00002408void DwarfUnits::emitStrings(const MCSection *StrSection,
2409 const MCSection *OffsetSection = NULL,
2410 const MCSymbol *StrSecSym = NULL) {
Eric Christopher3bf29fd2012-12-27 02:14:01 +00002411
Eric Christopher27614582013-01-08 22:22:06 +00002412 if (StringPool.empty()) return;
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002413
Chris Lattner3d72a672010-03-09 23:38:23 +00002414 // Start the dwarf str section.
Eric Christopher2cbd5762013-01-07 19:32:41 +00002415 Asm->OutStreamer.SwitchSection(StrSection);
Bill Wendling480ff322009-05-20 23:21:38 +00002416
Chris Lattnerb7aa9522010-03-13 02:17:42 +00002417 // Get all of the string pool entries and put them in an array by their ID so
2418 // we can sort them.
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002419 SmallVector<std::pair<unsigned,
Eric Christopherb800ff72013-01-07 22:40:45 +00002420 StringMapEntry<std::pair<MCSymbol*, unsigned> >*>, 64> Entries;
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002421
Chris Lattnerb7aa9522010-03-13 02:17:42 +00002422 for (StringMap<std::pair<MCSymbol*, unsigned> >::iterator
Eric Christopher27614582013-01-08 22:22:06 +00002423 I = StringPool.begin(), E = StringPool.end();
Eric Christopher48fef592012-12-20 21:58:40 +00002424 I != E; ++I)
Chris Lattnerb7aa9522010-03-13 02:17:42 +00002425 Entries.push_back(std::make_pair(I->second.second, &*I));
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002426
Chris Lattnerb7aa9522010-03-13 02:17:42 +00002427 array_pod_sort(Entries.begin(), Entries.end());
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002428
Chris Lattnerb7aa9522010-03-13 02:17:42 +00002429 for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
Chris Lattner3d72a672010-03-09 23:38:23 +00002430 // Emit a label for reference from debug information entries.
Chris Lattnerb7aa9522010-03-13 02:17:42 +00002431 Asm->OutStreamer.EmitLabel(Entries[i].second->getValue().first);
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002432
Benjamin Kramer966ed1b2011-11-09 18:16:11 +00002433 // Emit the string itself with a terminating null byte.
Benjamin Kramer148db362011-11-09 12:12:04 +00002434 Asm->OutStreamer.EmitBytes(StringRef(Entries[i].second->getKeyData(),
Eric Christopherce0cfce2013-01-09 01:35:34 +00002435 Entries[i].second->getKeyLength()+1));
Bill Wendling480ff322009-05-20 23:21:38 +00002436 }
Eric Christopher2cbd5762013-01-07 19:32:41 +00002437
2438 // If we've got an offset section go ahead and emit that now as well.
2439 if (OffsetSection) {
2440 Asm->OutStreamer.SwitchSection(OffsetSection);
2441 unsigned offset = 0;
Eric Christopher962c9082013-01-15 23:56:56 +00002442 unsigned size = 4; // FIXME: DWARF64 is 8.
Eric Christopher2cbd5762013-01-07 19:32:41 +00002443 for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
Eric Christopherbf7bc492013-01-09 03:52:05 +00002444 Asm->OutStreamer.EmitIntValue(offset, size);
Eric Christopher2cbd5762013-01-07 19:32:41 +00002445 offset += Entries[i].second->getKeyLength() + 1;
2446 }
2447 }
Bill Wendling480ff322009-05-20 23:21:38 +00002448}
2449
Eric Christopher962c9082013-01-15 23:56:56 +00002450// Emit strings into a string section.
2451void DwarfUnits::emitAddresses(const MCSection *AddrSection) {
2452
2453 if (AddressPool.empty()) return;
2454
2455 // Start the dwarf addr section.
2456 Asm->OutStreamer.SwitchSection(AddrSection);
2457
David Blaikiece1960f2013-07-08 17:51:28 +00002458 // Order the address pool entries by ID
David Blaikieac569a62013-07-08 17:33:10 +00002459 SmallVector<const MCExpr *, 64> Entries(AddressPool.size());
Eric Christopher962c9082013-01-15 23:56:56 +00002460
David Blaikiece1960f2013-07-08 17:51:28 +00002461 for (DenseMap<const MCExpr *, unsigned>::iterator I = AddressPool.begin(),
2462 E = AddressPool.end();
Eric Christopher962c9082013-01-15 23:56:56 +00002463 I != E; ++I)
David Blaikieac569a62013-07-08 17:33:10 +00002464 Entries[I->second] = I->first;
Eric Christopher962c9082013-01-15 23:56:56 +00002465
2466 for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
Ulrich Weigand8b3d2262013-07-02 18:46:46 +00002467 // Emit an expression for reference from debug information entries.
David Blaikieac569a62013-07-08 17:33:10 +00002468 if (const MCExpr *Expr = Entries[i])
Ulrich Weigand8b3d2262013-07-02 18:46:46 +00002469 Asm->OutStreamer.EmitValue(Expr, Asm->getDataLayout().getPointerSize());
Eric Christopher962c9082013-01-15 23:56:56 +00002470 else
2471 Asm->OutStreamer.EmitIntValue(0, Asm->getDataLayout().getPointerSize());
2472 }
2473
2474}
2475
Eric Christopher3bf29fd2012-12-27 02:14:01 +00002476// Emit visible names into a debug str section.
2477void DwarfDebug::emitDebugStr() {
2478 DwarfUnits &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
2479 Holder.emitStrings(Asm->getObjFileLowering().getDwarfStrSection());
2480}
2481
Eric Christopher9046f942013-07-02 21:36:07 +00002482// Emit locations into the debug loc section.
Devang Patel930143b2009-11-21 02:48:08 +00002483void DwarfDebug::emitDebugLoc() {
Devang Patel6b9a9fe2010-05-26 23:55:23 +00002484 if (DotDebugLocEntries.empty())
2485 return;
2486
Eric Christopher4887c8f2013-03-29 23:34:06 +00002487 for (SmallVectorImpl<DotDebugLocEntry>::iterator
Devang Patel116a9d72011-02-04 22:57:18 +00002488 I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
2489 I != E; ++I) {
2490 DotDebugLocEntry &Entry = *I;
2491 if (I + 1 != DotDebugLocEntries.end())
2492 Entry.Merge(I+1);
2493 }
2494
Daniel Dunbarfd95b012011-03-16 22:16:39 +00002495 // Start the dwarf loc section.
Chris Lattner4b7dadb2009-08-19 05:49:37 +00002496 Asm->OutStreamer.SwitchSection(
Devang Patel9fc11702010-05-25 23:40:22 +00002497 Asm->getObjFileLowering().getDwarfLocSection());
Chandler Carruth5da3f052012-11-01 09:14:31 +00002498 unsigned char Size = Asm->getDataLayout().getPointerSize();
Devang Patel6b9a9fe2010-05-26 23:55:23 +00002499 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", 0));
2500 unsigned index = 1;
Eric Christopher4887c8f2013-03-29 23:34:06 +00002501 for (SmallVectorImpl<DotDebugLocEntry>::iterator
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002502 I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
Devang Patel30265c42010-07-07 20:12:52 +00002503 I != E; ++I, ++index) {
Devang Patel116a9d72011-02-04 22:57:18 +00002504 DotDebugLocEntry &Entry = *I;
2505 if (Entry.isMerged()) continue;
Devang Patel9fc11702010-05-25 23:40:22 +00002506 if (Entry.isEmpty()) {
Eric Christopherce0cfce2013-01-09 01:35:34 +00002507 Asm->OutStreamer.EmitIntValue(0, Size);
2508 Asm->OutStreamer.EmitIntValue(0, Size);
Devang Patel6b9a9fe2010-05-26 23:55:23 +00002509 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", index));
Devang Patel9fc11702010-05-25 23:40:22 +00002510 } else {
Eric Christopher25f06422013-07-03 22:40:18 +00002511 Asm->OutStreamer.EmitSymbolValue(Entry.getBeginSym(), Size);
2512 Asm->OutStreamer.EmitSymbolValue(Entry.getEndSym(), Size);
2513 DIVariable DV(Entry.getVariable());
Rafael Espindolad23bfb82011-05-27 22:05:41 +00002514 Asm->OutStreamer.AddComment("Loc expr size");
2515 MCSymbol *begin = Asm->OutStreamer.getContext().CreateTempSymbol();
2516 MCSymbol *end = Asm->OutStreamer.getContext().CreateTempSymbol();
2517 Asm->EmitLabelDifference(end, begin, 2);
2518 Asm->OutStreamer.EmitLabel(begin);
Devang Pateled9fd452011-07-08 16:49:43 +00002519 if (Entry.isInt()) {
Devang Patel324f8432011-06-01 22:03:25 +00002520 DIBasicType BTy(DV.getType());
2521 if (BTy.Verify() &&
Eric Christopher6a841382012-11-19 22:42:10 +00002522 (BTy.getEncoding() == dwarf::DW_ATE_signed
Devang Patel324f8432011-06-01 22:03:25 +00002523 || BTy.getEncoding() == dwarf::DW_ATE_signed_char)) {
2524 Asm->OutStreamer.AddComment("DW_OP_consts");
2525 Asm->EmitInt8(dwarf::DW_OP_consts);
Devang Pateled9fd452011-07-08 16:49:43 +00002526 Asm->EmitSLEB128(Entry.getInt());
Devang Patel324f8432011-06-01 22:03:25 +00002527 } else {
2528 Asm->OutStreamer.AddComment("DW_OP_constu");
2529 Asm->EmitInt8(dwarf::DW_OP_constu);
Devang Pateled9fd452011-07-08 16:49:43 +00002530 Asm->EmitULEB128(Entry.getInt());
Devang Patel324f8432011-06-01 22:03:25 +00002531 }
Devang Pateled9fd452011-07-08 16:49:43 +00002532 } else if (Entry.isLocation()) {
Eric Christopher614a89f2013-07-03 22:40:21 +00002533 MachineLocation Loc = Entry.getLoc();
Eric Christopher6a841382012-11-19 22:42:10 +00002534 if (!DV.hasComplexAddress())
Devang Pateled9fd452011-07-08 16:49:43 +00002535 // Regular entry.
Eric Christopher614a89f2013-07-03 22:40:21 +00002536 Asm->EmitDwarfRegOp(Loc, DV.isIndirect());
Devang Pateled9fd452011-07-08 16:49:43 +00002537 else {
2538 // Complex address entry.
2539 unsigned N = DV.getNumAddrElements();
2540 unsigned i = 0;
2541 if (N >= 2 && DV.getAddrElement(0) == DIBuilder::OpPlus) {
Eric Christopher614a89f2013-07-03 22:40:21 +00002542 if (Loc.getOffset()) {
Devang Pateled9fd452011-07-08 16:49:43 +00002543 i = 2;
Eric Christopher614a89f2013-07-03 22:40:21 +00002544 Asm->EmitDwarfRegOp(Loc, DV.isIndirect());
Devang Pateled9fd452011-07-08 16:49:43 +00002545 Asm->OutStreamer.AddComment("DW_OP_deref");
2546 Asm->EmitInt8(dwarf::DW_OP_deref);
2547 Asm->OutStreamer.AddComment("DW_OP_plus_uconst");
2548 Asm->EmitInt8(dwarf::DW_OP_plus_uconst);
2549 Asm->EmitSLEB128(DV.getAddrElement(1));
2550 } else {
2551 // If first address element is OpPlus then emit
2552 // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
Eric Christopher614a89f2013-07-03 22:40:21 +00002553 MachineLocation TLoc(Loc.getReg(), DV.getAddrElement(1));
2554 Asm->EmitDwarfRegOp(TLoc, DV.isIndirect());
Devang Pateled9fd452011-07-08 16:49:43 +00002555 i = 2;
2556 }
2557 } else {
Eric Christopher614a89f2013-07-03 22:40:21 +00002558 Asm->EmitDwarfRegOp(Loc, DV.isIndirect());
Devang Pateled9fd452011-07-08 16:49:43 +00002559 }
Eric Christopher6a841382012-11-19 22:42:10 +00002560
Devang Pateled9fd452011-07-08 16:49:43 +00002561 // Emit remaining complex address elements.
2562 for (; i < N; ++i) {
2563 uint64_t Element = DV.getAddrElement(i);
2564 if (Element == DIBuilder::OpPlus) {
2565 Asm->EmitInt8(dwarf::DW_OP_plus_uconst);
2566 Asm->EmitULEB128(DV.getAddrElement(++i));
Eric Christopher4d250522012-05-08 18:56:00 +00002567 } else if (Element == DIBuilder::OpDeref) {
Eric Christopher614a89f2013-07-03 22:40:21 +00002568 if (!Loc.isReg())
Eric Christopher4d250522012-05-08 18:56:00 +00002569 Asm->EmitInt8(dwarf::DW_OP_deref);
2570 } else
2571 llvm_unreachable("unknown Opcode found in complex address");
Devang Pateled9fd452011-07-08 16:49:43 +00002572 }
Devang Patel3e021532011-04-28 02:22:40 +00002573 }
Devang Patel3e021532011-04-28 02:22:40 +00002574 }
Devang Pateled9fd452011-07-08 16:49:43 +00002575 // else ... ignore constant fp. There is not any good way to
2576 // to represent them here in dwarf.
Rafael Espindolad23bfb82011-05-27 22:05:41 +00002577 Asm->OutStreamer.EmitLabel(end);
Devang Patel9fc11702010-05-25 23:40:22 +00002578 }
2579 }
Bill Wendling480ff322009-05-20 23:21:38 +00002580}
2581
Eric Christopheracdcbdb2012-11-27 22:43:45 +00002582// Emit visible names into a debug aranges section.
Eric Christopher7b30f2e42012-11-21 00:34:35 +00002583void DwarfDebug::emitDebugARanges() {
Bill Wendling480ff322009-05-20 23:21:38 +00002584 // Start the dwarf aranges section.
Chris Lattner4b7dadb2009-08-19 05:49:37 +00002585 Asm->OutStreamer.SwitchSection(
2586 Asm->getObjFileLowering().getDwarfARangesSection());
Bill Wendling480ff322009-05-20 23:21:38 +00002587}
2588
Eric Christopheracdcbdb2012-11-27 22:43:45 +00002589// Emit visible names into a debug ranges section.
Devang Patel930143b2009-11-21 02:48:08 +00002590void DwarfDebug::emitDebugRanges() {
Bill Wendling480ff322009-05-20 23:21:38 +00002591 // Start the dwarf ranges section.
Chris Lattner4b7dadb2009-08-19 05:49:37 +00002592 Asm->OutStreamer.SwitchSection(
Devang Patel12563b32010-04-16 23:33:45 +00002593 Asm->getObjFileLowering().getDwarfRangesSection());
Chandler Carruth5da3f052012-11-01 09:14:31 +00002594 unsigned char Size = Asm->getDataLayout().getPointerSize();
Eric Christopher4887c8f2013-03-29 23:34:06 +00002595 for (SmallVectorImpl<const MCSymbol *>::iterator
Jim Grosbacha8683bb2010-07-21 21:21:52 +00002596 I = DebugRangeSymbols.begin(), E = DebugRangeSymbols.end();
Devang Patel6c74a872010-04-27 19:46:33 +00002597 I != E; ++I) {
2598 if (*I)
Eric Christopherbf7bc492013-01-09 03:52:05 +00002599 Asm->OutStreamer.EmitSymbolValue(const_cast<MCSymbol*>(*I), Size);
Devang Patel12563b32010-04-16 23:33:45 +00002600 else
Eric Christopherce0cfce2013-01-09 01:35:34 +00002601 Asm->OutStreamer.EmitIntValue(0, Size);
Devang Patel12563b32010-04-16 23:33:45 +00002602 }
Bill Wendling480ff322009-05-20 23:21:38 +00002603}
2604
Eric Christopheracdcbdb2012-11-27 22:43:45 +00002605// Emit visible names into a debug macinfo section.
Devang Patel930143b2009-11-21 02:48:08 +00002606void DwarfDebug::emitDebugMacInfo() {
Daniel Dunbarc418d6b2009-09-19 20:40:05 +00002607 if (const MCSection *LineInfo =
Chris Lattner1472cf52009-08-02 07:24:22 +00002608 Asm->getObjFileLowering().getDwarfMacroInfoSection()) {
Bill Wendling480ff322009-05-20 23:21:38 +00002609 // Start the dwarf macinfo section.
Chris Lattner4b7dadb2009-08-19 05:49:37 +00002610 Asm->OutStreamer.SwitchSection(LineInfo);
Bill Wendling480ff322009-05-20 23:21:38 +00002611 }
2612}
2613
Eric Christopheracdcbdb2012-11-27 22:43:45 +00002614// Emit inline info using following format.
2615// Section Header:
2616// 1. length of section
2617// 2. Dwarf version number
2618// 3. address size.
2619//
2620// Entries (one "entry" for each function that was inlined):
2621//
2622// 1. offset into __debug_str section for MIPS linkage name, if exists;
2623// otherwise offset into __debug_str for regular function name.
2624// 2. offset into __debug_str section for regular function name.
2625// 3. an unsigned LEB128 number indicating the number of distinct inlining
2626// instances for the function.
2627//
2628// The rest of the entry consists of a {die_offset, low_pc} pair for each
2629// inlined instance; the die_offset points to the inlined_subroutine die in the
2630// __debug_info section, and the low_pc is the starting address for the
2631// inlining instance.
Devang Patel930143b2009-11-21 02:48:08 +00002632void DwarfDebug::emitDebugInlineInfo() {
Eric Christopher1df94bf2012-03-02 02:11:47 +00002633 if (!Asm->MAI->doesDwarfUseInlineInfoSection())
Bill Wendling480ff322009-05-20 23:21:38 +00002634 return;
2635
Devang Patel1a0df9a2010-05-10 22:49:55 +00002636 if (!FirstCU)
Bill Wendling480ff322009-05-20 23:21:38 +00002637 return;
2638
Chris Lattner4b7dadb2009-08-19 05:49:37 +00002639 Asm->OutStreamer.SwitchSection(
2640 Asm->getObjFileLowering().getDwarfDebugInlineSection());
Chris Lattnerf5c834f2010-01-22 22:09:00 +00002641
Chris Lattner566cae92010-03-09 23:52:58 +00002642 Asm->OutStreamer.AddComment("Length of Debug Inlined Information Entry");
Chris Lattnerf1429f12010-04-04 19:58:12 +00002643 Asm->EmitLabelDifference(Asm->GetTempSymbol("debug_inlined_end", 1),
2644 Asm->GetTempSymbol("debug_inlined_begin", 1), 4);
Bill Wendling480ff322009-05-20 23:21:38 +00002645
Chris Lattnera179b522010-04-04 19:25:43 +00002646 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_begin", 1));
Bill Wendling480ff322009-05-20 23:21:38 +00002647
Chris Lattner566cae92010-03-09 23:52:58 +00002648 Asm->OutStreamer.AddComment("Dwarf Version");
Manman Renac8062b2013-07-02 23:40:10 +00002649 Asm->EmitInt16(DwarfVersion);
Chris Lattner566cae92010-03-09 23:52:58 +00002650 Asm->OutStreamer.AddComment("Address Size (in bytes)");
Chandler Carruth5da3f052012-11-01 09:14:31 +00002651 Asm->EmitInt8(Asm->getDataLayout().getPointerSize());
Bill Wendling480ff322009-05-20 23:21:38 +00002652
Eric Christopher4887c8f2013-03-29 23:34:06 +00002653 for (SmallVectorImpl<const MDNode *>::iterator I = InlinedSPNodes.begin(),
Devang Patelf6eeaeb2009-11-10 23:06:00 +00002654 E = InlinedSPNodes.end(); I != E; ++I) {
Jim Grosbach042483e2009-11-21 23:12:12 +00002655
Devang Patel32cc43c2010-05-07 20:54:48 +00002656 const MDNode *Node = *I;
Craig Topper2b4a2012013-07-03 04:40:27 +00002657 InlineInfoMap::iterator II = InlineInfo.find(Node);
Eric Christopher4887c8f2013-03-29 23:34:06 +00002658 SmallVectorImpl<InlineInfoLabels> &Labels = II->second;
Devang Patel80ae3492009-08-28 23:24:31 +00002659 DISubprogram SP(Node);
Devang Patel2d9caf92009-11-25 17:36:49 +00002660 StringRef LName = SP.getLinkageName();
2661 StringRef Name = SP.getName();
Bill Wendling480ff322009-05-20 23:21:38 +00002662
Chris Lattner566cae92010-03-09 23:52:58 +00002663 Asm->OutStreamer.AddComment("MIPS linkage name");
Eric Christopher77725312012-03-02 01:57:52 +00002664 if (LName.empty())
Eric Christophere698f532012-12-20 21:58:36 +00002665 Asm->EmitSectionOffset(InfoHolder.getStringPoolEntry(Name),
2666 DwarfStrSectionSym);
Eric Christopher77725312012-03-02 01:57:52 +00002667 else
Benjamin Kramer7c275642013-06-01 17:51:14 +00002668 Asm->EmitSectionOffset(
2669 InfoHolder.getStringPoolEntry(Function::getRealLinkageName(LName)),
2670 DwarfStrSectionSym);
Devang Patelf6eeaeb2009-11-10 23:06:00 +00002671
Chris Lattner566cae92010-03-09 23:52:58 +00002672 Asm->OutStreamer.AddComment("Function name");
Eric Christophere698f532012-12-20 21:58:36 +00002673 Asm->EmitSectionOffset(InfoHolder.getStringPoolEntry(Name),
2674 DwarfStrSectionSym);
Chris Lattner9efd1182010-04-04 19:09:29 +00002675 Asm->EmitULEB128(Labels.size(), "Inline count");
Bill Wendling480ff322009-05-20 23:21:38 +00002676
Eric Christopher4887c8f2013-03-29 23:34:06 +00002677 for (SmallVectorImpl<InlineInfoLabels>::iterator LI = Labels.begin(),
Bill Wendling480ff322009-05-20 23:21:38 +00002678 LE = Labels.end(); LI != LE; ++LI) {
Chris Lattner7bde8c02010-04-04 18:52:31 +00002679 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
Chris Lattner085b6522010-03-09 00:31:02 +00002680 Asm->EmitInt32(LI->second->getOffset());
Bill Wendling480ff322009-05-20 23:21:38 +00002681
Chris Lattner7bde8c02010-04-04 18:52:31 +00002682 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("low_pc");
Chris Lattner3a383cb2010-04-05 00:13:49 +00002683 Asm->OutStreamer.EmitSymbolValue(LI->first,
Eric Christopherbf7bc492013-01-09 03:52:05 +00002684 Asm->getDataLayout().getPointerSize());
Bill Wendling480ff322009-05-20 23:21:38 +00002685 }
2686 }
2687
Chris Lattnera179b522010-04-04 19:25:43 +00002688 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_end", 1));
Bill Wendling480ff322009-05-20 23:21:38 +00002689}
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002690
Eric Christopherd692c1d2012-12-11 19:42:09 +00002691// DWARF5 Experimental Separate Dwarf emitters.
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002692
2693// This DIE has the following attributes: DW_AT_comp_dir, DW_AT_stmt_list,
2694// DW_AT_low_pc, DW_AT_high_pc, DW_AT_ranges, DW_AT_dwo_name, DW_AT_dwo_id,
2695// DW_AT_ranges_base, DW_AT_addr_base. If DW_AT_ranges is present,
2696// DW_AT_low_pc and DW_AT_high_pc are not used, and vice versa.
Eric Christophercdf218d2012-12-10 19:51:21 +00002697CompileUnit *DwarfDebug::constructSkeletonCU(const MDNode *N) {
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002698 DICompileUnit DIUnit(N);
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002699 CompilationDir = DIUnit.getDirectory();
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002700
2701 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
Eli Benderskyb42d1462012-12-03 18:45:45 +00002702 CompileUnit *NewCU = new CompileUnit(GlobalCUIndexCount++,
Eric Christopherc57baee2013-05-08 00:58:51 +00002703 DIUnit.getLanguage(), Die, N, Asm,
Eric Christopher3bf29fd2012-12-27 02:14:01 +00002704 this, &SkeletonHolder);
Eric Christopher4c7765f2013-01-17 03:00:04 +00002705
Eric Christopherdae389b2013-02-22 23:50:08 +00002706 NewCU->addLocalString(Die, dwarf::DW_AT_GNU_dwo_name,
2707 DIUnit.getSplitDebugFilename());
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002708
Eric Christopher44c6aa62013-04-22 07:51:08 +00002709 // Relocate to the beginning of the addr_base section, else 0 for the
2710 // beginning of the one for this compile unit.
Eric Christopher55863be2013-04-07 03:43:09 +00002711 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
2712 NewCU->addLabel(Die, dwarf::DW_AT_GNU_addr_base, dwarf::DW_FORM_sec_offset,
2713 DwarfAddrSectionSym);
2714 else
Eric Christopher44c6aa62013-04-22 07:51:08 +00002715 NewCU->addUInt(Die, dwarf::DW_AT_GNU_addr_base,
2716 dwarf::DW_FORM_sec_offset, 0);
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002717
2718 // 2.17.1 requires that we use DW_AT_low_pc for a single entry point
Eric Christopher962c9082013-01-15 23:56:56 +00002719 // into an entity. We're using 0, or a NULL label for this.
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002720 NewCU->addUInt(Die, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, 0);
Eric Christopher962c9082013-01-15 23:56:56 +00002721
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002722 // DW_AT_stmt_list is a offset of line number information for this
2723 // compile unit in debug_line section.
Eric Christopher55863be2013-04-07 03:43:09 +00002724 // FIXME: Should handle multiple compile units.
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002725 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
Eric Christopher4c7765f2013-01-17 03:00:04 +00002726 NewCU->addLabel(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_sec_offset,
Eric Christopher74804332013-02-07 21:19:50 +00002727 DwarfLineSectionSym);
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002728 else
Eric Christopher4c7765f2013-01-17 03:00:04 +00002729 NewCU->addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_sec_offset, 0);
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002730
2731 if (!CompilationDir.empty())
Eric Christopher2cbd5762013-01-07 19:32:41 +00002732 NewCU->addLocalString(Die, dwarf::DW_AT_comp_dir, CompilationDir);
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002733
Eric Christopherc8a310e2012-12-10 23:34:43 +00002734 SkeletonHolder.addUnit(NewCU);
Eric Christopher5b33b3c2013-02-06 21:53:56 +00002735 SkeletonCUs.push_back(NewCU);
Eric Christopherc8a310e2012-12-10 23:34:43 +00002736
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002737 return NewCU;
2738}
2739
Eric Christopher3c5a1912012-12-19 22:02:53 +00002740void DwarfDebug::emitSkeletonAbbrevs(const MCSection *Section) {
2741 assert(useSplitDwarf() && "No split dwarf debug info?");
2742 emitAbbrevs(Section, &SkeletonAbbrevs);
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002743}
2744
Eric Christopherd692c1d2012-12-11 19:42:09 +00002745// Emit the .debug_info.dwo section for separated dwarf. This contains the
2746// compile units that would normally be in debug_info.
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002747void DwarfDebug::emitDebugInfoDWO() {
Eric Christophercdf218d2012-12-10 19:51:21 +00002748 assert(useSplitDwarf() && "No split dwarf debug info?");
Eric Christophera2de8262012-12-15 00:04:07 +00002749 InfoHolder.emitUnits(this, Asm->getObjFileLowering().getDwarfInfoDWOSection(),
Eric Christopher3c5a1912012-12-19 22:02:53 +00002750 Asm->getObjFileLowering().getDwarfAbbrevDWOSection(),
2751 DwarfAbbrevDWOSectionSym);
2752}
2753
2754// Emit the .debug_abbrev.dwo section for separated dwarf. This contains the
2755// abbreviations for the .debug_info.dwo section.
2756void DwarfDebug::emitDebugAbbrevDWO() {
2757 assert(useSplitDwarf() && "No split dwarf?");
Eric Christopher48fef592012-12-20 21:58:40 +00002758 emitAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevDWOSection(),
2759 &Abbreviations);
Eric Christopher9c2ecd92012-11-30 23:59:06 +00002760}
Eric Christopher3bf29fd2012-12-27 02:14:01 +00002761
2762// Emit the .debug_str.dwo section for separated dwarf. This contains the
2763// string section and is identical in format to traditional .debug_str
2764// sections.
2765void DwarfDebug::emitDebugStrDWO() {
2766 assert(useSplitDwarf() && "No split dwarf?");
Eric Christopherb800ff72013-01-07 22:40:45 +00002767 const MCSection *OffSec = Asm->getObjFileLowering()
2768 .getDwarfStrOffDWOSection();
Eric Christopher2cbd5762013-01-07 19:32:41 +00002769 const MCSymbol *StrSym = DwarfStrSectionSym;
2770 InfoHolder.emitStrings(Asm->getObjFileLowering().getDwarfStrDWOSection(),
2771 OffSec, StrSym);
Eric Christopher3bf29fd2012-12-27 02:14:01 +00002772}