blob: bad87c1b5582124dd649c664d6392edaada2a3cd [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"
Bill Wendling57fbba42010-04-05 22:59:21 +000017#include "llvm/Constants.h"
Bill Wendling0310d762009-05-15 09:23:25 +000018#include "llvm/Module.h"
Devang Patele449d1f2011-01-20 00:02:16 +000019#include "llvm/Instructions.h"
David Greeneb2c66fc2009-08-19 21:52:55 +000020#include "llvm/CodeGen/MachineFunction.h"
Bill Wendling0310d762009-05-15 09:23:25 +000021#include "llvm/CodeGen/MachineModuleInfo.h"
Chris Lattnerb7db7332010-03-09 01:58:53 +000022#include "llvm/MC/MCAsmInfo.h"
Chris Lattnera87dea42009-07-31 18:48:30 +000023#include "llvm/MC/MCSection.h"
Chris Lattner6c2f9e12009-08-19 05:49:37 +000024#include "llvm/MC/MCStreamer.h"
Chris Lattnerb7db7332010-03-09 01:58:53 +000025#include "llvm/MC/MCSymbol.h"
Chris Lattner45111d12010-01-16 21:57:06 +000026#include "llvm/Target/Mangler.h"
Bill Wendling0310d762009-05-15 09:23:25 +000027#include "llvm/Target/TargetData.h"
Anton Korobeynikov16c29b52011-01-10 12:39:04 +000028#include "llvm/Target/TargetFrameLowering.h"
Chris Lattnerf0144122009-07-28 03:13:23 +000029#include "llvm/Target/TargetLoweringObjectFile.h"
Chris Lattner9d1c1ad2010-04-04 18:06:11 +000030#include "llvm/Target/TargetMachine.h"
Chris Lattnerf0144122009-07-28 03:13:23 +000031#include "llvm/Target/TargetRegisterInfo.h"
Devang Patel2a4a3b72010-04-19 19:14:02 +000032#include "llvm/Target/TargetOptions.h"
Chris Lattner74e41f92010-04-05 05:24:55 +000033#include "llvm/Analysis/DebugInfo.h"
Devang Patel0eea95d2011-02-24 18:49:30 +000034#include "llvm/Analysis/DIBuilder.h"
Devang Patel9a31f0f2010-10-25 20:45:32 +000035#include "llvm/ADT/Statistic.h"
Jeffrey Yasskin5c213dc2010-03-12 17:45:06 +000036#include "llvm/ADT/STLExtras.h"
Chris Lattner23132b12009-08-24 03:52:50 +000037#include "llvm/ADT/StringExtras.h"
Devang Pateleac9c072010-04-27 19:46:33 +000038#include "llvm/Support/CommandLine.h"
Daniel Dunbar6e4bdfc2009-10-13 06:47:08 +000039#include "llvm/Support/Debug.h"
40#include "llvm/Support/ErrorHandling.h"
Devang Patel3139fcf2010-01-26 21:39:14 +000041#include "llvm/Support/ValueHandle.h"
Chris Lattner0ad9c912010-01-22 22:09:00 +000042#include "llvm/Support/FormattedStream.h"
Chris Lattnera87dea42009-07-31 18:48:30 +000043#include "llvm/Support/Timer.h"
Michael J. Spencer1f6efa32010-11-29 18:16:10 +000044#include "llvm/Support/Path.h"
Bill Wendling0310d762009-05-15 09:23:25 +000045using namespace llvm;
46
Devang Pateleac9c072010-04-27 19:46:33 +000047static cl::opt<bool> PrintDbgScope("print-dbgscope", cl::Hidden,
48 cl::desc("Print DbgScope information for each machine instruction"));
49
Jim Grosbach1e20b962010-07-21 21:21:52 +000050static cl::opt<bool> DisableDebugInfoPrinting("disable-debug-info-print",
Devang Patel61409622010-07-07 20:12:52 +000051 cl::Hidden,
Devang Pateleac9c072010-04-27 19:46:33 +000052 cl::desc("Disable debug info printing"));
53
Dan Gohman281d65d2010-05-07 01:08:53 +000054static cl::opt<bool> UnknownLocations("use-unknown-locations", cl::Hidden,
55 cl::desc("Make an absense of debug location information explicit."),
56 cl::init(false));
57
Nick Lewyckya568d662010-10-26 00:51:57 +000058#ifndef NDEBUG
Devang Patel9a31f0f2010-10-25 20:45:32 +000059STATISTIC(BlocksWithoutLineNo, "Number of blocks without any line number");
Nick Lewyckya568d662010-10-26 00:51:57 +000060#endif
Devang Patel9a31f0f2010-10-25 20:45:32 +000061
Bill Wendling5f017e82010-04-07 09:28:04 +000062namespace {
63 const char *DWARFGroupName = "DWARF Emission";
64 const char *DbgTimerName = "DWARF Debug Writer";
65} // end anonymous namespace
66
Bill Wendling0310d762009-05-15 09:23:25 +000067//===----------------------------------------------------------------------===//
68
69/// Configuration values for initial hash set sizes (log2).
70///
Bill Wendling0310d762009-05-15 09:23:25 +000071static const unsigned InitAbbreviationsSetSize = 9; // log2(512)
Bill Wendling0310d762009-05-15 09:23:25 +000072
73namespace llvm {
74
75//===----------------------------------------------------------------------===//
76/// CompileUnit - This dwarf writer support class manages information associate
77/// with a source file.
Nick Lewycky5f9843f2009-11-17 08:11:44 +000078class CompileUnit {
Bill Wendling0310d762009-05-15 09:23:25 +000079 /// ID - File identifier for source.
80 ///
81 unsigned ID;
82
83 /// Die - Compile unit debug information entry.
84 ///
Jeffrey Yasskin5c213dc2010-03-12 17:45:06 +000085 const OwningPtr<DIE> CUDie;
Bill Wendling0310d762009-05-15 09:23:25 +000086
Jeffrey Yasskind0f393d2010-03-11 18:29:55 +000087 /// IndexTyDie - An anonymous type for index type. Owned by CUDie.
Devang Patel6f01d9c2009-11-21 00:31:03 +000088 DIE *IndexTyDie;
89
Devang Patel869aa462010-07-07 20:49:57 +000090 /// MDNodeToDieMap - Tracks the mapping of unit level debug informaton
Bill Wendling0310d762009-05-15 09:23:25 +000091 /// variables to debug information entries.
Devang Patel869aa462010-07-07 20:49:57 +000092 DenseMap<const MDNode *, DIE *> MDNodeToDieMap;
Bill Wendling0310d762009-05-15 09:23:25 +000093
Devang Patel869aa462010-07-07 20:49:57 +000094 /// MDNodeToDIEEntryMap - Tracks the mapping of unit level debug informaton
Bill Wendling0310d762009-05-15 09:23:25 +000095 /// descriptors to debug information entries using a DIEEntry proxy.
Devang Patel869aa462010-07-07 20:49:57 +000096 DenseMap<const MDNode *, DIEEntry *> MDNodeToDIEEntryMap;
Bill Wendling0310d762009-05-15 09:23:25 +000097
98 /// Globals - A map of globally visible named entities for this unit.
99 ///
100 StringMap<DIE*> Globals;
101
Devang Patel193f7202009-11-24 01:14:22 +0000102 /// GlobalTypes - A map of globally visible types for this unit.
103 ///
104 StringMap<DIE*> GlobalTypes;
105
Bill Wendling0310d762009-05-15 09:23:25 +0000106public:
107 CompileUnit(unsigned I, DIE *D)
Devang Patel2c4ceb12009-11-21 02:48:08 +0000108 : ID(I), CUDie(D), IndexTyDie(0) {}
Bill Wendling0310d762009-05-15 09:23:25 +0000109
110 // Accessors.
Devang Patel193f7202009-11-24 01:14:22 +0000111 unsigned getID() const { return ID; }
Jeffrey Yasskind0f393d2010-03-11 18:29:55 +0000112 DIE* getCUDie() const { return CUDie.get(); }
Devang Patel193f7202009-11-24 01:14:22 +0000113 const StringMap<DIE*> &getGlobals() const { return Globals; }
114 const StringMap<DIE*> &getGlobalTypes() const { return GlobalTypes; }
Bill Wendling0310d762009-05-15 09:23:25 +0000115
116 /// hasContent - Return true if this compile unit has something to write out.
117 ///
Devang Patel2c4ceb12009-11-21 02:48:08 +0000118 bool hasContent() const { return !CUDie->getChildren().empty(); }
Bill Wendling0310d762009-05-15 09:23:25 +0000119
Devang Patel2c4ceb12009-11-21 02:48:08 +0000120 /// addGlobal - Add a new global entity to the compile unit.
Bill Wendling0310d762009-05-15 09:23:25 +0000121 ///
Benjamin Kramerbbb88db2010-03-31 20:15:45 +0000122 void addGlobal(StringRef Name, DIE *Die) { Globals[Name] = Die; }
Bill Wendling0310d762009-05-15 09:23:25 +0000123
Devang Patel193f7202009-11-24 01:14:22 +0000124 /// addGlobalType - Add a new global type to the compile unit.
125 ///
Jim Grosbach1e20b962010-07-21 21:21:52 +0000126 void addGlobalType(StringRef Name, DIE *Die) {
127 GlobalTypes[Name] = Die;
Devang Patel193f7202009-11-24 01:14:22 +0000128 }
129
Devang Patel017d1212009-11-20 21:37:22 +0000130 /// getDIE - Returns the debug information entry map slot for the
Bill Wendling0310d762009-05-15 09:23:25 +0000131 /// specified debug variable.
Devang Patel869aa462010-07-07 20:49:57 +0000132 DIE *getDIE(const MDNode *N) { return MDNodeToDieMap.lookup(N); }
Jim Grosbach31ef40e2009-11-21 23:12:12 +0000133
Devang Patel017d1212009-11-20 21:37:22 +0000134 /// insertDIE - Insert DIE into the map.
Devang Patele9f8f5e2010-05-07 20:54:48 +0000135 void insertDIE(const MDNode *N, DIE *D) {
Devang Patel869aa462010-07-07 20:49:57 +0000136 MDNodeToDieMap.insert(std::make_pair(N, D));
Devang Patel017d1212009-11-20 21:37:22 +0000137 }
Bill Wendling0310d762009-05-15 09:23:25 +0000138
Devang Patel017d1212009-11-20 21:37:22 +0000139 /// getDIEEntry - Returns the debug information entry for the speciefied
140 /// debug variable.
Jim Grosbach1e20b962010-07-21 21:21:52 +0000141 DIEEntry *getDIEEntry(const MDNode *N) {
142 DenseMap<const MDNode *, DIEEntry *>::iterator I =
143 MDNodeToDIEEntryMap.find(N);
Devang Patel869aa462010-07-07 20:49:57 +0000144 if (I == MDNodeToDIEEntryMap.end())
Devang Patel6404e4e2009-12-15 19:16:48 +0000145 return NULL;
146 return I->second;
147 }
Devang Patel017d1212009-11-20 21:37:22 +0000148
149 /// insertDIEEntry - Insert debug information entry into the map.
Devang Patele9f8f5e2010-05-07 20:54:48 +0000150 void insertDIEEntry(const MDNode *N, DIEEntry *E) {
Devang Patel869aa462010-07-07 20:49:57 +0000151 MDNodeToDIEEntryMap.insert(std::make_pair(N, E));
Bill Wendling0310d762009-05-15 09:23:25 +0000152 }
153
Devang Patel2c4ceb12009-11-21 02:48:08 +0000154 /// addDie - Adds or interns the DIE to the compile unit.
Bill Wendling0310d762009-05-15 09:23:25 +0000155 ///
Devang Patel2c4ceb12009-11-21 02:48:08 +0000156 void addDie(DIE *Buffer) {
157 this->CUDie->addChild(Buffer);
Bill Wendling0310d762009-05-15 09:23:25 +0000158 }
Devang Patel6f01d9c2009-11-21 00:31:03 +0000159
160 // getIndexTyDie - Get an anonymous type for index type.
161 DIE *getIndexTyDie() {
162 return IndexTyDie;
163 }
164
Jim Grosbach7ab38df2009-11-22 19:20:36 +0000165 // setIndexTyDie - Set D as anonymous type for index which can be reused
166 // later.
Devang Patel6f01d9c2009-11-21 00:31:03 +0000167 void setIndexTyDie(DIE *D) {
168 IndexTyDie = D;
169 }
170
Bill Wendling0310d762009-05-15 09:23:25 +0000171};
172
173//===----------------------------------------------------------------------===//
174/// DbgVariable - This class is used to track local variable information.
175///
Devang Patelf76a3d62009-11-16 21:53:40 +0000176class DbgVariable {
Bill Wendling0310d762009-05-15 09:23:25 +0000177 DIVariable Var; // Variable Descriptor.
Devang Patelc3f5f782010-05-25 23:40:22 +0000178 DIE *TheDIE; // Variable DIE.
179 unsigned DotDebugLocOffset; // Offset in DotDebugLocEntries.
Bill Wendling0310d762009-05-15 09:23:25 +0000180public:
Jeffrey Yasskin5c213dc2010-03-12 17:45:06 +0000181 // AbsVar may be NULL.
Devang Patelc3f5f782010-05-25 23:40:22 +0000182 DbgVariable(DIVariable V) : Var(V), TheDIE(0), DotDebugLocOffset(~0U) {}
Bill Wendling0310d762009-05-15 09:23:25 +0000183
184 // Accessors.
Devang Patel53bb5c92009-11-10 23:06:00 +0000185 DIVariable getVariable() const { return Var; }
Devang Patel53bb5c92009-11-10 23:06:00 +0000186 void setDIE(DIE *D) { TheDIE = D; }
187 DIE *getDIE() const { return TheDIE; }
Devang Patelc3f5f782010-05-25 23:40:22 +0000188 void setDotDebugLocOffset(unsigned O) { DotDebugLocOffset = O; }
189 unsigned getDotDebugLocOffset() const { return DotDebugLocOffset; }
Devang Patel8bd11de2010-08-09 21:01:39 +0000190 StringRef getName() const { return Var.getName(); }
191 unsigned getTag() const { return Var.getTag(); }
192 bool variableHasComplexAddress() const {
193 assert(Var.Verify() && "Invalid complex DbgVariable!");
194 return Var.hasComplexAddress();
195 }
196 bool isBlockByrefVariable() const {
197 assert(Var.Verify() && "Invalid complex DbgVariable!");
198 return Var.isBlockByrefVariable();
199 }
200 unsigned getNumAddrElements() const {
201 assert(Var.Verify() && "Invalid complex DbgVariable!");
202 return Var.getNumAddrElements();
203 }
204 uint64_t getAddrElement(unsigned i) const {
205 return Var.getAddrElement(i);
206 }
207 DIType getType() const {
208 DIType Ty = Var.getType();
209 // FIXME: isBlockByrefVariable should be reformulated in terms of complex
210 // addresses instead.
211 if (Var.isBlockByrefVariable()) {
212 /* Byref variables, in Blocks, are declared by the programmer as
213 "SomeType VarName;", but the compiler creates a
214 __Block_byref_x_VarName struct, and gives the variable VarName
215 either the struct, or a pointer to the struct, as its type. This
216 is necessary for various behind-the-scenes things the compiler
217 needs to do with by-reference variables in blocks.
218
219 However, as far as the original *programmer* is concerned, the
220 variable should still have type 'SomeType', as originally declared.
221
222 The following function dives into the __Block_byref_x_VarName
223 struct to find the original type of the variable. This will be
224 passed back to the code generating the type for the Debug
225 Information Entry for the variable 'VarName'. 'VarName' will then
226 have the original type 'SomeType' in its debug information.
227
228 The original type 'SomeType' will be the type of the field named
229 'VarName' inside the __Block_byref_x_VarName struct.
230
231 NOTE: In order for this to not completely fail on the debugger
232 side, the Debug Information Entry for the variable VarName needs to
233 have a DW_AT_location that tells the debugger how to unwind through
234 the pointers and __Block_byref_x_VarName struct to find the actual
235 value of the variable. The function addBlockByrefType does this. */
236 DIType subType = Ty;
237 unsigned tag = Ty.getTag();
238
239 if (tag == dwarf::DW_TAG_pointer_type) {
240 DIDerivedType DTy = DIDerivedType(Ty);
241 subType = DTy.getTypeDerivedFrom();
242 }
243
244 DICompositeType blockStruct = DICompositeType(subType);
245 DIArray Elements = blockStruct.getTypeArray();
246
247 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
248 DIDescriptor Element = Elements.getElement(i);
249 DIDerivedType DT = DIDerivedType(Element);
250 if (getName() == DT.getName())
251 return (DT.getTypeDerivedFrom());
252 }
253 return Ty;
254 }
255 return Ty;
256 }
Bill Wendling0310d762009-05-15 09:23:25 +0000257};
258
259//===----------------------------------------------------------------------===//
Devang Pateleac9c072010-04-27 19:46:33 +0000260/// DbgRange - This is used to track range of instructions with identical
261/// debug info scope.
262///
263typedef std::pair<const MachineInstr *, const MachineInstr *> DbgRange;
264
265//===----------------------------------------------------------------------===//
Bill Wendling0310d762009-05-15 09:23:25 +0000266/// DbgScope - This class is used to track scope information.
267///
Devang Patelf76a3d62009-11-16 21:53:40 +0000268class DbgScope {
Bill Wendling0310d762009-05-15 09:23:25 +0000269 DbgScope *Parent; // Parent to this scope.
Jim Grosbach31ef40e2009-11-21 23:12:12 +0000270 DIDescriptor Desc; // Debug info descriptor for scope.
Devang Patel3139fcf2010-01-26 21:39:14 +0000271 // Location at which this scope is inlined.
Jim Grosbach1e20b962010-07-21 21:21:52 +0000272 AssertingVH<const MDNode> InlinedAtLocation;
Devang Patel53bb5c92009-11-10 23:06:00 +0000273 bool AbstractScope; // Abstract Scope
Devang Pateld38dd112009-10-01 18:25:23 +0000274 const MachineInstr *LastInsn; // Last instruction of this scope.
275 const MachineInstr *FirstInsn; // First instruction of this scope.
Devang Pateleac9c072010-04-27 19:46:33 +0000276 unsigned DFSIn, DFSOut;
Jeffrey Yasskin5c213dc2010-03-12 17:45:06 +0000277 // Scopes defined in scope. Contents not owned.
278 SmallVector<DbgScope *, 4> Scopes;
279 // Variables declared in scope. Contents owned.
280 SmallVector<DbgVariable *, 8> Variables;
Devang Pateleac9c072010-04-27 19:46:33 +0000281 SmallVector<DbgRange, 4> Ranges;
Owen Anderson04c05f72009-06-24 22:53:20 +0000282 // Private state for dump()
283 mutable unsigned IndentLevel;
Bill Wendling0310d762009-05-15 09:23:25 +0000284public:
Devang Patele9f8f5e2010-05-07 20:54:48 +0000285 DbgScope(DbgScope *P, DIDescriptor D, const MDNode *I = 0)
Devang Patel53bb5c92009-11-10 23:06:00 +0000286 : Parent(P), Desc(D), InlinedAtLocation(I), AbstractScope(false),
Devang Pateleac9c072010-04-27 19:46:33 +0000287 LastInsn(0), FirstInsn(0),
288 DFSIn(0), DFSOut(0), IndentLevel(0) {}
Bill Wendling0310d762009-05-15 09:23:25 +0000289 virtual ~DbgScope();
290
291 // Accessors.
292 DbgScope *getParent() const { return Parent; }
Devang Patel53bb5c92009-11-10 23:06:00 +0000293 void setParent(DbgScope *P) { Parent = P; }
Bill Wendling0310d762009-05-15 09:23:25 +0000294 DIDescriptor getDesc() const { return Desc; }
Devang Patele9f8f5e2010-05-07 20:54:48 +0000295 const MDNode *getInlinedAt() const { return InlinedAtLocation; }
296 const MDNode *getScopeNode() const { return Desc; }
Jeffrey Yasskin5c213dc2010-03-12 17:45:06 +0000297 const SmallVector<DbgScope *, 4> &getScopes() { return Scopes; }
Devang Patele03161c2010-08-09 18:51:29 +0000298 const SmallVector<DbgVariable *, 8> &getDbgVariables() { return Variables; }
Devang Pateleac9c072010-04-27 19:46:33 +0000299 const SmallVector<DbgRange, 4> &getRanges() { return Ranges; }
300
301 /// openInsnRange - This scope covers instruction range starting from MI.
302 void openInsnRange(const MachineInstr *MI) {
Jim Grosbach1e20b962010-07-21 21:21:52 +0000303 if (!FirstInsn)
Devang Pateleac9c072010-04-27 19:46:33 +0000304 FirstInsn = MI;
Jim Grosbach1e20b962010-07-21 21:21:52 +0000305
Devang Pateleac9c072010-04-27 19:46:33 +0000306 if (Parent)
307 Parent->openInsnRange(MI);
308 }
309
Jim Grosbach1e20b962010-07-21 21:21:52 +0000310 /// extendInsnRange - Extend the current instruction range covered by
Devang Pateleac9c072010-04-27 19:46:33 +0000311 /// this scope.
312 void extendInsnRange(const MachineInstr *MI) {
313 assert (FirstInsn && "MI Range is not open!");
314 LastInsn = MI;
315 if (Parent)
316 Parent->extendInsnRange(MI);
317 }
318
319 /// closeInsnRange - Create a range based on FirstInsn and LastInsn collected
320 /// until now. This is used when a new scope is encountered while walking
321 /// machine instructions.
322 void closeInsnRange(DbgScope *NewScope = NULL) {
323 assert (LastInsn && "Last insn missing!");
324 Ranges.push_back(DbgRange(FirstInsn, LastInsn));
Jim Grosbach1e20b962010-07-21 21:21:52 +0000325 FirstInsn = NULL;
Devang Pateleac9c072010-04-27 19:46:33 +0000326 LastInsn = NULL;
Jim Grosbach1e20b962010-07-21 21:21:52 +0000327 // If Parent dominates NewScope then do not close Parent's instruction
Devang Pateleac9c072010-04-27 19:46:33 +0000328 // range.
329 if (Parent && (!NewScope || !Parent->dominates(NewScope)))
330 Parent->closeInsnRange(NewScope);
331 }
332
Devang Patel53bb5c92009-11-10 23:06:00 +0000333 void setAbstractScope() { AbstractScope = true; }
334 bool isAbstractScope() const { return AbstractScope; }
Devang Pateleac9c072010-04-27 19:46:33 +0000335
336 // Depth First Search support to walk and mainpluate DbgScope hierarchy.
337 unsigned getDFSOut() const { return DFSOut; }
338 void setDFSOut(unsigned O) { DFSOut = O; }
339 unsigned getDFSIn() const { return DFSIn; }
340 void setDFSIn(unsigned I) { DFSIn = I; }
341 bool dominates(const DbgScope *S) {
Jim Grosbach1e20b962010-07-21 21:21:52 +0000342 if (S == this)
Devang Pateleac9c072010-04-27 19:46:33 +0000343 return true;
344 if (DFSIn < S->getDFSIn() && DFSOut > S->getDFSOut())
345 return true;
346 return false;
347 }
Devang Patel53bb5c92009-11-10 23:06:00 +0000348
Devang Patel2c4ceb12009-11-21 02:48:08 +0000349 /// addScope - Add a scope to the scope.
Bill Wendling0310d762009-05-15 09:23:25 +0000350 ///
Devang Patel2c4ceb12009-11-21 02:48:08 +0000351 void addScope(DbgScope *S) { Scopes.push_back(S); }
Bill Wendling0310d762009-05-15 09:23:25 +0000352
Devang Patel2c4ceb12009-11-21 02:48:08 +0000353 /// addVariable - Add a variable to the scope.
Bill Wendling0310d762009-05-15 09:23:25 +0000354 ///
Devang Patel2c4ceb12009-11-21 02:48:08 +0000355 void addVariable(DbgVariable *V) { Variables.push_back(V); }
Bill Wendling0310d762009-05-15 09:23:25 +0000356
Bill Wendling0310d762009-05-15 09:23:25 +0000357#ifndef NDEBUG
358 void dump() const;
359#endif
360};
Devang Pateleac9c072010-04-27 19:46:33 +0000361
Chris Lattnerea761862010-04-05 04:09:20 +0000362} // end llvm namespace
Bill Wendling0310d762009-05-15 09:23:25 +0000363
364#ifndef NDEBUG
365void DbgScope::dump() const {
David Greenef83adbc2009-12-24 00:31:35 +0000366 raw_ostream &err = dbgs();
Chris Lattnerc281de12009-08-23 00:51:00 +0000367 err.indent(IndentLevel);
Devang Patele9f8f5e2010-05-07 20:54:48 +0000368 const MDNode *N = Desc;
Devang Patel53bb5c92009-11-10 23:06:00 +0000369 N->dump();
Devang Patel53bb5c92009-11-10 23:06:00 +0000370 if (AbstractScope)
371 err << "Abstract Scope\n";
Bill Wendling0310d762009-05-15 09:23:25 +0000372
373 IndentLevel += 2;
Devang Patel53bb5c92009-11-10 23:06:00 +0000374 if (!Scopes.empty())
375 err << "Children ...\n";
Bill Wendling0310d762009-05-15 09:23:25 +0000376 for (unsigned i = 0, e = Scopes.size(); i != e; ++i)
377 if (Scopes[i] != this)
378 Scopes[i]->dump();
379
380 IndentLevel -= 2;
381}
382#endif
383
Bill Wendling0310d762009-05-15 09:23:25 +0000384DbgScope::~DbgScope() {
Bill Wendling0310d762009-05-15 09:23:25 +0000385 for (unsigned j = 0, M = Variables.size(); j < M; ++j)
386 delete Variables[j];
Bill Wendling0310d762009-05-15 09:23:25 +0000387}
388
Chris Lattner49cd6642010-04-05 05:11:15 +0000389DwarfDebug::DwarfDebug(AsmPrinter *A, Module *M)
Devang Patel163a9f72010-05-10 22:49:55 +0000390 : Asm(A), MMI(Asm->MMI), FirstCU(0),
Jim Grosbach1e20b962010-07-21 21:21:52 +0000391 AbbreviationsSet(InitAbbreviationsSetSize),
Devang Patelf2548ca2010-04-16 23:33:45 +0000392 CurrentFnDbgScope(0), PrevLabel(NULL) {
Chris Lattnerbc733f52010-03-13 02:17:42 +0000393 NextStringPoolNumber = 0;
Jim Grosbach1e20b962010-07-21 21:21:52 +0000394
Chris Lattner4ad1efe2010-04-04 23:10:38 +0000395 DwarfFrameSectionSym = DwarfInfoSectionSym = DwarfAbbrevSectionSym = 0;
396 DwarfStrSectionSym = TextSectionSym = 0;
Jim Grosbach1e20b962010-07-21 21:21:52 +0000397 DwarfDebugRangeSectionSym = DwarfDebugLocSectionSym = 0;
Devang Patelc3f5f782010-05-25 23:40:22 +0000398 FunctionBeginSym = FunctionEndSym = 0;
Devang Patelca76f6f2010-07-08 20:10:35 +0000399 DIEIntegerOne = new (DIEValueAllocator) DIEInteger(1);
Dan Gohman03c3dc72010-06-18 15:56:31 +0000400 {
401 NamedRegionTimer T(DbgTimerName, DWARFGroupName, TimePassesIsEnabled);
402 beginModule(M);
Torok Edwin9c421072010-04-07 10:44:46 +0000403 }
Bill Wendling0310d762009-05-15 09:23:25 +0000404}
405DwarfDebug::~DwarfDebug() {
Benjamin Kramer345ef342010-03-31 19:34:01 +0000406 for (unsigned j = 0, M = DIEBlocks.size(); j < M; ++j)
407 DIEBlocks[j]->~DIEBlock();
Bill Wendling0310d762009-05-15 09:23:25 +0000408}
409
Chris Lattnerbc733f52010-03-13 02:17:42 +0000410MCSymbol *DwarfDebug::getStringPoolEntry(StringRef Str) {
411 std::pair<MCSymbol*, unsigned> &Entry = StringPool[Str];
412 if (Entry.first) return Entry.first;
413
414 Entry.second = NextStringPoolNumber++;
Chris Lattnerc0215722010-04-04 19:25:43 +0000415 return Entry.first = Asm->GetTempSymbol("string", Entry.second);
Chris Lattnerbc733f52010-03-13 02:17:42 +0000416}
417
418
Devang Patel2c4ceb12009-11-21 02:48:08 +0000419/// assignAbbrevNumber - Define a unique number for the abbreviation.
Bill Wendling0310d762009-05-15 09:23:25 +0000420///
Devang Patel2c4ceb12009-11-21 02:48:08 +0000421void DwarfDebug::assignAbbrevNumber(DIEAbbrev &Abbrev) {
Bill Wendling0310d762009-05-15 09:23:25 +0000422 // Profile the node so that we can make it unique.
423 FoldingSetNodeID ID;
424 Abbrev.Profile(ID);
425
426 // Check the set for priors.
427 DIEAbbrev *InSet = AbbreviationsSet.GetOrInsertNode(&Abbrev);
428
429 // If it's newly added.
430 if (InSet == &Abbrev) {
431 // Add to abbreviation list.
432 Abbreviations.push_back(&Abbrev);
433
434 // Assign the vector position + 1 as its number.
435 Abbrev.setNumber(Abbreviations.size());
436 } else {
437 // Assign existing abbreviation number.
438 Abbrev.setNumber(InSet->getNumber());
439 }
440}
441
Devang Patel2c4ceb12009-11-21 02:48:08 +0000442/// createDIEEntry - Creates a new DIEEntry to be a proxy for a debug
Bill Wendling995f80a2009-05-20 23:24:48 +0000443/// information entry.
Devang Patel2c4ceb12009-11-21 02:48:08 +0000444DIEEntry *DwarfDebug::createDIEEntry(DIE *Entry) {
Benjamin Kramer345ef342010-03-31 19:34:01 +0000445 DIEEntry *Value = new (DIEValueAllocator) DIEEntry(Entry);
Bill Wendling0310d762009-05-15 09:23:25 +0000446 return Value;
447}
448
Devang Patel2c4ceb12009-11-21 02:48:08 +0000449/// addUInt - Add an unsigned integer attribute data and value.
Bill Wendling0310d762009-05-15 09:23:25 +0000450///
Devang Patel2c4ceb12009-11-21 02:48:08 +0000451void DwarfDebug::addUInt(DIE *Die, unsigned Attribute,
Bill Wendling0310d762009-05-15 09:23:25 +0000452 unsigned Form, uint64_t Integer) {
453 if (!Form) Form = DIEInteger::BestForm(false, Integer);
Jim Grosbach1e20b962010-07-21 21:21:52 +0000454 DIEValue *Value = Integer == 1 ?
Devang Patelca76f6f2010-07-08 20:10:35 +0000455 DIEIntegerOne : new (DIEValueAllocator) DIEInteger(Integer);
Devang Patel2c4ceb12009-11-21 02:48:08 +0000456 Die->addValue(Attribute, Form, Value);
Bill Wendling0310d762009-05-15 09:23:25 +0000457}
458
Devang Patel2c4ceb12009-11-21 02:48:08 +0000459/// addSInt - Add an signed integer attribute data and value.
Bill Wendling0310d762009-05-15 09:23:25 +0000460///
Devang Patel2c4ceb12009-11-21 02:48:08 +0000461void DwarfDebug::addSInt(DIE *Die, unsigned Attribute,
Bill Wendling0310d762009-05-15 09:23:25 +0000462 unsigned Form, int64_t Integer) {
463 if (!Form) Form = DIEInteger::BestForm(true, Integer);
Benjamin Kramer345ef342010-03-31 19:34:01 +0000464 DIEValue *Value = new (DIEValueAllocator) DIEInteger(Integer);
Devang Patel2c4ceb12009-11-21 02:48:08 +0000465 Die->addValue(Attribute, Form, Value);
Bill Wendling0310d762009-05-15 09:23:25 +0000466}
467
Devang Patel69f57b12009-12-02 15:25:16 +0000468/// addString - Add a string attribute data and value. DIEString only
Jim Grosbach1e20b962010-07-21 21:21:52 +0000469/// keeps string reference.
Devang Patel2c4ceb12009-11-21 02:48:08 +0000470void DwarfDebug::addString(DIE *Die, unsigned Attribute, unsigned Form,
Chris Lattner4cf202b2010-01-23 03:11:46 +0000471 StringRef String) {
Benjamin Kramer345ef342010-03-31 19:34:01 +0000472 DIEValue *Value = new (DIEValueAllocator) DIEString(String);
Devang Patel2c4ceb12009-11-21 02:48:08 +0000473 Die->addValue(Attribute, Form, Value);
Bill Wendling0310d762009-05-15 09:23:25 +0000474}
475
Devang Patel2c4ceb12009-11-21 02:48:08 +0000476/// addLabel - Add a Dwarf label attribute data and value.
Bill Wendling0310d762009-05-15 09:23:25 +0000477///
Devang Patel2c4ceb12009-11-21 02:48:08 +0000478void DwarfDebug::addLabel(DIE *Die, unsigned Attribute, unsigned Form,
Chris Lattnerb98b1bf2010-03-08 22:23:36 +0000479 const MCSymbol *Label) {
Benjamin Kramer345ef342010-03-31 19:34:01 +0000480 DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
Devang Patel2c4ceb12009-11-21 02:48:08 +0000481 Die->addValue(Attribute, Form, Value);
Bill Wendling0310d762009-05-15 09:23:25 +0000482}
483
Devang Patel2c4ceb12009-11-21 02:48:08 +0000484/// addDelta - Add a label delta attribute data and value.
Bill Wendling0310d762009-05-15 09:23:25 +0000485///
Devang Patel2c4ceb12009-11-21 02:48:08 +0000486void DwarfDebug::addDelta(DIE *Die, unsigned Attribute, unsigned Form,
Chris Lattnerb98b1bf2010-03-08 22:23:36 +0000487 const MCSymbol *Hi, const MCSymbol *Lo) {
Benjamin Kramer345ef342010-03-31 19:34:01 +0000488 DIEValue *Value = new (DIEValueAllocator) DIEDelta(Hi, Lo);
Devang Patel2c4ceb12009-11-21 02:48:08 +0000489 Die->addValue(Attribute, Form, Value);
Bill Wendling0310d762009-05-15 09:23:25 +0000490}
491
Chris Lattner74e41f92010-04-05 05:24:55 +0000492/// addDIEEntry - Add a DIE attribute data and value.
493///
494void DwarfDebug::addDIEEntry(DIE *Die, unsigned Attribute, unsigned Form,
495 DIE *Entry) {
496 Die->addValue(Attribute, Form, createDIEEntry(Entry));
497}
498
499
Devang Patel2c4ceb12009-11-21 02:48:08 +0000500/// addBlock - Add block data.
Bill Wendling0310d762009-05-15 09:23:25 +0000501///
Devang Patel2c4ceb12009-11-21 02:48:08 +0000502void DwarfDebug::addBlock(DIE *Die, unsigned Attribute, unsigned Form,
Bill Wendling0310d762009-05-15 09:23:25 +0000503 DIEBlock *Block) {
Chris Lattnera37d5382010-04-05 00:18:22 +0000504 Block->ComputeSize(Asm);
Benjamin Kramer345ef342010-03-31 19:34:01 +0000505 DIEBlocks.push_back(Block); // Memoize so we can call the destructor later on.
Devang Patel2c4ceb12009-11-21 02:48:08 +0000506 Die->addValue(Attribute, Block->BestForm(), Block);
Bill Wendling0310d762009-05-15 09:23:25 +0000507}
508
Devang Patel2c4ceb12009-11-21 02:48:08 +0000509/// addSourceLine - Add location information to specified debug information
Bill Wendling0310d762009-05-15 09:23:25 +0000510/// entry.
Devang Patel85e95802010-08-10 04:09:06 +0000511void DwarfDebug::addSourceLine(DIE *Die, DIVariable V) {
Devang Patelc665a512010-05-07 23:33:41 +0000512 // Verify variable.
Devang Patel81625742010-08-09 20:20:05 +0000513 if (!V.Verify())
Bill Wendling0310d762009-05-15 09:23:25 +0000514 return;
515
Devang Patel81625742010-08-09 20:20:05 +0000516 unsigned Line = V.getLineNumber();
Devang Patelb2bada32010-10-08 17:18:54 +0000517 if (Line == 0)
518 return;
Devang Patel23670e52011-03-24 20:30:50 +0000519 unsigned FileID = GetOrCreateSourceID(V.getContext().getFilename(),
520 V.getContext().getDirectory());
Bill Wendling0310d762009-05-15 09:23:25 +0000521 assert(FileID && "Invalid file id");
Devang Patel2c4ceb12009-11-21 02:48:08 +0000522 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
523 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
Bill Wendling0310d762009-05-15 09:23:25 +0000524}
525
Devang Patel2c4ceb12009-11-21 02:48:08 +0000526/// addSourceLine - Add location information to specified debug information
Bill Wendling0310d762009-05-15 09:23:25 +0000527/// entry.
Devang Patel85e95802010-08-10 04:09:06 +0000528void DwarfDebug::addSourceLine(DIE *Die, DIGlobalVariable G) {
Devang Patelc665a512010-05-07 23:33:41 +0000529 // Verify global variable.
Devang Patel81625742010-08-09 20:20:05 +0000530 if (!G.Verify())
Bill Wendling0310d762009-05-15 09:23:25 +0000531 return;
532
Devang Patel81625742010-08-09 20:20:05 +0000533 unsigned Line = G.getLineNumber();
Devang Patelb2bada32010-10-08 17:18:54 +0000534 if (Line == 0)
535 return;
Devang Patel23670e52011-03-24 20:30:50 +0000536 unsigned FileID = GetOrCreateSourceID(G.getContext().getFilename(),
537 G.getContext().getDirectory());
Bill Wendling0310d762009-05-15 09:23:25 +0000538 assert(FileID && "Invalid file id");
Devang Patel2c4ceb12009-11-21 02:48:08 +0000539 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
540 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
Bill Wendling0310d762009-05-15 09:23:25 +0000541}
Devang Patel82dfc0c2009-08-31 22:47:13 +0000542
Devang Patel2c4ceb12009-11-21 02:48:08 +0000543/// addSourceLine - Add location information to specified debug information
Devang Patel82dfc0c2009-08-31 22:47:13 +0000544/// entry.
Devang Patel85e95802010-08-10 04:09:06 +0000545void DwarfDebug::addSourceLine(DIE *Die, DISubprogram SP) {
Devang Patelc665a512010-05-07 23:33:41 +0000546 // Verify subprogram.
Devang Patel81625742010-08-09 20:20:05 +0000547 if (!SP.Verify())
Devang Patel82dfc0c2009-08-31 22:47:13 +0000548 return;
Caroline Ticec6f9d622009-09-11 18:25:54 +0000549 // If the line number is 0, don't add it.
Devang Patel81625742010-08-09 20:20:05 +0000550 if (SP.getLineNumber() == 0)
Caroline Ticec6f9d622009-09-11 18:25:54 +0000551 return;
552
Devang Patel81625742010-08-09 20:20:05 +0000553 unsigned Line = SP.getLineNumber();
554 if (!SP.getContext().Verify())
Devang Patel77bf2952010-03-08 22:02:50 +0000555 return;
Devang Patel23670e52011-03-24 20:30:50 +0000556 unsigned FileID = GetOrCreateSourceID(SP.getFilename(), SP.getDirectory());
Devang Patel82dfc0c2009-08-31 22:47:13 +0000557 assert(FileID && "Invalid file id");
Devang Patel2c4ceb12009-11-21 02:48:08 +0000558 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
559 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
Devang Patel82dfc0c2009-08-31 22:47:13 +0000560}
561
Devang Patel2c4ceb12009-11-21 02:48:08 +0000562/// addSourceLine - Add location information to specified debug information
Devang Patel82dfc0c2009-08-31 22:47:13 +0000563/// entry.
Devang Patel85e95802010-08-10 04:09:06 +0000564void DwarfDebug::addSourceLine(DIE *Die, DIType Ty) {
Devang Patelc665a512010-05-07 23:33:41 +0000565 // Verify type.
Devang Patel81625742010-08-09 20:20:05 +0000566 if (!Ty.Verify())
Bill Wendling0310d762009-05-15 09:23:25 +0000567 return;
568
Devang Patel81625742010-08-09 20:20:05 +0000569 unsigned Line = Ty.getLineNumber();
Devang Patelb2bada32010-10-08 17:18:54 +0000570 if (Line == 0 || !Ty.getContext().Verify())
Devang Patel77bf2952010-03-08 22:02:50 +0000571 return;
Devang Patel23670e52011-03-24 20:30:50 +0000572 unsigned FileID = GetOrCreateSourceID(Ty.getFilename(), Ty.getDirectory());
Bill Wendling0310d762009-05-15 09:23:25 +0000573 assert(FileID && "Invalid file id");
Devang Patel2c4ceb12009-11-21 02:48:08 +0000574 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
575 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
Bill Wendling0310d762009-05-15 09:23:25 +0000576}
577
Devang Patel6404e4e2009-12-15 19:16:48 +0000578/// addSourceLine - Add location information to specified debug information
579/// entry.
Devang Patel85e95802010-08-10 04:09:06 +0000580void DwarfDebug::addSourceLine(DIE *Die, DINameSpace NS) {
Devang Patelc665a512010-05-07 23:33:41 +0000581 // Verify namespace.
Devang Patel81625742010-08-09 20:20:05 +0000582 if (!NS.Verify())
Devang Patel6404e4e2009-12-15 19:16:48 +0000583 return;
584
Devang Patel81625742010-08-09 20:20:05 +0000585 unsigned Line = NS.getLineNumber();
Devang Patelb2bada32010-10-08 17:18:54 +0000586 if (Line == 0)
587 return;
Devang Patel81625742010-08-09 20:20:05 +0000588 StringRef FN = NS.getFilename();
Devang Patel6404e4e2009-12-15 19:16:48 +0000589
Devang Patel23670e52011-03-24 20:30:50 +0000590 unsigned FileID = GetOrCreateSourceID(FN, NS.getDirectory());
Devang Patel6404e4e2009-12-15 19:16:48 +0000591 assert(FileID && "Invalid file id");
592 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
593 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
594}
595
Devang Patel9e3bd2c2010-08-31 06:11:28 +0000596/// addVariableAddress - Add DW_AT_location attribute for a DbgVariable based
597/// on provided frame index.
598void DwarfDebug::addVariableAddress(DbgVariable *&DV, DIE *Die, int64_t FI) {
599 MachineLocation Location;
600 unsigned FrameReg;
Anton Korobeynikov16c29b52011-01-10 12:39:04 +0000601 const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
Anton Korobeynikov82f58742010-11-20 15:59:32 +0000602 int Offset = TFI->getFrameIndexReference(*Asm->MF, FI, FrameReg);
Devang Patel9e3bd2c2010-08-31 06:11:28 +0000603 Location.set(FrameReg, Offset);
604
Devang Patel8bd11de2010-08-09 21:01:39 +0000605 if (DV->variableHasComplexAddress())
606 addComplexAddress(DV, Die, dwarf::DW_AT_location, Location);
607 else if (DV->isBlockByrefVariable())
608 addBlockByrefAddress(DV, Die, dwarf::DW_AT_location, Location);
609 else
610 addAddress(Die, dwarf::DW_AT_location, Location);
Caroline Ticedc8f6042009-08-31 21:19:37 +0000611}
612
Devang Patel2c4ceb12009-11-21 02:48:08 +0000613/// addComplexAddress - Start with the address based on the location provided,
Mike Stump3e4c9bd2009-09-30 00:08:22 +0000614/// and generate the DWARF information necessary to find the actual variable
615/// given the extra address information encoded in the DIVariable, starting from
616/// the starting location. Add the DWARF information to the die.
617///
Devang Patel2c4ceb12009-11-21 02:48:08 +0000618void DwarfDebug::addComplexAddress(DbgVariable *&DV, DIE *Die,
Mike Stump3e4c9bd2009-09-30 00:08:22 +0000619 unsigned Attribute,
620 const MachineLocation &Location) {
Devang Patel8bd11de2010-08-09 21:01:39 +0000621 DIType Ty = DV->getType();
Mike Stump3e4c9bd2009-09-30 00:08:22 +0000622
623 // Decode the original location, and use that as the start of the byref
624 // variable's location.
Chris Lattnerd38fee82010-04-05 00:13:49 +0000625 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
Mike Stump3e4c9bd2009-09-30 00:08:22 +0000626 unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
Benjamin Kramer345ef342010-03-31 19:34:01 +0000627 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Mike Stump3e4c9bd2009-09-30 00:08:22 +0000628
629 if (Location.isReg()) {
630 if (Reg < 32) {
Devang Patel2c4ceb12009-11-21 02:48:08 +0000631 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
Mike Stump3e4c9bd2009-09-30 00:08:22 +0000632 } else {
Devang Pateldacde942011-01-19 23:04:47 +0000633 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
Devang Patel2c4ceb12009-11-21 02:48:08 +0000634 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
Mike Stump3e4c9bd2009-09-30 00:08:22 +0000635 }
636 } else {
637 if (Reg < 32)
Devang Patel2c4ceb12009-11-21 02:48:08 +0000638 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
Mike Stump3e4c9bd2009-09-30 00:08:22 +0000639 else {
Devang Patel2c4ceb12009-11-21 02:48:08 +0000640 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
641 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
Mike Stump3e4c9bd2009-09-30 00:08:22 +0000642 }
643
Devang Patel2c4ceb12009-11-21 02:48:08 +0000644 addUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
Mike Stump3e4c9bd2009-09-30 00:08:22 +0000645 }
646
Devang Patel8bd11de2010-08-09 21:01:39 +0000647 for (unsigned i = 0, N = DV->getNumAddrElements(); i < N; ++i) {
648 uint64_t Element = DV->getAddrElement(i);
Mike Stump3e4c9bd2009-09-30 00:08:22 +0000649
Devang Patel0eea95d2011-02-24 18:49:30 +0000650 if (Element == DIBuilder::OpPlus) {
Devang Patel2c4ceb12009-11-21 02:48:08 +0000651 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
Devang Patel8bd11de2010-08-09 21:01:39 +0000652 addUInt(Block, 0, dwarf::DW_FORM_udata, DV->getAddrElement(++i));
Devang Patel0eea95d2011-02-24 18:49:30 +0000653 } else if (Element == DIBuilder::OpDeref) {
Devang Patel2c4ceb12009-11-21 02:48:08 +0000654 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Devang Patel0eea95d2011-02-24 18:49:30 +0000655 } else llvm_unreachable("unknown DIBuilder Opcode");
Mike Stump3e4c9bd2009-09-30 00:08:22 +0000656 }
657
658 // Now attach the location information to the DIE.
Devang Patel2c4ceb12009-11-21 02:48:08 +0000659 addBlock(Die, Attribute, 0, Block);
Mike Stump3e4c9bd2009-09-30 00:08:22 +0000660}
661
Caroline Ticedc8f6042009-08-31 21:19:37 +0000662/* Byref variables, in Blocks, are declared by the programmer as "SomeType
663 VarName;", but the compiler creates a __Block_byref_x_VarName struct, and
664 gives the variable VarName either the struct, or a pointer to the struct, as
665 its type. This is necessary for various behind-the-scenes things the
666 compiler needs to do with by-reference variables in Blocks.
667
668 However, as far as the original *programmer* is concerned, the variable
669 should still have type 'SomeType', as originally declared.
670
Devang Patel2c4ceb12009-11-21 02:48:08 +0000671 The function getBlockByrefType dives into the __Block_byref_x_VarName
Caroline Ticedc8f6042009-08-31 21:19:37 +0000672 struct to find the original type of the variable, which is then assigned to
673 the variable's Debug Information Entry as its real type. So far, so good.
674 However now the debugger will expect the variable VarName to have the type
675 SomeType. So we need the location attribute for the variable to be an
Daniel Dunbarf612ff62009-09-19 20:40:05 +0000676 expression that explains to the debugger how to navigate through the
Caroline Ticedc8f6042009-08-31 21:19:37 +0000677 pointers and struct to find the actual variable of type SomeType.
678
679 The following function does just that. We start by getting
680 the "normal" location for the variable. This will be the location
681 of either the struct __Block_byref_x_VarName or the pointer to the
682 struct __Block_byref_x_VarName.
683
684 The struct will look something like:
685
686 struct __Block_byref_x_VarName {
687 ... <various fields>
688 struct __Block_byref_x_VarName *forwarding;
689 ... <various other fields>
690 SomeType VarName;
691 ... <maybe more fields>
692 };
693
694 If we are given the struct directly (as our starting point) we
695 need to tell the debugger to:
696
697 1). Add the offset of the forwarding field.
698
Dan Gohmanf451cb82010-02-10 16:03:48 +0000699 2). Follow that pointer to get the real __Block_byref_x_VarName
Caroline Ticedc8f6042009-08-31 21:19:37 +0000700 struct to use (the real one may have been copied onto the heap).
701
702 3). Add the offset for the field VarName, to find the actual variable.
703
704 If we started with a pointer to the struct, then we need to
705 dereference that pointer first, before the other steps.
706 Translating this into DWARF ops, we will need to append the following
707 to the current location description for the variable:
708
709 DW_OP_deref -- optional, if we start with a pointer
710 DW_OP_plus_uconst <forward_fld_offset>
711 DW_OP_deref
712 DW_OP_plus_uconst <varName_fld_offset>
713
714 That is what this function does. */
715
Devang Patel2c4ceb12009-11-21 02:48:08 +0000716/// addBlockByrefAddress - Start with the address based on the location
Caroline Ticedc8f6042009-08-31 21:19:37 +0000717/// provided, and generate the DWARF information necessary to find the
718/// actual Block variable (navigating the Block struct) based on the
719/// starting location. Add the DWARF information to the die. For
720/// more information, read large comment just above here.
721///
Devang Patel2c4ceb12009-11-21 02:48:08 +0000722void DwarfDebug::addBlockByrefAddress(DbgVariable *&DV, DIE *Die,
Daniel Dunbar00564992009-09-19 20:40:14 +0000723 unsigned Attribute,
724 const MachineLocation &Location) {
Devang Patel8bd11de2010-08-09 21:01:39 +0000725 DIType Ty = DV->getType();
Caroline Ticedc8f6042009-08-31 21:19:37 +0000726 DIType TmpTy = Ty;
727 unsigned Tag = Ty.getTag();
728 bool isPointer = false;
729
Devang Patel8bd11de2010-08-09 21:01:39 +0000730 StringRef varName = DV->getName();
Caroline Ticedc8f6042009-08-31 21:19:37 +0000731
732 if (Tag == dwarf::DW_TAG_pointer_type) {
Devang Patel2db49d72010-05-07 18:11:54 +0000733 DIDerivedType DTy = DIDerivedType(Ty);
Caroline Ticedc8f6042009-08-31 21:19:37 +0000734 TmpTy = DTy.getTypeDerivedFrom();
735 isPointer = true;
736 }
737
Devang Patel2db49d72010-05-07 18:11:54 +0000738 DICompositeType blockStruct = DICompositeType(TmpTy);
Caroline Ticedc8f6042009-08-31 21:19:37 +0000739
Daniel Dunbar00564992009-09-19 20:40:14 +0000740 // Find the __forwarding field and the variable field in the __Block_byref
741 // struct.
Daniel Dunbar00564992009-09-19 20:40:14 +0000742 DIArray Fields = blockStruct.getTypeArray();
743 DIDescriptor varField = DIDescriptor();
744 DIDescriptor forwardingField = DIDescriptor();
Caroline Ticedc8f6042009-08-31 21:19:37 +0000745
Daniel Dunbar00564992009-09-19 20:40:14 +0000746 for (unsigned i = 0, N = Fields.getNumElements(); i < N; ++i) {
747 DIDescriptor Element = Fields.getElement(i);
Devang Patel2db49d72010-05-07 18:11:54 +0000748 DIDerivedType DT = DIDerivedType(Element);
Devang Patel65dbc902009-11-25 17:36:49 +0000749 StringRef fieldName = DT.getName();
750 if (fieldName == "__forwarding")
Daniel Dunbar00564992009-09-19 20:40:14 +0000751 forwardingField = Element;
Devang Patel65dbc902009-11-25 17:36:49 +0000752 else if (fieldName == varName)
Daniel Dunbar00564992009-09-19 20:40:14 +0000753 varField = Element;
754 }
Daniel Dunbarf612ff62009-09-19 20:40:05 +0000755
Daniel Dunbar00564992009-09-19 20:40:14 +0000756 // Get the offsets for the forwarding field and the variable field.
Chris Lattner1d65ba72010-03-31 06:06:37 +0000757 unsigned forwardingFieldOffset =
Devang Patel2db49d72010-05-07 18:11:54 +0000758 DIDerivedType(forwardingField).getOffsetInBits() >> 3;
Chris Lattner1d65ba72010-03-31 06:06:37 +0000759 unsigned varFieldOffset =
Devang Patel2db49d72010-05-07 18:11:54 +0000760 DIDerivedType(varField).getOffsetInBits() >> 3;
Caroline Ticedc8f6042009-08-31 21:19:37 +0000761
Mike Stump7e3720d2009-09-24 23:21:26 +0000762 // Decode the original location, and use that as the start of the byref
763 // variable's location.
Chris Lattnerd38fee82010-04-05 00:13:49 +0000764 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
Daniel Dunbar00564992009-09-19 20:40:14 +0000765 unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
Benjamin Kramer345ef342010-03-31 19:34:01 +0000766 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Caroline Ticedc8f6042009-08-31 21:19:37 +0000767
Daniel Dunbar00564992009-09-19 20:40:14 +0000768 if (Location.isReg()) {
769 if (Reg < 32)
Devang Patel2c4ceb12009-11-21 02:48:08 +0000770 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
Daniel Dunbar00564992009-09-19 20:40:14 +0000771 else {
Devang Pateldacde942011-01-19 23:04:47 +0000772 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
Devang Patel2c4ceb12009-11-21 02:48:08 +0000773 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
Daniel Dunbar00564992009-09-19 20:40:14 +0000774 }
775 } else {
776 if (Reg < 32)
Devang Patel2c4ceb12009-11-21 02:48:08 +0000777 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
Daniel Dunbar00564992009-09-19 20:40:14 +0000778 else {
Devang Patel2c4ceb12009-11-21 02:48:08 +0000779 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
780 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
Daniel Dunbar00564992009-09-19 20:40:14 +0000781 }
Caroline Ticedc8f6042009-08-31 21:19:37 +0000782
Devang Patel2c4ceb12009-11-21 02:48:08 +0000783 addUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
Daniel Dunbar00564992009-09-19 20:40:14 +0000784 }
Caroline Ticedc8f6042009-08-31 21:19:37 +0000785
Mike Stump7e3720d2009-09-24 23:21:26 +0000786 // If we started with a pointer to the __Block_byref... struct, then
Daniel Dunbar00564992009-09-19 20:40:14 +0000787 // the first thing we need to do is dereference the pointer (DW_OP_deref).
Daniel Dunbar00564992009-09-19 20:40:14 +0000788 if (isPointer)
Devang Patel2c4ceb12009-11-21 02:48:08 +0000789 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Caroline Ticedc8f6042009-08-31 21:19:37 +0000790
Daniel Dunbar00564992009-09-19 20:40:14 +0000791 // Next add the offset for the '__forwarding' field:
792 // DW_OP_plus_uconst ForwardingFieldOffset. Note there's no point in
793 // adding the offset if it's 0.
Daniel Dunbar00564992009-09-19 20:40:14 +0000794 if (forwardingFieldOffset > 0) {
Devang Patel2c4ceb12009-11-21 02:48:08 +0000795 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
796 addUInt(Block, 0, dwarf::DW_FORM_udata, forwardingFieldOffset);
Daniel Dunbar00564992009-09-19 20:40:14 +0000797 }
Caroline Ticedc8f6042009-08-31 21:19:37 +0000798
Daniel Dunbar00564992009-09-19 20:40:14 +0000799 // Now dereference the __forwarding field to get to the real __Block_byref
800 // struct: DW_OP_deref.
Devang Patel2c4ceb12009-11-21 02:48:08 +0000801 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Caroline Ticedc8f6042009-08-31 21:19:37 +0000802
Daniel Dunbar00564992009-09-19 20:40:14 +0000803 // Now that we've got the real __Block_byref... struct, add the offset
804 // for the variable's field to get to the location of the actual variable:
805 // DW_OP_plus_uconst varFieldOffset. Again, don't add if it's 0.
Daniel Dunbar00564992009-09-19 20:40:14 +0000806 if (varFieldOffset > 0) {
Devang Patel2c4ceb12009-11-21 02:48:08 +0000807 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
808 addUInt(Block, 0, dwarf::DW_FORM_udata, varFieldOffset);
Daniel Dunbar00564992009-09-19 20:40:14 +0000809 }
Caroline Ticedc8f6042009-08-31 21:19:37 +0000810
Daniel Dunbar00564992009-09-19 20:40:14 +0000811 // Now attach the location information to the DIE.
Devang Patel2c4ceb12009-11-21 02:48:08 +0000812 addBlock(Die, Attribute, 0, Block);
Caroline Ticedc8f6042009-08-31 21:19:37 +0000813}
814
Devang Patel2c4ceb12009-11-21 02:48:08 +0000815/// addAddress - Add an address attribute to a die based on the location
Bill Wendling0310d762009-05-15 09:23:25 +0000816/// provided.
Devang Patel2c4ceb12009-11-21 02:48:08 +0000817void DwarfDebug::addAddress(DIE *Die, unsigned Attribute,
Bill Wendling0310d762009-05-15 09:23:25 +0000818 const MachineLocation &Location) {
Chris Lattnerd38fee82010-04-05 00:13:49 +0000819 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
Bill Wendling0310d762009-05-15 09:23:25 +0000820 unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
Benjamin Kramer345ef342010-03-31 19:34:01 +0000821 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Devang Patelbe90c3a2010-09-22 21:10:38 +0000822
Devang Patelc8821042010-11-02 17:37:00 +0000823 if (RI->getFrameRegister(*Asm->MF) == Location.getReg()
Devang Patelbe90c3a2010-09-22 21:10:38 +0000824 && Location.getOffset()) {
825 // If variable offset is based in frame register then use fbreg.
826 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_fbreg);
827 addSInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
828 addBlock(Die, Attribute, 0, Block);
829 return;
830 }
Bill Wendling0310d762009-05-15 09:23:25 +0000831
832 if (Location.isReg()) {
833 if (Reg < 32) {
Devang Patel2c4ceb12009-11-21 02:48:08 +0000834 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
Bill Wendling0310d762009-05-15 09:23:25 +0000835 } else {
Devang Patel2c4ceb12009-11-21 02:48:08 +0000836 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
837 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
Bill Wendling0310d762009-05-15 09:23:25 +0000838 }
839 } else {
840 if (Reg < 32) {
Devang Patel2c4ceb12009-11-21 02:48:08 +0000841 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
Bill Wendling0310d762009-05-15 09:23:25 +0000842 } else {
Devang Patel2c4ceb12009-11-21 02:48:08 +0000843 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
844 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
Bill Wendling0310d762009-05-15 09:23:25 +0000845 }
846
Devang Patel2c4ceb12009-11-21 02:48:08 +0000847 addUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
Bill Wendling0310d762009-05-15 09:23:25 +0000848 }
849
Devang Patel2c4ceb12009-11-21 02:48:08 +0000850 addBlock(Die, Attribute, 0, Block);
Bill Wendling0310d762009-05-15 09:23:25 +0000851}
852
Devang Patela43098d2010-04-28 01:03:09 +0000853/// addRegisterAddress - Add register location entry in variable DIE.
Devang Patel522ad742010-11-12 23:20:42 +0000854bool DwarfDebug::addRegisterAddress(DIE *Die, const MachineOperand &MO) {
Devang Patela43098d2010-04-28 01:03:09 +0000855 assert (MO.isReg() && "Invalid machine operand!");
856 if (!MO.getReg())
857 return false;
858 MachineLocation Location;
859 Location.set(MO.getReg());
860 addAddress(Die, dwarf::DW_AT_location, Location);
Devang Patela43098d2010-04-28 01:03:09 +0000861 return true;
862}
863
864/// addConstantValue - Add constant value entry in variable DIE.
Devang Patel522ad742010-11-12 23:20:42 +0000865bool DwarfDebug::addConstantValue(DIE *Die, const MachineOperand &MO) {
Devang Patela43098d2010-04-28 01:03:09 +0000866 assert (MO.isImm() && "Invalid machine operand!");
867 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
868 unsigned Imm = MO.getImm();
869 addUInt(Block, 0, dwarf::DW_FORM_udata, Imm);
870 addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
Devang Patela43098d2010-04-28 01:03:09 +0000871 return true;
872}
873
874/// addConstantFPValue - Add constant value entry in variable DIE.
Devang Patel522ad742010-11-12 23:20:42 +0000875bool DwarfDebug::addConstantFPValue(DIE *Die, const MachineOperand &MO) {
Devang Patela43098d2010-04-28 01:03:09 +0000876 assert (MO.isFPImm() && "Invalid machine operand!");
877 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
878 APFloat FPImm = MO.getFPImm()->getValueAPF();
Jim Grosbach1e20b962010-07-21 21:21:52 +0000879
Devang Patela43098d2010-04-28 01:03:09 +0000880 // Get the raw data form of the floating point.
881 const APInt FltVal = FPImm.bitcastToAPInt();
882 const char *FltPtr = (const char*)FltVal.getRawData();
Jim Grosbach1e20b962010-07-21 21:21:52 +0000883
Devang Patela43098d2010-04-28 01:03:09 +0000884 int NumBytes = FltVal.getBitWidth() / 8; // 8 bits per byte.
885 bool LittleEndian = Asm->getTargetData().isLittleEndian();
886 int Incr = (LittleEndian ? 1 : -1);
887 int Start = (LittleEndian ? 0 : NumBytes - 1);
888 int Stop = (LittleEndian ? NumBytes : -1);
Jim Grosbach1e20b962010-07-21 21:21:52 +0000889
Devang Patela43098d2010-04-28 01:03:09 +0000890 // Output the constant to DWARF one byte at a time.
891 for (; Start != Stop; Start += Incr)
892 addUInt(Block, 0, dwarf::DW_FORM_data1,
893 (unsigned char)0xFF & FltPtr[Start]);
Jim Grosbach1e20b962010-07-21 21:21:52 +0000894
Devang Patela43098d2010-04-28 01:03:09 +0000895 addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
Jim Grosbach1e20b962010-07-21 21:21:52 +0000896 return true;
Devang Patela43098d2010-04-28 01:03:09 +0000897}
898
Devang Patel76a788c2011-01-06 21:39:25 +0000899/// addConstantValue - Add constant value entry in variable DIE.
900bool DwarfDebug::addConstantValue(DIE *Die, ConstantInt *CI,
901 bool Unsigned) {
902 if (CI->getBitWidth() <= 64) {
903 if (Unsigned)
904 addUInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_udata,
905 CI->getZExtValue());
906 else
907 addSInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata,
908 CI->getSExtValue());
909 return true;
910 }
911
912 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
913
914 // Get the raw data form of the large APInt.
915 const APInt Val = CI->getValue();
916 const char *Ptr = (const char*)Val.getRawData();
917
918 int NumBytes = Val.getBitWidth() / 8; // 8 bits per byte.
919 bool LittleEndian = Asm->getTargetData().isLittleEndian();
920 int Incr = (LittleEndian ? 1 : -1);
921 int Start = (LittleEndian ? 0 : NumBytes - 1);
922 int Stop = (LittleEndian ? NumBytes : -1);
923
924 // Output the constant to DWARF one byte at a time.
925 for (; Start != Stop; Start += Incr)
926 addUInt(Block, 0, dwarf::DW_FORM_data1,
927 (unsigned char)0xFF & Ptr[Start]);
928
929 addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
930 return true;
931}
Devang Patela43098d2010-04-28 01:03:09 +0000932
Devang Patelb4c2bc252011-04-05 21:08:24 +0000933/// addTemplateParams - Add template parameters in buffer.
934void DwarfDebug::addTemplateParams(DIE &Buffer, DIArray TParams) {
935 // Add template parameters.
936 for (unsigned i = 0, e = TParams.getNumElements(); i != e; ++i) {
937 DIDescriptor Element = TParams.getElement(i);
938 if (Element.isTemplateTypeParameter())
939 Buffer.addChild(getOrCreateTemplateTypeParameterDIE(
940 DITemplateTypeParameter(Element)));
941 else if (Element.isTemplateValueParameter())
942 Buffer.addChild(getOrCreateTemplateValueParameterDIE(
943 DITemplateValueParameter(Element)));
944 }
945
946}
Devang Patelc366f832009-12-10 19:14:49 +0000947/// addToContextOwner - Add Die into the list of its context owner's children.
948void DwarfDebug::addToContextOwner(DIE *Die, DIDescriptor Context) {
Devang Patel3c91b052010-03-08 20:52:55 +0000949 if (Context.isType()) {
Devang Patel2db49d72010-05-07 18:11:54 +0000950 DIE *ContextDIE = getOrCreateTypeDIE(DIType(Context));
Devang Patelc366f832009-12-10 19:14:49 +0000951 ContextDIE->addChild(Die);
Devang Patel6404e4e2009-12-15 19:16:48 +0000952 } else if (Context.isNameSpace()) {
Devang Patel2db49d72010-05-07 18:11:54 +0000953 DIE *ContextDIE = getOrCreateNameSpace(DINameSpace(Context));
Devang Patel6404e4e2009-12-15 19:16:48 +0000954 ContextDIE->addChild(Die);
Stuart Hastings215aa152010-06-11 20:08:44 +0000955 } else if (Context.isSubprogram()) {
Devang Patelee70fa72010-09-27 23:15:27 +0000956 DIE *ContextDIE = createSubprogramDIE(DISubprogram(Context));
Stuart Hastings215aa152010-06-11 20:08:44 +0000957 ContextDIE->addChild(Die);
Devang Patel163a9f72010-05-10 22:49:55 +0000958 } else if (DIE *ContextDIE = getCompileUnit(Context)->getDIE(Context))
Devang Patelc366f832009-12-10 19:14:49 +0000959 ContextDIE->addChild(Die);
Jim Grosbach1e20b962010-07-21 21:21:52 +0000960 else
Devang Patel163a9f72010-05-10 22:49:55 +0000961 getCompileUnit(Context)->addDie(Die);
Devang Patelc366f832009-12-10 19:14:49 +0000962}
963
Devang Patel16ced732009-12-10 18:05:33 +0000964/// getOrCreateTypeDIE - Find existing DIE or create new DIE for the
965/// given DIType.
966DIE *DwarfDebug::getOrCreateTypeDIE(DIType Ty) {
Devang Patel163a9f72010-05-10 22:49:55 +0000967 CompileUnit *TypeCU = getCompileUnit(Ty);
968 DIE *TyDIE = TypeCU->getDIE(Ty);
Devang Patel16ced732009-12-10 18:05:33 +0000969 if (TyDIE)
970 return TyDIE;
971
972 // Create new type.
973 TyDIE = new DIE(dwarf::DW_TAG_base_type);
Devang Patel163a9f72010-05-10 22:49:55 +0000974 TypeCU->insertDIE(Ty, TyDIE);
Devang Patel16ced732009-12-10 18:05:33 +0000975 if (Ty.isBasicType())
Devang Patel2db49d72010-05-07 18:11:54 +0000976 constructTypeDIE(*TyDIE, DIBasicType(Ty));
Devang Patel16ced732009-12-10 18:05:33 +0000977 else if (Ty.isCompositeType())
Devang Patel2db49d72010-05-07 18:11:54 +0000978 constructTypeDIE(*TyDIE, DICompositeType(Ty));
Devang Patel16ced732009-12-10 18:05:33 +0000979 else {
980 assert(Ty.isDerivedType() && "Unknown kind of DIType");
Devang Patel2db49d72010-05-07 18:11:54 +0000981 constructTypeDIE(*TyDIE, DIDerivedType(Ty));
Devang Patel16ced732009-12-10 18:05:33 +0000982 }
983
Devang Patelc366f832009-12-10 19:14:49 +0000984 addToContextOwner(TyDIE, Ty.getContext());
Devang Patel16ced732009-12-10 18:05:33 +0000985 return TyDIE;
986}
987
Devang Patel2c4ceb12009-11-21 02:48:08 +0000988/// addType - Add a new type attribute to the specified entity.
Devang Patel8a241142009-12-09 18:24:21 +0000989void DwarfDebug::addType(DIE *Entity, DIType Ty) {
Devang Patel9c004872010-05-07 21:45:47 +0000990 if (!Ty.Verify())
Bill Wendling0310d762009-05-15 09:23:25 +0000991 return;
992
993 // Check for pre-existence.
Devang Patel163a9f72010-05-10 22:49:55 +0000994 CompileUnit *TypeCU = getCompileUnit(Ty);
995 DIEEntry *Entry = TypeCU->getDIEEntry(Ty);
Bill Wendling0310d762009-05-15 09:23:25 +0000996 // If it exists then use the existing value.
Devang Patel2c4ceb12009-11-21 02:48:08 +0000997 if (Entry) {
998 Entity->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, Entry);
Bill Wendling0310d762009-05-15 09:23:25 +0000999 return;
1000 }
1001
Bill Wendling0310d762009-05-15 09:23:25 +00001002 // Construct type.
Devang Patel16ced732009-12-10 18:05:33 +00001003 DIE *Buffer = getOrCreateTypeDIE(Ty);
Bill Wendling0310d762009-05-15 09:23:25 +00001004
Jeffrey Yasskin5c213dc2010-03-12 17:45:06 +00001005 // Set up proxy.
1006 Entry = createDIEEntry(Buffer);
Devang Patel163a9f72010-05-10 22:49:55 +00001007 TypeCU->insertDIEEntry(Ty, Entry);
Jeffrey Yasskin5c213dc2010-03-12 17:45:06 +00001008
Devang Patel2c4ceb12009-11-21 02:48:08 +00001009 Entity->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, Entry);
Bill Wendling0310d762009-05-15 09:23:25 +00001010}
1011
Devang Patel2c4ceb12009-11-21 02:48:08 +00001012/// constructTypeDIE - Construct basic type die from DIBasicType.
Devang Patel8a241142009-12-09 18:24:21 +00001013void DwarfDebug::constructTypeDIE(DIE &Buffer, DIBasicType BTy) {
Bill Wendling0310d762009-05-15 09:23:25 +00001014 // Get core information.
Devang Patel65dbc902009-11-25 17:36:49 +00001015 StringRef Name = BTy.getName();
Bill Wendling0310d762009-05-15 09:23:25 +00001016 Buffer.setTag(dwarf::DW_TAG_base_type);
Devang Patel2c4ceb12009-11-21 02:48:08 +00001017 addUInt(&Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
Bill Wendling0310d762009-05-15 09:23:25 +00001018 BTy.getEncoding());
1019
1020 // Add name if not anonymous or intermediate type.
Devang Patel65dbc902009-11-25 17:36:49 +00001021 if (!Name.empty())
Devang Patel2c4ceb12009-11-21 02:48:08 +00001022 addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
Bill Wendling0310d762009-05-15 09:23:25 +00001023 uint64_t Size = BTy.getSizeInBits() >> 3;
Devang Patel2c4ceb12009-11-21 02:48:08 +00001024 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
Bill Wendling0310d762009-05-15 09:23:25 +00001025}
1026
Devang Patel2c4ceb12009-11-21 02:48:08 +00001027/// constructTypeDIE - Construct derived type die from DIDerivedType.
Devang Patel8a241142009-12-09 18:24:21 +00001028void DwarfDebug::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) {
Bill Wendling0310d762009-05-15 09:23:25 +00001029 // Get core information.
Devang Patel65dbc902009-11-25 17:36:49 +00001030 StringRef Name = DTy.getName();
Bill Wendling0310d762009-05-15 09:23:25 +00001031 uint64_t Size = DTy.getSizeInBits() >> 3;
1032 unsigned Tag = DTy.getTag();
1033
1034 // FIXME - Workaround for templates.
1035 if (Tag == dwarf::DW_TAG_inheritance) Tag = dwarf::DW_TAG_reference_type;
1036
1037 Buffer.setTag(Tag);
1038
1039 // Map to main type, void will not have a type.
1040 DIType FromTy = DTy.getTypeDerivedFrom();
Devang Patel8a241142009-12-09 18:24:21 +00001041 addType(&Buffer, FromTy);
Bill Wendling0310d762009-05-15 09:23:25 +00001042
1043 // Add name if not anonymous or intermediate type.
Devang Pateldeea5642009-11-30 23:56:56 +00001044 if (!Name.empty())
Devang Patel2c4ceb12009-11-21 02:48:08 +00001045 addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
Bill Wendling0310d762009-05-15 09:23:25 +00001046
1047 // Add size if non-zero (derived types might be zero-sized.)
1048 if (Size)
Devang Patel2c4ceb12009-11-21 02:48:08 +00001049 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
Bill Wendling0310d762009-05-15 09:23:25 +00001050
1051 // Add source line info if available and TyDesc is not a forward declaration.
Devang Patel05f6fa82009-11-23 18:43:37 +00001052 if (!DTy.isForwardDecl())
Devang Patel81625742010-08-09 20:20:05 +00001053 addSourceLine(&Buffer, DTy);
Bill Wendling0310d762009-05-15 09:23:25 +00001054}
1055
Devang Patel2c4ceb12009-11-21 02:48:08 +00001056/// constructTypeDIE - Construct type DIE from DICompositeType.
Devang Patel8a241142009-12-09 18:24:21 +00001057void DwarfDebug::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
Bill Wendling0310d762009-05-15 09:23:25 +00001058 // Get core information.
Devang Patel65dbc902009-11-25 17:36:49 +00001059 StringRef Name = CTy.getName();
Bill Wendling0310d762009-05-15 09:23:25 +00001060
1061 uint64_t Size = CTy.getSizeInBits() >> 3;
1062 unsigned Tag = CTy.getTag();
1063 Buffer.setTag(Tag);
1064
1065 switch (Tag) {
1066 case dwarf::DW_TAG_vector_type:
1067 case dwarf::DW_TAG_array_type:
Devang Patel8a241142009-12-09 18:24:21 +00001068 constructArrayTypeDIE(Buffer, &CTy);
Bill Wendling0310d762009-05-15 09:23:25 +00001069 break;
1070 case dwarf::DW_TAG_enumeration_type: {
1071 DIArray Elements = CTy.getTypeArray();
1072
1073 // Add enumerators to enumeration type.
1074 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1075 DIE *ElemDie = NULL;
Devang Patel2db49d72010-05-07 18:11:54 +00001076 DIDescriptor Enum(Elements.getElement(i));
Devang Patel3c91b052010-03-08 20:52:55 +00001077 if (Enum.isEnumerator()) {
Devang Patel2db49d72010-05-07 18:11:54 +00001078 ElemDie = constructEnumTypeDIE(DIEnumerator(Enum));
Devang Patel2c4ceb12009-11-21 02:48:08 +00001079 Buffer.addChild(ElemDie);
Devang Patelc5254722009-10-09 17:51:49 +00001080 }
Bill Wendling0310d762009-05-15 09:23:25 +00001081 }
1082 }
1083 break;
1084 case dwarf::DW_TAG_subroutine_type: {
1085 // Add return type.
1086 DIArray Elements = CTy.getTypeArray();
1087 DIDescriptor RTy = Elements.getElement(0);
Devang Patel2db49d72010-05-07 18:11:54 +00001088 addType(&Buffer, DIType(RTy));
Bill Wendling0310d762009-05-15 09:23:25 +00001089
Devang Pateld6747df2010-10-06 20:50:40 +00001090 bool isPrototyped = true;
Bill Wendling0310d762009-05-15 09:23:25 +00001091 // Add arguments.
1092 for (unsigned i = 1, N = Elements.getNumElements(); i < N; ++i) {
Bill Wendling0310d762009-05-15 09:23:25 +00001093 DIDescriptor Ty = Elements.getElement(i);
Devang Pateld6747df2010-10-06 20:50:40 +00001094 if (Ty.isUnspecifiedParameter()) {
1095 DIE *Arg = new DIE(dwarf::DW_TAG_unspecified_parameters);
1096 Buffer.addChild(Arg);
1097 isPrototyped = false;
1098 } else {
1099 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1100 addType(Arg, DIType(Ty));
1101 Buffer.addChild(Arg);
1102 }
Bill Wendling0310d762009-05-15 09:23:25 +00001103 }
Devang Pateld6747df2010-10-06 20:50:40 +00001104 // Add prototype flag.
1105 if (isPrototyped)
1106 addUInt(&Buffer, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
Bill Wendling0310d762009-05-15 09:23:25 +00001107 }
1108 break;
1109 case dwarf::DW_TAG_structure_type:
1110 case dwarf::DW_TAG_union_type:
1111 case dwarf::DW_TAG_class_type: {
1112 // Add elements to structure type.
1113 DIArray Elements = CTy.getTypeArray();
1114
1115 // A forward struct declared type may not have elements available.
Devang Patel3c91b052010-03-08 20:52:55 +00001116 unsigned N = Elements.getNumElements();
1117 if (N == 0)
Bill Wendling0310d762009-05-15 09:23:25 +00001118 break;
1119
1120 // Add elements to structure type.
Devang Patel3c91b052010-03-08 20:52:55 +00001121 for (unsigned i = 0; i < N; ++i) {
Bill Wendling0310d762009-05-15 09:23:25 +00001122 DIDescriptor Element = Elements.getElement(i);
1123 DIE *ElemDie = NULL;
Devang Patel1a301232010-09-29 21:44:16 +00001124 if (Element.isSubprogram()) {
1125 DISubprogram SP(Element);
Devang Patel2db49d72010-05-07 18:11:54 +00001126 ElemDie = createSubprogramDIE(DISubprogram(Element));
Devang Patel1a301232010-09-29 21:44:16 +00001127 if (SP.isProtected())
1128 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1129 dwarf::DW_ACCESS_protected);
1130 else if (SP.isPrivate())
1131 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1132 dwarf::DW_ACCESS_private);
1133 else
1134 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1135 dwarf::DW_ACCESS_public);
Devang Patel21ea1d52010-10-01 23:31:40 +00001136 if (SP.isExplicit())
1137 addUInt(ElemDie, dwarf::DW_AT_explicit, dwarf::DW_FORM_flag, 1);
Devang Patel1a301232010-09-29 21:44:16 +00001138 }
Devang Patel3c91b052010-03-08 20:52:55 +00001139 else if (Element.isVariable()) {
Devang Patel2db49d72010-05-07 18:11:54 +00001140 DIVariable DV(Element);
Devang Patel1ee0cb92010-01-30 01:08:30 +00001141 ElemDie = new DIE(dwarf::DW_TAG_variable);
1142 addString(ElemDie, dwarf::DW_AT_name, dwarf::DW_FORM_string,
1143 DV.getName());
1144 addType(ElemDie, DV.getType());
1145 addUInt(ElemDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1146 addUInt(ElemDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
Devang Patel81625742010-08-09 20:20:05 +00001147 addSourceLine(ElemDie, DV);
Devang Patel3c91b052010-03-08 20:52:55 +00001148 } else if (Element.isDerivedType())
Devang Patel2db49d72010-05-07 18:11:54 +00001149 ElemDie = createMemberDIE(DIDerivedType(Element));
Devang Patel3c91b052010-03-08 20:52:55 +00001150 else
1151 continue;
Devang Patel2c4ceb12009-11-21 02:48:08 +00001152 Buffer.addChild(ElemDie);
Bill Wendling0310d762009-05-15 09:23:25 +00001153 }
1154
Devang Patela1ba2692009-08-27 23:51:51 +00001155 if (CTy.isAppleBlockExtension())
Devang Patel2c4ceb12009-11-21 02:48:08 +00001156 addUInt(&Buffer, dwarf::DW_AT_APPLE_block, dwarf::DW_FORM_flag, 1);
Bill Wendling0310d762009-05-15 09:23:25 +00001157
1158 unsigned RLang = CTy.getRunTimeLang();
1159 if (RLang)
Devang Patel2c4ceb12009-11-21 02:48:08 +00001160 addUInt(&Buffer, dwarf::DW_AT_APPLE_runtime_class,
Bill Wendling0310d762009-05-15 09:23:25 +00001161 dwarf::DW_FORM_data1, RLang);
Devang Patelb5544992010-01-26 21:16:06 +00001162
1163 DICompositeType ContainingType = CTy.getContainingType();
Devang Patel2db49d72010-05-07 18:11:54 +00001164 if (DIDescriptor(ContainingType).isCompositeType())
Jim Grosbach1e20b962010-07-21 21:21:52 +00001165 addDIEEntry(&Buffer, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4,
Devang Patel2db49d72010-05-07 18:11:54 +00001166 getOrCreateTypeDIE(DIType(ContainingType)));
Stuart Hastings215aa152010-06-11 20:08:44 +00001167 else {
1168 DIDescriptor Context = CTy.getContext();
1169 addToContextOwner(&Buffer, Context);
1170 }
Devang Patel7e2cb112011-02-02 21:38:25 +00001171
Devang Patelb4c2bc252011-04-05 21:08:24 +00001172 if (Tag == dwarf::DW_TAG_class_type)
1173 addTemplateParams(Buffer, CTy.getTemplateParams());
1174
Bill Wendling0310d762009-05-15 09:23:25 +00001175 break;
1176 }
1177 default:
1178 break;
1179 }
1180
1181 // Add name if not anonymous or intermediate type.
Devang Patel65dbc902009-11-25 17:36:49 +00001182 if (!Name.empty())
Devang Patel2c4ceb12009-11-21 02:48:08 +00001183 addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
Bill Wendling0310d762009-05-15 09:23:25 +00001184
Jim Grosbach1e20b962010-07-21 21:21:52 +00001185 if (Tag == dwarf::DW_TAG_enumeration_type || Tag == dwarf::DW_TAG_class_type
Devang Patel61409622010-07-07 20:12:52 +00001186 || Tag == dwarf::DW_TAG_structure_type || Tag == dwarf::DW_TAG_union_type)
1187 {
Bill Wendling0310d762009-05-15 09:23:25 +00001188 // Add size if non-zero (derived types might be zero-sized.)
1189 if (Size)
Devang Patel2c4ceb12009-11-21 02:48:08 +00001190 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
Bill Wendling0310d762009-05-15 09:23:25 +00001191 else {
1192 // Add zero size if it is not a forward declaration.
1193 if (CTy.isForwardDecl())
Devang Patel2c4ceb12009-11-21 02:48:08 +00001194 addUInt(&Buffer, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
Bill Wendling0310d762009-05-15 09:23:25 +00001195 else
Devang Patel2c4ceb12009-11-21 02:48:08 +00001196 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, 0);
Bill Wendling0310d762009-05-15 09:23:25 +00001197 }
1198
1199 // Add source line info if available.
1200 if (!CTy.isForwardDecl())
Devang Patel81625742010-08-09 20:20:05 +00001201 addSourceLine(&Buffer, CTy);
Bill Wendling0310d762009-05-15 09:23:25 +00001202 }
1203}
1204
Devang Patel7e2cb112011-02-02 21:38:25 +00001205/// getOrCreateTemplateTypeParameterDIE - Find existing DIE or create new DIE
1206/// for the given DITemplateTypeParameter.
1207DIE *
1208DwarfDebug::getOrCreateTemplateTypeParameterDIE(DITemplateTypeParameter TP) {
1209 CompileUnit *TypeCU = getCompileUnit(TP);
1210 DIE *ParamDIE = TypeCU->getDIE(TP);
1211 if (ParamDIE)
1212 return ParamDIE;
1213
1214 ParamDIE = new DIE(dwarf::DW_TAG_template_type_parameter);
1215 addType(ParamDIE, TP.getType());
1216 addString(ParamDIE, dwarf::DW_AT_name, dwarf::DW_FORM_string, TP.getName());
1217 return ParamDIE;
1218}
1219
Devang Patele7d93872011-02-02 22:35:53 +00001220/// getOrCreateTemplateValueParameterDIE - Find existing DIE or create new DIE
1221/// for the given DITemplateValueParameter.
1222DIE *
1223DwarfDebug::getOrCreateTemplateValueParameterDIE(DITemplateValueParameter TPV) {
1224 CompileUnit *TVCU = getCompileUnit(TPV);
1225 DIE *ParamDIE = TVCU->getDIE(TPV);
1226 if (ParamDIE)
1227 return ParamDIE;
1228
1229 ParamDIE = new DIE(dwarf::DW_TAG_template_value_parameter);
1230 addType(ParamDIE, TPV.getType());
Devang Patele050f502011-04-05 20:14:13 +00001231 if (!TPV.getName().empty())
1232 addString(ParamDIE, dwarf::DW_AT_name, dwarf::DW_FORM_string, TPV.getName());
Devang Patele7d93872011-02-02 22:35:53 +00001233 addUInt(ParamDIE, dwarf::DW_AT_const_value, dwarf::DW_FORM_udata,
1234 TPV.getValue());
1235 return ParamDIE;
1236}
1237
Devang Patel2c4ceb12009-11-21 02:48:08 +00001238/// constructSubrangeDIE - Construct subrange DIE from DISubrange.
1239void DwarfDebug::constructSubrangeDIE(DIE &Buffer, DISubrange SR, DIE *IndexTy){
Bill Wendling0310d762009-05-15 09:23:25 +00001240 int64_t L = SR.getLo();
1241 int64_t H = SR.getHi();
1242 DIE *DW_Subrange = new DIE(dwarf::DW_TAG_subrange_type);
1243
Devang Patel2c4ceb12009-11-21 02:48:08 +00001244 addDIEEntry(DW_Subrange, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IndexTy);
Devang Patel6325a532009-08-14 20:59:16 +00001245 if (L)
Devang Patel2c4ceb12009-11-21 02:48:08 +00001246 addSInt(DW_Subrange, dwarf::DW_AT_lower_bound, 0, L);
Devang Pateld55224c2009-12-04 23:10:24 +00001247 addSInt(DW_Subrange, dwarf::DW_AT_upper_bound, 0, H);
Bill Wendling0310d762009-05-15 09:23:25 +00001248
Devang Patel2c4ceb12009-11-21 02:48:08 +00001249 Buffer.addChild(DW_Subrange);
Bill Wendling0310d762009-05-15 09:23:25 +00001250}
1251
Devang Patel2c4ceb12009-11-21 02:48:08 +00001252/// constructArrayTypeDIE - Construct array type DIE from DICompositeType.
Devang Patel8a241142009-12-09 18:24:21 +00001253void DwarfDebug::constructArrayTypeDIE(DIE &Buffer,
Bill Wendling0310d762009-05-15 09:23:25 +00001254 DICompositeType *CTy) {
1255 Buffer.setTag(dwarf::DW_TAG_array_type);
1256 if (CTy->getTag() == dwarf::DW_TAG_vector_type)
Devang Patel2c4ceb12009-11-21 02:48:08 +00001257 addUInt(&Buffer, dwarf::DW_AT_GNU_vector, dwarf::DW_FORM_flag, 1);
Bill Wendling0310d762009-05-15 09:23:25 +00001258
1259 // Emit derived type.
Devang Patel8a241142009-12-09 18:24:21 +00001260 addType(&Buffer, CTy->getTypeDerivedFrom());
Bill Wendling0310d762009-05-15 09:23:25 +00001261 DIArray Elements = CTy->getTypeArray();
1262
Devang Patel6f01d9c2009-11-21 00:31:03 +00001263 // Get an anonymous type for index type.
Devang Patel163a9f72010-05-10 22:49:55 +00001264 CompileUnit *TheCU = getCompileUnit(*CTy);
1265 DIE *IdxTy = TheCU->getIndexTyDie();
Devang Patel6f01d9c2009-11-21 00:31:03 +00001266 if (!IdxTy) {
1267 // Construct an anonymous type for index type.
1268 IdxTy = new DIE(dwarf::DW_TAG_base_type);
Devang Patel2c4ceb12009-11-21 02:48:08 +00001269 addUInt(IdxTy, dwarf::DW_AT_byte_size, 0, sizeof(int32_t));
1270 addUInt(IdxTy, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
Devang Patel6f01d9c2009-11-21 00:31:03 +00001271 dwarf::DW_ATE_signed);
Devang Patel163a9f72010-05-10 22:49:55 +00001272 TheCU->addDie(IdxTy);
1273 TheCU->setIndexTyDie(IdxTy);
Devang Patel6f01d9c2009-11-21 00:31:03 +00001274 }
Bill Wendling0310d762009-05-15 09:23:25 +00001275
1276 // Add subranges to array type.
1277 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1278 DIDescriptor Element = Elements.getElement(i);
1279 if (Element.getTag() == dwarf::DW_TAG_subrange_type)
Devang Patel2db49d72010-05-07 18:11:54 +00001280 constructSubrangeDIE(Buffer, DISubrange(Element), IdxTy);
Bill Wendling0310d762009-05-15 09:23:25 +00001281 }
1282}
1283
Devang Patel2c4ceb12009-11-21 02:48:08 +00001284/// constructEnumTypeDIE - Construct enum type DIE from DIEnumerator.
Devang Patel3c91b052010-03-08 20:52:55 +00001285DIE *DwarfDebug::constructEnumTypeDIE(DIEnumerator ETy) {
Bill Wendling0310d762009-05-15 09:23:25 +00001286 DIE *Enumerator = new DIE(dwarf::DW_TAG_enumerator);
Devang Patel3c91b052010-03-08 20:52:55 +00001287 StringRef Name = ETy.getName();
Devang Patel2c4ceb12009-11-21 02:48:08 +00001288 addString(Enumerator, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
Devang Patel3c91b052010-03-08 20:52:55 +00001289 int64_t Value = ETy.getEnumValue();
Devang Patel2c4ceb12009-11-21 02:48:08 +00001290 addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, Value);
Bill Wendling0310d762009-05-15 09:23:25 +00001291 return Enumerator;
1292}
1293
Jim Grosbach1e20b962010-07-21 21:21:52 +00001294/// getRealLinkageName - If special LLVM prefix that is used to inform the asm
Devang Patel351ca332010-01-05 01:46:14 +00001295/// printer to not emit usual symbol prefix before the symbol name is used then
1296/// return linkage name after skipping this special LLVM prefix.
1297static StringRef getRealLinkageName(StringRef LinkageName) {
1298 char One = '\1';
1299 if (LinkageName.startswith(StringRef(&One, 1)))
1300 return LinkageName.substr(1);
1301 return LinkageName;
1302}
1303
Devang Patel2c4ceb12009-11-21 02:48:08 +00001304/// createMemberDIE - Create new member DIE.
Devang Patelecbd8e82010-08-10 04:12:17 +00001305DIE *DwarfDebug::createMemberDIE(DIDerivedType DT) {
Bill Wendling0310d762009-05-15 09:23:25 +00001306 DIE *MemberDie = new DIE(DT.getTag());
Devang Patel65dbc902009-11-25 17:36:49 +00001307 StringRef Name = DT.getName();
1308 if (!Name.empty())
Devang Patel2c4ceb12009-11-21 02:48:08 +00001309 addString(MemberDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
Jim Grosbach1e20b962010-07-21 21:21:52 +00001310
Devang Patel8a241142009-12-09 18:24:21 +00001311 addType(MemberDie, DT.getTypeDerivedFrom());
Bill Wendling0310d762009-05-15 09:23:25 +00001312
Devang Patel81625742010-08-09 20:20:05 +00001313 addSourceLine(MemberDie, DT);
Bill Wendling0310d762009-05-15 09:23:25 +00001314
Benjamin Kramer345ef342010-03-31 19:34:01 +00001315 DIEBlock *MemLocationDie = new (DIEValueAllocator) DIEBlock();
Devang Patel2c4ceb12009-11-21 02:48:08 +00001316 addUInt(MemLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
Devang Patel33db5082009-11-04 22:06:12 +00001317
Bill Wendling0310d762009-05-15 09:23:25 +00001318 uint64_t Size = DT.getSizeInBits();
Devang Patel61ecbd12009-11-04 23:48:00 +00001319 uint64_t FieldSize = DT.getOriginalTypeSize();
Bill Wendling0310d762009-05-15 09:23:25 +00001320
1321 if (Size != FieldSize) {
1322 // Handle bitfield.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001323 addUInt(MemberDie, dwarf::DW_AT_byte_size, 0, DT.getOriginalTypeSize()>>3);
1324 addUInt(MemberDie, dwarf::DW_AT_bit_size, 0, DT.getSizeInBits());
Bill Wendling0310d762009-05-15 09:23:25 +00001325
1326 uint64_t Offset = DT.getOffsetInBits();
Bill Wendling0310d762009-05-15 09:23:25 +00001327 uint64_t AlignMask = ~(DT.getAlignInBits() - 1);
1328 uint64_t HiMark = (Offset + FieldSize) & AlignMask;
Benjamin Kramer3d594fd2010-01-07 17:50:57 +00001329 uint64_t FieldOffset = (HiMark - FieldSize);
Bill Wendling0310d762009-05-15 09:23:25 +00001330 Offset -= FieldOffset;
1331
1332 // Maybe we need to work from the other end.
Chris Lattnerd38fee82010-04-05 00:13:49 +00001333 if (Asm->getTargetData().isLittleEndian())
1334 Offset = FieldSize - (Offset + Size);
Devang Patel2c4ceb12009-11-21 02:48:08 +00001335 addUInt(MemberDie, dwarf::DW_AT_bit_offset, 0, Offset);
Bill Wendling0310d762009-05-15 09:23:25 +00001336
Devang Patel33db5082009-11-04 22:06:12 +00001337 // Here WD_AT_data_member_location points to the anonymous
1338 // field that includes this bit field.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001339 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, FieldOffset >> 3);
Devang Patel33db5082009-11-04 22:06:12 +00001340
1341 } else
1342 // This is not a bitfield.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001343 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits() >> 3);
Devang Patel33db5082009-11-04 22:06:12 +00001344
Devang Patelc1dc8ff2010-02-03 20:08:48 +00001345 if (DT.getTag() == dwarf::DW_TAG_inheritance
1346 && DT.isVirtual()) {
1347
1348 // For C++, virtual base classes are not at fixed offset. Use following
1349 // expression to extract appropriate offset from vtable.
1350 // BaseAddr = ObAddr + *((*ObAddr) - Offset)
1351
Benjamin Kramer345ef342010-03-31 19:34:01 +00001352 DIEBlock *VBaseLocationDie = new (DIEValueAllocator) DIEBlock();
Devang Patelc1dc8ff2010-02-03 20:08:48 +00001353 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_dup);
1354 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1355 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1356 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits());
1357 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_minus);
1358 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1359 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1360
Jim Grosbach1e20b962010-07-21 21:21:52 +00001361 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0,
Devang Patelc1dc8ff2010-02-03 20:08:48 +00001362 VBaseLocationDie);
1363 } else
1364 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, MemLocationDie);
Bill Wendling0310d762009-05-15 09:23:25 +00001365
1366 if (DT.isProtected())
Devang Patel5d11eb02009-12-03 19:11:07 +00001367 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
Bill Wendling0310d762009-05-15 09:23:25 +00001368 dwarf::DW_ACCESS_protected);
1369 else if (DT.isPrivate())
Devang Patel5d11eb02009-12-03 19:11:07 +00001370 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
Bill Wendling0310d762009-05-15 09:23:25 +00001371 dwarf::DW_ACCESS_private);
Devang Patel2a361602010-09-29 19:08:08 +00001372 // Otherwise C++ member and base classes are considered public.
1373 else if (DT.getCompileUnit().getLanguage() == dwarf::DW_LANG_C_plus_plus)
Devang Patel5d11eb02009-12-03 19:11:07 +00001374 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1375 dwarf::DW_ACCESS_public);
1376 if (DT.isVirtual())
1377 addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_flag,
1378 dwarf::DW_VIRTUALITY_virtual);
Bill Wendling0310d762009-05-15 09:23:25 +00001379 return MemberDie;
1380}
1381
Devang Patelffe966c2009-12-14 16:18:45 +00001382/// createSubprogramDIE - Create new DIE using SP.
Devang Patelee70fa72010-09-27 23:15:27 +00001383DIE *DwarfDebug::createSubprogramDIE(DISubprogram SP) {
Devang Patel163a9f72010-05-10 22:49:55 +00001384 CompileUnit *SPCU = getCompileUnit(SP);
1385 DIE *SPDie = SPCU->getDIE(SP);
Devang Patelffe966c2009-12-14 16:18:45 +00001386 if (SPDie)
1387 return SPDie;
1388
1389 SPDie = new DIE(dwarf::DW_TAG_subprogram);
Devang Patel1eac3e72010-03-02 17:58:15 +00001390 // Constructors and operators for anonymous aggregates do not have names.
Devang Patel6b506cb2010-03-02 01:26:20 +00001391 if (!SP.getName().empty())
1392 addString(SPDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, SP.getName());
Bill Wendling0310d762009-05-15 09:23:25 +00001393
Devang Patel65dbc902009-11-25 17:36:49 +00001394 StringRef LinkageName = SP.getLinkageName();
Devang Patel351ca332010-01-05 01:46:14 +00001395 if (!LinkageName.empty())
Devang Patel2c4ceb12009-11-21 02:48:08 +00001396 addString(SPDie, dwarf::DW_AT_MIPS_linkage_name, dwarf::DW_FORM_string,
Devang Patel351ca332010-01-05 01:46:14 +00001397 getRealLinkageName(LinkageName));
1398
Devang Patel81625742010-08-09 20:20:05 +00001399 addSourceLine(SPDie, SP);
Bill Wendling0310d762009-05-15 09:23:25 +00001400
Devang Patel7b172c62010-10-07 22:03:01 +00001401 if (SP.isPrototyped())
Devang Patel2c4ceb12009-11-21 02:48:08 +00001402 addUInt(SPDie, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
Bill Wendling0310d762009-05-15 09:23:25 +00001403
1404 // Add Return Type.
Devang Patel1d5cc1d2009-12-03 01:25:38 +00001405 DICompositeType SPTy = SP.getType();
1406 DIArray Args = SPTy.getTypeArray();
Bill Wendling0310d762009-05-15 09:23:25 +00001407 unsigned SPTag = SPTy.getTag();
Devang Patel5d11eb02009-12-03 19:11:07 +00001408
Devang Patel3c91b052010-03-08 20:52:55 +00001409 if (Args.getNumElements() == 0 || SPTag != dwarf::DW_TAG_subroutine_type)
Devang Patel8a241142009-12-09 18:24:21 +00001410 addType(SPDie, SPTy);
Devang Patel1d5cc1d2009-12-03 01:25:38 +00001411 else
Devang Patel2db49d72010-05-07 18:11:54 +00001412 addType(SPDie, DIType(Args.getElement(0)));
Devang Patel1d5cc1d2009-12-03 01:25:38 +00001413
Devang Patel5d11eb02009-12-03 19:11:07 +00001414 unsigned VK = SP.getVirtuality();
1415 if (VK) {
1416 addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_flag, VK);
Benjamin Kramer345ef342010-03-31 19:34:01 +00001417 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Devang Patel5d11eb02009-12-03 19:11:07 +00001418 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
Devang Pateld639c7c2010-12-09 00:10:40 +00001419 addUInt(Block, 0, dwarf::DW_FORM_udata, SP.getVirtualIndex());
Devang Patel5d11eb02009-12-03 19:11:07 +00001420 addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, 0, Block);
Jim Grosbach1e20b962010-07-21 21:21:52 +00001421 ContainingTypeMap.insert(std::make_pair(SPDie,
Devang Patel2db49d72010-05-07 18:11:54 +00001422 SP.getContainingType()));
Devang Patel5d11eb02009-12-03 19:11:07 +00001423 }
1424
Devang Patelee70fa72010-09-27 23:15:27 +00001425 if (!SP.isDefinition()) {
Devang Patel2c4ceb12009-11-21 02:48:08 +00001426 addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
Bill Wendling0310d762009-05-15 09:23:25 +00001427
1428 // Add arguments. Do not add arguments for subprogram definition. They will
Devang Patel1d5cc1d2009-12-03 01:25:38 +00001429 // be handled while processing variables.
1430 DICompositeType SPTy = SP.getType();
1431 DIArray Args = SPTy.getTypeArray();
1432 unsigned SPTag = SPTy.getTag();
1433
Bill Wendling0310d762009-05-15 09:23:25 +00001434 if (SPTag == dwarf::DW_TAG_subroutine_type)
1435 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
1436 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
Devang Patel2db49d72010-05-07 18:11:54 +00001437 DIType ATy = DIType(DIType(Args.getElement(i)));
Devang Patelb4645642010-02-06 01:02:37 +00001438 addType(Arg, ATy);
1439 if (ATy.isArtificial())
1440 addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
Devang Patel2c4ceb12009-11-21 02:48:08 +00001441 SPDie->addChild(Arg);
Bill Wendling0310d762009-05-15 09:23:25 +00001442 }
1443 }
1444
Devang Patel4e0d19d2010-02-03 19:57:19 +00001445 if (SP.isArtificial())
1446 addUInt(SPDie, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1447
Devang Patelccff8122010-04-30 19:38:23 +00001448 if (!SP.isLocalToUnit())
1449 addUInt(SPDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
Jim Grosbach1e20b962010-07-21 21:21:52 +00001450
Devang Patelccff8122010-04-30 19:38:23 +00001451 if (SP.isOptimized())
1452 addUInt(SPDie, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1);
1453
Jim Grosbach91729002010-07-21 23:03:52 +00001454 if (unsigned isa = Asm->getISAEncoding()) {
1455 addUInt(SPDie, dwarf::DW_AT_APPLE_isa, dwarf::DW_FORM_flag, isa);
1456 }
1457
Devang Patelda194752011-04-05 22:52:06 +00001458 // Add function template parameters.
1459 addTemplateParams(*SPDie, SP.getTemplateParams());
1460
Devang Patelccff8122010-04-30 19:38:23 +00001461 // DW_TAG_inlined_subroutine may refer to this DIE.
Devang Patel163a9f72010-05-10 22:49:55 +00001462 SPCU->insertDIE(SP, SPDie);
Devang Patelccff8122010-04-30 19:38:23 +00001463
Stuart Hastings215aa152010-06-11 20:08:44 +00001464 // Add to context owner.
1465 addToContextOwner(SPDie, SP.getContext());
1466
Bill Wendling0310d762009-05-15 09:23:25 +00001467 return SPDie;
1468}
1469
Devang Patele9f8f5e2010-05-07 20:54:48 +00001470DbgScope *DwarfDebug::getOrCreateAbstractScope(const MDNode *N) {
Chris Lattnered7a77b2010-03-31 05:36:29 +00001471 assert(N && "Invalid Scope encoding!");
Devang Patel53bb5c92009-11-10 23:06:00 +00001472
1473 DbgScope *AScope = AbstractScopes.lookup(N);
1474 if (AScope)
1475 return AScope;
Jim Grosbach31ef40e2009-11-21 23:12:12 +00001476
Devang Patel53bb5c92009-11-10 23:06:00 +00001477 DbgScope *Parent = NULL;
1478
1479 DIDescriptor Scope(N);
1480 if (Scope.isLexicalBlock()) {
1481 DILexicalBlock DB(N);
1482 DIDescriptor ParentDesc = DB.getContext();
Devang Patel2db49d72010-05-07 18:11:54 +00001483 Parent = getOrCreateAbstractScope(ParentDesc);
Devang Patel53bb5c92009-11-10 23:06:00 +00001484 }
1485
1486 AScope = new DbgScope(Parent, DIDescriptor(N), NULL);
1487
1488 if (Parent)
Devang Patel2c4ceb12009-11-21 02:48:08 +00001489 Parent->addScope(AScope);
Devang Patel53bb5c92009-11-10 23:06:00 +00001490 AScope->setAbstractScope();
1491 AbstractScopes[N] = AScope;
1492 if (DIDescriptor(N).isSubprogram())
1493 AbstractScopesList.push_back(AScope);
1494 return AScope;
1495}
Devang Patelaf9e8472009-10-01 20:31:14 +00001496
Devang Patel5f094002010-04-06 23:53:48 +00001497/// isSubprogramContext - Return true if Context is either a subprogram
1498/// or another context nested inside a subprogram.
Devang Patele9f8f5e2010-05-07 20:54:48 +00001499static bool isSubprogramContext(const MDNode *Context) {
Devang Patel5f094002010-04-06 23:53:48 +00001500 if (!Context)
1501 return false;
1502 DIDescriptor D(Context);
1503 if (D.isSubprogram())
1504 return true;
1505 if (D.isType())
Devang Patel2db49d72010-05-07 18:11:54 +00001506 return isSubprogramContext(DIType(Context).getContext());
Devang Patel5f094002010-04-06 23:53:48 +00001507 return false;
1508}
1509
Jim Grosbach31ef40e2009-11-21 23:12:12 +00001510/// updateSubprogramScopeDIE - Find DIE for the given subprogram and
Devang Patel2c4ceb12009-11-21 02:48:08 +00001511/// attach appropriate DW_AT_low_pc and DW_AT_high_pc attributes.
1512/// If there are global variables in this scope then create and insert
1513/// DIEs for these variables.
Devang Patele9f8f5e2010-05-07 20:54:48 +00001514DIE *DwarfDebug::updateSubprogramScopeDIE(const MDNode *SPNode) {
Devang Patel163a9f72010-05-10 22:49:55 +00001515 CompileUnit *SPCU = getCompileUnit(SPNode);
1516 DIE *SPDie = SPCU->getDIE(SPNode);
Devang Patel8aa61472010-07-07 22:20:57 +00001517
Chris Lattnerd38fee82010-04-05 00:13:49 +00001518 assert(SPDie && "Unable to find subprogram DIE!");
1519 DISubprogram SP(SPNode);
Jim Grosbach1e20b962010-07-21 21:21:52 +00001520
Chris Lattnerd38fee82010-04-05 00:13:49 +00001521 // There is not any need to generate specification DIE for a function
1522 // defined at compile unit level. If a function is defined inside another
1523 // function then gdb prefers the definition at top level and but does not
Jim Grosbach1e20b962010-07-21 21:21:52 +00001524 // expect specification DIE in parent function. So avoid creating
Chris Lattnerd38fee82010-04-05 00:13:49 +00001525 // specification DIE for a function defined inside a function.
1526 if (SP.isDefinition() && !SP.getContext().isCompileUnit() &&
Jim Grosbach1e20b962010-07-21 21:21:52 +00001527 !SP.getContext().isFile() &&
Devang Patel2db49d72010-05-07 18:11:54 +00001528 !isSubprogramContext(SP.getContext())) {
Chris Lattnerd38fee82010-04-05 00:13:49 +00001529 addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
Jim Grosbach1e20b962010-07-21 21:21:52 +00001530
1531 // Add arguments.
Chris Lattnerd38fee82010-04-05 00:13:49 +00001532 DICompositeType SPTy = SP.getType();
1533 DIArray Args = SPTy.getTypeArray();
1534 unsigned SPTag = SPTy.getTag();
1535 if (SPTag == dwarf::DW_TAG_subroutine_type)
1536 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
1537 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
Devang Patel2db49d72010-05-07 18:11:54 +00001538 DIType ATy = DIType(DIType(Args.getElement(i)));
Chris Lattnerd38fee82010-04-05 00:13:49 +00001539 addType(Arg, ATy);
1540 if (ATy.isArtificial())
1541 addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1542 SPDie->addChild(Arg);
1543 }
1544 DIE *SPDeclDie = SPDie;
1545 SPDie = new DIE(dwarf::DW_TAG_subprogram);
Jim Grosbach1e20b962010-07-21 21:21:52 +00001546 addDIEEntry(SPDie, dwarf::DW_AT_specification, dwarf::DW_FORM_ref4,
Chris Lattnerd38fee82010-04-05 00:13:49 +00001547 SPDeclDie);
Devang Patel163a9f72010-05-10 22:49:55 +00001548 SPCU->addDie(SPDie);
Chris Lattnerd38fee82010-04-05 00:13:49 +00001549 }
Jim Grosbach1e20b962010-07-21 21:21:52 +00001550
Devang Patel8aa61472010-07-07 22:20:57 +00001551 // Pick up abstract subprogram DIE.
1552 if (DIE *AbsSPDIE = AbstractSPDies.lookup(SPNode)) {
1553 SPDie = new DIE(dwarf::DW_TAG_subprogram);
1554 addDIEEntry(SPDie, dwarf::DW_AT_abstract_origin,
1555 dwarf::DW_FORM_ref4, AbsSPDIE);
1556 SPCU->addDie(SPDie);
1557 }
1558
Chris Lattnerd38fee82010-04-05 00:13:49 +00001559 addLabel(SPDie, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
1560 Asm->GetTempSymbol("func_begin", Asm->getFunctionNumber()));
1561 addLabel(SPDie, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
1562 Asm->GetTempSymbol("func_end", Asm->getFunctionNumber()));
1563 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
1564 MachineLocation Location(RI->getFrameRegister(*Asm->MF));
1565 addAddress(SPDie, dwarf::DW_AT_frame_base, Location);
Devang Patelb4645642010-02-06 01:02:37 +00001566
Chris Lattnerd38fee82010-04-05 00:13:49 +00001567 return SPDie;
Devang Patel53bb5c92009-11-10 23:06:00 +00001568}
1569
Jim Grosbach31ef40e2009-11-21 23:12:12 +00001570/// constructLexicalScope - Construct new DW_TAG_lexical_block
Devang Patel2c4ceb12009-11-21 02:48:08 +00001571/// for this scope and attach DW_AT_low_pc/DW_AT_high_pc labels.
1572DIE *DwarfDebug::constructLexicalScopeDIE(DbgScope *Scope) {
Devang Pateleac9c072010-04-27 19:46:33 +00001573
1574 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_lexical_block);
1575 if (Scope->isAbstractScope())
1576 return ScopeDIE;
1577
1578 const SmallVector<DbgRange, 4> &Ranges = Scope->getRanges();
1579 if (Ranges.empty())
1580 return 0;
1581
1582 SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin();
1583 if (Ranges.size() > 1) {
1584 // .debug_range section has not been laid out yet. Emit offset in
Jim Grosbach1e20b962010-07-21 21:21:52 +00001585 // .debug_range as a uint, size 4, for now. emitDIE will handle
Devang Pateleac9c072010-04-27 19:46:33 +00001586 // DW_AT_ranges appropriately.
1587 addUInt(ScopeDIE, dwarf::DW_AT_ranges, dwarf::DW_FORM_data4,
1588 DebugRangeSymbols.size() * Asm->getTargetData().getPointerSize());
1589 for (SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin(),
1590 RE = Ranges.end(); RI != RE; ++RI) {
Devang Patelc3f5f782010-05-25 23:40:22 +00001591 DebugRangeSymbols.push_back(getLabelBeforeInsn(RI->first));
1592 DebugRangeSymbols.push_back(getLabelAfterInsn(RI->second));
Devang Pateleac9c072010-04-27 19:46:33 +00001593 }
1594 DebugRangeSymbols.push_back(NULL);
1595 DebugRangeSymbols.push_back(NULL);
1596 return ScopeDIE;
1597 }
1598
Devang Patelc3f5f782010-05-25 23:40:22 +00001599 const MCSymbol *Start = getLabelBeforeInsn(RI->first);
1600 const MCSymbol *End = getLabelAfterInsn(RI->second);
Devang Pateleac9c072010-04-27 19:46:33 +00001601
Devang Patelc3f5f782010-05-25 23:40:22 +00001602 if (End == 0) return 0;
Devang Patel53bb5c92009-11-10 23:06:00 +00001603
Chris Lattnerb7db7332010-03-09 01:58:53 +00001604 assert(Start->isDefined() && "Invalid starting label for an inlined scope!");
1605 assert(End->isDefined() && "Invalid end label for an inlined scope!");
Jim Grosbach1e20b962010-07-21 21:21:52 +00001606
Devang Pateleac9c072010-04-27 19:46:33 +00001607 addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, Start);
1608 addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr, End);
Devang Patel53bb5c92009-11-10 23:06:00 +00001609
1610 return ScopeDIE;
1611}
1612
Devang Patel2c4ceb12009-11-21 02:48:08 +00001613/// constructInlinedScopeDIE - This scope represents inlined body of
1614/// a function. Construct DIE to represent this concrete inlined copy
1615/// of the function.
1616DIE *DwarfDebug::constructInlinedScopeDIE(DbgScope *Scope) {
Devang Pateleac9c072010-04-27 19:46:33 +00001617
1618 const SmallVector<DbgRange, 4> &Ranges = Scope->getRanges();
Jim Grosbach1e20b962010-07-21 21:21:52 +00001619 assert (Ranges.empty() == false
Devang Pateleac9c072010-04-27 19:46:33 +00001620 && "DbgScope does not have instruction markers!");
1621
1622 // FIXME : .debug_inlined section specification does not clearly state how
1623 // to emit inlined scope that is split into multiple instruction ranges.
1624 // For now, use first instruction range and emit low_pc/high_pc pair and
1625 // corresponding .debug_inlined section entry for this pair.
1626 SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin();
Devang Patelc3f5f782010-05-25 23:40:22 +00001627 const MCSymbol *StartLabel = getLabelBeforeInsn(RI->first);
1628 const MCSymbol *EndLabel = getLabelAfterInsn(RI->second);
Devang Pateleac9c072010-04-27 19:46:33 +00001629
Devang Patel0afbf232010-07-08 22:39:20 +00001630 if (StartLabel == 0 || EndLabel == 0) {
Devang Pateleac9c072010-04-27 19:46:33 +00001631 assert (0 && "Unexpected Start and End labels for a inlined scope!");
1632 return 0;
1633 }
Chris Lattnerb7db7332010-03-09 01:58:53 +00001634 assert(StartLabel->isDefined() &&
Chris Lattnera34ec2292010-03-09 01:51:43 +00001635 "Invalid starting label for an inlined scope!");
Chris Lattnerb7db7332010-03-09 01:58:53 +00001636 assert(EndLabel->isDefined() &&
Chris Lattnera34ec2292010-03-09 01:51:43 +00001637 "Invalid end label for an inlined scope!");
Devang Pateleac9c072010-04-27 19:46:33 +00001638
Devang Patel3c91b052010-03-08 20:52:55 +00001639 if (!Scope->getScopeNode())
Devang Patel0ef3fa62010-03-08 19:20:38 +00001640 return NULL;
Devang Patel3c91b052010-03-08 20:52:55 +00001641 DIScope DS(Scope->getScopeNode());
Devang Patel53bb5c92009-11-10 23:06:00 +00001642 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_inlined_subroutine);
1643
Devang Patel2db49d72010-05-07 18:11:54 +00001644 DISubprogram InlinedSP = getDISubprogram(DS);
Devang Patel163a9f72010-05-10 22:49:55 +00001645 CompileUnit *TheCU = getCompileUnit(InlinedSP);
1646 DIE *OriginDIE = TheCU->getDIE(InlinedSP);
Chris Lattnered7a77b2010-03-31 05:36:29 +00001647 assert(OriginDIE && "Unable to find Origin DIE!");
Devang Patel2c4ceb12009-11-21 02:48:08 +00001648 addDIEEntry(ScopeDIE, dwarf::DW_AT_abstract_origin,
Devang Patel53bb5c92009-11-10 23:06:00 +00001649 dwarf::DW_FORM_ref4, OriginDIE);
1650
Chris Lattner6ed0f902010-03-09 00:31:02 +00001651 addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, StartLabel);
Chris Lattnerb7db7332010-03-09 01:58:53 +00001652 addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr, EndLabel);
Devang Patel53bb5c92009-11-10 23:06:00 +00001653
1654 InlinedSubprogramDIEs.insert(OriginDIE);
1655
1656 // Track the start label for this inlined function.
Devang Patele9f8f5e2010-05-07 20:54:48 +00001657 DenseMap<const MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator
Devang Patel2db49d72010-05-07 18:11:54 +00001658 I = InlineInfo.find(InlinedSP);
Devang Patel53bb5c92009-11-10 23:06:00 +00001659
1660 if (I == InlineInfo.end()) {
Devang Patel2db49d72010-05-07 18:11:54 +00001661 InlineInfo[InlinedSP].push_back(std::make_pair(StartLabel,
Jim Grosbach7ab38df2009-11-22 19:20:36 +00001662 ScopeDIE));
Devang Patel2db49d72010-05-07 18:11:54 +00001663 InlinedSPNodes.push_back(InlinedSP);
Devang Patel53bb5c92009-11-10 23:06:00 +00001664 } else
Chris Lattner6ed0f902010-03-09 00:31:02 +00001665 I->second.push_back(std::make_pair(StartLabel, ScopeDIE));
Devang Patel53bb5c92009-11-10 23:06:00 +00001666
Devang Patel53bb5c92009-11-10 23:06:00 +00001667 DILocation DL(Scope->getInlinedAt());
Devang Patel163a9f72010-05-10 22:49:55 +00001668 addUInt(ScopeDIE, dwarf::DW_AT_call_file, 0, TheCU->getID());
Devang Patel2c4ceb12009-11-21 02:48:08 +00001669 addUInt(ScopeDIE, dwarf::DW_AT_call_line, 0, DL.getLineNumber());
Devang Patel53bb5c92009-11-10 23:06:00 +00001670
1671 return ScopeDIE;
1672}
1673
Devang Patel2c4ceb12009-11-21 02:48:08 +00001674
1675/// constructVariableDIE - Construct a DIE for the given DbgVariable.
Devang Patel8a241142009-12-09 18:24:21 +00001676DIE *DwarfDebug::constructVariableDIE(DbgVariable *DV, DbgScope *Scope) {
Devang Patel8bd11de2010-08-09 21:01:39 +00001677 StringRef Name = DV->getName();
Devang Patel65dbc902009-11-25 17:36:49 +00001678 if (Name.empty())
Devang Patel3fb6bd62009-11-13 02:25:26 +00001679 return NULL;
Devang Patel53bb5c92009-11-10 23:06:00 +00001680
1681 // Translate tag to proper Dwarf tag. The result variable is dropped for
1682 // now.
1683 unsigned Tag;
Devang Patel8bd11de2010-08-09 21:01:39 +00001684 switch (DV->getTag()) {
Devang Patel53bb5c92009-11-10 23:06:00 +00001685 case dwarf::DW_TAG_return_variable:
1686 return NULL;
1687 case dwarf::DW_TAG_arg_variable:
1688 Tag = dwarf::DW_TAG_formal_parameter;
1689 break;
1690 case dwarf::DW_TAG_auto_variable: // fall thru
1691 default:
1692 Tag = dwarf::DW_TAG_variable;
1693 break;
1694 }
1695
1696 // Define variable debug information entry.
1697 DIE *VariableDie = new DIE(Tag);
1698
Devang Patel53bb5c92009-11-10 23:06:00 +00001699 DIE *AbsDIE = NULL;
Devang Patel26c1e562010-05-20 16:36:41 +00001700 DenseMap<const DbgVariable *, const DbgVariable *>::iterator
1701 V2AVI = VarToAbstractVarMap.find(DV);
1702 if (V2AVI != VarToAbstractVarMap.end())
1703 AbsDIE = V2AVI->second->getDIE();
Jim Grosbach31ef40e2009-11-21 23:12:12 +00001704
Devang Patel26c1e562010-05-20 16:36:41 +00001705 if (AbsDIE)
Devang Patel2c4ceb12009-11-21 02:48:08 +00001706 addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin,
Devang Patel53bb5c92009-11-10 23:06:00 +00001707 dwarf::DW_FORM_ref4, AbsDIE);
Devang Patel53bb5c92009-11-10 23:06:00 +00001708 else {
Devang Patel2c4ceb12009-11-21 02:48:08 +00001709 addString(VariableDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
Devang Patel8bd11de2010-08-09 21:01:39 +00001710 addSourceLine(VariableDie, DV->getVariable());
Devang Patel53bb5c92009-11-10 23:06:00 +00001711
1712 // Add variable type.
Devang Patel8bd11de2010-08-09 21:01:39 +00001713 addType(VariableDie, DV->getType());
Devang Patel53bb5c92009-11-10 23:06:00 +00001714 }
1715
Devang Patel8bd11de2010-08-09 21:01:39 +00001716 if (Tag == dwarf::DW_TAG_formal_parameter && DV->getType().isArtificial())
Devang Patelb4645642010-02-06 01:02:37 +00001717 addUInt(VariableDie, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
Devang Patel3cf763d2010-09-29 23:07:21 +00001718 else if (DIVariable(DV->getVariable()).isArtificial())
1719 addUInt(VariableDie, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
Devang Patelc3f5f782010-05-25 23:40:22 +00001720
1721 if (Scope->isAbstractScope()) {
1722 DV->setDIE(VariableDie);
1723 return VariableDie;
1724 }
1725
1726 // Add variable address.
1727
1728 unsigned Offset = DV->getDotDebugLocOffset();
1729 if (Offset != ~0U) {
1730 addLabel(VariableDie, dwarf::DW_AT_location, dwarf::DW_FORM_data4,
1731 Asm->GetTempSymbol("debug_loc", Offset));
1732 DV->setDIE(VariableDie);
1733 UseDotDebugLocEntry.insert(VariableDie);
1734 return VariableDie;
1735 }
1736
1737 // Check if variable is described by a DBG_VALUE instruction.
1738 DenseMap<const DbgVariable *, const MachineInstr *>::iterator DVI =
1739 DbgVariableToDbgInstMap.find(DV);
1740 if (DVI != DbgVariableToDbgInstMap.end()) {
1741 const MachineInstr *DVInsn = DVI->second;
Devang Patelc3f5f782010-05-25 23:40:22 +00001742 bool updated = false;
Jim Grosbach1e20b962010-07-21 21:21:52 +00001743 // FIXME : Handle getNumOperands != 3
Devang Patelc3f5f782010-05-25 23:40:22 +00001744 if (DVInsn->getNumOperands() == 3) {
Devang Patel0b48ead2010-08-31 22:22:42 +00001745 if (DVInsn->getOperand(0).isReg()) {
1746 const MachineOperand RegOp = DVInsn->getOperand(0);
1747 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
1748 if (DVInsn->getOperand(1).isImm() &&
1749 TRI->getFrameRegister(*Asm->MF) == RegOp.getReg()) {
1750 addVariableAddress(DV, VariableDie, DVInsn->getOperand(1).getImm());
1751 updated = true;
1752 } else
Devang Patel522ad742010-11-12 23:20:42 +00001753 updated = addRegisterAddress(VariableDie, RegOp);
Devang Patel0b48ead2010-08-31 22:22:42 +00001754 }
Devang Patelc3f5f782010-05-25 23:40:22 +00001755 else if (DVInsn->getOperand(0).isImm())
Devang Patel522ad742010-11-12 23:20:42 +00001756 updated = addConstantValue(VariableDie, DVInsn->getOperand(0));
Jim Grosbach1e20b962010-07-21 21:21:52 +00001757 else if (DVInsn->getOperand(0).isFPImm())
1758 updated =
Devang Patel522ad742010-11-12 23:20:42 +00001759 addConstantFPValue(VariableDie, DVInsn->getOperand(0));
Devang Patelc3f5f782010-05-25 23:40:22 +00001760 } else {
1761 MachineLocation Location = Asm->getDebugValueLocation(DVInsn);
1762 if (Location.getReg()) {
1763 addAddress(VariableDie, dwarf::DW_AT_location, Location);
Devang Patelc3f5f782010-05-25 23:40:22 +00001764 updated = true;
1765 }
1766 }
1767 if (!updated) {
1768 // If variableDie is not updated then DBG_VALUE instruction does not
1769 // have valid variable info.
1770 delete VariableDie;
1771 return NULL;
1772 }
1773 DV->setDIE(VariableDie);
1774 return VariableDie;
Jim Grosbach1e20b962010-07-21 21:21:52 +00001775 }
Devang Patelc3f5f782010-05-25 23:40:22 +00001776
1777 // .. else use frame index, if available.
Devang Patelc3f5f782010-05-25 23:40:22 +00001778 int FI = 0;
Devang Patel9e3bd2c2010-08-31 06:11:28 +00001779 if (findVariableFrameIndex(DV, &FI))
1780 addVariableAddress(DV, VariableDie, FI);
1781
Devang Patel53bb5c92009-11-10 23:06:00 +00001782 DV->setDIE(VariableDie);
1783 return VariableDie;
1784
1785}
Devang Patel2c4ceb12009-11-21 02:48:08 +00001786
Devang Patel193f7202009-11-24 01:14:22 +00001787void DwarfDebug::addPubTypes(DISubprogram SP) {
1788 DICompositeType SPTy = SP.getType();
1789 unsigned SPTag = SPTy.getTag();
Jim Grosbach1e20b962010-07-21 21:21:52 +00001790 if (SPTag != dwarf::DW_TAG_subroutine_type)
Devang Patel193f7202009-11-24 01:14:22 +00001791 return;
1792
1793 DIArray Args = SPTy.getTypeArray();
Devang Patel193f7202009-11-24 01:14:22 +00001794 for (unsigned i = 0, e = Args.getNumElements(); i != e; ++i) {
Devang Patel2db49d72010-05-07 18:11:54 +00001795 DIType ATy(Args.getElement(i));
Devang Patel9c004872010-05-07 21:45:47 +00001796 if (!ATy.Verify())
Devang Patel193f7202009-11-24 01:14:22 +00001797 continue;
1798 DICompositeType CATy = getDICompositeType(ATy);
Devang Patel2db49d72010-05-07 18:11:54 +00001799 if (DIDescriptor(CATy).Verify() && !CATy.getName().empty()
Devang Patel50d80e32010-04-13 20:35:04 +00001800 && !CATy.isForwardDecl()) {
Devang Patel163a9f72010-05-10 22:49:55 +00001801 CompileUnit *TheCU = getCompileUnit(CATy);
1802 if (DIEEntry *Entry = TheCU->getDIEEntry(CATy))
1803 TheCU->addGlobalType(CATy.getName(), Entry->getEntry());
Devang Patel193f7202009-11-24 01:14:22 +00001804 }
1805 }
1806}
1807
Devang Patel2c4ceb12009-11-21 02:48:08 +00001808/// constructScopeDIE - Construct a DIE for this scope.
1809DIE *DwarfDebug::constructScopeDIE(DbgScope *Scope) {
Devang Patel3c91b052010-03-08 20:52:55 +00001810 if (!Scope || !Scope->getScopeNode())
1811 return NULL;
Jim Grosbach1e20b962010-07-21 21:21:52 +00001812
Devang Patel5bc9fec2011-02-19 01:31:27 +00001813 SmallVector <DIE *, 8> Children;
Devang Patel0478c152011-03-01 22:58:55 +00001814
1815 // Collect arguments for current function.
1816 if (Scope == CurrentFnDbgScope)
1817 for (unsigned i = 0, N = CurrentFnArguments.size(); i < N; ++i)
1818 if (DbgVariable *ArgDV = CurrentFnArguments[i])
1819 if (DIE *Arg = constructVariableDIE(ArgDV, Scope))
1820 Children.push_back(Arg);
1821
Devang Patel5bc9fec2011-02-19 01:31:27 +00001822 // Collect lexical scope childrens first.
1823 const SmallVector<DbgVariable *, 8> &Variables = Scope->getDbgVariables();
1824 for (unsigned i = 0, N = Variables.size(); i < N; ++i)
1825 if (DIE *Variable = constructVariableDIE(Variables[i], Scope))
1826 Children.push_back(Variable);
1827 const SmallVector<DbgScope *, 4> &Scopes = Scope->getScopes();
1828 for (unsigned j = 0, M = Scopes.size(); j < M; ++j)
1829 if (DIE *Nested = constructScopeDIE(Scopes[j]))
1830 Children.push_back(Nested);
Devang Patel3c91b052010-03-08 20:52:55 +00001831 DIScope DS(Scope->getScopeNode());
1832 DIE *ScopeDIE = NULL;
1833 if (Scope->getInlinedAt())
1834 ScopeDIE = constructInlinedScopeDIE(Scope);
1835 else if (DS.isSubprogram()) {
Devang Patel0dd45582010-06-28 20:53:04 +00001836 ProcessedSPNodes.insert(DS);
Devang Patel8aa61472010-07-07 22:20:57 +00001837 if (Scope->isAbstractScope()) {
Devang Patel163a9f72010-05-10 22:49:55 +00001838 ScopeDIE = getCompileUnit(DS)->getDIE(DS);
Devang Patel8aa61472010-07-07 22:20:57 +00001839 // Note down abstract DIE.
1840 if (ScopeDIE)
1841 AbstractSPDies.insert(std::make_pair(DS, ScopeDIE));
1842 }
Devang Patel3c91b052010-03-08 20:52:55 +00001843 else
Devang Patel2db49d72010-05-07 18:11:54 +00001844 ScopeDIE = updateSubprogramScopeDIE(DS);
Devang Patel3c91b052010-03-08 20:52:55 +00001845 }
Devang Patel5bc9fec2011-02-19 01:31:27 +00001846 else {
1847 // There is no need to emit empty lexical block DIE.
1848 if (Children.empty())
1849 return NULL;
Devang Patel3c91b052010-03-08 20:52:55 +00001850 ScopeDIE = constructLexicalScopeDIE(Scope);
Devang Patel5bc9fec2011-02-19 01:31:27 +00001851 }
1852
Devang Patelaead63c2010-03-29 22:59:58 +00001853 if (!ScopeDIE) return NULL;
Jim Grosbach1e20b962010-07-21 21:21:52 +00001854
Devang Patel5bc9fec2011-02-19 01:31:27 +00001855 // Add children
1856 for (SmallVector<DIE *, 8>::iterator I = Children.begin(),
1857 E = Children.end(); I != E; ++I)
1858 ScopeDIE->addChild(*I);
Devang Patel193f7202009-11-24 01:14:22 +00001859
Jim Grosbach1e20b962010-07-21 21:21:52 +00001860 if (DS.isSubprogram())
Devang Patel2db49d72010-05-07 18:11:54 +00001861 addPubTypes(DISubprogram(DS));
Jim Grosbach1e20b962010-07-21 21:21:52 +00001862
Devang Patel193f7202009-11-24 01:14:22 +00001863 return ScopeDIE;
Devang Patel53bb5c92009-11-10 23:06:00 +00001864}
1865
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001866/// GetOrCreateSourceID - Look up the source id with the given directory and
1867/// source file names. If none currently exists, create a new id and insert it
1868/// in the SourceIds map. This can update DirectoryNames and SourceFileNames
1869/// maps as well.
Devang Patel2f584852010-07-24 00:53:22 +00001870
Devang Patel23670e52011-03-24 20:30:50 +00001871unsigned DwarfDebug::GetOrCreateSourceID(StringRef FileName,
1872 StringRef DirName) {
Devang Patel1905a182010-09-16 20:57:49 +00001873 // If FE did not provide a file name, then assume stdin.
1874 if (FileName.empty())
Devang Patel23670e52011-03-24 20:30:50 +00001875 return GetOrCreateSourceID("<stdin>", StringRef());
1876
1877 // MCStream expects full path name as filename.
1878 if (!DirName.empty() && !FileName.startswith("/")) {
1879 std::string FullPathName(DirName.data());
1880 if (!DirName.endswith("/"))
1881 FullPathName += "/";
1882 FullPathName += FileName.data();
1883 // Here FullPathName will be copied into StringMap by GetOrCreateSourceID.
1884 return GetOrCreateSourceID(StringRef(FullPathName), StringRef());
1885 }
Devang Patel1905a182010-09-16 20:57:49 +00001886
Rafael Espindola5c055632010-11-18 02:04:25 +00001887 StringMapEntry<unsigned> &Entry = SourceIdMap.GetOrCreateValue(FileName);
1888 if (Entry.getValue())
1889 return Entry.getValue();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001890
Rafael Espindola5c055632010-11-18 02:04:25 +00001891 unsigned SrcId = SourceIdMap.size();
1892 Entry.setValue(SrcId);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001893
Rafael Espindola5c055632010-11-18 02:04:25 +00001894 // Print out a .file directive to specify files for .loc directives.
Devang Patel23670e52011-03-24 20:30:50 +00001895 Asm->OutStreamer.EmitDwarfFileDirective(SrcId, Entry.getKey());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001896
1897 return SrcId;
1898}
1899
Devang Patel6404e4e2009-12-15 19:16:48 +00001900/// getOrCreateNameSpace - Create a DIE for DINameSpace.
1901DIE *DwarfDebug::getOrCreateNameSpace(DINameSpace NS) {
Devang Patel163a9f72010-05-10 22:49:55 +00001902 CompileUnit *TheCU = getCompileUnit(NS);
1903 DIE *NDie = TheCU->getDIE(NS);
Devang Patel6404e4e2009-12-15 19:16:48 +00001904 if (NDie)
1905 return NDie;
1906 NDie = new DIE(dwarf::DW_TAG_namespace);
Devang Patel163a9f72010-05-10 22:49:55 +00001907 TheCU->insertDIE(NS, NDie);
Devang Patel6404e4e2009-12-15 19:16:48 +00001908 if (!NS.getName().empty())
1909 addString(NDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, NS.getName());
Devang Patel81625742010-08-09 20:20:05 +00001910 addSourceLine(NDie, NS);
Devang Patel6404e4e2009-12-15 19:16:48 +00001911 addToContextOwner(NDie, NS.getContext());
1912 return NDie;
1913}
1914
Jim Grosbach1e20b962010-07-21 21:21:52 +00001915/// constructCompileUnit - Create new CompileUnit for the given
Devang Patel163a9f72010-05-10 22:49:55 +00001916/// metadata node with tag DW_TAG_compile_unit.
Devang Patele9f8f5e2010-05-07 20:54:48 +00001917void DwarfDebug::constructCompileUnit(const MDNode *N) {
Devang Patele4b27562009-08-28 23:24:31 +00001918 DICompileUnit DIUnit(N);
Devang Patel65dbc902009-11-25 17:36:49 +00001919 StringRef FN = DIUnit.getFilename();
1920 StringRef Dir = DIUnit.getDirectory();
Devang Patel23670e52011-03-24 20:30:50 +00001921 unsigned ID = GetOrCreateSourceID(FN, Dir);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001922
1923 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
Devang Patel2c4ceb12009-11-21 02:48:08 +00001924 addString(Die, dwarf::DW_AT_producer, dwarf::DW_FORM_string,
Devang Patel5ccdd102009-09-29 18:40:58 +00001925 DIUnit.getProducer());
Devang Patel3a4ae322011-02-23 22:37:04 +00001926 addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data2,
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001927 DIUnit.getLanguage());
Devang Patel2c4ceb12009-11-21 02:48:08 +00001928 addString(Die, dwarf::DW_AT_name, dwarf::DW_FORM_string, FN);
Devang Patel5098da02010-04-26 22:54:28 +00001929 // Use DW_AT_entry_pc instead of DW_AT_low_pc/DW_AT_high_pc pair. This
1930 // simplifies debug range entries.
Devang Patel9b93b6b2010-06-28 22:22:47 +00001931 addUInt(Die, dwarf::DW_AT_entry_pc, dwarf::DW_FORM_addr, 0);
Devang Patel4a602ca2010-03-22 23:11:36 +00001932 // DW_AT_stmt_list is a offset of line number information for this
Devang Patelaf608bd2010-08-24 00:06:12 +00001933 // compile unit in debug_line section.
Devang Patelae84d5b2010-08-31 23:50:19 +00001934 if (Asm->MAI->doesDwarfUsesAbsoluteLabelForStmtList())
Cameron Zwarichf754f502011-02-25 16:30:32 +00001935 addLabel(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_addr,
1936 Asm->GetTempSymbol("section_line"));
Devang Patelae84d5b2010-08-31 23:50:19 +00001937 else
1938 addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4, 0);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001939
Devang Patel65dbc902009-11-25 17:36:49 +00001940 if (!Dir.empty())
Devang Patel2c4ceb12009-11-21 02:48:08 +00001941 addString(Die, dwarf::DW_AT_comp_dir, dwarf::DW_FORM_string, Dir);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001942 if (DIUnit.isOptimized())
Devang Patel2c4ceb12009-11-21 02:48:08 +00001943 addUInt(Die, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001944
Devang Patel65dbc902009-11-25 17:36:49 +00001945 StringRef Flags = DIUnit.getFlags();
1946 if (!Flags.empty())
Devang Patel2c4ceb12009-11-21 02:48:08 +00001947 addString(Die, dwarf::DW_AT_APPLE_flags, dwarf::DW_FORM_string, Flags);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001948
1949 unsigned RVer = DIUnit.getRunTimeVersion();
1950 if (RVer)
Devang Patel2c4ceb12009-11-21 02:48:08 +00001951 addUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers,
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001952 dwarf::DW_FORM_data1, RVer);
1953
Devang Patel163a9f72010-05-10 22:49:55 +00001954 CompileUnit *NewCU = new CompileUnit(ID, Die);
1955 if (!FirstCU)
1956 FirstCU = NewCU;
1957 CUMap.insert(std::make_pair(N, NewCU));
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001958}
1959
Devang Patel163a9f72010-05-10 22:49:55 +00001960/// getCompielUnit - Get CompileUnit DIE.
1961CompileUnit *DwarfDebug::getCompileUnit(const MDNode *N) const {
1962 assert (N && "Invalid DwarfDebug::getCompileUnit argument!");
1963 DIDescriptor D(N);
1964 const MDNode *CUNode = NULL;
1965 if (D.isCompileUnit())
1966 CUNode = N;
1967 else if (D.isSubprogram())
1968 CUNode = DISubprogram(N).getCompileUnit();
1969 else if (D.isType())
1970 CUNode = DIType(N).getCompileUnit();
1971 else if (D.isGlobalVariable())
1972 CUNode = DIGlobalVariable(N).getCompileUnit();
1973 else if (D.isVariable())
1974 CUNode = DIVariable(N).getCompileUnit();
1975 else if (D.isNameSpace())
1976 CUNode = DINameSpace(N).getCompileUnit();
1977 else if (D.isFile())
1978 CUNode = DIFile(N).getCompileUnit();
1979 else
1980 return FirstCU;
1981
1982 DenseMap<const MDNode *, CompileUnit *>::const_iterator I
1983 = CUMap.find(CUNode);
1984 if (I == CUMap.end())
1985 return FirstCU;
1986 return I->second;
1987}
1988
Devang Patel0c4720c2010-08-23 18:25:56 +00001989/// isUnsignedDIType - Return true if type encoding is unsigned.
1990static bool isUnsignedDIType(DIType Ty) {
1991 DIDerivedType DTy(Ty);
1992 if (DTy.Verify())
1993 return isUnsignedDIType(DTy.getTypeDerivedFrom());
1994
1995 DIBasicType BTy(Ty);
1996 if (BTy.Verify()) {
1997 unsigned Encoding = BTy.getEncoding();
1998 if (Encoding == dwarf::DW_ATE_unsigned ||
1999 Encoding == dwarf::DW_ATE_unsigned_char)
2000 return true;
2001 }
2002 return false;
2003}
Devang Patel163a9f72010-05-10 22:49:55 +00002004
Devang Patele449d1f2011-01-20 00:02:16 +00002005// Return const exprssion if value is a GEP to access merged global
2006// constant. e.g.
2007// i8* getelementptr ({ i8, i8, i8, i8 }* @_MergedGlobals, i32 0, i32 0)
2008static const ConstantExpr *getMergedGlobalExpr(const Value *V) {
2009 const ConstantExpr *CE = dyn_cast_or_null<ConstantExpr>(V);
2010 if (!CE || CE->getNumOperands() != 3 ||
2011 CE->getOpcode() != Instruction::GetElementPtr)
2012 return NULL;
2013
2014 // First operand points to a global value.
2015 if (!isa<GlobalValue>(CE->getOperand(0)))
2016 return NULL;
2017
2018 // Second operand is zero.
2019 const ConstantInt *CI =
2020 dyn_cast_or_null<ConstantInt>(CE->getOperand(1));
2021 if (!CI || !CI->isZero())
2022 return NULL;
2023
2024 // Third operand is offset.
2025 if (!isa<ConstantInt>(CE->getOperand(2)))
2026 return NULL;
2027
2028 return CE;
2029}
2030
Devang Patel163a9f72010-05-10 22:49:55 +00002031/// constructGlobalVariableDIE - Construct global variable DIE.
Devang Patele9f8f5e2010-05-07 20:54:48 +00002032void DwarfDebug::constructGlobalVariableDIE(const MDNode *N) {
Devang Patel9fa539c2010-08-10 01:37:23 +00002033 DIGlobalVariable GV(N);
Daniel Dunbarf612ff62009-09-19 20:40:05 +00002034
Devang Patel905cf5e2009-09-04 23:59:07 +00002035 // If debug information is malformed then ignore it.
Devang Patel9fa539c2010-08-10 01:37:23 +00002036 if (GV.Verify() == false)
Devang Patel905cf5e2009-09-04 23:59:07 +00002037 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002038
2039 // Check for pre-existence.
Devang Patel163a9f72010-05-10 22:49:55 +00002040 CompileUnit *TheCU = getCompileUnit(N);
Devang Patel9fa539c2010-08-10 01:37:23 +00002041 if (TheCU->getDIE(GV))
Devang Patel13e16b62009-06-26 01:49:18 +00002042 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002043
Devang Patel9fa539c2010-08-10 01:37:23 +00002044 DIType GTy = GV.getType();
Devang Patel29368072010-08-10 07:11:13 +00002045 DIE *VariableDIE = new DIE(GV.getTag());
2046
2047 bool isGlobalVariable = GV.getGlobal() != NULL;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002048
Devang Patel9fa539c2010-08-10 01:37:23 +00002049 // Add name.
2050 addString(VariableDIE, dwarf::DW_AT_name, dwarf::DW_FORM_string,
2051 GV.getDisplayName());
2052 StringRef LinkageName = GV.getLinkageName();
Devang Patel29368072010-08-10 07:11:13 +00002053 if (!LinkageName.empty() && isGlobalVariable)
Devang Patel9fa539c2010-08-10 01:37:23 +00002054 addString(VariableDIE, dwarf::DW_AT_MIPS_linkage_name, dwarf::DW_FORM_string,
2055 getRealLinkageName(LinkageName));
2056 // Add type.
2057 addType(VariableDIE, GTy);
Devang Patel50d80e32010-04-13 20:35:04 +00002058 if (GTy.isCompositeType() && !GTy.getName().empty()
2059 && !GTy.isForwardDecl()) {
Devang Patel163a9f72010-05-10 22:49:55 +00002060 DIEEntry *Entry = TheCU->getDIEEntry(GTy);
Chris Lattnered7a77b2010-03-31 05:36:29 +00002061 assert(Entry && "Missing global type!");
Devang Patel163a9f72010-05-10 22:49:55 +00002062 TheCU->addGlobalType(GTy.getName(), Entry->getEntry());
Devang Patel193f7202009-11-24 01:14:22 +00002063 }
Devang Patel9fa539c2010-08-10 01:37:23 +00002064 // Add scoping info.
2065 if (!GV.isLocalToUnit()) {
2066 addUInt(VariableDIE, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
2067 // Expose as global.
2068 TheCU->addGlobal(GV.getName(), VariableDIE);
2069 }
2070 // Add line number info.
2071 addSourceLine(VariableDIE, GV);
2072 // Add to map.
2073 TheCU->insertDIE(N, VariableDIE);
2074 // Add to context owner.
2075 DIDescriptor GVContext = GV.getContext();
2076 addToContextOwner(VariableDIE, GVContext);
2077 // Add location.
Devang Patel29368072010-08-10 07:11:13 +00002078 if (isGlobalVariable) {
2079 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
2080 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
2081 addLabel(Block, 0, dwarf::DW_FORM_udata,
2082 Asm->Mang->getSymbol(GV.getGlobal()));
2083 // Do not create specification DIE if context is either compile unit
2084 // or a subprogram.
2085 if (GV.isDefinition() && !GVContext.isCompileUnit() &&
2086 !GVContext.isFile() && !isSubprogramContext(GVContext)) {
2087 // Create specification DIE.
2088 DIE *VariableSpecDIE = new DIE(dwarf::DW_TAG_variable);
2089 addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification,
2090 dwarf::DW_FORM_ref4, VariableDIE);
2091 addBlock(VariableSpecDIE, dwarf::DW_AT_location, 0, Block);
2092 addUInt(VariableDIE, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
2093 TheCU->addDie(VariableSpecDIE);
2094 } else {
2095 addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
2096 }
Devang Patel76a788c2011-01-06 21:39:25 +00002097 } else if (ConstantInt *CI =
2098 dyn_cast_or_null<ConstantInt>(GV.getConstant()))
2099 addConstantValue(VariableDIE, CI, isUnsignedDIType(GTy));
Devang Patele449d1f2011-01-20 00:02:16 +00002100 else if (const ConstantExpr *CE = getMergedGlobalExpr(N->getOperand(11))) {
2101 // GV is a merged global.
2102 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
2103 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
2104 addLabel(Block, 0, dwarf::DW_FORM_udata,
2105 Asm->Mang->getSymbol(cast<GlobalValue>(CE->getOperand(0))));
2106 ConstantInt *CII = cast<ConstantInt>(CE->getOperand(2));
2107 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
2108 addUInt(Block, 0, dwarf::DW_FORM_udata, CII->getZExtValue());
2109 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
2110 addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
2111 }
Devang Patel76a788c2011-01-06 21:39:25 +00002112
Devang Patel13e16b62009-06-26 01:49:18 +00002113 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002114}
2115
Devang Patel163a9f72010-05-10 22:49:55 +00002116/// construct SubprogramDIE - Construct subprogram DIE.
Devang Patele9f8f5e2010-05-07 20:54:48 +00002117void DwarfDebug::constructSubprogramDIE(const MDNode *N) {
Devang Patele4b27562009-08-28 23:24:31 +00002118 DISubprogram SP(N);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002119
Stuart Hastings639336e2010-04-06 21:38:29 +00002120 // Check for pre-existence.
Devang Patel163a9f72010-05-10 22:49:55 +00002121 CompileUnit *TheCU = getCompileUnit(N);
2122 if (TheCU->getDIE(N))
Stuart Hastings639336e2010-04-06 21:38:29 +00002123 return;
2124
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002125 if (!SP.isDefinition())
2126 // This is a method declaration which will be handled while constructing
2127 // class type.
Devang Patel13e16b62009-06-26 01:49:18 +00002128 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002129
Stuart Hastings639336e2010-04-06 21:38:29 +00002130 DIE *SubprogramDie = createSubprogramDIE(SP);
2131
2132 // Add to map.
Devang Patel163a9f72010-05-10 22:49:55 +00002133 TheCU->insertDIE(N, SubprogramDie);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002134
2135 // Add to context owner.
Devang Patel6404e4e2009-12-15 19:16:48 +00002136 addToContextOwner(SubprogramDie, SP.getContext());
Devang Patel0000fad2009-12-08 23:21:45 +00002137
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002138 // Expose as global.
Devang Patel163a9f72010-05-10 22:49:55 +00002139 TheCU->addGlobal(SP.getName(), SubprogramDie);
Devang Patel193f7202009-11-24 01:14:22 +00002140
Devang Patel13e16b62009-06-26 01:49:18 +00002141 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002142}
2143
Devang Patel2c4ceb12009-11-21 02:48:08 +00002144/// beginModule - Emit all Dwarf sections that should come prior to the
Daniel Dunbar00564992009-09-19 20:40:14 +00002145/// content. Create global DIEs and emit initial debug info sections.
2146/// This is inovked by the target AsmPrinter.
Chris Lattner75f50722010-04-04 07:48:20 +00002147void DwarfDebug::beginModule(Module *M) {
Devang Pateleac9c072010-04-27 19:46:33 +00002148 if (DisableDebugInfoPrinting)
2149 return;
2150
Devang Patel78ab9e22009-07-30 18:56:46 +00002151 DebugInfoFinder DbgFinder;
2152 DbgFinder.processModule(*M);
Devang Patel13e16b62009-06-26 01:49:18 +00002153
Chris Lattnerd850ac72010-04-05 02:19:28 +00002154 bool HasDebugInfo = false;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002155
Chris Lattnerd850ac72010-04-05 02:19:28 +00002156 // Scan all the compile-units to see if there are any marked as the main unit.
2157 // if not, we do not generate debug info.
2158 for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
2159 E = DbgFinder.compile_unit_end(); I != E; ++I) {
2160 if (DICompileUnit(*I).isMain()) {
2161 HasDebugInfo = true;
2162 break;
2163 }
2164 }
Jim Grosbach1e20b962010-07-21 21:21:52 +00002165
Chris Lattnerd850ac72010-04-05 02:19:28 +00002166 if (!HasDebugInfo) return;
2167
2168 // Tell MMI that we have debug info.
2169 MMI->setDebugInfoAvailability(true);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002170
Chris Lattnerbe15beb2010-04-04 23:17:54 +00002171 // Emit initial sections.
Chris Lattnerd850ac72010-04-05 02:19:28 +00002172 EmitSectionLabels();
Jim Grosbach1e20b962010-07-21 21:21:52 +00002173
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002174 // Create all the compile unit DIEs.
Devang Patel78ab9e22009-07-30 18:56:46 +00002175 for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
2176 E = DbgFinder.compile_unit_end(); I != E; ++I)
Devang Patel2c4ceb12009-11-21 02:48:08 +00002177 constructCompileUnit(*I);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002178
Devang Patel53bb5c92009-11-10 23:06:00 +00002179 // Create DIEs for each subprogram.
Devang Patel78ab9e22009-07-30 18:56:46 +00002180 for (DebugInfoFinder::iterator I = DbgFinder.subprogram_begin(),
2181 E = DbgFinder.subprogram_end(); I != E; ++I)
Devang Patel2c4ceb12009-11-21 02:48:08 +00002182 constructSubprogramDIE(*I);
Devang Patel13e16b62009-06-26 01:49:18 +00002183
Devang Patelc366f832009-12-10 19:14:49 +00002184 // Create DIEs for each global variable.
2185 for (DebugInfoFinder::iterator I = DbgFinder.global_variable_begin(),
2186 E = DbgFinder.global_variable_end(); I != E; ++I)
2187 constructGlobalVariableDIE(*I);
2188
Devang Patele7e5a0f2010-08-10 20:01:20 +00002189 //getOrCreateTypeDIE
2190 if (NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.enum"))
2191 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i)
2192 getOrCreateTypeDIE(DIType(NMD->getOperand(i)));
2193
Devang Patel1a7ca032010-09-28 18:08:20 +00002194 if (NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.ty"))
2195 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i)
2196 getOrCreateTypeDIE(DIType(NMD->getOperand(i)));
2197
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002198 // Prime section data.
Chris Lattnerf0144122009-07-28 03:13:23 +00002199 SectionMap.insert(Asm->getObjFileLowering().getTextSection());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002200}
2201
Devang Patel2c4ceb12009-11-21 02:48:08 +00002202/// endModule - Emit all Dwarf sections that should come after the content.
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002203///
Devang Patel2c4ceb12009-11-21 02:48:08 +00002204void DwarfDebug::endModule() {
Devang Patel163a9f72010-05-10 22:49:55 +00002205 if (!FirstCU) return;
Devang Patel4a1cad62010-06-28 18:25:03 +00002206 const Module *M = MMI->getModule();
Devang Patele9a1cca2010-08-02 17:32:15 +00002207 DenseMap<const MDNode *, DbgScope *> DeadFnScopeMap;
Devang Patel4a1cad62010-06-28 18:25:03 +00002208 if (NamedMDNode *AllSPs = M->getNamedMetadata("llvm.dbg.sp")) {
2209 for (unsigned SI = 0, SE = AllSPs->getNumOperands(); SI != SE; ++SI) {
2210 if (ProcessedSPNodes.count(AllSPs->getOperand(SI)) != 0) continue;
2211 DISubprogram SP(AllSPs->getOperand(SI));
2212 if (!SP.Verify()) continue;
2213
2214 // Collect info for variables that were optimized out.
Devang Patel8b3a6b62010-07-19 17:53:55 +00002215 if (!SP.isDefinition()) continue;
Devang Patel4a1cad62010-06-28 18:25:03 +00002216 StringRef FName = SP.getLinkageName();
2217 if (FName.empty())
2218 FName = SP.getName();
Devang Patel62367042010-11-10 22:19:21 +00002219 NamedMDNode *NMD = getFnSpecificMDNode(*(MMI->getModule()), FName);
Devang Patel4a1cad62010-06-28 18:25:03 +00002220 if (!NMD) continue;
2221 unsigned E = NMD->getNumOperands();
2222 if (!E) continue;
2223 DbgScope *Scope = new DbgScope(NULL, DIDescriptor(SP), NULL);
Devang Patele9a1cca2010-08-02 17:32:15 +00002224 DeadFnScopeMap[SP] = Scope;
Devang Patel4a1cad62010-06-28 18:25:03 +00002225 for (unsigned I = 0; I != E; ++I) {
2226 DIVariable DV(NMD->getOperand(I));
2227 if (!DV.Verify()) continue;
2228 Scope->addVariable(new DbgVariable(DV));
2229 }
Jim Grosbach1e20b962010-07-21 21:21:52 +00002230
Devang Patel4a1cad62010-06-28 18:25:03 +00002231 // Construct subprogram DIE and add variables DIEs.
2232 constructSubprogramDIE(SP);
2233 DIE *ScopeDIE = getCompileUnit(SP)->getDIE(SP);
Devang Patele03161c2010-08-09 18:51:29 +00002234 const SmallVector<DbgVariable *, 8> &Variables = Scope->getDbgVariables();
Devang Patel4a1cad62010-06-28 18:25:03 +00002235 for (unsigned i = 0, N = Variables.size(); i < N; ++i) {
2236 DIE *VariableDIE = constructVariableDIE(Variables[i], Scope);
2237 if (VariableDIE)
2238 ScopeDIE->addChild(VariableDIE);
2239 }
2240 }
2241 }
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002242
Devang Patel53bb5c92009-11-10 23:06:00 +00002243 // Attach DW_AT_inline attribute with inlined subprogram DIEs.
2244 for (SmallPtrSet<DIE *, 4>::iterator AI = InlinedSubprogramDIEs.begin(),
2245 AE = InlinedSubprogramDIEs.end(); AI != AE; ++AI) {
2246 DIE *ISP = *AI;
Devang Patel2c4ceb12009-11-21 02:48:08 +00002247 addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
Devang Patel53bb5c92009-11-10 23:06:00 +00002248 }
2249
Devang Patele9f8f5e2010-05-07 20:54:48 +00002250 for (DenseMap<DIE *, const MDNode *>::iterator CI = ContainingTypeMap.begin(),
Devang Patel5d11eb02009-12-03 19:11:07 +00002251 CE = ContainingTypeMap.end(); CI != CE; ++CI) {
2252 DIE *SPDie = CI->first;
Devang Patele9f8f5e2010-05-07 20:54:48 +00002253 const MDNode *N = dyn_cast_or_null<MDNode>(CI->second);
Devang Patel5d11eb02009-12-03 19:11:07 +00002254 if (!N) continue;
Devang Patel163a9f72010-05-10 22:49:55 +00002255 DIE *NDie = getCompileUnit(N)->getDIE(N);
Devang Patel5d11eb02009-12-03 19:11:07 +00002256 if (!NDie) continue;
2257 addDIEEntry(SPDie, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, NDie);
Devang Patel5d11eb02009-12-03 19:11:07 +00002258 }
2259
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002260 // Standard sections final addresses.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002261 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getTextSection());
Chris Lattnerc0215722010-04-04 19:25:43 +00002262 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("text_end"));
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002263 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getDataSection());
Chris Lattnerc0215722010-04-04 19:25:43 +00002264 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("data_end"));
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002265
2266 // End text sections.
2267 for (unsigned i = 1, N = SectionMap.size(); i <= N; ++i) {
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002268 Asm->OutStreamer.SwitchSection(SectionMap[i]);
Chris Lattnerc0215722010-04-04 19:25:43 +00002269 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("section_end", i));
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002270 }
2271
2272 // Emit common frame information.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002273 emitCommonDebugFrame();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002274
2275 // Emit function debug frame information
2276 for (std::vector<FunctionDebugFrameInfo>::iterator I = DebugFrames.begin(),
2277 E = DebugFrames.end(); I != E; ++I)
Devang Patel2c4ceb12009-11-21 02:48:08 +00002278 emitFunctionDebugFrame(*I);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002279
2280 // Compute DIE offsets and sizes.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002281 computeSizeAndOffsets();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002282
2283 // Emit all the DIEs into a debug info section
Devang Patel2c4ceb12009-11-21 02:48:08 +00002284 emitDebugInfo();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002285
2286 // Corresponding abbreviations into a abbrev section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002287 emitAbbreviations();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002288
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002289 // Emit info into a debug pubnames section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002290 emitDebugPubNames();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002291
Devang Patel193f7202009-11-24 01:14:22 +00002292 // Emit info into a debug pubtypes section.
2293 emitDebugPubTypes();
2294
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002295 // Emit info into a debug loc section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002296 emitDebugLoc();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002297
2298 // Emit info into a debug aranges section.
2299 EmitDebugARanges();
2300
2301 // Emit info into a debug ranges section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002302 emitDebugRanges();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002303
2304 // Emit info into a debug macinfo section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002305 emitDebugMacInfo();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002306
2307 // Emit inline info.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002308 emitDebugInlineInfo();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002309
Chris Lattnerbc733f52010-03-13 02:17:42 +00002310 // Emit info into a debug str section.
2311 emitDebugStr();
Jim Grosbach1e20b962010-07-21 21:21:52 +00002312
Devang Patele9a1cca2010-08-02 17:32:15 +00002313 // clean up.
2314 DeleteContainerSeconds(DeadFnScopeMap);
Devang Patel163a9f72010-05-10 22:49:55 +00002315 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2316 E = CUMap.end(); I != E; ++I)
2317 delete I->second;
2318 FirstCU = NULL; // Reset for the next Module, if any.
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002319}
2320
Devang Patel53bb5c92009-11-10 23:06:00 +00002321/// findAbstractVariable - Find abstract variable, if any, associated with Var.
Jim Grosbach1e20b962010-07-21 21:21:52 +00002322DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &Var,
Chris Lattnerde4845c2010-04-02 19:42:39 +00002323 DebugLoc ScopeLoc) {
Devang Patel53bb5c92009-11-10 23:06:00 +00002324
Devang Patel2db49d72010-05-07 18:11:54 +00002325 DbgVariable *AbsDbgVariable = AbstractVariables.lookup(Var);
Devang Patel53bb5c92009-11-10 23:06:00 +00002326 if (AbsDbgVariable)
2327 return AbsDbgVariable;
2328
Devang Patel2db49d72010-05-07 18:11:54 +00002329 LLVMContext &Ctx = Var->getContext();
Chris Lattnerde4845c2010-04-02 19:42:39 +00002330 DbgScope *Scope = AbstractScopes.lookup(ScopeLoc.getScope(Ctx));
Devang Patel53bb5c92009-11-10 23:06:00 +00002331 if (!Scope)
2332 return NULL;
2333
Devang Patel26c1e562010-05-20 16:36:41 +00002334 AbsDbgVariable = new DbgVariable(Var);
Devang Patel2c4ceb12009-11-21 02:48:08 +00002335 Scope->addVariable(AbsDbgVariable);
Devang Patel2db49d72010-05-07 18:11:54 +00002336 AbstractVariables[Var] = AbsDbgVariable;
Devang Patel53bb5c92009-11-10 23:06:00 +00002337 return AbsDbgVariable;
2338}
2339
Devang Patel0478c152011-03-01 22:58:55 +00002340/// addCurrentFnArgument - If Var is an current function argument that add
2341/// it in CurrentFnArguments list.
2342bool DwarfDebug::addCurrentFnArgument(const MachineFunction *MF,
2343 DbgVariable *Var, DbgScope *Scope) {
2344 if (Scope != CurrentFnDbgScope)
2345 return false;
2346 DIVariable DV = Var->getVariable();
2347 if (DV.getTag() != dwarf::DW_TAG_arg_variable)
2348 return false;
2349 unsigned ArgNo = DV.getArgNumber();
2350 if (ArgNo == 0)
2351 return false;
2352
Devang Patelcb3a6572011-03-03 20:02:02 +00002353 size_t Size = CurrentFnArguments.size();
2354 if (Size == 0)
Devang Patel0478c152011-03-01 22:58:55 +00002355 CurrentFnArguments.resize(MF->getFunction()->arg_size());
Devang Patelbbd0f452011-03-03 21:49:41 +00002356 // llvm::Function argument size is not good indicator of how many
Devang Patel6f676be2011-03-03 20:08:10 +00002357 // arguments does the function have at source level.
2358 if (ArgNo > Size)
Devang Patelcb3a6572011-03-03 20:02:02 +00002359 CurrentFnArguments.resize(ArgNo * 2);
Devang Patel0478c152011-03-01 22:58:55 +00002360 CurrentFnArguments[ArgNo - 1] = Var;
2361 return true;
2362}
2363
Devang Patelee432862010-05-20 19:57:06 +00002364/// collectVariableInfoFromMMITable - Collect variable information from
2365/// side table maintained by MMI.
Jim Grosbach1e20b962010-07-21 21:21:52 +00002366void
Devang Patelee432862010-05-20 19:57:06 +00002367DwarfDebug::collectVariableInfoFromMMITable(const MachineFunction * MF,
2368 SmallPtrSet<const MDNode *, 16> &Processed) {
Chris Lattnerd38fee82010-04-05 00:13:49 +00002369 const LLVMContext &Ctx = Asm->MF->getFunction()->getContext();
Devang Patele717faa2009-10-06 01:26:37 +00002370 MachineModuleInfo::VariableDbgInfoMapTy &VMap = MMI->getVariableDbgInfo();
2371 for (MachineModuleInfo::VariableDbgInfoMapTy::iterator VI = VMap.begin(),
2372 VE = VMap.end(); VI != VE; ++VI) {
Devang Patele9f8f5e2010-05-07 20:54:48 +00002373 const MDNode *Var = VI->first;
Devang Patel53bb5c92009-11-10 23:06:00 +00002374 if (!Var) continue;
Devang Patel98e1cac2010-05-14 21:01:35 +00002375 Processed.insert(Var);
Chris Lattnerde4845c2010-04-02 19:42:39 +00002376 DIVariable DV(Var);
2377 const std::pair<unsigned, DebugLoc> &VP = VI->second;
Devang Patel53bb5c92009-11-10 23:06:00 +00002378
Chris Lattnerde4845c2010-04-02 19:42:39 +00002379 DbgScope *Scope = 0;
Devang Patele9f8f5e2010-05-07 20:54:48 +00002380 if (const MDNode *IA = VP.second.getInlinedAt(Ctx))
Chris Lattnerde4845c2010-04-02 19:42:39 +00002381 Scope = ConcreteScopes.lookup(IA);
2382 if (Scope == 0)
2383 Scope = DbgScopeMap.lookup(VP.second.getScope(Ctx));
Jim Grosbach1e20b962010-07-21 21:21:52 +00002384
Devang Patelfb0ee432009-11-10 23:20:04 +00002385 // If variable scope is not found then skip this variable.
Chris Lattnerde4845c2010-04-02 19:42:39 +00002386 if (Scope == 0)
Devang Patelfb0ee432009-11-10 23:20:04 +00002387 continue;
Devang Patel53bb5c92009-11-10 23:06:00 +00002388
Devang Patel26c1e562010-05-20 16:36:41 +00002389 DbgVariable *AbsDbgVariable = findAbstractVariable(DV, VP.second);
2390 DbgVariable *RegVar = new DbgVariable(DV);
2391 recordVariableFrameIndex(RegVar, VP.first);
Devang Patel0478c152011-03-01 22:58:55 +00002392 if (!addCurrentFnArgument(MF, RegVar, Scope))
2393 Scope->addVariable(RegVar);
Devang Patel26c1e562010-05-20 16:36:41 +00002394 if (AbsDbgVariable) {
2395 recordVariableFrameIndex(AbsDbgVariable, VP.first);
2396 VarToAbstractVarMap[RegVar] = AbsDbgVariable;
2397 }
Devang Patele717faa2009-10-06 01:26:37 +00002398 }
Devang Patelee432862010-05-20 19:57:06 +00002399}
Devang Patel90a48ad2010-03-15 18:33:46 +00002400
Jim Grosbach1e20b962010-07-21 21:21:52 +00002401/// isDbgValueInDefinedReg - Return true if debug value, encoded by
Devang Patelc3f5f782010-05-25 23:40:22 +00002402/// DBG_VALUE instruction, is in a defined reg.
2403static bool isDbgValueInDefinedReg(const MachineInstr *MI) {
2404 assert (MI->isDebugValue() && "Invalid DBG_VALUE machine instruction!");
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00002405 return MI->getNumOperands() == 3 &&
2406 MI->getOperand(0).isReg() && MI->getOperand(0).getReg() &&
2407 MI->getOperand(1).isImm() && MI->getOperand(1).getImm() == 0;
Devang Patelc3f5f782010-05-25 23:40:22 +00002408}
2409
Devang Patelee432862010-05-20 19:57:06 +00002410/// collectVariableInfo - Populate DbgScope entries with variables' info.
Jim Grosbach1e20b962010-07-21 21:21:52 +00002411void
Devang Patel78e127d2010-06-25 22:07:34 +00002412DwarfDebug::collectVariableInfo(const MachineFunction *MF,
2413 SmallPtrSet<const MDNode *, 16> &Processed) {
Jim Grosbach1e20b962010-07-21 21:21:52 +00002414
Devang Patelee432862010-05-20 19:57:06 +00002415 /// collection info from MMI table.
2416 collectVariableInfoFromMMITable(MF, Processed);
2417
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00002418 for (SmallVectorImpl<const MDNode*>::const_iterator
2419 UVI = UserVariables.begin(), UVE = UserVariables.end(); UVI != UVE;
2420 ++UVI) {
2421 const MDNode *Var = *UVI;
2422 if (Processed.count(Var))
Devang Patelee432862010-05-20 19:57:06 +00002423 continue;
2424
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00002425 // History contains relevant DBG_VALUE instructions for Var and instructions
2426 // clobbering it.
2427 SmallVectorImpl<const MachineInstr*> &History = DbgValues[Var];
2428 if (History.empty())
2429 continue;
2430 const MachineInstr *MInsn = History.front();
Devang Patelc3f5f782010-05-25 23:40:22 +00002431
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00002432 DIVariable DV(Var);
Devang Patela36478f2011-01-11 21:42:10 +00002433 DbgScope *Scope = NULL;
Devang Pateld8720f42010-05-27 20:25:04 +00002434 if (DV.getTag() == dwarf::DW_TAG_arg_variable &&
2435 DISubprogram(DV.getContext()).describes(MF->getFunction()))
Devang Patelc0c5a262010-05-21 00:10:20 +00002436 Scope = CurrentFnDbgScope;
Devang Patela36478f2011-01-11 21:42:10 +00002437 else
2438 Scope = findDbgScope(MInsn);
Devang Patelee432862010-05-20 19:57:06 +00002439 // If variable scope is not found then skip this variable.
Devang Patelc0c5a262010-05-21 00:10:20 +00002440 if (!Scope)
Devang Patelee432862010-05-20 19:57:06 +00002441 continue;
2442
2443 Processed.insert(DV);
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00002444 assert(MInsn->isDebugValue() && "History must begin with debug value");
Devang Patelee432862010-05-20 19:57:06 +00002445 DbgVariable *RegVar = new DbgVariable(DV);
Devang Patel0478c152011-03-01 22:58:55 +00002446 if (!addCurrentFnArgument(MF, RegVar, Scope))
2447 Scope->addVariable(RegVar);
Devang Patelc0c5a262010-05-21 00:10:20 +00002448 if (DbgVariable *AbsVar = findAbstractVariable(DV, MInsn->getDebugLoc())) {
2449 DbgVariableToDbgInstMap[AbsVar] = MInsn;
2450 VarToAbstractVarMap[RegVar] = AbsVar;
Devang Patel90a48ad2010-03-15 18:33:46 +00002451 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00002452
2453 // Simple ranges that are fully coalesced.
2454 if (History.size() <= 1 || (History.size() == 2 &&
2455 MInsn->isIdenticalTo(History.back()))) {
Devang Patelc3f5f782010-05-25 23:40:22 +00002456 DbgVariableToDbgInstMap[RegVar] = MInsn;
2457 continue;
2458 }
2459
2460 // handle multiple DBG_VALUE instructions describing one variable.
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00002461 RegVar->setDotDebugLocOffset(DotDebugLocEntries.size());
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00002462
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00002463 for (SmallVectorImpl<const MachineInstr*>::const_iterator
2464 HI = History.begin(), HE = History.end(); HI != HE; ++HI) {
2465 const MachineInstr *Begin = *HI;
2466 assert(Begin->isDebugValue() && "Invalid History entry");
Devang Patelc3f5f782010-05-25 23:40:22 +00002467 MachineLocation MLoc;
Devang Patelb2cf5812010-08-04 18:40:52 +00002468 if (Begin->getNumOperands() == 3) {
2469 if (Begin->getOperand(0).isReg() && Begin->getOperand(1).isImm())
2470 MLoc.set(Begin->getOperand(0).getReg(), Begin->getOperand(1).getImm());
2471 } else
2472 MLoc = Asm->getDebugValueLocation(Begin);
2473
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00002474 // FIXME: emitDebugLoc only understands registers.
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00002475 if (!MLoc.getReg())
2476 continue;
Jakob Stoklund Olesene17232e2011-03-22 00:21:41 +00002477
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00002478 // Compute the range for a register location.
2479 const MCSymbol *FLabel = getLabelBeforeInsn(Begin);
2480 const MCSymbol *SLabel = 0;
2481
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00002482 if (HI + 1 == HE)
2483 // If Begin is the last instruction in History then its value is valid
Devang Patelc3f5f782010-05-25 23:40:22 +00002484 // until the end of the funtion.
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00002485 SLabel = FunctionEndSym;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00002486 else {
2487 const MachineInstr *End = HI[1];
2488 if (End->isDebugValue())
2489 SLabel = getLabelBeforeInsn(End);
2490 else {
2491 // End is a normal instruction clobbering the range.
2492 SLabel = getLabelAfterInsn(End);
2493 assert(SLabel && "Forgot label after clobber instruction");
2494 ++HI;
2495 }
2496 }
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00002497
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00002498 // The value is valid until the next DBG_VALUE or clobber.
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00002499 DotDebugLocEntries.push_back(DotDebugLocEntry(FLabel, SLabel, MLoc));
Devang Patelc3f5f782010-05-25 23:40:22 +00002500 }
2501 DotDebugLocEntries.push_back(DotDebugLocEntry());
Devang Patel90a48ad2010-03-15 18:33:46 +00002502 }
Devang Patel98e1cac2010-05-14 21:01:35 +00002503
2504 // Collect info for variables that were optimized out.
Devang Pateld1bbc6b2010-06-22 01:01:58 +00002505 const Function *F = MF->getFunction();
Devang Patel62367042010-11-10 22:19:21 +00002506 if (NamedMDNode *NMD = getFnSpecificMDNode(*(F->getParent()), F->getName())) {
Devang Patel98e1cac2010-05-14 21:01:35 +00002507 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
Dan Gohman872814a2010-07-21 18:54:18 +00002508 DIVariable DV(cast<MDNode>(NMD->getOperand(i)));
Devang Patelee432862010-05-20 19:57:06 +00002509 if (!DV || !Processed.insert(DV))
Devang Patel98e1cac2010-05-14 21:01:35 +00002510 continue;
2511 DbgScope *Scope = DbgScopeMap.lookup(DV.getContext());
2512 if (Scope)
Devang Patel26c1e562010-05-20 16:36:41 +00002513 Scope->addVariable(new DbgVariable(DV));
Devang Patel98e1cac2010-05-14 21:01:35 +00002514 }
2515 }
Devang Patelc3f5f782010-05-25 23:40:22 +00002516}
Devang Patel98e1cac2010-05-14 21:01:35 +00002517
Devang Patelc3f5f782010-05-25 23:40:22 +00002518/// getLabelBeforeInsn - Return Label preceding the instruction.
2519const MCSymbol *DwarfDebug::getLabelBeforeInsn(const MachineInstr *MI) {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00002520 MCSymbol *Label = LabelsBeforeInsn.lookup(MI);
2521 assert(Label && "Didn't insert label before instruction");
2522 return Label;
Devang Patelc3f5f782010-05-25 23:40:22 +00002523}
2524
2525/// getLabelAfterInsn - Return Label immediately following the instruction.
2526const MCSymbol *DwarfDebug::getLabelAfterInsn(const MachineInstr *MI) {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00002527 return LabelsAfterInsn.lookup(MI);
Devang Patele717faa2009-10-06 01:26:37 +00002528}
2529
Devang Patelcbbe2872010-10-26 17:49:02 +00002530/// beginInstruction - Process beginning of an instruction.
2531void DwarfDebug::beginInstruction(const MachineInstr *MI) {
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00002532 // Check if source location changes, but ignore DBG_VALUE locations.
2533 if (!MI->isDebugValue()) {
2534 DebugLoc DL = MI->getDebugLoc();
2535 if (DL != PrevInstLoc && (!DL.isUnknown() || UnknownLocations)) {
2536 PrevInstLoc = DL;
2537 if (!DL.isUnknown()) {
2538 const MDNode *Scope = DL.getScope(Asm->MF->getFunction()->getContext());
2539 recordSourceLine(DL.getLine(), DL.getCol(), Scope);
2540 } else
2541 recordSourceLine(0, 0, 0);
2542 }
Devang Patelc3f5f782010-05-25 23:40:22 +00002543 }
Devang Patelaead63c2010-03-29 22:59:58 +00002544
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00002545 // Insert labels where requested.
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00002546 DenseMap<const MachineInstr*, MCSymbol*>::iterator I =
2547 LabelsBeforeInsn.find(MI);
2548
2549 // No label needed.
2550 if (I == LabelsBeforeInsn.end())
2551 return;
2552
2553 // Label already assigned.
2554 if (I->second)
Devang Patelb2b31a62010-05-26 19:37:24 +00002555 return;
Devang Patel553881b2010-03-29 17:20:31 +00002556
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00002557 if (!PrevLabel) {
Devang Patel77051f52010-05-26 21:23:46 +00002558 PrevLabel = MMI->getContext().CreateTempSymbol();
2559 Asm->OutStreamer.EmitLabel(PrevLabel);
Devang Patelb2b31a62010-05-26 19:37:24 +00002560 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00002561 I->second = PrevLabel;
Devang Patel0d20ac82009-10-06 01:50:42 +00002562}
2563
Devang Patelcbbe2872010-10-26 17:49:02 +00002564/// endInstruction - Process end of an instruction.
2565void DwarfDebug::endInstruction(const MachineInstr *MI) {
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00002566 // Don't create a new label after DBG_VALUE instructions.
2567 // They don't generate code.
2568 if (!MI->isDebugValue())
2569 PrevLabel = 0;
2570
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00002571 DenseMap<const MachineInstr*, MCSymbol*>::iterator I =
2572 LabelsAfterInsn.find(MI);
2573
2574 // No label needed.
2575 if (I == LabelsAfterInsn.end())
2576 return;
2577
2578 // Label already assigned.
2579 if (I->second)
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00002580 return;
2581
2582 // We need a label after this instruction.
2583 if (!PrevLabel) {
2584 PrevLabel = MMI->getContext().CreateTempSymbol();
2585 Asm->OutStreamer.EmitLabel(PrevLabel);
Devang Patel1c246352010-04-08 16:50:29 +00002586 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00002587 I->second = PrevLabel;
Devang Patel53bb5c92009-11-10 23:06:00 +00002588}
2589
Devang Pateleac9c072010-04-27 19:46:33 +00002590/// getOrCreateDbgScope - Create DbgScope for the scope.
Jim Grosbach1e20b962010-07-21 21:21:52 +00002591DbgScope *DwarfDebug::getOrCreateDbgScope(const MDNode *Scope,
Devang Patel61409622010-07-07 20:12:52 +00002592 const MDNode *InlinedAt) {
Devang Patel53bb5c92009-11-10 23:06:00 +00002593 if (!InlinedAt) {
2594 DbgScope *WScope = DbgScopeMap.lookup(Scope);
2595 if (WScope)
Devang Pateleac9c072010-04-27 19:46:33 +00002596 return WScope;
Devang Patel53bb5c92009-11-10 23:06:00 +00002597 WScope = new DbgScope(NULL, DIDescriptor(Scope), NULL);
2598 DbgScopeMap.insert(std::make_pair(Scope, WScope));
Devang Pateleac9c072010-04-27 19:46:33 +00002599 if (DIDescriptor(Scope).isLexicalBlock()) {
Jim Grosbach1e20b962010-07-21 21:21:52 +00002600 DbgScope *Parent =
Devang Patel2db49d72010-05-07 18:11:54 +00002601 getOrCreateDbgScope(DILexicalBlock(Scope).getContext(), NULL);
Devang Pateleac9c072010-04-27 19:46:33 +00002602 WScope->setParent(Parent);
2603 Parent->addScope(WScope);
2604 }
2605
2606 if (!WScope->getParent()) {
2607 StringRef SPName = DISubprogram(Scope).getLinkageName();
Stuart Hastingscad22ad2010-06-15 23:06:30 +00002608 // We used to check only for a linkage name, but that fails
2609 // since we began omitting the linkage name for private
2610 // functions. The new way is to check for the name in metadata,
2611 // but that's not supported in old .ll test cases. Ergo, we
2612 // check both.
Stuart Hastings215aa152010-06-11 20:08:44 +00002613 if (SPName == Asm->MF->getFunction()->getName() ||
2614 DISubprogram(Scope).getFunction() == Asm->MF->getFunction())
Devang Pateleac9c072010-04-27 19:46:33 +00002615 CurrentFnDbgScope = WScope;
2616 }
Jim Grosbach1e20b962010-07-21 21:21:52 +00002617
Devang Pateleac9c072010-04-27 19:46:33 +00002618 return WScope;
Devang Patel53bb5c92009-11-10 23:06:00 +00002619 }
2620
Devang Patel78e127d2010-06-25 22:07:34 +00002621 getOrCreateAbstractScope(Scope);
Devang Patel53bb5c92009-11-10 23:06:00 +00002622 DbgScope *WScope = DbgScopeMap.lookup(InlinedAt);
2623 if (WScope)
Devang Pateleac9c072010-04-27 19:46:33 +00002624 return WScope;
Devang Patel53bb5c92009-11-10 23:06:00 +00002625
2626 WScope = new DbgScope(NULL, DIDescriptor(Scope), InlinedAt);
2627 DbgScopeMap.insert(std::make_pair(InlinedAt, WScope));
2628 DILocation DL(InlinedAt);
Devang Pateleac9c072010-04-27 19:46:33 +00002629 DbgScope *Parent =
Devang Patel2db49d72010-05-07 18:11:54 +00002630 getOrCreateDbgScope(DL.getScope(), DL.getOrigLocation());
Devang Pateleac9c072010-04-27 19:46:33 +00002631 WScope->setParent(Parent);
2632 Parent->addScope(WScope);
2633
2634 ConcreteScopes[InlinedAt] = WScope;
Devang Pateleac9c072010-04-27 19:46:33 +00002635
2636 return WScope;
Devang Patel0d20ac82009-10-06 01:50:42 +00002637}
2638
Devang Pateleac9c072010-04-27 19:46:33 +00002639/// hasValidLocation - Return true if debug location entry attached with
2640/// machine instruction encodes valid location info.
2641static bool hasValidLocation(LLVMContext &Ctx,
2642 const MachineInstr *MInsn,
Devang Patele9f8f5e2010-05-07 20:54:48 +00002643 const MDNode *&Scope, const MDNode *&InlinedAt) {
Devang Pateleac9c072010-04-27 19:46:33 +00002644 DebugLoc DL = MInsn->getDebugLoc();
2645 if (DL.isUnknown()) return false;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002646
Devang Patele9f8f5e2010-05-07 20:54:48 +00002647 const MDNode *S = DL.getScope(Ctx);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002648
Devang Pateleac9c072010-04-27 19:46:33 +00002649 // There is no need to create another DIE for compile unit. For all
2650 // other scopes, create one DbgScope now. This will be translated
2651 // into a scope DIE at the end.
2652 if (DIScope(S).isCompileUnit()) return false;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002653
Devang Pateleac9c072010-04-27 19:46:33 +00002654 Scope = S;
2655 InlinedAt = DL.getInlinedAt(Ctx);
2656 return true;
2657}
2658
2659/// calculateDominanceGraph - Calculate dominance graph for DbgScope
2660/// hierarchy.
2661static void calculateDominanceGraph(DbgScope *Scope) {
2662 assert (Scope && "Unable to calculate scop edominance graph!");
2663 SmallVector<DbgScope *, 4> WorkStack;
2664 WorkStack.push_back(Scope);
2665 unsigned Counter = 0;
2666 while (!WorkStack.empty()) {
2667 DbgScope *WS = WorkStack.back();
2668 const SmallVector<DbgScope *, 4> &Children = WS->getScopes();
2669 bool visitedChildren = false;
2670 for (SmallVector<DbgScope *, 4>::const_iterator SI = Children.begin(),
2671 SE = Children.end(); SI != SE; ++SI) {
2672 DbgScope *ChildScope = *SI;
2673 if (!ChildScope->getDFSOut()) {
2674 WorkStack.push_back(ChildScope);
2675 visitedChildren = true;
2676 ChildScope->setDFSIn(++Counter);
2677 break;
2678 }
2679 }
2680 if (!visitedChildren) {
2681 WorkStack.pop_back();
2682 WS->setDFSOut(++Counter);
2683 }
2684 }
2685}
2686
2687/// printDbgScopeInfo - Print DbgScope info for each machine instruction.
Jim Grosbach1e20b962010-07-21 21:21:52 +00002688static
Devang Pateleac9c072010-04-27 19:46:33 +00002689void printDbgScopeInfo(LLVMContext &Ctx, const MachineFunction *MF,
2690 DenseMap<const MachineInstr *, DbgScope *> &MI2ScopeMap)
2691{
2692#ifndef NDEBUG
2693 unsigned PrevDFSIn = 0;
2694 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2695 I != E; ++I) {
2696 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2697 II != IE; ++II) {
2698 const MachineInstr *MInsn = II;
Devang Patele9f8f5e2010-05-07 20:54:48 +00002699 const MDNode *Scope = NULL;
2700 const MDNode *InlinedAt = NULL;
Devang Pateleac9c072010-04-27 19:46:33 +00002701
2702 // Check if instruction has valid location information.
2703 if (hasValidLocation(Ctx, MInsn, Scope, InlinedAt)) {
2704 dbgs() << " [ ";
Jim Grosbach1e20b962010-07-21 21:21:52 +00002705 if (InlinedAt)
Devang Pateleac9c072010-04-27 19:46:33 +00002706 dbgs() << "*";
Jim Grosbach1e20b962010-07-21 21:21:52 +00002707 DenseMap<const MachineInstr *, DbgScope *>::iterator DI =
Devang Pateleac9c072010-04-27 19:46:33 +00002708 MI2ScopeMap.find(MInsn);
2709 if (DI != MI2ScopeMap.end()) {
2710 DbgScope *S = DI->second;
2711 dbgs() << S->getDFSIn();
2712 PrevDFSIn = S->getDFSIn();
2713 } else
2714 dbgs() << PrevDFSIn;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002715 } else
Devang Pateleac9c072010-04-27 19:46:33 +00002716 dbgs() << " [ x" << PrevDFSIn;
2717 dbgs() << " ]";
2718 MInsn->dump();
2719 }
2720 dbgs() << "\n";
2721 }
2722#endif
2723}
Devang Patel2c4ceb12009-11-21 02:48:08 +00002724/// extractScopeInformation - Scan machine instructions in this function
Chris Lattner14d750d2010-03-31 05:39:57 +00002725/// and collect DbgScopes. Return true, if at least one scope was found.
Chris Lattnereec791a2010-01-26 23:18:02 +00002726bool DwarfDebug::extractScopeInformation() {
Devang Patelaf9e8472009-10-01 20:31:14 +00002727 // If scope information was extracted using .dbg intrinsics then there is not
2728 // any need to extract these information by scanning each instruction.
2729 if (!DbgScopeMap.empty())
2730 return false;
2731
Dan Gohman314bf7c2010-04-23 01:18:53 +00002732 // Scan each instruction and create scopes. First build working set of scopes.
Devang Pateleac9c072010-04-27 19:46:33 +00002733 LLVMContext &Ctx = Asm->MF->getFunction()->getContext();
2734 SmallVector<DbgRange, 4> MIRanges;
2735 DenseMap<const MachineInstr *, DbgScope *> MI2ScopeMap;
Devang Patele9f8f5e2010-05-07 20:54:48 +00002736 const MDNode *PrevScope = NULL;
2737 const MDNode *PrevInlinedAt = NULL;
Devang Pateleac9c072010-04-27 19:46:33 +00002738 const MachineInstr *RangeBeginMI = NULL;
2739 const MachineInstr *PrevMI = NULL;
Chris Lattnerd38fee82010-04-05 00:13:49 +00002740 for (MachineFunction::const_iterator I = Asm->MF->begin(), E = Asm->MF->end();
Devang Patelaf9e8472009-10-01 20:31:14 +00002741 I != E; ++I) {
2742 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2743 II != IE; ++II) {
2744 const MachineInstr *MInsn = II;
Devang Patele9f8f5e2010-05-07 20:54:48 +00002745 const MDNode *Scope = NULL;
2746 const MDNode *InlinedAt = NULL;
Devang Pateleac9c072010-04-27 19:46:33 +00002747
2748 // Check if instruction has valid location information.
2749 if (!hasValidLocation(Ctx, MInsn, Scope, InlinedAt)) {
2750 PrevMI = MInsn;
2751 continue;
2752 }
Jim Grosbach1e20b962010-07-21 21:21:52 +00002753
Devang Pateleac9c072010-04-27 19:46:33 +00002754 // If scope has not changed then skip this instruction.
2755 if (Scope == PrevScope && PrevInlinedAt == InlinedAt) {
2756 PrevMI = MInsn;
2757 continue;
2758 }
2759
Devang Pateld3526ea2011-02-15 17:56:09 +00002760 // Ignore DBG_VALUE. It does not contribute any instruction in output.
2761 if (MInsn->isDebugValue())
2762 continue;
2763
Jim Grosbach1e20b962010-07-21 21:21:52 +00002764 if (RangeBeginMI) {
2765 // If we have alread seen a beginning of a instruction range and
Devang Pateleac9c072010-04-27 19:46:33 +00002766 // current instruction scope does not match scope of first instruction
2767 // in this range then create a new instruction range.
2768 DbgRange R(RangeBeginMI, PrevMI);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002769 MI2ScopeMap[RangeBeginMI] = getOrCreateDbgScope(PrevScope,
Devang Patel61409622010-07-07 20:12:52 +00002770 PrevInlinedAt);
Devang Pateleac9c072010-04-27 19:46:33 +00002771 MIRanges.push_back(R);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002772 }
Devang Pateleac9c072010-04-27 19:46:33 +00002773
2774 // This is a beginning of a new instruction range.
2775 RangeBeginMI = MInsn;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002776
Devang Pateleac9c072010-04-27 19:46:33 +00002777 // Reset previous markers.
2778 PrevMI = MInsn;
2779 PrevScope = Scope;
2780 PrevInlinedAt = InlinedAt;
Devang Patel53bb5c92009-11-10 23:06:00 +00002781 }
2782 }
2783
Devang Pateleac9c072010-04-27 19:46:33 +00002784 // Create last instruction range.
2785 if (RangeBeginMI && PrevMI && PrevScope) {
2786 DbgRange R(RangeBeginMI, PrevMI);
2787 MIRanges.push_back(R);
2788 MI2ScopeMap[RangeBeginMI] = getOrCreateDbgScope(PrevScope, PrevInlinedAt);
Devang Patelaf9e8472009-10-01 20:31:14 +00002789 }
Jim Grosbach1e20b962010-07-21 21:21:52 +00002790
Devang Patel344130e2010-01-04 20:44:00 +00002791 if (!CurrentFnDbgScope)
2792 return false;
2793
Devang Pateleac9c072010-04-27 19:46:33 +00002794 calculateDominanceGraph(CurrentFnDbgScope);
2795 if (PrintDbgScope)
2796 printDbgScopeInfo(Ctx, Asm->MF, MI2ScopeMap);
2797
2798 // Find ranges of instructions covered by each DbgScope;
2799 DbgScope *PrevDbgScope = NULL;
2800 for (SmallVector<DbgRange, 4>::const_iterator RI = MIRanges.begin(),
2801 RE = MIRanges.end(); RI != RE; ++RI) {
2802 const DbgRange &R = *RI;
2803 DbgScope *S = MI2ScopeMap.lookup(R.first);
2804 assert (S && "Lost DbgScope for a machine instruction!");
2805 if (PrevDbgScope && !PrevDbgScope->dominates(S))
2806 PrevDbgScope->closeInsnRange(S);
2807 S->openInsnRange(R.first);
2808 S->extendInsnRange(R.second);
2809 PrevDbgScope = S;
2810 }
2811
2812 if (PrevDbgScope)
2813 PrevDbgScope->closeInsnRange();
Devang Patelaf9e8472009-10-01 20:31:14 +00002814
Devang Patele37b0c62010-04-08 18:43:56 +00002815 identifyScopeMarkers();
Devang Patel6122a4d2010-04-08 15:37:09 +00002816
2817 return !DbgScopeMap.empty();
2818}
2819
Jim Grosbach1e20b962010-07-21 21:21:52 +00002820/// identifyScopeMarkers() -
Devang Pateleac9c072010-04-27 19:46:33 +00002821/// Each DbgScope has first instruction and last instruction to mark beginning
2822/// and end of a scope respectively. Create an inverse map that list scopes
2823/// starts (and ends) with an instruction. One instruction may start (or end)
2824/// multiple scopes. Ignore scopes that are not reachable.
Devang Patele37b0c62010-04-08 18:43:56 +00002825void DwarfDebug::identifyScopeMarkers() {
Devang Patel42aafd72010-01-20 02:05:23 +00002826 SmallVector<DbgScope *, 4> WorkList;
2827 WorkList.push_back(CurrentFnDbgScope);
2828 while (!WorkList.empty()) {
Chris Lattner14d750d2010-03-31 05:39:57 +00002829 DbgScope *S = WorkList.pop_back_val();
Jim Grosbach1e20b962010-07-21 21:21:52 +00002830
Jeffrey Yasskin5c213dc2010-03-12 17:45:06 +00002831 const SmallVector<DbgScope *, 4> &Children = S->getScopes();
Jim Grosbach1e20b962010-07-21 21:21:52 +00002832 if (!Children.empty())
Jeffrey Yasskin5c213dc2010-03-12 17:45:06 +00002833 for (SmallVector<DbgScope *, 4>::const_iterator SI = Children.begin(),
Devang Patel42aafd72010-01-20 02:05:23 +00002834 SE = Children.end(); SI != SE; ++SI)
2835 WorkList.push_back(*SI);
2836
Devang Patel53bb5c92009-11-10 23:06:00 +00002837 if (S->isAbstractScope())
2838 continue;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002839
Devang Pateleac9c072010-04-27 19:46:33 +00002840 const SmallVector<DbgRange, 4> &Ranges = S->getRanges();
2841 if (Ranges.empty())
2842 continue;
2843 for (SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin(),
2844 RE = Ranges.end(); RI != RE; ++RI) {
Jim Grosbach1e20b962010-07-21 21:21:52 +00002845 assert(RI->first && "DbgRange does not have first instruction!");
2846 assert(RI->second && "DbgRange does not have second instruction!");
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00002847 requestLabelBeforeInsn(RI->first);
2848 requestLabelAfterInsn(RI->second);
Devang Pateleac9c072010-04-27 19:46:33 +00002849 }
Devang Patelaf9e8472009-10-01 20:31:14 +00002850 }
Devang Patelaf9e8472009-10-01 20:31:14 +00002851}
2852
Dan Gohman084751c2010-04-20 00:37:27 +00002853/// FindFirstDebugLoc - Find the first debug location in the function. This
2854/// is intended to be an approximation for the source position of the
2855/// beginning of the function.
2856static DebugLoc FindFirstDebugLoc(const MachineFunction *MF) {
2857 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2858 I != E; ++I)
2859 for (MachineBasicBlock::const_iterator MBBI = I->begin(), MBBE = I->end();
2860 MBBI != MBBE; ++MBBI) {
2861 DebugLoc DL = MBBI->getDebugLoc();
2862 if (!DL.isUnknown())
2863 return DL;
2864 }
2865 return DebugLoc();
2866}
2867
Devang Patel9a31f0f2010-10-25 20:45:32 +00002868#ifndef NDEBUG
2869/// CheckLineNumbers - Count basicblocks whose instructions do not have any
2870/// line number information.
2871static void CheckLineNumbers(const MachineFunction *MF) {
2872 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2873 I != E; ++I) {
2874 bool FoundLineNo = false;
2875 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2876 II != IE; ++II) {
2877 const MachineInstr *MI = II;
2878 if (!MI->getDebugLoc().isUnknown()) {
2879 FoundLineNo = true;
2880 break;
2881 }
2882 }
Devang Patel4d7f9a02010-10-28 22:11:59 +00002883 if (!FoundLineNo && I->size())
Devang Patel9a31f0f2010-10-25 20:45:32 +00002884 ++BlocksWithoutLineNo;
2885 }
2886}
2887#endif
2888
Devang Patel2c4ceb12009-11-21 02:48:08 +00002889/// beginFunction - Gather pre-function debug information. Assumes being
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002890/// emitted immediately after the function entry point.
Chris Lattnereec791a2010-01-26 23:18:02 +00002891void DwarfDebug::beginFunction(const MachineFunction *MF) {
Chris Lattner994cb122010-04-05 03:52:55 +00002892 if (!MMI->hasDebugInfo()) return;
Bill Wendling5f017e82010-04-07 09:28:04 +00002893 if (!extractScopeInformation()) return;
Devang Patel60b35bd2009-10-06 18:37:31 +00002894
Devang Patel9a31f0f2010-10-25 20:45:32 +00002895#ifndef NDEBUG
2896 CheckLineNumbers(MF);
2897#endif
2898
Devang Pateleac9c072010-04-27 19:46:33 +00002899 FunctionBeginSym = Asm->GetTempSymbol("func_begin",
2900 Asm->getFunctionNumber());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002901 // Assumes in correct section after the entry point.
Devang Pateleac9c072010-04-27 19:46:33 +00002902 Asm->OutStreamer.EmitLabel(FunctionBeginSym);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002903
2904 // Emit label for the implicitly defined dbg.stoppoint at the start of the
2905 // function.
Dan Gohman084751c2010-04-20 00:37:27 +00002906 DebugLoc FDL = FindFirstDebugLoc(MF);
Chris Lattnerde4845c2010-04-02 19:42:39 +00002907 if (FDL.isUnknown()) return;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002908
Devang Patele9f8f5e2010-05-07 20:54:48 +00002909 const MDNode *Scope = FDL.getScope(MF->getFunction()->getContext());
Stuart Hastings0db42712010-07-19 23:56:30 +00002910 const MDNode *TheScope = 0;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002911
Chris Lattnerde4845c2010-04-02 19:42:39 +00002912 DISubprogram SP = getDISubprogram(Scope);
2913 unsigned Line, Col;
2914 if (SP.Verify()) {
2915 Line = SP.getLineNumber();
2916 Col = 0;
Stuart Hastings0db42712010-07-19 23:56:30 +00002917 TheScope = SP;
Chris Lattnerde4845c2010-04-02 19:42:39 +00002918 } else {
2919 Line = FDL.getLine();
2920 Col = FDL.getCol();
Stuart Hastings0db42712010-07-19 23:56:30 +00002921 TheScope = Scope;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002922 }
Jim Grosbach1e20b962010-07-21 21:21:52 +00002923
Stuart Hastings0db42712010-07-19 23:56:30 +00002924 recordSourceLine(Line, Col, TheScope);
Devang Patelb2b31a62010-05-26 19:37:24 +00002925
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00002926 assert(UserVariables.empty() && DbgValues.empty() && "Maps weren't cleaned");
2927
Devang Patelb9abe9f2010-06-02 16:42:51 +00002928 /// ProcessedArgs - Collection of arguments already processed.
2929 SmallPtrSet<const MDNode *, 8> ProcessedArgs;
2930
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00002931 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
2932
2933 /// LiveUserVar - Map physreg numbers to the MDNode they contain.
2934 std::vector<const MDNode*> LiveUserVar(TRI->getNumRegs());
2935
Devang Patelb2b31a62010-05-26 19:37:24 +00002936 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00002937 I != E; ++I) {
2938 bool AtBlockEntry = true;
Devang Patelb2b31a62010-05-26 19:37:24 +00002939 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2940 II != IE; ++II) {
2941 const MachineInstr *MI = II;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00002942
Devang Patelb2b31a62010-05-26 19:37:24 +00002943 if (MI->isDebugValue()) {
Devang Patelb2b31a62010-05-26 19:37:24 +00002944 assert (MI->getNumOperands() > 1 && "Invalid machine instruction!");
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00002945
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00002946 // Keep track of user variables.
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00002947 const MDNode *Var =
2948 MI->getOperand(MI->getNumOperands() - 1).getMetadata();
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00002949
2950 // Variable is in a register, we need to check for clobbers.
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00002951 if (isDbgValueInDefinedReg(MI))
2952 LiveUserVar[MI->getOperand(0).getReg()] = Var;
2953
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00002954 // Check the history of this variable.
2955 SmallVectorImpl<const MachineInstr*> &History = DbgValues[Var];
2956 if (History.empty()) {
2957 UserVariables.push_back(Var);
2958 // The first mention of a function argument gets the FunctionBeginSym
2959 // label, so arguments are visible when breaking at function entry.
2960 DIVariable DV(Var);
2961 if (DV.Verify() && DV.getTag() == dwarf::DW_TAG_arg_variable &&
2962 DISubprogram(getDISubprogram(DV.getContext()))
2963 .describes(MF->getFunction()))
2964 LabelsBeforeInsn[MI] = FunctionBeginSym;
2965 } else {
2966 // We have seen this variable before. Try to coalesce DBG_VALUEs.
2967 const MachineInstr *Prev = History.back();
2968 if (Prev->isDebugValue()) {
2969 // Coalesce identical entries at the end of History.
2970 if (History.size() >= 2 &&
2971 Prev->isIdenticalTo(History[History.size() - 2]))
2972 History.pop_back();
2973
2974 // Terminate old register assignments that don't reach MI;
2975 MachineFunction::const_iterator PrevMBB = Prev->getParent();
2976 if (PrevMBB != I && (!AtBlockEntry || llvm::next(PrevMBB) != I) &&
2977 isDbgValueInDefinedReg(Prev)) {
2978 // Previous register assignment needs to terminate at the end of
2979 // its basic block.
2980 MachineBasicBlock::const_iterator LastMI =
2981 PrevMBB->getLastNonDebugInstr();
2982 if (LastMI == PrevMBB->end())
2983 // Drop DBG_VALUE for empty range.
2984 History.pop_back();
2985 else {
2986 // Terminate after LastMI.
2987 History.push_back(LastMI);
2988 }
2989 }
2990 }
2991 }
2992 History.push_back(MI);
Devang Patelb2b31a62010-05-26 19:37:24 +00002993 } else {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00002994 // Not a DBG_VALUE instruction.
2995 if (!MI->isLabel())
2996 AtBlockEntry = false;
2997
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00002998 // Check if the instruction clobbers any registers with debug vars.
2999 for (MachineInstr::const_mop_iterator MOI = MI->operands_begin(),
3000 MOE = MI->operands_end(); MOI != MOE; ++MOI) {
3001 if (!MOI->isReg() || !MOI->isDef() || !MOI->getReg())
3002 continue;
3003 for (const unsigned *AI = TRI->getOverlaps(MOI->getReg());
3004 unsigned Reg = *AI; ++AI) {
3005 const MDNode *Var = LiveUserVar[Reg];
3006 if (!Var)
3007 continue;
3008 // Reg is now clobbered.
3009 LiveUserVar[Reg] = 0;
3010
3011 // Was MD last defined by a DBG_VALUE referring to Reg?
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00003012 DbgValueHistoryMap::iterator HistI = DbgValues.find(Var);
3013 if (HistI == DbgValues.end())
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00003014 continue;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00003015 SmallVectorImpl<const MachineInstr*> &History = HistI->second;
3016 if (History.empty())
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00003017 continue;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00003018 const MachineInstr *Prev = History.back();
3019 // Sanity-check: Register assignments are terminated at the end of
3020 // their block.
3021 if (!Prev->isDebugValue() || Prev->getParent() != MI->getParent())
3022 continue;
3023 // Is the variable still in Reg?
3024 if (!isDbgValueInDefinedReg(Prev) ||
3025 Prev->getOperand(0).getReg() != Reg)
3026 continue;
3027 // Var is clobbered. Make sure the next instruction gets a label.
3028 History.push_back(MI);
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00003029 }
3030 }
Devang Patelb2b31a62010-05-26 19:37:24 +00003031 }
Devang Patelb2b31a62010-05-26 19:37:24 +00003032 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00003033 }
3034
3035 for (DbgValueHistoryMap::iterator I = DbgValues.begin(), E = DbgValues.end();
3036 I != E; ++I) {
3037 SmallVectorImpl<const MachineInstr*> &History = I->second;
3038 if (History.empty())
3039 continue;
3040
3041 // Make sure the final register assignments are terminated.
3042 const MachineInstr *Prev = History.back();
3043 if (Prev->isDebugValue() && isDbgValueInDefinedReg(Prev)) {
3044 const MachineBasicBlock *PrevMBB = Prev->getParent();
3045 MachineBasicBlock::const_iterator LastMI = PrevMBB->getLastNonDebugInstr();
3046 if (LastMI == PrevMBB->end())
3047 // Drop DBG_VALUE for empty range.
3048 History.pop_back();
3049 else {
3050 // Terminate after LastMI.
3051 History.push_back(LastMI);
3052 }
3053 }
3054 // Request labels for the full history.
3055 for (unsigned i = 0, e = History.size(); i != e; ++i) {
3056 const MachineInstr *MI = History[i];
3057 if (MI->isDebugValue())
3058 requestLabelBeforeInsn(MI);
3059 else
3060 requestLabelAfterInsn(MI);
3061 }
3062 }
Devang Patelb2b31a62010-05-26 19:37:24 +00003063
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00003064 PrevInstLoc = DebugLoc();
Devang Patelb2b31a62010-05-26 19:37:24 +00003065 PrevLabel = FunctionBeginSym;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00003066}
3067
Devang Patel2c4ceb12009-11-21 02:48:08 +00003068/// endFunction - Gather and emit post-function debug information.
Bill Wendlingf0fb9872009-05-20 23:19:06 +00003069///
Chris Lattnereec791a2010-01-26 23:18:02 +00003070void DwarfDebug::endFunction(const MachineFunction *MF) {
Bill Wendling5f017e82010-04-07 09:28:04 +00003071 if (!MMI->hasDebugInfo() || DbgScopeMap.empty()) return;
Devang Patel70d75ca2009-11-12 19:02:56 +00003072
Devang Patel344130e2010-01-04 20:44:00 +00003073 if (CurrentFnDbgScope) {
Devang Patel65eb4822010-05-22 00:04:14 +00003074
Devang Patelc3f5f782010-05-25 23:40:22 +00003075 // Define end label for subprogram.
3076 FunctionEndSym = Asm->GetTempSymbol("func_end",
3077 Asm->getFunctionNumber());
3078 // Assumes in correct section after the entry point.
3079 Asm->OutStreamer.EmitLabel(FunctionEndSym);
Jim Grosbach1e20b962010-07-21 21:21:52 +00003080
Devang Patel78e127d2010-06-25 22:07:34 +00003081 SmallPtrSet<const MDNode *, 16> ProcessedVars;
3082 collectVariableInfo(MF, ProcessedVars);
Devang Patel65eb4822010-05-22 00:04:14 +00003083
Devang Patel344130e2010-01-04 20:44:00 +00003084 // Construct abstract scopes.
3085 for (SmallVector<DbgScope *, 4>::iterator AI = AbstractScopesList.begin(),
Devang Patel78e127d2010-06-25 22:07:34 +00003086 AE = AbstractScopesList.end(); AI != AE; ++AI) {
Devang Patel78e127d2010-06-25 22:07:34 +00003087 DISubprogram SP((*AI)->getScopeNode());
3088 if (SP.Verify()) {
3089 // Collect info for variables that were optimized out.
3090 StringRef FName = SP.getLinkageName();
3091 if (FName.empty())
3092 FName = SP.getName();
Devang Patel62367042010-11-10 22:19:21 +00003093 if (NamedMDNode *NMD =
3094 getFnSpecificMDNode(*(MF->getFunction()->getParent()), FName)) {
Devang Patel78e127d2010-06-25 22:07:34 +00003095 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
Dan Gohman872814a2010-07-21 18:54:18 +00003096 DIVariable DV(cast<MDNode>(NMD->getOperand(i)));
Devang Patel78e127d2010-06-25 22:07:34 +00003097 if (!DV || !ProcessedVars.insert(DV))
3098 continue;
Devang Patel1d68d212010-06-30 00:11:08 +00003099 DbgScope *Scope = AbstractScopes.lookup(DV.getContext());
Devang Patel78e127d2010-06-25 22:07:34 +00003100 if (Scope)
3101 Scope->addVariable(new DbgVariable(DV));
3102 }
3103 }
3104 }
Devang Patel90e19aa2010-06-30 01:40:11 +00003105 if (ProcessedSPNodes.count((*AI)->getScopeNode()) == 0)
3106 constructScopeDIE(*AI);
Devang Patel78e127d2010-06-25 22:07:34 +00003107 }
Devang Patel61409622010-07-07 20:12:52 +00003108
Devang Patel9c488372010-05-04 06:15:30 +00003109 DIE *CurFnDIE = constructScopeDIE(CurrentFnDbgScope);
Jim Grosbach1e20b962010-07-21 21:21:52 +00003110
Devang Patel9c488372010-05-04 06:15:30 +00003111 if (!DisableFramePointerElim(*MF))
Jim Grosbach1e20b962010-07-21 21:21:52 +00003112 addUInt(CurFnDIE, dwarf::DW_AT_APPLE_omit_frame_ptr,
Devang Patel9c488372010-05-04 06:15:30 +00003113 dwarf::DW_FORM_flag, 1);
3114
3115
Chris Lattnerd38fee82010-04-05 00:13:49 +00003116 DebugFrames.push_back(FunctionDebugFrameInfo(Asm->getFunctionNumber(),
Devang Patel344130e2010-01-04 20:44:00 +00003117 MMI->getFrameMoves()));
Bill Wendlingf0fb9872009-05-20 23:19:06 +00003118 }
3119
Bill Wendlingf0fb9872009-05-20 23:19:06 +00003120 // Clear debug info
Devang Patelf54b8522010-01-19 01:26:02 +00003121 CurrentFnDbgScope = NULL;
Devang Patel0478c152011-03-01 22:58:55 +00003122 CurrentFnArguments.clear();
Devang Patel26c1e562010-05-20 16:36:41 +00003123 DbgVariableToFrameIndexMap.clear();
3124 VarToAbstractVarMap.clear();
3125 DbgVariableToDbgInstMap.clear();
Jeffrey Yasskin5c213dc2010-03-12 17:45:06 +00003126 DeleteContainerSeconds(DbgScopeMap);
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00003127 UserVariables.clear();
3128 DbgValues.clear();
Devang Patelf54b8522010-01-19 01:26:02 +00003129 ConcreteScopes.clear();
Jeffrey Yasskin5c213dc2010-03-12 17:45:06 +00003130 DeleteContainerSeconds(AbstractScopes);
Devang Patelf54b8522010-01-19 01:26:02 +00003131 AbstractScopesList.clear();
Jeffrey Yasskin5c213dc2010-03-12 17:45:06 +00003132 AbstractVariables.clear();
Devang Pateleac9c072010-04-27 19:46:33 +00003133 LabelsBeforeInsn.clear();
3134 LabelsAfterInsn.clear();
Devang Patelf2548ca2010-04-16 23:33:45 +00003135 PrevLabel = NULL;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00003136}
3137
Devang Patel26c1e562010-05-20 16:36:41 +00003138/// recordVariableFrameIndex - Record a variable's index.
3139void DwarfDebug::recordVariableFrameIndex(const DbgVariable *V, int Index) {
3140 assert (V && "Invalid DbgVariable!");
3141 DbgVariableToFrameIndexMap[V] = Index;
3142}
3143
3144/// findVariableFrameIndex - Return true if frame index for the variable
3145/// is found. Update FI to hold value of the index.
3146bool DwarfDebug::findVariableFrameIndex(const DbgVariable *V, int *FI) {
3147 assert (V && "Invalid DbgVariable!");
3148 DenseMap<const DbgVariable *, int>::iterator I =
3149 DbgVariableToFrameIndexMap.find(V);
3150 if (I == DbgVariableToFrameIndexMap.end())
3151 return false;
3152 *FI = I->second;
3153 return true;
3154}
3155
Jim Grosbach1e20b962010-07-21 21:21:52 +00003156/// findDbgScope - Find DbgScope for the debug loc attached with an
Devang Patelee432862010-05-20 19:57:06 +00003157/// instruction.
3158DbgScope *DwarfDebug::findDbgScope(const MachineInstr *MInsn) {
3159 DbgScope *Scope = NULL;
Jim Grosbach1e20b962010-07-21 21:21:52 +00003160 LLVMContext &Ctx =
Devang Patelee432862010-05-20 19:57:06 +00003161 MInsn->getParent()->getParent()->getFunction()->getContext();
3162 DebugLoc DL = MInsn->getDebugLoc();
3163
Jim Grosbach1e20b962010-07-21 21:21:52 +00003164 if (DL.isUnknown())
Devang Patelee432862010-05-20 19:57:06 +00003165 return Scope;
3166
3167 if (const MDNode *IA = DL.getInlinedAt(Ctx))
3168 Scope = ConcreteScopes.lookup(IA);
3169 if (Scope == 0)
3170 Scope = DbgScopeMap.lookup(DL.getScope(Ctx));
Jim Grosbach1e20b962010-07-21 21:21:52 +00003171
Devang Patelee432862010-05-20 19:57:06 +00003172 return Scope;
3173}
3174
3175
Chris Lattnerc6087842010-03-09 04:54:43 +00003176/// recordSourceLine - Register a source line with debug info. Returns the
3177/// unique label that was emitted and which provides correspondence to
3178/// the source line list.
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00003179void DwarfDebug::recordSourceLine(unsigned Line, unsigned Col, const MDNode *S){
Devang Patel65dbc902009-11-25 17:36:49 +00003180 StringRef Fn;
Devang Patel23670e52011-03-24 20:30:50 +00003181 StringRef Dir;
Dan Gohman1cc0d622010-05-05 23:41:32 +00003182 unsigned Src = 1;
3183 if (S) {
3184 DIDescriptor Scope(S);
Devang Patelf84548d2009-10-05 18:03:19 +00003185
Dan Gohman1cc0d622010-05-05 23:41:32 +00003186 if (Scope.isCompileUnit()) {
3187 DICompileUnit CU(S);
Dan Gohman1cc0d622010-05-05 23:41:32 +00003188 Fn = CU.getFilename();
Devang Patel23670e52011-03-24 20:30:50 +00003189 Dir = CU.getDirectory();
Devang Patel3cabc9d2010-10-28 17:30:52 +00003190 } else if (Scope.isFile()) {
3191 DIFile F(S);
Devang Patel3cabc9d2010-10-28 17:30:52 +00003192 Fn = F.getFilename();
Devang Patel23670e52011-03-24 20:30:50 +00003193 Dir = F.getDirectory();
Dan Gohman1cc0d622010-05-05 23:41:32 +00003194 } else if (Scope.isSubprogram()) {
3195 DISubprogram SP(S);
Dan Gohman1cc0d622010-05-05 23:41:32 +00003196 Fn = SP.getFilename();
Devang Patel23670e52011-03-24 20:30:50 +00003197 Dir = SP.getDirectory();
Dan Gohman1cc0d622010-05-05 23:41:32 +00003198 } else if (Scope.isLexicalBlock()) {
3199 DILexicalBlock DB(S);
Dan Gohman1cc0d622010-05-05 23:41:32 +00003200 Fn = DB.getFilename();
Devang Patel23670e52011-03-24 20:30:50 +00003201 Dir = DB.getDirectory();
Dan Gohman1cc0d622010-05-05 23:41:32 +00003202 } else
3203 assert(0 && "Unexpected scope info");
3204
Devang Patel23670e52011-03-24 20:30:50 +00003205 Src = GetOrCreateSourceID(Fn, Dir);
Dan Gohman1cc0d622010-05-05 23:41:32 +00003206 }
3207
Rafael Espindola5c055632010-11-18 02:04:25 +00003208 Asm->OutStreamer.EmitDwarfLocDirective(Src, Line, Col, DWARF2_FLAG_IS_STMT,
3209 0, 0);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00003210}
3211
Bill Wendling829e67b2009-05-20 23:22:40 +00003212//===----------------------------------------------------------------------===//
3213// Emit Methods
3214//===----------------------------------------------------------------------===//
3215
Devang Patel2c4ceb12009-11-21 02:48:08 +00003216/// computeSizeAndOffset - Compute the size and offset of a DIE.
Bill Wendling94d04b82009-05-20 23:21:38 +00003217///
Jim Grosbach7ab38df2009-11-22 19:20:36 +00003218unsigned
3219DwarfDebug::computeSizeAndOffset(DIE *Die, unsigned Offset, bool Last) {
Bill Wendling94d04b82009-05-20 23:21:38 +00003220 // Get the children.
3221 const std::vector<DIE *> &Children = Die->getChildren();
3222
3223 // If not last sibling and has children then add sibling offset attribute.
Jeffrey Yasskin638fe8d2010-03-22 18:47:14 +00003224 if (!Last && !Children.empty())
Benjamin Kramer345ef342010-03-31 19:34:01 +00003225 Die->addSiblingOffset(DIEValueAllocator);
Bill Wendling94d04b82009-05-20 23:21:38 +00003226
3227 // Record the abbreviation.
Devang Patel2c4ceb12009-11-21 02:48:08 +00003228 assignAbbrevNumber(Die->getAbbrev());
Bill Wendling94d04b82009-05-20 23:21:38 +00003229
3230 // Get the abbreviation for this DIE.
3231 unsigned AbbrevNumber = Die->getAbbrevNumber();
3232 const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
3233
3234 // Set DIE offset
3235 Die->setOffset(Offset);
3236
3237 // Start the size with the size of abbreviation code.
Chris Lattneraf76e592009-08-22 20:48:53 +00003238 Offset += MCAsmInfo::getULEB128Size(AbbrevNumber);
Bill Wendling94d04b82009-05-20 23:21:38 +00003239
3240 const SmallVector<DIEValue*, 32> &Values = Die->getValues();
3241 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
3242
3243 // Size the DIE attribute values.
3244 for (unsigned i = 0, N = Values.size(); i < N; ++i)
3245 // Size attribute value.
Chris Lattnera37d5382010-04-05 00:18:22 +00003246 Offset += Values[i]->SizeOf(Asm, AbbrevData[i].getForm());
Bill Wendling94d04b82009-05-20 23:21:38 +00003247
3248 // Size the DIE children if any.
3249 if (!Children.empty()) {
3250 assert(Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes &&
3251 "Children flag not set");
3252
3253 for (unsigned j = 0, M = Children.size(); j < M; ++j)
Devang Patel2c4ceb12009-11-21 02:48:08 +00003254 Offset = computeSizeAndOffset(Children[j], Offset, (j + 1) == M);
Bill Wendling94d04b82009-05-20 23:21:38 +00003255
3256 // End of children marker.
3257 Offset += sizeof(int8_t);
3258 }
3259
3260 Die->setSize(Offset - Die->getOffset());
3261 return Offset;
3262}
3263
Devang Patel2c4ceb12009-11-21 02:48:08 +00003264/// computeSizeAndOffsets - Compute the size and offset of all the DIEs.
Bill Wendling94d04b82009-05-20 23:21:38 +00003265///
Devang Patel2c4ceb12009-11-21 02:48:08 +00003266void DwarfDebug::computeSizeAndOffsets() {
Devang Patel163a9f72010-05-10 22:49:55 +00003267 unsigned PrevOffset = 0;
3268 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
3269 E = CUMap.end(); I != E; ++I) {
3270 // Compute size of compile unit header.
3271 static unsigned Offset = PrevOffset +
3272 sizeof(int32_t) + // Length of Compilation Unit Info
3273 sizeof(int16_t) + // DWARF version number
3274 sizeof(int32_t) + // Offset Into Abbrev. Section
3275 sizeof(int8_t); // Pointer Size (in bytes)
3276 computeSizeAndOffset(I->second->getCUDie(), Offset, true);
3277 PrevOffset = Offset;
3278 }
Bill Wendling94d04b82009-05-20 23:21:38 +00003279}
3280
Chris Lattner11b8f302010-04-04 23:02:02 +00003281/// EmitSectionSym - Switch to the specified MCSection and emit an assembler
3282/// temporary label to it if SymbolStem is specified.
Chris Lattner9c69e285532010-04-04 22:59:04 +00003283static MCSymbol *EmitSectionSym(AsmPrinter *Asm, const MCSection *Section,
Chris Lattner11b8f302010-04-04 23:02:02 +00003284 const char *SymbolStem = 0) {
Chris Lattner9c69e285532010-04-04 22:59:04 +00003285 Asm->OutStreamer.SwitchSection(Section);
Chris Lattner11b8f302010-04-04 23:02:02 +00003286 if (!SymbolStem) return 0;
Jim Grosbach1e20b962010-07-21 21:21:52 +00003287
Chris Lattner9c69e285532010-04-04 22:59:04 +00003288 MCSymbol *TmpSym = Asm->GetTempSymbol(SymbolStem);
3289 Asm->OutStreamer.EmitLabel(TmpSym);
3290 return TmpSym;
3291}
3292
3293/// EmitSectionLabels - Emit initial Dwarf sections with a label at
3294/// the start of each one.
Chris Lattnerfa070b02010-04-04 22:33:59 +00003295void DwarfDebug::EmitSectionLabels() {
Chris Lattner6c2f9e12009-08-19 05:49:37 +00003296 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
Daniel Dunbarf612ff62009-09-19 20:40:05 +00003297
Bill Wendling94d04b82009-05-20 23:21:38 +00003298 // Dwarf sections base addresses.
Chris Lattnerd38fee82010-04-05 00:13:49 +00003299 if (Asm->MAI->doesDwarfRequireFrameSection()) {
Chris Lattner9c69e285532010-04-04 22:59:04 +00003300 DwarfFrameSectionSym =
3301 EmitSectionSym(Asm, TLOF.getDwarfFrameSection(), "section_debug_frame");
3302 }
Bill Wendling94d04b82009-05-20 23:21:38 +00003303
Jim Grosbach1e20b962010-07-21 21:21:52 +00003304 DwarfInfoSectionSym =
Chris Lattner9c69e285532010-04-04 22:59:04 +00003305 EmitSectionSym(Asm, TLOF.getDwarfInfoSection(), "section_info");
Jim Grosbach1e20b962010-07-21 21:21:52 +00003306 DwarfAbbrevSectionSym =
Chris Lattner9c69e285532010-04-04 22:59:04 +00003307 EmitSectionSym(Asm, TLOF.getDwarfAbbrevSection(), "section_abbrev");
Chris Lattner11b8f302010-04-04 23:02:02 +00003308 EmitSectionSym(Asm, TLOF.getDwarfARangesSection());
Jim Grosbach1e20b962010-07-21 21:21:52 +00003309
Chris Lattner9c69e285532010-04-04 22:59:04 +00003310 if (const MCSection *MacroInfo = TLOF.getDwarfMacroInfoSection())
Chris Lattner11b8f302010-04-04 23:02:02 +00003311 EmitSectionSym(Asm, MacroInfo);
Bill Wendling94d04b82009-05-20 23:21:38 +00003312
Devang Patelaf608bd2010-08-24 00:06:12 +00003313 EmitSectionSym(Asm, TLOF.getDwarfLineSection(), "section_line");
Chris Lattner11b8f302010-04-04 23:02:02 +00003314 EmitSectionSym(Asm, TLOF.getDwarfLocSection());
3315 EmitSectionSym(Asm, TLOF.getDwarfPubNamesSection());
3316 EmitSectionSym(Asm, TLOF.getDwarfPubTypesSection());
Jim Grosbach1e20b962010-07-21 21:21:52 +00003317 DwarfStrSectionSym =
Chris Lattner9c69e285532010-04-04 22:59:04 +00003318 EmitSectionSym(Asm, TLOF.getDwarfStrSection(), "section_str");
Devang Patelf2548ca2010-04-16 23:33:45 +00003319 DwarfDebugRangeSectionSym = EmitSectionSym(Asm, TLOF.getDwarfRangesSection(),
3320 "debug_range");
Bill Wendling94d04b82009-05-20 23:21:38 +00003321
Devang Patelc3f5f782010-05-25 23:40:22 +00003322 DwarfDebugLocSectionSym = EmitSectionSym(Asm, TLOF.getDwarfLocSection(),
3323 "section_debug_loc");
3324
Chris Lattner9c69e285532010-04-04 22:59:04 +00003325 TextSectionSym = EmitSectionSym(Asm, TLOF.getTextSection(), "text_begin");
Chris Lattner4ad1efe2010-04-04 23:10:38 +00003326 EmitSectionSym(Asm, TLOF.getDataSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00003327}
3328
Devang Patel2c4ceb12009-11-21 02:48:08 +00003329/// emitDIE - Recusively Emits a debug information entry.
Bill Wendling94d04b82009-05-20 23:21:38 +00003330///
Devang Patel2c4ceb12009-11-21 02:48:08 +00003331void DwarfDebug::emitDIE(DIE *Die) {
Bill Wendling94d04b82009-05-20 23:21:38 +00003332 // Get the abbreviation for this DIE.
3333 unsigned AbbrevNumber = Die->getAbbrevNumber();
3334 const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
3335
Bill Wendling94d04b82009-05-20 23:21:38 +00003336 // Emit the code (index) for the abbreviation.
Chris Lattner3f53c832010-04-04 18:52:31 +00003337 if (Asm->isVerbose())
Chris Lattner894d75a2010-01-22 23:18:42 +00003338 Asm->OutStreamer.AddComment("Abbrev [" + Twine(AbbrevNumber) + "] 0x" +
3339 Twine::utohexstr(Die->getOffset()) + ":0x" +
3340 Twine::utohexstr(Die->getSize()) + " " +
3341 dwarf::TagString(Abbrev->getTag()));
Chris Lattner7e1a8f82010-04-04 19:09:29 +00003342 Asm->EmitULEB128(AbbrevNumber);
Bill Wendling94d04b82009-05-20 23:21:38 +00003343
Jeffrey Yasskin638fe8d2010-03-22 18:47:14 +00003344 const SmallVector<DIEValue*, 32> &Values = Die->getValues();
Bill Wendling94d04b82009-05-20 23:21:38 +00003345 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
3346
3347 // Emit the DIE attribute values.
3348 for (unsigned i = 0, N = Values.size(); i < N; ++i) {
3349 unsigned Attr = AbbrevData[i].getAttribute();
3350 unsigned Form = AbbrevData[i].getForm();
3351 assert(Form && "Too many attributes for DIE (check abbreviation)");
3352
Chris Lattner3f53c832010-04-04 18:52:31 +00003353 if (Asm->isVerbose())
Chris Lattnera8013622010-01-24 18:54:17 +00003354 Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr));
Jim Grosbach1e20b962010-07-21 21:21:52 +00003355
Bill Wendling94d04b82009-05-20 23:21:38 +00003356 switch (Attr) {
3357 case dwarf::DW_AT_sibling:
Devang Patel2c4ceb12009-11-21 02:48:08 +00003358 Asm->EmitInt32(Die->getSiblingOffset());
Bill Wendling94d04b82009-05-20 23:21:38 +00003359 break;
3360 case dwarf::DW_AT_abstract_origin: {
3361 DIEEntry *E = cast<DIEEntry>(Values[i]);
3362 DIE *Origin = E->getEntry();
Devang Patel53bb5c92009-11-10 23:06:00 +00003363 unsigned Addr = Origin->getOffset();
Bill Wendling94d04b82009-05-20 23:21:38 +00003364 Asm->EmitInt32(Addr);
3365 break;
3366 }
Devang Patelf2548ca2010-04-16 23:33:45 +00003367 case dwarf::DW_AT_ranges: {
3368 // DW_AT_range Value encodes offset in debug_range section.
3369 DIEInteger *V = cast<DIEInteger>(Values[i]);
Devang Patelb1fcfbe2010-09-02 16:43:44 +00003370
3371 if (Asm->MAI->doesDwarfUsesLabelOffsetForRanges()) {
3372 Asm->EmitLabelPlusOffset(DwarfDebugRangeSectionSym,
3373 V->getValue(),
3374 4);
3375 } else {
3376 Asm->EmitLabelOffsetDifference(DwarfDebugRangeSectionSym,
3377 V->getValue(),
3378 DwarfDebugRangeSectionSym,
3379 4);
3380 }
Devang Patelf2548ca2010-04-16 23:33:45 +00003381 break;
3382 }
Devang Patelc3f5f782010-05-25 23:40:22 +00003383 case dwarf::DW_AT_location: {
3384 if (UseDotDebugLocEntry.count(Die) != 0) {
3385 DIELabel *L = cast<DIELabel>(Values[i]);
Daniel Dunbar83320a02011-03-16 22:16:39 +00003386 Asm->EmitLabelDifference(L->getValue(), DwarfDebugLocSectionSym, 4);
Devang Patelc3f5f782010-05-25 23:40:22 +00003387 } else
3388 Values[i]->EmitValue(Asm, Form);
3389 break;
3390 }
Devang Patel2a361602010-09-29 19:08:08 +00003391 case dwarf::DW_AT_accessibility: {
3392 if (Asm->isVerbose()) {
3393 DIEInteger *V = cast<DIEInteger>(Values[i]);
3394 Asm->OutStreamer.AddComment(dwarf::AccessibilityString(V->getValue()));
3395 }
3396 Values[i]->EmitValue(Asm, Form);
3397 break;
3398 }
Bill Wendling94d04b82009-05-20 23:21:38 +00003399 default:
3400 // Emit an attribute using the defined form.
Chris Lattnerd38fee82010-04-05 00:13:49 +00003401 Values[i]->EmitValue(Asm, Form);
Bill Wendling94d04b82009-05-20 23:21:38 +00003402 break;
3403 }
Bill Wendling94d04b82009-05-20 23:21:38 +00003404 }
3405
3406 // Emit the DIE children if any.
3407 if (Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes) {
3408 const std::vector<DIE *> &Children = Die->getChildren();
3409
3410 for (unsigned j = 0, M = Children.size(); j < M; ++j)
Devang Patel2c4ceb12009-11-21 02:48:08 +00003411 emitDIE(Children[j]);
Bill Wendling94d04b82009-05-20 23:21:38 +00003412
Chris Lattner3f53c832010-04-04 18:52:31 +00003413 if (Asm->isVerbose())
Chris Lattner233f52b2010-03-09 23:52:58 +00003414 Asm->OutStreamer.AddComment("End Of Children Mark");
3415 Asm->EmitInt8(0);
Bill Wendling94d04b82009-05-20 23:21:38 +00003416 }
3417}
3418
Devang Patel8a241142009-12-09 18:24:21 +00003419/// emitDebugInfo - Emit the debug info section.
Bill Wendling94d04b82009-05-20 23:21:38 +00003420///
Devang Patel8a241142009-12-09 18:24:21 +00003421void DwarfDebug::emitDebugInfo() {
3422 // Start debug info section.
3423 Asm->OutStreamer.SwitchSection(
3424 Asm->getObjFileLowering().getDwarfInfoSection());
Devang Patel163a9f72010-05-10 22:49:55 +00003425 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
3426 E = CUMap.end(); I != E; ++I) {
3427 CompileUnit *TheCU = I->second;
3428 DIE *Die = TheCU->getCUDie();
Jim Grosbach1e20b962010-07-21 21:21:52 +00003429
Devang Patel163a9f72010-05-10 22:49:55 +00003430 // Emit the compile units header.
3431 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_begin",
3432 TheCU->getID()));
Jim Grosbach1e20b962010-07-21 21:21:52 +00003433
Devang Patel163a9f72010-05-10 22:49:55 +00003434 // Emit size of content not including length itself
3435 unsigned ContentSize = Die->getSize() +
3436 sizeof(int16_t) + // DWARF version number
3437 sizeof(int32_t) + // Offset Into Abbrev. Section
3438 sizeof(int8_t) + // Pointer Size (in bytes)
3439 sizeof(int32_t); // FIXME - extra pad for gdb bug.
Jim Grosbach1e20b962010-07-21 21:21:52 +00003440
Devang Patel163a9f72010-05-10 22:49:55 +00003441 Asm->OutStreamer.AddComment("Length of Compilation Unit Info");
3442 Asm->EmitInt32(ContentSize);
3443 Asm->OutStreamer.AddComment("DWARF version number");
3444 Asm->EmitInt16(dwarf::DWARF_VERSION);
3445 Asm->OutStreamer.AddComment("Offset Into Abbrev. Section");
3446 Asm->EmitSectionOffset(Asm->GetTempSymbol("abbrev_begin"),
3447 DwarfAbbrevSectionSym);
3448 Asm->OutStreamer.AddComment("Address Size (in bytes)");
3449 Asm->EmitInt8(Asm->getTargetData().getPointerSize());
Jim Grosbach1e20b962010-07-21 21:21:52 +00003450
Devang Patel163a9f72010-05-10 22:49:55 +00003451 emitDIE(Die);
3452 // FIXME - extra padding for gdb bug.
3453 Asm->OutStreamer.AddComment("4 extra padding bytes for GDB");
3454 Asm->EmitInt8(0);
3455 Asm->EmitInt8(0);
3456 Asm->EmitInt8(0);
3457 Asm->EmitInt8(0);
3458 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_end", TheCU->getID()));
3459 }
Bill Wendling94d04b82009-05-20 23:21:38 +00003460}
3461
Devang Patel2c4ceb12009-11-21 02:48:08 +00003462/// emitAbbreviations - Emit the abbreviation section.
Bill Wendling94d04b82009-05-20 23:21:38 +00003463///
Devang Patel2c4ceb12009-11-21 02:48:08 +00003464void DwarfDebug::emitAbbreviations() const {
Bill Wendling94d04b82009-05-20 23:21:38 +00003465 // Check to see if it is worth the effort.
3466 if (!Abbreviations.empty()) {
3467 // Start the debug abbrev section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00003468 Asm->OutStreamer.SwitchSection(
3469 Asm->getObjFileLowering().getDwarfAbbrevSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00003470
Chris Lattnerc0215722010-04-04 19:25:43 +00003471 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_begin"));
Bill Wendling94d04b82009-05-20 23:21:38 +00003472
3473 // For each abbrevation.
3474 for (unsigned i = 0, N = Abbreviations.size(); i < N; ++i) {
3475 // Get abbreviation data
3476 const DIEAbbrev *Abbrev = Abbreviations[i];
3477
3478 // Emit the abbrevations code (base 1 index.)
Chris Lattner7e1a8f82010-04-04 19:09:29 +00003479 Asm->EmitULEB128(Abbrev->getNumber(), "Abbreviation Code");
Bill Wendling94d04b82009-05-20 23:21:38 +00003480
3481 // Emit the abbreviations data.
Chris Lattnerd38fee82010-04-05 00:13:49 +00003482 Abbrev->Emit(Asm);
Bill Wendling94d04b82009-05-20 23:21:38 +00003483 }
3484
3485 // Mark end of abbreviations.
Chris Lattner7e1a8f82010-04-04 19:09:29 +00003486 Asm->EmitULEB128(0, "EOM(3)");
Bill Wendling94d04b82009-05-20 23:21:38 +00003487
Chris Lattnerc0215722010-04-04 19:25:43 +00003488 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_end"));
Bill Wendling94d04b82009-05-20 23:21:38 +00003489 }
3490}
3491
Devang Patel2c4ceb12009-11-21 02:48:08 +00003492/// emitEndOfLineMatrix - Emit the last address of the section and the end of
Bill Wendling94d04b82009-05-20 23:21:38 +00003493/// the line matrix.
3494///
Devang Patel2c4ceb12009-11-21 02:48:08 +00003495void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) {
Bill Wendling94d04b82009-05-20 23:21:38 +00003496 // Define last address of section.
Chris Lattner233f52b2010-03-09 23:52:58 +00003497 Asm->OutStreamer.AddComment("Extended Op");
3498 Asm->EmitInt8(0);
Jim Grosbach1e20b962010-07-21 21:21:52 +00003499
Chris Lattner233f52b2010-03-09 23:52:58 +00003500 Asm->OutStreamer.AddComment("Op size");
Chris Lattnerd38fee82010-04-05 00:13:49 +00003501 Asm->EmitInt8(Asm->getTargetData().getPointerSize() + 1);
Chris Lattner233f52b2010-03-09 23:52:58 +00003502 Asm->OutStreamer.AddComment("DW_LNE_set_address");
3503 Asm->EmitInt8(dwarf::DW_LNE_set_address);
3504
3505 Asm->OutStreamer.AddComment("Section end label");
Chris Lattnerd85fc6e2010-03-10 01:17:49 +00003506
Chris Lattnerc0215722010-04-04 19:25:43 +00003507 Asm->OutStreamer.EmitSymbolValue(Asm->GetTempSymbol("section_end",SectionEnd),
Chris Lattnerd38fee82010-04-05 00:13:49 +00003508 Asm->getTargetData().getPointerSize(),
3509 0/*AddrSpace*/);
Bill Wendling94d04b82009-05-20 23:21:38 +00003510
3511 // Mark end of matrix.
Chris Lattner233f52b2010-03-09 23:52:58 +00003512 Asm->OutStreamer.AddComment("DW_LNE_end_sequence");
3513 Asm->EmitInt8(0);
Chris Lattner0ad9c912010-01-22 22:09:00 +00003514 Asm->EmitInt8(1);
Chris Lattner894d75a2010-01-22 23:18:42 +00003515 Asm->EmitInt8(1);
Bill Wendling94d04b82009-05-20 23:21:38 +00003516}
3517
Devang Patel2c4ceb12009-11-21 02:48:08 +00003518/// emitCommonDebugFrame - Emit common frame info into a debug frame section.
Bill Wendling94d04b82009-05-20 23:21:38 +00003519///
Devang Patel2c4ceb12009-11-21 02:48:08 +00003520void DwarfDebug::emitCommonDebugFrame() {
Chris Lattnerd38fee82010-04-05 00:13:49 +00003521 if (!Asm->MAI->doesDwarfRequireFrameSection())
Bill Wendling94d04b82009-05-20 23:21:38 +00003522 return;
3523
Chris Lattnerd38fee82010-04-05 00:13:49 +00003524 int stackGrowth = Asm->getTargetData().getPointerSize();
Anton Korobeynikov16c29b52011-01-10 12:39:04 +00003525 if (Asm->TM.getFrameLowering()->getStackGrowthDirection() ==
3526 TargetFrameLowering::StackGrowsDown)
Chris Lattnerd38fee82010-04-05 00:13:49 +00003527 stackGrowth *= -1;
Bill Wendling94d04b82009-05-20 23:21:38 +00003528
3529 // Start the dwarf frame section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00003530 Asm->OutStreamer.SwitchSection(
3531 Asm->getObjFileLowering().getDwarfFrameSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00003532
Chris Lattnerc0215722010-04-04 19:25:43 +00003533 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_frame_common"));
Chris Lattner233f52b2010-03-09 23:52:58 +00003534 Asm->OutStreamer.AddComment("Length of Common Information Entry");
Chris Lattnera6437182010-04-04 19:58:12 +00003535 Asm->EmitLabelDifference(Asm->GetTempSymbol("debug_frame_common_end"),
3536 Asm->GetTempSymbol("debug_frame_common_begin"), 4);
Bill Wendling94d04b82009-05-20 23:21:38 +00003537
Chris Lattnerc0215722010-04-04 19:25:43 +00003538 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_frame_common_begin"));
Chris Lattner233f52b2010-03-09 23:52:58 +00003539 Asm->OutStreamer.AddComment("CIE Identifier Tag");
Bill Wendling94d04b82009-05-20 23:21:38 +00003540 Asm->EmitInt32((int)dwarf::DW_CIE_ID);
Chris Lattner233f52b2010-03-09 23:52:58 +00003541 Asm->OutStreamer.AddComment("CIE Version");
Bill Wendling94d04b82009-05-20 23:21:38 +00003542 Asm->EmitInt8(dwarf::DW_CIE_VERSION);
Chris Lattner233f52b2010-03-09 23:52:58 +00003543 Asm->OutStreamer.AddComment("CIE Augmentation");
Chris Lattner4cf202b2010-01-23 03:11:46 +00003544 Asm->OutStreamer.EmitIntValue(0, 1, /*addrspace*/0); // nul terminator.
Chris Lattner7e1a8f82010-04-04 19:09:29 +00003545 Asm->EmitULEB128(1, "CIE Code Alignment Factor");
3546 Asm->EmitSLEB128(stackGrowth, "CIE Data Alignment Factor");
Chris Lattner233f52b2010-03-09 23:52:58 +00003547 Asm->OutStreamer.AddComment("CIE RA Column");
Chris Lattnerd38fee82010-04-05 00:13:49 +00003548 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
Anton Korobeynikov16c29b52011-01-10 12:39:04 +00003549 const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
Bill Wendling94d04b82009-05-20 23:21:38 +00003550 Asm->EmitInt8(RI->getDwarfRegNum(RI->getRARegister(), false));
Bill Wendling94d04b82009-05-20 23:21:38 +00003551
3552 std::vector<MachineMove> Moves;
Anton Korobeynikovd9e33852010-11-18 23:25:52 +00003553 TFI->getInitialFrameState(Moves);
Bill Wendling94d04b82009-05-20 23:21:38 +00003554
Chris Lattner02b86b92010-04-04 23:41:46 +00003555 Asm->EmitFrameMoves(Moves, 0, false);
Bill Wendling94d04b82009-05-20 23:21:38 +00003556
Chris Lattner059ea132010-04-28 01:05:45 +00003557 Asm->EmitAlignment(2);
Chris Lattnerc0215722010-04-04 19:25:43 +00003558 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_frame_common_end"));
Bill Wendling94d04b82009-05-20 23:21:38 +00003559}
3560
Devang Patel2c4ceb12009-11-21 02:48:08 +00003561/// emitFunctionDebugFrame - Emit per function frame info into a debug frame
Bill Wendling94d04b82009-05-20 23:21:38 +00003562/// section.
Chris Lattner206d61e2010-03-13 07:26:18 +00003563void DwarfDebug::
3564emitFunctionDebugFrame(const FunctionDebugFrameInfo &DebugFrameInfo) {
Chris Lattnerd38fee82010-04-05 00:13:49 +00003565 if (!Asm->MAI->doesDwarfRequireFrameSection())
Bill Wendling94d04b82009-05-20 23:21:38 +00003566 return;
3567
3568 // Start the dwarf frame section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00003569 Asm->OutStreamer.SwitchSection(
3570 Asm->getObjFileLowering().getDwarfFrameSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00003571
Chris Lattner233f52b2010-03-09 23:52:58 +00003572 Asm->OutStreamer.AddComment("Length of Frame Information Entry");
Chris Lattner206d61e2010-03-13 07:26:18 +00003573 MCSymbol *DebugFrameBegin =
Chris Lattnerc0215722010-04-04 19:25:43 +00003574 Asm->GetTempSymbol("debug_frame_begin", DebugFrameInfo.Number);
Chris Lattner206d61e2010-03-13 07:26:18 +00003575 MCSymbol *DebugFrameEnd =
Chris Lattnerc0215722010-04-04 19:25:43 +00003576 Asm->GetTempSymbol("debug_frame_end", DebugFrameInfo.Number);
Chris Lattnera6437182010-04-04 19:58:12 +00003577 Asm->EmitLabelDifference(DebugFrameEnd, DebugFrameBegin, 4);
Bill Wendling94d04b82009-05-20 23:21:38 +00003578
Chris Lattner206d61e2010-03-13 07:26:18 +00003579 Asm->OutStreamer.EmitLabel(DebugFrameBegin);
Bill Wendling94d04b82009-05-20 23:21:38 +00003580
Chris Lattner233f52b2010-03-09 23:52:58 +00003581 Asm->OutStreamer.AddComment("FDE CIE offset");
Jim Grosbach1e20b962010-07-21 21:21:52 +00003582 Asm->EmitSectionOffset(Asm->GetTempSymbol("debug_frame_common"),
Chris Lattner6189ed12010-04-04 23:25:33 +00003583 DwarfFrameSectionSym);
Bill Wendling94d04b82009-05-20 23:21:38 +00003584
Chris Lattner233f52b2010-03-09 23:52:58 +00003585 Asm->OutStreamer.AddComment("FDE initial location");
Chris Lattnerc0215722010-04-04 19:25:43 +00003586 MCSymbol *FuncBeginSym =
3587 Asm->GetTempSymbol("func_begin", DebugFrameInfo.Number);
Chris Lattnerfb658072010-03-13 07:40:56 +00003588 Asm->OutStreamer.EmitSymbolValue(FuncBeginSym,
Chris Lattnerd38fee82010-04-05 00:13:49 +00003589 Asm->getTargetData().getPointerSize(),
3590 0/*AddrSpace*/);
Jim Grosbach1e20b962010-07-21 21:21:52 +00003591
3592
Chris Lattner233f52b2010-03-09 23:52:58 +00003593 Asm->OutStreamer.AddComment("FDE address range");
Chris Lattnera6437182010-04-04 19:58:12 +00003594 Asm->EmitLabelDifference(Asm->GetTempSymbol("func_end",DebugFrameInfo.Number),
Chris Lattnerd38fee82010-04-05 00:13:49 +00003595 FuncBeginSym, Asm->getTargetData().getPointerSize());
Bill Wendling94d04b82009-05-20 23:21:38 +00003596
Chris Lattner02b86b92010-04-04 23:41:46 +00003597 Asm->EmitFrameMoves(DebugFrameInfo.Moves, FuncBeginSym, false);
Bill Wendling94d04b82009-05-20 23:21:38 +00003598
Chris Lattner059ea132010-04-28 01:05:45 +00003599 Asm->EmitAlignment(2);
Chris Lattner206d61e2010-03-13 07:26:18 +00003600 Asm->OutStreamer.EmitLabel(DebugFrameEnd);
Bill Wendling94d04b82009-05-20 23:21:38 +00003601}
3602
Devang Patel8a241142009-12-09 18:24:21 +00003603/// emitDebugPubNames - Emit visible names into a debug pubnames section.
3604///
3605void DwarfDebug::emitDebugPubNames() {
Devang Patel163a9f72010-05-10 22:49:55 +00003606 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
3607 E = CUMap.end(); I != E; ++I) {
3608 CompileUnit *TheCU = I->second;
3609 // Start the dwarf pubnames section.
3610 Asm->OutStreamer.SwitchSection(
3611 Asm->getObjFileLowering().getDwarfPubNamesSection());
Jim Grosbach1e20b962010-07-21 21:21:52 +00003612
Devang Patel163a9f72010-05-10 22:49:55 +00003613 Asm->OutStreamer.AddComment("Length of Public Names Info");
3614 Asm->EmitLabelDifference(
3615 Asm->GetTempSymbol("pubnames_end", TheCU->getID()),
3616 Asm->GetTempSymbol("pubnames_begin", TheCU->getID()), 4);
Jim Grosbach1e20b962010-07-21 21:21:52 +00003617
Devang Patel163a9f72010-05-10 22:49:55 +00003618 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_begin",
3619 TheCU->getID()));
Jim Grosbach1e20b962010-07-21 21:21:52 +00003620
Devang Patel163a9f72010-05-10 22:49:55 +00003621 Asm->OutStreamer.AddComment("DWARF Version");
Jim Grosbach1e20b962010-07-21 21:21:52 +00003622 Asm->EmitInt16(dwarf::DWARF_VERSION);
3623
Devang Patel163a9f72010-05-10 22:49:55 +00003624 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
Jim Grosbach1e20b962010-07-21 21:21:52 +00003625 Asm->EmitSectionOffset(Asm->GetTempSymbol("info_begin", TheCU->getID()),
Devang Patel163a9f72010-05-10 22:49:55 +00003626 DwarfInfoSectionSym);
Jim Grosbach1e20b962010-07-21 21:21:52 +00003627
Devang Patel163a9f72010-05-10 22:49:55 +00003628 Asm->OutStreamer.AddComment("Compilation Unit Length");
3629 Asm->EmitLabelDifference(Asm->GetTempSymbol("info_end", TheCU->getID()),
3630 Asm->GetTempSymbol("info_begin", TheCU->getID()),
3631 4);
Jim Grosbach1e20b962010-07-21 21:21:52 +00003632
Devang Patel163a9f72010-05-10 22:49:55 +00003633 const StringMap<DIE*> &Globals = TheCU->getGlobals();
3634 for (StringMap<DIE*>::const_iterator
3635 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
3636 const char *Name = GI->getKeyData();
3637 DIE *Entity = GI->second;
Jim Grosbach1e20b962010-07-21 21:21:52 +00003638
Devang Patel163a9f72010-05-10 22:49:55 +00003639 Asm->OutStreamer.AddComment("DIE offset");
3640 Asm->EmitInt32(Entity->getOffset());
Jim Grosbach1e20b962010-07-21 21:21:52 +00003641
Devang Patel163a9f72010-05-10 22:49:55 +00003642 if (Asm->isVerbose())
3643 Asm->OutStreamer.AddComment("External Name");
3644 Asm->OutStreamer.EmitBytes(StringRef(Name, strlen(Name)+1), 0);
3645 }
Jim Grosbach1e20b962010-07-21 21:21:52 +00003646
Devang Patel163a9f72010-05-10 22:49:55 +00003647 Asm->OutStreamer.AddComment("End Mark");
3648 Asm->EmitInt32(0);
3649 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_end",
3650 TheCU->getID()));
Bill Wendling94d04b82009-05-20 23:21:38 +00003651 }
Bill Wendling94d04b82009-05-20 23:21:38 +00003652}
3653
Devang Patel193f7202009-11-24 01:14:22 +00003654void DwarfDebug::emitDebugPubTypes() {
Devang Patel163a9f72010-05-10 22:49:55 +00003655 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
3656 E = CUMap.end(); I != E; ++I) {
3657 CompileUnit *TheCU = I->second;
3658 // Start the dwarf pubnames section.
3659 Asm->OutStreamer.SwitchSection(
3660 Asm->getObjFileLowering().getDwarfPubTypesSection());
3661 Asm->OutStreamer.AddComment("Length of Public Types Info");
3662 Asm->EmitLabelDifference(
3663 Asm->GetTempSymbol("pubtypes_end", TheCU->getID()),
3664 Asm->GetTempSymbol("pubtypes_begin", TheCU->getID()), 4);
Jim Grosbach1e20b962010-07-21 21:21:52 +00003665
Devang Patel163a9f72010-05-10 22:49:55 +00003666 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_begin",
3667 TheCU->getID()));
Jim Grosbach1e20b962010-07-21 21:21:52 +00003668
Devang Patel163a9f72010-05-10 22:49:55 +00003669 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DWARF Version");
3670 Asm->EmitInt16(dwarf::DWARF_VERSION);
Jim Grosbach1e20b962010-07-21 21:21:52 +00003671
Devang Patel163a9f72010-05-10 22:49:55 +00003672 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
3673 Asm->EmitSectionOffset(Asm->GetTempSymbol("info_begin", TheCU->getID()),
3674 DwarfInfoSectionSym);
Jim Grosbach1e20b962010-07-21 21:21:52 +00003675
Devang Patel163a9f72010-05-10 22:49:55 +00003676 Asm->OutStreamer.AddComment("Compilation Unit Length");
3677 Asm->EmitLabelDifference(Asm->GetTempSymbol("info_end", TheCU->getID()),
3678 Asm->GetTempSymbol("info_begin", TheCU->getID()),
3679 4);
Jim Grosbach1e20b962010-07-21 21:21:52 +00003680
Devang Patel163a9f72010-05-10 22:49:55 +00003681 const StringMap<DIE*> &Globals = TheCU->getGlobalTypes();
3682 for (StringMap<DIE*>::const_iterator
3683 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
3684 const char *Name = GI->getKeyData();
3685 DIE * Entity = GI->second;
Jim Grosbach1e20b962010-07-21 21:21:52 +00003686
Devang Patel163a9f72010-05-10 22:49:55 +00003687 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
3688 Asm->EmitInt32(Entity->getOffset());
Jim Grosbach1e20b962010-07-21 21:21:52 +00003689
Devang Patel163a9f72010-05-10 22:49:55 +00003690 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("External Name");
3691 Asm->OutStreamer.EmitBytes(StringRef(Name, GI->getKeyLength()+1), 0);
3692 }
Jim Grosbach1e20b962010-07-21 21:21:52 +00003693
Devang Patel163a9f72010-05-10 22:49:55 +00003694 Asm->OutStreamer.AddComment("End Mark");
Jim Grosbach1e20b962010-07-21 21:21:52 +00003695 Asm->EmitInt32(0);
Devang Patel163a9f72010-05-10 22:49:55 +00003696 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_end",
3697 TheCU->getID()));
Devang Patel193f7202009-11-24 01:14:22 +00003698 }
Devang Patel193f7202009-11-24 01:14:22 +00003699}
3700
Devang Patel2c4ceb12009-11-21 02:48:08 +00003701/// emitDebugStr - Emit visible names into a debug str section.
Bill Wendling94d04b82009-05-20 23:21:38 +00003702///
Devang Patel2c4ceb12009-11-21 02:48:08 +00003703void DwarfDebug::emitDebugStr() {
Bill Wendling94d04b82009-05-20 23:21:38 +00003704 // Check to see if it is worth the effort.
Chris Lattner0d9d70f2010-03-09 23:38:23 +00003705 if (StringPool.empty()) return;
Jim Grosbach1e20b962010-07-21 21:21:52 +00003706
Chris Lattner0d9d70f2010-03-09 23:38:23 +00003707 // Start the dwarf str section.
3708 Asm->OutStreamer.SwitchSection(
Chris Lattner6c2f9e12009-08-19 05:49:37 +00003709 Asm->getObjFileLowering().getDwarfStrSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00003710
Chris Lattnerbc733f52010-03-13 02:17:42 +00003711 // Get all of the string pool entries and put them in an array by their ID so
3712 // we can sort them.
Jim Grosbach1e20b962010-07-21 21:21:52 +00003713 SmallVector<std::pair<unsigned,
Chris Lattnerbc733f52010-03-13 02:17:42 +00003714 StringMapEntry<std::pair<MCSymbol*, unsigned> >*>, 64> Entries;
Jim Grosbach1e20b962010-07-21 21:21:52 +00003715
Chris Lattnerbc733f52010-03-13 02:17:42 +00003716 for (StringMap<std::pair<MCSymbol*, unsigned> >::iterator
3717 I = StringPool.begin(), E = StringPool.end(); I != E; ++I)
3718 Entries.push_back(std::make_pair(I->second.second, &*I));
Jim Grosbach1e20b962010-07-21 21:21:52 +00003719
Chris Lattnerbc733f52010-03-13 02:17:42 +00003720 array_pod_sort(Entries.begin(), Entries.end());
Jim Grosbach1e20b962010-07-21 21:21:52 +00003721
Chris Lattnerbc733f52010-03-13 02:17:42 +00003722 for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
Chris Lattner0d9d70f2010-03-09 23:38:23 +00003723 // Emit a label for reference from debug information entries.
Chris Lattnerbc733f52010-03-13 02:17:42 +00003724 Asm->OutStreamer.EmitLabel(Entries[i].second->getValue().first);
Jim Grosbach1e20b962010-07-21 21:21:52 +00003725
Chris Lattner0d9d70f2010-03-09 23:38:23 +00003726 // Emit the string itself.
Chris Lattnerbc733f52010-03-13 02:17:42 +00003727 Asm->OutStreamer.EmitBytes(Entries[i].second->getKey(), 0/*addrspace*/);
Bill Wendling94d04b82009-05-20 23:21:38 +00003728 }
3729}
3730
Devang Patel2c4ceb12009-11-21 02:48:08 +00003731/// emitDebugLoc - Emit visible names into a debug loc section.
Bill Wendling94d04b82009-05-20 23:21:38 +00003732///
Devang Patel2c4ceb12009-11-21 02:48:08 +00003733void DwarfDebug::emitDebugLoc() {
Devang Patel80250682010-05-26 23:55:23 +00003734 if (DotDebugLocEntries.empty())
3735 return;
3736
Devang Patel6c3ea902011-02-04 22:57:18 +00003737 for (SmallVector<DotDebugLocEntry, 4>::iterator
3738 I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
3739 I != E; ++I) {
3740 DotDebugLocEntry &Entry = *I;
3741 if (I + 1 != DotDebugLocEntries.end())
3742 Entry.Merge(I+1);
3743 }
3744
Daniel Dunbar83320a02011-03-16 22:16:39 +00003745 // Start the dwarf loc section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00003746 Asm->OutStreamer.SwitchSection(
Devang Patelc3f5f782010-05-25 23:40:22 +00003747 Asm->getObjFileLowering().getDwarfLocSection());
3748 unsigned char Size = Asm->getTargetData().getPointerSize();
Devang Patel80250682010-05-26 23:55:23 +00003749 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", 0));
3750 unsigned index = 1;
Jim Grosbach1e20b962010-07-21 21:21:52 +00003751 for (SmallVector<DotDebugLocEntry, 4>::iterator
3752 I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
Devang Patel61409622010-07-07 20:12:52 +00003753 I != E; ++I, ++index) {
Devang Patel6c3ea902011-02-04 22:57:18 +00003754 DotDebugLocEntry &Entry = *I;
3755 if (Entry.isMerged()) continue;
Devang Patelc3f5f782010-05-25 23:40:22 +00003756 if (Entry.isEmpty()) {
3757 Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
3758 Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
Devang Patel80250682010-05-26 23:55:23 +00003759 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", index));
Devang Patelc3f5f782010-05-25 23:40:22 +00003760 } else {
3761 Asm->OutStreamer.EmitSymbolValue(Entry.Begin, Size, 0);
3762 Asm->OutStreamer.EmitSymbolValue(Entry.End, Size, 0);
3763 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
3764 unsigned Reg = RI->getDwarfRegNum(Entry.Loc.getReg(), false);
Devang Patelb2cf5812010-08-04 18:40:52 +00003765 if (int Offset = Entry.Loc.getOffset()) {
3766 // If the value is at a certain offset from frame register then
3767 // use DW_OP_fbreg.
3768 unsigned OffsetSize = Offset ? MCAsmInfo::getSLEB128Size(Offset) : 1;
Devang Patelc3f5f782010-05-25 23:40:22 +00003769 Asm->OutStreamer.AddComment("Loc expr size");
Devang Patelb2cf5812010-08-04 18:40:52 +00003770 Asm->EmitInt16(1 + OffsetSize);
3771 Asm->OutStreamer.AddComment(
3772 dwarf::OperationEncodingString(dwarf::DW_OP_fbreg));
3773 Asm->EmitInt8(dwarf::DW_OP_fbreg);
3774 Asm->OutStreamer.AddComment("Offset");
3775 Asm->EmitSLEB128(Offset);
Devang Patelc3f5f782010-05-25 23:40:22 +00003776 } else {
Devang Patelb2cf5812010-08-04 18:40:52 +00003777 if (Reg < 32) {
3778 Asm->OutStreamer.AddComment("Loc expr size");
3779 Asm->EmitInt16(1);
3780 Asm->OutStreamer.AddComment(
Devang Patela54e0cc2010-08-04 20:32:36 +00003781 dwarf::OperationEncodingString(dwarf::DW_OP_reg0 + Reg));
Devang Patelb2cf5812010-08-04 18:40:52 +00003782 Asm->EmitInt8(dwarf::DW_OP_reg0 + Reg);
3783 } else {
3784 Asm->OutStreamer.AddComment("Loc expr size");
3785 Asm->EmitInt16(1 + MCAsmInfo::getULEB128Size(Reg));
3786 Asm->EmitInt8(dwarf::DW_OP_regx);
3787 Asm->EmitULEB128(Reg);
3788 }
Devang Patelc3f5f782010-05-25 23:40:22 +00003789 }
3790 }
3791 }
Bill Wendling94d04b82009-05-20 23:21:38 +00003792}
3793
3794/// EmitDebugARanges - Emit visible names into a debug aranges section.
3795///
3796void DwarfDebug::EmitDebugARanges() {
3797 // Start the dwarf aranges section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00003798 Asm->OutStreamer.SwitchSection(
3799 Asm->getObjFileLowering().getDwarfARangesSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00003800}
3801
Devang Patel2c4ceb12009-11-21 02:48:08 +00003802/// emitDebugRanges - Emit visible names into a debug ranges section.
Bill Wendling94d04b82009-05-20 23:21:38 +00003803///
Devang Patel2c4ceb12009-11-21 02:48:08 +00003804void DwarfDebug::emitDebugRanges() {
Bill Wendling94d04b82009-05-20 23:21:38 +00003805 // Start the dwarf ranges section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00003806 Asm->OutStreamer.SwitchSection(
Devang Patelf2548ca2010-04-16 23:33:45 +00003807 Asm->getObjFileLowering().getDwarfRangesSection());
Devang Pateleac9c072010-04-27 19:46:33 +00003808 unsigned char Size = Asm->getTargetData().getPointerSize();
3809 for (SmallVector<const MCSymbol *, 8>::iterator
Jim Grosbach1e20b962010-07-21 21:21:52 +00003810 I = DebugRangeSymbols.begin(), E = DebugRangeSymbols.end();
Devang Pateleac9c072010-04-27 19:46:33 +00003811 I != E; ++I) {
3812 if (*I)
3813 Asm->OutStreamer.EmitSymbolValue(const_cast<MCSymbol*>(*I), Size, 0);
Devang Patelf2548ca2010-04-16 23:33:45 +00003814 else
Devang Pateleac9c072010-04-27 19:46:33 +00003815 Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
Devang Patelf2548ca2010-04-16 23:33:45 +00003816 }
Bill Wendling94d04b82009-05-20 23:21:38 +00003817}
3818
Devang Patel2c4ceb12009-11-21 02:48:08 +00003819/// emitDebugMacInfo - Emit visible names into a debug macinfo section.
Bill Wendling94d04b82009-05-20 23:21:38 +00003820///
Devang Patel2c4ceb12009-11-21 02:48:08 +00003821void DwarfDebug::emitDebugMacInfo() {
Daniel Dunbarf612ff62009-09-19 20:40:05 +00003822 if (const MCSection *LineInfo =
Chris Lattner18a4c162009-08-02 07:24:22 +00003823 Asm->getObjFileLowering().getDwarfMacroInfoSection()) {
Bill Wendling94d04b82009-05-20 23:21:38 +00003824 // Start the dwarf macinfo section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00003825 Asm->OutStreamer.SwitchSection(LineInfo);
Bill Wendling94d04b82009-05-20 23:21:38 +00003826 }
3827}
3828
Devang Patel2c4ceb12009-11-21 02:48:08 +00003829/// emitDebugInlineInfo - Emit inline info using following format.
Bill Wendling94d04b82009-05-20 23:21:38 +00003830/// Section Header:
3831/// 1. length of section
3832/// 2. Dwarf version number
3833/// 3. address size.
3834///
3835/// Entries (one "entry" for each function that was inlined):
3836///
3837/// 1. offset into __debug_str section for MIPS linkage name, if exists;
3838/// otherwise offset into __debug_str for regular function name.
3839/// 2. offset into __debug_str section for regular function name.
3840/// 3. an unsigned LEB128 number indicating the number of distinct inlining
3841/// instances for the function.
3842///
3843/// The rest of the entry consists of a {die_offset, low_pc} pair for each
3844/// inlined instance; the die_offset points to the inlined_subroutine die in the
3845/// __debug_info section, and the low_pc is the starting address for the
3846/// inlining instance.
Devang Patel2c4ceb12009-11-21 02:48:08 +00003847void DwarfDebug::emitDebugInlineInfo() {
Chris Lattnerd38fee82010-04-05 00:13:49 +00003848 if (!Asm->MAI->doesDwarfUsesInlineInfoSection())
Bill Wendling94d04b82009-05-20 23:21:38 +00003849 return;
3850
Devang Patel163a9f72010-05-10 22:49:55 +00003851 if (!FirstCU)
Bill Wendling94d04b82009-05-20 23:21:38 +00003852 return;
3853
Chris Lattner6c2f9e12009-08-19 05:49:37 +00003854 Asm->OutStreamer.SwitchSection(
3855 Asm->getObjFileLowering().getDwarfDebugInlineSection());
Chris Lattner0ad9c912010-01-22 22:09:00 +00003856
Chris Lattner233f52b2010-03-09 23:52:58 +00003857 Asm->OutStreamer.AddComment("Length of Debug Inlined Information Entry");
Chris Lattnera6437182010-04-04 19:58:12 +00003858 Asm->EmitLabelDifference(Asm->GetTempSymbol("debug_inlined_end", 1),
3859 Asm->GetTempSymbol("debug_inlined_begin", 1), 4);
Bill Wendling94d04b82009-05-20 23:21:38 +00003860
Chris Lattnerc0215722010-04-04 19:25:43 +00003861 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_begin", 1));
Bill Wendling94d04b82009-05-20 23:21:38 +00003862
Chris Lattner233f52b2010-03-09 23:52:58 +00003863 Asm->OutStreamer.AddComment("Dwarf Version");
3864 Asm->EmitInt16(dwarf::DWARF_VERSION);
3865 Asm->OutStreamer.AddComment("Address Size (in bytes)");
Chris Lattnerd38fee82010-04-05 00:13:49 +00003866 Asm->EmitInt8(Asm->getTargetData().getPointerSize());
Bill Wendling94d04b82009-05-20 23:21:38 +00003867
Devang Patele9f8f5e2010-05-07 20:54:48 +00003868 for (SmallVector<const MDNode *, 4>::iterator I = InlinedSPNodes.begin(),
Devang Patel53bb5c92009-11-10 23:06:00 +00003869 E = InlinedSPNodes.end(); I != E; ++I) {
Jim Grosbach31ef40e2009-11-21 23:12:12 +00003870
Devang Patele9f8f5e2010-05-07 20:54:48 +00003871 const MDNode *Node = *I;
3872 DenseMap<const MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator II
Jim Grosbach7ab38df2009-11-22 19:20:36 +00003873 = InlineInfo.find(Node);
Devang Patel53bb5c92009-11-10 23:06:00 +00003874 SmallVector<InlineInfoLabels, 4> &Labels = II->second;
Devang Patele4b27562009-08-28 23:24:31 +00003875 DISubprogram SP(Node);
Devang Patel65dbc902009-11-25 17:36:49 +00003876 StringRef LName = SP.getLinkageName();
3877 StringRef Name = SP.getName();
Bill Wendling94d04b82009-05-20 23:21:38 +00003878
Chris Lattner233f52b2010-03-09 23:52:58 +00003879 Asm->OutStreamer.AddComment("MIPS linkage name");
Chris Lattner4cf202b2010-01-23 03:11:46 +00003880 if (LName.empty()) {
3881 Asm->OutStreamer.EmitBytes(Name, 0);
3882 Asm->OutStreamer.EmitIntValue(0, 1, 0); // nul terminator.
Jim Grosbach1e20b962010-07-21 21:21:52 +00003883 } else
Chris Lattner6189ed12010-04-04 23:25:33 +00003884 Asm->EmitSectionOffset(getStringPoolEntry(getRealLinkageName(LName)),
3885 DwarfStrSectionSym);
Devang Patel53bb5c92009-11-10 23:06:00 +00003886
Chris Lattner233f52b2010-03-09 23:52:58 +00003887 Asm->OutStreamer.AddComment("Function name");
Chris Lattner6189ed12010-04-04 23:25:33 +00003888 Asm->EmitSectionOffset(getStringPoolEntry(Name), DwarfStrSectionSym);
Chris Lattner7e1a8f82010-04-04 19:09:29 +00003889 Asm->EmitULEB128(Labels.size(), "Inline count");
Bill Wendling94d04b82009-05-20 23:21:38 +00003890
Devang Patel53bb5c92009-11-10 23:06:00 +00003891 for (SmallVector<InlineInfoLabels, 4>::iterator LI = Labels.begin(),
Bill Wendling94d04b82009-05-20 23:21:38 +00003892 LE = Labels.end(); LI != LE; ++LI) {
Chris Lattner3f53c832010-04-04 18:52:31 +00003893 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
Chris Lattner6ed0f902010-03-09 00:31:02 +00003894 Asm->EmitInt32(LI->second->getOffset());
Bill Wendling94d04b82009-05-20 23:21:38 +00003895
Chris Lattner3f53c832010-04-04 18:52:31 +00003896 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("low_pc");
Chris Lattnerd38fee82010-04-05 00:13:49 +00003897 Asm->OutStreamer.EmitSymbolValue(LI->first,
3898 Asm->getTargetData().getPointerSize(),0);
Bill Wendling94d04b82009-05-20 23:21:38 +00003899 }
3900 }
3901
Chris Lattnerc0215722010-04-04 19:25:43 +00003902 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_end", 1));
Bill Wendling94d04b82009-05-20 23:21:38 +00003903}