blob: 20507f56163c705c3a0c84ede88c03553a439987 [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"
Devang Patel8b9df622011-04-12 17:40:32 +000017#include "DwarfCompileUnit.h"
Bill Wendling57fbba42010-04-05 22:59:21 +000018#include "llvm/Constants.h"
Bill Wendling0310d762009-05-15 09:23:25 +000019#include "llvm/Module.h"
Devang Patele449d1f2011-01-20 00:02:16 +000020#include "llvm/Instructions.h"
David Greeneb2c66fc2009-08-19 21:52:55 +000021#include "llvm/CodeGen/MachineFunction.h"
Bill Wendling0310d762009-05-15 09:23:25 +000022#include "llvm/CodeGen/MachineModuleInfo.h"
Chris Lattnerb7db7332010-03-09 01:58:53 +000023#include "llvm/MC/MCAsmInfo.h"
Chris Lattnera87dea42009-07-31 18:48:30 +000024#include "llvm/MC/MCSection.h"
Chris Lattner6c2f9e12009-08-19 05:49:37 +000025#include "llvm/MC/MCStreamer.h"
Chris Lattnerb7db7332010-03-09 01:58:53 +000026#include "llvm/MC/MCSymbol.h"
Chris Lattner45111d12010-01-16 21:57:06 +000027#include "llvm/Target/Mangler.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
Devang Pateleac9c072010-04-27 19:46:33 +000048static cl::opt<bool> PrintDbgScope("print-dbgscope", cl::Hidden,
49 cl::desc("Print DbgScope information for each machine instruction"));
50
Jim Grosbach1e20b962010-07-21 21:21:52 +000051static cl::opt<bool> DisableDebugInfoPrinting("disable-debug-info-print",
Devang Patel61409622010-07-07 20:12:52 +000052 cl::Hidden,
Devang Pateleac9c072010-04-27 19:46:33 +000053 cl::desc("Disable debug info printing"));
54
Dan Gohman281d65d2010-05-07 01:08:53 +000055static cl::opt<bool> UnknownLocations("use-unknown-locations", cl::Hidden,
Chris Lattner7a2bdde2011-04-15 05:18:47 +000056 cl::desc("Make an absence of debug location information explicit."),
Dan Gohman281d65d2010-05-07 01:08:53 +000057 cl::init(false));
58
Bill Wendling5f017e82010-04-07 09:28:04 +000059namespace {
60 const char *DWARFGroupName = "DWARF Emission";
61 const char *DbgTimerName = "DWARF Debug Writer";
62} // end anonymous namespace
63
Bill Wendling0310d762009-05-15 09:23:25 +000064//===----------------------------------------------------------------------===//
65
66/// Configuration values for initial hash set sizes (log2).
67///
Bill Wendling0310d762009-05-15 09:23:25 +000068static const unsigned InitAbbreviationsSetSize = 9; // log2(512)
Bill Wendling0310d762009-05-15 09:23:25 +000069
70namespace llvm {
71
Nick Lewycky3bbb6f72011-07-29 03:49:23 +000072DIType DbgVariable::getType() const {
Devang Patel3cbee302011-04-12 22:53:02 +000073 DIType Ty = Var.getType();
74 // FIXME: isBlockByrefVariable should be reformulated in terms of complex
75 // addresses instead.
76 if (Var.isBlockByrefVariable()) {
77 /* Byref variables, in Blocks, are declared by the programmer as
78 "SomeType VarName;", but the compiler creates a
79 __Block_byref_x_VarName struct, and gives the variable VarName
80 either the struct, or a pointer to the struct, as its type. This
81 is necessary for various behind-the-scenes things the compiler
82 needs to do with by-reference variables in blocks.
83
84 However, as far as the original *programmer* is concerned, the
85 variable should still have type 'SomeType', as originally declared.
86
87 The following function dives into the __Block_byref_x_VarName
88 struct to find the original type of the variable. This will be
89 passed back to the code generating the type for the Debug
90 Information Entry for the variable 'VarName'. 'VarName' will then
91 have the original type 'SomeType' in its debug information.
92
93 The original type 'SomeType' will be the type of the field named
94 'VarName' inside the __Block_byref_x_VarName struct.
95
96 NOTE: In order for this to not completely fail on the debugger
97 side, the Debug Information Entry for the variable VarName needs to
98 have a DW_AT_location that tells the debugger how to unwind through
99 the pointers and __Block_byref_x_VarName struct to find the actual
100 value of the variable. The function addBlockByrefType does this. */
101 DIType subType = Ty;
102 unsigned tag = Ty.getTag();
103
104 if (tag == dwarf::DW_TAG_pointer_type) {
105 DIDerivedType DTy = DIDerivedType(Ty);
106 subType = DTy.getTypeDerivedFrom();
107 }
108
109 DICompositeType blockStruct = DICompositeType(subType);
110 DIArray Elements = blockStruct.getTypeArray();
111
112 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
113 DIDescriptor Element = Elements.getElement(i);
114 DIDerivedType DT = DIDerivedType(Element);
115 if (getName() == DT.getName())
116 return (DT.getTypeDerivedFrom());
Devang Patel8bd11de2010-08-09 21:01:39 +0000117 }
118 return Ty;
119 }
Devang Patel3cbee302011-04-12 22:53:02 +0000120 return Ty;
121}
Bill Wendling0310d762009-05-15 09:23:25 +0000122
123//===----------------------------------------------------------------------===//
Devang Pateleac9c072010-04-27 19:46:33 +0000124/// DbgRange - This is used to track range of instructions with identical
125/// debug info scope.
126///
127typedef std::pair<const MachineInstr *, const MachineInstr *> DbgRange;
128
129//===----------------------------------------------------------------------===//
Bill Wendling0310d762009-05-15 09:23:25 +0000130/// DbgScope - This class is used to track scope information.
131///
Devang Patelf76a3d62009-11-16 21:53:40 +0000132class DbgScope {
Bill Wendling0310d762009-05-15 09:23:25 +0000133 DbgScope *Parent; // Parent to this scope.
Jim Grosbach31ef40e2009-11-21 23:12:12 +0000134 DIDescriptor Desc; // Debug info descriptor for scope.
Devang Patel3139fcf2010-01-26 21:39:14 +0000135 // Location at which this scope is inlined.
Jim Grosbach1e20b962010-07-21 21:21:52 +0000136 AssertingVH<const MDNode> InlinedAtLocation;
Devang Patel53bb5c92009-11-10 23:06:00 +0000137 bool AbstractScope; // Abstract Scope
Devang Pateld38dd112009-10-01 18:25:23 +0000138 const MachineInstr *LastInsn; // Last instruction of this scope.
139 const MachineInstr *FirstInsn; // First instruction of this scope.
Devang Pateleac9c072010-04-27 19:46:33 +0000140 unsigned DFSIn, DFSOut;
Jeffrey Yasskin5c213dc2010-03-12 17:45:06 +0000141 // Scopes defined in scope. Contents not owned.
142 SmallVector<DbgScope *, 4> Scopes;
143 // Variables declared in scope. Contents owned.
144 SmallVector<DbgVariable *, 8> Variables;
Devang Pateleac9c072010-04-27 19:46:33 +0000145 SmallVector<DbgRange, 4> Ranges;
Owen Anderson04c05f72009-06-24 22:53:20 +0000146 // Private state for dump()
147 mutable unsigned IndentLevel;
Bill Wendling0310d762009-05-15 09:23:25 +0000148public:
Devang Patele9f8f5e2010-05-07 20:54:48 +0000149 DbgScope(DbgScope *P, DIDescriptor D, const MDNode *I = 0)
Devang Patel53bb5c92009-11-10 23:06:00 +0000150 : Parent(P), Desc(D), InlinedAtLocation(I), AbstractScope(false),
Devang Pateleac9c072010-04-27 19:46:33 +0000151 LastInsn(0), FirstInsn(0),
Devang Patelc0405292011-08-08 18:22:10 +0000152 DFSIn(0), DFSOut(0), IndentLevel(0) {
153 if (Parent)
154 Parent->addScope(this);
155 }
Bill Wendling0310d762009-05-15 09:23:25 +0000156 virtual ~DbgScope();
157
158 // Accessors.
159 DbgScope *getParent() const { return Parent; }
160 DIDescriptor getDesc() const { return Desc; }
Devang Patele9f8f5e2010-05-07 20:54:48 +0000161 const MDNode *getInlinedAt() const { return InlinedAtLocation; }
162 const MDNode *getScopeNode() const { return Desc; }
Jeffrey Yasskin5c213dc2010-03-12 17:45:06 +0000163 const SmallVector<DbgScope *, 4> &getScopes() { return Scopes; }
Devang Patele03161c2010-08-09 18:51:29 +0000164 const SmallVector<DbgVariable *, 8> &getDbgVariables() { return Variables; }
Devang Pateleac9c072010-04-27 19:46:33 +0000165 const SmallVector<DbgRange, 4> &getRanges() { return Ranges; }
166
167 /// openInsnRange - This scope covers instruction range starting from MI.
168 void openInsnRange(const MachineInstr *MI) {
Jim Grosbach1e20b962010-07-21 21:21:52 +0000169 if (!FirstInsn)
Devang Pateleac9c072010-04-27 19:46:33 +0000170 FirstInsn = MI;
Jim Grosbach1e20b962010-07-21 21:21:52 +0000171
Devang Pateleac9c072010-04-27 19:46:33 +0000172 if (Parent)
173 Parent->openInsnRange(MI);
174 }
175
Jim Grosbach1e20b962010-07-21 21:21:52 +0000176 /// extendInsnRange - Extend the current instruction range covered by
Devang Pateleac9c072010-04-27 19:46:33 +0000177 /// this scope.
178 void extendInsnRange(const MachineInstr *MI) {
179 assert (FirstInsn && "MI Range is not open!");
180 LastInsn = MI;
181 if (Parent)
182 Parent->extendInsnRange(MI);
183 }
184
185 /// closeInsnRange - Create a range based on FirstInsn and LastInsn collected
186 /// until now. This is used when a new scope is encountered while walking
187 /// machine instructions.
188 void closeInsnRange(DbgScope *NewScope = NULL) {
189 assert (LastInsn && "Last insn missing!");
190 Ranges.push_back(DbgRange(FirstInsn, LastInsn));
Jim Grosbach1e20b962010-07-21 21:21:52 +0000191 FirstInsn = NULL;
Devang Pateleac9c072010-04-27 19:46:33 +0000192 LastInsn = NULL;
Jim Grosbach1e20b962010-07-21 21:21:52 +0000193 // If Parent dominates NewScope then do not close Parent's instruction
Devang Pateleac9c072010-04-27 19:46:33 +0000194 // range.
195 if (Parent && (!NewScope || !Parent->dominates(NewScope)))
196 Parent->closeInsnRange(NewScope);
197 }
198
Devang Patel53bb5c92009-11-10 23:06:00 +0000199 void setAbstractScope() { AbstractScope = true; }
200 bool isAbstractScope() const { return AbstractScope; }
Devang Pateleac9c072010-04-27 19:46:33 +0000201
Nick Lewycky3bbb6f72011-07-29 03:49:23 +0000202 // Depth First Search support to walk and manipulate DbgScope hierarchy.
Devang Pateleac9c072010-04-27 19:46:33 +0000203 unsigned getDFSOut() const { return DFSOut; }
204 void setDFSOut(unsigned O) { DFSOut = O; }
205 unsigned getDFSIn() const { return DFSIn; }
206 void setDFSIn(unsigned I) { DFSIn = I; }
207 bool dominates(const DbgScope *S) {
Jim Grosbach1e20b962010-07-21 21:21:52 +0000208 if (S == this)
Devang Pateleac9c072010-04-27 19:46:33 +0000209 return true;
210 if (DFSIn < S->getDFSIn() && DFSOut > S->getDFSOut())
211 return true;
212 return false;
213 }
Devang Patel53bb5c92009-11-10 23:06:00 +0000214
Devang Patel2c4ceb12009-11-21 02:48:08 +0000215 /// addScope - Add a scope to the scope.
Bill Wendling0310d762009-05-15 09:23:25 +0000216 ///
Devang Patel2c4ceb12009-11-21 02:48:08 +0000217 void addScope(DbgScope *S) { Scopes.push_back(S); }
Bill Wendling0310d762009-05-15 09:23:25 +0000218
Devang Patel2c4ceb12009-11-21 02:48:08 +0000219 /// addVariable - Add a variable to the scope.
Bill Wendling0310d762009-05-15 09:23:25 +0000220 ///
Devang Patel2c4ceb12009-11-21 02:48:08 +0000221 void addVariable(DbgVariable *V) { Variables.push_back(V); }
Bill Wendling0310d762009-05-15 09:23:25 +0000222
Bill Wendling0310d762009-05-15 09:23:25 +0000223#ifndef NDEBUG
224 void dump() const;
225#endif
226};
Devang Pateleac9c072010-04-27 19:46:33 +0000227
Chris Lattnerea761862010-04-05 04:09:20 +0000228} // end llvm namespace
Bill Wendling0310d762009-05-15 09:23:25 +0000229
230#ifndef NDEBUG
231void DbgScope::dump() const {
David Greenef83adbc2009-12-24 00:31:35 +0000232 raw_ostream &err = dbgs();
Chris Lattnerc281de12009-08-23 00:51:00 +0000233 err.indent(IndentLevel);
Devang Patel4f455d62011-07-14 22:30:56 +0000234 err << "DFSIn: " << DFSIn << " DFSOut: " << DFSOut << "\n";
Devang Patele9f8f5e2010-05-07 20:54:48 +0000235 const MDNode *N = Desc;
Devang Patel53bb5c92009-11-10 23:06:00 +0000236 N->dump();
Devang Patel53bb5c92009-11-10 23:06:00 +0000237 if (AbstractScope)
238 err << "Abstract Scope\n";
Bill Wendling0310d762009-05-15 09:23:25 +0000239
240 IndentLevel += 2;
Devang Patel53bb5c92009-11-10 23:06:00 +0000241 if (!Scopes.empty())
242 err << "Children ...\n";
Bill Wendling0310d762009-05-15 09:23:25 +0000243 for (unsigned i = 0, e = Scopes.size(); i != e; ++i)
244 if (Scopes[i] != this)
245 Scopes[i]->dump();
246
247 IndentLevel -= 2;
248}
249#endif
250
Bill Wendling0310d762009-05-15 09:23:25 +0000251DbgScope::~DbgScope() {
Bill Wendling0310d762009-05-15 09:23:25 +0000252 for (unsigned j = 0, M = Variables.size(); j < M; ++j)
253 delete Variables[j];
Bill Wendling0310d762009-05-15 09:23:25 +0000254}
255
Chris Lattner49cd6642010-04-05 05:11:15 +0000256DwarfDebug::DwarfDebug(AsmPrinter *A, Module *M)
Devang Patel163a9f72010-05-10 22:49:55 +0000257 : Asm(A), MMI(Asm->MMI), FirstCU(0),
Jim Grosbach1e20b962010-07-21 21:21:52 +0000258 AbbreviationsSet(InitAbbreviationsSetSize),
Devang Patelf2548ca2010-04-16 23:33:45 +0000259 CurrentFnDbgScope(0), PrevLabel(NULL) {
Chris Lattnerbc733f52010-03-13 02:17:42 +0000260 NextStringPoolNumber = 0;
Jim Grosbach1e20b962010-07-21 21:21:52 +0000261
Rafael Espindolaf2b04232011-05-06 14:56:22 +0000262 DwarfInfoSectionSym = DwarfAbbrevSectionSym = 0;
Chris Lattner4ad1efe2010-04-04 23:10:38 +0000263 DwarfStrSectionSym = TextSectionSym = 0;
Jim Grosbach1e20b962010-07-21 21:21:52 +0000264 DwarfDebugRangeSectionSym = DwarfDebugLocSectionSym = 0;
Devang Patelc3f5f782010-05-25 23:40:22 +0000265 FunctionBeginSym = FunctionEndSym = 0;
Dan Gohman03c3dc72010-06-18 15:56:31 +0000266 {
267 NamedRegionTimer T(DbgTimerName, DWARFGroupName, TimePassesIsEnabled);
268 beginModule(M);
Torok Edwin9c421072010-04-07 10:44:46 +0000269 }
Bill Wendling0310d762009-05-15 09:23:25 +0000270}
271DwarfDebug::~DwarfDebug() {
Bill Wendling0310d762009-05-15 09:23:25 +0000272}
273
Chris Lattnerbc733f52010-03-13 02:17:42 +0000274MCSymbol *DwarfDebug::getStringPoolEntry(StringRef Str) {
275 std::pair<MCSymbol*, unsigned> &Entry = StringPool[Str];
276 if (Entry.first) return Entry.first;
277
278 Entry.second = NextStringPoolNumber++;
Chris Lattnerc0215722010-04-04 19:25:43 +0000279 return Entry.first = Asm->GetTempSymbol("string", Entry.second);
Chris Lattnerbc733f52010-03-13 02:17:42 +0000280}
281
282
Devang Patel2c4ceb12009-11-21 02:48:08 +0000283/// assignAbbrevNumber - Define a unique number for the abbreviation.
Bill Wendling0310d762009-05-15 09:23:25 +0000284///
Devang Patel2c4ceb12009-11-21 02:48:08 +0000285void DwarfDebug::assignAbbrevNumber(DIEAbbrev &Abbrev) {
Bill Wendling0310d762009-05-15 09:23:25 +0000286 // Profile the node so that we can make it unique.
287 FoldingSetNodeID ID;
288 Abbrev.Profile(ID);
289
290 // Check the set for priors.
291 DIEAbbrev *InSet = AbbreviationsSet.GetOrInsertNode(&Abbrev);
292
293 // If it's newly added.
294 if (InSet == &Abbrev) {
295 // Add to abbreviation list.
296 Abbreviations.push_back(&Abbrev);
297
298 // Assign the vector position + 1 as its number.
299 Abbrev.setNumber(Abbreviations.size());
300 } else {
301 // Assign existing abbreviation number.
302 Abbrev.setNumber(InSet->getNumber());
303 }
304}
305
Jim Grosbach1e20b962010-07-21 21:21:52 +0000306/// getRealLinkageName - If special LLVM prefix that is used to inform the asm
Devang Patel351ca332010-01-05 01:46:14 +0000307/// printer to not emit usual symbol prefix before the symbol name is used then
308/// return linkage name after skipping this special LLVM prefix.
309static StringRef getRealLinkageName(StringRef LinkageName) {
310 char One = '\1';
311 if (LinkageName.startswith(StringRef(&One, 1)))
312 return LinkageName.substr(1);
313 return LinkageName;
314}
315
Devang Patelffe966c2009-12-14 16:18:45 +0000316/// createSubprogramDIE - Create new DIE using SP.
Devang Patelee70fa72010-09-27 23:15:27 +0000317DIE *DwarfDebug::createSubprogramDIE(DISubprogram SP) {
Devang Patel163a9f72010-05-10 22:49:55 +0000318 CompileUnit *SPCU = getCompileUnit(SP);
319 DIE *SPDie = SPCU->getDIE(SP);
Devang Patelffe966c2009-12-14 16:18:45 +0000320 if (SPDie)
321 return SPDie;
322
323 SPDie = new DIE(dwarf::DW_TAG_subprogram);
Devang Patel5e06bb82011-04-22 23:10:17 +0000324
325 // DW_TAG_inlined_subroutine may refer to this DIE.
326 SPCU->insertDIE(SP, SPDie);
327
328 // Add to context owner.
329 SPCU->addToContextOwner(SPDie, SP.getContext());
330
331 // Add function template parameters.
332 SPCU->addTemplateParams(*SPDie, SP.getTemplateParams());
333
Devang Patelee4a3ab2011-05-03 21:50:34 +0000334 StringRef LinkageName = SP.getLinkageName();
335 if (!LinkageName.empty())
336 SPCU->addString(SPDie, dwarf::DW_AT_MIPS_linkage_name, dwarf::DW_FORM_string,
337 getRealLinkageName(LinkageName));
338
Devang Patel5e06bb82011-04-22 23:10:17 +0000339 // If this DIE is going to refer declaration info using AT_specification
340 // then there is no need to add other attributes.
341 if (SP.getFunctionDeclaration().isSubprogram())
342 return SPDie;
343
Devang Patel1eac3e72010-03-02 17:58:15 +0000344 // Constructors and operators for anonymous aggregates do not have names.
Devang Patel6b506cb2010-03-02 01:26:20 +0000345 if (!SP.getName().empty())
Devang Patel3cbee302011-04-12 22:53:02 +0000346 SPCU->addString(SPDie, dwarf::DW_AT_name, dwarf::DW_FORM_string,
347 SP.getName());
Bill Wendling0310d762009-05-15 09:23:25 +0000348
Devang Patel3cbee302011-04-12 22:53:02 +0000349 SPCU->addSourceLine(SPDie, SP);
Bill Wendling0310d762009-05-15 09:23:25 +0000350
Devang Patel7b172c62010-10-07 22:03:01 +0000351 if (SP.isPrototyped())
Devang Patel3cbee302011-04-12 22:53:02 +0000352 SPCU->addUInt(SPDie, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
Devang Patel5e06bb82011-04-22 23:10:17 +0000353
Bill Wendling0310d762009-05-15 09:23:25 +0000354 // Add Return Type.
Devang Patel1d5cc1d2009-12-03 01:25:38 +0000355 DICompositeType SPTy = SP.getType();
356 DIArray Args = SPTy.getTypeArray();
Bill Wendling0310d762009-05-15 09:23:25 +0000357 unsigned SPTag = SPTy.getTag();
Devang Patel5d11eb02009-12-03 19:11:07 +0000358
Devang Patel3c91b052010-03-08 20:52:55 +0000359 if (Args.getNumElements() == 0 || SPTag != dwarf::DW_TAG_subroutine_type)
Devang Patel3cbee302011-04-12 22:53:02 +0000360 SPCU->addType(SPDie, SPTy);
Devang Patel1d5cc1d2009-12-03 01:25:38 +0000361 else
Devang Patel3cbee302011-04-12 22:53:02 +0000362 SPCU->addType(SPDie, DIType(Args.getElement(0)));
Devang Patel1d5cc1d2009-12-03 01:25:38 +0000363
Devang Patel5d11eb02009-12-03 19:11:07 +0000364 unsigned VK = SP.getVirtuality();
365 if (VK) {
Devang Patel3cbee302011-04-12 22:53:02 +0000366 SPCU->addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_flag, VK);
367 DIEBlock *Block = SPCU->getDIEBlock();
368 SPCU->addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
369 SPCU->addUInt(Block, 0, dwarf::DW_FORM_udata, SP.getVirtualIndex());
370 SPCU->addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, 0, Block);
Jim Grosbach1e20b962010-07-21 21:21:52 +0000371 ContainingTypeMap.insert(std::make_pair(SPDie,
Devang Patel2db49d72010-05-07 18:11:54 +0000372 SP.getContainingType()));
Devang Patel5d11eb02009-12-03 19:11:07 +0000373 }
374
Devang Patelee70fa72010-09-27 23:15:27 +0000375 if (!SP.isDefinition()) {
Devang Patel3cbee302011-04-12 22:53:02 +0000376 SPCU->addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
377
Bill Wendling0310d762009-05-15 09:23:25 +0000378 // Add arguments. Do not add arguments for subprogram definition. They will
Devang Patel1d5cc1d2009-12-03 01:25:38 +0000379 // be handled while processing variables.
380 DICompositeType SPTy = SP.getType();
381 DIArray Args = SPTy.getTypeArray();
382 unsigned SPTag = SPTy.getTag();
383
Bill Wendling0310d762009-05-15 09:23:25 +0000384 if (SPTag == dwarf::DW_TAG_subroutine_type)
385 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
386 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
Devang Patel2db49d72010-05-07 18:11:54 +0000387 DIType ATy = DIType(DIType(Args.getElement(i)));
Devang Patel3cbee302011-04-12 22:53:02 +0000388 SPCU->addType(Arg, ATy);
Devang Patelb4645642010-02-06 01:02:37 +0000389 if (ATy.isArtificial())
Devang Patel3cbee302011-04-12 22:53:02 +0000390 SPCU->addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
Devang Patel2c4ceb12009-11-21 02:48:08 +0000391 SPDie->addChild(Arg);
Bill Wendling0310d762009-05-15 09:23:25 +0000392 }
393 }
394
Devang Patel4e0d19d2010-02-03 19:57:19 +0000395 if (SP.isArtificial())
Devang Patel3cbee302011-04-12 22:53:02 +0000396 SPCU->addUInt(SPDie, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
Devang Patel4e0d19d2010-02-03 19:57:19 +0000397
Devang Patelccff8122010-04-30 19:38:23 +0000398 if (!SP.isLocalToUnit())
Devang Patel3cbee302011-04-12 22:53:02 +0000399 SPCU->addUInt(SPDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
Jim Grosbach1e20b962010-07-21 21:21:52 +0000400
Devang Patelccff8122010-04-30 19:38:23 +0000401 if (SP.isOptimized())
Devang Patel3cbee302011-04-12 22:53:02 +0000402 SPCU->addUInt(SPDie, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1);
Devang Patelccff8122010-04-30 19:38:23 +0000403
Jim Grosbach91729002010-07-21 23:03:52 +0000404 if (unsigned isa = Asm->getISAEncoding()) {
Devang Patel3cbee302011-04-12 22:53:02 +0000405 SPCU->addUInt(SPDie, dwarf::DW_AT_APPLE_isa, dwarf::DW_FORM_flag, isa);
Jim Grosbach91729002010-07-21 23:03:52 +0000406 }
407
Bill Wendling0310d762009-05-15 09:23:25 +0000408 return SPDie;
409}
410
Devang Patele9f8f5e2010-05-07 20:54:48 +0000411DbgScope *DwarfDebug::getOrCreateAbstractScope(const MDNode *N) {
Chris Lattnered7a77b2010-03-31 05:36:29 +0000412 assert(N && "Invalid Scope encoding!");
Devang Patel53bb5c92009-11-10 23:06:00 +0000413
414 DbgScope *AScope = AbstractScopes.lookup(N);
415 if (AScope)
416 return AScope;
Jim Grosbach31ef40e2009-11-21 23:12:12 +0000417
Devang Patel53bb5c92009-11-10 23:06:00 +0000418 DbgScope *Parent = NULL;
419
420 DIDescriptor Scope(N);
421 if (Scope.isLexicalBlock()) {
422 DILexicalBlock DB(N);
423 DIDescriptor ParentDesc = DB.getContext();
Devang Patel2db49d72010-05-07 18:11:54 +0000424 Parent = getOrCreateAbstractScope(ParentDesc);
Devang Patel53bb5c92009-11-10 23:06:00 +0000425 }
Devang Patel53bb5c92009-11-10 23:06:00 +0000426 AScope = new DbgScope(Parent, DIDescriptor(N), NULL);
Devang Patel53bb5c92009-11-10 23:06:00 +0000427 AScope->setAbstractScope();
428 AbstractScopes[N] = AScope;
429 if (DIDescriptor(N).isSubprogram())
430 AbstractScopesList.push_back(AScope);
431 return AScope;
432}
Devang Patelaf9e8472009-10-01 20:31:14 +0000433
Devang Patel5f094002010-04-06 23:53:48 +0000434/// isSubprogramContext - Return true if Context is either a subprogram
435/// or another context nested inside a subprogram.
Devang Patele9f8f5e2010-05-07 20:54:48 +0000436static bool isSubprogramContext(const MDNode *Context) {
Devang Patel5f094002010-04-06 23:53:48 +0000437 if (!Context)
438 return false;
439 DIDescriptor D(Context);
440 if (D.isSubprogram())
441 return true;
442 if (D.isType())
Devang Patel2db49d72010-05-07 18:11:54 +0000443 return isSubprogramContext(DIType(Context).getContext());
Devang Patel5f094002010-04-06 23:53:48 +0000444 return false;
445}
446
Jim Grosbach31ef40e2009-11-21 23:12:12 +0000447/// updateSubprogramScopeDIE - Find DIE for the given subprogram and
Devang Patel2c4ceb12009-11-21 02:48:08 +0000448/// attach appropriate DW_AT_low_pc and DW_AT_high_pc attributes.
449/// If there are global variables in this scope then create and insert
450/// DIEs for these variables.
Devang Patele9f8f5e2010-05-07 20:54:48 +0000451DIE *DwarfDebug::updateSubprogramScopeDIE(const MDNode *SPNode) {
Devang Patel163a9f72010-05-10 22:49:55 +0000452 CompileUnit *SPCU = getCompileUnit(SPNode);
453 DIE *SPDie = SPCU->getDIE(SPNode);
Devang Patel8aa61472010-07-07 22:20:57 +0000454
Chris Lattnerd38fee82010-04-05 00:13:49 +0000455 assert(SPDie && "Unable to find subprogram DIE!");
456 DISubprogram SP(SPNode);
Jim Grosbach1e20b962010-07-21 21:21:52 +0000457
Devang Patel5e06bb82011-04-22 23:10:17 +0000458 DISubprogram SPDecl = SP.getFunctionDeclaration();
459 if (SPDecl.isSubprogram())
460 // Refer function declaration directly.
Devang Patel3cbee302011-04-12 22:53:02 +0000461 SPCU->addDIEEntry(SPDie, dwarf::DW_AT_specification, dwarf::DW_FORM_ref4,
Devang Patel5e06bb82011-04-22 23:10:17 +0000462 createSubprogramDIE(SPDecl));
463 else {
464 // There is not any need to generate specification DIE for a function
465 // defined at compile unit level. If a function is defined inside another
466 // function then gdb prefers the definition at top level and but does not
467 // expect specification DIE in parent function. So avoid creating
468 // specification DIE for a function defined inside a function.
469 if (SP.isDefinition() && !SP.getContext().isCompileUnit() &&
470 !SP.getContext().isFile() &&
471 !isSubprogramContext(SP.getContext())) {
472 SPCU-> addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
473
474 // Add arguments.
475 DICompositeType SPTy = SP.getType();
476 DIArray Args = SPTy.getTypeArray();
477 unsigned SPTag = SPTy.getTag();
478 if (SPTag == dwarf::DW_TAG_subroutine_type)
479 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
480 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
481 DIType ATy = DIType(DIType(Args.getElement(i)));
482 SPCU->addType(Arg, ATy);
483 if (ATy.isArtificial())
484 SPCU->addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
485 SPDie->addChild(Arg);
486 }
487 DIE *SPDeclDie = SPDie;
488 SPDie = new DIE(dwarf::DW_TAG_subprogram);
489 SPCU->addDIEEntry(SPDie, dwarf::DW_AT_specification, dwarf::DW_FORM_ref4,
490 SPDeclDie);
491 SPCU->addDie(SPDie);
492 }
Chris Lattnerd38fee82010-04-05 00:13:49 +0000493 }
Devang Patel8aa61472010-07-07 22:20:57 +0000494 // Pick up abstract subprogram DIE.
495 if (DIE *AbsSPDIE = AbstractSPDies.lookup(SPNode)) {
496 SPDie = new DIE(dwarf::DW_TAG_subprogram);
Devang Patel3cbee302011-04-12 22:53:02 +0000497 SPCU->addDIEEntry(SPDie, dwarf::DW_AT_abstract_origin,
498 dwarf::DW_FORM_ref4, AbsSPDIE);
Devang Patel8aa61472010-07-07 22:20:57 +0000499 SPCU->addDie(SPDie);
500 }
501
Devang Patel3cbee302011-04-12 22:53:02 +0000502 SPCU->addLabel(SPDie, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
503 Asm->GetTempSymbol("func_begin", Asm->getFunctionNumber()));
504 SPCU->addLabel(SPDie, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
505 Asm->GetTempSymbol("func_end", Asm->getFunctionNumber()));
Chris Lattnerd38fee82010-04-05 00:13:49 +0000506 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
507 MachineLocation Location(RI->getFrameRegister(*Asm->MF));
Devang Patel3cbee302011-04-12 22:53:02 +0000508 SPCU->addAddress(SPDie, dwarf::DW_AT_frame_base, Location);
Devang Patelb4645642010-02-06 01:02:37 +0000509
Chris Lattnerd38fee82010-04-05 00:13:49 +0000510 return SPDie;
Devang Patel53bb5c92009-11-10 23:06:00 +0000511}
512
Jim Grosbach31ef40e2009-11-21 23:12:12 +0000513/// constructLexicalScope - Construct new DW_TAG_lexical_block
Devang Patel2c4ceb12009-11-21 02:48:08 +0000514/// for this scope and attach DW_AT_low_pc/DW_AT_high_pc labels.
515DIE *DwarfDebug::constructLexicalScopeDIE(DbgScope *Scope) {
Devang Pateleac9c072010-04-27 19:46:33 +0000516
517 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_lexical_block);
518 if (Scope->isAbstractScope())
519 return ScopeDIE;
520
521 const SmallVector<DbgRange, 4> &Ranges = Scope->getRanges();
522 if (Ranges.empty())
523 return 0;
524
Devang Patel3cbee302011-04-12 22:53:02 +0000525 CompileUnit *TheCU = getCompileUnit(Scope->getScopeNode());
Devang Pateleac9c072010-04-27 19:46:33 +0000526 SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin();
527 if (Ranges.size() > 1) {
528 // .debug_range section has not been laid out yet. Emit offset in
Jim Grosbach1e20b962010-07-21 21:21:52 +0000529 // .debug_range as a uint, size 4, for now. emitDIE will handle
Devang Pateleac9c072010-04-27 19:46:33 +0000530 // DW_AT_ranges appropriately.
Devang Patel3cbee302011-04-12 22:53:02 +0000531 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_ranges, dwarf::DW_FORM_data4,
532 DebugRangeSymbols.size() * Asm->getTargetData().getPointerSize());
Devang Pateleac9c072010-04-27 19:46:33 +0000533 for (SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin(),
534 RE = Ranges.end(); RI != RE; ++RI) {
Devang Patelc3f5f782010-05-25 23:40:22 +0000535 DebugRangeSymbols.push_back(getLabelBeforeInsn(RI->first));
536 DebugRangeSymbols.push_back(getLabelAfterInsn(RI->second));
Devang Pateleac9c072010-04-27 19:46:33 +0000537 }
538 DebugRangeSymbols.push_back(NULL);
539 DebugRangeSymbols.push_back(NULL);
540 return ScopeDIE;
541 }
542
Devang Patelc3f5f782010-05-25 23:40:22 +0000543 const MCSymbol *Start = getLabelBeforeInsn(RI->first);
544 const MCSymbol *End = getLabelAfterInsn(RI->second);
Devang Pateleac9c072010-04-27 19:46:33 +0000545
Devang Patelc3f5f782010-05-25 23:40:22 +0000546 if (End == 0) return 0;
Devang Patel53bb5c92009-11-10 23:06:00 +0000547
Chris Lattnerb7db7332010-03-09 01:58:53 +0000548 assert(Start->isDefined() && "Invalid starting label for an inlined scope!");
549 assert(End->isDefined() && "Invalid end label for an inlined scope!");
Jim Grosbach1e20b962010-07-21 21:21:52 +0000550
Devang Patel3cbee302011-04-12 22:53:02 +0000551 TheCU->addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, Start);
552 TheCU->addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr, End);
Devang Patel53bb5c92009-11-10 23:06:00 +0000553
554 return ScopeDIE;
555}
556
Devang Patel2c4ceb12009-11-21 02:48:08 +0000557/// constructInlinedScopeDIE - This scope represents inlined body of
558/// a function. Construct DIE to represent this concrete inlined copy
559/// of the function.
560DIE *DwarfDebug::constructInlinedScopeDIE(DbgScope *Scope) {
Devang Pateleac9c072010-04-27 19:46:33 +0000561
562 const SmallVector<DbgRange, 4> &Ranges = Scope->getRanges();
Jim Grosbach1e20b962010-07-21 21:21:52 +0000563 assert (Ranges.empty() == false
Devang Pateleac9c072010-04-27 19:46:33 +0000564 && "DbgScope does not have instruction markers!");
565
Devang Patel26a92002011-07-27 00:34:13 +0000566 if (!Scope->getScopeNode())
567 return NULL;
568 DIScope DS(Scope->getScopeNode());
569 DISubprogram InlinedSP = getDISubprogram(DS);
570 CompileUnit *TheCU = getCompileUnit(InlinedSP);
571 DIE *OriginDIE = TheCU->getDIE(InlinedSP);
572 if (!OriginDIE) {
573 DEBUG(dbgs() << "Unable to find original DIE for inlined subprogram.");
574 return NULL;
575 }
576
Devang Pateleac9c072010-04-27 19:46:33 +0000577 SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin();
Devang Patelc3f5f782010-05-25 23:40:22 +0000578 const MCSymbol *StartLabel = getLabelBeforeInsn(RI->first);
579 const MCSymbol *EndLabel = getLabelAfterInsn(RI->second);
Devang Pateleac9c072010-04-27 19:46:33 +0000580
Devang Patel0afbf232010-07-08 22:39:20 +0000581 if (StartLabel == 0 || EndLabel == 0) {
Nick Lewycky3bbb6f72011-07-29 03:49:23 +0000582 assert (0 && "Unexpected Start and End labels for a inlined scope!");
Devang Pateleac9c072010-04-27 19:46:33 +0000583 return 0;
584 }
Chris Lattnerb7db7332010-03-09 01:58:53 +0000585 assert(StartLabel->isDefined() &&
Chris Lattnera34ec2292010-03-09 01:51:43 +0000586 "Invalid starting label for an inlined scope!");
Chris Lattnerb7db7332010-03-09 01:58:53 +0000587 assert(EndLabel->isDefined() &&
Chris Lattnera34ec2292010-03-09 01:51:43 +0000588 "Invalid end label for an inlined scope!");
Devang Pateleac9c072010-04-27 19:46:33 +0000589
Devang Pateld96efb82011-05-05 17:54:26 +0000590 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_inlined_subroutine);
Devang Patel3cbee302011-04-12 22:53:02 +0000591 TheCU->addDIEEntry(ScopeDIE, dwarf::DW_AT_abstract_origin,
592 dwarf::DW_FORM_ref4, OriginDIE);
Devang Patel53bb5c92009-11-10 23:06:00 +0000593
Devang Patel26a92002011-07-27 00:34:13 +0000594 if (Ranges.size() > 1) {
595 // .debug_range section has not been laid out yet. Emit offset in
596 // .debug_range as a uint, size 4, for now. emitDIE will handle
597 // DW_AT_ranges appropriately.
598 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_ranges, dwarf::DW_FORM_data4,
599 DebugRangeSymbols.size() * Asm->getTargetData().getPointerSize());
600 for (SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin(),
601 RE = Ranges.end(); RI != RE; ++RI) {
602 DebugRangeSymbols.push_back(getLabelBeforeInsn(RI->first));
603 DebugRangeSymbols.push_back(getLabelAfterInsn(RI->second));
604 }
605 DebugRangeSymbols.push_back(NULL);
606 DebugRangeSymbols.push_back(NULL);
607 } else {
608 TheCU->addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, StartLabel);
609 TheCU->addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr, EndLabel);
610 }
Devang Patel53bb5c92009-11-10 23:06:00 +0000611
612 InlinedSubprogramDIEs.insert(OriginDIE);
613
614 // Track the start label for this inlined function.
Devang Patel26a92002011-07-27 00:34:13 +0000615 //.debug_inlined section specification does not clearly state how
616 // to emit inlined scope that is split into multiple instruction ranges.
617 // For now, use first instruction range and emit low_pc/high_pc pair and
618 // corresponding .debug_inlined section entry for this pair.
Devang Patele9f8f5e2010-05-07 20:54:48 +0000619 DenseMap<const MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator
Devang Patel2db49d72010-05-07 18:11:54 +0000620 I = InlineInfo.find(InlinedSP);
Devang Patel53bb5c92009-11-10 23:06:00 +0000621
622 if (I == InlineInfo.end()) {
Devang Patel2db49d72010-05-07 18:11:54 +0000623 InlineInfo[InlinedSP].push_back(std::make_pair(StartLabel,
Jim Grosbach7ab38df2009-11-22 19:20:36 +0000624 ScopeDIE));
Devang Patel2db49d72010-05-07 18:11:54 +0000625 InlinedSPNodes.push_back(InlinedSP);
Devang Patel53bb5c92009-11-10 23:06:00 +0000626 } else
Chris Lattner6ed0f902010-03-09 00:31:02 +0000627 I->second.push_back(std::make_pair(StartLabel, ScopeDIE));
Devang Patel53bb5c92009-11-10 23:06:00 +0000628
Devang Patel53bb5c92009-11-10 23:06:00 +0000629 DILocation DL(Scope->getInlinedAt());
Devang Patel3cbee302011-04-12 22:53:02 +0000630 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_call_file, 0, TheCU->getID());
631 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_call_line, 0, DL.getLineNumber());
Devang Patel53bb5c92009-11-10 23:06:00 +0000632
633 return ScopeDIE;
634}
635
Devang Patel8594d422011-06-24 20:46:11 +0000636/// isUnsignedDIType - Return true if type encoding is unsigned.
637static bool isUnsignedDIType(DIType Ty) {
638 DIDerivedType DTy(Ty);
639 if (DTy.Verify())
640 return isUnsignedDIType(DTy.getTypeDerivedFrom());
641
642 DIBasicType BTy(Ty);
643 if (BTy.Verify()) {
644 unsigned Encoding = BTy.getEncoding();
645 if (Encoding == dwarf::DW_ATE_unsigned ||
646 Encoding == dwarf::DW_ATE_unsigned_char)
647 return true;
648 }
649 return false;
650}
Devang Patel2c4ceb12009-11-21 02:48:08 +0000651
652/// constructVariableDIE - Construct a DIE for the given DbgVariable.
Devang Patel8a241142009-12-09 18:24:21 +0000653DIE *DwarfDebug::constructVariableDIE(DbgVariable *DV, DbgScope *Scope) {
Devang Patel8bd11de2010-08-09 21:01:39 +0000654 StringRef Name = DV->getName();
Devang Patel65dbc902009-11-25 17:36:49 +0000655 if (Name.empty())
Devang Patel3fb6bd62009-11-13 02:25:26 +0000656 return NULL;
Devang Patel53bb5c92009-11-10 23:06:00 +0000657
658 // Translate tag to proper Dwarf tag. The result variable is dropped for
659 // now.
660 unsigned Tag;
Devang Patel8bd11de2010-08-09 21:01:39 +0000661 switch (DV->getTag()) {
Devang Patel53bb5c92009-11-10 23:06:00 +0000662 case dwarf::DW_TAG_return_variable:
663 return NULL;
664 case dwarf::DW_TAG_arg_variable:
665 Tag = dwarf::DW_TAG_formal_parameter;
666 break;
667 case dwarf::DW_TAG_auto_variable: // fall thru
668 default:
669 Tag = dwarf::DW_TAG_variable;
670 break;
671 }
672
673 // Define variable debug information entry.
674 DIE *VariableDie = new DIE(Tag);
Devang Patel9341d102011-04-25 23:05:21 +0000675 CompileUnit *VariableCU = getCompileUnit(DV->getVariable());
Devang Patel53bb5c92009-11-10 23:06:00 +0000676 DIE *AbsDIE = NULL;
Devang Patel26c1e562010-05-20 16:36:41 +0000677 DenseMap<const DbgVariable *, const DbgVariable *>::iterator
678 V2AVI = VarToAbstractVarMap.find(DV);
679 if (V2AVI != VarToAbstractVarMap.end())
680 AbsDIE = V2AVI->second->getDIE();
Jim Grosbach31ef40e2009-11-21 23:12:12 +0000681
Devang Patel26c1e562010-05-20 16:36:41 +0000682 if (AbsDIE)
Devang Patel9341d102011-04-25 23:05:21 +0000683 VariableCU->addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin,
Devang Patel3cbee302011-04-12 22:53:02 +0000684 dwarf::DW_FORM_ref4, AbsDIE);
Devang Patel53bb5c92009-11-10 23:06:00 +0000685 else {
Devang Patel9341d102011-04-25 23:05:21 +0000686 VariableCU->addString(VariableDie, dwarf::DW_AT_name, dwarf::DW_FORM_string,
687 Name);
688 VariableCU->addSourceLine(VariableDie, DV->getVariable());
Devang Patel53bb5c92009-11-10 23:06:00 +0000689
690 // Add variable type.
Devang Patel9341d102011-04-25 23:05:21 +0000691 VariableCU->addType(VariableDie, DV->getType());
Devang Patel53bb5c92009-11-10 23:06:00 +0000692 }
693
Devang Patel8bd11de2010-08-09 21:01:39 +0000694 if (Tag == dwarf::DW_TAG_formal_parameter && DV->getType().isArtificial())
Devang Patel9341d102011-04-25 23:05:21 +0000695 VariableCU->addUInt(VariableDie, dwarf::DW_AT_artificial,
696 dwarf::DW_FORM_flag, 1);
Devang Patel3cf763d2010-09-29 23:07:21 +0000697 else if (DIVariable(DV->getVariable()).isArtificial())
Devang Patel9341d102011-04-25 23:05:21 +0000698 VariableCU->addUInt(VariableDie, dwarf::DW_AT_artificial,
699 dwarf::DW_FORM_flag, 1);
Devang Patelc3f5f782010-05-25 23:40:22 +0000700
701 if (Scope->isAbstractScope()) {
702 DV->setDIE(VariableDie);
703 return VariableDie;
704 }
705
706 // Add variable address.
707
708 unsigned Offset = DV->getDotDebugLocOffset();
709 if (Offset != ~0U) {
Devang Patel9341d102011-04-25 23:05:21 +0000710 VariableCU->addLabel(VariableDie, dwarf::DW_AT_location, dwarf::DW_FORM_data4,
Devang Patelc3f5f782010-05-25 23:40:22 +0000711 Asm->GetTempSymbol("debug_loc", Offset));
712 DV->setDIE(VariableDie);
713 UseDotDebugLocEntry.insert(VariableDie);
714 return VariableDie;
715 }
716
717 // Check if variable is described by a DBG_VALUE instruction.
718 DenseMap<const DbgVariable *, const MachineInstr *>::iterator DVI =
719 DbgVariableToDbgInstMap.find(DV);
720 if (DVI != DbgVariableToDbgInstMap.end()) {
721 const MachineInstr *DVInsn = DVI->second;
Devang Patelc3f5f782010-05-25 23:40:22 +0000722 bool updated = false;
Devang Patelc3f5f782010-05-25 23:40:22 +0000723 if (DVInsn->getNumOperands() == 3) {
Devang Patel0b48ead2010-08-31 22:22:42 +0000724 if (DVInsn->getOperand(0).isReg()) {
725 const MachineOperand RegOp = DVInsn->getOperand(0);
726 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
727 if (DVInsn->getOperand(1).isImm() &&
728 TRI->getFrameRegister(*Asm->MF) == RegOp.getReg()) {
Devang Patele1cdf842011-04-27 22:45:24 +0000729 unsigned FrameReg = 0;
730 const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
731 int Offset =
732 TFI->getFrameIndexReference(*Asm->MF,
733 DVInsn->getOperand(1).getImm(),
734 FrameReg);
735 MachineLocation Location(FrameReg, Offset);
736 VariableCU->addVariableAddress(DV, VariableDie, Location);
737
738 } else if (RegOp.getReg())
739 VariableCU->addVariableAddress(DV, VariableDie,
740 MachineLocation(RegOp.getReg()));
741 updated = true;
Devang Patel0b48ead2010-08-31 22:22:42 +0000742 }
Devang Patelc3f5f782010-05-25 23:40:22 +0000743 else if (DVInsn->getOperand(0).isImm())
Devang Patelb58128e2011-05-27 16:45:18 +0000744 updated =
745 VariableCU->addConstantValue(VariableDie, DVInsn->getOperand(0),
746 DV->getType());
Jim Grosbach1e20b962010-07-21 21:21:52 +0000747 else if (DVInsn->getOperand(0).isFPImm())
748 updated =
Devang Patel9341d102011-04-25 23:05:21 +0000749 VariableCU->addConstantFPValue(VariableDie, DVInsn->getOperand(0));
Devang Patel8594d422011-06-24 20:46:11 +0000750 else if (DVInsn->getOperand(0).isCImm())
751 updated =
752 VariableCU->addConstantValue(VariableDie,
753 DVInsn->getOperand(0).getCImm(),
754 isUnsignedDIType(DV->getType()));
Devang Patelc3f5f782010-05-25 23:40:22 +0000755 } else {
Devang Patele1cdf842011-04-27 22:45:24 +0000756 VariableCU->addVariableAddress(DV, VariableDie,
757 Asm->getDebugValueLocation(DVInsn));
758 updated = true;
Devang Patelc3f5f782010-05-25 23:40:22 +0000759 }
760 if (!updated) {
761 // If variableDie is not updated then DBG_VALUE instruction does not
762 // have valid variable info.
763 delete VariableDie;
764 return NULL;
765 }
766 DV->setDIE(VariableDie);
767 return VariableDie;
Jim Grosbach1e20b962010-07-21 21:21:52 +0000768 }
Devang Patelc3f5f782010-05-25 23:40:22 +0000769
770 // .. else use frame index, if available.
Devang Patelc3f5f782010-05-25 23:40:22 +0000771 int FI = 0;
Devang Patele1cdf842011-04-27 22:45:24 +0000772 if (findVariableFrameIndex(DV, &FI)) {
773 unsigned FrameReg = 0;
774 const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
775 int Offset =
776 TFI->getFrameIndexReference(*Asm->MF, FI, FrameReg);
777 MachineLocation Location(FrameReg, Offset);
778 VariableCU->addVariableAddress(DV, VariableDie, Location);
779 }
780
Devang Patel53bb5c92009-11-10 23:06:00 +0000781 DV->setDIE(VariableDie);
782 return VariableDie;
783
784}
Devang Patel2c4ceb12009-11-21 02:48:08 +0000785
786/// constructScopeDIE - Construct a DIE for this scope.
787DIE *DwarfDebug::constructScopeDIE(DbgScope *Scope) {
Devang Patel3c91b052010-03-08 20:52:55 +0000788 if (!Scope || !Scope->getScopeNode())
789 return NULL;
Jim Grosbach1e20b962010-07-21 21:21:52 +0000790
Devang Patel5bc9fec2011-02-19 01:31:27 +0000791 SmallVector <DIE *, 8> Children;
Devang Patel0478c152011-03-01 22:58:55 +0000792
793 // Collect arguments for current function.
794 if (Scope == CurrentFnDbgScope)
795 for (unsigned i = 0, N = CurrentFnArguments.size(); i < N; ++i)
796 if (DbgVariable *ArgDV = CurrentFnArguments[i])
797 if (DIE *Arg = constructVariableDIE(ArgDV, Scope))
798 Children.push_back(Arg);
799
Devang Patel5bc9fec2011-02-19 01:31:27 +0000800 // Collect lexical scope childrens first.
801 const SmallVector<DbgVariable *, 8> &Variables = Scope->getDbgVariables();
802 for (unsigned i = 0, N = Variables.size(); i < N; ++i)
803 if (DIE *Variable = constructVariableDIE(Variables[i], Scope))
804 Children.push_back(Variable);
805 const SmallVector<DbgScope *, 4> &Scopes = Scope->getScopes();
806 for (unsigned j = 0, M = Scopes.size(); j < M; ++j)
807 if (DIE *Nested = constructScopeDIE(Scopes[j]))
808 Children.push_back(Nested);
Devang Patel3c91b052010-03-08 20:52:55 +0000809 DIScope DS(Scope->getScopeNode());
810 DIE *ScopeDIE = NULL;
811 if (Scope->getInlinedAt())
812 ScopeDIE = constructInlinedScopeDIE(Scope);
813 else if (DS.isSubprogram()) {
Devang Patel0dd45582010-06-28 20:53:04 +0000814 ProcessedSPNodes.insert(DS);
Devang Patel8aa61472010-07-07 22:20:57 +0000815 if (Scope->isAbstractScope()) {
Devang Patel163a9f72010-05-10 22:49:55 +0000816 ScopeDIE = getCompileUnit(DS)->getDIE(DS);
Devang Patel8aa61472010-07-07 22:20:57 +0000817 // Note down abstract DIE.
818 if (ScopeDIE)
819 AbstractSPDies.insert(std::make_pair(DS, ScopeDIE));
820 }
Devang Patel3c91b052010-03-08 20:52:55 +0000821 else
Devang Patel2db49d72010-05-07 18:11:54 +0000822 ScopeDIE = updateSubprogramScopeDIE(DS);
Devang Patel3c91b052010-03-08 20:52:55 +0000823 }
Devang Patel5bc9fec2011-02-19 01:31:27 +0000824 else {
825 // There is no need to emit empty lexical block DIE.
826 if (Children.empty())
827 return NULL;
Devang Patel3c91b052010-03-08 20:52:55 +0000828 ScopeDIE = constructLexicalScopeDIE(Scope);
Devang Patel5bc9fec2011-02-19 01:31:27 +0000829 }
830
Devang Patelaead63c2010-03-29 22:59:58 +0000831 if (!ScopeDIE) return NULL;
Jim Grosbach1e20b962010-07-21 21:21:52 +0000832
Devang Patel5bc9fec2011-02-19 01:31:27 +0000833 // Add children
834 for (SmallVector<DIE *, 8>::iterator I = Children.begin(),
835 E = Children.end(); I != E; ++I)
836 ScopeDIE->addChild(*I);
Devang Patel193f7202009-11-24 01:14:22 +0000837
Jim Grosbach1e20b962010-07-21 21:21:52 +0000838 if (DS.isSubprogram())
Devang Patel3cbee302011-04-12 22:53:02 +0000839 getCompileUnit(DS)->addPubTypes(DISubprogram(DS));
Jim Grosbach1e20b962010-07-21 21:21:52 +0000840
Devang Patel193f7202009-11-24 01:14:22 +0000841 return ScopeDIE;
Devang Patel53bb5c92009-11-10 23:06:00 +0000842}
843
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000844/// GetOrCreateSourceID - Look up the source id with the given directory and
845/// source file names. If none currently exists, create a new id and insert it
846/// in the SourceIds map. This can update DirectoryNames and SourceFileNames
847/// maps as well.
Devang Patel2f584852010-07-24 00:53:22 +0000848
Devang Patel23670e52011-03-24 20:30:50 +0000849unsigned DwarfDebug::GetOrCreateSourceID(StringRef FileName,
850 StringRef DirName) {
Devang Patel1905a182010-09-16 20:57:49 +0000851 // If FE did not provide a file name, then assume stdin.
852 if (FileName.empty())
Devang Patel23670e52011-03-24 20:30:50 +0000853 return GetOrCreateSourceID("<stdin>", StringRef());
854
855 // MCStream expects full path name as filename.
Benjamin Kramerab5f7882011-06-05 14:36:47 +0000856 if (!DirName.empty() && !sys::path::is_absolute(FileName)) {
857 SmallString<128> FullPathName = DirName;
858 sys::path::append(FullPathName, FileName);
Devang Patel23670e52011-03-24 20:30:50 +0000859 // Here FullPathName will be copied into StringMap by GetOrCreateSourceID.
860 return GetOrCreateSourceID(StringRef(FullPathName), StringRef());
861 }
Devang Patel1905a182010-09-16 20:57:49 +0000862
Rafael Espindola5c055632010-11-18 02:04:25 +0000863 StringMapEntry<unsigned> &Entry = SourceIdMap.GetOrCreateValue(FileName);
864 if (Entry.getValue())
865 return Entry.getValue();
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000866
Rafael Espindola5c055632010-11-18 02:04:25 +0000867 unsigned SrcId = SourceIdMap.size();
868 Entry.setValue(SrcId);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000869
Rafael Espindola5c055632010-11-18 02:04:25 +0000870 // Print out a .file directive to specify files for .loc directives.
Devang Patel23670e52011-03-24 20:30:50 +0000871 Asm->OutStreamer.EmitDwarfFileDirective(SrcId, Entry.getKey());
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000872
873 return SrcId;
874}
875
Jim Grosbach1e20b962010-07-21 21:21:52 +0000876/// constructCompileUnit - Create new CompileUnit for the given
Devang Patel163a9f72010-05-10 22:49:55 +0000877/// metadata node with tag DW_TAG_compile_unit.
Devang Patele9f8f5e2010-05-07 20:54:48 +0000878void DwarfDebug::constructCompileUnit(const MDNode *N) {
Devang Patele4b27562009-08-28 23:24:31 +0000879 DICompileUnit DIUnit(N);
Devang Patel65dbc902009-11-25 17:36:49 +0000880 StringRef FN = DIUnit.getFilename();
881 StringRef Dir = DIUnit.getDirectory();
Devang Patel23670e52011-03-24 20:30:50 +0000882 unsigned ID = GetOrCreateSourceID(FN, Dir);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000883
884 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
Devang Patel3cbee302011-04-12 22:53:02 +0000885 CompileUnit *NewCU = new CompileUnit(ID, Die, Asm, this);
886 NewCU->addString(Die, dwarf::DW_AT_producer, dwarf::DW_FORM_string,
887 DIUnit.getProducer());
888 NewCU->addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data2,
889 DIUnit.getLanguage());
890 NewCU->addString(Die, dwarf::DW_AT_name, dwarf::DW_FORM_string, FN);
Devang Patel5098da02010-04-26 22:54:28 +0000891 // Use DW_AT_entry_pc instead of DW_AT_low_pc/DW_AT_high_pc pair. This
892 // simplifies debug range entries.
Devang Patel3cbee302011-04-12 22:53:02 +0000893 NewCU->addUInt(Die, dwarf::DW_AT_entry_pc, dwarf::DW_FORM_addr, 0);
Devang Patel4a602ca2010-03-22 23:11:36 +0000894 // DW_AT_stmt_list is a offset of line number information for this
Devang Patelaf608bd2010-08-24 00:06:12 +0000895 // compile unit in debug_line section.
Rafael Espindoladc52ecf2011-05-10 20:35:05 +0000896 if(Asm->MAI->doesDwarfRequireRelocationForSectionOffset())
Rafael Espindola597a7662011-05-04 17:44:06 +0000897 NewCU->addLabel(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4,
Devang Patel3cbee302011-04-12 22:53:02 +0000898 Asm->GetTempSymbol("section_line"));
Devang Patelae84d5b2010-08-31 23:50:19 +0000899 else
Devang Patel3cbee302011-04-12 22:53:02 +0000900 NewCU->addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4, 0);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000901
Devang Patel65dbc902009-11-25 17:36:49 +0000902 if (!Dir.empty())
Devang Patel3cbee302011-04-12 22:53:02 +0000903 NewCU->addString(Die, dwarf::DW_AT_comp_dir, dwarf::DW_FORM_string, Dir);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000904 if (DIUnit.isOptimized())
Devang Patel3cbee302011-04-12 22:53:02 +0000905 NewCU->addUInt(Die, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1);
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000906
Devang Patel65dbc902009-11-25 17:36:49 +0000907 StringRef Flags = DIUnit.getFlags();
908 if (!Flags.empty())
Devang Patel3cbee302011-04-12 22:53:02 +0000909 NewCU->addString(Die, dwarf::DW_AT_APPLE_flags, dwarf::DW_FORM_string, Flags);
910
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000911 unsigned RVer = DIUnit.getRunTimeVersion();
912 if (RVer)
Devang Patel3cbee302011-04-12 22:53:02 +0000913 NewCU->addUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers,
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000914 dwarf::DW_FORM_data1, RVer);
915
Devang Patel163a9f72010-05-10 22:49:55 +0000916 if (!FirstCU)
917 FirstCU = NewCU;
918 CUMap.insert(std::make_pair(N, NewCU));
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000919}
920
Nick Lewycky3bbb6f72011-07-29 03:49:23 +0000921/// getCompileUnit - Get CompileUnit DIE.
Devang Patel163a9f72010-05-10 22:49:55 +0000922CompileUnit *DwarfDebug::getCompileUnit(const MDNode *N) const {
923 assert (N && "Invalid DwarfDebug::getCompileUnit argument!");
924 DIDescriptor D(N);
925 const MDNode *CUNode = NULL;
926 if (D.isCompileUnit())
927 CUNode = N;
928 else if (D.isSubprogram())
929 CUNode = DISubprogram(N).getCompileUnit();
930 else if (D.isType())
931 CUNode = DIType(N).getCompileUnit();
932 else if (D.isGlobalVariable())
933 CUNode = DIGlobalVariable(N).getCompileUnit();
934 else if (D.isVariable())
935 CUNode = DIVariable(N).getCompileUnit();
936 else if (D.isNameSpace())
937 CUNode = DINameSpace(N).getCompileUnit();
938 else if (D.isFile())
939 CUNode = DIFile(N).getCompileUnit();
940 else
941 return FirstCU;
942
943 DenseMap<const MDNode *, CompileUnit *>::const_iterator I
944 = CUMap.find(CUNode);
945 if (I == CUMap.end())
946 return FirstCU;
947 return I->second;
948}
949
Nick Lewycky3bbb6f72011-07-29 03:49:23 +0000950// Return const expression if value is a GEP to access merged global
Devang Patele449d1f2011-01-20 00:02:16 +0000951// constant. e.g.
952// i8* getelementptr ({ i8, i8, i8, i8 }* @_MergedGlobals, i32 0, i32 0)
953static const ConstantExpr *getMergedGlobalExpr(const Value *V) {
954 const ConstantExpr *CE = dyn_cast_or_null<ConstantExpr>(V);
955 if (!CE || CE->getNumOperands() != 3 ||
Bob Wilsoncfc55c22011-08-03 19:42:51 +0000956 CE->getOpcode() != Instruction::GetElementPtr)
Devang Patele449d1f2011-01-20 00:02:16 +0000957 return NULL;
958
Bob Wilsoncfc55c22011-08-03 19:42:51 +0000959 // First operand points to a global struct.
960 Value *Ptr = CE->getOperand(0);
961 if (!isa<GlobalValue>(Ptr) ||
962 !isa<StructType>(cast<PointerType>(Ptr->getType())->getElementType()))
Devang Patele449d1f2011-01-20 00:02:16 +0000963 return NULL;
964
965 // Second operand is zero.
Nick Lewycky3bbb6f72011-07-29 03:49:23 +0000966 const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(CE->getOperand(1));
Devang Patele449d1f2011-01-20 00:02:16 +0000967 if (!CI || !CI->isZero())
968 return NULL;
969
970 // Third operand is offset.
971 if (!isa<ConstantInt>(CE->getOperand(2)))
972 return NULL;
973
974 return CE;
975}
976
Devang Patel163a9f72010-05-10 22:49:55 +0000977/// constructGlobalVariableDIE - Construct global variable DIE.
Devang Patele9f8f5e2010-05-07 20:54:48 +0000978void DwarfDebug::constructGlobalVariableDIE(const MDNode *N) {
Devang Patel9fa539c2010-08-10 01:37:23 +0000979 DIGlobalVariable GV(N);
Daniel Dunbarf612ff62009-09-19 20:40:05 +0000980
Devang Patel905cf5e2009-09-04 23:59:07 +0000981 // If debug information is malformed then ignore it.
Devang Patel9fa539c2010-08-10 01:37:23 +0000982 if (GV.Verify() == false)
Devang Patel905cf5e2009-09-04 23:59:07 +0000983 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000984
985 // Check for pre-existence.
Devang Patel163a9f72010-05-10 22:49:55 +0000986 CompileUnit *TheCU = getCompileUnit(N);
Devang Patel9fa539c2010-08-10 01:37:23 +0000987 if (TheCU->getDIE(GV))
Devang Patel13e16b62009-06-26 01:49:18 +0000988 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000989
Devang Patel9fa539c2010-08-10 01:37:23 +0000990 DIType GTy = GV.getType();
Devang Patel29368072010-08-10 07:11:13 +0000991 DIE *VariableDIE = new DIE(GV.getTag());
992
993 bool isGlobalVariable = GV.getGlobal() != NULL;
Bill Wendlingf0fb9872009-05-20 23:19:06 +0000994
Devang Patel9fa539c2010-08-10 01:37:23 +0000995 // Add name.
Devang Patel3cbee302011-04-12 22:53:02 +0000996 TheCU->addString(VariableDIE, dwarf::DW_AT_name, dwarf::DW_FORM_string,
997 GV.getDisplayName());
Devang Patel9fa539c2010-08-10 01:37:23 +0000998 StringRef LinkageName = GV.getLinkageName();
Devang Patel29368072010-08-10 07:11:13 +0000999 if (!LinkageName.empty() && isGlobalVariable)
Devang Patel3cbee302011-04-12 22:53:02 +00001000 TheCU->addString(VariableDIE, dwarf::DW_AT_MIPS_linkage_name,
1001 dwarf::DW_FORM_string,
1002 getRealLinkageName(LinkageName));
Devang Patel9fa539c2010-08-10 01:37:23 +00001003 // Add type.
Devang Patel3cbee302011-04-12 22:53:02 +00001004 TheCU->addType(VariableDIE, GTy);
Devang Patele9ae06c2011-05-31 22:56:51 +00001005
Devang Patel9fa539c2010-08-10 01:37:23 +00001006 // Add scoping info.
1007 if (!GV.isLocalToUnit()) {
Devang Patel3cbee302011-04-12 22:53:02 +00001008 TheCU->addUInt(VariableDIE, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
Devang Patel9fa539c2010-08-10 01:37:23 +00001009 // Expose as global.
1010 TheCU->addGlobal(GV.getName(), VariableDIE);
1011 }
1012 // Add line number info.
Devang Patel3cbee302011-04-12 22:53:02 +00001013 TheCU->addSourceLine(VariableDIE, GV);
Devang Patel9fa539c2010-08-10 01:37:23 +00001014 // Add to map.
1015 TheCU->insertDIE(N, VariableDIE);
1016 // Add to context owner.
1017 DIDescriptor GVContext = GV.getContext();
Devang Patel3cbee302011-04-12 22:53:02 +00001018 TheCU->addToContextOwner(VariableDIE, GVContext);
Devang Patel9fa539c2010-08-10 01:37:23 +00001019 // Add location.
Devang Patel29368072010-08-10 07:11:13 +00001020 if (isGlobalVariable) {
1021 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Devang Patel3cbee302011-04-12 22:53:02 +00001022 TheCU->addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
1023 TheCU->addLabel(Block, 0, dwarf::DW_FORM_udata,
Devang Patel29368072010-08-10 07:11:13 +00001024 Asm->Mang->getSymbol(GV.getGlobal()));
1025 // Do not create specification DIE if context is either compile unit
1026 // or a subprogram.
1027 if (GV.isDefinition() && !GVContext.isCompileUnit() &&
1028 !GVContext.isFile() && !isSubprogramContext(GVContext)) {
1029 // Create specification DIE.
1030 DIE *VariableSpecDIE = new DIE(dwarf::DW_TAG_variable);
Devang Patel3cbee302011-04-12 22:53:02 +00001031 TheCU->addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification,
Devang Patel29368072010-08-10 07:11:13 +00001032 dwarf::DW_FORM_ref4, VariableDIE);
Devang Patel3cbee302011-04-12 22:53:02 +00001033 TheCU->addBlock(VariableSpecDIE, dwarf::DW_AT_location, 0, Block);
1034 TheCU->addUInt(VariableDIE, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
Devang Patel29368072010-08-10 07:11:13 +00001035 TheCU->addDie(VariableSpecDIE);
1036 } else {
Devang Patel3cbee302011-04-12 22:53:02 +00001037 TheCU->addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
Devang Patel29368072010-08-10 07:11:13 +00001038 }
Devang Patel8594d422011-06-24 20:46:11 +00001039 } else if (const ConstantInt *CI =
Devang Patel76a788c2011-01-06 21:39:25 +00001040 dyn_cast_or_null<ConstantInt>(GV.getConstant()))
Devang Patel3cbee302011-04-12 22:53:02 +00001041 TheCU->addConstantValue(VariableDIE, CI, isUnsignedDIType(GTy));
Devang Patele449d1f2011-01-20 00:02:16 +00001042 else if (const ConstantExpr *CE = getMergedGlobalExpr(N->getOperand(11))) {
1043 // GV is a merged global.
1044 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Bob Wilsoncfc55c22011-08-03 19:42:51 +00001045 Value *Ptr = CE->getOperand(0);
Devang Patel3cbee302011-04-12 22:53:02 +00001046 TheCU->addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
1047 TheCU->addLabel(Block, 0, dwarf::DW_FORM_udata,
Bob Wilsoncfc55c22011-08-03 19:42:51 +00001048 Asm->Mang->getSymbol(cast<GlobalValue>(Ptr)));
Devang Patel3cbee302011-04-12 22:53:02 +00001049 TheCU->addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
Bob Wilsoncfc55c22011-08-03 19:42:51 +00001050 SmallVector<Value*, 3> Idx(CE->op_begin()+1, CE->op_end());
Devang Patel027cbf92011-08-03 01:25:46 +00001051 TheCU->addUInt(Block, 0, dwarf::DW_FORM_udata,
Bob Wilsoncfc55c22011-08-03 19:42:51 +00001052 Asm->getTargetData().getIndexedOffset(Ptr->getType(), Idx));
Devang Patel3cbee302011-04-12 22:53:02 +00001053 TheCU->addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1054 TheCU->addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
Devang Patele449d1f2011-01-20 00:02:16 +00001055 }
Devang Patel76a788c2011-01-06 21:39:25 +00001056
Devang Patel13e16b62009-06-26 01:49:18 +00001057 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001058}
1059
Devang Patel163a9f72010-05-10 22:49:55 +00001060/// construct SubprogramDIE - Construct subprogram DIE.
Devang Patele9f8f5e2010-05-07 20:54:48 +00001061void DwarfDebug::constructSubprogramDIE(const MDNode *N) {
Devang Patele4b27562009-08-28 23:24:31 +00001062 DISubprogram SP(N);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001063
Stuart Hastings639336e2010-04-06 21:38:29 +00001064 // Check for pre-existence.
Devang Patel163a9f72010-05-10 22:49:55 +00001065 CompileUnit *TheCU = getCompileUnit(N);
1066 if (TheCU->getDIE(N))
Stuart Hastings639336e2010-04-06 21:38:29 +00001067 return;
1068
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001069 if (!SP.isDefinition())
1070 // This is a method declaration which will be handled while constructing
1071 // class type.
Devang Patel13e16b62009-06-26 01:49:18 +00001072 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001073
Stuart Hastings639336e2010-04-06 21:38:29 +00001074 DIE *SubprogramDie = createSubprogramDIE(SP);
1075
1076 // Add to map.
Devang Patel163a9f72010-05-10 22:49:55 +00001077 TheCU->insertDIE(N, SubprogramDie);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001078
1079 // Add to context owner.
Devang Patel3cbee302011-04-12 22:53:02 +00001080 TheCU->addToContextOwner(SubprogramDie, SP.getContext());
Devang Patel0000fad2009-12-08 23:21:45 +00001081
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001082 // Expose as global.
Devang Patel163a9f72010-05-10 22:49:55 +00001083 TheCU->addGlobal(SP.getName(), SubprogramDie);
Devang Patel193f7202009-11-24 01:14:22 +00001084
Devang Patel13e16b62009-06-26 01:49:18 +00001085 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001086}
1087
Devang Patel2c4ceb12009-11-21 02:48:08 +00001088/// beginModule - Emit all Dwarf sections that should come prior to the
Daniel Dunbar00564992009-09-19 20:40:14 +00001089/// content. Create global DIEs and emit initial debug info sections.
Nick Lewycky3bbb6f72011-07-29 03:49:23 +00001090/// This is invoked by the target AsmPrinter.
Chris Lattner75f50722010-04-04 07:48:20 +00001091void DwarfDebug::beginModule(Module *M) {
Devang Pateleac9c072010-04-27 19:46:33 +00001092 if (DisableDebugInfoPrinting)
1093 return;
1094
Nick Lewycky3bbb6f72011-07-29 03:49:23 +00001095 // If module has named metadata anchors then use them, otherwise scan the
1096 // module using debug info finder to collect debug info.
Devang Patel30692ab2011-05-03 16:45:22 +00001097 NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu");
1098 if (CU_Nodes) {
Devang Patela938dd02011-05-04 16:34:02 +00001099
1100 NamedMDNode *GV_Nodes = M->getNamedMetadata("llvm.dbg.gv");
1101 NamedMDNode *SP_Nodes = M->getNamedMetadata("llvm.dbg.sp");
1102 if (!GV_Nodes && !SP_Nodes)
1103 // If there are not any global variables or any functions then
1104 // there is not any debug info in this module.
Devang Patel30692ab2011-05-03 16:45:22 +00001105 return;
1106
Devang Patela938dd02011-05-04 16:34:02 +00001107 for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i)
1108 constructCompileUnit(CU_Nodes->getOperand(i));
Devang Patel30692ab2011-05-03 16:45:22 +00001109
Devang Patela938dd02011-05-04 16:34:02 +00001110 if (GV_Nodes)
1111 for (unsigned i = 0, e = GV_Nodes->getNumOperands(); i != e; ++i)
1112 constructGlobalVariableDIE(GV_Nodes->getOperand(i));
1113
1114 if (SP_Nodes)
1115 for (unsigned i = 0, e = SP_Nodes->getNumOperands(); i != e; ++i)
1116 constructSubprogramDIE(SP_Nodes->getOperand(i));
Devang Patel30692ab2011-05-03 16:45:22 +00001117
1118 } else {
1119
1120 DebugInfoFinder DbgFinder;
1121 DbgFinder.processModule(*M);
1122
Devang Patela938dd02011-05-04 16:34:02 +00001123 bool HasDebugInfo = false;
Nick Lewycky3bbb6f72011-07-29 03:49:23 +00001124 // Scan all the compile-units to see if there are any marked as the main
1125 // unit. If not, we do not generate debug info.
Devang Patel30692ab2011-05-03 16:45:22 +00001126 for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
1127 E = DbgFinder.compile_unit_end(); I != E; ++I) {
1128 if (DICompileUnit(*I).isMain()) {
1129 HasDebugInfo = true;
1130 break;
1131 }
1132 }
Devang Patela938dd02011-05-04 16:34:02 +00001133 if (!HasDebugInfo) return;
Devang Patel30692ab2011-05-03 16:45:22 +00001134
1135 // Create all the compile unit DIEs.
1136 for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
1137 E = DbgFinder.compile_unit_end(); I != E; ++I)
1138 constructCompileUnit(*I);
1139
1140 // Create DIEs for each global variable.
1141 for (DebugInfoFinder::iterator I = DbgFinder.global_variable_begin(),
1142 E = DbgFinder.global_variable_end(); I != E; ++I)
1143 constructGlobalVariableDIE(*I);
1144
1145 // Create DIEs for each subprogram.
1146 for (DebugInfoFinder::iterator I = DbgFinder.subprogram_begin(),
1147 E = DbgFinder.subprogram_end(); I != E; ++I)
1148 constructSubprogramDIE(*I);
Chris Lattnerd850ac72010-04-05 02:19:28 +00001149 }
Devang Patel30692ab2011-05-03 16:45:22 +00001150
Chris Lattnerd850ac72010-04-05 02:19:28 +00001151 // Tell MMI that we have debug info.
1152 MMI->setDebugInfoAvailability(true);
Devang Patel30692ab2011-05-03 16:45:22 +00001153
Chris Lattnerbe15beb2010-04-04 23:17:54 +00001154 // Emit initial sections.
Chris Lattnerd850ac72010-04-05 02:19:28 +00001155 EmitSectionLabels();
Jim Grosbach1e20b962010-07-21 21:21:52 +00001156
Devang Patele7e5a0f2010-08-10 20:01:20 +00001157 //getOrCreateTypeDIE
1158 if (NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.enum"))
Devang Patel3cbee302011-04-12 22:53:02 +00001159 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
1160 DIType Ty(NMD->getOperand(i));
1161 getCompileUnit(Ty)->getOrCreateTypeDIE(Ty);
1162 }
Devang Patele7e5a0f2010-08-10 20:01:20 +00001163
Devang Patel1a7ca032010-09-28 18:08:20 +00001164 if (NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.ty"))
Devang Patel3cbee302011-04-12 22:53:02 +00001165 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
1166 DIType Ty(NMD->getOperand(i));
1167 getCompileUnit(Ty)->getOrCreateTypeDIE(Ty);
1168 }
Devang Patel1a7ca032010-09-28 18:08:20 +00001169
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001170 // Prime section data.
Chris Lattnerf0144122009-07-28 03:13:23 +00001171 SectionMap.insert(Asm->getObjFileLowering().getTextSection());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001172}
1173
Devang Patel2c4ceb12009-11-21 02:48:08 +00001174/// endModule - Emit all Dwarf sections that should come after the content.
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001175///
Devang Patel2c4ceb12009-11-21 02:48:08 +00001176void DwarfDebug::endModule() {
Devang Patel163a9f72010-05-10 22:49:55 +00001177 if (!FirstCU) return;
Devang Patel4a1cad62010-06-28 18:25:03 +00001178 const Module *M = MMI->getModule();
Devang Patele9a1cca2010-08-02 17:32:15 +00001179 DenseMap<const MDNode *, DbgScope *> DeadFnScopeMap;
Devang Patel4a1cad62010-06-28 18:25:03 +00001180 if (NamedMDNode *AllSPs = M->getNamedMetadata("llvm.dbg.sp")) {
1181 for (unsigned SI = 0, SE = AllSPs->getNumOperands(); SI != SE; ++SI) {
1182 if (ProcessedSPNodes.count(AllSPs->getOperand(SI)) != 0) continue;
1183 DISubprogram SP(AllSPs->getOperand(SI));
1184 if (!SP.Verify()) continue;
1185
1186 // Collect info for variables that were optimized out.
Devang Patel8b3a6b62010-07-19 17:53:55 +00001187 if (!SP.isDefinition()) continue;
Devang Patel4a1cad62010-06-28 18:25:03 +00001188 StringRef FName = SP.getLinkageName();
1189 if (FName.empty())
1190 FName = SP.getName();
Devang Patel62367042010-11-10 22:19:21 +00001191 NamedMDNode *NMD = getFnSpecificMDNode(*(MMI->getModule()), FName);
Devang Patel4a1cad62010-06-28 18:25:03 +00001192 if (!NMD) continue;
1193 unsigned E = NMD->getNumOperands();
1194 if (!E) continue;
1195 DbgScope *Scope = new DbgScope(NULL, DIDescriptor(SP), NULL);
Devang Patele9a1cca2010-08-02 17:32:15 +00001196 DeadFnScopeMap[SP] = Scope;
Devang Patel4a1cad62010-06-28 18:25:03 +00001197 for (unsigned I = 0; I != E; ++I) {
1198 DIVariable DV(NMD->getOperand(I));
1199 if (!DV.Verify()) continue;
1200 Scope->addVariable(new DbgVariable(DV));
1201 }
Jim Grosbach1e20b962010-07-21 21:21:52 +00001202
Devang Patel4a1cad62010-06-28 18:25:03 +00001203 // Construct subprogram DIE and add variables DIEs.
1204 constructSubprogramDIE(SP);
1205 DIE *ScopeDIE = getCompileUnit(SP)->getDIE(SP);
Devang Patele03161c2010-08-09 18:51:29 +00001206 const SmallVector<DbgVariable *, 8> &Variables = Scope->getDbgVariables();
Devang Patel4a1cad62010-06-28 18:25:03 +00001207 for (unsigned i = 0, N = Variables.size(); i < N; ++i) {
1208 DIE *VariableDIE = constructVariableDIE(Variables[i], Scope);
1209 if (VariableDIE)
1210 ScopeDIE->addChild(VariableDIE);
1211 }
1212 }
1213 }
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001214
Devang Patel53bb5c92009-11-10 23:06:00 +00001215 // Attach DW_AT_inline attribute with inlined subprogram DIEs.
1216 for (SmallPtrSet<DIE *, 4>::iterator AI = InlinedSubprogramDIEs.begin(),
1217 AE = InlinedSubprogramDIEs.end(); AI != AE; ++AI) {
1218 DIE *ISP = *AI;
Devang Patel3cbee302011-04-12 22:53:02 +00001219 FirstCU->addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
Devang Patel53bb5c92009-11-10 23:06:00 +00001220 }
1221
Devang Patele9f8f5e2010-05-07 20:54:48 +00001222 for (DenseMap<DIE *, const MDNode *>::iterator CI = ContainingTypeMap.begin(),
Devang Patel5d11eb02009-12-03 19:11:07 +00001223 CE = ContainingTypeMap.end(); CI != CE; ++CI) {
1224 DIE *SPDie = CI->first;
Devang Patele9f8f5e2010-05-07 20:54:48 +00001225 const MDNode *N = dyn_cast_or_null<MDNode>(CI->second);
Devang Patel5d11eb02009-12-03 19:11:07 +00001226 if (!N) continue;
Devang Patel163a9f72010-05-10 22:49:55 +00001227 DIE *NDie = getCompileUnit(N)->getDIE(N);
Devang Patel5d11eb02009-12-03 19:11:07 +00001228 if (!NDie) continue;
Devang Patel3cbee302011-04-12 22:53:02 +00001229 getCompileUnit(N)->addDIEEntry(SPDie, dwarf::DW_AT_containing_type,
1230 dwarf::DW_FORM_ref4, NDie);
Devang Patel5d11eb02009-12-03 19:11:07 +00001231 }
1232
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001233 // Standard sections final addresses.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00001234 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getTextSection());
Chris Lattnerc0215722010-04-04 19:25:43 +00001235 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("text_end"));
Chris Lattner6c2f9e12009-08-19 05:49:37 +00001236 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getDataSection());
Chris Lattnerc0215722010-04-04 19:25:43 +00001237 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("data_end"));
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001238
1239 // End text sections.
1240 for (unsigned i = 1, N = SectionMap.size(); i <= N; ++i) {
Chris Lattner6c2f9e12009-08-19 05:49:37 +00001241 Asm->OutStreamer.SwitchSection(SectionMap[i]);
Chris Lattnerc0215722010-04-04 19:25:43 +00001242 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("section_end", i));
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001243 }
1244
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001245 // Compute DIE offsets and sizes.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001246 computeSizeAndOffsets();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001247
1248 // Emit all the DIEs into a debug info section
Devang Patel2c4ceb12009-11-21 02:48:08 +00001249 emitDebugInfo();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001250
1251 // Corresponding abbreviations into a abbrev section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001252 emitAbbreviations();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001253
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001254 // Emit info into a debug pubnames section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001255 emitDebugPubNames();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001256
Devang Patel193f7202009-11-24 01:14:22 +00001257 // Emit info into a debug pubtypes section.
1258 emitDebugPubTypes();
1259
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001260 // Emit info into a debug loc section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001261 emitDebugLoc();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001262
1263 // Emit info into a debug aranges section.
1264 EmitDebugARanges();
1265
1266 // Emit info into a debug ranges section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001267 emitDebugRanges();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001268
1269 // Emit info into a debug macinfo section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001270 emitDebugMacInfo();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001271
1272 // Emit inline info.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001273 emitDebugInlineInfo();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001274
Chris Lattnerbc733f52010-03-13 02:17:42 +00001275 // Emit info into a debug str section.
1276 emitDebugStr();
Jim Grosbach1e20b962010-07-21 21:21:52 +00001277
Devang Patele9a1cca2010-08-02 17:32:15 +00001278 // clean up.
1279 DeleteContainerSeconds(DeadFnScopeMap);
Devang Patel163a9f72010-05-10 22:49:55 +00001280 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
1281 E = CUMap.end(); I != E; ++I)
1282 delete I->second;
1283 FirstCU = NULL; // Reset for the next Module, if any.
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001284}
1285
Devang Patel53bb5c92009-11-10 23:06:00 +00001286/// findAbstractVariable - Find abstract variable, if any, associated with Var.
Chandler Carruth4147f392011-08-05 00:51:31 +00001287DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &Var,
Chris Lattnerde4845c2010-04-02 19:42:39 +00001288 DebugLoc ScopeLoc) {
Devang Patel53bb5c92009-11-10 23:06:00 +00001289
Devang Patel2db49d72010-05-07 18:11:54 +00001290 DbgVariable *AbsDbgVariable = AbstractVariables.lookup(Var);
Devang Patel53bb5c92009-11-10 23:06:00 +00001291 if (AbsDbgVariable)
1292 return AbsDbgVariable;
1293
Chandler Carruth4147f392011-08-05 00:51:31 +00001294 LLVMContext &Ctx = Var->getContext();
Chris Lattnerde4845c2010-04-02 19:42:39 +00001295 DbgScope *Scope = AbstractScopes.lookup(ScopeLoc.getScope(Ctx));
Devang Patel53bb5c92009-11-10 23:06:00 +00001296 if (!Scope)
1297 return NULL;
1298
Devang Patel26c1e562010-05-20 16:36:41 +00001299 AbsDbgVariable = new DbgVariable(Var);
Devang Patel2c4ceb12009-11-21 02:48:08 +00001300 Scope->addVariable(AbsDbgVariable);
Devang Patel2db49d72010-05-07 18:11:54 +00001301 AbstractVariables[Var] = AbsDbgVariable;
Devang Patel53bb5c92009-11-10 23:06:00 +00001302 return AbsDbgVariable;
1303}
1304
Nick Lewycky3bbb6f72011-07-29 03:49:23 +00001305/// addCurrentFnArgument - If Var is a current function argument then add
1306/// it to CurrentFnArguments list.
Devang Patel0478c152011-03-01 22:58:55 +00001307bool DwarfDebug::addCurrentFnArgument(const MachineFunction *MF,
1308 DbgVariable *Var, DbgScope *Scope) {
1309 if (Scope != CurrentFnDbgScope)
1310 return false;
1311 DIVariable DV = Var->getVariable();
1312 if (DV.getTag() != dwarf::DW_TAG_arg_variable)
1313 return false;
1314 unsigned ArgNo = DV.getArgNumber();
1315 if (ArgNo == 0)
1316 return false;
1317
Devang Patelcb3a6572011-03-03 20:02:02 +00001318 size_t Size = CurrentFnArguments.size();
1319 if (Size == 0)
Devang Patel0478c152011-03-01 22:58:55 +00001320 CurrentFnArguments.resize(MF->getFunction()->arg_size());
Devang Patelbbd0f452011-03-03 21:49:41 +00001321 // llvm::Function argument size is not good indicator of how many
Devang Patel6f676be2011-03-03 20:08:10 +00001322 // arguments does the function have at source level.
1323 if (ArgNo > Size)
Devang Patelcb3a6572011-03-03 20:02:02 +00001324 CurrentFnArguments.resize(ArgNo * 2);
Devang Patel0478c152011-03-01 22:58:55 +00001325 CurrentFnArguments[ArgNo - 1] = Var;
1326 return true;
1327}
1328
Devang Patelee432862010-05-20 19:57:06 +00001329/// collectVariableInfoFromMMITable - Collect variable information from
1330/// side table maintained by MMI.
Jim Grosbach1e20b962010-07-21 21:21:52 +00001331void
Nick Lewycky3bbb6f72011-07-29 03:49:23 +00001332DwarfDebug::collectVariableInfoFromMMITable(const MachineFunction *MF,
Devang Patelee432862010-05-20 19:57:06 +00001333 SmallPtrSet<const MDNode *, 16> &Processed) {
Devang Patele717faa2009-10-06 01:26:37 +00001334 MachineModuleInfo::VariableDbgInfoMapTy &VMap = MMI->getVariableDbgInfo();
1335 for (MachineModuleInfo::VariableDbgInfoMapTy::iterator VI = VMap.begin(),
1336 VE = VMap.end(); VI != VE; ++VI) {
Devang Patele9f8f5e2010-05-07 20:54:48 +00001337 const MDNode *Var = VI->first;
Devang Patel53bb5c92009-11-10 23:06:00 +00001338 if (!Var) continue;
Devang Patel98e1cac2010-05-14 21:01:35 +00001339 Processed.insert(Var);
Chris Lattnerde4845c2010-04-02 19:42:39 +00001340 DIVariable DV(Var);
1341 const std::pair<unsigned, DebugLoc> &VP = VI->second;
Devang Patel53bb5c92009-11-10 23:06:00 +00001342
Devang Patel9b4a1722011-07-14 23:17:49 +00001343 DbgScope *Scope = findDbgScope(VP.second);
Jim Grosbach1e20b962010-07-21 21:21:52 +00001344
Devang Patelfb0ee432009-11-10 23:20:04 +00001345 // If variable scope is not found then skip this variable.
Chris Lattnerde4845c2010-04-02 19:42:39 +00001346 if (Scope == 0)
Devang Patelfb0ee432009-11-10 23:20:04 +00001347 continue;
Devang Patel53bb5c92009-11-10 23:06:00 +00001348
Devang Patel26c1e562010-05-20 16:36:41 +00001349 DbgVariable *AbsDbgVariable = findAbstractVariable(DV, VP.second);
1350 DbgVariable *RegVar = new DbgVariable(DV);
1351 recordVariableFrameIndex(RegVar, VP.first);
Devang Patel0478c152011-03-01 22:58:55 +00001352 if (!addCurrentFnArgument(MF, RegVar, Scope))
1353 Scope->addVariable(RegVar);
Devang Patel26c1e562010-05-20 16:36:41 +00001354 if (AbsDbgVariable) {
1355 recordVariableFrameIndex(AbsDbgVariable, VP.first);
1356 VarToAbstractVarMap[RegVar] = AbsDbgVariable;
1357 }
Devang Patele717faa2009-10-06 01:26:37 +00001358 }
Devang Patelee432862010-05-20 19:57:06 +00001359}
Devang Patel90a48ad2010-03-15 18:33:46 +00001360
Jim Grosbach1e20b962010-07-21 21:21:52 +00001361/// isDbgValueInDefinedReg - Return true if debug value, encoded by
Devang Patelc3f5f782010-05-25 23:40:22 +00001362/// DBG_VALUE instruction, is in a defined reg.
1363static bool isDbgValueInDefinedReg(const MachineInstr *MI) {
1364 assert (MI->isDebugValue() && "Invalid DBG_VALUE machine instruction!");
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001365 return MI->getNumOperands() == 3 &&
1366 MI->getOperand(0).isReg() && MI->getOperand(0).getReg() &&
1367 MI->getOperand(1).isImm() && MI->getOperand(1).getImm() == 0;
Devang Patelc3f5f782010-05-25 23:40:22 +00001368}
1369
Nick Lewycky3bbb6f72011-07-29 03:49:23 +00001370/// getDebugLocEntry - Get .debug_loc entry for the instruction range starting
Devang Patel90b40412011-07-08 17:09:57 +00001371/// at MI.
1372static DotDebugLocEntry getDebugLocEntry(AsmPrinter *Asm,
1373 const MCSymbol *FLabel,
1374 const MCSymbol *SLabel,
1375 const MachineInstr *MI) {
1376 const MDNode *Var = MI->getOperand(MI->getNumOperands() - 1).getMetadata();
1377
1378 if (MI->getNumOperands() != 3) {
1379 MachineLocation MLoc = Asm->getDebugValueLocation(MI);
1380 return DotDebugLocEntry(FLabel, SLabel, MLoc, Var);
1381 }
1382 if (MI->getOperand(0).isReg() && MI->getOperand(1).isImm()) {
1383 MachineLocation MLoc;
1384 MLoc.set(MI->getOperand(0).getReg(), MI->getOperand(1).getImm());
1385 return DotDebugLocEntry(FLabel, SLabel, MLoc, Var);
1386 }
1387 if (MI->getOperand(0).isImm())
1388 return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getImm());
1389 if (MI->getOperand(0).isFPImm())
1390 return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getFPImm());
1391 if (MI->getOperand(0).isCImm())
1392 return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getCImm());
1393
1394 assert (0 && "Unexpected 3 operand DBG_VALUE instruction!");
1395 return DotDebugLocEntry();
1396}
1397
Devang Patelee432862010-05-20 19:57:06 +00001398/// collectVariableInfo - Populate DbgScope entries with variables' info.
Jim Grosbach1e20b962010-07-21 21:21:52 +00001399void
Devang Patel78e127d2010-06-25 22:07:34 +00001400DwarfDebug::collectVariableInfo(const MachineFunction *MF,
1401 SmallPtrSet<const MDNode *, 16> &Processed) {
Jim Grosbach1e20b962010-07-21 21:21:52 +00001402
Devang Patelee432862010-05-20 19:57:06 +00001403 /// collection info from MMI table.
1404 collectVariableInfoFromMMITable(MF, Processed);
1405
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001406 for (SmallVectorImpl<const MDNode*>::const_iterator
1407 UVI = UserVariables.begin(), UVE = UserVariables.end(); UVI != UVE;
1408 ++UVI) {
1409 const MDNode *Var = *UVI;
1410 if (Processed.count(Var))
Devang Patelee432862010-05-20 19:57:06 +00001411 continue;
1412
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001413 // History contains relevant DBG_VALUE instructions for Var and instructions
1414 // clobbering it.
1415 SmallVectorImpl<const MachineInstr*> &History = DbgValues[Var];
1416 if (History.empty())
1417 continue;
1418 const MachineInstr *MInsn = History.front();
Devang Patelc3f5f782010-05-25 23:40:22 +00001419
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001420 DIVariable DV(Var);
Devang Patela36478f2011-01-11 21:42:10 +00001421 DbgScope *Scope = NULL;
Devang Pateld8720f42010-05-27 20:25:04 +00001422 if (DV.getTag() == dwarf::DW_TAG_arg_variable &&
1423 DISubprogram(DV.getContext()).describes(MF->getFunction()))
Devang Patelc0c5a262010-05-21 00:10:20 +00001424 Scope = CurrentFnDbgScope;
Devang Patel40c7e412011-07-20 22:18:50 +00001425 else {
1426 if (DV.getVersion() <= LLVMDebugVersion9)
1427 Scope = findDbgScope(MInsn->getDebugLoc());
1428 else {
1429 if (MDNode *IA = DV.getInlinedAt())
1430 Scope = InlinedDbgScopeMap.lookup(DebugLoc::getFromDILocation(IA));
1431 else
1432 Scope = DbgScopeMap.lookup(cast<MDNode>(DV->getOperand(1)));
1433 }
1434 }
Devang Patelee432862010-05-20 19:57:06 +00001435 // If variable scope is not found then skip this variable.
Devang Patelc0c5a262010-05-21 00:10:20 +00001436 if (!Scope)
Devang Patelee432862010-05-20 19:57:06 +00001437 continue;
1438
1439 Processed.insert(DV);
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001440 assert(MInsn->isDebugValue() && "History must begin with debug value");
Devang Patelee432862010-05-20 19:57:06 +00001441 DbgVariable *RegVar = new DbgVariable(DV);
Devang Patel0478c152011-03-01 22:58:55 +00001442 if (!addCurrentFnArgument(MF, RegVar, Scope))
1443 Scope->addVariable(RegVar);
Devang Patelc0c5a262010-05-21 00:10:20 +00001444 if (DbgVariable *AbsVar = findAbstractVariable(DV, MInsn->getDebugLoc())) {
1445 DbgVariableToDbgInstMap[AbsVar] = MInsn;
1446 VarToAbstractVarMap[RegVar] = AbsVar;
Devang Patel90a48ad2010-03-15 18:33:46 +00001447 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001448
1449 // Simple ranges that are fully coalesced.
1450 if (History.size() <= 1 || (History.size() == 2 &&
1451 MInsn->isIdenticalTo(History.back()))) {
Devang Patelc3f5f782010-05-25 23:40:22 +00001452 DbgVariableToDbgInstMap[RegVar] = MInsn;
1453 continue;
1454 }
1455
1456 // handle multiple DBG_VALUE instructions describing one variable.
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001457 RegVar->setDotDebugLocOffset(DotDebugLocEntries.size());
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001458
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001459 for (SmallVectorImpl<const MachineInstr*>::const_iterator
1460 HI = History.begin(), HE = History.end(); HI != HE; ++HI) {
1461 const MachineInstr *Begin = *HI;
1462 assert(Begin->isDebugValue() && "Invalid History entry");
Jakob Stoklund Olesene17232e2011-03-22 00:21:41 +00001463
Devang Patel4ada1d72011-06-01 23:00:17 +00001464 // Check if DBG_VALUE is truncating a range.
1465 if (Begin->getNumOperands() > 1 && Begin->getOperand(0).isReg()
1466 && !Begin->getOperand(0).getReg())
1467 continue;
1468
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001469 // Compute the range for a register location.
1470 const MCSymbol *FLabel = getLabelBeforeInsn(Begin);
1471 const MCSymbol *SLabel = 0;
1472
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001473 if (HI + 1 == HE)
1474 // If Begin is the last instruction in History then its value is valid
Chris Lattner7a2bdde2011-04-15 05:18:47 +00001475 // until the end of the function.
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001476 SLabel = FunctionEndSym;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001477 else {
1478 const MachineInstr *End = HI[1];
Devang Patel476df5f2011-07-07 21:44:42 +00001479 DEBUG(dbgs() << "DotDebugLoc Pair:\n"
1480 << "\t" << *Begin << "\t" << *End << "\n");
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001481 if (End->isDebugValue())
1482 SLabel = getLabelBeforeInsn(End);
1483 else {
1484 // End is a normal instruction clobbering the range.
1485 SLabel = getLabelAfterInsn(End);
1486 assert(SLabel && "Forgot label after clobber instruction");
1487 ++HI;
1488 }
1489 }
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001490
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001491 // The value is valid until the next DBG_VALUE or clobber.
Devang Patel90b40412011-07-08 17:09:57 +00001492 DotDebugLocEntries.push_back(getDebugLocEntry(Asm, FLabel, SLabel, Begin));
Devang Patelc3f5f782010-05-25 23:40:22 +00001493 }
1494 DotDebugLocEntries.push_back(DotDebugLocEntry());
Devang Patel90a48ad2010-03-15 18:33:46 +00001495 }
Devang Patel98e1cac2010-05-14 21:01:35 +00001496
1497 // Collect info for variables that were optimized out.
Devang Pateld1bbc6b2010-06-22 01:01:58 +00001498 const Function *F = MF->getFunction();
Devang Patel62367042010-11-10 22:19:21 +00001499 if (NamedMDNode *NMD = getFnSpecificMDNode(*(F->getParent()), F->getName())) {
Devang Patel98e1cac2010-05-14 21:01:35 +00001500 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
Dan Gohman872814a2010-07-21 18:54:18 +00001501 DIVariable DV(cast<MDNode>(NMD->getOperand(i)));
Devang Patelee432862010-05-20 19:57:06 +00001502 if (!DV || !Processed.insert(DV))
Devang Patel98e1cac2010-05-14 21:01:35 +00001503 continue;
1504 DbgScope *Scope = DbgScopeMap.lookup(DV.getContext());
1505 if (Scope)
Devang Patel26c1e562010-05-20 16:36:41 +00001506 Scope->addVariable(new DbgVariable(DV));
Devang Patel98e1cac2010-05-14 21:01:35 +00001507 }
1508 }
Devang Patelc3f5f782010-05-25 23:40:22 +00001509}
Devang Patel98e1cac2010-05-14 21:01:35 +00001510
Devang Patelc3f5f782010-05-25 23:40:22 +00001511/// getLabelBeforeInsn - Return Label preceding the instruction.
1512const MCSymbol *DwarfDebug::getLabelBeforeInsn(const MachineInstr *MI) {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001513 MCSymbol *Label = LabelsBeforeInsn.lookup(MI);
1514 assert(Label && "Didn't insert label before instruction");
1515 return Label;
Devang Patelc3f5f782010-05-25 23:40:22 +00001516}
1517
1518/// getLabelAfterInsn - Return Label immediately following the instruction.
1519const MCSymbol *DwarfDebug::getLabelAfterInsn(const MachineInstr *MI) {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001520 return LabelsAfterInsn.lookup(MI);
Devang Patele717faa2009-10-06 01:26:37 +00001521}
1522
Devang Patelcbbe2872010-10-26 17:49:02 +00001523/// beginInstruction - Process beginning of an instruction.
1524void DwarfDebug::beginInstruction(const MachineInstr *MI) {
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001525 // Check if source location changes, but ignore DBG_VALUE locations.
1526 if (!MI->isDebugValue()) {
1527 DebugLoc DL = MI->getDebugLoc();
1528 if (DL != PrevInstLoc && (!DL.isUnknown() || UnknownLocations)) {
Devang Patel4243e672011-05-11 19:22:19 +00001529 unsigned Flags = DWARF2_FLAG_IS_STMT;
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001530 PrevInstLoc = DL;
Devang Patel4243e672011-05-11 19:22:19 +00001531 if (DL == PrologEndLoc) {
1532 Flags |= DWARF2_FLAG_PROLOGUE_END;
1533 PrologEndLoc = DebugLoc();
1534 }
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001535 if (!DL.isUnknown()) {
1536 const MDNode *Scope = DL.getScope(Asm->MF->getFunction()->getContext());
Devang Patel4243e672011-05-11 19:22:19 +00001537 recordSourceLine(DL.getLine(), DL.getCol(), Scope, Flags);
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001538 } else
Devang Patel4243e672011-05-11 19:22:19 +00001539 recordSourceLine(0, 0, 0, 0);
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001540 }
Devang Patelc3f5f782010-05-25 23:40:22 +00001541 }
Devang Patelaead63c2010-03-29 22:59:58 +00001542
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001543 // Insert labels where requested.
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001544 DenseMap<const MachineInstr*, MCSymbol*>::iterator I =
1545 LabelsBeforeInsn.find(MI);
1546
1547 // No label needed.
1548 if (I == LabelsBeforeInsn.end())
1549 return;
1550
1551 // Label already assigned.
1552 if (I->second)
Devang Patelb2b31a62010-05-26 19:37:24 +00001553 return;
Devang Patel553881b2010-03-29 17:20:31 +00001554
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001555 if (!PrevLabel) {
Devang Patel77051f52010-05-26 21:23:46 +00001556 PrevLabel = MMI->getContext().CreateTempSymbol();
1557 Asm->OutStreamer.EmitLabel(PrevLabel);
Devang Patelb2b31a62010-05-26 19:37:24 +00001558 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001559 I->second = PrevLabel;
Devang Patel0d20ac82009-10-06 01:50:42 +00001560}
1561
Devang Patelcbbe2872010-10-26 17:49:02 +00001562/// endInstruction - Process end of an instruction.
1563void DwarfDebug::endInstruction(const MachineInstr *MI) {
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001564 // Don't create a new label after DBG_VALUE instructions.
1565 // They don't generate code.
1566 if (!MI->isDebugValue())
1567 PrevLabel = 0;
1568
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001569 DenseMap<const MachineInstr*, MCSymbol*>::iterator I =
1570 LabelsAfterInsn.find(MI);
1571
1572 // No label needed.
1573 if (I == LabelsAfterInsn.end())
1574 return;
1575
1576 // Label already assigned.
1577 if (I->second)
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00001578 return;
1579
1580 // We need a label after this instruction.
1581 if (!PrevLabel) {
1582 PrevLabel = MMI->getContext().CreateTempSymbol();
1583 Asm->OutStreamer.EmitLabel(PrevLabel);
Devang Patel1c246352010-04-08 16:50:29 +00001584 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001585 I->second = PrevLabel;
Devang Patel53bb5c92009-11-10 23:06:00 +00001586}
1587
Devang Patel3737b892011-07-20 23:00:27 +00001588/// getOrCreateRegularScope - Create regular DbgScope.
1589DbgScope *DwarfDebug::getOrCreateRegularScope(MDNode *Scope) {
1590 DbgScope *WScope = DbgScopeMap.lookup(Scope);
Devang Patelc0405292011-08-08 18:22:10 +00001591 if (WScope)
Devang Patel3737b892011-07-20 23:00:27 +00001592 return WScope;
Devang Patelc0405292011-08-08 18:22:10 +00001593
1594 DbgScope *Parent = NULL;
1595 if (DIDescriptor(Scope).isLexicalBlock())
1596 Parent = getOrCreateDbgScope(DebugLoc::getFromDILexicalBlock(Scope));
1597 WScope = new DbgScope(Parent, DIDescriptor(Scope), NULL);
Devang Patel3737b892011-07-20 23:00:27 +00001598 DbgScopeMap.insert(std::make_pair(Scope, WScope));
Devang Patelc0405292011-08-08 18:22:10 +00001599 if (!Parent && DIDescriptor(Scope).isSubprogram()
1600 && DISubprogram(Scope).describes(Asm->MF->getFunction()))
Devang Patel3737b892011-07-20 23:00:27 +00001601 CurrentFnDbgScope = WScope;
1602
1603 return WScope;
1604}
1605
1606/// getOrCreateInlinedScope - Create inlined scope.
1607DbgScope *DwarfDebug::getOrCreateInlinedScope(MDNode *Scope, MDNode *InlinedAt){
1608 DbgScope *InlinedScope = DbgScopeMap.lookup(InlinedAt);
1609 if (InlinedScope)
1610 return InlinedScope;
1611
Devang Patel3737b892011-07-20 23:00:27 +00001612 DebugLoc InlinedLoc = DebugLoc::getFromDILocation(InlinedAt);
Devang Patelc0405292011-08-08 18:22:10 +00001613 InlinedScope = new DbgScope(getOrCreateDbgScope(InlinedLoc),
1614 DIDescriptor(Scope), InlinedAt);
Devang Patel3737b892011-07-20 23:00:27 +00001615 InlinedDbgScopeMap[InlinedLoc] = InlinedScope;
1616 DbgScopeMap[InlinedAt] = InlinedScope;
Devang Patel3737b892011-07-20 23:00:27 +00001617 return InlinedScope;
1618}
1619
Devang Pateleac9c072010-04-27 19:46:33 +00001620/// getOrCreateDbgScope - Create DbgScope for the scope.
Devang Patel4f455d62011-07-14 22:30:56 +00001621DbgScope *DwarfDebug::getOrCreateDbgScope(DebugLoc DL) {
1622 LLVMContext &Ctx = Asm->MF->getFunction()->getContext();
Devang Pateld77ec622011-07-14 01:14:57 +00001623 MDNode *Scope = NULL;
1624 MDNode *InlinedAt = NULL;
1625 DL.getScopeAndInlinedAt(Scope, InlinedAt, Ctx);
Devang Patel3737b892011-07-20 23:00:27 +00001626 if (!InlinedAt)
1627 return getOrCreateRegularScope(Scope);
Devang Pateld77ec622011-07-14 01:14:57 +00001628
Devang Patel3737b892011-07-20 23:00:27 +00001629 // Create an abstract scope for inlined function.
Devang Patel78e127d2010-06-25 22:07:34 +00001630 getOrCreateAbstractScope(Scope);
Devang Patel3737b892011-07-20 23:00:27 +00001631 // Create an inlined scope for inlined function.
1632 return getOrCreateInlinedScope(Scope, InlinedAt);
Devang Patel0d20ac82009-10-06 01:50:42 +00001633}
1634
Devang Pateleac9c072010-04-27 19:46:33 +00001635/// calculateDominanceGraph - Calculate dominance graph for DbgScope
1636/// hierarchy.
1637static void calculateDominanceGraph(DbgScope *Scope) {
1638 assert (Scope && "Unable to calculate scop edominance graph!");
1639 SmallVector<DbgScope *, 4> WorkStack;
1640 WorkStack.push_back(Scope);
1641 unsigned Counter = 0;
1642 while (!WorkStack.empty()) {
1643 DbgScope *WS = WorkStack.back();
1644 const SmallVector<DbgScope *, 4> &Children = WS->getScopes();
1645 bool visitedChildren = false;
1646 for (SmallVector<DbgScope *, 4>::const_iterator SI = Children.begin(),
1647 SE = Children.end(); SI != SE; ++SI) {
1648 DbgScope *ChildScope = *SI;
1649 if (!ChildScope->getDFSOut()) {
1650 WorkStack.push_back(ChildScope);
1651 visitedChildren = true;
1652 ChildScope->setDFSIn(++Counter);
Devang Patel26a92002011-07-27 00:34:13 +00001653#ifndef NDEBUG
1654 if (PrintDbgScope)
1655 dbgs() << "calculate dbgscope dom: In " << Counter << "\n";
1656#endif
Devang Pateleac9c072010-04-27 19:46:33 +00001657 break;
1658 }
1659 }
1660 if (!visitedChildren) {
1661 WorkStack.pop_back();
1662 WS->setDFSOut(++Counter);
Devang Patel26a92002011-07-27 00:34:13 +00001663#ifndef NDEBUG
1664 if (PrintDbgScope)
1665 dbgs() << "calculate dbgscope dom: In " << WS->getDFSIn()
1666 << " Out " << Counter << "\n";
1667#endif
Devang Pateleac9c072010-04-27 19:46:33 +00001668 }
1669 }
1670}
1671
1672/// printDbgScopeInfo - Print DbgScope info for each machine instruction.
Jim Grosbach1e20b962010-07-21 21:21:52 +00001673static
Devang Patel4f455d62011-07-14 22:30:56 +00001674void printDbgScopeInfo(const MachineFunction *MF,
Devang Pateleac9c072010-04-27 19:46:33 +00001675 DenseMap<const MachineInstr *, DbgScope *> &MI2ScopeMap)
1676{
1677#ifndef NDEBUG
Devang Patel4f455d62011-07-14 22:30:56 +00001678 LLVMContext &Ctx = MF->getFunction()->getContext();
Devang Pateleac9c072010-04-27 19:46:33 +00001679 unsigned PrevDFSIn = 0;
1680 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
1681 I != E; ++I) {
1682 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
1683 II != IE; ++II) {
1684 const MachineInstr *MInsn = II;
Devang Patel0cd0c242011-07-14 00:20:24 +00001685 MDNode *Scope = NULL;
1686 MDNode *InlinedAt = NULL;
Devang Pateleac9c072010-04-27 19:46:33 +00001687
1688 // Check if instruction has valid location information.
Devang Patel0cd0c242011-07-14 00:20:24 +00001689 DebugLoc MIDL = MInsn->getDebugLoc();
1690 if (!MIDL.isUnknown()) {
1691 MIDL.getScopeAndInlinedAt(Scope, InlinedAt, Ctx);
Devang Pateleac9c072010-04-27 19:46:33 +00001692 dbgs() << " [ ";
Jim Grosbach1e20b962010-07-21 21:21:52 +00001693 if (InlinedAt)
Devang Pateleac9c072010-04-27 19:46:33 +00001694 dbgs() << "*";
Jim Grosbach1e20b962010-07-21 21:21:52 +00001695 DenseMap<const MachineInstr *, DbgScope *>::iterator DI =
Devang Pateleac9c072010-04-27 19:46:33 +00001696 MI2ScopeMap.find(MInsn);
1697 if (DI != MI2ScopeMap.end()) {
1698 DbgScope *S = DI->second;
1699 dbgs() << S->getDFSIn();
1700 PrevDFSIn = S->getDFSIn();
1701 } else
1702 dbgs() << PrevDFSIn;
Jim Grosbach1e20b962010-07-21 21:21:52 +00001703 } else
Devang Pateleac9c072010-04-27 19:46:33 +00001704 dbgs() << " [ x" << PrevDFSIn;
1705 dbgs() << " ]";
1706 MInsn->dump();
1707 }
1708 dbgs() << "\n";
1709 }
1710#endif
1711}
Devang Patel2c4ceb12009-11-21 02:48:08 +00001712/// extractScopeInformation - Scan machine instructions in this function
Chris Lattner14d750d2010-03-31 05:39:57 +00001713/// and collect DbgScopes. Return true, if at least one scope was found.
Chris Lattnereec791a2010-01-26 23:18:02 +00001714bool DwarfDebug::extractScopeInformation() {
Devang Patelaf9e8472009-10-01 20:31:14 +00001715 // If scope information was extracted using .dbg intrinsics then there is not
1716 // any need to extract these information by scanning each instruction.
1717 if (!DbgScopeMap.empty())
1718 return false;
1719
Dan Gohman314bf7c2010-04-23 01:18:53 +00001720 // Scan each instruction and create scopes. First build working set of scopes.
Devang Pateleac9c072010-04-27 19:46:33 +00001721 SmallVector<DbgRange, 4> MIRanges;
1722 DenseMap<const MachineInstr *, DbgScope *> MI2ScopeMap;
Chris Lattnerd38fee82010-04-05 00:13:49 +00001723 for (MachineFunction::const_iterator I = Asm->MF->begin(), E = Asm->MF->end();
Devang Patelaf9e8472009-10-01 20:31:14 +00001724 I != E; ++I) {
Devang Patela671a302011-07-26 18:09:53 +00001725 const MachineInstr *RangeBeginMI = NULL;
1726 const MachineInstr *PrevMI = NULL;
1727 DebugLoc PrevDL;
Devang Patelaf9e8472009-10-01 20:31:14 +00001728 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
1729 II != IE; ++II) {
1730 const MachineInstr *MInsn = II;
Devang Pateleac9c072010-04-27 19:46:33 +00001731
1732 // Check if instruction has valid location information.
Devang Patel0cd0c242011-07-14 00:20:24 +00001733 const DebugLoc MIDL = MInsn->getDebugLoc();
1734 if (MIDL.isUnknown()) {
Devang Pateleac9c072010-04-27 19:46:33 +00001735 PrevMI = MInsn;
1736 continue;
1737 }
Jim Grosbach1e20b962010-07-21 21:21:52 +00001738
Devang Pateleac9c072010-04-27 19:46:33 +00001739 // If scope has not changed then skip this instruction.
Devang Pateld77ec622011-07-14 01:14:57 +00001740 if (MIDL == PrevDL) {
Devang Pateleac9c072010-04-27 19:46:33 +00001741 PrevMI = MInsn;
1742 continue;
1743 }
1744
Nick Lewycky3bbb6f72011-07-29 03:49:23 +00001745 // Ignore DBG_VALUE. It does not contribute to any instruction in output.
Devang Pateld3526ea2011-02-15 17:56:09 +00001746 if (MInsn->isDebugValue())
1747 continue;
1748
Jim Grosbach1e20b962010-07-21 21:21:52 +00001749 if (RangeBeginMI) {
Nick Lewycky3bbb6f72011-07-29 03:49:23 +00001750 // If we have already seen a beginning of an instruction range and
Devang Pateleac9c072010-04-27 19:46:33 +00001751 // current instruction scope does not match scope of first instruction
1752 // in this range then create a new instruction range.
Devang Patel0f16a4e2011-07-14 00:04:53 +00001753 DEBUG(dbgs() << "Creating new instruction range :\n");
Devang Patel5fc0d882011-07-14 00:03:58 +00001754 DEBUG(dbgs() << "Begin Range at " << *RangeBeginMI);
1755 DEBUG(dbgs() << "End Range at " << *PrevMI);
Devang Patel0f16a4e2011-07-14 00:04:53 +00001756 DEBUG(dbgs() << "Next Range starting at " << *MInsn);
Devang Patel5fc0d882011-07-14 00:03:58 +00001757 DEBUG(dbgs() << "------------------------\n");
Devang Pateleac9c072010-04-27 19:46:33 +00001758 DbgRange R(RangeBeginMI, PrevMI);
Devang Patel4f455d62011-07-14 22:30:56 +00001759 MI2ScopeMap[RangeBeginMI] = getOrCreateDbgScope(PrevDL);
Devang Pateleac9c072010-04-27 19:46:33 +00001760 MIRanges.push_back(R);
Jim Grosbach1e20b962010-07-21 21:21:52 +00001761 }
Devang Pateleac9c072010-04-27 19:46:33 +00001762
1763 // This is a beginning of a new instruction range.
1764 RangeBeginMI = MInsn;
Jim Grosbach1e20b962010-07-21 21:21:52 +00001765
Devang Pateleac9c072010-04-27 19:46:33 +00001766 // Reset previous markers.
1767 PrevMI = MInsn;
Devang Pateld77ec622011-07-14 01:14:57 +00001768 PrevDL = MIDL;
Devang Patel53bb5c92009-11-10 23:06:00 +00001769 }
Devang Patel53bb5c92009-11-10 23:06:00 +00001770
Devang Patela671a302011-07-26 18:09:53 +00001771 // Create last instruction range.
1772 if (RangeBeginMI && PrevMI && !PrevDL.isUnknown()) {
1773 DbgRange R(RangeBeginMI, PrevMI);
1774 MIRanges.push_back(R);
1775 MI2ScopeMap[RangeBeginMI] = getOrCreateDbgScope(PrevDL);
1776 }
Devang Patelaf9e8472009-10-01 20:31:14 +00001777 }
Jim Grosbach1e20b962010-07-21 21:21:52 +00001778
Devang Patel344130e2010-01-04 20:44:00 +00001779 if (!CurrentFnDbgScope)
1780 return false;
1781
Devang Pateleac9c072010-04-27 19:46:33 +00001782 calculateDominanceGraph(CurrentFnDbgScope);
1783 if (PrintDbgScope)
Devang Patel4f455d62011-07-14 22:30:56 +00001784 printDbgScopeInfo(Asm->MF, MI2ScopeMap);
Devang Pateleac9c072010-04-27 19:46:33 +00001785
1786 // Find ranges of instructions covered by each DbgScope;
1787 DbgScope *PrevDbgScope = NULL;
1788 for (SmallVector<DbgRange, 4>::const_iterator RI = MIRanges.begin(),
1789 RE = MIRanges.end(); RI != RE; ++RI) {
1790 const DbgRange &R = *RI;
1791 DbgScope *S = MI2ScopeMap.lookup(R.first);
1792 assert (S && "Lost DbgScope for a machine instruction!");
1793 if (PrevDbgScope && !PrevDbgScope->dominates(S))
1794 PrevDbgScope->closeInsnRange(S);
1795 S->openInsnRange(R.first);
1796 S->extendInsnRange(R.second);
1797 PrevDbgScope = S;
1798 }
1799
1800 if (PrevDbgScope)
1801 PrevDbgScope->closeInsnRange();
Devang Patelaf9e8472009-10-01 20:31:14 +00001802
Devang Patele37b0c62010-04-08 18:43:56 +00001803 identifyScopeMarkers();
Devang Patel6122a4d2010-04-08 15:37:09 +00001804
1805 return !DbgScopeMap.empty();
1806}
1807
Jim Grosbach1e20b962010-07-21 21:21:52 +00001808/// identifyScopeMarkers() -
Devang Pateleac9c072010-04-27 19:46:33 +00001809/// Each DbgScope has first instruction and last instruction to mark beginning
1810/// and end of a scope respectively. Create an inverse map that list scopes
1811/// starts (and ends) with an instruction. One instruction may start (or end)
1812/// multiple scopes. Ignore scopes that are not reachable.
Devang Patele37b0c62010-04-08 18:43:56 +00001813void DwarfDebug::identifyScopeMarkers() {
Devang Patel42aafd72010-01-20 02:05:23 +00001814 SmallVector<DbgScope *, 4> WorkList;
1815 WorkList.push_back(CurrentFnDbgScope);
1816 while (!WorkList.empty()) {
Chris Lattner14d750d2010-03-31 05:39:57 +00001817 DbgScope *S = WorkList.pop_back_val();
Jim Grosbach1e20b962010-07-21 21:21:52 +00001818
Jeffrey Yasskin5c213dc2010-03-12 17:45:06 +00001819 const SmallVector<DbgScope *, 4> &Children = S->getScopes();
Jim Grosbach1e20b962010-07-21 21:21:52 +00001820 if (!Children.empty())
Jeffrey Yasskin5c213dc2010-03-12 17:45:06 +00001821 for (SmallVector<DbgScope *, 4>::const_iterator SI = Children.begin(),
Devang Patel42aafd72010-01-20 02:05:23 +00001822 SE = Children.end(); SI != SE; ++SI)
1823 WorkList.push_back(*SI);
1824
Devang Patel53bb5c92009-11-10 23:06:00 +00001825 if (S->isAbstractScope())
1826 continue;
Jim Grosbach1e20b962010-07-21 21:21:52 +00001827
Devang Pateleac9c072010-04-27 19:46:33 +00001828 const SmallVector<DbgRange, 4> &Ranges = S->getRanges();
1829 if (Ranges.empty())
1830 continue;
1831 for (SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin(),
1832 RE = Ranges.end(); RI != RE; ++RI) {
Jim Grosbach1e20b962010-07-21 21:21:52 +00001833 assert(RI->first && "DbgRange does not have first instruction!");
1834 assert(RI->second && "DbgRange does not have second instruction!");
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001835 requestLabelBeforeInsn(RI->first);
1836 requestLabelAfterInsn(RI->second);
Devang Pateleac9c072010-04-27 19:46:33 +00001837 }
Devang Patelaf9e8472009-10-01 20:31:14 +00001838 }
Devang Patelaf9e8472009-10-01 20:31:14 +00001839}
1840
Devang Patela3f48672011-05-09 22:14:49 +00001841/// getScopeNode - Get MDNode for DebugLoc's scope.
1842static MDNode *getScopeNode(DebugLoc DL, const LLVMContext &Ctx) {
1843 if (MDNode *InlinedAt = DL.getInlinedAt(Ctx))
1844 return getScopeNode(DebugLoc::getFromDILocation(InlinedAt), Ctx);
1845 return DL.getScope(Ctx);
1846}
1847
Devang Patel4243e672011-05-11 19:22:19 +00001848/// getFnDebugLoc - Walk up the scope chain of given debug loc and find
1849/// line number info for the function.
1850static DebugLoc getFnDebugLoc(DebugLoc DL, const LLVMContext &Ctx) {
1851 const MDNode *Scope = getScopeNode(DL, Ctx);
1852 DISubprogram SP = getDISubprogram(Scope);
1853 if (SP.Verify())
1854 return DebugLoc::get(SP.getLineNumber(), 0, SP);
1855 return DebugLoc();
1856}
1857
Devang Patel2c4ceb12009-11-21 02:48:08 +00001858/// beginFunction - Gather pre-function debug information. Assumes being
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001859/// emitted immediately after the function entry point.
Chris Lattnereec791a2010-01-26 23:18:02 +00001860void DwarfDebug::beginFunction(const MachineFunction *MF) {
Chris Lattner994cb122010-04-05 03:52:55 +00001861 if (!MMI->hasDebugInfo()) return;
Bill Wendling5f017e82010-04-07 09:28:04 +00001862 if (!extractScopeInformation()) return;
Devang Patel60b35bd2009-10-06 18:37:31 +00001863
Devang Pateleac9c072010-04-27 19:46:33 +00001864 FunctionBeginSym = Asm->GetTempSymbol("func_begin",
1865 Asm->getFunctionNumber());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001866 // Assumes in correct section after the entry point.
Devang Pateleac9c072010-04-27 19:46:33 +00001867 Asm->OutStreamer.EmitLabel(FunctionBeginSym);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001868
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001869 assert(UserVariables.empty() && DbgValues.empty() && "Maps weren't cleaned");
1870
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001871 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001872 /// LiveUserVar - Map physreg numbers to the MDNode they contain.
1873 std::vector<const MDNode*> LiveUserVar(TRI->getNumRegs());
1874
Devang Patelb2b31a62010-05-26 19:37:24 +00001875 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001876 I != E; ++I) {
1877 bool AtBlockEntry = true;
Devang Patelb2b31a62010-05-26 19:37:24 +00001878 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
1879 II != IE; ++II) {
1880 const MachineInstr *MI = II;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001881
Devang Patelb2b31a62010-05-26 19:37:24 +00001882 if (MI->isDebugValue()) {
Devang Patelb2b31a62010-05-26 19:37:24 +00001883 assert (MI->getNumOperands() > 1 && "Invalid machine instruction!");
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001884
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001885 // Keep track of user variables.
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001886 const MDNode *Var =
1887 MI->getOperand(MI->getNumOperands() - 1).getMetadata();
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001888
1889 // Variable is in a register, we need to check for clobbers.
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001890 if (isDbgValueInDefinedReg(MI))
1891 LiveUserVar[MI->getOperand(0).getReg()] = Var;
1892
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001893 // Check the history of this variable.
1894 SmallVectorImpl<const MachineInstr*> &History = DbgValues[Var];
1895 if (History.empty()) {
1896 UserVariables.push_back(Var);
1897 // The first mention of a function argument gets the FunctionBeginSym
1898 // label, so arguments are visible when breaking at function entry.
1899 DIVariable DV(Var);
1900 if (DV.Verify() && DV.getTag() == dwarf::DW_TAG_arg_variable &&
1901 DISubprogram(getDISubprogram(DV.getContext()))
1902 .describes(MF->getFunction()))
1903 LabelsBeforeInsn[MI] = FunctionBeginSym;
1904 } else {
1905 // We have seen this variable before. Try to coalesce DBG_VALUEs.
1906 const MachineInstr *Prev = History.back();
1907 if (Prev->isDebugValue()) {
1908 // Coalesce identical entries at the end of History.
1909 if (History.size() >= 2 &&
Devang Patel79862892011-07-07 00:14:27 +00001910 Prev->isIdenticalTo(History[History.size() - 2])) {
1911 DEBUG(dbgs() << "Coalesce identical DBG_VALUE entries:\n"
1912 << "\t" << *Prev
1913 << "\t" << *History[History.size() - 2] << "\n");
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001914 History.pop_back();
Devang Patel79862892011-07-07 00:14:27 +00001915 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001916
1917 // Terminate old register assignments that don't reach MI;
1918 MachineFunction::const_iterator PrevMBB = Prev->getParent();
1919 if (PrevMBB != I && (!AtBlockEntry || llvm::next(PrevMBB) != I) &&
1920 isDbgValueInDefinedReg(Prev)) {
1921 // Previous register assignment needs to terminate at the end of
1922 // its basic block.
1923 MachineBasicBlock::const_iterator LastMI =
1924 PrevMBB->getLastNonDebugInstr();
Devang Patel79862892011-07-07 00:14:27 +00001925 if (LastMI == PrevMBB->end()) {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001926 // Drop DBG_VALUE for empty range.
Devang Patel79862892011-07-07 00:14:27 +00001927 DEBUG(dbgs() << "Drop DBG_VALUE for empty range:\n"
1928 << "\t" << *Prev << "\n");
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001929 History.pop_back();
Devang Patel79862892011-07-07 00:14:27 +00001930 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001931 else {
1932 // Terminate after LastMI.
1933 History.push_back(LastMI);
1934 }
1935 }
1936 }
1937 }
1938 History.push_back(MI);
Devang Patelb2b31a62010-05-26 19:37:24 +00001939 } else {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001940 // Not a DBG_VALUE instruction.
1941 if (!MI->isLabel())
1942 AtBlockEntry = false;
1943
Devang Patel4243e672011-05-11 19:22:19 +00001944 // First known non DBG_VALUE location marks beginning of function
1945 // body.
1946 if (PrologEndLoc.isUnknown() && !MI->getDebugLoc().isUnknown())
1947 PrologEndLoc = MI->getDebugLoc();
1948
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001949 // Check if the instruction clobbers any registers with debug vars.
1950 for (MachineInstr::const_mop_iterator MOI = MI->operands_begin(),
1951 MOE = MI->operands_end(); MOI != MOE; ++MOI) {
1952 if (!MOI->isReg() || !MOI->isDef() || !MOI->getReg())
1953 continue;
1954 for (const unsigned *AI = TRI->getOverlaps(MOI->getReg());
1955 unsigned Reg = *AI; ++AI) {
1956 const MDNode *Var = LiveUserVar[Reg];
1957 if (!Var)
1958 continue;
1959 // Reg is now clobbered.
1960 LiveUserVar[Reg] = 0;
1961
1962 // Was MD last defined by a DBG_VALUE referring to Reg?
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001963 DbgValueHistoryMap::iterator HistI = DbgValues.find(Var);
1964 if (HistI == DbgValues.end())
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001965 continue;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001966 SmallVectorImpl<const MachineInstr*> &History = HistI->second;
1967 if (History.empty())
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001968 continue;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001969 const MachineInstr *Prev = History.back();
1970 // Sanity-check: Register assignments are terminated at the end of
1971 // their block.
1972 if (!Prev->isDebugValue() || Prev->getParent() != MI->getParent())
1973 continue;
1974 // Is the variable still in Reg?
1975 if (!isDbgValueInDefinedReg(Prev) ||
1976 Prev->getOperand(0).getReg() != Reg)
1977 continue;
1978 // Var is clobbered. Make sure the next instruction gets a label.
1979 History.push_back(MI);
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00001980 }
1981 }
Devang Patelb2b31a62010-05-26 19:37:24 +00001982 }
Devang Patelb2b31a62010-05-26 19:37:24 +00001983 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00001984 }
1985
1986 for (DbgValueHistoryMap::iterator I = DbgValues.begin(), E = DbgValues.end();
1987 I != E; ++I) {
1988 SmallVectorImpl<const MachineInstr*> &History = I->second;
1989 if (History.empty())
1990 continue;
1991
1992 // Make sure the final register assignments are terminated.
1993 const MachineInstr *Prev = History.back();
1994 if (Prev->isDebugValue() && isDbgValueInDefinedReg(Prev)) {
1995 const MachineBasicBlock *PrevMBB = Prev->getParent();
1996 MachineBasicBlock::const_iterator LastMI = PrevMBB->getLastNonDebugInstr();
1997 if (LastMI == PrevMBB->end())
1998 // Drop DBG_VALUE for empty range.
1999 History.pop_back();
2000 else {
2001 // Terminate after LastMI.
2002 History.push_back(LastMI);
2003 }
2004 }
2005 // Request labels for the full history.
2006 for (unsigned i = 0, e = History.size(); i != e; ++i) {
2007 const MachineInstr *MI = History[i];
2008 if (MI->isDebugValue())
2009 requestLabelBeforeInsn(MI);
2010 else
2011 requestLabelAfterInsn(MI);
2012 }
2013 }
Devang Patelb2b31a62010-05-26 19:37:24 +00002014
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00002015 PrevInstLoc = DebugLoc();
Devang Patelb2b31a62010-05-26 19:37:24 +00002016 PrevLabel = FunctionBeginSym;
Devang Patel4243e672011-05-11 19:22:19 +00002017
2018 // Record beginning of function.
2019 if (!PrologEndLoc.isUnknown()) {
2020 DebugLoc FnStartDL = getFnDebugLoc(PrologEndLoc,
2021 MF->getFunction()->getContext());
2022 recordSourceLine(FnStartDL.getLine(), FnStartDL.getCol(),
2023 FnStartDL.getScope(MF->getFunction()->getContext()),
2024 DWARF2_FLAG_IS_STMT);
2025 }
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002026}
2027
Devang Patel2c4ceb12009-11-21 02:48:08 +00002028/// endFunction - Gather and emit post-function debug information.
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002029///
Chris Lattnereec791a2010-01-26 23:18:02 +00002030void DwarfDebug::endFunction(const MachineFunction *MF) {
Bill Wendling5f017e82010-04-07 09:28:04 +00002031 if (!MMI->hasDebugInfo() || DbgScopeMap.empty()) return;
Devang Patel70d75ca2009-11-12 19:02:56 +00002032
Devang Patel344130e2010-01-04 20:44:00 +00002033 if (CurrentFnDbgScope) {
Devang Patel65eb4822010-05-22 00:04:14 +00002034
Devang Patelc3f5f782010-05-25 23:40:22 +00002035 // Define end label for subprogram.
2036 FunctionEndSym = Asm->GetTempSymbol("func_end",
2037 Asm->getFunctionNumber());
2038 // Assumes in correct section after the entry point.
2039 Asm->OutStreamer.EmitLabel(FunctionEndSym);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002040
Devang Patel78e127d2010-06-25 22:07:34 +00002041 SmallPtrSet<const MDNode *, 16> ProcessedVars;
2042 collectVariableInfo(MF, ProcessedVars);
Devang Patel65eb4822010-05-22 00:04:14 +00002043
Devang Patel344130e2010-01-04 20:44:00 +00002044 // Construct abstract scopes.
2045 for (SmallVector<DbgScope *, 4>::iterator AI = AbstractScopesList.begin(),
Devang Patel78e127d2010-06-25 22:07:34 +00002046 AE = AbstractScopesList.end(); AI != AE; ++AI) {
Devang Patel78e127d2010-06-25 22:07:34 +00002047 DISubprogram SP((*AI)->getScopeNode());
2048 if (SP.Verify()) {
2049 // Collect info for variables that were optimized out.
2050 StringRef FName = SP.getLinkageName();
2051 if (FName.empty())
2052 FName = SP.getName();
Devang Patel62367042010-11-10 22:19:21 +00002053 if (NamedMDNode *NMD =
2054 getFnSpecificMDNode(*(MF->getFunction()->getParent()), FName)) {
Devang Patel78e127d2010-06-25 22:07:34 +00002055 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
Dan Gohman872814a2010-07-21 18:54:18 +00002056 DIVariable DV(cast<MDNode>(NMD->getOperand(i)));
Devang Patel78e127d2010-06-25 22:07:34 +00002057 if (!DV || !ProcessedVars.insert(DV))
2058 continue;
Devang Patel1d68d212010-06-30 00:11:08 +00002059 DbgScope *Scope = AbstractScopes.lookup(DV.getContext());
Devang Patel78e127d2010-06-25 22:07:34 +00002060 if (Scope)
2061 Scope->addVariable(new DbgVariable(DV));
2062 }
2063 }
2064 }
Devang Patel90e19aa2010-06-30 01:40:11 +00002065 if (ProcessedSPNodes.count((*AI)->getScopeNode()) == 0)
2066 constructScopeDIE(*AI);
Devang Patel78e127d2010-06-25 22:07:34 +00002067 }
Devang Patel61409622010-07-07 20:12:52 +00002068
Devang Patel9c488372010-05-04 06:15:30 +00002069 DIE *CurFnDIE = constructScopeDIE(CurrentFnDbgScope);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002070
Devang Patel9c488372010-05-04 06:15:30 +00002071 if (!DisableFramePointerElim(*MF))
Devang Patel3cbee302011-04-12 22:53:02 +00002072 getCompileUnit(CurrentFnDbgScope->getScopeNode())->addUInt(CurFnDIE,
2073 dwarf::DW_AT_APPLE_omit_frame_ptr,
2074 dwarf::DW_FORM_flag, 1);
Devang Patel9c488372010-05-04 06:15:30 +00002075
2076
Chris Lattnerd38fee82010-04-05 00:13:49 +00002077 DebugFrames.push_back(FunctionDebugFrameInfo(Asm->getFunctionNumber(),
Devang Patel344130e2010-01-04 20:44:00 +00002078 MMI->getFrameMoves()));
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002079 }
2080
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002081 // Clear debug info
Devang Patelf54b8522010-01-19 01:26:02 +00002082 CurrentFnDbgScope = NULL;
Devang Pateleac0c9d2011-04-22 18:09:57 +00002083 DeleteContainerPointers(CurrentFnArguments);
Devang Patel26c1e562010-05-20 16:36:41 +00002084 DbgVariableToFrameIndexMap.clear();
2085 VarToAbstractVarMap.clear();
2086 DbgVariableToDbgInstMap.clear();
Devang Patel133b0992011-07-15 21:25:44 +00002087 InlinedDbgScopeMap.clear();
Jeffrey Yasskin5c213dc2010-03-12 17:45:06 +00002088 DeleteContainerSeconds(DbgScopeMap);
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00002089 UserVariables.clear();
2090 DbgValues.clear();
Jeffrey Yasskin5c213dc2010-03-12 17:45:06 +00002091 DeleteContainerSeconds(AbstractScopes);
Devang Patelf54b8522010-01-19 01:26:02 +00002092 AbstractScopesList.clear();
Jeffrey Yasskin5c213dc2010-03-12 17:45:06 +00002093 AbstractVariables.clear();
Devang Pateleac9c072010-04-27 19:46:33 +00002094 LabelsBeforeInsn.clear();
2095 LabelsAfterInsn.clear();
Devang Patelf2548ca2010-04-16 23:33:45 +00002096 PrevLabel = NULL;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002097}
2098
Devang Patel26c1e562010-05-20 16:36:41 +00002099/// recordVariableFrameIndex - Record a variable's index.
2100void DwarfDebug::recordVariableFrameIndex(const DbgVariable *V, int Index) {
2101 assert (V && "Invalid DbgVariable!");
2102 DbgVariableToFrameIndexMap[V] = Index;
2103}
2104
2105/// findVariableFrameIndex - Return true if frame index for the variable
2106/// is found. Update FI to hold value of the index.
2107bool DwarfDebug::findVariableFrameIndex(const DbgVariable *V, int *FI) {
2108 assert (V && "Invalid DbgVariable!");
2109 DenseMap<const DbgVariable *, int>::iterator I =
2110 DbgVariableToFrameIndexMap.find(V);
2111 if (I == DbgVariableToFrameIndexMap.end())
2112 return false;
2113 *FI = I->second;
2114 return true;
2115}
2116
Devang Patel9b4a1722011-07-14 23:17:49 +00002117/// findDbgScope - Find DbgScope for the debug loc.
2118DbgScope *DwarfDebug::findDbgScope(DebugLoc DL) {
Jim Grosbach1e20b962010-07-21 21:21:52 +00002119 if (DL.isUnknown())
Devang Patel9b4a1722011-07-14 23:17:49 +00002120 return NULL;
Devang Patelee432862010-05-20 19:57:06 +00002121
Devang Patel9b4a1722011-07-14 23:17:49 +00002122 DbgScope *Scope = NULL;
2123 LLVMContext &Ctx = Asm->MF->getFunction()->getContext();
Devang Patel133b0992011-07-15 21:25:44 +00002124 if (MDNode *IA = DL.getInlinedAt(Ctx))
2125 Scope = InlinedDbgScopeMap.lookup(DebugLoc::getFromDILocation(IA));
2126 else
2127 Scope = DbgScopeMap.lookup(DL.getScope(Ctx));
Devang Patelee432862010-05-20 19:57:06 +00002128 return Scope;
2129}
2130
2131
Chris Lattnerc6087842010-03-09 04:54:43 +00002132/// recordSourceLine - Register a source line with debug info. Returns the
2133/// unique label that was emitted and which provides correspondence to
2134/// the source line list.
Devang Patel4243e672011-05-11 19:22:19 +00002135void DwarfDebug::recordSourceLine(unsigned Line, unsigned Col, const MDNode *S,
2136 unsigned Flags) {
Devang Patel65dbc902009-11-25 17:36:49 +00002137 StringRef Fn;
Devang Patel23670e52011-03-24 20:30:50 +00002138 StringRef Dir;
Dan Gohman1cc0d622010-05-05 23:41:32 +00002139 unsigned Src = 1;
2140 if (S) {
2141 DIDescriptor Scope(S);
Devang Patelf84548d2009-10-05 18:03:19 +00002142
Dan Gohman1cc0d622010-05-05 23:41:32 +00002143 if (Scope.isCompileUnit()) {
2144 DICompileUnit CU(S);
Dan Gohman1cc0d622010-05-05 23:41:32 +00002145 Fn = CU.getFilename();
Devang Patel23670e52011-03-24 20:30:50 +00002146 Dir = CU.getDirectory();
Devang Patel3cabc9d2010-10-28 17:30:52 +00002147 } else if (Scope.isFile()) {
2148 DIFile F(S);
Devang Patel3cabc9d2010-10-28 17:30:52 +00002149 Fn = F.getFilename();
Devang Patel23670e52011-03-24 20:30:50 +00002150 Dir = F.getDirectory();
Dan Gohman1cc0d622010-05-05 23:41:32 +00002151 } else if (Scope.isSubprogram()) {
2152 DISubprogram SP(S);
Dan Gohman1cc0d622010-05-05 23:41:32 +00002153 Fn = SP.getFilename();
Devang Patel23670e52011-03-24 20:30:50 +00002154 Dir = SP.getDirectory();
Dan Gohman1cc0d622010-05-05 23:41:32 +00002155 } else if (Scope.isLexicalBlock()) {
2156 DILexicalBlock DB(S);
Dan Gohman1cc0d622010-05-05 23:41:32 +00002157 Fn = DB.getFilename();
Devang Patel23670e52011-03-24 20:30:50 +00002158 Dir = DB.getDirectory();
Dan Gohman1cc0d622010-05-05 23:41:32 +00002159 } else
2160 assert(0 && "Unexpected scope info");
2161
Devang Patel23670e52011-03-24 20:30:50 +00002162 Src = GetOrCreateSourceID(Fn, Dir);
Dan Gohman1cc0d622010-05-05 23:41:32 +00002163 }
Nick Lewycky3bbb6f72011-07-29 03:49:23 +00002164 Asm->OutStreamer.EmitDwarfLocDirective(Src, Line, Col, Flags, 0, 0, Fn);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002165}
2166
Bill Wendling829e67b2009-05-20 23:22:40 +00002167//===----------------------------------------------------------------------===//
2168// Emit Methods
2169//===----------------------------------------------------------------------===//
2170
Devang Patel2c4ceb12009-11-21 02:48:08 +00002171/// computeSizeAndOffset - Compute the size and offset of a DIE.
Bill Wendling94d04b82009-05-20 23:21:38 +00002172///
Jim Grosbach7ab38df2009-11-22 19:20:36 +00002173unsigned
2174DwarfDebug::computeSizeAndOffset(DIE *Die, unsigned Offset, bool Last) {
Bill Wendling94d04b82009-05-20 23:21:38 +00002175 // Get the children.
2176 const std::vector<DIE *> &Children = Die->getChildren();
2177
2178 // If not last sibling and has children then add sibling offset attribute.
Jeffrey Yasskin638fe8d2010-03-22 18:47:14 +00002179 if (!Last && !Children.empty())
Benjamin Kramer345ef342010-03-31 19:34:01 +00002180 Die->addSiblingOffset(DIEValueAllocator);
Bill Wendling94d04b82009-05-20 23:21:38 +00002181
2182 // Record the abbreviation.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002183 assignAbbrevNumber(Die->getAbbrev());
Bill Wendling94d04b82009-05-20 23:21:38 +00002184
2185 // Get the abbreviation for this DIE.
2186 unsigned AbbrevNumber = Die->getAbbrevNumber();
2187 const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2188
2189 // Set DIE offset
2190 Die->setOffset(Offset);
2191
2192 // Start the size with the size of abbreviation code.
Chris Lattneraf76e592009-08-22 20:48:53 +00002193 Offset += MCAsmInfo::getULEB128Size(AbbrevNumber);
Bill Wendling94d04b82009-05-20 23:21:38 +00002194
2195 const SmallVector<DIEValue*, 32> &Values = Die->getValues();
2196 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
2197
2198 // Size the DIE attribute values.
2199 for (unsigned i = 0, N = Values.size(); i < N; ++i)
2200 // Size attribute value.
Chris Lattnera37d5382010-04-05 00:18:22 +00002201 Offset += Values[i]->SizeOf(Asm, AbbrevData[i].getForm());
Bill Wendling94d04b82009-05-20 23:21:38 +00002202
2203 // Size the DIE children if any.
2204 if (!Children.empty()) {
2205 assert(Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes &&
2206 "Children flag not set");
2207
2208 for (unsigned j = 0, M = Children.size(); j < M; ++j)
Devang Patel2c4ceb12009-11-21 02:48:08 +00002209 Offset = computeSizeAndOffset(Children[j], Offset, (j + 1) == M);
Bill Wendling94d04b82009-05-20 23:21:38 +00002210
2211 // End of children marker.
2212 Offset += sizeof(int8_t);
2213 }
2214
2215 Die->setSize(Offset - Die->getOffset());
2216 return Offset;
2217}
2218
Devang Patel2c4ceb12009-11-21 02:48:08 +00002219/// computeSizeAndOffsets - Compute the size and offset of all the DIEs.
Bill Wendling94d04b82009-05-20 23:21:38 +00002220///
Devang Patel2c4ceb12009-11-21 02:48:08 +00002221void DwarfDebug::computeSizeAndOffsets() {
Devang Patel163a9f72010-05-10 22:49:55 +00002222 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2223 E = CUMap.end(); I != E; ++I) {
2224 // Compute size of compile unit header.
Devang Patel513edf62011-04-12 23:10:47 +00002225 unsigned Offset =
Devang Patel163a9f72010-05-10 22:49:55 +00002226 sizeof(int32_t) + // Length of Compilation Unit Info
2227 sizeof(int16_t) + // DWARF version number
2228 sizeof(int32_t) + // Offset Into Abbrev. Section
2229 sizeof(int8_t); // Pointer Size (in bytes)
2230 computeSizeAndOffset(I->second->getCUDie(), Offset, true);
Devang Patel163a9f72010-05-10 22:49:55 +00002231 }
Bill Wendling94d04b82009-05-20 23:21:38 +00002232}
2233
Chris Lattner11b8f302010-04-04 23:02:02 +00002234/// EmitSectionSym - Switch to the specified MCSection and emit an assembler
2235/// temporary label to it if SymbolStem is specified.
Chris Lattner9c69e285532010-04-04 22:59:04 +00002236static MCSymbol *EmitSectionSym(AsmPrinter *Asm, const MCSection *Section,
Chris Lattner11b8f302010-04-04 23:02:02 +00002237 const char *SymbolStem = 0) {
Chris Lattner9c69e285532010-04-04 22:59:04 +00002238 Asm->OutStreamer.SwitchSection(Section);
Chris Lattner11b8f302010-04-04 23:02:02 +00002239 if (!SymbolStem) return 0;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002240
Chris Lattner9c69e285532010-04-04 22:59:04 +00002241 MCSymbol *TmpSym = Asm->GetTempSymbol(SymbolStem);
2242 Asm->OutStreamer.EmitLabel(TmpSym);
2243 return TmpSym;
2244}
2245
2246/// EmitSectionLabels - Emit initial Dwarf sections with a label at
2247/// the start of each one.
Chris Lattnerfa070b02010-04-04 22:33:59 +00002248void DwarfDebug::EmitSectionLabels() {
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002249 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
Daniel Dunbarf612ff62009-09-19 20:40:05 +00002250
Bill Wendling94d04b82009-05-20 23:21:38 +00002251 // Dwarf sections base addresses.
Jim Grosbach1e20b962010-07-21 21:21:52 +00002252 DwarfInfoSectionSym =
Chris Lattner9c69e285532010-04-04 22:59:04 +00002253 EmitSectionSym(Asm, TLOF.getDwarfInfoSection(), "section_info");
Jim Grosbach1e20b962010-07-21 21:21:52 +00002254 DwarfAbbrevSectionSym =
Chris Lattner9c69e285532010-04-04 22:59:04 +00002255 EmitSectionSym(Asm, TLOF.getDwarfAbbrevSection(), "section_abbrev");
Chris Lattner11b8f302010-04-04 23:02:02 +00002256 EmitSectionSym(Asm, TLOF.getDwarfARangesSection());
Jim Grosbach1e20b962010-07-21 21:21:52 +00002257
Chris Lattner9c69e285532010-04-04 22:59:04 +00002258 if (const MCSection *MacroInfo = TLOF.getDwarfMacroInfoSection())
Chris Lattner11b8f302010-04-04 23:02:02 +00002259 EmitSectionSym(Asm, MacroInfo);
Bill Wendling94d04b82009-05-20 23:21:38 +00002260
Devang Patelaf608bd2010-08-24 00:06:12 +00002261 EmitSectionSym(Asm, TLOF.getDwarfLineSection(), "section_line");
Chris Lattner11b8f302010-04-04 23:02:02 +00002262 EmitSectionSym(Asm, TLOF.getDwarfLocSection());
2263 EmitSectionSym(Asm, TLOF.getDwarfPubNamesSection());
2264 EmitSectionSym(Asm, TLOF.getDwarfPubTypesSection());
Jim Grosbach1e20b962010-07-21 21:21:52 +00002265 DwarfStrSectionSym =
Chris Lattner9c69e285532010-04-04 22:59:04 +00002266 EmitSectionSym(Asm, TLOF.getDwarfStrSection(), "section_str");
Devang Patelf2548ca2010-04-16 23:33:45 +00002267 DwarfDebugRangeSectionSym = EmitSectionSym(Asm, TLOF.getDwarfRangesSection(),
2268 "debug_range");
Bill Wendling94d04b82009-05-20 23:21:38 +00002269
Devang Patelc3f5f782010-05-25 23:40:22 +00002270 DwarfDebugLocSectionSym = EmitSectionSym(Asm, TLOF.getDwarfLocSection(),
2271 "section_debug_loc");
2272
Chris Lattner9c69e285532010-04-04 22:59:04 +00002273 TextSectionSym = EmitSectionSym(Asm, TLOF.getTextSection(), "text_begin");
Chris Lattner4ad1efe2010-04-04 23:10:38 +00002274 EmitSectionSym(Asm, TLOF.getDataSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002275}
2276
Nick Lewycky3bbb6f72011-07-29 03:49:23 +00002277/// emitDIE - Recursively emits a debug information entry.
Bill Wendling94d04b82009-05-20 23:21:38 +00002278///
Devang Patel2c4ceb12009-11-21 02:48:08 +00002279void DwarfDebug::emitDIE(DIE *Die) {
Bill Wendling94d04b82009-05-20 23:21:38 +00002280 // Get the abbreviation for this DIE.
2281 unsigned AbbrevNumber = Die->getAbbrevNumber();
2282 const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2283
Bill Wendling94d04b82009-05-20 23:21:38 +00002284 // Emit the code (index) for the abbreviation.
Chris Lattner3f53c832010-04-04 18:52:31 +00002285 if (Asm->isVerbose())
Chris Lattner894d75a2010-01-22 23:18:42 +00002286 Asm->OutStreamer.AddComment("Abbrev [" + Twine(AbbrevNumber) + "] 0x" +
2287 Twine::utohexstr(Die->getOffset()) + ":0x" +
2288 Twine::utohexstr(Die->getSize()) + " " +
2289 dwarf::TagString(Abbrev->getTag()));
Chris Lattner7e1a8f82010-04-04 19:09:29 +00002290 Asm->EmitULEB128(AbbrevNumber);
Bill Wendling94d04b82009-05-20 23:21:38 +00002291
Jeffrey Yasskin638fe8d2010-03-22 18:47:14 +00002292 const SmallVector<DIEValue*, 32> &Values = Die->getValues();
Bill Wendling94d04b82009-05-20 23:21:38 +00002293 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
2294
2295 // Emit the DIE attribute values.
2296 for (unsigned i = 0, N = Values.size(); i < N; ++i) {
2297 unsigned Attr = AbbrevData[i].getAttribute();
2298 unsigned Form = AbbrevData[i].getForm();
2299 assert(Form && "Too many attributes for DIE (check abbreviation)");
2300
Chris Lattner3f53c832010-04-04 18:52:31 +00002301 if (Asm->isVerbose())
Chris Lattnera8013622010-01-24 18:54:17 +00002302 Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr));
Jim Grosbach1e20b962010-07-21 21:21:52 +00002303
Bill Wendling94d04b82009-05-20 23:21:38 +00002304 switch (Attr) {
2305 case dwarf::DW_AT_sibling:
Devang Patel2c4ceb12009-11-21 02:48:08 +00002306 Asm->EmitInt32(Die->getSiblingOffset());
Bill Wendling94d04b82009-05-20 23:21:38 +00002307 break;
2308 case dwarf::DW_AT_abstract_origin: {
2309 DIEEntry *E = cast<DIEEntry>(Values[i]);
2310 DIE *Origin = E->getEntry();
Devang Patel53bb5c92009-11-10 23:06:00 +00002311 unsigned Addr = Origin->getOffset();
Bill Wendling94d04b82009-05-20 23:21:38 +00002312 Asm->EmitInt32(Addr);
2313 break;
2314 }
Devang Patelf2548ca2010-04-16 23:33:45 +00002315 case dwarf::DW_AT_ranges: {
2316 // DW_AT_range Value encodes offset in debug_range section.
2317 DIEInteger *V = cast<DIEInteger>(Values[i]);
Devang Patelb1fcfbe2010-09-02 16:43:44 +00002318
2319 if (Asm->MAI->doesDwarfUsesLabelOffsetForRanges()) {
2320 Asm->EmitLabelPlusOffset(DwarfDebugRangeSectionSym,
2321 V->getValue(),
2322 4);
2323 } else {
2324 Asm->EmitLabelOffsetDifference(DwarfDebugRangeSectionSym,
2325 V->getValue(),
2326 DwarfDebugRangeSectionSym,
2327 4);
2328 }
Devang Patelf2548ca2010-04-16 23:33:45 +00002329 break;
2330 }
Devang Patelc3f5f782010-05-25 23:40:22 +00002331 case dwarf::DW_AT_location: {
2332 if (UseDotDebugLocEntry.count(Die) != 0) {
2333 DIELabel *L = cast<DIELabel>(Values[i]);
Daniel Dunbar83320a02011-03-16 22:16:39 +00002334 Asm->EmitLabelDifference(L->getValue(), DwarfDebugLocSectionSym, 4);
Devang Patelc3f5f782010-05-25 23:40:22 +00002335 } else
2336 Values[i]->EmitValue(Asm, Form);
2337 break;
2338 }
Devang Patel2a361602010-09-29 19:08:08 +00002339 case dwarf::DW_AT_accessibility: {
2340 if (Asm->isVerbose()) {
2341 DIEInteger *V = cast<DIEInteger>(Values[i]);
2342 Asm->OutStreamer.AddComment(dwarf::AccessibilityString(V->getValue()));
2343 }
2344 Values[i]->EmitValue(Asm, Form);
2345 break;
2346 }
Bill Wendling94d04b82009-05-20 23:21:38 +00002347 default:
2348 // Emit an attribute using the defined form.
Chris Lattnerd38fee82010-04-05 00:13:49 +00002349 Values[i]->EmitValue(Asm, Form);
Bill Wendling94d04b82009-05-20 23:21:38 +00002350 break;
2351 }
Bill Wendling94d04b82009-05-20 23:21:38 +00002352 }
2353
2354 // Emit the DIE children if any.
2355 if (Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes) {
2356 const std::vector<DIE *> &Children = Die->getChildren();
2357
2358 for (unsigned j = 0, M = Children.size(); j < M; ++j)
Devang Patel2c4ceb12009-11-21 02:48:08 +00002359 emitDIE(Children[j]);
Bill Wendling94d04b82009-05-20 23:21:38 +00002360
Chris Lattner3f53c832010-04-04 18:52:31 +00002361 if (Asm->isVerbose())
Chris Lattner233f52b2010-03-09 23:52:58 +00002362 Asm->OutStreamer.AddComment("End Of Children Mark");
2363 Asm->EmitInt8(0);
Bill Wendling94d04b82009-05-20 23:21:38 +00002364 }
2365}
2366
Devang Patel8a241142009-12-09 18:24:21 +00002367/// emitDebugInfo - Emit the debug info section.
Bill Wendling94d04b82009-05-20 23:21:38 +00002368///
Devang Patel8a241142009-12-09 18:24:21 +00002369void DwarfDebug::emitDebugInfo() {
2370 // Start debug info section.
2371 Asm->OutStreamer.SwitchSection(
2372 Asm->getObjFileLowering().getDwarfInfoSection());
Devang Patel163a9f72010-05-10 22:49:55 +00002373 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2374 E = CUMap.end(); I != E; ++I) {
2375 CompileUnit *TheCU = I->second;
2376 DIE *Die = TheCU->getCUDie();
Jim Grosbach1e20b962010-07-21 21:21:52 +00002377
Devang Patel163a9f72010-05-10 22:49:55 +00002378 // Emit the compile units header.
2379 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_begin",
2380 TheCU->getID()));
Jim Grosbach1e20b962010-07-21 21:21:52 +00002381
Devang Patel163a9f72010-05-10 22:49:55 +00002382 // Emit size of content not including length itself
2383 unsigned ContentSize = Die->getSize() +
2384 sizeof(int16_t) + // DWARF version number
2385 sizeof(int32_t) + // Offset Into Abbrev. Section
Devang Patel65705d52011-04-13 19:41:17 +00002386 sizeof(int8_t); // Pointer Size (in bytes)
Jim Grosbach1e20b962010-07-21 21:21:52 +00002387
Devang Patel163a9f72010-05-10 22:49:55 +00002388 Asm->OutStreamer.AddComment("Length of Compilation Unit Info");
2389 Asm->EmitInt32(ContentSize);
2390 Asm->OutStreamer.AddComment("DWARF version number");
2391 Asm->EmitInt16(dwarf::DWARF_VERSION);
2392 Asm->OutStreamer.AddComment("Offset Into Abbrev. Section");
2393 Asm->EmitSectionOffset(Asm->GetTempSymbol("abbrev_begin"),
2394 DwarfAbbrevSectionSym);
2395 Asm->OutStreamer.AddComment("Address Size (in bytes)");
2396 Asm->EmitInt8(Asm->getTargetData().getPointerSize());
Jim Grosbach1e20b962010-07-21 21:21:52 +00002397
Devang Patel163a9f72010-05-10 22:49:55 +00002398 emitDIE(Die);
Devang Patel163a9f72010-05-10 22:49:55 +00002399 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_end", TheCU->getID()));
2400 }
Bill Wendling94d04b82009-05-20 23:21:38 +00002401}
2402
Devang Patel2c4ceb12009-11-21 02:48:08 +00002403/// emitAbbreviations - Emit the abbreviation section.
Bill Wendling94d04b82009-05-20 23:21:38 +00002404///
Devang Patel2c4ceb12009-11-21 02:48:08 +00002405void DwarfDebug::emitAbbreviations() const {
Bill Wendling94d04b82009-05-20 23:21:38 +00002406 // Check to see if it is worth the effort.
2407 if (!Abbreviations.empty()) {
2408 // Start the debug abbrev section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002409 Asm->OutStreamer.SwitchSection(
2410 Asm->getObjFileLowering().getDwarfAbbrevSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002411
Chris Lattnerc0215722010-04-04 19:25:43 +00002412 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_begin"));
Bill Wendling94d04b82009-05-20 23:21:38 +00002413
2414 // For each abbrevation.
2415 for (unsigned i = 0, N = Abbreviations.size(); i < N; ++i) {
2416 // Get abbreviation data
2417 const DIEAbbrev *Abbrev = Abbreviations[i];
2418
2419 // Emit the abbrevations code (base 1 index.)
Chris Lattner7e1a8f82010-04-04 19:09:29 +00002420 Asm->EmitULEB128(Abbrev->getNumber(), "Abbreviation Code");
Bill Wendling94d04b82009-05-20 23:21:38 +00002421
2422 // Emit the abbreviations data.
Chris Lattnerd38fee82010-04-05 00:13:49 +00002423 Abbrev->Emit(Asm);
Bill Wendling94d04b82009-05-20 23:21:38 +00002424 }
2425
2426 // Mark end of abbreviations.
Chris Lattner7e1a8f82010-04-04 19:09:29 +00002427 Asm->EmitULEB128(0, "EOM(3)");
Bill Wendling94d04b82009-05-20 23:21:38 +00002428
Chris Lattnerc0215722010-04-04 19:25:43 +00002429 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_end"));
Bill Wendling94d04b82009-05-20 23:21:38 +00002430 }
2431}
2432
Devang Patel2c4ceb12009-11-21 02:48:08 +00002433/// emitEndOfLineMatrix - Emit the last address of the section and the end of
Bill Wendling94d04b82009-05-20 23:21:38 +00002434/// the line matrix.
2435///
Devang Patel2c4ceb12009-11-21 02:48:08 +00002436void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) {
Bill Wendling94d04b82009-05-20 23:21:38 +00002437 // Define last address of section.
Chris Lattner233f52b2010-03-09 23:52:58 +00002438 Asm->OutStreamer.AddComment("Extended Op");
2439 Asm->EmitInt8(0);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002440
Chris Lattner233f52b2010-03-09 23:52:58 +00002441 Asm->OutStreamer.AddComment("Op size");
Chris Lattnerd38fee82010-04-05 00:13:49 +00002442 Asm->EmitInt8(Asm->getTargetData().getPointerSize() + 1);
Chris Lattner233f52b2010-03-09 23:52:58 +00002443 Asm->OutStreamer.AddComment("DW_LNE_set_address");
2444 Asm->EmitInt8(dwarf::DW_LNE_set_address);
2445
2446 Asm->OutStreamer.AddComment("Section end label");
Chris Lattnerd85fc6e2010-03-10 01:17:49 +00002447
Chris Lattnerc0215722010-04-04 19:25:43 +00002448 Asm->OutStreamer.EmitSymbolValue(Asm->GetTempSymbol("section_end",SectionEnd),
Chris Lattnerd38fee82010-04-05 00:13:49 +00002449 Asm->getTargetData().getPointerSize(),
2450 0/*AddrSpace*/);
Bill Wendling94d04b82009-05-20 23:21:38 +00002451
2452 // Mark end of matrix.
Chris Lattner233f52b2010-03-09 23:52:58 +00002453 Asm->OutStreamer.AddComment("DW_LNE_end_sequence");
2454 Asm->EmitInt8(0);
Chris Lattner0ad9c912010-01-22 22:09:00 +00002455 Asm->EmitInt8(1);
Chris Lattner894d75a2010-01-22 23:18:42 +00002456 Asm->EmitInt8(1);
Bill Wendling94d04b82009-05-20 23:21:38 +00002457}
2458
Devang Patel8a241142009-12-09 18:24:21 +00002459/// emitDebugPubNames - Emit visible names into a debug pubnames section.
2460///
2461void DwarfDebug::emitDebugPubNames() {
Devang Patel163a9f72010-05-10 22:49:55 +00002462 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2463 E = CUMap.end(); I != E; ++I) {
2464 CompileUnit *TheCU = I->second;
2465 // Start the dwarf pubnames section.
2466 Asm->OutStreamer.SwitchSection(
2467 Asm->getObjFileLowering().getDwarfPubNamesSection());
Jim Grosbach1e20b962010-07-21 21:21:52 +00002468
Devang Patel163a9f72010-05-10 22:49:55 +00002469 Asm->OutStreamer.AddComment("Length of Public Names Info");
2470 Asm->EmitLabelDifference(
2471 Asm->GetTempSymbol("pubnames_end", TheCU->getID()),
2472 Asm->GetTempSymbol("pubnames_begin", TheCU->getID()), 4);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002473
Devang Patel163a9f72010-05-10 22:49:55 +00002474 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_begin",
2475 TheCU->getID()));
Jim Grosbach1e20b962010-07-21 21:21:52 +00002476
Devang Patel163a9f72010-05-10 22:49:55 +00002477 Asm->OutStreamer.AddComment("DWARF Version");
Jim Grosbach1e20b962010-07-21 21:21:52 +00002478 Asm->EmitInt16(dwarf::DWARF_VERSION);
2479
Devang Patel163a9f72010-05-10 22:49:55 +00002480 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
Jim Grosbach1e20b962010-07-21 21:21:52 +00002481 Asm->EmitSectionOffset(Asm->GetTempSymbol("info_begin", TheCU->getID()),
Devang Patel163a9f72010-05-10 22:49:55 +00002482 DwarfInfoSectionSym);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002483
Devang Patel163a9f72010-05-10 22:49:55 +00002484 Asm->OutStreamer.AddComment("Compilation Unit Length");
2485 Asm->EmitLabelDifference(Asm->GetTempSymbol("info_end", TheCU->getID()),
2486 Asm->GetTempSymbol("info_begin", TheCU->getID()),
2487 4);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002488
Devang Patel163a9f72010-05-10 22:49:55 +00002489 const StringMap<DIE*> &Globals = TheCU->getGlobals();
2490 for (StringMap<DIE*>::const_iterator
2491 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2492 const char *Name = GI->getKeyData();
2493 DIE *Entity = GI->second;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002494
Devang Patel163a9f72010-05-10 22:49:55 +00002495 Asm->OutStreamer.AddComment("DIE offset");
2496 Asm->EmitInt32(Entity->getOffset());
Jim Grosbach1e20b962010-07-21 21:21:52 +00002497
Devang Patel163a9f72010-05-10 22:49:55 +00002498 if (Asm->isVerbose())
2499 Asm->OutStreamer.AddComment("External Name");
2500 Asm->OutStreamer.EmitBytes(StringRef(Name, strlen(Name)+1), 0);
2501 }
Jim Grosbach1e20b962010-07-21 21:21:52 +00002502
Devang Patel163a9f72010-05-10 22:49:55 +00002503 Asm->OutStreamer.AddComment("End Mark");
2504 Asm->EmitInt32(0);
2505 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_end",
Nick Lewycky3bbb6f72011-07-29 03:49:23 +00002506 TheCU->getID()));
Bill Wendling94d04b82009-05-20 23:21:38 +00002507 }
Bill Wendling94d04b82009-05-20 23:21:38 +00002508}
2509
Devang Patel193f7202009-11-24 01:14:22 +00002510void DwarfDebug::emitDebugPubTypes() {
Devang Patel163a9f72010-05-10 22:49:55 +00002511 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2512 E = CUMap.end(); I != E; ++I) {
2513 CompileUnit *TheCU = I->second;
2514 // Start the dwarf pubnames section.
2515 Asm->OutStreamer.SwitchSection(
2516 Asm->getObjFileLowering().getDwarfPubTypesSection());
2517 Asm->OutStreamer.AddComment("Length of Public Types Info");
2518 Asm->EmitLabelDifference(
2519 Asm->GetTempSymbol("pubtypes_end", TheCU->getID()),
2520 Asm->GetTempSymbol("pubtypes_begin", TheCU->getID()), 4);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002521
Devang Patel163a9f72010-05-10 22:49:55 +00002522 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_begin",
2523 TheCU->getID()));
Jim Grosbach1e20b962010-07-21 21:21:52 +00002524
Devang Patel163a9f72010-05-10 22:49:55 +00002525 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DWARF Version");
2526 Asm->EmitInt16(dwarf::DWARF_VERSION);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002527
Devang Patel163a9f72010-05-10 22:49:55 +00002528 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
2529 Asm->EmitSectionOffset(Asm->GetTempSymbol("info_begin", TheCU->getID()),
2530 DwarfInfoSectionSym);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002531
Devang Patel163a9f72010-05-10 22:49:55 +00002532 Asm->OutStreamer.AddComment("Compilation Unit Length");
2533 Asm->EmitLabelDifference(Asm->GetTempSymbol("info_end", TheCU->getID()),
2534 Asm->GetTempSymbol("info_begin", TheCU->getID()),
2535 4);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002536
Devang Patel163a9f72010-05-10 22:49:55 +00002537 const StringMap<DIE*> &Globals = TheCU->getGlobalTypes();
2538 for (StringMap<DIE*>::const_iterator
2539 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2540 const char *Name = GI->getKeyData();
Nick Lewycky3bbb6f72011-07-29 03:49:23 +00002541 DIE *Entity = GI->second;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002542
Devang Patel163a9f72010-05-10 22:49:55 +00002543 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
2544 Asm->EmitInt32(Entity->getOffset());
Jim Grosbach1e20b962010-07-21 21:21:52 +00002545
Devang Patel163a9f72010-05-10 22:49:55 +00002546 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("External Name");
2547 Asm->OutStreamer.EmitBytes(StringRef(Name, GI->getKeyLength()+1), 0);
2548 }
Jim Grosbach1e20b962010-07-21 21:21:52 +00002549
Devang Patel163a9f72010-05-10 22:49:55 +00002550 Asm->OutStreamer.AddComment("End Mark");
Jim Grosbach1e20b962010-07-21 21:21:52 +00002551 Asm->EmitInt32(0);
Devang Patel163a9f72010-05-10 22:49:55 +00002552 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_end",
2553 TheCU->getID()));
Devang Patel193f7202009-11-24 01:14:22 +00002554 }
Devang Patel193f7202009-11-24 01:14:22 +00002555}
2556
Devang Patel2c4ceb12009-11-21 02:48:08 +00002557/// emitDebugStr - Emit visible names into a debug str section.
Bill Wendling94d04b82009-05-20 23:21:38 +00002558///
Devang Patel2c4ceb12009-11-21 02:48:08 +00002559void DwarfDebug::emitDebugStr() {
Bill Wendling94d04b82009-05-20 23:21:38 +00002560 // Check to see if it is worth the effort.
Chris Lattner0d9d70f2010-03-09 23:38:23 +00002561 if (StringPool.empty()) return;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002562
Chris Lattner0d9d70f2010-03-09 23:38:23 +00002563 // Start the dwarf str section.
2564 Asm->OutStreamer.SwitchSection(
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002565 Asm->getObjFileLowering().getDwarfStrSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002566
Chris Lattnerbc733f52010-03-13 02:17:42 +00002567 // Get all of the string pool entries and put them in an array by their ID so
2568 // we can sort them.
Jim Grosbach1e20b962010-07-21 21:21:52 +00002569 SmallVector<std::pair<unsigned,
Chris Lattnerbc733f52010-03-13 02:17:42 +00002570 StringMapEntry<std::pair<MCSymbol*, unsigned> >*>, 64> Entries;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002571
Chris Lattnerbc733f52010-03-13 02:17:42 +00002572 for (StringMap<std::pair<MCSymbol*, unsigned> >::iterator
2573 I = StringPool.begin(), E = StringPool.end(); I != E; ++I)
2574 Entries.push_back(std::make_pair(I->second.second, &*I));
Jim Grosbach1e20b962010-07-21 21:21:52 +00002575
Chris Lattnerbc733f52010-03-13 02:17:42 +00002576 array_pod_sort(Entries.begin(), Entries.end());
Jim Grosbach1e20b962010-07-21 21:21:52 +00002577
Chris Lattnerbc733f52010-03-13 02:17:42 +00002578 for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
Chris Lattner0d9d70f2010-03-09 23:38:23 +00002579 // Emit a label for reference from debug information entries.
Chris Lattnerbc733f52010-03-13 02:17:42 +00002580 Asm->OutStreamer.EmitLabel(Entries[i].second->getValue().first);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002581
Chris Lattner0d9d70f2010-03-09 23:38:23 +00002582 // Emit the string itself.
Chris Lattnerbc733f52010-03-13 02:17:42 +00002583 Asm->OutStreamer.EmitBytes(Entries[i].second->getKey(), 0/*addrspace*/);
Bill Wendling94d04b82009-05-20 23:21:38 +00002584 }
2585}
2586
Devang Patel2c4ceb12009-11-21 02:48:08 +00002587/// emitDebugLoc - Emit visible names into a debug loc section.
Bill Wendling94d04b82009-05-20 23:21:38 +00002588///
Devang Patel2c4ceb12009-11-21 02:48:08 +00002589void DwarfDebug::emitDebugLoc() {
Devang Patel80250682010-05-26 23:55:23 +00002590 if (DotDebugLocEntries.empty())
2591 return;
2592
Devang Patel6c3ea902011-02-04 22:57:18 +00002593 for (SmallVector<DotDebugLocEntry, 4>::iterator
2594 I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
2595 I != E; ++I) {
2596 DotDebugLocEntry &Entry = *I;
2597 if (I + 1 != DotDebugLocEntries.end())
2598 Entry.Merge(I+1);
2599 }
2600
Daniel Dunbar83320a02011-03-16 22:16:39 +00002601 // Start the dwarf loc section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002602 Asm->OutStreamer.SwitchSection(
Devang Patelc3f5f782010-05-25 23:40:22 +00002603 Asm->getObjFileLowering().getDwarfLocSection());
2604 unsigned char Size = Asm->getTargetData().getPointerSize();
Devang Patel80250682010-05-26 23:55:23 +00002605 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", 0));
2606 unsigned index = 1;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002607 for (SmallVector<DotDebugLocEntry, 4>::iterator
2608 I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
Devang Patel61409622010-07-07 20:12:52 +00002609 I != E; ++I, ++index) {
Devang Patel6c3ea902011-02-04 22:57:18 +00002610 DotDebugLocEntry &Entry = *I;
2611 if (Entry.isMerged()) continue;
Devang Patelc3f5f782010-05-25 23:40:22 +00002612 if (Entry.isEmpty()) {
2613 Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
2614 Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
Devang Patel80250682010-05-26 23:55:23 +00002615 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", index));
Devang Patelc3f5f782010-05-25 23:40:22 +00002616 } else {
2617 Asm->OutStreamer.EmitSymbolValue(Entry.Begin, Size, 0);
2618 Asm->OutStreamer.EmitSymbolValue(Entry.End, Size, 0);
Devang Patelc26f5442011-04-28 02:22:40 +00002619 DIVariable DV(Entry.Variable);
Rafael Espindola5b23b7f2011-05-27 22:05:41 +00002620 Asm->OutStreamer.AddComment("Loc expr size");
2621 MCSymbol *begin = Asm->OutStreamer.getContext().CreateTempSymbol();
2622 MCSymbol *end = Asm->OutStreamer.getContext().CreateTempSymbol();
2623 Asm->EmitLabelDifference(end, begin, 2);
2624 Asm->OutStreamer.EmitLabel(begin);
Devang Patel80efd4e2011-07-08 16:49:43 +00002625 if (Entry.isInt()) {
Devang Patelc4329072011-06-01 22:03:25 +00002626 DIBasicType BTy(DV.getType());
2627 if (BTy.Verify() &&
2628 (BTy.getEncoding() == dwarf::DW_ATE_signed
2629 || BTy.getEncoding() == dwarf::DW_ATE_signed_char)) {
2630 Asm->OutStreamer.AddComment("DW_OP_consts");
2631 Asm->EmitInt8(dwarf::DW_OP_consts);
Devang Patel80efd4e2011-07-08 16:49:43 +00002632 Asm->EmitSLEB128(Entry.getInt());
Devang Patelc4329072011-06-01 22:03:25 +00002633 } else {
2634 Asm->OutStreamer.AddComment("DW_OP_constu");
2635 Asm->EmitInt8(dwarf::DW_OP_constu);
Devang Patel80efd4e2011-07-08 16:49:43 +00002636 Asm->EmitULEB128(Entry.getInt());
Devang Patelc4329072011-06-01 22:03:25 +00002637 }
Devang Patel80efd4e2011-07-08 16:49:43 +00002638 } else if (Entry.isLocation()) {
2639 if (!DV.hasComplexAddress())
2640 // Regular entry.
Devang Patelc26f5442011-04-28 02:22:40 +00002641 Asm->EmitDwarfRegOp(Entry.Loc);
Devang Patel80efd4e2011-07-08 16:49:43 +00002642 else {
2643 // Complex address entry.
2644 unsigned N = DV.getNumAddrElements();
2645 unsigned i = 0;
2646 if (N >= 2 && DV.getAddrElement(0) == DIBuilder::OpPlus) {
2647 if (Entry.Loc.getOffset()) {
2648 i = 2;
2649 Asm->EmitDwarfRegOp(Entry.Loc);
2650 Asm->OutStreamer.AddComment("DW_OP_deref");
2651 Asm->EmitInt8(dwarf::DW_OP_deref);
2652 Asm->OutStreamer.AddComment("DW_OP_plus_uconst");
2653 Asm->EmitInt8(dwarf::DW_OP_plus_uconst);
2654 Asm->EmitSLEB128(DV.getAddrElement(1));
2655 } else {
2656 // If first address element is OpPlus then emit
2657 // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
2658 MachineLocation Loc(Entry.Loc.getReg(), DV.getAddrElement(1));
2659 Asm->EmitDwarfRegOp(Loc);
2660 i = 2;
2661 }
2662 } else {
2663 Asm->EmitDwarfRegOp(Entry.Loc);
2664 }
2665
2666 // Emit remaining complex address elements.
2667 for (; i < N; ++i) {
2668 uint64_t Element = DV.getAddrElement(i);
2669 if (Element == DIBuilder::OpPlus) {
2670 Asm->EmitInt8(dwarf::DW_OP_plus_uconst);
2671 Asm->EmitULEB128(DV.getAddrElement(++i));
2672 } else if (Element == DIBuilder::OpDeref)
2673 Asm->EmitInt8(dwarf::DW_OP_deref);
2674 else llvm_unreachable("unknown Opcode found in complex address");
2675 }
Devang Patelc26f5442011-04-28 02:22:40 +00002676 }
Devang Patelc26f5442011-04-28 02:22:40 +00002677 }
Devang Patel80efd4e2011-07-08 16:49:43 +00002678 // else ... ignore constant fp. There is not any good way to
2679 // to represent them here in dwarf.
Rafael Espindola5b23b7f2011-05-27 22:05:41 +00002680 Asm->OutStreamer.EmitLabel(end);
Devang Patelc3f5f782010-05-25 23:40:22 +00002681 }
2682 }
Bill Wendling94d04b82009-05-20 23:21:38 +00002683}
2684
2685/// EmitDebugARanges - Emit visible names into a debug aranges section.
2686///
2687void DwarfDebug::EmitDebugARanges() {
2688 // Start the dwarf aranges section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002689 Asm->OutStreamer.SwitchSection(
2690 Asm->getObjFileLowering().getDwarfARangesSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002691}
2692
Devang Patel2c4ceb12009-11-21 02:48:08 +00002693/// emitDebugRanges - Emit visible names into a debug ranges section.
Bill Wendling94d04b82009-05-20 23:21:38 +00002694///
Devang Patel2c4ceb12009-11-21 02:48:08 +00002695void DwarfDebug::emitDebugRanges() {
Bill Wendling94d04b82009-05-20 23:21:38 +00002696 // Start the dwarf ranges section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002697 Asm->OutStreamer.SwitchSection(
Devang Patelf2548ca2010-04-16 23:33:45 +00002698 Asm->getObjFileLowering().getDwarfRangesSection());
Devang Pateleac9c072010-04-27 19:46:33 +00002699 unsigned char Size = Asm->getTargetData().getPointerSize();
2700 for (SmallVector<const MCSymbol *, 8>::iterator
Jim Grosbach1e20b962010-07-21 21:21:52 +00002701 I = DebugRangeSymbols.begin(), E = DebugRangeSymbols.end();
Devang Pateleac9c072010-04-27 19:46:33 +00002702 I != E; ++I) {
2703 if (*I)
2704 Asm->OutStreamer.EmitSymbolValue(const_cast<MCSymbol*>(*I), Size, 0);
Devang Patelf2548ca2010-04-16 23:33:45 +00002705 else
Devang Pateleac9c072010-04-27 19:46:33 +00002706 Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
Devang Patelf2548ca2010-04-16 23:33:45 +00002707 }
Bill Wendling94d04b82009-05-20 23:21:38 +00002708}
2709
Devang Patel2c4ceb12009-11-21 02:48:08 +00002710/// emitDebugMacInfo - Emit visible names into a debug macinfo section.
Bill Wendling94d04b82009-05-20 23:21:38 +00002711///
Devang Patel2c4ceb12009-11-21 02:48:08 +00002712void DwarfDebug::emitDebugMacInfo() {
Daniel Dunbarf612ff62009-09-19 20:40:05 +00002713 if (const MCSection *LineInfo =
Chris Lattner18a4c162009-08-02 07:24:22 +00002714 Asm->getObjFileLowering().getDwarfMacroInfoSection()) {
Bill Wendling94d04b82009-05-20 23:21:38 +00002715 // Start the dwarf macinfo section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002716 Asm->OutStreamer.SwitchSection(LineInfo);
Bill Wendling94d04b82009-05-20 23:21:38 +00002717 }
2718}
2719
Devang Patel2c4ceb12009-11-21 02:48:08 +00002720/// emitDebugInlineInfo - Emit inline info using following format.
Bill Wendling94d04b82009-05-20 23:21:38 +00002721/// Section Header:
2722/// 1. length of section
2723/// 2. Dwarf version number
2724/// 3. address size.
2725///
2726/// Entries (one "entry" for each function that was inlined):
2727///
2728/// 1. offset into __debug_str section for MIPS linkage name, if exists;
2729/// otherwise offset into __debug_str for regular function name.
2730/// 2. offset into __debug_str section for regular function name.
2731/// 3. an unsigned LEB128 number indicating the number of distinct inlining
2732/// instances for the function.
2733///
2734/// The rest of the entry consists of a {die_offset, low_pc} pair for each
2735/// inlined instance; the die_offset points to the inlined_subroutine die in the
2736/// __debug_info section, and the low_pc is the starting address for the
2737/// inlining instance.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002738void DwarfDebug::emitDebugInlineInfo() {
Chris Lattnerd38fee82010-04-05 00:13:49 +00002739 if (!Asm->MAI->doesDwarfUsesInlineInfoSection())
Bill Wendling94d04b82009-05-20 23:21:38 +00002740 return;
2741
Devang Patel163a9f72010-05-10 22:49:55 +00002742 if (!FirstCU)
Bill Wendling94d04b82009-05-20 23:21:38 +00002743 return;
2744
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002745 Asm->OutStreamer.SwitchSection(
2746 Asm->getObjFileLowering().getDwarfDebugInlineSection());
Chris Lattner0ad9c912010-01-22 22:09:00 +00002747
Chris Lattner233f52b2010-03-09 23:52:58 +00002748 Asm->OutStreamer.AddComment("Length of Debug Inlined Information Entry");
Chris Lattnera6437182010-04-04 19:58:12 +00002749 Asm->EmitLabelDifference(Asm->GetTempSymbol("debug_inlined_end", 1),
2750 Asm->GetTempSymbol("debug_inlined_begin", 1), 4);
Bill Wendling94d04b82009-05-20 23:21:38 +00002751
Chris Lattnerc0215722010-04-04 19:25:43 +00002752 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_begin", 1));
Bill Wendling94d04b82009-05-20 23:21:38 +00002753
Chris Lattner233f52b2010-03-09 23:52:58 +00002754 Asm->OutStreamer.AddComment("Dwarf Version");
2755 Asm->EmitInt16(dwarf::DWARF_VERSION);
2756 Asm->OutStreamer.AddComment("Address Size (in bytes)");
Chris Lattnerd38fee82010-04-05 00:13:49 +00002757 Asm->EmitInt8(Asm->getTargetData().getPointerSize());
Bill Wendling94d04b82009-05-20 23:21:38 +00002758
Devang Patele9f8f5e2010-05-07 20:54:48 +00002759 for (SmallVector<const MDNode *, 4>::iterator I = InlinedSPNodes.begin(),
Devang Patel53bb5c92009-11-10 23:06:00 +00002760 E = InlinedSPNodes.end(); I != E; ++I) {
Jim Grosbach31ef40e2009-11-21 23:12:12 +00002761
Devang Patele9f8f5e2010-05-07 20:54:48 +00002762 const MDNode *Node = *I;
2763 DenseMap<const MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator II
Jim Grosbach7ab38df2009-11-22 19:20:36 +00002764 = InlineInfo.find(Node);
Devang Patel53bb5c92009-11-10 23:06:00 +00002765 SmallVector<InlineInfoLabels, 4> &Labels = II->second;
Devang Patele4b27562009-08-28 23:24:31 +00002766 DISubprogram SP(Node);
Devang Patel65dbc902009-11-25 17:36:49 +00002767 StringRef LName = SP.getLinkageName();
2768 StringRef Name = SP.getName();
Bill Wendling94d04b82009-05-20 23:21:38 +00002769
Chris Lattner233f52b2010-03-09 23:52:58 +00002770 Asm->OutStreamer.AddComment("MIPS linkage name");
Chris Lattner4cf202b2010-01-23 03:11:46 +00002771 if (LName.empty()) {
2772 Asm->OutStreamer.EmitBytes(Name, 0);
2773 Asm->OutStreamer.EmitIntValue(0, 1, 0); // nul terminator.
Jim Grosbach1e20b962010-07-21 21:21:52 +00002774 } else
Chris Lattner6189ed12010-04-04 23:25:33 +00002775 Asm->EmitSectionOffset(getStringPoolEntry(getRealLinkageName(LName)),
2776 DwarfStrSectionSym);
Devang Patel53bb5c92009-11-10 23:06:00 +00002777
Chris Lattner233f52b2010-03-09 23:52:58 +00002778 Asm->OutStreamer.AddComment("Function name");
Chris Lattner6189ed12010-04-04 23:25:33 +00002779 Asm->EmitSectionOffset(getStringPoolEntry(Name), DwarfStrSectionSym);
Chris Lattner7e1a8f82010-04-04 19:09:29 +00002780 Asm->EmitULEB128(Labels.size(), "Inline count");
Bill Wendling94d04b82009-05-20 23:21:38 +00002781
Devang Patel53bb5c92009-11-10 23:06:00 +00002782 for (SmallVector<InlineInfoLabels, 4>::iterator LI = Labels.begin(),
Bill Wendling94d04b82009-05-20 23:21:38 +00002783 LE = Labels.end(); LI != LE; ++LI) {
Chris Lattner3f53c832010-04-04 18:52:31 +00002784 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
Chris Lattner6ed0f902010-03-09 00:31:02 +00002785 Asm->EmitInt32(LI->second->getOffset());
Bill Wendling94d04b82009-05-20 23:21:38 +00002786
Chris Lattner3f53c832010-04-04 18:52:31 +00002787 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("low_pc");
Chris Lattnerd38fee82010-04-05 00:13:49 +00002788 Asm->OutStreamer.EmitSymbolValue(LI->first,
2789 Asm->getTargetData().getPointerSize(),0);
Bill Wendling94d04b82009-05-20 23:21:38 +00002790 }
2791 }
2792
Chris Lattnerc0215722010-04-04 19:25:43 +00002793 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_end", 1));
Bill Wendling94d04b82009-05-20 23:21:38 +00002794}