blob: 58e40e17c52e8d02cb8e57620943eba7036b55e5 [file] [log] [blame]
Bill Wendling0310d762009-05-15 09:23:25 +00001//===-- llvm/CodeGen/DwarfDebug.cpp - Dwarf Debug Framework ---------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file contains support for writing dwarf debug info into asm files.
11//
12//===----------------------------------------------------------------------===//
Chris Lattner6cde3e62010-03-09 00:39:24 +000013
Devang Patele4b27562009-08-28 23:24:31 +000014#define DEBUG_TYPE "dwarfdebug"
Bill Wendling0310d762009-05-15 09:23:25 +000015#include "DwarfDebug.h"
Chris Lattner74e41f92010-04-05 05:24:55 +000016#include "DIE.h"
Eric Christopher09ac3d82011-11-07 09:24:32 +000017#include "DwarfAccelTable.h"
Devang Patel8b9df622011-04-12 17:40:32 +000018#include "DwarfCompileUnit.h"
Bill Wendling57fbba42010-04-05 22:59:21 +000019#include "llvm/Constants.h"
Bill Wendling0310d762009-05-15 09:23:25 +000020#include "llvm/Module.h"
Devang Patele449d1f2011-01-20 00:02:16 +000021#include "llvm/Instructions.h"
David Greeneb2c66fc2009-08-19 21:52:55 +000022#include "llvm/CodeGen/MachineFunction.h"
Bill Wendling0310d762009-05-15 09:23:25 +000023#include "llvm/CodeGen/MachineModuleInfo.h"
Chris Lattnerb7db7332010-03-09 01:58:53 +000024#include "llvm/MC/MCAsmInfo.h"
Chris Lattnera87dea42009-07-31 18:48:30 +000025#include "llvm/MC/MCSection.h"
Chris Lattner6c2f9e12009-08-19 05:49:37 +000026#include "llvm/MC/MCStreamer.h"
Chris Lattnerb7db7332010-03-09 01:58:53 +000027#include "llvm/MC/MCSymbol.h"
Bill Wendling0310d762009-05-15 09:23:25 +000028#include "llvm/Target/TargetData.h"
Anton Korobeynikov16c29b52011-01-10 12:39:04 +000029#include "llvm/Target/TargetFrameLowering.h"
Chris Lattnerf0144122009-07-28 03:13:23 +000030#include "llvm/Target/TargetLoweringObjectFile.h"
Chris Lattner9d1c1ad2010-04-04 18:06:11 +000031#include "llvm/Target/TargetMachine.h"
Chris Lattnerf0144122009-07-28 03:13:23 +000032#include "llvm/Target/TargetRegisterInfo.h"
Devang Patel2a4a3b72010-04-19 19:14:02 +000033#include "llvm/Target/TargetOptions.h"
Chris Lattner74e41f92010-04-05 05:24:55 +000034#include "llvm/Analysis/DebugInfo.h"
Devang Patel0eea95d2011-02-24 18:49:30 +000035#include "llvm/Analysis/DIBuilder.h"
Devang Patel9a31f0f2010-10-25 20:45:32 +000036#include "llvm/ADT/Statistic.h"
Jeffrey Yasskin5c213dc2010-03-12 17:45:06 +000037#include "llvm/ADT/STLExtras.h"
Chris Lattner23132b12009-08-24 03:52:50 +000038#include "llvm/ADT/StringExtras.h"
Devang Pateleac9c072010-04-27 19:46:33 +000039#include "llvm/Support/CommandLine.h"
Daniel Dunbar6e4bdfc2009-10-13 06:47:08 +000040#include "llvm/Support/Debug.h"
41#include "llvm/Support/ErrorHandling.h"
Devang Patel3139fcf2010-01-26 21:39:14 +000042#include "llvm/Support/ValueHandle.h"
Chris Lattner0ad9c912010-01-22 22:09:00 +000043#include "llvm/Support/FormattedStream.h"
Chris Lattnera87dea42009-07-31 18:48:30 +000044#include "llvm/Support/Timer.h"
Michael J. Spencer1f6efa32010-11-29 18:16:10 +000045#include "llvm/Support/Path.h"
Bill Wendling0310d762009-05-15 09:23:25 +000046using namespace llvm;
47
Jim Grosbach1e20b962010-07-21 21:21:52 +000048static cl::opt<bool> DisableDebugInfoPrinting("disable-debug-info-print",
Devang Patel61409622010-07-07 20:12:52 +000049 cl::Hidden,
Devang Pateleac9c072010-04-27 19:46:33 +000050 cl::desc("Disable debug info printing"));
51
Dan Gohman281d65d2010-05-07 01:08:53 +000052static cl::opt<bool> UnknownLocations("use-unknown-locations", cl::Hidden,
Chris Lattner7a2bdde2011-04-15 05:18:47 +000053 cl::desc("Make an absence of debug location information explicit."),
Dan Gohman281d65d2010-05-07 01:08:53 +000054 cl::init(false));
55
Eric Christopher09ac3d82011-11-07 09:24:32 +000056static cl::opt<bool> DwarfAccelTables("dwarf-accel-tables", cl::Hidden,
57 cl::desc("Output prototype dwarf accelerator tables."),
58 cl::init(false));
59
Bill Wendling5f017e82010-04-07 09:28:04 +000060namespace {
61 const char *DWARFGroupName = "DWARF Emission";
62 const char *DbgTimerName = "DWARF Debug Writer";
63} // end anonymous namespace
64
Bill Wendling0310d762009-05-15 09:23:25 +000065//===----------------------------------------------------------------------===//
66
67/// Configuration values for initial hash set sizes (log2).
68///
Bill Wendling0310d762009-05-15 09:23:25 +000069static const unsigned InitAbbreviationsSetSize = 9; // log2(512)
Bill Wendling0310d762009-05-15 09:23:25 +000070
71namespace llvm {
72
Nick Lewycky3bbb6f72011-07-29 03:49:23 +000073DIType DbgVariable::getType() const {
Devang Patel3cbee302011-04-12 22:53:02 +000074 DIType Ty = Var.getType();
75 // FIXME: isBlockByrefVariable should be reformulated in terms of complex
76 // addresses instead.
77 if (Var.isBlockByrefVariable()) {
78 /* Byref variables, in Blocks, are declared by the programmer as
79 "SomeType VarName;", but the compiler creates a
80 __Block_byref_x_VarName struct, and gives the variable VarName
81 either the struct, or a pointer to the struct, as its type. This
82 is necessary for various behind-the-scenes things the compiler
83 needs to do with by-reference variables in blocks.
84
85 However, as far as the original *programmer* is concerned, the
86 variable should still have type 'SomeType', as originally declared.
87
88 The following function dives into the __Block_byref_x_VarName
89 struct to find the original type of the variable. This will be
90 passed back to the code generating the type for the Debug
91 Information Entry for the variable 'VarName'. 'VarName' will then
92 have the original type 'SomeType' in its debug information.
93
94 The original type 'SomeType' will be the type of the field named
95 'VarName' inside the __Block_byref_x_VarName struct.
96
97 NOTE: In order for this to not completely fail on the debugger
98 side, the Debug Information Entry for the variable VarName needs to
99 have a DW_AT_location that tells the debugger how to unwind through
100 the pointers and __Block_byref_x_VarName struct to find the actual
101 value of the variable. The function addBlockByrefType does this. */
102 DIType subType = Ty;
103 unsigned tag = Ty.getTag();
104
105 if (tag == dwarf::DW_TAG_pointer_type) {
106 DIDerivedType DTy = DIDerivedType(Ty);
107 subType = DTy.getTypeDerivedFrom();
108 }
109
110 DICompositeType blockStruct = DICompositeType(subType);
111 DIArray Elements = blockStruct.getTypeArray();
112
113 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
114 DIDescriptor Element = Elements.getElement(i);
115 DIDerivedType DT = DIDerivedType(Element);
116 if (getName() == DT.getName())
117 return (DT.getTypeDerivedFrom());
Devang Patel8bd11de2010-08-09 21:01:39 +0000118 }
119 return Ty;
120 }
Devang Patel3cbee302011-04-12 22:53:02 +0000121 return Ty;
122}
Bill Wendling0310d762009-05-15 09:23:25 +0000123
Chris Lattnerea761862010-04-05 04:09:20 +0000124} // end llvm namespace
Bill Wendling0310d762009-05-15 09:23:25 +0000125
Chris Lattner49cd6642010-04-05 05:11:15 +0000126DwarfDebug::DwarfDebug(AsmPrinter *A, Module *M)
Devang Patel163a9f72010-05-10 22:49:55 +0000127 : Asm(A), MMI(Asm->MMI), FirstCU(0),
Jim Grosbach1e20b962010-07-21 21:21:52 +0000128 AbbreviationsSet(InitAbbreviationsSetSize),
Devang Patelbf47fdb2011-08-10 20:55:27 +0000129 PrevLabel(NULL) {
Chris Lattnerbc733f52010-03-13 02:17:42 +0000130 NextStringPoolNumber = 0;
Jim Grosbach1e20b962010-07-21 21:21:52 +0000131
Rafael Espindolaf2b04232011-05-06 14:56:22 +0000132 DwarfInfoSectionSym = DwarfAbbrevSectionSym = 0;
Chris Lattner4ad1efe2010-04-04 23:10:38 +0000133 DwarfStrSectionSym = TextSectionSym = 0;
Jim Grosbach1e20b962010-07-21 21:21:52 +0000134 DwarfDebugRangeSectionSym = DwarfDebugLocSectionSym = 0;
Devang Patelc3f5f782010-05-25 23:40:22 +0000135 FunctionBeginSym = FunctionEndSym = 0;
Dan Gohman03c3dc72010-06-18 15:56:31 +0000136 {
137 NamedRegionTimer T(DbgTimerName, DWARFGroupName, TimePassesIsEnabled);
138 beginModule(M);
Torok Edwin9c421072010-04-07 10:44:46 +0000139 }
Bill Wendling0310d762009-05-15 09:23:25 +0000140}
141DwarfDebug::~DwarfDebug() {
Bill Wendling0310d762009-05-15 09:23:25 +0000142}
143
Eric Christopherd8a87522011-11-07 09:18:38 +0000144/// EmitSectionSym - Switch to the specified MCSection and emit an assembler
145/// temporary label to it if SymbolStem is specified.
146static MCSymbol *EmitSectionSym(AsmPrinter *Asm, const MCSection *Section,
147 const char *SymbolStem = 0) {
148 Asm->OutStreamer.SwitchSection(Section);
149 if (!SymbolStem) return 0;
150
151 MCSymbol *TmpSym = Asm->GetTempSymbol(SymbolStem);
152 Asm->OutStreamer.EmitLabel(TmpSym);
153 return TmpSym;
154}
155
Nick Lewycky390c40d2011-10-27 06:44:11 +0000156MCSymbol *DwarfDebug::getStringPool() {
157 return Asm->GetTempSymbol("section_str");
158}
159
Chris Lattnerbc733f52010-03-13 02:17:42 +0000160MCSymbol *DwarfDebug::getStringPoolEntry(StringRef Str) {
161 std::pair<MCSymbol*, unsigned> &Entry = StringPool[Str];
162 if (Entry.first) return Entry.first;
163
164 Entry.second = NextStringPoolNumber++;
Chris Lattnerc0215722010-04-04 19:25:43 +0000165 return Entry.first = Asm->GetTempSymbol("string", Entry.second);
Chris Lattnerbc733f52010-03-13 02:17:42 +0000166}
167
Devang Patel2c4ceb12009-11-21 02:48:08 +0000168/// assignAbbrevNumber - Define a unique number for the abbreviation.
Bill Wendling0310d762009-05-15 09:23:25 +0000169///
Devang Patel2c4ceb12009-11-21 02:48:08 +0000170void DwarfDebug::assignAbbrevNumber(DIEAbbrev &Abbrev) {
Bill Wendling0310d762009-05-15 09:23:25 +0000171 // Profile the node so that we can make it unique.
172 FoldingSetNodeID ID;
173 Abbrev.Profile(ID);
174
175 // Check the set for priors.
176 DIEAbbrev *InSet = AbbreviationsSet.GetOrInsertNode(&Abbrev);
177
178 // If it's newly added.
179 if (InSet == &Abbrev) {
180 // Add to abbreviation list.
181 Abbreviations.push_back(&Abbrev);
182
183 // Assign the vector position + 1 as its number.
184 Abbrev.setNumber(Abbreviations.size());
185 } else {
186 // Assign existing abbreviation number.
187 Abbrev.setNumber(InSet->getNumber());
188 }
189}
190
Jim Grosbach1e20b962010-07-21 21:21:52 +0000191/// getRealLinkageName - If special LLVM prefix that is used to inform the asm
Devang Patel351ca332010-01-05 01:46:14 +0000192/// printer to not emit usual symbol prefix before the symbol name is used then
193/// return linkage name after skipping this special LLVM prefix.
194static StringRef getRealLinkageName(StringRef LinkageName) {
195 char One = '\1';
196 if (LinkageName.startswith(StringRef(&One, 1)))
197 return LinkageName.substr(1);
198 return LinkageName;
199}
200
Eric Christopher0ffe2b42011-11-10 19:25:34 +0000201static bool isObjCClass(StringRef Name) {
202 return Name.startswith("+") || Name.startswith("-");
203}
204
205static bool hasObjCCategory(StringRef Name) {
206 if (!isObjCClass(Name)) return false;
207
208 size_t pos = Name.find(')');
209 if (pos != std::string::npos) {
210 if (Name[pos+1] != ' ') return false;
211 return true;
212 }
213 return false;
214}
215
216static void getObjCClassCategory(StringRef In, StringRef &Class,
217 StringRef &Category) {
218 if (!hasObjCCategory(In)) {
219 Class = In.slice(In.find('[') + 1, In.find(' '));
220 Category = "";
221 return;
222 }
223
224 Class = In.slice(In.find('[') + 1, In.find('('));
225 Category = In.slice(In.find('[') + 1, In.find(' '));
226 return;
227}
228
229static StringRef getObjCMethodName(StringRef In) {
230 return In.slice(In.find(' ') + 1, In.find(']'));
231}
232
233// Add the various names to the Dwarf accelerator table names.
234static void addSubprogramNames(CompileUnit *TheCU, DISubprogram SP,
235 DIE* Die) {
236 if (!SP.isDefinition()) return;
237
238 TheCU->addAccelName(SP.getName(), Die);
239
240 // If the linkage name is different than the name, go ahead and output
241 // that as well into the name table.
242 if (SP.getLinkageName() != "" && SP.getName() != SP.getLinkageName())
243 TheCU->addAccelName(SP.getLinkageName(), Die);
244
245 // If this is an Objective-C selector name add it to the ObjC accelerator
246 // too.
247 if (isObjCClass(SP.getName())) {
248 StringRef Class, Category;
249 getObjCClassCategory(SP.getName(), Class, Category);
250 TheCU->addAccelObjC(Class, Die);
251 if (Category != "")
252 TheCU->addAccelObjC(Category, Die);
253 // Also add the base method name to the name table.
254 TheCU->addAccelName(getObjCMethodName(SP.getName()), Die);
255 }
256}
257
Jim Grosbach31ef40e2009-11-21 23:12:12 +0000258/// updateSubprogramScopeDIE - Find DIE for the given subprogram and
Devang Patel2c4ceb12009-11-21 02:48:08 +0000259/// attach appropriate DW_AT_low_pc and DW_AT_high_pc attributes.
260/// If there are global variables in this scope then create and insert
261/// DIEs for these variables.
Devang Pateld3024342011-08-15 22:24:32 +0000262DIE *DwarfDebug::updateSubprogramScopeDIE(CompileUnit *SPCU,
263 const MDNode *SPNode) {
Devang Patel163a9f72010-05-10 22:49:55 +0000264 DIE *SPDie = SPCU->getDIE(SPNode);
Devang Patel8aa61472010-07-07 22:20:57 +0000265
Chris Lattnerd38fee82010-04-05 00:13:49 +0000266 assert(SPDie && "Unable to find subprogram DIE!");
267 DISubprogram SP(SPNode);
Jim Grosbach1e20b962010-07-21 21:21:52 +0000268
Devang Patel5e06bb82011-04-22 23:10:17 +0000269 DISubprogram SPDecl = SP.getFunctionDeclaration();
Rafael Espindolab0527282011-11-04 19:00:29 +0000270 if (!SPDecl.isSubprogram()) {
Devang Patel5e06bb82011-04-22 23:10:17 +0000271 // There is not any need to generate specification DIE for a function
272 // defined at compile unit level. If a function is defined inside another
273 // function then gdb prefers the definition at top level and but does not
274 // expect specification DIE in parent function. So avoid creating
275 // specification DIE for a function defined inside a function.
276 if (SP.isDefinition() && !SP.getContext().isCompileUnit() &&
277 !SP.getContext().isFile() &&
278 !isSubprogramContext(SP.getContext())) {
Nick Lewycky746cb672011-10-26 22:55:33 +0000279 SPCU->addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
Devang Patel5e06bb82011-04-22 23:10:17 +0000280
281 // Add arguments.
282 DICompositeType SPTy = SP.getType();
283 DIArray Args = SPTy.getTypeArray();
284 unsigned SPTag = SPTy.getTag();
285 if (SPTag == dwarf::DW_TAG_subroutine_type)
286 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
287 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
288 DIType ATy = DIType(DIType(Args.getElement(i)));
289 SPCU->addType(Arg, ATy);
290 if (ATy.isArtificial())
291 SPCU->addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
292 SPDie->addChild(Arg);
293 }
294 DIE *SPDeclDie = SPDie;
295 SPDie = new DIE(dwarf::DW_TAG_subprogram);
296 SPCU->addDIEEntry(SPDie, dwarf::DW_AT_specification, dwarf::DW_FORM_ref4,
297 SPDeclDie);
298 SPCU->addDie(SPDie);
299 }
Chris Lattnerd38fee82010-04-05 00:13:49 +0000300 }
Devang Patel8aa61472010-07-07 22:20:57 +0000301 // Pick up abstract subprogram DIE.
302 if (DIE *AbsSPDIE = AbstractSPDies.lookup(SPNode)) {
303 SPDie = new DIE(dwarf::DW_TAG_subprogram);
Devang Patel3cbee302011-04-12 22:53:02 +0000304 SPCU->addDIEEntry(SPDie, dwarf::DW_AT_abstract_origin,
305 dwarf::DW_FORM_ref4, AbsSPDIE);
Devang Patel8aa61472010-07-07 22:20:57 +0000306 SPCU->addDie(SPDie);
307 }
308
Devang Patel3cbee302011-04-12 22:53:02 +0000309 SPCU->addLabel(SPDie, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
310 Asm->GetTempSymbol("func_begin", Asm->getFunctionNumber()));
311 SPCU->addLabel(SPDie, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
312 Asm->GetTempSymbol("func_end", Asm->getFunctionNumber()));
Chris Lattnerd38fee82010-04-05 00:13:49 +0000313 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
314 MachineLocation Location(RI->getFrameRegister(*Asm->MF));
Devang Patel3cbee302011-04-12 22:53:02 +0000315 SPCU->addAddress(SPDie, dwarf::DW_AT_frame_base, Location);
Devang Patelb4645642010-02-06 01:02:37 +0000316
Eric Christopher0ffe2b42011-11-10 19:25:34 +0000317 // Add name to the name table, we do this here because we're guaranteed
318 // to have concrete versions of our DW_TAG_subprogram nodes.
319 addSubprogramNames(SPCU, SP, SPDie);
320
Chris Lattnerd38fee82010-04-05 00:13:49 +0000321 return SPDie;
Devang Patel53bb5c92009-11-10 23:06:00 +0000322}
323
Jim Grosbach31ef40e2009-11-21 23:12:12 +0000324/// constructLexicalScope - Construct new DW_TAG_lexical_block
Devang Patel2c4ceb12009-11-21 02:48:08 +0000325/// for this scope and attach DW_AT_low_pc/DW_AT_high_pc labels.
Devang Pateld3024342011-08-15 22:24:32 +0000326DIE *DwarfDebug::constructLexicalScopeDIE(CompileUnit *TheCU,
327 LexicalScope *Scope) {
Devang Pateleac9c072010-04-27 19:46:33 +0000328 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_lexical_block);
329 if (Scope->isAbstractScope())
330 return ScopeDIE;
331
Devang Patelbf47fdb2011-08-10 20:55:27 +0000332 const SmallVector<InsnRange, 4> &Ranges = Scope->getRanges();
Devang Pateleac9c072010-04-27 19:46:33 +0000333 if (Ranges.empty())
334 return 0;
335
Devang Patelbf47fdb2011-08-10 20:55:27 +0000336 SmallVector<InsnRange, 4>::const_iterator RI = Ranges.begin();
Devang Pateleac9c072010-04-27 19:46:33 +0000337 if (Ranges.size() > 1) {
338 // .debug_range section has not been laid out yet. Emit offset in
Jim Grosbach1e20b962010-07-21 21:21:52 +0000339 // .debug_range as a uint, size 4, for now. emitDIE will handle
Devang Pateleac9c072010-04-27 19:46:33 +0000340 // DW_AT_ranges appropriately.
Devang Patel3cbee302011-04-12 22:53:02 +0000341 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_ranges, dwarf::DW_FORM_data4,
Devang Patel5bc942c2011-08-10 23:58:09 +0000342 DebugRangeSymbols.size()
343 * Asm->getTargetData().getPointerSize());
Devang Patelbf47fdb2011-08-10 20:55:27 +0000344 for (SmallVector<InsnRange, 4>::const_iterator RI = Ranges.begin(),
Devang Pateleac9c072010-04-27 19:46:33 +0000345 RE = Ranges.end(); RI != RE; ++RI) {
Devang Patelc3f5f782010-05-25 23:40:22 +0000346 DebugRangeSymbols.push_back(getLabelBeforeInsn(RI->first));
347 DebugRangeSymbols.push_back(getLabelAfterInsn(RI->second));
Devang Pateleac9c072010-04-27 19:46:33 +0000348 }
349 DebugRangeSymbols.push_back(NULL);
350 DebugRangeSymbols.push_back(NULL);
351 return ScopeDIE;
352 }
353
Devang Patelc3f5f782010-05-25 23:40:22 +0000354 const MCSymbol *Start = getLabelBeforeInsn(RI->first);
355 const MCSymbol *End = getLabelAfterInsn(RI->second);
Devang Pateleac9c072010-04-27 19:46:33 +0000356
Devang Patelc3f5f782010-05-25 23:40:22 +0000357 if (End == 0) return 0;
Devang Patel53bb5c92009-11-10 23:06:00 +0000358
Chris Lattnerb7db7332010-03-09 01:58:53 +0000359 assert(Start->isDefined() && "Invalid starting label for an inlined scope!");
360 assert(End->isDefined() && "Invalid end label for an inlined scope!");
Jim Grosbach1e20b962010-07-21 21:21:52 +0000361
Devang Patel3cbee302011-04-12 22:53:02 +0000362 TheCU->addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, Start);
363 TheCU->addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr, End);
Devang Patel53bb5c92009-11-10 23:06:00 +0000364
365 return ScopeDIE;
366}
367
Devang Patel2c4ceb12009-11-21 02:48:08 +0000368/// constructInlinedScopeDIE - This scope represents inlined body of
369/// a function. Construct DIE to represent this concrete inlined copy
370/// of the function.
Devang Pateld3024342011-08-15 22:24:32 +0000371DIE *DwarfDebug::constructInlinedScopeDIE(CompileUnit *TheCU,
372 LexicalScope *Scope) {
Devang Patelbf47fdb2011-08-10 20:55:27 +0000373 const SmallVector<InsnRange, 4> &Ranges = Scope->getRanges();
Nick Lewycky746cb672011-10-26 22:55:33 +0000374 assert(Ranges.empty() == false &&
375 "LexicalScope does not have instruction markers!");
Devang Pateleac9c072010-04-27 19:46:33 +0000376
Devang Patel26a92002011-07-27 00:34:13 +0000377 if (!Scope->getScopeNode())
378 return NULL;
379 DIScope DS(Scope->getScopeNode());
380 DISubprogram InlinedSP = getDISubprogram(DS);
Devang Patel26a92002011-07-27 00:34:13 +0000381 DIE *OriginDIE = TheCU->getDIE(InlinedSP);
382 if (!OriginDIE) {
383 DEBUG(dbgs() << "Unable to find original DIE for inlined subprogram.");
384 return NULL;
385 }
386
Devang Patelbf47fdb2011-08-10 20:55:27 +0000387 SmallVector<InsnRange, 4>::const_iterator RI = Ranges.begin();
Devang Patelc3f5f782010-05-25 23:40:22 +0000388 const MCSymbol *StartLabel = getLabelBeforeInsn(RI->first);
389 const MCSymbol *EndLabel = getLabelAfterInsn(RI->second);
Devang Pateleac9c072010-04-27 19:46:33 +0000390
Devang Patel0afbf232010-07-08 22:39:20 +0000391 if (StartLabel == 0 || EndLabel == 0) {
Craig Topper5e25ee82012-02-05 08:31:47 +0000392 llvm_unreachable("Unexpected Start and End labels for a inlined scope!");
Devang Pateleac9c072010-04-27 19:46:33 +0000393 }
Chris Lattnerb7db7332010-03-09 01:58:53 +0000394 assert(StartLabel->isDefined() &&
Chris Lattnera34ec2292010-03-09 01:51:43 +0000395 "Invalid starting label for an inlined scope!");
Chris Lattnerb7db7332010-03-09 01:58:53 +0000396 assert(EndLabel->isDefined() &&
Chris Lattnera34ec2292010-03-09 01:51:43 +0000397 "Invalid end label for an inlined scope!");
Devang Pateleac9c072010-04-27 19:46:33 +0000398
Devang Pateld96efb82011-05-05 17:54:26 +0000399 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_inlined_subroutine);
Devang Patel3cbee302011-04-12 22:53:02 +0000400 TheCU->addDIEEntry(ScopeDIE, dwarf::DW_AT_abstract_origin,
401 dwarf::DW_FORM_ref4, OriginDIE);
Devang Patel53bb5c92009-11-10 23:06:00 +0000402
Devang Patel26a92002011-07-27 00:34:13 +0000403 if (Ranges.size() > 1) {
404 // .debug_range section has not been laid out yet. Emit offset in
405 // .debug_range as a uint, size 4, for now. emitDIE will handle
406 // DW_AT_ranges appropriately.
407 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_ranges, dwarf::DW_FORM_data4,
Devang Patel5bc942c2011-08-10 23:58:09 +0000408 DebugRangeSymbols.size()
409 * Asm->getTargetData().getPointerSize());
Devang Patelbf47fdb2011-08-10 20:55:27 +0000410 for (SmallVector<InsnRange, 4>::const_iterator RI = Ranges.begin(),
Devang Patel26a92002011-07-27 00:34:13 +0000411 RE = Ranges.end(); RI != RE; ++RI) {
412 DebugRangeSymbols.push_back(getLabelBeforeInsn(RI->first));
413 DebugRangeSymbols.push_back(getLabelAfterInsn(RI->second));
414 }
415 DebugRangeSymbols.push_back(NULL);
416 DebugRangeSymbols.push_back(NULL);
417 } else {
Devang Patel5bc942c2011-08-10 23:58:09 +0000418 TheCU->addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
419 StartLabel);
420 TheCU->addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
421 EndLabel);
Devang Patel26a92002011-07-27 00:34:13 +0000422 }
Devang Patel53bb5c92009-11-10 23:06:00 +0000423
424 InlinedSubprogramDIEs.insert(OriginDIE);
425
426 // Track the start label for this inlined function.
Devang Patel26a92002011-07-27 00:34:13 +0000427 //.debug_inlined section specification does not clearly state how
428 // to emit inlined scope that is split into multiple instruction ranges.
429 // For now, use first instruction range and emit low_pc/high_pc pair and
430 // corresponding .debug_inlined section entry for this pair.
Devang Patele9f8f5e2010-05-07 20:54:48 +0000431 DenseMap<const MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator
Devang Patel2db49d72010-05-07 18:11:54 +0000432 I = InlineInfo.find(InlinedSP);
Devang Patel53bb5c92009-11-10 23:06:00 +0000433
434 if (I == InlineInfo.end()) {
Nick Lewycky746cb672011-10-26 22:55:33 +0000435 InlineInfo[InlinedSP].push_back(std::make_pair(StartLabel, ScopeDIE));
Devang Patel2db49d72010-05-07 18:11:54 +0000436 InlinedSPNodes.push_back(InlinedSP);
Devang Patel53bb5c92009-11-10 23:06:00 +0000437 } else
Chris Lattner6ed0f902010-03-09 00:31:02 +0000438 I->second.push_back(std::make_pair(StartLabel, ScopeDIE));
Devang Patel53bb5c92009-11-10 23:06:00 +0000439
Devang Patel53bb5c92009-11-10 23:06:00 +0000440 DILocation DL(Scope->getInlinedAt());
Devang Patel3cbee302011-04-12 22:53:02 +0000441 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_call_file, 0, TheCU->getID());
442 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_call_line, 0, DL.getLineNumber());
Devang Patel53bb5c92009-11-10 23:06:00 +0000443
Eric Christopher309bedd2011-12-04 06:02:38 +0000444 // Add name to the name table, we do this here because we're guaranteed
445 // to have concrete versions of our DW_TAG_inlined_subprogram nodes.
446 addSubprogramNames(TheCU, InlinedSP, ScopeDIE);
447
Devang Patel53bb5c92009-11-10 23:06:00 +0000448 return ScopeDIE;
449}
450
Devang Patel2c4ceb12009-11-21 02:48:08 +0000451/// constructScopeDIE - Construct a DIE for this scope.
Devang Pateld0b5a5e2011-08-15 22:04:40 +0000452DIE *DwarfDebug::constructScopeDIE(CompileUnit *TheCU, LexicalScope *Scope) {
Devang Patel3c91b052010-03-08 20:52:55 +0000453 if (!Scope || !Scope->getScopeNode())
454 return NULL;
Jim Grosbach1e20b962010-07-21 21:21:52 +0000455
Nick Lewycky746cb672011-10-26 22:55:33 +0000456 SmallVector<DIE *, 8> Children;
Devang Patel0478c152011-03-01 22:58:55 +0000457
458 // Collect arguments for current function.
Devang Patelbf47fdb2011-08-10 20:55:27 +0000459 if (LScopes.isCurrentFunctionScope(Scope))
Devang Patel0478c152011-03-01 22:58:55 +0000460 for (unsigned i = 0, N = CurrentFnArguments.size(); i < N; ++i)
461 if (DbgVariable *ArgDV = CurrentFnArguments[i])
Devang Pateld0b5a5e2011-08-15 22:04:40 +0000462 if (DIE *Arg =
463 TheCU->constructVariableDIE(ArgDV, Scope->isAbstractScope()))
Devang Patel0478c152011-03-01 22:58:55 +0000464 Children.push_back(Arg);
465
Eric Christopher1aeb7ac2011-10-03 15:49:16 +0000466 // Collect lexical scope children first.
Devang Patelbf47fdb2011-08-10 20:55:27 +0000467 const SmallVector<DbgVariable *, 8> &Variables = ScopeVariables.lookup(Scope);
Devang Patel5bc9fec2011-02-19 01:31:27 +0000468 for (unsigned i = 0, N = Variables.size(); i < N; ++i)
Devang Pateld0b5a5e2011-08-15 22:04:40 +0000469 if (DIE *Variable =
470 TheCU->constructVariableDIE(Variables[i], Scope->isAbstractScope()))
Devang Patel5bc9fec2011-02-19 01:31:27 +0000471 Children.push_back(Variable);
Devang Patelbf47fdb2011-08-10 20:55:27 +0000472 const SmallVector<LexicalScope *, 4> &Scopes = Scope->getChildren();
Devang Patel5bc9fec2011-02-19 01:31:27 +0000473 for (unsigned j = 0, M = Scopes.size(); j < M; ++j)
Devang Pateld0b5a5e2011-08-15 22:04:40 +0000474 if (DIE *Nested = constructScopeDIE(TheCU, Scopes[j]))
Devang Patel5bc9fec2011-02-19 01:31:27 +0000475 Children.push_back(Nested);
Devang Patel3c91b052010-03-08 20:52:55 +0000476 DIScope DS(Scope->getScopeNode());
477 DIE *ScopeDIE = NULL;
478 if (Scope->getInlinedAt())
Devang Pateld3024342011-08-15 22:24:32 +0000479 ScopeDIE = constructInlinedScopeDIE(TheCU, Scope);
Devang Patel3c91b052010-03-08 20:52:55 +0000480 else if (DS.isSubprogram()) {
Devang Patel0dd45582010-06-28 20:53:04 +0000481 ProcessedSPNodes.insert(DS);
Devang Patel8aa61472010-07-07 22:20:57 +0000482 if (Scope->isAbstractScope()) {
Devang Pateld3024342011-08-15 22:24:32 +0000483 ScopeDIE = TheCU->getDIE(DS);
Devang Patel8aa61472010-07-07 22:20:57 +0000484 // Note down abstract DIE.
485 if (ScopeDIE)
486 AbstractSPDies.insert(std::make_pair(DS, ScopeDIE));
487 }
Devang Patel3c91b052010-03-08 20:52:55 +0000488 else
Devang Pateld3024342011-08-15 22:24:32 +0000489 ScopeDIE = updateSubprogramScopeDIE(TheCU, DS);
Devang Patel3c91b052010-03-08 20:52:55 +0000490 }
Devang Patel5bc9fec2011-02-19 01:31:27 +0000491 else {
492 // There is no need to emit empty lexical block DIE.
493 if (Children.empty())
494 return NULL;
Devang Pateld3024342011-08-15 22:24:32 +0000495 ScopeDIE = constructLexicalScopeDIE(TheCU, Scope);
Devang Patel5bc9fec2011-02-19 01:31:27 +0000496 }
497
Devang Patelaead63c2010-03-29 22:59:58 +0000498 if (!ScopeDIE) return NULL;
Jim Grosbach1e20b962010-07-21 21:21:52 +0000499
Devang Patel5bc9fec2011-02-19 01:31:27 +0000500 // Add children
501 for (SmallVector<DIE *, 8>::iterator I = Children.begin(),
502 E = Children.end(); I != E; ++I)
503 ScopeDIE->addChild(*I);
Devang Patel193f7202009-11-24 01:14:22 +0000504
Jim Grosbach1e20b962010-07-21 21:21:52 +0000505 if (DS.isSubprogram())
Eric Christopher0ffe2b42011-11-10 19:25:34 +0000506 TheCU->addPubTypes(DISubprogram(DS));
Jim Grosbach1e20b962010-07-21 21:21:52 +0000507
Eric Christopher0ffe2b42011-11-10 19:25:34 +0000508 return ScopeDIE;
Devang Patel53bb5c92009-11-10 23:06:00 +0000509}
510
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000511/// GetOrCreateSourceID - Look up the source id with the given directory and
512/// source file names. If none currently exists, create a new id and insert it
513/// in the SourceIds map. This can update DirectoryNames and SourceFileNames
514/// maps as well.
Devang Patel23670e52011-03-24 20:30:50 +0000515unsigned DwarfDebug::GetOrCreateSourceID(StringRef FileName,
516 StringRef DirName) {
Devang Patel1905a182010-09-16 20:57:49 +0000517 // If FE did not provide a file name, then assume stdin.
518 if (FileName.empty())
Devang Patel23670e52011-03-24 20:30:50 +0000519 return GetOrCreateSourceID("<stdin>", StringRef());
520
Nick Lewycky6c1a7032011-11-02 20:55:33 +0000521 // TODO: this might not belong here. See if we can factor this better.
522 if (DirName == CompilationDir)
523 DirName = "";
524
Nick Lewycky44d798d2011-10-17 23:05:28 +0000525 unsigned SrcId = SourceIdMap.size()+1;
526 std::pair<std::string, std::string> SourceName =
527 std::make_pair(FileName, DirName);
528 std::pair<std::pair<std::string, std::string>, unsigned> Entry =
529 make_pair(SourceName, SrcId);
Devang Patel1905a182010-09-16 20:57:49 +0000530
Nick Lewycky44d798d2011-10-17 23:05:28 +0000531 std::map<std::pair<std::string, std::string>, unsigned>::iterator I;
532 bool NewlyInserted;
Michael J. Spencer647c0ce2012-03-01 22:42:52 +0000533 llvm::tie(I, NewlyInserted) = SourceIdMap.insert(Entry);
Nick Lewycky44d798d2011-10-17 23:05:28 +0000534 if (!NewlyInserted)
535 return I->second;
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000536
Rafael Espindola5c055632010-11-18 02:04:25 +0000537 // Print out a .file directive to specify files for .loc directives.
Nick Lewycky44d798d2011-10-17 23:05:28 +0000538 Asm->OutStreamer.EmitDwarfFileDirective(SrcId, Entry.first.second,
539 Entry.first.first);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000540
541 return SrcId;
542}
543
Jim Grosbach1e20b962010-07-21 21:21:52 +0000544/// constructCompileUnit - Create new CompileUnit for the given
Devang Patel163a9f72010-05-10 22:49:55 +0000545/// metadata node with tag DW_TAG_compile_unit.
Devang Patel94c7ddb2011-08-16 22:09:43 +0000546CompileUnit *DwarfDebug::constructCompileUnit(const MDNode *N) {
Devang Patele4b27562009-08-28 23:24:31 +0000547 DICompileUnit DIUnit(N);
Devang Patel65dbc902009-11-25 17:36:49 +0000548 StringRef FN = DIUnit.getFilename();
Nick Lewycky6c1a7032011-11-02 20:55:33 +0000549 CompilationDir = DIUnit.getDirectory();
550 unsigned ID = GetOrCreateSourceID(FN, CompilationDir);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000551
552 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
Eric Christopher438b0922012-02-22 08:46:13 +0000553 CompileUnit *NewCU = new CompileUnit(ID, DIUnit.getLanguage(), Die, Asm, this);
Nick Lewycky390c40d2011-10-27 06:44:11 +0000554 NewCU->addString(Die, dwarf::DW_AT_producer, DIUnit.getProducer());
Devang Patel3cbee302011-04-12 22:53:02 +0000555 NewCU->addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data2,
556 DIUnit.getLanguage());
Nick Lewycky390c40d2011-10-27 06:44:11 +0000557 NewCU->addString(Die, dwarf::DW_AT_name, FN);
Devang Patel5098da02010-04-26 22:54:28 +0000558 // Use DW_AT_entry_pc instead of DW_AT_low_pc/DW_AT_high_pc pair. This
559 // simplifies debug range entries.
Devang Patel3cbee302011-04-12 22:53:02 +0000560 NewCU->addUInt(Die, dwarf::DW_AT_entry_pc, dwarf::DW_FORM_addr, 0);
Devang Patel4a602ca2010-03-22 23:11:36 +0000561 // DW_AT_stmt_list is a offset of line number information for this
Devang Patelaf608bd2010-08-24 00:06:12 +0000562 // compile unit in debug_line section.
Nick Lewyckyd5d52132011-10-17 23:27:36 +0000563 if (Asm->MAI->doesDwarfRequireRelocationForSectionOffset())
Rafael Espindola597a7662011-05-04 17:44:06 +0000564 NewCU->addLabel(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4,
Devang Patel3cbee302011-04-12 22:53:02 +0000565 Asm->GetTempSymbol("section_line"));
Devang Patelae84d5b2010-08-31 23:50:19 +0000566 else
Devang Patel3cbee302011-04-12 22:53:02 +0000567 NewCU->addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4, 0);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000568
Nick Lewycky6c1a7032011-11-02 20:55:33 +0000569 if (!CompilationDir.empty())
570 NewCU->addString(Die, dwarf::DW_AT_comp_dir, CompilationDir);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000571 if (DIUnit.isOptimized())
Devang Patel3cbee302011-04-12 22:53:02 +0000572 NewCU->addUInt(Die, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000573
Devang Patel65dbc902009-11-25 17:36:49 +0000574 StringRef Flags = DIUnit.getFlags();
575 if (!Flags.empty())
Nick Lewycky390c40d2011-10-27 06:44:11 +0000576 NewCU->addString(Die, dwarf::DW_AT_APPLE_flags, Flags);
Devang Patel3cbee302011-04-12 22:53:02 +0000577
Nick Lewyckyd5d52132011-10-17 23:27:36 +0000578 if (unsigned RVer = DIUnit.getRunTimeVersion())
Devang Patel3cbee302011-04-12 22:53:02 +0000579 NewCU->addUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers,
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000580 dwarf::DW_FORM_data1, RVer);
581
Devang Patel163a9f72010-05-10 22:49:55 +0000582 if (!FirstCU)
583 FirstCU = NewCU;
584 CUMap.insert(std::make_pair(N, NewCU));
Devang Patel94c7ddb2011-08-16 22:09:43 +0000585 return NewCU;
Devang Patel163a9f72010-05-10 22:49:55 +0000586}
587
Devang Patel163a9f72010-05-10 22:49:55 +0000588/// construct SubprogramDIE - Construct subprogram DIE.
Devang Patel3655a212011-08-15 23:36:40 +0000589void DwarfDebug::constructSubprogramDIE(CompileUnit *TheCU,
590 const MDNode *N) {
Rafael Espindolab0527282011-11-04 19:00:29 +0000591 CompileUnit *&CURef = SPMap[N];
592 if (CURef)
593 return;
594 CURef = TheCU;
595
Devang Patele4b27562009-08-28 23:24:31 +0000596 DISubprogram SP(N);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000597 if (!SP.isDefinition())
598 // This is a method declaration which will be handled while constructing
599 // class type.
Devang Patel13e16b62009-06-26 01:49:18 +0000600 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000601
Devang Pateldbc64af2011-08-15 17:24:54 +0000602 DIE *SubprogramDie = TheCU->getOrCreateSubprogramDIE(SP);
Stuart Hastings639336e2010-04-06 21:38:29 +0000603
604 // Add to map.
Devang Patel163a9f72010-05-10 22:49:55 +0000605 TheCU->insertDIE(N, SubprogramDie);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000606
607 // Add to context owner.
Devang Patel3cbee302011-04-12 22:53:02 +0000608 TheCU->addToContextOwner(SubprogramDie, SP.getContext());
Devang Patel0000fad2009-12-08 23:21:45 +0000609
Devang Patel13e16b62009-06-26 01:49:18 +0000610 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000611}
612
Devang Patel02e603f2011-08-15 23:47:24 +0000613/// collectInfoFromNamedMDNodes - Collect debug info from named mdnodes such
614/// as llvm.dbg.enum and llvm.dbg.ty
615void DwarfDebug::collectInfoFromNamedMDNodes(Module *M) {
Devang Patel94c7ddb2011-08-16 22:09:43 +0000616 if (NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.sp"))
617 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
618 const MDNode *N = NMD->getOperand(i);
619 if (CompileUnit *CU = CUMap.lookup(DISubprogram(N).getCompileUnit()))
620 constructSubprogramDIE(CU, N);
621 }
622
623 if (NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.gv"))
624 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
625 const MDNode *N = NMD->getOperand(i);
626 if (CompileUnit *CU = CUMap.lookup(DIGlobalVariable(N).getCompileUnit()))
Devang Patel28bea082011-08-18 23:17:55 +0000627 CU->createGlobalVariableDIE(N);
Devang Patel94c7ddb2011-08-16 22:09:43 +0000628 }
629
Devang Patel02e603f2011-08-15 23:47:24 +0000630 if (NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.enum"))
631 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
632 DIType Ty(NMD->getOperand(i));
Devang Patel94c7ddb2011-08-16 22:09:43 +0000633 if (CompileUnit *CU = CUMap.lookup(Ty.getCompileUnit()))
634 CU->getOrCreateTypeDIE(Ty);
Devang Patel02e603f2011-08-15 23:47:24 +0000635 }
636
637 if (NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.ty"))
638 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
639 DIType Ty(NMD->getOperand(i));
Devang Patel94c7ddb2011-08-16 22:09:43 +0000640 if (CompileUnit *CU = CUMap.lookup(Ty.getCompileUnit()))
641 CU->getOrCreateTypeDIE(Ty);
Devang Patel02e603f2011-08-15 23:47:24 +0000642 }
643}
644
645/// collectLegacyDebugInfo - Collect debug info using DebugInfoFinder.
646/// FIXME - Remove this when dragon-egg and llvm-gcc switch to DIBuilder.
647bool DwarfDebug::collectLegacyDebugInfo(Module *M) {
648 DebugInfoFinder DbgFinder;
649 DbgFinder.processModule(*M);
650
651 bool HasDebugInfo = false;
652 // Scan all the compile-units to see if there are any marked as the main
653 // unit. If not, we do not generate debug info.
654 for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
655 E = DbgFinder.compile_unit_end(); I != E; ++I) {
656 if (DICompileUnit(*I).isMain()) {
657 HasDebugInfo = true;
658 break;
659 }
660 }
661 if (!HasDebugInfo) return false;
662
663 // Create all the compile unit DIEs.
664 for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
665 E = DbgFinder.compile_unit_end(); I != E; ++I)
666 constructCompileUnit(*I);
667
668 // Create DIEs for each global variable.
669 for (DebugInfoFinder::iterator I = DbgFinder.global_variable_begin(),
670 E = DbgFinder.global_variable_end(); I != E; ++I) {
671 const MDNode *N = *I;
Devang Patel94c7ddb2011-08-16 22:09:43 +0000672 if (CompileUnit *CU = CUMap.lookup(DIGlobalVariable(N).getCompileUnit()))
Devang Patel28bea082011-08-18 23:17:55 +0000673 CU->createGlobalVariableDIE(N);
Devang Patel02e603f2011-08-15 23:47:24 +0000674 }
Devang Patel94c7ddb2011-08-16 22:09:43 +0000675
Devang Patel02e603f2011-08-15 23:47:24 +0000676 // Create DIEs for each subprogram.
677 for (DebugInfoFinder::iterator I = DbgFinder.subprogram_begin(),
678 E = DbgFinder.subprogram_end(); I != E; ++I) {
679 const MDNode *N = *I;
Devang Patel94c7ddb2011-08-16 22:09:43 +0000680 if (CompileUnit *CU = CUMap.lookup(DISubprogram(N).getCompileUnit()))
681 constructSubprogramDIE(CU, N);
Devang Patel02e603f2011-08-15 23:47:24 +0000682 }
683
684 return HasDebugInfo;
685}
686
Devang Patel2c4ceb12009-11-21 02:48:08 +0000687/// beginModule - Emit all Dwarf sections that should come prior to the
Daniel Dunbar00564992009-09-19 20:40:14 +0000688/// content. Create global DIEs and emit initial debug info sections.
Nick Lewycky3bbb6f72011-07-29 03:49:23 +0000689/// This is invoked by the target AsmPrinter.
Chris Lattner75f50722010-04-04 07:48:20 +0000690void DwarfDebug::beginModule(Module *M) {
Devang Pateleac9c072010-04-27 19:46:33 +0000691 if (DisableDebugInfoPrinting)
692 return;
693
Nick Lewycky3bbb6f72011-07-29 03:49:23 +0000694 // If module has named metadata anchors then use them, otherwise scan the
695 // module using debug info finder to collect debug info.
Devang Patel30692ab2011-05-03 16:45:22 +0000696 NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu");
697 if (CU_Nodes) {
Devang Patel94c7ddb2011-08-16 22:09:43 +0000698 for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i) {
699 DICompileUnit CUNode(CU_Nodes->getOperand(i));
700 CompileUnit *CU = constructCompileUnit(CUNode);
701 DIArray GVs = CUNode.getGlobalVariables();
702 for (unsigned i = 0, e = GVs.getNumElements(); i != e; ++i)
Devang Patel28bea082011-08-18 23:17:55 +0000703 CU->createGlobalVariableDIE(GVs.getElement(i));
Devang Patel94c7ddb2011-08-16 22:09:43 +0000704 DIArray SPs = CUNode.getSubprograms();
705 for (unsigned i = 0, e = SPs.getNumElements(); i != e; ++i)
706 constructSubprogramDIE(CU, SPs.getElement(i));
707 DIArray EnumTypes = CUNode.getEnumTypes();
708 for (unsigned i = 0, e = EnumTypes.getNumElements(); i != e; ++i)
709 CU->getOrCreateTypeDIE(EnumTypes.getElement(i));
710 DIArray RetainedTypes = CUNode.getRetainedTypes();
711 for (unsigned i = 0, e = RetainedTypes.getNumElements(); i != e; ++i)
712 CU->getOrCreateTypeDIE(RetainedTypes.getElement(i));
713 }
Devang Patel02e603f2011-08-15 23:47:24 +0000714 } else if (!collectLegacyDebugInfo(M))
715 return;
Devang Patel30692ab2011-05-03 16:45:22 +0000716
Devang Patel02e603f2011-08-15 23:47:24 +0000717 collectInfoFromNamedMDNodes(M);
Devang Patel30692ab2011-05-03 16:45:22 +0000718
Chris Lattnerd850ac72010-04-05 02:19:28 +0000719 // Tell MMI that we have debug info.
720 MMI->setDebugInfoAvailability(true);
Devang Patel30692ab2011-05-03 16:45:22 +0000721
Chris Lattnerbe15beb2010-04-04 23:17:54 +0000722 // Emit initial sections.
Chris Lattnerd850ac72010-04-05 02:19:28 +0000723 EmitSectionLabels();
Jim Grosbach1e20b962010-07-21 21:21:52 +0000724
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000725 // Prime section data.
Chris Lattnerf0144122009-07-28 03:13:23 +0000726 SectionMap.insert(Asm->getObjFileLowering().getTextSection());
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000727}
728
Devang Patel2c4ceb12009-11-21 02:48:08 +0000729/// endModule - Emit all Dwarf sections that should come after the content.
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000730///
Devang Patel2c4ceb12009-11-21 02:48:08 +0000731void DwarfDebug::endModule() {
Devang Patel163a9f72010-05-10 22:49:55 +0000732 if (!FirstCU) return;
Devang Patel4a1cad62010-06-28 18:25:03 +0000733 const Module *M = MMI->getModule();
Devang Patelbf47fdb2011-08-10 20:55:27 +0000734 DenseMap<const MDNode *, LexicalScope *> DeadFnScopeMap;
Devang Patel4a1cad62010-06-28 18:25:03 +0000735
Devang Patel94c7ddb2011-08-16 22:09:43 +0000736 // Collect info for variables that were optimized out.
737 if (NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu")) {
738 for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i) {
739 DICompileUnit TheCU(CU_Nodes->getOperand(i));
740 DIArray Subprograms = TheCU.getSubprograms();
741 for (unsigned i = 0, e = Subprograms.getNumElements(); i != e; ++i) {
742 DISubprogram SP(Subprograms.getElement(i));
743 if (ProcessedSPNodes.count(SP) != 0) continue;
744 if (!SP.Verify()) continue;
745 if (!SP.isDefinition()) continue;
Devang Patel93d39be2011-08-19 23:28:12 +0000746 DIArray Variables = SP.getVariables();
747 if (Variables.getNumElements() == 0) continue;
748
Devang Patel94c7ddb2011-08-16 22:09:43 +0000749 LexicalScope *Scope =
750 new LexicalScope(NULL, DIDescriptor(SP), NULL, false);
751 DeadFnScopeMap[SP] = Scope;
752
753 // Construct subprogram DIE and add variables DIEs.
Devang Patel94c7ddb2011-08-16 22:09:43 +0000754 CompileUnit *SPCU = CUMap.lookup(TheCU);
Nick Lewycky746cb672011-10-26 22:55:33 +0000755 assert(SPCU && "Unable to find Compile Unit!");
Devang Patel94c7ddb2011-08-16 22:09:43 +0000756 constructSubprogramDIE(SPCU, SP);
757 DIE *ScopeDIE = SPCU->getDIE(SP);
Devang Patel93d39be2011-08-19 23:28:12 +0000758 for (unsigned vi = 0, ve = Variables.getNumElements(); vi != ve; ++vi) {
759 DIVariable DV(Variables.getElement(vi));
760 if (!DV.Verify()) continue;
761 DbgVariable *NewVar = new DbgVariable(DV, NULL);
Devang Patel94c7ddb2011-08-16 22:09:43 +0000762 if (DIE *VariableDIE =
Devang Patel93d39be2011-08-19 23:28:12 +0000763 SPCU->constructVariableDIE(NewVar, Scope->isAbstractScope()))
Devang Patel94c7ddb2011-08-16 22:09:43 +0000764 ScopeDIE->addChild(VariableDIE);
765 }
Devang Patel4a1cad62010-06-28 18:25:03 +0000766 }
767 }
768 }
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000769
Devang Patel53bb5c92009-11-10 23:06:00 +0000770 // Attach DW_AT_inline attribute with inlined subprogram DIEs.
771 for (SmallPtrSet<DIE *, 4>::iterator AI = InlinedSubprogramDIEs.begin(),
772 AE = InlinedSubprogramDIEs.end(); AI != AE; ++AI) {
773 DIE *ISP = *AI;
Devang Patel3cbee302011-04-12 22:53:02 +0000774 FirstCU->addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
Devang Patel53bb5c92009-11-10 23:06:00 +0000775 }
Rafael Espindolad1ac3a42011-11-12 01:57:54 +0000776 for (DenseMap<const MDNode *, DIE *>::iterator AI = AbstractSPDies.begin(),
777 AE = AbstractSPDies.end(); AI != AE; ++AI) {
778 DIE *ISP = AI->second;
779 if (InlinedSubprogramDIEs.count(ISP))
780 continue;
781 FirstCU->addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
782 }
Devang Patel53bb5c92009-11-10 23:06:00 +0000783
Devang Pateldbc64af2011-08-15 17:24:54 +0000784 // Emit DW_AT_containing_type attribute to connect types with their
785 // vtable holding type.
786 for (DenseMap<const MDNode *, CompileUnit *>::iterator CUI = CUMap.begin(),
787 CUE = CUMap.end(); CUI != CUE; ++CUI) {
788 CompileUnit *TheCU = CUI->second;
789 TheCU->constructContainingTypeDIEs();
Devang Patel5d11eb02009-12-03 19:11:07 +0000790 }
791
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000792 // Standard sections final addresses.
Chris Lattner6c2f9e12009-08-19 05:49:37 +0000793 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getTextSection());
Chris Lattnerc0215722010-04-04 19:25:43 +0000794 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("text_end"));
Chris Lattner6c2f9e12009-08-19 05:49:37 +0000795 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getDataSection());
Chris Lattnerc0215722010-04-04 19:25:43 +0000796 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("data_end"));
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000797
798 // End text sections.
799 for (unsigned i = 1, N = SectionMap.size(); i <= N; ++i) {
Chris Lattner6c2f9e12009-08-19 05:49:37 +0000800 Asm->OutStreamer.SwitchSection(SectionMap[i]);
Chris Lattnerc0215722010-04-04 19:25:43 +0000801 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("section_end", i));
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000802 }
803
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000804 // Compute DIE offsets and sizes.
Devang Patel2c4ceb12009-11-21 02:48:08 +0000805 computeSizeAndOffsets();
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000806
807 // Emit all the DIEs into a debug info section
Devang Patel2c4ceb12009-11-21 02:48:08 +0000808 emitDebugInfo();
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000809
810 // Corresponding abbreviations into a abbrev section.
Devang Patel2c4ceb12009-11-21 02:48:08 +0000811 emitAbbreviations();
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000812
Eric Christopher09ac3d82011-11-07 09:24:32 +0000813 // Emit info into a dwarf accelerator table sections.
814 if (DwarfAccelTables) {
815 emitAccelNames();
816 emitAccelObjC();
817 emitAccelNamespaces();
818 emitAccelTypes();
819 }
820
Devang Patel193f7202009-11-24 01:14:22 +0000821 // Emit info into a debug pubtypes section.
822 emitDebugPubTypes();
823
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000824 // Emit info into a debug loc section.
Devang Patel2c4ceb12009-11-21 02:48:08 +0000825 emitDebugLoc();
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000826
827 // Emit info into a debug aranges section.
828 EmitDebugARanges();
829
830 // Emit info into a debug ranges section.
Devang Patel2c4ceb12009-11-21 02:48:08 +0000831 emitDebugRanges();
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000832
833 // Emit info into a debug macinfo section.
Devang Patel2c4ceb12009-11-21 02:48:08 +0000834 emitDebugMacInfo();
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000835
836 // Emit inline info.
Devang Patel2c4ceb12009-11-21 02:48:08 +0000837 emitDebugInlineInfo();
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000838
Eric Christopher7550f7d2012-03-02 00:30:24 +0000839 // Emit info into a debug str section.
840 emitDebugStr();
841
Devang Patele9a1cca2010-08-02 17:32:15 +0000842 // clean up.
843 DeleteContainerSeconds(DeadFnScopeMap);
Devang Patel94c7ddb2011-08-16 22:09:43 +0000844 SPMap.clear();
Devang Patel163a9f72010-05-10 22:49:55 +0000845 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
846 E = CUMap.end(); I != E; ++I)
847 delete I->second;
848 FirstCU = NULL; // Reset for the next Module, if any.
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000849}
850
Devang Patel53bb5c92009-11-10 23:06:00 +0000851/// findAbstractVariable - Find abstract variable, if any, associated with Var.
Devang Patelb549bcf2011-08-10 21:50:54 +0000852DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &DV,
Chris Lattnerde4845c2010-04-02 19:42:39 +0000853 DebugLoc ScopeLoc) {
Devang Patelb549bcf2011-08-10 21:50:54 +0000854 LLVMContext &Ctx = DV->getContext();
855 // More then one inlined variable corresponds to one abstract variable.
856 DIVariable Var = cleanseInlinedVariable(DV, Ctx);
Devang Patel2db49d72010-05-07 18:11:54 +0000857 DbgVariable *AbsDbgVariable = AbstractVariables.lookup(Var);
Devang Patel53bb5c92009-11-10 23:06:00 +0000858 if (AbsDbgVariable)
859 return AbsDbgVariable;
860
Devang Patelbf47fdb2011-08-10 20:55:27 +0000861 LexicalScope *Scope = LScopes.findAbstractScope(ScopeLoc.getScope(Ctx));
Devang Patel53bb5c92009-11-10 23:06:00 +0000862 if (!Scope)
863 return NULL;
864
Devang Patel5a1a67c2011-08-15 19:01:20 +0000865 AbsDbgVariable = new DbgVariable(Var, NULL);
Devang Patelbf47fdb2011-08-10 20:55:27 +0000866 addScopeVariable(Scope, AbsDbgVariable);
Devang Patel2db49d72010-05-07 18:11:54 +0000867 AbstractVariables[Var] = AbsDbgVariable;
Devang Patel53bb5c92009-11-10 23:06:00 +0000868 return AbsDbgVariable;
869}
870
Nick Lewycky3bbb6f72011-07-29 03:49:23 +0000871/// addCurrentFnArgument - If Var is a current function argument then add
872/// it to CurrentFnArguments list.
Devang Patel0478c152011-03-01 22:58:55 +0000873bool DwarfDebug::addCurrentFnArgument(const MachineFunction *MF,
Devang Patelbf47fdb2011-08-10 20:55:27 +0000874 DbgVariable *Var, LexicalScope *Scope) {
875 if (!LScopes.isCurrentFunctionScope(Scope))
Devang Patel0478c152011-03-01 22:58:55 +0000876 return false;
877 DIVariable DV = Var->getVariable();
878 if (DV.getTag() != dwarf::DW_TAG_arg_variable)
879 return false;
880 unsigned ArgNo = DV.getArgNumber();
881 if (ArgNo == 0)
882 return false;
883
Devang Patelcb3a6572011-03-03 20:02:02 +0000884 size_t Size = CurrentFnArguments.size();
885 if (Size == 0)
Devang Patel0478c152011-03-01 22:58:55 +0000886 CurrentFnArguments.resize(MF->getFunction()->arg_size());
Devang Patelbbd0f452011-03-03 21:49:41 +0000887 // llvm::Function argument size is not good indicator of how many
Devang Patel6f676be2011-03-03 20:08:10 +0000888 // arguments does the function have at source level.
889 if (ArgNo > Size)
Devang Patelcb3a6572011-03-03 20:02:02 +0000890 CurrentFnArguments.resize(ArgNo * 2);
Devang Patel0478c152011-03-01 22:58:55 +0000891 CurrentFnArguments[ArgNo - 1] = Var;
892 return true;
893}
894
Devang Patelee432862010-05-20 19:57:06 +0000895/// collectVariableInfoFromMMITable - Collect variable information from
896/// side table maintained by MMI.
Jim Grosbach1e20b962010-07-21 21:21:52 +0000897void
Nick Lewycky3bbb6f72011-07-29 03:49:23 +0000898DwarfDebug::collectVariableInfoFromMMITable(const MachineFunction *MF,
Devang Patelee432862010-05-20 19:57:06 +0000899 SmallPtrSet<const MDNode *, 16> &Processed) {
Devang Patele717faa2009-10-06 01:26:37 +0000900 MachineModuleInfo::VariableDbgInfoMapTy &VMap = MMI->getVariableDbgInfo();
901 for (MachineModuleInfo::VariableDbgInfoMapTy::iterator VI = VMap.begin(),
902 VE = VMap.end(); VI != VE; ++VI) {
Devang Patele9f8f5e2010-05-07 20:54:48 +0000903 const MDNode *Var = VI->first;
Devang Patel53bb5c92009-11-10 23:06:00 +0000904 if (!Var) continue;
Devang Patel98e1cac2010-05-14 21:01:35 +0000905 Processed.insert(Var);
Chris Lattnerde4845c2010-04-02 19:42:39 +0000906 DIVariable DV(Var);
907 const std::pair<unsigned, DebugLoc> &VP = VI->second;
Devang Patel53bb5c92009-11-10 23:06:00 +0000908
Devang Patelbf47fdb2011-08-10 20:55:27 +0000909 LexicalScope *Scope = LScopes.findLexicalScope(VP.second);
Jim Grosbach1e20b962010-07-21 21:21:52 +0000910
Devang Patelfb0ee432009-11-10 23:20:04 +0000911 // If variable scope is not found then skip this variable.
Chris Lattnerde4845c2010-04-02 19:42:39 +0000912 if (Scope == 0)
Devang Patelfb0ee432009-11-10 23:20:04 +0000913 continue;
Devang Patel53bb5c92009-11-10 23:06:00 +0000914
Devang Patel26c1e562010-05-20 16:36:41 +0000915 DbgVariable *AbsDbgVariable = findAbstractVariable(DV, VP.second);
Devang Patel5a1a67c2011-08-15 19:01:20 +0000916 DbgVariable *RegVar = new DbgVariable(DV, AbsDbgVariable);
Devang Patelff9dd0a2011-08-15 21:24:36 +0000917 RegVar->setFrameIndex(VP.first);
Devang Patel0478c152011-03-01 22:58:55 +0000918 if (!addCurrentFnArgument(MF, RegVar, Scope))
Devang Patelbf47fdb2011-08-10 20:55:27 +0000919 addScopeVariable(Scope, RegVar);
Devang Patel5a1a67c2011-08-15 19:01:20 +0000920 if (AbsDbgVariable)
Devang Patelff9dd0a2011-08-15 21:24:36 +0000921 AbsDbgVariable->setFrameIndex(VP.first);
Devang Patele717faa2009-10-06 01:26:37 +0000922 }
Devang Patelee432862010-05-20 19:57:06 +0000923}
Devang Patel90a48ad2010-03-15 18:33:46 +0000924
Jim Grosbach1e20b962010-07-21 21:21:52 +0000925/// isDbgValueInDefinedReg - Return true if debug value, encoded by
Devang Patelc3f5f782010-05-25 23:40:22 +0000926/// DBG_VALUE instruction, is in a defined reg.
927static bool isDbgValueInDefinedReg(const MachineInstr *MI) {
Nick Lewycky746cb672011-10-26 22:55:33 +0000928 assert(MI->isDebugValue() && "Invalid DBG_VALUE machine instruction!");
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +0000929 return MI->getNumOperands() == 3 &&
930 MI->getOperand(0).isReg() && MI->getOperand(0).getReg() &&
931 MI->getOperand(1).isImm() && MI->getOperand(1).getImm() == 0;
Devang Patelc3f5f782010-05-25 23:40:22 +0000932}
933
Nick Lewycky3bbb6f72011-07-29 03:49:23 +0000934/// getDebugLocEntry - Get .debug_loc entry for the instruction range starting
Devang Patel90b40412011-07-08 17:09:57 +0000935/// at MI.
936static DotDebugLocEntry getDebugLocEntry(AsmPrinter *Asm,
937 const MCSymbol *FLabel,
938 const MCSymbol *SLabel,
939 const MachineInstr *MI) {
940 const MDNode *Var = MI->getOperand(MI->getNumOperands() - 1).getMetadata();
941
942 if (MI->getNumOperands() != 3) {
943 MachineLocation MLoc = Asm->getDebugValueLocation(MI);
944 return DotDebugLocEntry(FLabel, SLabel, MLoc, Var);
945 }
946 if (MI->getOperand(0).isReg() && MI->getOperand(1).isImm()) {
947 MachineLocation MLoc;
948 MLoc.set(MI->getOperand(0).getReg(), MI->getOperand(1).getImm());
949 return DotDebugLocEntry(FLabel, SLabel, MLoc, Var);
950 }
951 if (MI->getOperand(0).isImm())
952 return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getImm());
953 if (MI->getOperand(0).isFPImm())
954 return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getFPImm());
955 if (MI->getOperand(0).isCImm())
956 return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getCImm());
957
Craig Topper5e25ee82012-02-05 08:31:47 +0000958 llvm_unreachable("Unexpected 3 operand DBG_VALUE instruction!");
Devang Patel90b40412011-07-08 17:09:57 +0000959}
960
Devang Patelbf47fdb2011-08-10 20:55:27 +0000961/// collectVariableInfo - Find variables for each lexical scope.
Jim Grosbach1e20b962010-07-21 21:21:52 +0000962void
Devang Patel78e127d2010-06-25 22:07:34 +0000963DwarfDebug::collectVariableInfo(const MachineFunction *MF,
964 SmallPtrSet<const MDNode *, 16> &Processed) {
Jim Grosbach1e20b962010-07-21 21:21:52 +0000965
Devang Patelee432862010-05-20 19:57:06 +0000966 /// collection info from MMI table.
967 collectVariableInfoFromMMITable(MF, Processed);
968
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +0000969 for (SmallVectorImpl<const MDNode*>::const_iterator
970 UVI = UserVariables.begin(), UVE = UserVariables.end(); UVI != UVE;
971 ++UVI) {
972 const MDNode *Var = *UVI;
973 if (Processed.count(Var))
Devang Patelee432862010-05-20 19:57:06 +0000974 continue;
975
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +0000976 // History contains relevant DBG_VALUE instructions for Var and instructions
977 // clobbering it.
978 SmallVectorImpl<const MachineInstr*> &History = DbgValues[Var];
979 if (History.empty())
980 continue;
981 const MachineInstr *MInsn = History.front();
Devang Patelc3f5f782010-05-25 23:40:22 +0000982
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +0000983 DIVariable DV(Var);
Devang Patelbf47fdb2011-08-10 20:55:27 +0000984 LexicalScope *Scope = NULL;
Devang Pateld8720f42010-05-27 20:25:04 +0000985 if (DV.getTag() == dwarf::DW_TAG_arg_variable &&
986 DISubprogram(DV.getContext()).describes(MF->getFunction()))
Devang Patelbf47fdb2011-08-10 20:55:27 +0000987 Scope = LScopes.getCurrentFunctionScope();
Devang Patel40c7e412011-07-20 22:18:50 +0000988 else {
989 if (DV.getVersion() <= LLVMDebugVersion9)
Devang Patelbf47fdb2011-08-10 20:55:27 +0000990 Scope = LScopes.findLexicalScope(MInsn->getDebugLoc());
Devang Patel40c7e412011-07-20 22:18:50 +0000991 else {
992 if (MDNode *IA = DV.getInlinedAt())
Devang Patelbf47fdb2011-08-10 20:55:27 +0000993 Scope = LScopes.findInlinedScope(DebugLoc::getFromDILocation(IA));
Devang Patel40c7e412011-07-20 22:18:50 +0000994 else
Devang Patelbf47fdb2011-08-10 20:55:27 +0000995 Scope = LScopes.findLexicalScope(cast<MDNode>(DV->getOperand(1)));
Devang Patel40c7e412011-07-20 22:18:50 +0000996 }
997 }
Devang Patelee432862010-05-20 19:57:06 +0000998 // If variable scope is not found then skip this variable.
Devang Patelc0c5a262010-05-21 00:10:20 +0000999 if (!Scope)
Devang Patelee432862010-05-20 19:57:06 +00001000 continue;
1001
1002 Processed.insert(DV);
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001003 assert(MInsn->isDebugValue() && "History must begin with debug value");
Devang Patel5a1a67c2011-08-15 19:01:20 +00001004 DbgVariable *AbsVar = findAbstractVariable(DV, MInsn->getDebugLoc());
1005 DbgVariable *RegVar = new DbgVariable(DV, AbsVar);
Devang Patel0478c152011-03-01 22:58:55 +00001006 if (!addCurrentFnArgument(MF, RegVar, Scope))
Devang Patelbf47fdb2011-08-10 20:55:27 +00001007 addScopeVariable(Scope, RegVar);
Devang Patel5a1a67c2011-08-15 19:01:20 +00001008 if (AbsVar)
Devang Patelff9dd0a2011-08-15 21:24:36 +00001009 AbsVar->setMInsn(MInsn);
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001010
1011 // Simple ranges that are fully coalesced.
1012 if (History.size() <= 1 || (History.size() == 2 &&
1013 MInsn->isIdenticalTo(History.back()))) {
Devang Patelff9dd0a2011-08-15 21:24:36 +00001014 RegVar->setMInsn(MInsn);
Devang Patelc3f5f782010-05-25 23:40:22 +00001015 continue;
1016 }
1017
1018 // handle multiple DBG_VALUE instructions describing one variable.
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001019 RegVar->setDotDebugLocOffset(DotDebugLocEntries.size());
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001020
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001021 for (SmallVectorImpl<const MachineInstr*>::const_iterator
1022 HI = History.begin(), HE = History.end(); HI != HE; ++HI) {
1023 const MachineInstr *Begin = *HI;
1024 assert(Begin->isDebugValue() && "Invalid History entry");
Jakob Stoklund Olesene17232e2011-03-22 00:21:41 +00001025
Devang Patel4ada1d72011-06-01 23:00:17 +00001026 // Check if DBG_VALUE is truncating a range.
1027 if (Begin->getNumOperands() > 1 && Begin->getOperand(0).isReg()
1028 && !Begin->getOperand(0).getReg())
1029 continue;
1030
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001031 // Compute the range for a register location.
1032 const MCSymbol *FLabel = getLabelBeforeInsn(Begin);
1033 const MCSymbol *SLabel = 0;
1034
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001035 if (HI + 1 == HE)
1036 // If Begin is the last instruction in History then its value is valid
Chris Lattner7a2bdde2011-04-15 05:18:47 +00001037 // until the end of the function.
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001038 SLabel = FunctionEndSym;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001039 else {
1040 const MachineInstr *End = HI[1];
Devang Patel476df5f2011-07-07 21:44:42 +00001041 DEBUG(dbgs() << "DotDebugLoc Pair:\n"
1042 << "\t" << *Begin << "\t" << *End << "\n");
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001043 if (End->isDebugValue())
1044 SLabel = getLabelBeforeInsn(End);
1045 else {
1046 // End is a normal instruction clobbering the range.
1047 SLabel = getLabelAfterInsn(End);
1048 assert(SLabel && "Forgot label after clobber instruction");
1049 ++HI;
1050 }
1051 }
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001052
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001053 // The value is valid until the next DBG_VALUE or clobber.
Eric Christopherabbb2002011-12-16 23:42:31 +00001054 DotDebugLocEntries.push_back(getDebugLocEntry(Asm, FLabel, SLabel,
1055 Begin));
Devang Patelc3f5f782010-05-25 23:40:22 +00001056 }
1057 DotDebugLocEntries.push_back(DotDebugLocEntry());
Devang Patel90a48ad2010-03-15 18:33:46 +00001058 }
Devang Patel98e1cac2010-05-14 21:01:35 +00001059
1060 // Collect info for variables that were optimized out.
Devang Patel93d39be2011-08-19 23:28:12 +00001061 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
1062 DIArray Variables = DISubprogram(FnScope->getScopeNode()).getVariables();
1063 for (unsigned i = 0, e = Variables.getNumElements(); i != e; ++i) {
1064 DIVariable DV(Variables.getElement(i));
1065 if (!DV || !DV.Verify() || !Processed.insert(DV))
1066 continue;
1067 if (LexicalScope *Scope = LScopes.findLexicalScope(DV.getContext()))
1068 addScopeVariable(Scope, new DbgVariable(DV, NULL));
Devang Patel98e1cac2010-05-14 21:01:35 +00001069 }
Devang Patelc3f5f782010-05-25 23:40:22 +00001070}
Devang Patel98e1cac2010-05-14 21:01:35 +00001071
Devang Patelc3f5f782010-05-25 23:40:22 +00001072/// getLabelBeforeInsn - Return Label preceding the instruction.
1073const MCSymbol *DwarfDebug::getLabelBeforeInsn(const MachineInstr *MI) {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001074 MCSymbol *Label = LabelsBeforeInsn.lookup(MI);
1075 assert(Label && "Didn't insert label before instruction");
1076 return Label;
Devang Patelc3f5f782010-05-25 23:40:22 +00001077}
1078
1079/// getLabelAfterInsn - Return Label immediately following the instruction.
1080const MCSymbol *DwarfDebug::getLabelAfterInsn(const MachineInstr *MI) {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001081 return LabelsAfterInsn.lookup(MI);
Devang Patele717faa2009-10-06 01:26:37 +00001082}
1083
Devang Patelcbbe2872010-10-26 17:49:02 +00001084/// beginInstruction - Process beginning of an instruction.
1085void DwarfDebug::beginInstruction(const MachineInstr *MI) {
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001086 // Check if source location changes, but ignore DBG_VALUE locations.
1087 if (!MI->isDebugValue()) {
1088 DebugLoc DL = MI->getDebugLoc();
1089 if (DL != PrevInstLoc && (!DL.isUnknown() || UnknownLocations)) {
Devang Patel4243e672011-05-11 19:22:19 +00001090 unsigned Flags = DWARF2_FLAG_IS_STMT;
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001091 PrevInstLoc = DL;
Devang Patel4243e672011-05-11 19:22:19 +00001092 if (DL == PrologEndLoc) {
1093 Flags |= DWARF2_FLAG_PROLOGUE_END;
1094 PrologEndLoc = DebugLoc();
1095 }
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001096 if (!DL.isUnknown()) {
1097 const MDNode *Scope = DL.getScope(Asm->MF->getFunction()->getContext());
Devang Patel4243e672011-05-11 19:22:19 +00001098 recordSourceLine(DL.getLine(), DL.getCol(), Scope, Flags);
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001099 } else
Devang Patel4243e672011-05-11 19:22:19 +00001100 recordSourceLine(0, 0, 0, 0);
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001101 }
Devang Patelc3f5f782010-05-25 23:40:22 +00001102 }
Devang Patelaead63c2010-03-29 22:59:58 +00001103
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001104 // Insert labels where requested.
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001105 DenseMap<const MachineInstr*, MCSymbol*>::iterator I =
1106 LabelsBeforeInsn.find(MI);
1107
1108 // No label needed.
1109 if (I == LabelsBeforeInsn.end())
1110 return;
1111
1112 // Label already assigned.
1113 if (I->second)
Devang Patelb2b31a62010-05-26 19:37:24 +00001114 return;
Devang Patel553881b2010-03-29 17:20:31 +00001115
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001116 if (!PrevLabel) {
Devang Patel77051f52010-05-26 21:23:46 +00001117 PrevLabel = MMI->getContext().CreateTempSymbol();
1118 Asm->OutStreamer.EmitLabel(PrevLabel);
Devang Patelb2b31a62010-05-26 19:37:24 +00001119 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001120 I->second = PrevLabel;
Devang Patel0d20ac82009-10-06 01:50:42 +00001121}
1122
Devang Patelcbbe2872010-10-26 17:49:02 +00001123/// endInstruction - Process end of an instruction.
1124void DwarfDebug::endInstruction(const MachineInstr *MI) {
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001125 // Don't create a new label after DBG_VALUE instructions.
1126 // They don't generate code.
1127 if (!MI->isDebugValue())
1128 PrevLabel = 0;
1129
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001130 DenseMap<const MachineInstr*, MCSymbol*>::iterator I =
1131 LabelsAfterInsn.find(MI);
1132
1133 // No label needed.
1134 if (I == LabelsAfterInsn.end())
1135 return;
1136
1137 // Label already assigned.
1138 if (I->second)
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001139 return;
1140
1141 // We need a label after this instruction.
1142 if (!PrevLabel) {
1143 PrevLabel = MMI->getContext().CreateTempSymbol();
1144 Asm->OutStreamer.EmitLabel(PrevLabel);
Devang Patel1c246352010-04-08 16:50:29 +00001145 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001146 I->second = PrevLabel;
Devang Patel53bb5c92009-11-10 23:06:00 +00001147}
1148
Jim Grosbach1e20b962010-07-21 21:21:52 +00001149/// identifyScopeMarkers() -
Devang Patel5bc942c2011-08-10 23:58:09 +00001150/// Each LexicalScope has first instruction and last instruction to mark
1151/// beginning and end of a scope respectively. Create an inverse map that list
1152/// scopes starts (and ends) with an instruction. One instruction may start (or
1153/// end) multiple scopes. Ignore scopes that are not reachable.
Devang Patele37b0c62010-04-08 18:43:56 +00001154void DwarfDebug::identifyScopeMarkers() {
Devang Patelbf47fdb2011-08-10 20:55:27 +00001155 SmallVector<LexicalScope *, 4> WorkList;
1156 WorkList.push_back(LScopes.getCurrentFunctionScope());
Devang Patel42aafd72010-01-20 02:05:23 +00001157 while (!WorkList.empty()) {
Devang Patelbf47fdb2011-08-10 20:55:27 +00001158 LexicalScope *S = WorkList.pop_back_val();
Jim Grosbach1e20b962010-07-21 21:21:52 +00001159
Devang Patelbf47fdb2011-08-10 20:55:27 +00001160 const SmallVector<LexicalScope *, 4> &Children = S->getChildren();
Jim Grosbach1e20b962010-07-21 21:21:52 +00001161 if (!Children.empty())
Devang Patelbf47fdb2011-08-10 20:55:27 +00001162 for (SmallVector<LexicalScope *, 4>::const_iterator SI = Children.begin(),
Devang Patel42aafd72010-01-20 02:05:23 +00001163 SE = Children.end(); SI != SE; ++SI)
1164 WorkList.push_back(*SI);
1165
Devang Patel53bb5c92009-11-10 23:06:00 +00001166 if (S->isAbstractScope())
1167 continue;
Jim Grosbach1e20b962010-07-21 21:21:52 +00001168
Devang Patelbf47fdb2011-08-10 20:55:27 +00001169 const SmallVector<InsnRange, 4> &Ranges = S->getRanges();
Devang Pateleac9c072010-04-27 19:46:33 +00001170 if (Ranges.empty())
1171 continue;
Devang Patelbf47fdb2011-08-10 20:55:27 +00001172 for (SmallVector<InsnRange, 4>::const_iterator RI = Ranges.begin(),
Devang Pateleac9c072010-04-27 19:46:33 +00001173 RE = Ranges.end(); RI != RE; ++RI) {
Devang Patelbf47fdb2011-08-10 20:55:27 +00001174 assert(RI->first && "InsnRange does not have first instruction!");
1175 assert(RI->second && "InsnRange does not have second instruction!");
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001176 requestLabelBeforeInsn(RI->first);
1177 requestLabelAfterInsn(RI->second);
Devang Pateleac9c072010-04-27 19:46:33 +00001178 }
Devang Patelaf9e8472009-10-01 20:31:14 +00001179 }
Devang Patelaf9e8472009-10-01 20:31:14 +00001180}
1181
Devang Patela3f48672011-05-09 22:14:49 +00001182/// getScopeNode - Get MDNode for DebugLoc's scope.
1183static MDNode *getScopeNode(DebugLoc DL, const LLVMContext &Ctx) {
1184 if (MDNode *InlinedAt = DL.getInlinedAt(Ctx))
1185 return getScopeNode(DebugLoc::getFromDILocation(InlinedAt), Ctx);
1186 return DL.getScope(Ctx);
1187}
1188
Devang Patel4243e672011-05-11 19:22:19 +00001189/// getFnDebugLoc - Walk up the scope chain of given debug loc and find
1190/// line number info for the function.
1191static DebugLoc getFnDebugLoc(DebugLoc DL, const LLVMContext &Ctx) {
1192 const MDNode *Scope = getScopeNode(DL, Ctx);
1193 DISubprogram SP = getDISubprogram(Scope);
1194 if (SP.Verify())
1195 return DebugLoc::get(SP.getLineNumber(), 0, SP);
1196 return DebugLoc();
1197}
1198
Devang Patel2c4ceb12009-11-21 02:48:08 +00001199/// beginFunction - Gather pre-function debug information. Assumes being
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001200/// emitted immediately after the function entry point.
Chris Lattnereec791a2010-01-26 23:18:02 +00001201void DwarfDebug::beginFunction(const MachineFunction *MF) {
Chris Lattner994cb122010-04-05 03:52:55 +00001202 if (!MMI->hasDebugInfo()) return;
Devang Patelbf47fdb2011-08-10 20:55:27 +00001203 LScopes.initialize(*MF);
1204 if (LScopes.empty()) return;
1205 identifyScopeMarkers();
Devang Patel60b35bd2009-10-06 18:37:31 +00001206
Devang Pateleac9c072010-04-27 19:46:33 +00001207 FunctionBeginSym = Asm->GetTempSymbol("func_begin",
1208 Asm->getFunctionNumber());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001209 // Assumes in correct section after the entry point.
Devang Pateleac9c072010-04-27 19:46:33 +00001210 Asm->OutStreamer.EmitLabel(FunctionBeginSym);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001211
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001212 assert(UserVariables.empty() && DbgValues.empty() && "Maps weren't cleaned");
1213
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001214 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001215 /// LiveUserVar - Map physreg numbers to the MDNode they contain.
1216 std::vector<const MDNode*> LiveUserVar(TRI->getNumRegs());
1217
Devang Patelb2b31a62010-05-26 19:37:24 +00001218 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001219 I != E; ++I) {
1220 bool AtBlockEntry = true;
Devang Patelb2b31a62010-05-26 19:37:24 +00001221 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
1222 II != IE; ++II) {
1223 const MachineInstr *MI = II;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001224
Devang Patelb2b31a62010-05-26 19:37:24 +00001225 if (MI->isDebugValue()) {
Nick Lewycky746cb672011-10-26 22:55:33 +00001226 assert(MI->getNumOperands() > 1 && "Invalid machine instruction!");
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001227
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001228 // Keep track of user variables.
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001229 const MDNode *Var =
1230 MI->getOperand(MI->getNumOperands() - 1).getMetadata();
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001231
1232 // Variable is in a register, we need to check for clobbers.
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001233 if (isDbgValueInDefinedReg(MI))
1234 LiveUserVar[MI->getOperand(0).getReg()] = Var;
1235
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001236 // Check the history of this variable.
1237 SmallVectorImpl<const MachineInstr*> &History = DbgValues[Var];
1238 if (History.empty()) {
1239 UserVariables.push_back(Var);
1240 // The first mention of a function argument gets the FunctionBeginSym
1241 // label, so arguments are visible when breaking at function entry.
1242 DIVariable DV(Var);
1243 if (DV.Verify() && DV.getTag() == dwarf::DW_TAG_arg_variable &&
1244 DISubprogram(getDISubprogram(DV.getContext()))
1245 .describes(MF->getFunction()))
1246 LabelsBeforeInsn[MI] = FunctionBeginSym;
1247 } else {
1248 // We have seen this variable before. Try to coalesce DBG_VALUEs.
1249 const MachineInstr *Prev = History.back();
1250 if (Prev->isDebugValue()) {
1251 // Coalesce identical entries at the end of History.
1252 if (History.size() >= 2 &&
Devang Patel79862892011-07-07 00:14:27 +00001253 Prev->isIdenticalTo(History[History.size() - 2])) {
1254 DEBUG(dbgs() << "Coalesce identical DBG_VALUE entries:\n"
1255 << "\t" << *Prev
1256 << "\t" << *History[History.size() - 2] << "\n");
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001257 History.pop_back();
Devang Patel79862892011-07-07 00:14:27 +00001258 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001259
1260 // Terminate old register assignments that don't reach MI;
1261 MachineFunction::const_iterator PrevMBB = Prev->getParent();
1262 if (PrevMBB != I && (!AtBlockEntry || llvm::next(PrevMBB) != I) &&
1263 isDbgValueInDefinedReg(Prev)) {
1264 // Previous register assignment needs to terminate at the end of
1265 // its basic block.
1266 MachineBasicBlock::const_iterator LastMI =
1267 PrevMBB->getLastNonDebugInstr();
Devang Patel79862892011-07-07 00:14:27 +00001268 if (LastMI == PrevMBB->end()) {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001269 // Drop DBG_VALUE for empty range.
Devang Patel79862892011-07-07 00:14:27 +00001270 DEBUG(dbgs() << "Drop DBG_VALUE for empty range:\n"
1271 << "\t" << *Prev << "\n");
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001272 History.pop_back();
Devang Patel79862892011-07-07 00:14:27 +00001273 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001274 else {
1275 // Terminate after LastMI.
1276 History.push_back(LastMI);
1277 }
1278 }
1279 }
1280 }
1281 History.push_back(MI);
Devang Patelb2b31a62010-05-26 19:37:24 +00001282 } else {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001283 // Not a DBG_VALUE instruction.
1284 if (!MI->isLabel())
1285 AtBlockEntry = false;
1286
Devang Patel4243e672011-05-11 19:22:19 +00001287 // First known non DBG_VALUE location marks beginning of function
1288 // body.
1289 if (PrologEndLoc.isUnknown() && !MI->getDebugLoc().isUnknown())
1290 PrologEndLoc = MI->getDebugLoc();
1291
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001292 // Check if the instruction clobbers any registers with debug vars.
1293 for (MachineInstr::const_mop_iterator MOI = MI->operands_begin(),
1294 MOE = MI->operands_end(); MOI != MOE; ++MOI) {
1295 if (!MOI->isReg() || !MOI->isDef() || !MOI->getReg())
1296 continue;
1297 for (const unsigned *AI = TRI->getOverlaps(MOI->getReg());
1298 unsigned Reg = *AI; ++AI) {
1299 const MDNode *Var = LiveUserVar[Reg];
1300 if (!Var)
1301 continue;
1302 // Reg is now clobbered.
1303 LiveUserVar[Reg] = 0;
1304
1305 // Was MD last defined by a DBG_VALUE referring to Reg?
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001306 DbgValueHistoryMap::iterator HistI = DbgValues.find(Var);
1307 if (HistI == DbgValues.end())
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001308 continue;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001309 SmallVectorImpl<const MachineInstr*> &History = HistI->second;
1310 if (History.empty())
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001311 continue;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001312 const MachineInstr *Prev = History.back();
1313 // Sanity-check: Register assignments are terminated at the end of
1314 // their block.
1315 if (!Prev->isDebugValue() || Prev->getParent() != MI->getParent())
1316 continue;
1317 // Is the variable still in Reg?
1318 if (!isDbgValueInDefinedReg(Prev) ||
1319 Prev->getOperand(0).getReg() != Reg)
1320 continue;
1321 // Var is clobbered. Make sure the next instruction gets a label.
1322 History.push_back(MI);
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001323 }
1324 }
Devang Patelb2b31a62010-05-26 19:37:24 +00001325 }
Devang Patelb2b31a62010-05-26 19:37:24 +00001326 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001327 }
1328
1329 for (DbgValueHistoryMap::iterator I = DbgValues.begin(), E = DbgValues.end();
1330 I != E; ++I) {
1331 SmallVectorImpl<const MachineInstr*> &History = I->second;
1332 if (History.empty())
1333 continue;
1334
1335 // Make sure the final register assignments are terminated.
1336 const MachineInstr *Prev = History.back();
1337 if (Prev->isDebugValue() && isDbgValueInDefinedReg(Prev)) {
1338 const MachineBasicBlock *PrevMBB = Prev->getParent();
Devang Patel5bc942c2011-08-10 23:58:09 +00001339 MachineBasicBlock::const_iterator LastMI =
1340 PrevMBB->getLastNonDebugInstr();
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001341 if (LastMI == PrevMBB->end())
1342 // Drop DBG_VALUE for empty range.
1343 History.pop_back();
1344 else {
1345 // Terminate after LastMI.
1346 History.push_back(LastMI);
1347 }
1348 }
1349 // Request labels for the full history.
1350 for (unsigned i = 0, e = History.size(); i != e; ++i) {
1351 const MachineInstr *MI = History[i];
1352 if (MI->isDebugValue())
1353 requestLabelBeforeInsn(MI);
1354 else
1355 requestLabelAfterInsn(MI);
1356 }
1357 }
Devang Patelb2b31a62010-05-26 19:37:24 +00001358
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001359 PrevInstLoc = DebugLoc();
Devang Patelb2b31a62010-05-26 19:37:24 +00001360 PrevLabel = FunctionBeginSym;
Devang Patel4243e672011-05-11 19:22:19 +00001361
1362 // Record beginning of function.
1363 if (!PrologEndLoc.isUnknown()) {
1364 DebugLoc FnStartDL = getFnDebugLoc(PrologEndLoc,
1365 MF->getFunction()->getContext());
1366 recordSourceLine(FnStartDL.getLine(), FnStartDL.getCol(),
1367 FnStartDL.getScope(MF->getFunction()->getContext()),
1368 DWARF2_FLAG_IS_STMT);
1369 }
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001370}
1371
Devang Patelbf47fdb2011-08-10 20:55:27 +00001372void DwarfDebug::addScopeVariable(LexicalScope *LS, DbgVariable *Var) {
1373// SmallVector<DbgVariable *, 8> &Vars = ScopeVariables.lookup(LS);
1374 ScopeVariables[LS].push_back(Var);
1375// Vars.push_back(Var);
1376}
1377
Devang Patel2c4ceb12009-11-21 02:48:08 +00001378/// endFunction - Gather and emit post-function debug information.
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001379///
Chris Lattnereec791a2010-01-26 23:18:02 +00001380void DwarfDebug::endFunction(const MachineFunction *MF) {
Devang Patelbf47fdb2011-08-10 20:55:27 +00001381 if (!MMI->hasDebugInfo() || LScopes.empty()) return;
Devang Patel70d75ca2009-11-12 19:02:56 +00001382
Devang Patelbf47fdb2011-08-10 20:55:27 +00001383 // Define end label for subprogram.
1384 FunctionEndSym = Asm->GetTempSymbol("func_end",
1385 Asm->getFunctionNumber());
1386 // Assumes in correct section after the entry point.
1387 Asm->OutStreamer.EmitLabel(FunctionEndSym);
1388
1389 SmallPtrSet<const MDNode *, 16> ProcessedVars;
1390 collectVariableInfo(MF, ProcessedVars);
1391
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001392 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
Devang Patel94c7ddb2011-08-16 22:09:43 +00001393 CompileUnit *TheCU = SPMap.lookup(FnScope->getScopeNode());
Nick Lewycky746cb672011-10-26 22:55:33 +00001394 assert(TheCU && "Unable to find compile unit!");
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001395
Devang Patelbf47fdb2011-08-10 20:55:27 +00001396 // Construct abstract scopes.
Devang Patelcd9f6c52011-08-12 18:10:19 +00001397 ArrayRef<LexicalScope *> AList = LScopes.getAbstractScopesList();
1398 for (unsigned i = 0, e = AList.size(); i != e; ++i) {
1399 LexicalScope *AScope = AList[i];
1400 DISubprogram SP(AScope->getScopeNode());
Devang Patelbf47fdb2011-08-10 20:55:27 +00001401 if (SP.Verify()) {
1402 // Collect info for variables that were optimized out.
Devang Patel93d39be2011-08-19 23:28:12 +00001403 DIArray Variables = SP.getVariables();
1404 for (unsigned i = 0, e = Variables.getNumElements(); i != e; ++i) {
1405 DIVariable DV(Variables.getElement(i));
1406 if (!DV || !DV.Verify() || !ProcessedVars.insert(DV))
1407 continue;
1408 if (LexicalScope *Scope = LScopes.findAbstractScope(DV.getContext()))
1409 addScopeVariable(Scope, new DbgVariable(DV, NULL));
Devang Patel78e127d2010-06-25 22:07:34 +00001410 }
1411 }
Devang Patelcd9f6c52011-08-12 18:10:19 +00001412 if (ProcessedSPNodes.count(AScope->getScopeNode()) == 0)
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001413 constructScopeDIE(TheCU, AScope);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001414 }
Devang Patelbf47fdb2011-08-10 20:55:27 +00001415
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001416 DIE *CurFnDIE = constructScopeDIE(TheCU, FnScope);
Devang Patelbf47fdb2011-08-10 20:55:27 +00001417
Nick Lewycky8a8d4792011-12-02 22:16:29 +00001418 if (!MF->getTarget().Options.DisableFramePointerElim(*MF))
Devang Patel5bc942c2011-08-10 23:58:09 +00001419 TheCU->addUInt(CurFnDIE, dwarf::DW_AT_APPLE_omit_frame_ptr,
1420 dwarf::DW_FORM_flag, 1);
Devang Pateld0b5a5e2011-08-15 22:04:40 +00001421
Devang Patelbf47fdb2011-08-10 20:55:27 +00001422 DebugFrames.push_back(FunctionDebugFrameInfo(Asm->getFunctionNumber(),
1423 MMI->getFrameMoves()));
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001424
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001425 // Clear debug info
Devang Patelbf47fdb2011-08-10 20:55:27 +00001426 for (DenseMap<LexicalScope *, SmallVector<DbgVariable *, 8> >::iterator
1427 I = ScopeVariables.begin(), E = ScopeVariables.end(); I != E; ++I)
1428 DeleteContainerPointers(I->second);
1429 ScopeVariables.clear();
Devang Pateleac0c9d2011-04-22 18:09:57 +00001430 DeleteContainerPointers(CurrentFnArguments);
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001431 UserVariables.clear();
1432 DbgValues.clear();
Jeffrey Yasskin5c213dc2010-03-12 17:45:06 +00001433 AbstractVariables.clear();
Devang Pateleac9c072010-04-27 19:46:33 +00001434 LabelsBeforeInsn.clear();
1435 LabelsAfterInsn.clear();
Devang Patelf2548ca2010-04-16 23:33:45 +00001436 PrevLabel = NULL;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001437}
1438
Chris Lattnerc6087842010-03-09 04:54:43 +00001439/// recordSourceLine - Register a source line with debug info. Returns the
1440/// unique label that was emitted and which provides correspondence to
1441/// the source line list.
Devang Patel4243e672011-05-11 19:22:19 +00001442void DwarfDebug::recordSourceLine(unsigned Line, unsigned Col, const MDNode *S,
1443 unsigned Flags) {
Devang Patel65dbc902009-11-25 17:36:49 +00001444 StringRef Fn;
Devang Patel23670e52011-03-24 20:30:50 +00001445 StringRef Dir;
Dan Gohman1cc0d622010-05-05 23:41:32 +00001446 unsigned Src = 1;
1447 if (S) {
1448 DIDescriptor Scope(S);
Devang Patelf84548d2009-10-05 18:03:19 +00001449
Dan Gohman1cc0d622010-05-05 23:41:32 +00001450 if (Scope.isCompileUnit()) {
1451 DICompileUnit CU(S);
Dan Gohman1cc0d622010-05-05 23:41:32 +00001452 Fn = CU.getFilename();
Devang Patel23670e52011-03-24 20:30:50 +00001453 Dir = CU.getDirectory();
Devang Patel3cabc9d2010-10-28 17:30:52 +00001454 } else if (Scope.isFile()) {
1455 DIFile F(S);
Devang Patel3cabc9d2010-10-28 17:30:52 +00001456 Fn = F.getFilename();
Devang Patel23670e52011-03-24 20:30:50 +00001457 Dir = F.getDirectory();
Dan Gohman1cc0d622010-05-05 23:41:32 +00001458 } else if (Scope.isSubprogram()) {
1459 DISubprogram SP(S);
Dan Gohman1cc0d622010-05-05 23:41:32 +00001460 Fn = SP.getFilename();
Devang Patel23670e52011-03-24 20:30:50 +00001461 Dir = SP.getDirectory();
Eric Christopher6618a242011-10-11 22:59:11 +00001462 } else if (Scope.isLexicalBlockFile()) {
1463 DILexicalBlockFile DBF(S);
1464 Fn = DBF.getFilename();
1465 Dir = DBF.getDirectory();
Dan Gohman1cc0d622010-05-05 23:41:32 +00001466 } else if (Scope.isLexicalBlock()) {
1467 DILexicalBlock DB(S);
Dan Gohman1cc0d622010-05-05 23:41:32 +00001468 Fn = DB.getFilename();
Devang Patel23670e52011-03-24 20:30:50 +00001469 Dir = DB.getDirectory();
Dan Gohman1cc0d622010-05-05 23:41:32 +00001470 } else
Craig Topper5e25ee82012-02-05 08:31:47 +00001471 llvm_unreachable("Unexpected scope info");
Dan Gohman1cc0d622010-05-05 23:41:32 +00001472
Devang Patel23670e52011-03-24 20:30:50 +00001473 Src = GetOrCreateSourceID(Fn, Dir);
Dan Gohman1cc0d622010-05-05 23:41:32 +00001474 }
Nick Lewycky3bbb6f72011-07-29 03:49:23 +00001475 Asm->OutStreamer.EmitDwarfLocDirective(Src, Line, Col, Flags, 0, 0, Fn);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001476}
1477
Bill Wendling829e67b2009-05-20 23:22:40 +00001478//===----------------------------------------------------------------------===//
1479// Emit Methods
1480//===----------------------------------------------------------------------===//
1481
Devang Patel2c4ceb12009-11-21 02:48:08 +00001482/// computeSizeAndOffset - Compute the size and offset of a DIE.
Bill Wendling94d04b82009-05-20 23:21:38 +00001483///
Jim Grosbach7ab38df2009-11-22 19:20:36 +00001484unsigned
1485DwarfDebug::computeSizeAndOffset(DIE *Die, unsigned Offset, bool Last) {
Bill Wendling94d04b82009-05-20 23:21:38 +00001486 // Get the children.
1487 const std::vector<DIE *> &Children = Die->getChildren();
1488
Bill Wendling94d04b82009-05-20 23:21:38 +00001489 // Record the abbreviation.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001490 assignAbbrevNumber(Die->getAbbrev());
Bill Wendling94d04b82009-05-20 23:21:38 +00001491
1492 // Get the abbreviation for this DIE.
1493 unsigned AbbrevNumber = Die->getAbbrevNumber();
1494 const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
1495
1496 // Set DIE offset
1497 Die->setOffset(Offset);
1498
1499 // Start the size with the size of abbreviation code.
Chris Lattneraf76e592009-08-22 20:48:53 +00001500 Offset += MCAsmInfo::getULEB128Size(AbbrevNumber);
Bill Wendling94d04b82009-05-20 23:21:38 +00001501
1502 const SmallVector<DIEValue*, 32> &Values = Die->getValues();
1503 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
1504
1505 // Size the DIE attribute values.
1506 for (unsigned i = 0, N = Values.size(); i < N; ++i)
1507 // Size attribute value.
Chris Lattnera37d5382010-04-05 00:18:22 +00001508 Offset += Values[i]->SizeOf(Asm, AbbrevData[i].getForm());
Bill Wendling94d04b82009-05-20 23:21:38 +00001509
1510 // Size the DIE children if any.
1511 if (!Children.empty()) {
1512 assert(Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes &&
1513 "Children flag not set");
1514
1515 for (unsigned j = 0, M = Children.size(); j < M; ++j)
Devang Patel2c4ceb12009-11-21 02:48:08 +00001516 Offset = computeSizeAndOffset(Children[j], Offset, (j + 1) == M);
Bill Wendling94d04b82009-05-20 23:21:38 +00001517
1518 // End of children marker.
1519 Offset += sizeof(int8_t);
1520 }
1521
1522 Die->setSize(Offset - Die->getOffset());
1523 return Offset;
1524}
1525
Devang Patel2c4ceb12009-11-21 02:48:08 +00001526/// computeSizeAndOffsets - Compute the size and offset of all the DIEs.
Bill Wendling94d04b82009-05-20 23:21:38 +00001527///
Devang Patel2c4ceb12009-11-21 02:48:08 +00001528void DwarfDebug::computeSizeAndOffsets() {
Devang Patel163a9f72010-05-10 22:49:55 +00001529 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
1530 E = CUMap.end(); I != E; ++I) {
1531 // Compute size of compile unit header.
Devang Patel513edf62011-04-12 23:10:47 +00001532 unsigned Offset =
Devang Patel163a9f72010-05-10 22:49:55 +00001533 sizeof(int32_t) + // Length of Compilation Unit Info
1534 sizeof(int16_t) + // DWARF version number
1535 sizeof(int32_t) + // Offset Into Abbrev. Section
1536 sizeof(int8_t); // Pointer Size (in bytes)
1537 computeSizeAndOffset(I->second->getCUDie(), Offset, true);
Devang Patel163a9f72010-05-10 22:49:55 +00001538 }
Bill Wendling94d04b82009-05-20 23:21:38 +00001539}
1540
Chris Lattner9c69e285532010-04-04 22:59:04 +00001541/// EmitSectionLabels - Emit initial Dwarf sections with a label at
1542/// the start of each one.
Chris Lattnerfa070b02010-04-04 22:33:59 +00001543void DwarfDebug::EmitSectionLabels() {
Chris Lattner6c2f9e12009-08-19 05:49:37 +00001544 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
Daniel Dunbarf612ff62009-09-19 20:40:05 +00001545
Bill Wendling94d04b82009-05-20 23:21:38 +00001546 // Dwarf sections base addresses.
Jim Grosbach1e20b962010-07-21 21:21:52 +00001547 DwarfInfoSectionSym =
Chris Lattner9c69e285532010-04-04 22:59:04 +00001548 EmitSectionSym(Asm, TLOF.getDwarfInfoSection(), "section_info");
Jim Grosbach1e20b962010-07-21 21:21:52 +00001549 DwarfAbbrevSectionSym =
Chris Lattner9c69e285532010-04-04 22:59:04 +00001550 EmitSectionSym(Asm, TLOF.getDwarfAbbrevSection(), "section_abbrev");
Chris Lattner11b8f302010-04-04 23:02:02 +00001551 EmitSectionSym(Asm, TLOF.getDwarfARangesSection());
Jim Grosbach1e20b962010-07-21 21:21:52 +00001552
Chris Lattner9c69e285532010-04-04 22:59:04 +00001553 if (const MCSection *MacroInfo = TLOF.getDwarfMacroInfoSection())
Chris Lattner11b8f302010-04-04 23:02:02 +00001554 EmitSectionSym(Asm, MacroInfo);
Bill Wendling94d04b82009-05-20 23:21:38 +00001555
Devang Patelaf608bd2010-08-24 00:06:12 +00001556 EmitSectionSym(Asm, TLOF.getDwarfLineSection(), "section_line");
Chris Lattner11b8f302010-04-04 23:02:02 +00001557 EmitSectionSym(Asm, TLOF.getDwarfLocSection());
Chris Lattner11b8f302010-04-04 23:02:02 +00001558 EmitSectionSym(Asm, TLOF.getDwarfPubTypesSection());
Jim Grosbach1e20b962010-07-21 21:21:52 +00001559 DwarfStrSectionSym =
Chris Lattner9c69e285532010-04-04 22:59:04 +00001560 EmitSectionSym(Asm, TLOF.getDwarfStrSection(), "section_str");
Devang Patelf2548ca2010-04-16 23:33:45 +00001561 DwarfDebugRangeSectionSym = EmitSectionSym(Asm, TLOF.getDwarfRangesSection(),
1562 "debug_range");
Bill Wendling94d04b82009-05-20 23:21:38 +00001563
Devang Patelc3f5f782010-05-25 23:40:22 +00001564 DwarfDebugLocSectionSym = EmitSectionSym(Asm, TLOF.getDwarfLocSection(),
1565 "section_debug_loc");
1566
Chris Lattner9c69e285532010-04-04 22:59:04 +00001567 TextSectionSym = EmitSectionSym(Asm, TLOF.getTextSection(), "text_begin");
Chris Lattner4ad1efe2010-04-04 23:10:38 +00001568 EmitSectionSym(Asm, TLOF.getDataSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00001569}
1570
Nick Lewycky3bbb6f72011-07-29 03:49:23 +00001571/// emitDIE - Recursively emits a debug information entry.
Bill Wendling94d04b82009-05-20 23:21:38 +00001572///
Devang Patel2c4ceb12009-11-21 02:48:08 +00001573void DwarfDebug::emitDIE(DIE *Die) {
Bill Wendling94d04b82009-05-20 23:21:38 +00001574 // Get the abbreviation for this DIE.
1575 unsigned AbbrevNumber = Die->getAbbrevNumber();
1576 const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
1577
Bill Wendling94d04b82009-05-20 23:21:38 +00001578 // Emit the code (index) for the abbreviation.
Chris Lattner3f53c832010-04-04 18:52:31 +00001579 if (Asm->isVerbose())
Chris Lattner894d75a2010-01-22 23:18:42 +00001580 Asm->OutStreamer.AddComment("Abbrev [" + Twine(AbbrevNumber) + "] 0x" +
1581 Twine::utohexstr(Die->getOffset()) + ":0x" +
1582 Twine::utohexstr(Die->getSize()) + " " +
1583 dwarf::TagString(Abbrev->getTag()));
Chris Lattner7e1a8f82010-04-04 19:09:29 +00001584 Asm->EmitULEB128(AbbrevNumber);
Bill Wendling94d04b82009-05-20 23:21:38 +00001585
Jeffrey Yasskin638fe8d2010-03-22 18:47:14 +00001586 const SmallVector<DIEValue*, 32> &Values = Die->getValues();
Bill Wendling94d04b82009-05-20 23:21:38 +00001587 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
1588
1589 // Emit the DIE attribute values.
1590 for (unsigned i = 0, N = Values.size(); i < N; ++i) {
1591 unsigned Attr = AbbrevData[i].getAttribute();
1592 unsigned Form = AbbrevData[i].getForm();
1593 assert(Form && "Too many attributes for DIE (check abbreviation)");
1594
Chris Lattner3f53c832010-04-04 18:52:31 +00001595 if (Asm->isVerbose())
Chris Lattnera8013622010-01-24 18:54:17 +00001596 Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr));
Jim Grosbach1e20b962010-07-21 21:21:52 +00001597
Bill Wendling94d04b82009-05-20 23:21:38 +00001598 switch (Attr) {
Bill Wendling94d04b82009-05-20 23:21:38 +00001599 case dwarf::DW_AT_abstract_origin: {
1600 DIEEntry *E = cast<DIEEntry>(Values[i]);
1601 DIE *Origin = E->getEntry();
Devang Patel53bb5c92009-11-10 23:06:00 +00001602 unsigned Addr = Origin->getOffset();
Bill Wendling94d04b82009-05-20 23:21:38 +00001603 Asm->EmitInt32(Addr);
1604 break;
1605 }
Devang Patelf2548ca2010-04-16 23:33:45 +00001606 case dwarf::DW_AT_ranges: {
1607 // DW_AT_range Value encodes offset in debug_range section.
1608 DIEInteger *V = cast<DIEInteger>(Values[i]);
Devang Patelb1fcfbe2010-09-02 16:43:44 +00001609
1610 if (Asm->MAI->doesDwarfUsesLabelOffsetForRanges()) {
1611 Asm->EmitLabelPlusOffset(DwarfDebugRangeSectionSym,
1612 V->getValue(),
1613 4);
1614 } else {
1615 Asm->EmitLabelOffsetDifference(DwarfDebugRangeSectionSym,
1616 V->getValue(),
1617 DwarfDebugRangeSectionSym,
1618 4);
1619 }
Devang Patelf2548ca2010-04-16 23:33:45 +00001620 break;
1621 }
Devang Patelc3f5f782010-05-25 23:40:22 +00001622 case dwarf::DW_AT_location: {
Devang Patel7a328272011-08-15 21:43:21 +00001623 if (DIELabel *L = dyn_cast<DIELabel>(Values[i]))
Daniel Dunbar83320a02011-03-16 22:16:39 +00001624 Asm->EmitLabelDifference(L->getValue(), DwarfDebugLocSectionSym, 4);
Devang Patel7a328272011-08-15 21:43:21 +00001625 else
Devang Patelc3f5f782010-05-25 23:40:22 +00001626 Values[i]->EmitValue(Asm, Form);
1627 break;
1628 }
Devang Patel2a361602010-09-29 19:08:08 +00001629 case dwarf::DW_AT_accessibility: {
1630 if (Asm->isVerbose()) {
1631 DIEInteger *V = cast<DIEInteger>(Values[i]);
1632 Asm->OutStreamer.AddComment(dwarf::AccessibilityString(V->getValue()));
1633 }
1634 Values[i]->EmitValue(Asm, Form);
1635 break;
1636 }
Bill Wendling94d04b82009-05-20 23:21:38 +00001637 default:
1638 // Emit an attribute using the defined form.
Chris Lattnerd38fee82010-04-05 00:13:49 +00001639 Values[i]->EmitValue(Asm, Form);
Bill Wendling94d04b82009-05-20 23:21:38 +00001640 break;
1641 }
Bill Wendling94d04b82009-05-20 23:21:38 +00001642 }
1643
1644 // Emit the DIE children if any.
1645 if (Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes) {
1646 const std::vector<DIE *> &Children = Die->getChildren();
1647
1648 for (unsigned j = 0, M = Children.size(); j < M; ++j)
Devang Patel2c4ceb12009-11-21 02:48:08 +00001649 emitDIE(Children[j]);
Bill Wendling94d04b82009-05-20 23:21:38 +00001650
Chris Lattner3f53c832010-04-04 18:52:31 +00001651 if (Asm->isVerbose())
Chris Lattner233f52b2010-03-09 23:52:58 +00001652 Asm->OutStreamer.AddComment("End Of Children Mark");
1653 Asm->EmitInt8(0);
Bill Wendling94d04b82009-05-20 23:21:38 +00001654 }
1655}
1656
Devang Patel8a241142009-12-09 18:24:21 +00001657/// emitDebugInfo - Emit the debug info section.
Bill Wendling94d04b82009-05-20 23:21:38 +00001658///
Devang Patel8a241142009-12-09 18:24:21 +00001659void DwarfDebug::emitDebugInfo() {
1660 // Start debug info section.
1661 Asm->OutStreamer.SwitchSection(
1662 Asm->getObjFileLowering().getDwarfInfoSection());
Devang Patel163a9f72010-05-10 22:49:55 +00001663 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
1664 E = CUMap.end(); I != E; ++I) {
1665 CompileUnit *TheCU = I->second;
1666 DIE *Die = TheCU->getCUDie();
Jim Grosbach1e20b962010-07-21 21:21:52 +00001667
Devang Patel163a9f72010-05-10 22:49:55 +00001668 // Emit the compile units header.
1669 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_begin",
1670 TheCU->getID()));
Jim Grosbach1e20b962010-07-21 21:21:52 +00001671
Devang Patel163a9f72010-05-10 22:49:55 +00001672 // Emit size of content not including length itself
1673 unsigned ContentSize = Die->getSize() +
1674 sizeof(int16_t) + // DWARF version number
1675 sizeof(int32_t) + // Offset Into Abbrev. Section
Devang Patel65705d52011-04-13 19:41:17 +00001676 sizeof(int8_t); // Pointer Size (in bytes)
Jim Grosbach1e20b962010-07-21 21:21:52 +00001677
Devang Patel163a9f72010-05-10 22:49:55 +00001678 Asm->OutStreamer.AddComment("Length of Compilation Unit Info");
1679 Asm->EmitInt32(ContentSize);
1680 Asm->OutStreamer.AddComment("DWARF version number");
1681 Asm->EmitInt16(dwarf::DWARF_VERSION);
1682 Asm->OutStreamer.AddComment("Offset Into Abbrev. Section");
1683 Asm->EmitSectionOffset(Asm->GetTempSymbol("abbrev_begin"),
1684 DwarfAbbrevSectionSym);
1685 Asm->OutStreamer.AddComment("Address Size (in bytes)");
1686 Asm->EmitInt8(Asm->getTargetData().getPointerSize());
Jim Grosbach1e20b962010-07-21 21:21:52 +00001687
Devang Patel163a9f72010-05-10 22:49:55 +00001688 emitDIE(Die);
Devang Patel163a9f72010-05-10 22:49:55 +00001689 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_end", TheCU->getID()));
1690 }
Bill Wendling94d04b82009-05-20 23:21:38 +00001691}
1692
Devang Patel2c4ceb12009-11-21 02:48:08 +00001693/// emitAbbreviations - Emit the abbreviation section.
Bill Wendling94d04b82009-05-20 23:21:38 +00001694///
Devang Patel2c4ceb12009-11-21 02:48:08 +00001695void DwarfDebug::emitAbbreviations() const {
Bill Wendling94d04b82009-05-20 23:21:38 +00001696 // Check to see if it is worth the effort.
1697 if (!Abbreviations.empty()) {
1698 // Start the debug abbrev section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00001699 Asm->OutStreamer.SwitchSection(
1700 Asm->getObjFileLowering().getDwarfAbbrevSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00001701
Chris Lattnerc0215722010-04-04 19:25:43 +00001702 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_begin"));
Bill Wendling94d04b82009-05-20 23:21:38 +00001703
1704 // For each abbrevation.
1705 for (unsigned i = 0, N = Abbreviations.size(); i < N; ++i) {
1706 // Get abbreviation data
1707 const DIEAbbrev *Abbrev = Abbreviations[i];
1708
1709 // Emit the abbrevations code (base 1 index.)
Chris Lattner7e1a8f82010-04-04 19:09:29 +00001710 Asm->EmitULEB128(Abbrev->getNumber(), "Abbreviation Code");
Bill Wendling94d04b82009-05-20 23:21:38 +00001711
1712 // Emit the abbreviations data.
Chris Lattnerd38fee82010-04-05 00:13:49 +00001713 Abbrev->Emit(Asm);
Bill Wendling94d04b82009-05-20 23:21:38 +00001714 }
1715
1716 // Mark end of abbreviations.
Chris Lattner7e1a8f82010-04-04 19:09:29 +00001717 Asm->EmitULEB128(0, "EOM(3)");
Bill Wendling94d04b82009-05-20 23:21:38 +00001718
Chris Lattnerc0215722010-04-04 19:25:43 +00001719 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_end"));
Bill Wendling94d04b82009-05-20 23:21:38 +00001720 }
1721}
1722
Devang Patel2c4ceb12009-11-21 02:48:08 +00001723/// emitEndOfLineMatrix - Emit the last address of the section and the end of
Bill Wendling94d04b82009-05-20 23:21:38 +00001724/// the line matrix.
1725///
Devang Patel2c4ceb12009-11-21 02:48:08 +00001726void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) {
Bill Wendling94d04b82009-05-20 23:21:38 +00001727 // Define last address of section.
Chris Lattner233f52b2010-03-09 23:52:58 +00001728 Asm->OutStreamer.AddComment("Extended Op");
1729 Asm->EmitInt8(0);
Jim Grosbach1e20b962010-07-21 21:21:52 +00001730
Chris Lattner233f52b2010-03-09 23:52:58 +00001731 Asm->OutStreamer.AddComment("Op size");
Chris Lattnerd38fee82010-04-05 00:13:49 +00001732 Asm->EmitInt8(Asm->getTargetData().getPointerSize() + 1);
Chris Lattner233f52b2010-03-09 23:52:58 +00001733 Asm->OutStreamer.AddComment("DW_LNE_set_address");
1734 Asm->EmitInt8(dwarf::DW_LNE_set_address);
1735
1736 Asm->OutStreamer.AddComment("Section end label");
Chris Lattnerd85fc6e2010-03-10 01:17:49 +00001737
Chris Lattnerc0215722010-04-04 19:25:43 +00001738 Asm->OutStreamer.EmitSymbolValue(Asm->GetTempSymbol("section_end",SectionEnd),
Chris Lattnerd38fee82010-04-05 00:13:49 +00001739 Asm->getTargetData().getPointerSize(),
1740 0/*AddrSpace*/);
Bill Wendling94d04b82009-05-20 23:21:38 +00001741
1742 // Mark end of matrix.
Chris Lattner233f52b2010-03-09 23:52:58 +00001743 Asm->OutStreamer.AddComment("DW_LNE_end_sequence");
1744 Asm->EmitInt8(0);
Chris Lattner0ad9c912010-01-22 22:09:00 +00001745 Asm->EmitInt8(1);
Chris Lattner894d75a2010-01-22 23:18:42 +00001746 Asm->EmitInt8(1);
Bill Wendling94d04b82009-05-20 23:21:38 +00001747}
1748
Eric Christopher09ac3d82011-11-07 09:24:32 +00001749/// emitAccelNames - Emit visible names into a hashed accelerator table
1750/// section.
1751void DwarfDebug::emitAccelNames() {
1752 DwarfAccelTable AT(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset,
1753 dwarf::DW_FORM_data4));
1754 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
1755 E = CUMap.end(); I != E; ++I) {
1756 CompileUnit *TheCU = I->second;
Eric Christopher0ffe2b42011-11-10 19:25:34 +00001757 const StringMap<std::vector<DIE*> > &Names = TheCU->getAccelNames();
1758 for (StringMap<std::vector<DIE*> >::const_iterator
Eric Christopher09ac3d82011-11-07 09:24:32 +00001759 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
1760 const char *Name = GI->getKeyData();
Eric Christopherfa03db02012-01-06 23:03:34 +00001761 const std::vector<DIE *> &Entities = GI->second;
Eric Christopher0ffe2b42011-11-10 19:25:34 +00001762 for (std::vector<DIE *>::const_iterator DI = Entities.begin(),
1763 DE = Entities.end(); DI != DE; ++DI)
1764 AT.AddName(Name, (*DI));
Eric Christopher09ac3d82011-11-07 09:24:32 +00001765 }
1766 }
1767
1768 AT.FinalizeTable(Asm, "Names");
1769 Asm->OutStreamer.SwitchSection(
1770 Asm->getObjFileLowering().getDwarfAccelNamesSection());
1771 MCSymbol *SectionBegin = Asm->GetTempSymbol("names_begin");
1772 Asm->OutStreamer.EmitLabel(SectionBegin);
1773
1774 // Emit the full data.
1775 AT.Emit(Asm, SectionBegin, this);
1776}
1777
1778/// emitAccelObjC - Emit objective C classes and categories into a hashed
1779/// accelerator table section.
1780void DwarfDebug::emitAccelObjC() {
1781 DwarfAccelTable AT(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset,
1782 dwarf::DW_FORM_data4));
1783 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
1784 E = CUMap.end(); I != E; ++I) {
1785 CompileUnit *TheCU = I->second;
1786 const StringMap<std::vector<DIE*> > &Names = TheCU->getAccelObjC();
1787 for (StringMap<std::vector<DIE*> >::const_iterator
1788 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
1789 const char *Name = GI->getKeyData();
Eric Christopherfa03db02012-01-06 23:03:34 +00001790 const std::vector<DIE *> &Entities = GI->second;
Eric Christopher09ac3d82011-11-07 09:24:32 +00001791 for (std::vector<DIE *>::const_iterator DI = Entities.begin(),
1792 DE = Entities.end(); DI != DE; ++DI)
1793 AT.AddName(Name, (*DI));
1794 }
1795 }
1796
1797 AT.FinalizeTable(Asm, "ObjC");
1798 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering()
1799 .getDwarfAccelObjCSection());
1800 MCSymbol *SectionBegin = Asm->GetTempSymbol("objc_begin");
1801 Asm->OutStreamer.EmitLabel(SectionBegin);
1802
1803 // Emit the full data.
1804 AT.Emit(Asm, SectionBegin, this);
1805}
1806
1807/// emitAccelNamespace - Emit namespace dies into a hashed accelerator
1808/// table.
1809void DwarfDebug::emitAccelNamespaces() {
1810 DwarfAccelTable AT(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset,
1811 dwarf::DW_FORM_data4));
1812 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
1813 E = CUMap.end(); I != E; ++I) {
1814 CompileUnit *TheCU = I->second;
Eric Christopher8bd36ea2011-11-10 21:47:55 +00001815 const StringMap<std::vector<DIE*> > &Names = TheCU->getAccelNamespace();
1816 for (StringMap<std::vector<DIE*> >::const_iterator
Eric Christopher09ac3d82011-11-07 09:24:32 +00001817 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
1818 const char *Name = GI->getKeyData();
Eric Christopherfa03db02012-01-06 23:03:34 +00001819 const std::vector<DIE *> &Entities = GI->second;
Eric Christopher8bd36ea2011-11-10 21:47:55 +00001820 for (std::vector<DIE *>::const_iterator DI = Entities.begin(),
1821 DE = Entities.end(); DI != DE; ++DI)
1822 AT.AddName(Name, (*DI));
Eric Christopher09ac3d82011-11-07 09:24:32 +00001823 }
1824 }
1825
1826 AT.FinalizeTable(Asm, "namespac");
1827 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering()
1828 .getDwarfAccelNamespaceSection());
1829 MCSymbol *SectionBegin = Asm->GetTempSymbol("namespac_begin");
1830 Asm->OutStreamer.EmitLabel(SectionBegin);
1831
1832 // Emit the full data.
1833 AT.Emit(Asm, SectionBegin, this);
1834}
1835
1836/// emitAccelTypes() - Emit type dies into a hashed accelerator table.
1837void DwarfDebug::emitAccelTypes() {
Eric Christopherc36145f2012-01-06 04:35:23 +00001838 std::vector<DwarfAccelTable::Atom> Atoms;
1839 Atoms.push_back(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset,
1840 dwarf::DW_FORM_data4));
1841 Atoms.push_back(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeTag,
1842 dwarf::DW_FORM_data2));
1843 Atoms.push_back(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeTypeFlags,
1844 dwarf::DW_FORM_data1));
1845 DwarfAccelTable AT(Atoms);
Eric Christopher09ac3d82011-11-07 09:24:32 +00001846 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
1847 E = CUMap.end(); I != E; ++I) {
1848 CompileUnit *TheCU = I->second;
Eric Christopherc36145f2012-01-06 04:35:23 +00001849 const StringMap<std::vector<std::pair<DIE*, unsigned > > > &Names
1850 = TheCU->getAccelTypes();
1851 for (StringMap<std::vector<std::pair<DIE*, unsigned> > >::const_iterator
Eric Christopher09ac3d82011-11-07 09:24:32 +00001852 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
1853 const char *Name = GI->getKeyData();
Eric Christopherfa03db02012-01-06 23:03:34 +00001854 const std::vector<std::pair<DIE *, unsigned> > &Entities = GI->second;
Eric Christopherc36145f2012-01-06 04:35:23 +00001855 for (std::vector<std::pair<DIE *, unsigned> >::const_iterator DI
1856 = Entities.begin(), DE = Entities.end(); DI !=DE; ++DI)
1857 AT.AddName(Name, (*DI).first, (*DI).second);
Eric Christopher09ac3d82011-11-07 09:24:32 +00001858 }
1859 }
1860
1861 AT.FinalizeTable(Asm, "types");
1862 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering()
1863 .getDwarfAccelTypesSection());
1864 MCSymbol *SectionBegin = Asm->GetTempSymbol("types_begin");
1865 Asm->OutStreamer.EmitLabel(SectionBegin);
1866
1867 // Emit the full data.
1868 AT.Emit(Asm, SectionBegin, this);
1869}
1870
Devang Patel193f7202009-11-24 01:14:22 +00001871void DwarfDebug::emitDebugPubTypes() {
Devang Patel163a9f72010-05-10 22:49:55 +00001872 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
1873 E = CUMap.end(); I != E; ++I) {
1874 CompileUnit *TheCU = I->second;
Eric Christopher63701182011-11-07 09:18:35 +00001875 // Start the dwarf pubtypes section.
Devang Patel163a9f72010-05-10 22:49:55 +00001876 Asm->OutStreamer.SwitchSection(
1877 Asm->getObjFileLowering().getDwarfPubTypesSection());
1878 Asm->OutStreamer.AddComment("Length of Public Types Info");
1879 Asm->EmitLabelDifference(
1880 Asm->GetTempSymbol("pubtypes_end", TheCU->getID()),
1881 Asm->GetTempSymbol("pubtypes_begin", TheCU->getID()), 4);
Jim Grosbach1e20b962010-07-21 21:21:52 +00001882
Devang Patel163a9f72010-05-10 22:49:55 +00001883 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_begin",
1884 TheCU->getID()));
Jim Grosbach1e20b962010-07-21 21:21:52 +00001885
Devang Patel163a9f72010-05-10 22:49:55 +00001886 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DWARF Version");
1887 Asm->EmitInt16(dwarf::DWARF_VERSION);
Jim Grosbach1e20b962010-07-21 21:21:52 +00001888
Devang Patel163a9f72010-05-10 22:49:55 +00001889 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
1890 Asm->EmitSectionOffset(Asm->GetTempSymbol("info_begin", TheCU->getID()),
1891 DwarfInfoSectionSym);
Jim Grosbach1e20b962010-07-21 21:21:52 +00001892
Devang Patel163a9f72010-05-10 22:49:55 +00001893 Asm->OutStreamer.AddComment("Compilation Unit Length");
1894 Asm->EmitLabelDifference(Asm->GetTempSymbol("info_end", TheCU->getID()),
1895 Asm->GetTempSymbol("info_begin", TheCU->getID()),
1896 4);
Jim Grosbach1e20b962010-07-21 21:21:52 +00001897
Devang Patel163a9f72010-05-10 22:49:55 +00001898 const StringMap<DIE*> &Globals = TheCU->getGlobalTypes();
1899 for (StringMap<DIE*>::const_iterator
1900 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
1901 const char *Name = GI->getKeyData();
Nick Lewycky3bbb6f72011-07-29 03:49:23 +00001902 DIE *Entity = GI->second;
Jim Grosbach1e20b962010-07-21 21:21:52 +00001903
Devang Patel163a9f72010-05-10 22:49:55 +00001904 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
1905 Asm->EmitInt32(Entity->getOffset());
Jim Grosbach1e20b962010-07-21 21:21:52 +00001906
Devang Patel163a9f72010-05-10 22:49:55 +00001907 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("External Name");
Benjamin Kramer983c4572011-11-09 18:16:11 +00001908 // Emit the name with a terminating null byte.
Devang Patel163a9f72010-05-10 22:49:55 +00001909 Asm->OutStreamer.EmitBytes(StringRef(Name, GI->getKeyLength()+1), 0);
1910 }
Jim Grosbach1e20b962010-07-21 21:21:52 +00001911
Devang Patel163a9f72010-05-10 22:49:55 +00001912 Asm->OutStreamer.AddComment("End Mark");
Jim Grosbach1e20b962010-07-21 21:21:52 +00001913 Asm->EmitInt32(0);
Devang Patel163a9f72010-05-10 22:49:55 +00001914 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_end",
1915 TheCU->getID()));
Devang Patel193f7202009-11-24 01:14:22 +00001916 }
Devang Patel193f7202009-11-24 01:14:22 +00001917}
1918
Devang Patel2c4ceb12009-11-21 02:48:08 +00001919/// emitDebugStr - Emit visible names into a debug str section.
Bill Wendling94d04b82009-05-20 23:21:38 +00001920///
Devang Patel2c4ceb12009-11-21 02:48:08 +00001921void DwarfDebug::emitDebugStr() {
Bill Wendling94d04b82009-05-20 23:21:38 +00001922 // Check to see if it is worth the effort.
Chris Lattner0d9d70f2010-03-09 23:38:23 +00001923 if (StringPool.empty()) return;
Jim Grosbach1e20b962010-07-21 21:21:52 +00001924
Chris Lattner0d9d70f2010-03-09 23:38:23 +00001925 // Start the dwarf str section.
1926 Asm->OutStreamer.SwitchSection(
Chris Lattner6c2f9e12009-08-19 05:49:37 +00001927 Asm->getObjFileLowering().getDwarfStrSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00001928
Chris Lattnerbc733f52010-03-13 02:17:42 +00001929 // Get all of the string pool entries and put them in an array by their ID so
1930 // we can sort them.
Jim Grosbach1e20b962010-07-21 21:21:52 +00001931 SmallVector<std::pair<unsigned,
Chris Lattnerbc733f52010-03-13 02:17:42 +00001932 StringMapEntry<std::pair<MCSymbol*, unsigned> >*>, 64> Entries;
Jim Grosbach1e20b962010-07-21 21:21:52 +00001933
Chris Lattnerbc733f52010-03-13 02:17:42 +00001934 for (StringMap<std::pair<MCSymbol*, unsigned> >::iterator
1935 I = StringPool.begin(), E = StringPool.end(); I != E; ++I)
1936 Entries.push_back(std::make_pair(I->second.second, &*I));
Jim Grosbach1e20b962010-07-21 21:21:52 +00001937
Chris Lattnerbc733f52010-03-13 02:17:42 +00001938 array_pod_sort(Entries.begin(), Entries.end());
Jim Grosbach1e20b962010-07-21 21:21:52 +00001939
Chris Lattnerbc733f52010-03-13 02:17:42 +00001940 for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
Chris Lattner0d9d70f2010-03-09 23:38:23 +00001941 // Emit a label for reference from debug information entries.
Chris Lattnerbc733f52010-03-13 02:17:42 +00001942 Asm->OutStreamer.EmitLabel(Entries[i].second->getValue().first);
Jim Grosbach1e20b962010-07-21 21:21:52 +00001943
Benjamin Kramer983c4572011-11-09 18:16:11 +00001944 // Emit the string itself with a terminating null byte.
Benjamin Kramer0c45f7d2011-11-09 12:12:04 +00001945 Asm->OutStreamer.EmitBytes(StringRef(Entries[i].second->getKeyData(),
1946 Entries[i].second->getKeyLength()+1),
1947 0/*addrspace*/);
Bill Wendling94d04b82009-05-20 23:21:38 +00001948 }
1949}
1950
Devang Patel2c4ceb12009-11-21 02:48:08 +00001951/// emitDebugLoc - Emit visible names into a debug loc section.
Bill Wendling94d04b82009-05-20 23:21:38 +00001952///
Devang Patel2c4ceb12009-11-21 02:48:08 +00001953void DwarfDebug::emitDebugLoc() {
Devang Patel80250682010-05-26 23:55:23 +00001954 if (DotDebugLocEntries.empty())
1955 return;
1956
Devang Patel6c3ea902011-02-04 22:57:18 +00001957 for (SmallVector<DotDebugLocEntry, 4>::iterator
1958 I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
1959 I != E; ++I) {
1960 DotDebugLocEntry &Entry = *I;
1961 if (I + 1 != DotDebugLocEntries.end())
1962 Entry.Merge(I+1);
1963 }
1964
Daniel Dunbar83320a02011-03-16 22:16:39 +00001965 // Start the dwarf loc section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00001966 Asm->OutStreamer.SwitchSection(
Devang Patelc3f5f782010-05-25 23:40:22 +00001967 Asm->getObjFileLowering().getDwarfLocSection());
1968 unsigned char Size = Asm->getTargetData().getPointerSize();
Devang Patel80250682010-05-26 23:55:23 +00001969 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", 0));
1970 unsigned index = 1;
Jim Grosbach1e20b962010-07-21 21:21:52 +00001971 for (SmallVector<DotDebugLocEntry, 4>::iterator
1972 I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
Devang Patel61409622010-07-07 20:12:52 +00001973 I != E; ++I, ++index) {
Devang Patel6c3ea902011-02-04 22:57:18 +00001974 DotDebugLocEntry &Entry = *I;
1975 if (Entry.isMerged()) continue;
Devang Patelc3f5f782010-05-25 23:40:22 +00001976 if (Entry.isEmpty()) {
1977 Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
1978 Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
Devang Patel80250682010-05-26 23:55:23 +00001979 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", index));
Devang Patelc3f5f782010-05-25 23:40:22 +00001980 } else {
1981 Asm->OutStreamer.EmitSymbolValue(Entry.Begin, Size, 0);
1982 Asm->OutStreamer.EmitSymbolValue(Entry.End, Size, 0);
Devang Patelc26f5442011-04-28 02:22:40 +00001983 DIVariable DV(Entry.Variable);
Rafael Espindola5b23b7f2011-05-27 22:05:41 +00001984 Asm->OutStreamer.AddComment("Loc expr size");
1985 MCSymbol *begin = Asm->OutStreamer.getContext().CreateTempSymbol();
1986 MCSymbol *end = Asm->OutStreamer.getContext().CreateTempSymbol();
1987 Asm->EmitLabelDifference(end, begin, 2);
1988 Asm->OutStreamer.EmitLabel(begin);
Devang Patel80efd4e2011-07-08 16:49:43 +00001989 if (Entry.isInt()) {
Devang Patelc4329072011-06-01 22:03:25 +00001990 DIBasicType BTy(DV.getType());
1991 if (BTy.Verify() &&
1992 (BTy.getEncoding() == dwarf::DW_ATE_signed
1993 || BTy.getEncoding() == dwarf::DW_ATE_signed_char)) {
1994 Asm->OutStreamer.AddComment("DW_OP_consts");
1995 Asm->EmitInt8(dwarf::DW_OP_consts);
Devang Patel80efd4e2011-07-08 16:49:43 +00001996 Asm->EmitSLEB128(Entry.getInt());
Devang Patelc4329072011-06-01 22:03:25 +00001997 } else {
1998 Asm->OutStreamer.AddComment("DW_OP_constu");
1999 Asm->EmitInt8(dwarf::DW_OP_constu);
Devang Patel80efd4e2011-07-08 16:49:43 +00002000 Asm->EmitULEB128(Entry.getInt());
Devang Patelc4329072011-06-01 22:03:25 +00002001 }
Devang Patel80efd4e2011-07-08 16:49:43 +00002002 } else if (Entry.isLocation()) {
2003 if (!DV.hasComplexAddress())
2004 // Regular entry.
Devang Patelc26f5442011-04-28 02:22:40 +00002005 Asm->EmitDwarfRegOp(Entry.Loc);
Devang Patel80efd4e2011-07-08 16:49:43 +00002006 else {
2007 // Complex address entry.
2008 unsigned N = DV.getNumAddrElements();
2009 unsigned i = 0;
2010 if (N >= 2 && DV.getAddrElement(0) == DIBuilder::OpPlus) {
2011 if (Entry.Loc.getOffset()) {
2012 i = 2;
2013 Asm->EmitDwarfRegOp(Entry.Loc);
2014 Asm->OutStreamer.AddComment("DW_OP_deref");
2015 Asm->EmitInt8(dwarf::DW_OP_deref);
2016 Asm->OutStreamer.AddComment("DW_OP_plus_uconst");
2017 Asm->EmitInt8(dwarf::DW_OP_plus_uconst);
2018 Asm->EmitSLEB128(DV.getAddrElement(1));
2019 } else {
2020 // If first address element is OpPlus then emit
2021 // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
2022 MachineLocation Loc(Entry.Loc.getReg(), DV.getAddrElement(1));
2023 Asm->EmitDwarfRegOp(Loc);
2024 i = 2;
2025 }
2026 } else {
2027 Asm->EmitDwarfRegOp(Entry.Loc);
2028 }
2029
2030 // Emit remaining complex address elements.
2031 for (; i < N; ++i) {
2032 uint64_t Element = DV.getAddrElement(i);
2033 if (Element == DIBuilder::OpPlus) {
2034 Asm->EmitInt8(dwarf::DW_OP_plus_uconst);
2035 Asm->EmitULEB128(DV.getAddrElement(++i));
2036 } else if (Element == DIBuilder::OpDeref)
2037 Asm->EmitInt8(dwarf::DW_OP_deref);
2038 else llvm_unreachable("unknown Opcode found in complex address");
2039 }
Devang Patelc26f5442011-04-28 02:22:40 +00002040 }
Devang Patelc26f5442011-04-28 02:22:40 +00002041 }
Devang Patel80efd4e2011-07-08 16:49:43 +00002042 // else ... ignore constant fp. There is not any good way to
2043 // to represent them here in dwarf.
Rafael Espindola5b23b7f2011-05-27 22:05:41 +00002044 Asm->OutStreamer.EmitLabel(end);
Devang Patelc3f5f782010-05-25 23:40:22 +00002045 }
2046 }
Bill Wendling94d04b82009-05-20 23:21:38 +00002047}
2048
2049/// EmitDebugARanges - Emit visible names into a debug aranges section.
2050///
2051void DwarfDebug::EmitDebugARanges() {
2052 // Start the dwarf aranges section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002053 Asm->OutStreamer.SwitchSection(
2054 Asm->getObjFileLowering().getDwarfARangesSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002055}
2056
Devang Patel2c4ceb12009-11-21 02:48:08 +00002057/// emitDebugRanges - Emit visible names into a debug ranges section.
Bill Wendling94d04b82009-05-20 23:21:38 +00002058///
Devang Patel2c4ceb12009-11-21 02:48:08 +00002059void DwarfDebug::emitDebugRanges() {
Bill Wendling94d04b82009-05-20 23:21:38 +00002060 // Start the dwarf ranges section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002061 Asm->OutStreamer.SwitchSection(
Devang Patelf2548ca2010-04-16 23:33:45 +00002062 Asm->getObjFileLowering().getDwarfRangesSection());
Devang Pateleac9c072010-04-27 19:46:33 +00002063 unsigned char Size = Asm->getTargetData().getPointerSize();
2064 for (SmallVector<const MCSymbol *, 8>::iterator
Jim Grosbach1e20b962010-07-21 21:21:52 +00002065 I = DebugRangeSymbols.begin(), E = DebugRangeSymbols.end();
Devang Pateleac9c072010-04-27 19:46:33 +00002066 I != E; ++I) {
2067 if (*I)
2068 Asm->OutStreamer.EmitSymbolValue(const_cast<MCSymbol*>(*I), Size, 0);
Devang Patelf2548ca2010-04-16 23:33:45 +00002069 else
Devang Pateleac9c072010-04-27 19:46:33 +00002070 Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
Devang Patelf2548ca2010-04-16 23:33:45 +00002071 }
Bill Wendling94d04b82009-05-20 23:21:38 +00002072}
2073
Devang Patel2c4ceb12009-11-21 02:48:08 +00002074/// emitDebugMacInfo - Emit visible names into a debug macinfo section.
Bill Wendling94d04b82009-05-20 23:21:38 +00002075///
Devang Patel2c4ceb12009-11-21 02:48:08 +00002076void DwarfDebug::emitDebugMacInfo() {
Daniel Dunbarf612ff62009-09-19 20:40:05 +00002077 if (const MCSection *LineInfo =
Chris Lattner18a4c162009-08-02 07:24:22 +00002078 Asm->getObjFileLowering().getDwarfMacroInfoSection()) {
Bill Wendling94d04b82009-05-20 23:21:38 +00002079 // Start the dwarf macinfo section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002080 Asm->OutStreamer.SwitchSection(LineInfo);
Bill Wendling94d04b82009-05-20 23:21:38 +00002081 }
2082}
2083
Devang Patel2c4ceb12009-11-21 02:48:08 +00002084/// emitDebugInlineInfo - Emit inline info using following format.
Bill Wendling94d04b82009-05-20 23:21:38 +00002085/// Section Header:
2086/// 1. length of section
2087/// 2. Dwarf version number
2088/// 3. address size.
2089///
2090/// Entries (one "entry" for each function that was inlined):
2091///
2092/// 1. offset into __debug_str section for MIPS linkage name, if exists;
2093/// otherwise offset into __debug_str for regular function name.
2094/// 2. offset into __debug_str section for regular function name.
2095/// 3. an unsigned LEB128 number indicating the number of distinct inlining
2096/// instances for the function.
2097///
2098/// The rest of the entry consists of a {die_offset, low_pc} pair for each
2099/// inlined instance; the die_offset points to the inlined_subroutine die in the
2100/// __debug_info section, and the low_pc is the starting address for the
2101/// inlining instance.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002102void DwarfDebug::emitDebugInlineInfo() {
Chris Lattnerd38fee82010-04-05 00:13:49 +00002103 if (!Asm->MAI->doesDwarfUsesInlineInfoSection())
Bill Wendling94d04b82009-05-20 23:21:38 +00002104 return;
2105
Devang Patel163a9f72010-05-10 22:49:55 +00002106 if (!FirstCU)
Bill Wendling94d04b82009-05-20 23:21:38 +00002107 return;
2108
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002109 Asm->OutStreamer.SwitchSection(
2110 Asm->getObjFileLowering().getDwarfDebugInlineSection());
Chris Lattner0ad9c912010-01-22 22:09:00 +00002111
Chris Lattner233f52b2010-03-09 23:52:58 +00002112 Asm->OutStreamer.AddComment("Length of Debug Inlined Information Entry");
Chris Lattnera6437182010-04-04 19:58:12 +00002113 Asm->EmitLabelDifference(Asm->GetTempSymbol("debug_inlined_end", 1),
2114 Asm->GetTempSymbol("debug_inlined_begin", 1), 4);
Bill Wendling94d04b82009-05-20 23:21:38 +00002115
Chris Lattnerc0215722010-04-04 19:25:43 +00002116 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_begin", 1));
Bill Wendling94d04b82009-05-20 23:21:38 +00002117
Chris Lattner233f52b2010-03-09 23:52:58 +00002118 Asm->OutStreamer.AddComment("Dwarf Version");
2119 Asm->EmitInt16(dwarf::DWARF_VERSION);
2120 Asm->OutStreamer.AddComment("Address Size (in bytes)");
Chris Lattnerd38fee82010-04-05 00:13:49 +00002121 Asm->EmitInt8(Asm->getTargetData().getPointerSize());
Bill Wendling94d04b82009-05-20 23:21:38 +00002122
Devang Patele9f8f5e2010-05-07 20:54:48 +00002123 for (SmallVector<const MDNode *, 4>::iterator I = InlinedSPNodes.begin(),
Devang Patel53bb5c92009-11-10 23:06:00 +00002124 E = InlinedSPNodes.end(); I != E; ++I) {
Jim Grosbach31ef40e2009-11-21 23:12:12 +00002125
Devang Patele9f8f5e2010-05-07 20:54:48 +00002126 const MDNode *Node = *I;
2127 DenseMap<const MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator II
Jim Grosbach7ab38df2009-11-22 19:20:36 +00002128 = InlineInfo.find(Node);
Devang Patel53bb5c92009-11-10 23:06:00 +00002129 SmallVector<InlineInfoLabels, 4> &Labels = II->second;
Devang Patele4b27562009-08-28 23:24:31 +00002130 DISubprogram SP(Node);
Devang Patel65dbc902009-11-25 17:36:49 +00002131 StringRef LName = SP.getLinkageName();
2132 StringRef Name = SP.getName();
Bill Wendling94d04b82009-05-20 23:21:38 +00002133
Chris Lattner233f52b2010-03-09 23:52:58 +00002134 Asm->OutStreamer.AddComment("MIPS linkage name");
Chris Lattner4cf202b2010-01-23 03:11:46 +00002135 if (LName.empty()) {
2136 Asm->OutStreamer.EmitBytes(Name, 0);
2137 Asm->OutStreamer.EmitIntValue(0, 1, 0); // nul terminator.
Jim Grosbach1e20b962010-07-21 21:21:52 +00002138 } else
Chris Lattner6189ed12010-04-04 23:25:33 +00002139 Asm->EmitSectionOffset(getStringPoolEntry(getRealLinkageName(LName)),
2140 DwarfStrSectionSym);
Devang Patel53bb5c92009-11-10 23:06:00 +00002141
Chris Lattner233f52b2010-03-09 23:52:58 +00002142 Asm->OutStreamer.AddComment("Function name");
Chris Lattner6189ed12010-04-04 23:25:33 +00002143 Asm->EmitSectionOffset(getStringPoolEntry(Name), DwarfStrSectionSym);
Chris Lattner7e1a8f82010-04-04 19:09:29 +00002144 Asm->EmitULEB128(Labels.size(), "Inline count");
Bill Wendling94d04b82009-05-20 23:21:38 +00002145
Devang Patel53bb5c92009-11-10 23:06:00 +00002146 for (SmallVector<InlineInfoLabels, 4>::iterator LI = Labels.begin(),
Bill Wendling94d04b82009-05-20 23:21:38 +00002147 LE = Labels.end(); LI != LE; ++LI) {
Chris Lattner3f53c832010-04-04 18:52:31 +00002148 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
Chris Lattner6ed0f902010-03-09 00:31:02 +00002149 Asm->EmitInt32(LI->second->getOffset());
Bill Wendling94d04b82009-05-20 23:21:38 +00002150
Chris Lattner3f53c832010-04-04 18:52:31 +00002151 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("low_pc");
Chris Lattnerd38fee82010-04-05 00:13:49 +00002152 Asm->OutStreamer.EmitSymbolValue(LI->first,
2153 Asm->getTargetData().getPointerSize(),0);
Bill Wendling94d04b82009-05-20 23:21:38 +00002154 }
2155 }
2156
Chris Lattnerc0215722010-04-04 19:25:43 +00002157 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_end", 1));
Bill Wendling94d04b82009-05-20 23:21:38 +00002158}