blob: 9678078e76e571e0ec45dea36e21da43d1403f31 [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 Patelf4106082011-02-24 21:04:00 +0000484/// addSectionOffset - Add a Dwarf section relative label attribute data and
485/// value.
486///
487void DwarfDebug::addSectionOffset(DIE *Die, unsigned Attribute, unsigned Form,
488 const MCSymbol *Label) {
489 DIEValue *Value = new (DIEValueAllocator) DIESectionOffset(Label);
490 Die->addValue(Attribute, Form, Value);
491}
492
Devang Patel2c4ceb12009-11-21 02:48:08 +0000493/// addDelta - Add a label delta attribute data and value.
Bill Wendling0310d762009-05-15 09:23:25 +0000494///
Devang Patel2c4ceb12009-11-21 02:48:08 +0000495void DwarfDebug::addDelta(DIE *Die, unsigned Attribute, unsigned Form,
Chris Lattnerb98b1bf2010-03-08 22:23:36 +0000496 const MCSymbol *Hi, const MCSymbol *Lo) {
Benjamin Kramer345ef342010-03-31 19:34:01 +0000497 DIEValue *Value = new (DIEValueAllocator) DIEDelta(Hi, Lo);
Devang Patel2c4ceb12009-11-21 02:48:08 +0000498 Die->addValue(Attribute, Form, Value);
Bill Wendling0310d762009-05-15 09:23:25 +0000499}
500
Chris Lattner74e41f92010-04-05 05:24:55 +0000501/// addDIEEntry - Add a DIE attribute data and value.
502///
503void DwarfDebug::addDIEEntry(DIE *Die, unsigned Attribute, unsigned Form,
504 DIE *Entry) {
505 Die->addValue(Attribute, Form, createDIEEntry(Entry));
506}
507
508
Devang Patel2c4ceb12009-11-21 02:48:08 +0000509/// addBlock - Add block data.
Bill Wendling0310d762009-05-15 09:23:25 +0000510///
Devang Patel2c4ceb12009-11-21 02:48:08 +0000511void DwarfDebug::addBlock(DIE *Die, unsigned Attribute, unsigned Form,
Bill Wendling0310d762009-05-15 09:23:25 +0000512 DIEBlock *Block) {
Chris Lattnera37d5382010-04-05 00:18:22 +0000513 Block->ComputeSize(Asm);
Benjamin Kramer345ef342010-03-31 19:34:01 +0000514 DIEBlocks.push_back(Block); // Memoize so we can call the destructor later on.
Devang Patel2c4ceb12009-11-21 02:48:08 +0000515 Die->addValue(Attribute, Block->BestForm(), Block);
Bill Wendling0310d762009-05-15 09:23:25 +0000516}
517
Devang Patel2c4ceb12009-11-21 02:48:08 +0000518/// addSourceLine - Add location information to specified debug information
Bill Wendling0310d762009-05-15 09:23:25 +0000519/// entry.
Devang Patel85e95802010-08-10 04:09:06 +0000520void DwarfDebug::addSourceLine(DIE *Die, DIVariable V) {
Devang Patelc665a512010-05-07 23:33:41 +0000521 // Verify variable.
Devang Patel81625742010-08-09 20:20:05 +0000522 if (!V.Verify())
Bill Wendling0310d762009-05-15 09:23:25 +0000523 return;
524
Devang Patel81625742010-08-09 20:20:05 +0000525 unsigned Line = V.getLineNumber();
Devang Patelb2bada32010-10-08 17:18:54 +0000526 if (Line == 0)
527 return;
Rafael Espindola5c055632010-11-18 02:04:25 +0000528 unsigned FileID = GetOrCreateSourceID(V.getContext().getFilename());
Bill Wendling0310d762009-05-15 09:23:25 +0000529 assert(FileID && "Invalid file id");
Devang Patel2c4ceb12009-11-21 02:48:08 +0000530 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
531 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
Bill Wendling0310d762009-05-15 09:23:25 +0000532}
533
Devang Patel2c4ceb12009-11-21 02:48:08 +0000534/// addSourceLine - Add location information to specified debug information
Bill Wendling0310d762009-05-15 09:23:25 +0000535/// entry.
Devang Patel85e95802010-08-10 04:09:06 +0000536void DwarfDebug::addSourceLine(DIE *Die, DIGlobalVariable G) {
Devang Patelc665a512010-05-07 23:33:41 +0000537 // Verify global variable.
Devang Patel81625742010-08-09 20:20:05 +0000538 if (!G.Verify())
Bill Wendling0310d762009-05-15 09:23:25 +0000539 return;
540
Devang Patel81625742010-08-09 20:20:05 +0000541 unsigned Line = G.getLineNumber();
Devang Patelb2bada32010-10-08 17:18:54 +0000542 if (Line == 0)
543 return;
Rafael Espindola5c055632010-11-18 02:04:25 +0000544 unsigned FileID = GetOrCreateSourceID(G.getContext().getFilename());
Bill Wendling0310d762009-05-15 09:23:25 +0000545 assert(FileID && "Invalid file id");
Devang Patel2c4ceb12009-11-21 02:48:08 +0000546 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
547 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
Bill Wendling0310d762009-05-15 09:23:25 +0000548}
Devang Patel82dfc0c2009-08-31 22:47:13 +0000549
Devang Patel2c4ceb12009-11-21 02:48:08 +0000550/// addSourceLine - Add location information to specified debug information
Devang Patel82dfc0c2009-08-31 22:47:13 +0000551/// entry.
Devang Patel85e95802010-08-10 04:09:06 +0000552void DwarfDebug::addSourceLine(DIE *Die, DISubprogram SP) {
Devang Patelc665a512010-05-07 23:33:41 +0000553 // Verify subprogram.
Devang Patel81625742010-08-09 20:20:05 +0000554 if (!SP.Verify())
Devang Patel82dfc0c2009-08-31 22:47:13 +0000555 return;
Caroline Ticec6f9d622009-09-11 18:25:54 +0000556 // If the line number is 0, don't add it.
Devang Patel81625742010-08-09 20:20:05 +0000557 if (SP.getLineNumber() == 0)
Caroline Ticec6f9d622009-09-11 18:25:54 +0000558 return;
559
Devang Patel81625742010-08-09 20:20:05 +0000560 unsigned Line = SP.getLineNumber();
561 if (!SP.getContext().Verify())
Devang Patel77bf2952010-03-08 22:02:50 +0000562 return;
Rafael Espindola5c055632010-11-18 02:04:25 +0000563 unsigned FileID = GetOrCreateSourceID(SP.getFilename());
Devang Patel82dfc0c2009-08-31 22:47:13 +0000564 assert(FileID && "Invalid file id");
Devang Patel2c4ceb12009-11-21 02:48:08 +0000565 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
566 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
Devang Patel82dfc0c2009-08-31 22:47:13 +0000567}
568
Devang Patel2c4ceb12009-11-21 02:48:08 +0000569/// addSourceLine - Add location information to specified debug information
Devang Patel82dfc0c2009-08-31 22:47:13 +0000570/// entry.
Devang Patel85e95802010-08-10 04:09:06 +0000571void DwarfDebug::addSourceLine(DIE *Die, DIType Ty) {
Devang Patelc665a512010-05-07 23:33:41 +0000572 // Verify type.
Devang Patel81625742010-08-09 20:20:05 +0000573 if (!Ty.Verify())
Bill Wendling0310d762009-05-15 09:23:25 +0000574 return;
575
Devang Patel81625742010-08-09 20:20:05 +0000576 unsigned Line = Ty.getLineNumber();
Devang Patelb2bada32010-10-08 17:18:54 +0000577 if (Line == 0 || !Ty.getContext().Verify())
Devang Patel77bf2952010-03-08 22:02:50 +0000578 return;
Rafael Espindola5c055632010-11-18 02:04:25 +0000579 unsigned FileID = GetOrCreateSourceID(Ty.getFilename());
Bill Wendling0310d762009-05-15 09:23:25 +0000580 assert(FileID && "Invalid file id");
Devang Patel2c4ceb12009-11-21 02:48:08 +0000581 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
582 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
Bill Wendling0310d762009-05-15 09:23:25 +0000583}
584
Devang Patel6404e4e2009-12-15 19:16:48 +0000585/// addSourceLine - Add location information to specified debug information
586/// entry.
Devang Patel85e95802010-08-10 04:09:06 +0000587void DwarfDebug::addSourceLine(DIE *Die, DINameSpace NS) {
Devang Patelc665a512010-05-07 23:33:41 +0000588 // Verify namespace.
Devang Patel81625742010-08-09 20:20:05 +0000589 if (!NS.Verify())
Devang Patel6404e4e2009-12-15 19:16:48 +0000590 return;
591
Devang Patel81625742010-08-09 20:20:05 +0000592 unsigned Line = NS.getLineNumber();
Devang Patelb2bada32010-10-08 17:18:54 +0000593 if (Line == 0)
594 return;
Devang Patel81625742010-08-09 20:20:05 +0000595 StringRef FN = NS.getFilename();
Devang Patel6404e4e2009-12-15 19:16:48 +0000596
Rafael Espindola5c055632010-11-18 02:04:25 +0000597 unsigned FileID = GetOrCreateSourceID(FN);
Devang Patel6404e4e2009-12-15 19:16:48 +0000598 assert(FileID && "Invalid file id");
599 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
600 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
601}
602
Devang Patel9e3bd2c2010-08-31 06:11:28 +0000603/// addVariableAddress - Add DW_AT_location attribute for a DbgVariable based
604/// on provided frame index.
605void DwarfDebug::addVariableAddress(DbgVariable *&DV, DIE *Die, int64_t FI) {
606 MachineLocation Location;
607 unsigned FrameReg;
Anton Korobeynikov16c29b52011-01-10 12:39:04 +0000608 const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
Anton Korobeynikov82f58742010-11-20 15:59:32 +0000609 int Offset = TFI->getFrameIndexReference(*Asm->MF, FI, FrameReg);
Devang Patel9e3bd2c2010-08-31 06:11:28 +0000610 Location.set(FrameReg, Offset);
611
Devang Patel8bd11de2010-08-09 21:01:39 +0000612 if (DV->variableHasComplexAddress())
613 addComplexAddress(DV, Die, dwarf::DW_AT_location, Location);
614 else if (DV->isBlockByrefVariable())
615 addBlockByrefAddress(DV, Die, dwarf::DW_AT_location, Location);
616 else
617 addAddress(Die, dwarf::DW_AT_location, Location);
Caroline Ticedc8f6042009-08-31 21:19:37 +0000618}
619
Devang Patel2c4ceb12009-11-21 02:48:08 +0000620/// addComplexAddress - Start with the address based on the location provided,
Mike Stump3e4c9bd2009-09-30 00:08:22 +0000621/// and generate the DWARF information necessary to find the actual variable
622/// given the extra address information encoded in the DIVariable, starting from
623/// the starting location. Add the DWARF information to the die.
624///
Devang Patel2c4ceb12009-11-21 02:48:08 +0000625void DwarfDebug::addComplexAddress(DbgVariable *&DV, DIE *Die,
Mike Stump3e4c9bd2009-09-30 00:08:22 +0000626 unsigned Attribute,
627 const MachineLocation &Location) {
Devang Patel8bd11de2010-08-09 21:01:39 +0000628 DIType Ty = DV->getType();
Mike Stump3e4c9bd2009-09-30 00:08:22 +0000629
630 // Decode the original location, and use that as the start of the byref
631 // variable's location.
Chris Lattnerd38fee82010-04-05 00:13:49 +0000632 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
Mike Stump3e4c9bd2009-09-30 00:08:22 +0000633 unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
Benjamin Kramer345ef342010-03-31 19:34:01 +0000634 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Mike Stump3e4c9bd2009-09-30 00:08:22 +0000635
636 if (Location.isReg()) {
637 if (Reg < 32) {
Devang Patel2c4ceb12009-11-21 02:48:08 +0000638 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
Mike Stump3e4c9bd2009-09-30 00:08:22 +0000639 } else {
Devang Pateldacde942011-01-19 23:04:47 +0000640 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
Devang Patel2c4ceb12009-11-21 02:48:08 +0000641 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
Mike Stump3e4c9bd2009-09-30 00:08:22 +0000642 }
643 } else {
644 if (Reg < 32)
Devang Patel2c4ceb12009-11-21 02:48:08 +0000645 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
Mike Stump3e4c9bd2009-09-30 00:08:22 +0000646 else {
Devang Patel2c4ceb12009-11-21 02:48:08 +0000647 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
648 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
Mike Stump3e4c9bd2009-09-30 00:08:22 +0000649 }
650
Devang Patel2c4ceb12009-11-21 02:48:08 +0000651 addUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
Mike Stump3e4c9bd2009-09-30 00:08:22 +0000652 }
653
Devang Patel8bd11de2010-08-09 21:01:39 +0000654 for (unsigned i = 0, N = DV->getNumAddrElements(); i < N; ++i) {
655 uint64_t Element = DV->getAddrElement(i);
Mike Stump3e4c9bd2009-09-30 00:08:22 +0000656
Devang Patel0eea95d2011-02-24 18:49:30 +0000657 if (Element == DIBuilder::OpPlus) {
Devang Patel2c4ceb12009-11-21 02:48:08 +0000658 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
Devang Patel8bd11de2010-08-09 21:01:39 +0000659 addUInt(Block, 0, dwarf::DW_FORM_udata, DV->getAddrElement(++i));
Devang Patel0eea95d2011-02-24 18:49:30 +0000660 } else if (Element == DIBuilder::OpDeref) {
Devang Patel2c4ceb12009-11-21 02:48:08 +0000661 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Devang Patel0eea95d2011-02-24 18:49:30 +0000662 } else llvm_unreachable("unknown DIBuilder Opcode");
Mike Stump3e4c9bd2009-09-30 00:08:22 +0000663 }
664
665 // Now attach the location information to the DIE.
Devang Patel2c4ceb12009-11-21 02:48:08 +0000666 addBlock(Die, Attribute, 0, Block);
Mike Stump3e4c9bd2009-09-30 00:08:22 +0000667}
668
Caroline Ticedc8f6042009-08-31 21:19:37 +0000669/* Byref variables, in Blocks, are declared by the programmer as "SomeType
670 VarName;", but the compiler creates a __Block_byref_x_VarName struct, and
671 gives the variable VarName either the struct, or a pointer to the struct, as
672 its type. This is necessary for various behind-the-scenes things the
673 compiler needs to do with by-reference variables in Blocks.
674
675 However, as far as the original *programmer* is concerned, the variable
676 should still have type 'SomeType', as originally declared.
677
Devang Patel2c4ceb12009-11-21 02:48:08 +0000678 The function getBlockByrefType dives into the __Block_byref_x_VarName
Caroline Ticedc8f6042009-08-31 21:19:37 +0000679 struct to find the original type of the variable, which is then assigned to
680 the variable's Debug Information Entry as its real type. So far, so good.
681 However now the debugger will expect the variable VarName to have the type
682 SomeType. So we need the location attribute for the variable to be an
Daniel Dunbarf612ff62009-09-19 20:40:05 +0000683 expression that explains to the debugger how to navigate through the
Caroline Ticedc8f6042009-08-31 21:19:37 +0000684 pointers and struct to find the actual variable of type SomeType.
685
686 The following function does just that. We start by getting
687 the "normal" location for the variable. This will be the location
688 of either the struct __Block_byref_x_VarName or the pointer to the
689 struct __Block_byref_x_VarName.
690
691 The struct will look something like:
692
693 struct __Block_byref_x_VarName {
694 ... <various fields>
695 struct __Block_byref_x_VarName *forwarding;
696 ... <various other fields>
697 SomeType VarName;
698 ... <maybe more fields>
699 };
700
701 If we are given the struct directly (as our starting point) we
702 need to tell the debugger to:
703
704 1). Add the offset of the forwarding field.
705
Dan Gohmanf451cb82010-02-10 16:03:48 +0000706 2). Follow that pointer to get the real __Block_byref_x_VarName
Caroline Ticedc8f6042009-08-31 21:19:37 +0000707 struct to use (the real one may have been copied onto the heap).
708
709 3). Add the offset for the field VarName, to find the actual variable.
710
711 If we started with a pointer to the struct, then we need to
712 dereference that pointer first, before the other steps.
713 Translating this into DWARF ops, we will need to append the following
714 to the current location description for the variable:
715
716 DW_OP_deref -- optional, if we start with a pointer
717 DW_OP_plus_uconst <forward_fld_offset>
718 DW_OP_deref
719 DW_OP_plus_uconst <varName_fld_offset>
720
721 That is what this function does. */
722
Devang Patel2c4ceb12009-11-21 02:48:08 +0000723/// addBlockByrefAddress - Start with the address based on the location
Caroline Ticedc8f6042009-08-31 21:19:37 +0000724/// provided, and generate the DWARF information necessary to find the
725/// actual Block variable (navigating the Block struct) based on the
726/// starting location. Add the DWARF information to the die. For
727/// more information, read large comment just above here.
728///
Devang Patel2c4ceb12009-11-21 02:48:08 +0000729void DwarfDebug::addBlockByrefAddress(DbgVariable *&DV, DIE *Die,
Daniel Dunbar00564992009-09-19 20:40:14 +0000730 unsigned Attribute,
731 const MachineLocation &Location) {
Devang Patel8bd11de2010-08-09 21:01:39 +0000732 DIType Ty = DV->getType();
Caroline Ticedc8f6042009-08-31 21:19:37 +0000733 DIType TmpTy = Ty;
734 unsigned Tag = Ty.getTag();
735 bool isPointer = false;
736
Devang Patel8bd11de2010-08-09 21:01:39 +0000737 StringRef varName = DV->getName();
Caroline Ticedc8f6042009-08-31 21:19:37 +0000738
739 if (Tag == dwarf::DW_TAG_pointer_type) {
Devang Patel2db49d72010-05-07 18:11:54 +0000740 DIDerivedType DTy = DIDerivedType(Ty);
Caroline Ticedc8f6042009-08-31 21:19:37 +0000741 TmpTy = DTy.getTypeDerivedFrom();
742 isPointer = true;
743 }
744
Devang Patel2db49d72010-05-07 18:11:54 +0000745 DICompositeType blockStruct = DICompositeType(TmpTy);
Caroline Ticedc8f6042009-08-31 21:19:37 +0000746
Daniel Dunbar00564992009-09-19 20:40:14 +0000747 // Find the __forwarding field and the variable field in the __Block_byref
748 // struct.
Daniel Dunbar00564992009-09-19 20:40:14 +0000749 DIArray Fields = blockStruct.getTypeArray();
750 DIDescriptor varField = DIDescriptor();
751 DIDescriptor forwardingField = DIDescriptor();
Caroline Ticedc8f6042009-08-31 21:19:37 +0000752
Daniel Dunbar00564992009-09-19 20:40:14 +0000753 for (unsigned i = 0, N = Fields.getNumElements(); i < N; ++i) {
754 DIDescriptor Element = Fields.getElement(i);
Devang Patel2db49d72010-05-07 18:11:54 +0000755 DIDerivedType DT = DIDerivedType(Element);
Devang Patel65dbc902009-11-25 17:36:49 +0000756 StringRef fieldName = DT.getName();
757 if (fieldName == "__forwarding")
Daniel Dunbar00564992009-09-19 20:40:14 +0000758 forwardingField = Element;
Devang Patel65dbc902009-11-25 17:36:49 +0000759 else if (fieldName == varName)
Daniel Dunbar00564992009-09-19 20:40:14 +0000760 varField = Element;
761 }
Daniel Dunbarf612ff62009-09-19 20:40:05 +0000762
Daniel Dunbar00564992009-09-19 20:40:14 +0000763 // Get the offsets for the forwarding field and the variable field.
Chris Lattner1d65ba72010-03-31 06:06:37 +0000764 unsigned forwardingFieldOffset =
Devang Patel2db49d72010-05-07 18:11:54 +0000765 DIDerivedType(forwardingField).getOffsetInBits() >> 3;
Chris Lattner1d65ba72010-03-31 06:06:37 +0000766 unsigned varFieldOffset =
Devang Patel2db49d72010-05-07 18:11:54 +0000767 DIDerivedType(varField).getOffsetInBits() >> 3;
Caroline Ticedc8f6042009-08-31 21:19:37 +0000768
Mike Stump7e3720d2009-09-24 23:21:26 +0000769 // Decode the original location, and use that as the start of the byref
770 // variable's location.
Chris Lattnerd38fee82010-04-05 00:13:49 +0000771 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
Daniel Dunbar00564992009-09-19 20:40:14 +0000772 unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
Benjamin Kramer345ef342010-03-31 19:34:01 +0000773 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Caroline Ticedc8f6042009-08-31 21:19:37 +0000774
Daniel Dunbar00564992009-09-19 20:40:14 +0000775 if (Location.isReg()) {
776 if (Reg < 32)
Devang Patel2c4ceb12009-11-21 02:48:08 +0000777 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
Daniel Dunbar00564992009-09-19 20:40:14 +0000778 else {
Devang Pateldacde942011-01-19 23:04:47 +0000779 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
Devang Patel2c4ceb12009-11-21 02:48:08 +0000780 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
Daniel Dunbar00564992009-09-19 20:40:14 +0000781 }
782 } else {
783 if (Reg < 32)
Devang Patel2c4ceb12009-11-21 02:48:08 +0000784 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
Daniel Dunbar00564992009-09-19 20:40:14 +0000785 else {
Devang Patel2c4ceb12009-11-21 02:48:08 +0000786 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
787 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
Daniel Dunbar00564992009-09-19 20:40:14 +0000788 }
Caroline Ticedc8f6042009-08-31 21:19:37 +0000789
Devang Patel2c4ceb12009-11-21 02:48:08 +0000790 addUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
Daniel Dunbar00564992009-09-19 20:40:14 +0000791 }
Caroline Ticedc8f6042009-08-31 21:19:37 +0000792
Mike Stump7e3720d2009-09-24 23:21:26 +0000793 // If we started with a pointer to the __Block_byref... struct, then
Daniel Dunbar00564992009-09-19 20:40:14 +0000794 // the first thing we need to do is dereference the pointer (DW_OP_deref).
Daniel Dunbar00564992009-09-19 20:40:14 +0000795 if (isPointer)
Devang Patel2c4ceb12009-11-21 02:48:08 +0000796 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Caroline Ticedc8f6042009-08-31 21:19:37 +0000797
Daniel Dunbar00564992009-09-19 20:40:14 +0000798 // Next add the offset for the '__forwarding' field:
799 // DW_OP_plus_uconst ForwardingFieldOffset. Note there's no point in
800 // adding the offset if it's 0.
Daniel Dunbar00564992009-09-19 20:40:14 +0000801 if (forwardingFieldOffset > 0) {
Devang Patel2c4ceb12009-11-21 02:48:08 +0000802 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
803 addUInt(Block, 0, dwarf::DW_FORM_udata, forwardingFieldOffset);
Daniel Dunbar00564992009-09-19 20:40:14 +0000804 }
Caroline Ticedc8f6042009-08-31 21:19:37 +0000805
Daniel Dunbar00564992009-09-19 20:40:14 +0000806 // Now dereference the __forwarding field to get to the real __Block_byref
807 // struct: DW_OP_deref.
Devang Patel2c4ceb12009-11-21 02:48:08 +0000808 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Caroline Ticedc8f6042009-08-31 21:19:37 +0000809
Daniel Dunbar00564992009-09-19 20:40:14 +0000810 // Now that we've got the real __Block_byref... struct, add the offset
811 // for the variable's field to get to the location of the actual variable:
812 // DW_OP_plus_uconst varFieldOffset. Again, don't add if it's 0.
Daniel Dunbar00564992009-09-19 20:40:14 +0000813 if (varFieldOffset > 0) {
Devang Patel2c4ceb12009-11-21 02:48:08 +0000814 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
815 addUInt(Block, 0, dwarf::DW_FORM_udata, varFieldOffset);
Daniel Dunbar00564992009-09-19 20:40:14 +0000816 }
Caroline Ticedc8f6042009-08-31 21:19:37 +0000817
Daniel Dunbar00564992009-09-19 20:40:14 +0000818 // Now attach the location information to the DIE.
Devang Patel2c4ceb12009-11-21 02:48:08 +0000819 addBlock(Die, Attribute, 0, Block);
Caroline Ticedc8f6042009-08-31 21:19:37 +0000820}
821
Devang Patel2c4ceb12009-11-21 02:48:08 +0000822/// addAddress - Add an address attribute to a die based on the location
Bill Wendling0310d762009-05-15 09:23:25 +0000823/// provided.
Devang Patel2c4ceb12009-11-21 02:48:08 +0000824void DwarfDebug::addAddress(DIE *Die, unsigned Attribute,
Bill Wendling0310d762009-05-15 09:23:25 +0000825 const MachineLocation &Location) {
Chris Lattnerd38fee82010-04-05 00:13:49 +0000826 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
Bill Wendling0310d762009-05-15 09:23:25 +0000827 unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
Benjamin Kramer345ef342010-03-31 19:34:01 +0000828 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Devang Patelbe90c3a2010-09-22 21:10:38 +0000829
Devang Patelc8821042010-11-02 17:37:00 +0000830 if (RI->getFrameRegister(*Asm->MF) == Location.getReg()
Devang Patelbe90c3a2010-09-22 21:10:38 +0000831 && Location.getOffset()) {
832 // If variable offset is based in frame register then use fbreg.
833 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_fbreg);
834 addSInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
835 addBlock(Die, Attribute, 0, Block);
836 return;
837 }
Bill Wendling0310d762009-05-15 09:23:25 +0000838
839 if (Location.isReg()) {
840 if (Reg < 32) {
Devang Patel2c4ceb12009-11-21 02:48:08 +0000841 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + 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_regx);
844 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
Bill Wendling0310d762009-05-15 09:23:25 +0000845 }
846 } else {
847 if (Reg < 32) {
Devang Patel2c4ceb12009-11-21 02:48:08 +0000848 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
Bill Wendling0310d762009-05-15 09:23:25 +0000849 } else {
Devang Patel2c4ceb12009-11-21 02:48:08 +0000850 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
851 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
Bill Wendling0310d762009-05-15 09:23:25 +0000852 }
853
Devang Patel2c4ceb12009-11-21 02:48:08 +0000854 addUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
Bill Wendling0310d762009-05-15 09:23:25 +0000855 }
856
Devang Patel2c4ceb12009-11-21 02:48:08 +0000857 addBlock(Die, Attribute, 0, Block);
Bill Wendling0310d762009-05-15 09:23:25 +0000858}
859
Devang Patela43098d2010-04-28 01:03:09 +0000860/// addRegisterAddress - Add register location entry in variable DIE.
Devang Patel522ad742010-11-12 23:20:42 +0000861bool DwarfDebug::addRegisterAddress(DIE *Die, const MachineOperand &MO) {
Devang Patela43098d2010-04-28 01:03:09 +0000862 assert (MO.isReg() && "Invalid machine operand!");
863 if (!MO.getReg())
864 return false;
865 MachineLocation Location;
866 Location.set(MO.getReg());
867 addAddress(Die, dwarf::DW_AT_location, Location);
Devang Patela43098d2010-04-28 01:03:09 +0000868 return true;
869}
870
871/// addConstantValue - Add constant value entry in variable DIE.
Devang Patel522ad742010-11-12 23:20:42 +0000872bool DwarfDebug::addConstantValue(DIE *Die, const MachineOperand &MO) {
Devang Patela43098d2010-04-28 01:03:09 +0000873 assert (MO.isImm() && "Invalid machine operand!");
874 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
875 unsigned Imm = MO.getImm();
876 addUInt(Block, 0, dwarf::DW_FORM_udata, Imm);
877 addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
Devang Patela43098d2010-04-28 01:03:09 +0000878 return true;
879}
880
881/// addConstantFPValue - Add constant value entry in variable DIE.
Devang Patel522ad742010-11-12 23:20:42 +0000882bool DwarfDebug::addConstantFPValue(DIE *Die, const MachineOperand &MO) {
Devang Patela43098d2010-04-28 01:03:09 +0000883 assert (MO.isFPImm() && "Invalid machine operand!");
884 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
885 APFloat FPImm = MO.getFPImm()->getValueAPF();
Jim Grosbach1e20b962010-07-21 21:21:52 +0000886
Devang Patela43098d2010-04-28 01:03:09 +0000887 // Get the raw data form of the floating point.
888 const APInt FltVal = FPImm.bitcastToAPInt();
889 const char *FltPtr = (const char*)FltVal.getRawData();
Jim Grosbach1e20b962010-07-21 21:21:52 +0000890
Devang Patela43098d2010-04-28 01:03:09 +0000891 int NumBytes = FltVal.getBitWidth() / 8; // 8 bits per byte.
892 bool LittleEndian = Asm->getTargetData().isLittleEndian();
893 int Incr = (LittleEndian ? 1 : -1);
894 int Start = (LittleEndian ? 0 : NumBytes - 1);
895 int Stop = (LittleEndian ? NumBytes : -1);
Jim Grosbach1e20b962010-07-21 21:21:52 +0000896
Devang Patela43098d2010-04-28 01:03:09 +0000897 // Output the constant to DWARF one byte at a time.
898 for (; Start != Stop; Start += Incr)
899 addUInt(Block, 0, dwarf::DW_FORM_data1,
900 (unsigned char)0xFF & FltPtr[Start]);
Jim Grosbach1e20b962010-07-21 21:21:52 +0000901
Devang Patela43098d2010-04-28 01:03:09 +0000902 addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
Jim Grosbach1e20b962010-07-21 21:21:52 +0000903 return true;
Devang Patela43098d2010-04-28 01:03:09 +0000904}
905
Devang Patel76a788c2011-01-06 21:39:25 +0000906/// addConstantValue - Add constant value entry in variable DIE.
907bool DwarfDebug::addConstantValue(DIE *Die, ConstantInt *CI,
908 bool Unsigned) {
909 if (CI->getBitWidth() <= 64) {
910 if (Unsigned)
911 addUInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_udata,
912 CI->getZExtValue());
913 else
914 addSInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata,
915 CI->getSExtValue());
916 return true;
917 }
918
919 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
920
921 // Get the raw data form of the large APInt.
922 const APInt Val = CI->getValue();
923 const char *Ptr = (const char*)Val.getRawData();
924
925 int NumBytes = Val.getBitWidth() / 8; // 8 bits per byte.
926 bool LittleEndian = Asm->getTargetData().isLittleEndian();
927 int Incr = (LittleEndian ? 1 : -1);
928 int Start = (LittleEndian ? 0 : NumBytes - 1);
929 int Stop = (LittleEndian ? NumBytes : -1);
930
931 // Output the constant to DWARF one byte at a time.
932 for (; Start != Stop; Start += Incr)
933 addUInt(Block, 0, dwarf::DW_FORM_data1,
934 (unsigned char)0xFF & Ptr[Start]);
935
936 addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
937 return true;
938}
Devang Patela43098d2010-04-28 01:03:09 +0000939
Devang Patelc366f832009-12-10 19:14:49 +0000940/// addToContextOwner - Add Die into the list of its context owner's children.
941void DwarfDebug::addToContextOwner(DIE *Die, DIDescriptor Context) {
Devang Patel3c91b052010-03-08 20:52:55 +0000942 if (Context.isType()) {
Devang Patel2db49d72010-05-07 18:11:54 +0000943 DIE *ContextDIE = getOrCreateTypeDIE(DIType(Context));
Devang Patelc366f832009-12-10 19:14:49 +0000944 ContextDIE->addChild(Die);
Devang Patel6404e4e2009-12-15 19:16:48 +0000945 } else if (Context.isNameSpace()) {
Devang Patel2db49d72010-05-07 18:11:54 +0000946 DIE *ContextDIE = getOrCreateNameSpace(DINameSpace(Context));
Devang Patel6404e4e2009-12-15 19:16:48 +0000947 ContextDIE->addChild(Die);
Stuart Hastings215aa152010-06-11 20:08:44 +0000948 } else if (Context.isSubprogram()) {
Devang Patelee70fa72010-09-27 23:15:27 +0000949 DIE *ContextDIE = createSubprogramDIE(DISubprogram(Context));
Stuart Hastings215aa152010-06-11 20:08:44 +0000950 ContextDIE->addChild(Die);
Devang Patel163a9f72010-05-10 22:49:55 +0000951 } else if (DIE *ContextDIE = getCompileUnit(Context)->getDIE(Context))
Devang Patelc366f832009-12-10 19:14:49 +0000952 ContextDIE->addChild(Die);
Jim Grosbach1e20b962010-07-21 21:21:52 +0000953 else
Devang Patel163a9f72010-05-10 22:49:55 +0000954 getCompileUnit(Context)->addDie(Die);
Devang Patelc366f832009-12-10 19:14:49 +0000955}
956
Devang Patel16ced732009-12-10 18:05:33 +0000957/// getOrCreateTypeDIE - Find existing DIE or create new DIE for the
958/// given DIType.
959DIE *DwarfDebug::getOrCreateTypeDIE(DIType Ty) {
Devang Patel163a9f72010-05-10 22:49:55 +0000960 CompileUnit *TypeCU = getCompileUnit(Ty);
961 DIE *TyDIE = TypeCU->getDIE(Ty);
Devang Patel16ced732009-12-10 18:05:33 +0000962 if (TyDIE)
963 return TyDIE;
964
965 // Create new type.
966 TyDIE = new DIE(dwarf::DW_TAG_base_type);
Devang Patel163a9f72010-05-10 22:49:55 +0000967 TypeCU->insertDIE(Ty, TyDIE);
Devang Patel16ced732009-12-10 18:05:33 +0000968 if (Ty.isBasicType())
Devang Patel2db49d72010-05-07 18:11:54 +0000969 constructTypeDIE(*TyDIE, DIBasicType(Ty));
Devang Patel16ced732009-12-10 18:05:33 +0000970 else if (Ty.isCompositeType())
Devang Patel2db49d72010-05-07 18:11:54 +0000971 constructTypeDIE(*TyDIE, DICompositeType(Ty));
Devang Patel16ced732009-12-10 18:05:33 +0000972 else {
973 assert(Ty.isDerivedType() && "Unknown kind of DIType");
Devang Patel2db49d72010-05-07 18:11:54 +0000974 constructTypeDIE(*TyDIE, DIDerivedType(Ty));
Devang Patel16ced732009-12-10 18:05:33 +0000975 }
976
Devang Patelc366f832009-12-10 19:14:49 +0000977 addToContextOwner(TyDIE, Ty.getContext());
Devang Patel16ced732009-12-10 18:05:33 +0000978 return TyDIE;
979}
980
Devang Patel2c4ceb12009-11-21 02:48:08 +0000981/// addType - Add a new type attribute to the specified entity.
Devang Patel8a241142009-12-09 18:24:21 +0000982void DwarfDebug::addType(DIE *Entity, DIType Ty) {
Devang Patel9c004872010-05-07 21:45:47 +0000983 if (!Ty.Verify())
Bill Wendling0310d762009-05-15 09:23:25 +0000984 return;
985
986 // Check for pre-existence.
Devang Patel163a9f72010-05-10 22:49:55 +0000987 CompileUnit *TypeCU = getCompileUnit(Ty);
988 DIEEntry *Entry = TypeCU->getDIEEntry(Ty);
Bill Wendling0310d762009-05-15 09:23:25 +0000989 // If it exists then use the existing value.
Devang Patel2c4ceb12009-11-21 02:48:08 +0000990 if (Entry) {
991 Entity->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, Entry);
Bill Wendling0310d762009-05-15 09:23:25 +0000992 return;
993 }
994
Bill Wendling0310d762009-05-15 09:23:25 +0000995 // Construct type.
Devang Patel16ced732009-12-10 18:05:33 +0000996 DIE *Buffer = getOrCreateTypeDIE(Ty);
Bill Wendling0310d762009-05-15 09:23:25 +0000997
Jeffrey Yasskin5c213dc2010-03-12 17:45:06 +0000998 // Set up proxy.
999 Entry = createDIEEntry(Buffer);
Devang Patel163a9f72010-05-10 22:49:55 +00001000 TypeCU->insertDIEEntry(Ty, Entry);
Jeffrey Yasskin5c213dc2010-03-12 17:45:06 +00001001
Devang Patel2c4ceb12009-11-21 02:48:08 +00001002 Entity->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, Entry);
Bill Wendling0310d762009-05-15 09:23:25 +00001003}
1004
Devang Patel2c4ceb12009-11-21 02:48:08 +00001005/// constructTypeDIE - Construct basic type die from DIBasicType.
Devang Patel8a241142009-12-09 18:24:21 +00001006void DwarfDebug::constructTypeDIE(DIE &Buffer, DIBasicType BTy) {
Bill Wendling0310d762009-05-15 09:23:25 +00001007 // Get core information.
Devang Patel65dbc902009-11-25 17:36:49 +00001008 StringRef Name = BTy.getName();
Bill Wendling0310d762009-05-15 09:23:25 +00001009 Buffer.setTag(dwarf::DW_TAG_base_type);
Devang Patel2c4ceb12009-11-21 02:48:08 +00001010 addUInt(&Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
Bill Wendling0310d762009-05-15 09:23:25 +00001011 BTy.getEncoding());
1012
1013 // Add name if not anonymous or intermediate type.
Devang Patel65dbc902009-11-25 17:36:49 +00001014 if (!Name.empty())
Devang Patel2c4ceb12009-11-21 02:48:08 +00001015 addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
Bill Wendling0310d762009-05-15 09:23:25 +00001016 uint64_t Size = BTy.getSizeInBits() >> 3;
Devang Patel2c4ceb12009-11-21 02:48:08 +00001017 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
Bill Wendling0310d762009-05-15 09:23:25 +00001018}
1019
Devang Patel2c4ceb12009-11-21 02:48:08 +00001020/// constructTypeDIE - Construct derived type die from DIDerivedType.
Devang Patel8a241142009-12-09 18:24:21 +00001021void DwarfDebug::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) {
Bill Wendling0310d762009-05-15 09:23:25 +00001022 // Get core information.
Devang Patel65dbc902009-11-25 17:36:49 +00001023 StringRef Name = DTy.getName();
Bill Wendling0310d762009-05-15 09:23:25 +00001024 uint64_t Size = DTy.getSizeInBits() >> 3;
1025 unsigned Tag = DTy.getTag();
1026
1027 // FIXME - Workaround for templates.
1028 if (Tag == dwarf::DW_TAG_inheritance) Tag = dwarf::DW_TAG_reference_type;
1029
1030 Buffer.setTag(Tag);
1031
1032 // Map to main type, void will not have a type.
1033 DIType FromTy = DTy.getTypeDerivedFrom();
Devang Patel8a241142009-12-09 18:24:21 +00001034 addType(&Buffer, FromTy);
Bill Wendling0310d762009-05-15 09:23:25 +00001035
1036 // Add name if not anonymous or intermediate type.
Devang Pateldeea5642009-11-30 23:56:56 +00001037 if (!Name.empty())
Devang Patel2c4ceb12009-11-21 02:48:08 +00001038 addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
Bill Wendling0310d762009-05-15 09:23:25 +00001039
1040 // Add size if non-zero (derived types might be zero-sized.)
1041 if (Size)
Devang Patel2c4ceb12009-11-21 02:48:08 +00001042 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
Bill Wendling0310d762009-05-15 09:23:25 +00001043
1044 // Add source line info if available and TyDesc is not a forward declaration.
Devang Patel05f6fa82009-11-23 18:43:37 +00001045 if (!DTy.isForwardDecl())
Devang Patel81625742010-08-09 20:20:05 +00001046 addSourceLine(&Buffer, DTy);
Bill Wendling0310d762009-05-15 09:23:25 +00001047}
1048
Devang Patel2c4ceb12009-11-21 02:48:08 +00001049/// constructTypeDIE - Construct type DIE from DICompositeType.
Devang Patel8a241142009-12-09 18:24:21 +00001050void DwarfDebug::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
Bill Wendling0310d762009-05-15 09:23:25 +00001051 // Get core information.
Devang Patel65dbc902009-11-25 17:36:49 +00001052 StringRef Name = CTy.getName();
Bill Wendling0310d762009-05-15 09:23:25 +00001053
1054 uint64_t Size = CTy.getSizeInBits() >> 3;
1055 unsigned Tag = CTy.getTag();
1056 Buffer.setTag(Tag);
1057
1058 switch (Tag) {
1059 case dwarf::DW_TAG_vector_type:
1060 case dwarf::DW_TAG_array_type:
Devang Patel8a241142009-12-09 18:24:21 +00001061 constructArrayTypeDIE(Buffer, &CTy);
Bill Wendling0310d762009-05-15 09:23:25 +00001062 break;
1063 case dwarf::DW_TAG_enumeration_type: {
1064 DIArray Elements = CTy.getTypeArray();
1065
1066 // Add enumerators to enumeration type.
1067 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1068 DIE *ElemDie = NULL;
Devang Patel2db49d72010-05-07 18:11:54 +00001069 DIDescriptor Enum(Elements.getElement(i));
Devang Patel3c91b052010-03-08 20:52:55 +00001070 if (Enum.isEnumerator()) {
Devang Patel2db49d72010-05-07 18:11:54 +00001071 ElemDie = constructEnumTypeDIE(DIEnumerator(Enum));
Devang Patel2c4ceb12009-11-21 02:48:08 +00001072 Buffer.addChild(ElemDie);
Devang Patelc5254722009-10-09 17:51:49 +00001073 }
Bill Wendling0310d762009-05-15 09:23:25 +00001074 }
1075 }
1076 break;
1077 case dwarf::DW_TAG_subroutine_type: {
1078 // Add return type.
1079 DIArray Elements = CTy.getTypeArray();
1080 DIDescriptor RTy = Elements.getElement(0);
Devang Patel2db49d72010-05-07 18:11:54 +00001081 addType(&Buffer, DIType(RTy));
Bill Wendling0310d762009-05-15 09:23:25 +00001082
Devang Pateld6747df2010-10-06 20:50:40 +00001083 bool isPrototyped = true;
Bill Wendling0310d762009-05-15 09:23:25 +00001084 // Add arguments.
1085 for (unsigned i = 1, N = Elements.getNumElements(); i < N; ++i) {
Bill Wendling0310d762009-05-15 09:23:25 +00001086 DIDescriptor Ty = Elements.getElement(i);
Devang Pateld6747df2010-10-06 20:50:40 +00001087 if (Ty.isUnspecifiedParameter()) {
1088 DIE *Arg = new DIE(dwarf::DW_TAG_unspecified_parameters);
1089 Buffer.addChild(Arg);
1090 isPrototyped = false;
1091 } else {
1092 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1093 addType(Arg, DIType(Ty));
1094 Buffer.addChild(Arg);
1095 }
Bill Wendling0310d762009-05-15 09:23:25 +00001096 }
Devang Pateld6747df2010-10-06 20:50:40 +00001097 // Add prototype flag.
1098 if (isPrototyped)
1099 addUInt(&Buffer, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
Bill Wendling0310d762009-05-15 09:23:25 +00001100 }
1101 break;
1102 case dwarf::DW_TAG_structure_type:
1103 case dwarf::DW_TAG_union_type:
1104 case dwarf::DW_TAG_class_type: {
1105 // Add elements to structure type.
1106 DIArray Elements = CTy.getTypeArray();
1107
1108 // A forward struct declared type may not have elements available.
Devang Patel3c91b052010-03-08 20:52:55 +00001109 unsigned N = Elements.getNumElements();
1110 if (N == 0)
Bill Wendling0310d762009-05-15 09:23:25 +00001111 break;
1112
1113 // Add elements to structure type.
Devang Patel3c91b052010-03-08 20:52:55 +00001114 for (unsigned i = 0; i < N; ++i) {
Bill Wendling0310d762009-05-15 09:23:25 +00001115 DIDescriptor Element = Elements.getElement(i);
1116 DIE *ElemDie = NULL;
Devang Patel1a301232010-09-29 21:44:16 +00001117 if (Element.isSubprogram()) {
1118 DISubprogram SP(Element);
Devang Patel2db49d72010-05-07 18:11:54 +00001119 ElemDie = createSubprogramDIE(DISubprogram(Element));
Devang Patel1a301232010-09-29 21:44:16 +00001120 if (SP.isProtected())
1121 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1122 dwarf::DW_ACCESS_protected);
1123 else if (SP.isPrivate())
1124 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1125 dwarf::DW_ACCESS_private);
1126 else
1127 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1128 dwarf::DW_ACCESS_public);
Devang Patel21ea1d52010-10-01 23:31:40 +00001129 if (SP.isExplicit())
1130 addUInt(ElemDie, dwarf::DW_AT_explicit, dwarf::DW_FORM_flag, 1);
Devang Patel1a301232010-09-29 21:44:16 +00001131 }
Devang Patel3c91b052010-03-08 20:52:55 +00001132 else if (Element.isVariable()) {
Devang Patel2db49d72010-05-07 18:11:54 +00001133 DIVariable DV(Element);
Devang Patel1ee0cb92010-01-30 01:08:30 +00001134 ElemDie = new DIE(dwarf::DW_TAG_variable);
1135 addString(ElemDie, dwarf::DW_AT_name, dwarf::DW_FORM_string,
1136 DV.getName());
1137 addType(ElemDie, DV.getType());
1138 addUInt(ElemDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1139 addUInt(ElemDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
Devang Patel81625742010-08-09 20:20:05 +00001140 addSourceLine(ElemDie, DV);
Devang Patel3c91b052010-03-08 20:52:55 +00001141 } else if (Element.isDerivedType())
Devang Patel2db49d72010-05-07 18:11:54 +00001142 ElemDie = createMemberDIE(DIDerivedType(Element));
Devang Patel3c91b052010-03-08 20:52:55 +00001143 else
1144 continue;
Devang Patel2c4ceb12009-11-21 02:48:08 +00001145 Buffer.addChild(ElemDie);
Bill Wendling0310d762009-05-15 09:23:25 +00001146 }
1147
Devang Patela1ba2692009-08-27 23:51:51 +00001148 if (CTy.isAppleBlockExtension())
Devang Patel2c4ceb12009-11-21 02:48:08 +00001149 addUInt(&Buffer, dwarf::DW_AT_APPLE_block, dwarf::DW_FORM_flag, 1);
Bill Wendling0310d762009-05-15 09:23:25 +00001150
1151 unsigned RLang = CTy.getRunTimeLang();
1152 if (RLang)
Devang Patel2c4ceb12009-11-21 02:48:08 +00001153 addUInt(&Buffer, dwarf::DW_AT_APPLE_runtime_class,
Bill Wendling0310d762009-05-15 09:23:25 +00001154 dwarf::DW_FORM_data1, RLang);
Devang Patelb5544992010-01-26 21:16:06 +00001155
1156 DICompositeType ContainingType = CTy.getContainingType();
Devang Patel2db49d72010-05-07 18:11:54 +00001157 if (DIDescriptor(ContainingType).isCompositeType())
Jim Grosbach1e20b962010-07-21 21:21:52 +00001158 addDIEEntry(&Buffer, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4,
Devang Patel2db49d72010-05-07 18:11:54 +00001159 getOrCreateTypeDIE(DIType(ContainingType)));
Stuart Hastings215aa152010-06-11 20:08:44 +00001160 else {
1161 DIDescriptor Context = CTy.getContext();
1162 addToContextOwner(&Buffer, Context);
1163 }
Devang Patel7e2cb112011-02-02 21:38:25 +00001164
1165 if (Tag == dwarf::DW_TAG_class_type) {
1166 DIArray TParams = CTy.getTemplateParams();
1167 unsigned N = TParams.getNumElements();
1168 // Add template parameters.
1169 for (unsigned i = 0; i < N; ++i) {
1170 DIDescriptor Element = TParams.getElement(i);
1171 if (Element.isTemplateTypeParameter())
1172 Buffer.addChild(getOrCreateTemplateTypeParameterDIE(
1173 DITemplateTypeParameter(Element)));
Devang Patele7d93872011-02-02 22:35:53 +00001174 else if (Element.isTemplateValueParameter())
1175 Buffer.addChild(getOrCreateTemplateValueParameterDIE(
1176 DITemplateValueParameter(Element)));
Devang Patel7e2cb112011-02-02 21:38:25 +00001177 }
1178 }
Bill Wendling0310d762009-05-15 09:23:25 +00001179 break;
1180 }
1181 default:
1182 break;
1183 }
1184
1185 // Add name if not anonymous or intermediate type.
Devang Patel65dbc902009-11-25 17:36:49 +00001186 if (!Name.empty())
Devang Patel2c4ceb12009-11-21 02:48:08 +00001187 addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
Bill Wendling0310d762009-05-15 09:23:25 +00001188
Jim Grosbach1e20b962010-07-21 21:21:52 +00001189 if (Tag == dwarf::DW_TAG_enumeration_type || Tag == dwarf::DW_TAG_class_type
Devang Patel61409622010-07-07 20:12:52 +00001190 || Tag == dwarf::DW_TAG_structure_type || Tag == dwarf::DW_TAG_union_type)
1191 {
Bill Wendling0310d762009-05-15 09:23:25 +00001192 // Add size if non-zero (derived types might be zero-sized.)
1193 if (Size)
Devang Patel2c4ceb12009-11-21 02:48:08 +00001194 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
Bill Wendling0310d762009-05-15 09:23:25 +00001195 else {
1196 // Add zero size if it is not a forward declaration.
1197 if (CTy.isForwardDecl())
Devang Patel2c4ceb12009-11-21 02:48:08 +00001198 addUInt(&Buffer, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
Bill Wendling0310d762009-05-15 09:23:25 +00001199 else
Devang Patel2c4ceb12009-11-21 02:48:08 +00001200 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, 0);
Bill Wendling0310d762009-05-15 09:23:25 +00001201 }
1202
1203 // Add source line info if available.
1204 if (!CTy.isForwardDecl())
Devang Patel81625742010-08-09 20:20:05 +00001205 addSourceLine(&Buffer, CTy);
Bill Wendling0310d762009-05-15 09:23:25 +00001206 }
1207}
1208
Devang Patel7e2cb112011-02-02 21:38:25 +00001209/// getOrCreateTemplateTypeParameterDIE - Find existing DIE or create new DIE
1210/// for the given DITemplateTypeParameter.
1211DIE *
1212DwarfDebug::getOrCreateTemplateTypeParameterDIE(DITemplateTypeParameter TP) {
1213 CompileUnit *TypeCU = getCompileUnit(TP);
1214 DIE *ParamDIE = TypeCU->getDIE(TP);
1215 if (ParamDIE)
1216 return ParamDIE;
1217
1218 ParamDIE = new DIE(dwarf::DW_TAG_template_type_parameter);
1219 addType(ParamDIE, TP.getType());
1220 addString(ParamDIE, dwarf::DW_AT_name, dwarf::DW_FORM_string, TP.getName());
1221 return ParamDIE;
1222}
1223
Devang Patele7d93872011-02-02 22:35:53 +00001224/// getOrCreateTemplateValueParameterDIE - Find existing DIE or create new DIE
1225/// for the given DITemplateValueParameter.
1226DIE *
1227DwarfDebug::getOrCreateTemplateValueParameterDIE(DITemplateValueParameter TPV) {
1228 CompileUnit *TVCU = getCompileUnit(TPV);
1229 DIE *ParamDIE = TVCU->getDIE(TPV);
1230 if (ParamDIE)
1231 return ParamDIE;
1232
1233 ParamDIE = new DIE(dwarf::DW_TAG_template_value_parameter);
1234 addType(ParamDIE, TPV.getType());
1235 addString(ParamDIE, dwarf::DW_AT_name, dwarf::DW_FORM_string, TPV.getName());
1236 addUInt(ParamDIE, dwarf::DW_AT_const_value, dwarf::DW_FORM_udata,
1237 TPV.getValue());
1238 return ParamDIE;
1239}
1240
Devang Patel2c4ceb12009-11-21 02:48:08 +00001241/// constructSubrangeDIE - Construct subrange DIE from DISubrange.
1242void DwarfDebug::constructSubrangeDIE(DIE &Buffer, DISubrange SR, DIE *IndexTy){
Bill Wendling0310d762009-05-15 09:23:25 +00001243 int64_t L = SR.getLo();
1244 int64_t H = SR.getHi();
1245 DIE *DW_Subrange = new DIE(dwarf::DW_TAG_subrange_type);
1246
Devang Patel2c4ceb12009-11-21 02:48:08 +00001247 addDIEEntry(DW_Subrange, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IndexTy);
Devang Patel6325a532009-08-14 20:59:16 +00001248 if (L)
Devang Patel2c4ceb12009-11-21 02:48:08 +00001249 addSInt(DW_Subrange, dwarf::DW_AT_lower_bound, 0, L);
Devang Pateld55224c2009-12-04 23:10:24 +00001250 addSInt(DW_Subrange, dwarf::DW_AT_upper_bound, 0, H);
Bill Wendling0310d762009-05-15 09:23:25 +00001251
Devang Patel2c4ceb12009-11-21 02:48:08 +00001252 Buffer.addChild(DW_Subrange);
Bill Wendling0310d762009-05-15 09:23:25 +00001253}
1254
Devang Patel2c4ceb12009-11-21 02:48:08 +00001255/// constructArrayTypeDIE - Construct array type DIE from DICompositeType.
Devang Patel8a241142009-12-09 18:24:21 +00001256void DwarfDebug::constructArrayTypeDIE(DIE &Buffer,
Bill Wendling0310d762009-05-15 09:23:25 +00001257 DICompositeType *CTy) {
1258 Buffer.setTag(dwarf::DW_TAG_array_type);
1259 if (CTy->getTag() == dwarf::DW_TAG_vector_type)
Devang Patel2c4ceb12009-11-21 02:48:08 +00001260 addUInt(&Buffer, dwarf::DW_AT_GNU_vector, dwarf::DW_FORM_flag, 1);
Bill Wendling0310d762009-05-15 09:23:25 +00001261
1262 // Emit derived type.
Devang Patel8a241142009-12-09 18:24:21 +00001263 addType(&Buffer, CTy->getTypeDerivedFrom());
Bill Wendling0310d762009-05-15 09:23:25 +00001264 DIArray Elements = CTy->getTypeArray();
1265
Devang Patel6f01d9c2009-11-21 00:31:03 +00001266 // Get an anonymous type for index type.
Devang Patel163a9f72010-05-10 22:49:55 +00001267 CompileUnit *TheCU = getCompileUnit(*CTy);
1268 DIE *IdxTy = TheCU->getIndexTyDie();
Devang Patel6f01d9c2009-11-21 00:31:03 +00001269 if (!IdxTy) {
1270 // Construct an anonymous type for index type.
1271 IdxTy = new DIE(dwarf::DW_TAG_base_type);
Devang Patel2c4ceb12009-11-21 02:48:08 +00001272 addUInt(IdxTy, dwarf::DW_AT_byte_size, 0, sizeof(int32_t));
1273 addUInt(IdxTy, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
Devang Patel6f01d9c2009-11-21 00:31:03 +00001274 dwarf::DW_ATE_signed);
Devang Patel163a9f72010-05-10 22:49:55 +00001275 TheCU->addDie(IdxTy);
1276 TheCU->setIndexTyDie(IdxTy);
Devang Patel6f01d9c2009-11-21 00:31:03 +00001277 }
Bill Wendling0310d762009-05-15 09:23:25 +00001278
1279 // Add subranges to array type.
1280 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1281 DIDescriptor Element = Elements.getElement(i);
1282 if (Element.getTag() == dwarf::DW_TAG_subrange_type)
Devang Patel2db49d72010-05-07 18:11:54 +00001283 constructSubrangeDIE(Buffer, DISubrange(Element), IdxTy);
Bill Wendling0310d762009-05-15 09:23:25 +00001284 }
1285}
1286
Devang Patel2c4ceb12009-11-21 02:48:08 +00001287/// constructEnumTypeDIE - Construct enum type DIE from DIEnumerator.
Devang Patel3c91b052010-03-08 20:52:55 +00001288DIE *DwarfDebug::constructEnumTypeDIE(DIEnumerator ETy) {
Bill Wendling0310d762009-05-15 09:23:25 +00001289 DIE *Enumerator = new DIE(dwarf::DW_TAG_enumerator);
Devang Patel3c91b052010-03-08 20:52:55 +00001290 StringRef Name = ETy.getName();
Devang Patel2c4ceb12009-11-21 02:48:08 +00001291 addString(Enumerator, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
Devang Patel3c91b052010-03-08 20:52:55 +00001292 int64_t Value = ETy.getEnumValue();
Devang Patel2c4ceb12009-11-21 02:48:08 +00001293 addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, Value);
Bill Wendling0310d762009-05-15 09:23:25 +00001294 return Enumerator;
1295}
1296
Jim Grosbach1e20b962010-07-21 21:21:52 +00001297/// getRealLinkageName - If special LLVM prefix that is used to inform the asm
Devang Patel351ca332010-01-05 01:46:14 +00001298/// printer to not emit usual symbol prefix before the symbol name is used then
1299/// return linkage name after skipping this special LLVM prefix.
1300static StringRef getRealLinkageName(StringRef LinkageName) {
1301 char One = '\1';
1302 if (LinkageName.startswith(StringRef(&One, 1)))
1303 return LinkageName.substr(1);
1304 return LinkageName;
1305}
1306
Devang Patel2c4ceb12009-11-21 02:48:08 +00001307/// createMemberDIE - Create new member DIE.
Devang Patelecbd8e82010-08-10 04:12:17 +00001308DIE *DwarfDebug::createMemberDIE(DIDerivedType DT) {
Bill Wendling0310d762009-05-15 09:23:25 +00001309 DIE *MemberDie = new DIE(DT.getTag());
Devang Patel65dbc902009-11-25 17:36:49 +00001310 StringRef Name = DT.getName();
1311 if (!Name.empty())
Devang Patel2c4ceb12009-11-21 02:48:08 +00001312 addString(MemberDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
Jim Grosbach1e20b962010-07-21 21:21:52 +00001313
Devang Patel8a241142009-12-09 18:24:21 +00001314 addType(MemberDie, DT.getTypeDerivedFrom());
Bill Wendling0310d762009-05-15 09:23:25 +00001315
Devang Patel81625742010-08-09 20:20:05 +00001316 addSourceLine(MemberDie, DT);
Bill Wendling0310d762009-05-15 09:23:25 +00001317
Benjamin Kramer345ef342010-03-31 19:34:01 +00001318 DIEBlock *MemLocationDie = new (DIEValueAllocator) DIEBlock();
Devang Patel2c4ceb12009-11-21 02:48:08 +00001319 addUInt(MemLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
Devang Patel33db5082009-11-04 22:06:12 +00001320
Bill Wendling0310d762009-05-15 09:23:25 +00001321 uint64_t Size = DT.getSizeInBits();
Devang Patel61ecbd12009-11-04 23:48:00 +00001322 uint64_t FieldSize = DT.getOriginalTypeSize();
Bill Wendling0310d762009-05-15 09:23:25 +00001323
1324 if (Size != FieldSize) {
1325 // Handle bitfield.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001326 addUInt(MemberDie, dwarf::DW_AT_byte_size, 0, DT.getOriginalTypeSize()>>3);
1327 addUInt(MemberDie, dwarf::DW_AT_bit_size, 0, DT.getSizeInBits());
Bill Wendling0310d762009-05-15 09:23:25 +00001328
1329 uint64_t Offset = DT.getOffsetInBits();
Bill Wendling0310d762009-05-15 09:23:25 +00001330 uint64_t AlignMask = ~(DT.getAlignInBits() - 1);
1331 uint64_t HiMark = (Offset + FieldSize) & AlignMask;
Benjamin Kramer3d594fd2010-01-07 17:50:57 +00001332 uint64_t FieldOffset = (HiMark - FieldSize);
Bill Wendling0310d762009-05-15 09:23:25 +00001333 Offset -= FieldOffset;
1334
1335 // Maybe we need to work from the other end.
Chris Lattnerd38fee82010-04-05 00:13:49 +00001336 if (Asm->getTargetData().isLittleEndian())
1337 Offset = FieldSize - (Offset + Size);
Devang Patel2c4ceb12009-11-21 02:48:08 +00001338 addUInt(MemberDie, dwarf::DW_AT_bit_offset, 0, Offset);
Bill Wendling0310d762009-05-15 09:23:25 +00001339
Devang Patel33db5082009-11-04 22:06:12 +00001340 // Here WD_AT_data_member_location points to the anonymous
1341 // field that includes this bit field.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001342 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, FieldOffset >> 3);
Devang Patel33db5082009-11-04 22:06:12 +00001343
1344 } else
1345 // This is not a bitfield.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001346 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits() >> 3);
Devang Patel33db5082009-11-04 22:06:12 +00001347
Devang Patelc1dc8ff2010-02-03 20:08:48 +00001348 if (DT.getTag() == dwarf::DW_TAG_inheritance
1349 && DT.isVirtual()) {
1350
1351 // For C++, virtual base classes are not at fixed offset. Use following
1352 // expression to extract appropriate offset from vtable.
1353 // BaseAddr = ObAddr + *((*ObAddr) - Offset)
1354
Benjamin Kramer345ef342010-03-31 19:34:01 +00001355 DIEBlock *VBaseLocationDie = new (DIEValueAllocator) DIEBlock();
Devang Patelc1dc8ff2010-02-03 20:08:48 +00001356 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_dup);
1357 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1358 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1359 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits());
1360 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_minus);
1361 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1362 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1363
Jim Grosbach1e20b962010-07-21 21:21:52 +00001364 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0,
Devang Patelc1dc8ff2010-02-03 20:08:48 +00001365 VBaseLocationDie);
1366 } else
1367 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, MemLocationDie);
Bill Wendling0310d762009-05-15 09:23:25 +00001368
1369 if (DT.isProtected())
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_protected);
1372 else if (DT.isPrivate())
Devang Patel5d11eb02009-12-03 19:11:07 +00001373 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
Bill Wendling0310d762009-05-15 09:23:25 +00001374 dwarf::DW_ACCESS_private);
Devang Patel2a361602010-09-29 19:08:08 +00001375 // Otherwise C++ member and base classes are considered public.
1376 else if (DT.getCompileUnit().getLanguage() == dwarf::DW_LANG_C_plus_plus)
Devang Patel5d11eb02009-12-03 19:11:07 +00001377 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1378 dwarf::DW_ACCESS_public);
1379 if (DT.isVirtual())
1380 addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_flag,
1381 dwarf::DW_VIRTUALITY_virtual);
Bill Wendling0310d762009-05-15 09:23:25 +00001382 return MemberDie;
1383}
1384
Devang Patelffe966c2009-12-14 16:18:45 +00001385/// createSubprogramDIE - Create new DIE using SP.
Devang Patelee70fa72010-09-27 23:15:27 +00001386DIE *DwarfDebug::createSubprogramDIE(DISubprogram SP) {
Devang Patel163a9f72010-05-10 22:49:55 +00001387 CompileUnit *SPCU = getCompileUnit(SP);
1388 DIE *SPDie = SPCU->getDIE(SP);
Devang Patelffe966c2009-12-14 16:18:45 +00001389 if (SPDie)
1390 return SPDie;
1391
1392 SPDie = new DIE(dwarf::DW_TAG_subprogram);
Devang Patel1eac3e72010-03-02 17:58:15 +00001393 // Constructors and operators for anonymous aggregates do not have names.
Devang Patel6b506cb2010-03-02 01:26:20 +00001394 if (!SP.getName().empty())
1395 addString(SPDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, SP.getName());
Bill Wendling0310d762009-05-15 09:23:25 +00001396
Devang Patel65dbc902009-11-25 17:36:49 +00001397 StringRef LinkageName = SP.getLinkageName();
Devang Patel351ca332010-01-05 01:46:14 +00001398 if (!LinkageName.empty())
Devang Patel2c4ceb12009-11-21 02:48:08 +00001399 addString(SPDie, dwarf::DW_AT_MIPS_linkage_name, dwarf::DW_FORM_string,
Devang Patel351ca332010-01-05 01:46:14 +00001400 getRealLinkageName(LinkageName));
1401
Devang Patel81625742010-08-09 20:20:05 +00001402 addSourceLine(SPDie, SP);
Bill Wendling0310d762009-05-15 09:23:25 +00001403
Devang Patel7b172c62010-10-07 22:03:01 +00001404 if (SP.isPrototyped())
Devang Patel2c4ceb12009-11-21 02:48:08 +00001405 addUInt(SPDie, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
Bill Wendling0310d762009-05-15 09:23:25 +00001406
1407 // Add Return Type.
Devang Patel1d5cc1d2009-12-03 01:25:38 +00001408 DICompositeType SPTy = SP.getType();
1409 DIArray Args = SPTy.getTypeArray();
Bill Wendling0310d762009-05-15 09:23:25 +00001410 unsigned SPTag = SPTy.getTag();
Devang Patel5d11eb02009-12-03 19:11:07 +00001411
Devang Patel3c91b052010-03-08 20:52:55 +00001412 if (Args.getNumElements() == 0 || SPTag != dwarf::DW_TAG_subroutine_type)
Devang Patel8a241142009-12-09 18:24:21 +00001413 addType(SPDie, SPTy);
Devang Patel1d5cc1d2009-12-03 01:25:38 +00001414 else
Devang Patel2db49d72010-05-07 18:11:54 +00001415 addType(SPDie, DIType(Args.getElement(0)));
Devang Patel1d5cc1d2009-12-03 01:25:38 +00001416
Devang Patel5d11eb02009-12-03 19:11:07 +00001417 unsigned VK = SP.getVirtuality();
1418 if (VK) {
1419 addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_flag, VK);
Benjamin Kramer345ef342010-03-31 19:34:01 +00001420 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Devang Patel5d11eb02009-12-03 19:11:07 +00001421 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
Devang Pateld639c7c2010-12-09 00:10:40 +00001422 addUInt(Block, 0, dwarf::DW_FORM_udata, SP.getVirtualIndex());
Devang Patel5d11eb02009-12-03 19:11:07 +00001423 addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, 0, Block);
Jim Grosbach1e20b962010-07-21 21:21:52 +00001424 ContainingTypeMap.insert(std::make_pair(SPDie,
Devang Patel2db49d72010-05-07 18:11:54 +00001425 SP.getContainingType()));
Devang Patel5d11eb02009-12-03 19:11:07 +00001426 }
1427
Devang Patelee70fa72010-09-27 23:15:27 +00001428 if (!SP.isDefinition()) {
Devang Patel2c4ceb12009-11-21 02:48:08 +00001429 addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
Bill Wendling0310d762009-05-15 09:23:25 +00001430
1431 // Add arguments. Do not add arguments for subprogram definition. They will
Devang Patel1d5cc1d2009-12-03 01:25:38 +00001432 // be handled while processing variables.
1433 DICompositeType SPTy = SP.getType();
1434 DIArray Args = SPTy.getTypeArray();
1435 unsigned SPTag = SPTy.getTag();
1436
Bill Wendling0310d762009-05-15 09:23:25 +00001437 if (SPTag == dwarf::DW_TAG_subroutine_type)
1438 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
1439 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
Devang Patel2db49d72010-05-07 18:11:54 +00001440 DIType ATy = DIType(DIType(Args.getElement(i)));
Devang Patelb4645642010-02-06 01:02:37 +00001441 addType(Arg, ATy);
1442 if (ATy.isArtificial())
1443 addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
Devang Patel2c4ceb12009-11-21 02:48:08 +00001444 SPDie->addChild(Arg);
Bill Wendling0310d762009-05-15 09:23:25 +00001445 }
1446 }
1447
Devang Patel4e0d19d2010-02-03 19:57:19 +00001448 if (SP.isArtificial())
1449 addUInt(SPDie, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1450
Devang Patelccff8122010-04-30 19:38:23 +00001451 if (!SP.isLocalToUnit())
1452 addUInt(SPDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
Jim Grosbach1e20b962010-07-21 21:21:52 +00001453
Devang Patelccff8122010-04-30 19:38:23 +00001454 if (SP.isOptimized())
1455 addUInt(SPDie, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1);
1456
Jim Grosbach91729002010-07-21 23:03:52 +00001457 if (unsigned isa = Asm->getISAEncoding()) {
1458 addUInt(SPDie, dwarf::DW_AT_APPLE_isa, dwarf::DW_FORM_flag, isa);
1459 }
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;
1814 // Collect lexical scope childrens first.
1815 const SmallVector<DbgVariable *, 8> &Variables = Scope->getDbgVariables();
1816 for (unsigned i = 0, N = Variables.size(); i < N; ++i)
1817 if (DIE *Variable = constructVariableDIE(Variables[i], Scope))
1818 Children.push_back(Variable);
1819 const SmallVector<DbgScope *, 4> &Scopes = Scope->getScopes();
1820 for (unsigned j = 0, M = Scopes.size(); j < M; ++j)
1821 if (DIE *Nested = constructScopeDIE(Scopes[j]))
1822 Children.push_back(Nested);
Devang Patel3c91b052010-03-08 20:52:55 +00001823 DIScope DS(Scope->getScopeNode());
1824 DIE *ScopeDIE = NULL;
1825 if (Scope->getInlinedAt())
1826 ScopeDIE = constructInlinedScopeDIE(Scope);
1827 else if (DS.isSubprogram()) {
Devang Patel0dd45582010-06-28 20:53:04 +00001828 ProcessedSPNodes.insert(DS);
Devang Patel8aa61472010-07-07 22:20:57 +00001829 if (Scope->isAbstractScope()) {
Devang Patel163a9f72010-05-10 22:49:55 +00001830 ScopeDIE = getCompileUnit(DS)->getDIE(DS);
Devang Patel8aa61472010-07-07 22:20:57 +00001831 // Note down abstract DIE.
1832 if (ScopeDIE)
1833 AbstractSPDies.insert(std::make_pair(DS, ScopeDIE));
1834 }
Devang Patel3c91b052010-03-08 20:52:55 +00001835 else
Devang Patel2db49d72010-05-07 18:11:54 +00001836 ScopeDIE = updateSubprogramScopeDIE(DS);
Devang Patel3c91b052010-03-08 20:52:55 +00001837 }
Devang Patel5bc9fec2011-02-19 01:31:27 +00001838 else {
1839 // There is no need to emit empty lexical block DIE.
1840 if (Children.empty())
1841 return NULL;
Devang Patel3c91b052010-03-08 20:52:55 +00001842 ScopeDIE = constructLexicalScopeDIE(Scope);
Devang Patel5bc9fec2011-02-19 01:31:27 +00001843 }
1844
Devang Patelaead63c2010-03-29 22:59:58 +00001845 if (!ScopeDIE) return NULL;
Jim Grosbach1e20b962010-07-21 21:21:52 +00001846
Devang Patel5bc9fec2011-02-19 01:31:27 +00001847 // Add children
1848 for (SmallVector<DIE *, 8>::iterator I = Children.begin(),
1849 E = Children.end(); I != E; ++I)
1850 ScopeDIE->addChild(*I);
Devang Patel193f7202009-11-24 01:14:22 +00001851
Jim Grosbach1e20b962010-07-21 21:21:52 +00001852 if (DS.isSubprogram())
Devang Patel2db49d72010-05-07 18:11:54 +00001853 addPubTypes(DISubprogram(DS));
Jim Grosbach1e20b962010-07-21 21:21:52 +00001854
Devang Patel193f7202009-11-24 01:14:22 +00001855 return ScopeDIE;
Devang Patel53bb5c92009-11-10 23:06:00 +00001856}
1857
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001858/// GetOrCreateSourceID - Look up the source id with the given directory and
1859/// source file names. If none currently exists, create a new id and insert it
1860/// in the SourceIds map. This can update DirectoryNames and SourceFileNames
1861/// maps as well.
Devang Patel2f584852010-07-24 00:53:22 +00001862
Rafael Espindola5c055632010-11-18 02:04:25 +00001863unsigned DwarfDebug::GetOrCreateSourceID(StringRef FileName){
Devang Patel1905a182010-09-16 20:57:49 +00001864 // If FE did not provide a file name, then assume stdin.
1865 if (FileName.empty())
Rafael Espindola5c055632010-11-18 02:04:25 +00001866 return GetOrCreateSourceID("<stdin>");
Devang Patel1905a182010-09-16 20:57:49 +00001867
Rafael Espindola5c055632010-11-18 02:04:25 +00001868 StringMapEntry<unsigned> &Entry = SourceIdMap.GetOrCreateValue(FileName);
1869 if (Entry.getValue())
1870 return Entry.getValue();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001871
Rafael Espindola5c055632010-11-18 02:04:25 +00001872 unsigned SrcId = SourceIdMap.size();
1873 Entry.setValue(SrcId);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001874
Rafael Espindola5c055632010-11-18 02:04:25 +00001875 // Print out a .file directive to specify files for .loc directives.
1876 Asm->OutStreamer.EmitDwarfFileDirective(SrcId, FileName);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001877
1878 return SrcId;
1879}
1880
Devang Patel6404e4e2009-12-15 19:16:48 +00001881/// getOrCreateNameSpace - Create a DIE for DINameSpace.
1882DIE *DwarfDebug::getOrCreateNameSpace(DINameSpace NS) {
Devang Patel163a9f72010-05-10 22:49:55 +00001883 CompileUnit *TheCU = getCompileUnit(NS);
1884 DIE *NDie = TheCU->getDIE(NS);
Devang Patel6404e4e2009-12-15 19:16:48 +00001885 if (NDie)
1886 return NDie;
1887 NDie = new DIE(dwarf::DW_TAG_namespace);
Devang Patel163a9f72010-05-10 22:49:55 +00001888 TheCU->insertDIE(NS, NDie);
Devang Patel6404e4e2009-12-15 19:16:48 +00001889 if (!NS.getName().empty())
1890 addString(NDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, NS.getName());
Devang Patel81625742010-08-09 20:20:05 +00001891 addSourceLine(NDie, NS);
Devang Patel6404e4e2009-12-15 19:16:48 +00001892 addToContextOwner(NDie, NS.getContext());
1893 return NDie;
1894}
1895
Jim Grosbach1e20b962010-07-21 21:21:52 +00001896/// constructCompileUnit - Create new CompileUnit for the given
Devang Patel163a9f72010-05-10 22:49:55 +00001897/// metadata node with tag DW_TAG_compile_unit.
Devang Patele9f8f5e2010-05-07 20:54:48 +00001898void DwarfDebug::constructCompileUnit(const MDNode *N) {
Devang Patele4b27562009-08-28 23:24:31 +00001899 DICompileUnit DIUnit(N);
Devang Patel65dbc902009-11-25 17:36:49 +00001900 StringRef FN = DIUnit.getFilename();
1901 StringRef Dir = DIUnit.getDirectory();
Rafael Espindola5c055632010-11-18 02:04:25 +00001902 unsigned ID = GetOrCreateSourceID(FN);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001903
1904 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
Devang Patel2c4ceb12009-11-21 02:48:08 +00001905 addString(Die, dwarf::DW_AT_producer, dwarf::DW_FORM_string,
Devang Patel5ccdd102009-09-29 18:40:58 +00001906 DIUnit.getProducer());
Devang Patel3a4ae322011-02-23 22:37:04 +00001907 addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data2,
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001908 DIUnit.getLanguage());
Devang Patel2c4ceb12009-11-21 02:48:08 +00001909 addString(Die, dwarf::DW_AT_name, dwarf::DW_FORM_string, FN);
Devang Patel5098da02010-04-26 22:54:28 +00001910 // Use DW_AT_entry_pc instead of DW_AT_low_pc/DW_AT_high_pc pair. This
1911 // simplifies debug range entries.
Devang Patel9b93b6b2010-06-28 22:22:47 +00001912 addUInt(Die, dwarf::DW_AT_entry_pc, dwarf::DW_FORM_addr, 0);
Devang Patel4a602ca2010-03-22 23:11:36 +00001913 // DW_AT_stmt_list is a offset of line number information for this
Devang Patelaf608bd2010-08-24 00:06:12 +00001914 // compile unit in debug_line section.
Devang Patelae84d5b2010-08-31 23:50:19 +00001915 if (Asm->MAI->doesDwarfUsesAbsoluteLabelForStmtList())
Devang Patelf4106082011-02-24 21:04:00 +00001916 addSectionOffset(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_addr,
1917 Asm->GetTempSymbol("section_line"));
Devang Patelae84d5b2010-08-31 23:50:19 +00001918 else
1919 addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4, 0);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001920
Devang Patel65dbc902009-11-25 17:36:49 +00001921 if (!Dir.empty())
Devang Patel2c4ceb12009-11-21 02:48:08 +00001922 addString(Die, dwarf::DW_AT_comp_dir, dwarf::DW_FORM_string, Dir);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001923 if (DIUnit.isOptimized())
Devang Patel2c4ceb12009-11-21 02:48:08 +00001924 addUInt(Die, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001925
Devang Patel65dbc902009-11-25 17:36:49 +00001926 StringRef Flags = DIUnit.getFlags();
1927 if (!Flags.empty())
Devang Patel2c4ceb12009-11-21 02:48:08 +00001928 addString(Die, dwarf::DW_AT_APPLE_flags, dwarf::DW_FORM_string, Flags);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001929
1930 unsigned RVer = DIUnit.getRunTimeVersion();
1931 if (RVer)
Devang Patel2c4ceb12009-11-21 02:48:08 +00001932 addUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers,
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001933 dwarf::DW_FORM_data1, RVer);
1934
Devang Patel163a9f72010-05-10 22:49:55 +00001935 CompileUnit *NewCU = new CompileUnit(ID, Die);
1936 if (!FirstCU)
1937 FirstCU = NewCU;
1938 CUMap.insert(std::make_pair(N, NewCU));
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001939}
1940
Devang Patel163a9f72010-05-10 22:49:55 +00001941/// getCompielUnit - Get CompileUnit DIE.
1942CompileUnit *DwarfDebug::getCompileUnit(const MDNode *N) const {
1943 assert (N && "Invalid DwarfDebug::getCompileUnit argument!");
1944 DIDescriptor D(N);
1945 const MDNode *CUNode = NULL;
1946 if (D.isCompileUnit())
1947 CUNode = N;
1948 else if (D.isSubprogram())
1949 CUNode = DISubprogram(N).getCompileUnit();
1950 else if (D.isType())
1951 CUNode = DIType(N).getCompileUnit();
1952 else if (D.isGlobalVariable())
1953 CUNode = DIGlobalVariable(N).getCompileUnit();
1954 else if (D.isVariable())
1955 CUNode = DIVariable(N).getCompileUnit();
1956 else if (D.isNameSpace())
1957 CUNode = DINameSpace(N).getCompileUnit();
1958 else if (D.isFile())
1959 CUNode = DIFile(N).getCompileUnit();
1960 else
1961 return FirstCU;
1962
1963 DenseMap<const MDNode *, CompileUnit *>::const_iterator I
1964 = CUMap.find(CUNode);
1965 if (I == CUMap.end())
1966 return FirstCU;
1967 return I->second;
1968}
1969
Devang Patel0c4720c2010-08-23 18:25:56 +00001970/// isUnsignedDIType - Return true if type encoding is unsigned.
1971static bool isUnsignedDIType(DIType Ty) {
1972 DIDerivedType DTy(Ty);
1973 if (DTy.Verify())
1974 return isUnsignedDIType(DTy.getTypeDerivedFrom());
1975
1976 DIBasicType BTy(Ty);
1977 if (BTy.Verify()) {
1978 unsigned Encoding = BTy.getEncoding();
1979 if (Encoding == dwarf::DW_ATE_unsigned ||
1980 Encoding == dwarf::DW_ATE_unsigned_char)
1981 return true;
1982 }
1983 return false;
1984}
Devang Patel163a9f72010-05-10 22:49:55 +00001985
Devang Patele449d1f2011-01-20 00:02:16 +00001986// Return const exprssion if value is a GEP to access merged global
1987// constant. e.g.
1988// i8* getelementptr ({ i8, i8, i8, i8 }* @_MergedGlobals, i32 0, i32 0)
1989static const ConstantExpr *getMergedGlobalExpr(const Value *V) {
1990 const ConstantExpr *CE = dyn_cast_or_null<ConstantExpr>(V);
1991 if (!CE || CE->getNumOperands() != 3 ||
1992 CE->getOpcode() != Instruction::GetElementPtr)
1993 return NULL;
1994
1995 // First operand points to a global value.
1996 if (!isa<GlobalValue>(CE->getOperand(0)))
1997 return NULL;
1998
1999 // Second operand is zero.
2000 const ConstantInt *CI =
2001 dyn_cast_or_null<ConstantInt>(CE->getOperand(1));
2002 if (!CI || !CI->isZero())
2003 return NULL;
2004
2005 // Third operand is offset.
2006 if (!isa<ConstantInt>(CE->getOperand(2)))
2007 return NULL;
2008
2009 return CE;
2010}
2011
Devang Patel163a9f72010-05-10 22:49:55 +00002012/// constructGlobalVariableDIE - Construct global variable DIE.
Devang Patele9f8f5e2010-05-07 20:54:48 +00002013void DwarfDebug::constructGlobalVariableDIE(const MDNode *N) {
Devang Patel9fa539c2010-08-10 01:37:23 +00002014 DIGlobalVariable GV(N);
Daniel Dunbarf612ff62009-09-19 20:40:05 +00002015
Devang Patel905cf5e2009-09-04 23:59:07 +00002016 // If debug information is malformed then ignore it.
Devang Patel9fa539c2010-08-10 01:37:23 +00002017 if (GV.Verify() == false)
Devang Patel905cf5e2009-09-04 23:59:07 +00002018 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002019
2020 // Check for pre-existence.
Devang Patel163a9f72010-05-10 22:49:55 +00002021 CompileUnit *TheCU = getCompileUnit(N);
Devang Patel9fa539c2010-08-10 01:37:23 +00002022 if (TheCU->getDIE(GV))
Devang Patel13e16b62009-06-26 01:49:18 +00002023 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002024
Devang Patel9fa539c2010-08-10 01:37:23 +00002025 DIType GTy = GV.getType();
Devang Patel29368072010-08-10 07:11:13 +00002026 DIE *VariableDIE = new DIE(GV.getTag());
2027
2028 bool isGlobalVariable = GV.getGlobal() != NULL;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002029
Devang Patel9fa539c2010-08-10 01:37:23 +00002030 // Add name.
2031 addString(VariableDIE, dwarf::DW_AT_name, dwarf::DW_FORM_string,
2032 GV.getDisplayName());
2033 StringRef LinkageName = GV.getLinkageName();
Devang Patel29368072010-08-10 07:11:13 +00002034 if (!LinkageName.empty() && isGlobalVariable)
Devang Patel9fa539c2010-08-10 01:37:23 +00002035 addString(VariableDIE, dwarf::DW_AT_MIPS_linkage_name, dwarf::DW_FORM_string,
2036 getRealLinkageName(LinkageName));
2037 // Add type.
2038 addType(VariableDIE, GTy);
Devang Patel50d80e32010-04-13 20:35:04 +00002039 if (GTy.isCompositeType() && !GTy.getName().empty()
2040 && !GTy.isForwardDecl()) {
Devang Patel163a9f72010-05-10 22:49:55 +00002041 DIEEntry *Entry = TheCU->getDIEEntry(GTy);
Chris Lattnered7a77b2010-03-31 05:36:29 +00002042 assert(Entry && "Missing global type!");
Devang Patel163a9f72010-05-10 22:49:55 +00002043 TheCU->addGlobalType(GTy.getName(), Entry->getEntry());
Devang Patel193f7202009-11-24 01:14:22 +00002044 }
Devang Patel9fa539c2010-08-10 01:37:23 +00002045 // Add scoping info.
2046 if (!GV.isLocalToUnit()) {
2047 addUInt(VariableDIE, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
2048 // Expose as global.
2049 TheCU->addGlobal(GV.getName(), VariableDIE);
2050 }
2051 // Add line number info.
2052 addSourceLine(VariableDIE, GV);
2053 // Add to map.
2054 TheCU->insertDIE(N, VariableDIE);
2055 // Add to context owner.
2056 DIDescriptor GVContext = GV.getContext();
2057 addToContextOwner(VariableDIE, GVContext);
2058 // Add location.
Devang Patel29368072010-08-10 07:11:13 +00002059 if (isGlobalVariable) {
2060 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
2061 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
2062 addLabel(Block, 0, dwarf::DW_FORM_udata,
2063 Asm->Mang->getSymbol(GV.getGlobal()));
2064 // Do not create specification DIE if context is either compile unit
2065 // or a subprogram.
2066 if (GV.isDefinition() && !GVContext.isCompileUnit() &&
2067 !GVContext.isFile() && !isSubprogramContext(GVContext)) {
2068 // Create specification DIE.
2069 DIE *VariableSpecDIE = new DIE(dwarf::DW_TAG_variable);
2070 addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification,
2071 dwarf::DW_FORM_ref4, VariableDIE);
2072 addBlock(VariableSpecDIE, dwarf::DW_AT_location, 0, Block);
2073 addUInt(VariableDIE, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
2074 TheCU->addDie(VariableSpecDIE);
2075 } else {
2076 addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
2077 }
Devang Patel76a788c2011-01-06 21:39:25 +00002078 } else if (ConstantInt *CI =
2079 dyn_cast_or_null<ConstantInt>(GV.getConstant()))
2080 addConstantValue(VariableDIE, CI, isUnsignedDIType(GTy));
Devang Patele449d1f2011-01-20 00:02:16 +00002081 else if (const ConstantExpr *CE = getMergedGlobalExpr(N->getOperand(11))) {
2082 // GV is a merged global.
2083 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
2084 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
2085 addLabel(Block, 0, dwarf::DW_FORM_udata,
2086 Asm->Mang->getSymbol(cast<GlobalValue>(CE->getOperand(0))));
2087 ConstantInt *CII = cast<ConstantInt>(CE->getOperand(2));
2088 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
2089 addUInt(Block, 0, dwarf::DW_FORM_udata, CII->getZExtValue());
2090 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
2091 addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
2092 }
Devang Patel76a788c2011-01-06 21:39:25 +00002093
Devang Patel13e16b62009-06-26 01:49:18 +00002094 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002095}
2096
Devang Patel163a9f72010-05-10 22:49:55 +00002097/// construct SubprogramDIE - Construct subprogram DIE.
Devang Patele9f8f5e2010-05-07 20:54:48 +00002098void DwarfDebug::constructSubprogramDIE(const MDNode *N) {
Devang Patele4b27562009-08-28 23:24:31 +00002099 DISubprogram SP(N);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002100
Stuart Hastings639336e2010-04-06 21:38:29 +00002101 // Check for pre-existence.
Devang Patel163a9f72010-05-10 22:49:55 +00002102 CompileUnit *TheCU = getCompileUnit(N);
2103 if (TheCU->getDIE(N))
Stuart Hastings639336e2010-04-06 21:38:29 +00002104 return;
2105
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002106 if (!SP.isDefinition())
2107 // This is a method declaration which will be handled while constructing
2108 // class type.
Devang Patel13e16b62009-06-26 01:49:18 +00002109 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002110
Stuart Hastings639336e2010-04-06 21:38:29 +00002111 DIE *SubprogramDie = createSubprogramDIE(SP);
2112
2113 // Add to map.
Devang Patel163a9f72010-05-10 22:49:55 +00002114 TheCU->insertDIE(N, SubprogramDie);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002115
2116 // Add to context owner.
Devang Patel6404e4e2009-12-15 19:16:48 +00002117 addToContextOwner(SubprogramDie, SP.getContext());
Devang Patel0000fad2009-12-08 23:21:45 +00002118
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002119 // Expose as global.
Devang Patel163a9f72010-05-10 22:49:55 +00002120 TheCU->addGlobal(SP.getName(), SubprogramDie);
Devang Patel193f7202009-11-24 01:14:22 +00002121
Devang Patel13e16b62009-06-26 01:49:18 +00002122 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002123}
2124
Devang Patel2c4ceb12009-11-21 02:48:08 +00002125/// beginModule - Emit all Dwarf sections that should come prior to the
Daniel Dunbar00564992009-09-19 20:40:14 +00002126/// content. Create global DIEs and emit initial debug info sections.
2127/// This is inovked by the target AsmPrinter.
Chris Lattner75f50722010-04-04 07:48:20 +00002128void DwarfDebug::beginModule(Module *M) {
Devang Pateleac9c072010-04-27 19:46:33 +00002129 if (DisableDebugInfoPrinting)
2130 return;
2131
Devang Patel78ab9e22009-07-30 18:56:46 +00002132 DebugInfoFinder DbgFinder;
2133 DbgFinder.processModule(*M);
Devang Patel13e16b62009-06-26 01:49:18 +00002134
Chris Lattnerd850ac72010-04-05 02:19:28 +00002135 bool HasDebugInfo = false;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002136
Chris Lattnerd850ac72010-04-05 02:19:28 +00002137 // Scan all the compile-units to see if there are any marked as the main unit.
2138 // if not, we do not generate debug info.
2139 for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
2140 E = DbgFinder.compile_unit_end(); I != E; ++I) {
2141 if (DICompileUnit(*I).isMain()) {
2142 HasDebugInfo = true;
2143 break;
2144 }
2145 }
Jim Grosbach1e20b962010-07-21 21:21:52 +00002146
Chris Lattnerd850ac72010-04-05 02:19:28 +00002147 if (!HasDebugInfo) return;
2148
2149 // Tell MMI that we have debug info.
2150 MMI->setDebugInfoAvailability(true);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002151
Chris Lattnerbe15beb2010-04-04 23:17:54 +00002152 // Emit initial sections.
Chris Lattnerd850ac72010-04-05 02:19:28 +00002153 EmitSectionLabels();
Jim Grosbach1e20b962010-07-21 21:21:52 +00002154
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002155 // Create all the compile unit DIEs.
Devang Patel78ab9e22009-07-30 18:56:46 +00002156 for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
2157 E = DbgFinder.compile_unit_end(); I != E; ++I)
Devang Patel2c4ceb12009-11-21 02:48:08 +00002158 constructCompileUnit(*I);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002159
Devang Patel53bb5c92009-11-10 23:06:00 +00002160 // Create DIEs for each subprogram.
Devang Patel78ab9e22009-07-30 18:56:46 +00002161 for (DebugInfoFinder::iterator I = DbgFinder.subprogram_begin(),
2162 E = DbgFinder.subprogram_end(); I != E; ++I)
Devang Patel2c4ceb12009-11-21 02:48:08 +00002163 constructSubprogramDIE(*I);
Devang Patel13e16b62009-06-26 01:49:18 +00002164
Devang Patelc366f832009-12-10 19:14:49 +00002165 // Create DIEs for each global variable.
2166 for (DebugInfoFinder::iterator I = DbgFinder.global_variable_begin(),
2167 E = DbgFinder.global_variable_end(); I != E; ++I)
2168 constructGlobalVariableDIE(*I);
2169
Devang Patele7e5a0f2010-08-10 20:01:20 +00002170 //getOrCreateTypeDIE
2171 if (NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.enum"))
2172 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i)
2173 getOrCreateTypeDIE(DIType(NMD->getOperand(i)));
2174
Devang Patel1a7ca032010-09-28 18:08:20 +00002175 if (NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.ty"))
2176 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i)
2177 getOrCreateTypeDIE(DIType(NMD->getOperand(i)));
2178
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002179 // Prime section data.
Chris Lattnerf0144122009-07-28 03:13:23 +00002180 SectionMap.insert(Asm->getObjFileLowering().getTextSection());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002181}
2182
Devang Patel2c4ceb12009-11-21 02:48:08 +00002183/// endModule - Emit all Dwarf sections that should come after the content.
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002184///
Devang Patel2c4ceb12009-11-21 02:48:08 +00002185void DwarfDebug::endModule() {
Devang Patel163a9f72010-05-10 22:49:55 +00002186 if (!FirstCU) return;
Devang Patel4a1cad62010-06-28 18:25:03 +00002187 const Module *M = MMI->getModule();
Devang Patele9a1cca2010-08-02 17:32:15 +00002188 DenseMap<const MDNode *, DbgScope *> DeadFnScopeMap;
Devang Patel4a1cad62010-06-28 18:25:03 +00002189 if (NamedMDNode *AllSPs = M->getNamedMetadata("llvm.dbg.sp")) {
2190 for (unsigned SI = 0, SE = AllSPs->getNumOperands(); SI != SE; ++SI) {
2191 if (ProcessedSPNodes.count(AllSPs->getOperand(SI)) != 0) continue;
2192 DISubprogram SP(AllSPs->getOperand(SI));
2193 if (!SP.Verify()) continue;
2194
2195 // Collect info for variables that were optimized out.
Devang Patel8b3a6b62010-07-19 17:53:55 +00002196 if (!SP.isDefinition()) continue;
Devang Patel4a1cad62010-06-28 18:25:03 +00002197 StringRef FName = SP.getLinkageName();
2198 if (FName.empty())
2199 FName = SP.getName();
Devang Patel62367042010-11-10 22:19:21 +00002200 NamedMDNode *NMD = getFnSpecificMDNode(*(MMI->getModule()), FName);
Devang Patel4a1cad62010-06-28 18:25:03 +00002201 if (!NMD) continue;
2202 unsigned E = NMD->getNumOperands();
2203 if (!E) continue;
2204 DbgScope *Scope = new DbgScope(NULL, DIDescriptor(SP), NULL);
Devang Patele9a1cca2010-08-02 17:32:15 +00002205 DeadFnScopeMap[SP] = Scope;
Devang Patel4a1cad62010-06-28 18:25:03 +00002206 for (unsigned I = 0; I != E; ++I) {
2207 DIVariable DV(NMD->getOperand(I));
2208 if (!DV.Verify()) continue;
2209 Scope->addVariable(new DbgVariable(DV));
2210 }
Jim Grosbach1e20b962010-07-21 21:21:52 +00002211
Devang Patel4a1cad62010-06-28 18:25:03 +00002212 // Construct subprogram DIE and add variables DIEs.
2213 constructSubprogramDIE(SP);
2214 DIE *ScopeDIE = getCompileUnit(SP)->getDIE(SP);
Devang Patele03161c2010-08-09 18:51:29 +00002215 const SmallVector<DbgVariable *, 8> &Variables = Scope->getDbgVariables();
Devang Patel4a1cad62010-06-28 18:25:03 +00002216 for (unsigned i = 0, N = Variables.size(); i < N; ++i) {
2217 DIE *VariableDIE = constructVariableDIE(Variables[i], Scope);
2218 if (VariableDIE)
2219 ScopeDIE->addChild(VariableDIE);
2220 }
2221 }
2222 }
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002223
Devang Patel53bb5c92009-11-10 23:06:00 +00002224 // Attach DW_AT_inline attribute with inlined subprogram DIEs.
2225 for (SmallPtrSet<DIE *, 4>::iterator AI = InlinedSubprogramDIEs.begin(),
2226 AE = InlinedSubprogramDIEs.end(); AI != AE; ++AI) {
2227 DIE *ISP = *AI;
Devang Patel2c4ceb12009-11-21 02:48:08 +00002228 addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
Devang Patel53bb5c92009-11-10 23:06:00 +00002229 }
2230
Devang Patele9f8f5e2010-05-07 20:54:48 +00002231 for (DenseMap<DIE *, const MDNode *>::iterator CI = ContainingTypeMap.begin(),
Devang Patel5d11eb02009-12-03 19:11:07 +00002232 CE = ContainingTypeMap.end(); CI != CE; ++CI) {
2233 DIE *SPDie = CI->first;
Devang Patele9f8f5e2010-05-07 20:54:48 +00002234 const MDNode *N = dyn_cast_or_null<MDNode>(CI->second);
Devang Patel5d11eb02009-12-03 19:11:07 +00002235 if (!N) continue;
Devang Patel163a9f72010-05-10 22:49:55 +00002236 DIE *NDie = getCompileUnit(N)->getDIE(N);
Devang Patel5d11eb02009-12-03 19:11:07 +00002237 if (!NDie) continue;
2238 addDIEEntry(SPDie, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, NDie);
Devang Patel5d11eb02009-12-03 19:11:07 +00002239 }
2240
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002241 // Standard sections final addresses.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002242 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getTextSection());
Chris Lattnerc0215722010-04-04 19:25:43 +00002243 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("text_end"));
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002244 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getDataSection());
Chris Lattnerc0215722010-04-04 19:25:43 +00002245 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("data_end"));
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002246
2247 // End text sections.
2248 for (unsigned i = 1, N = SectionMap.size(); i <= N; ++i) {
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002249 Asm->OutStreamer.SwitchSection(SectionMap[i]);
Chris Lattnerc0215722010-04-04 19:25:43 +00002250 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("section_end", i));
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002251 }
2252
2253 // Emit common frame information.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002254 emitCommonDebugFrame();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002255
2256 // Emit function debug frame information
2257 for (std::vector<FunctionDebugFrameInfo>::iterator I = DebugFrames.begin(),
2258 E = DebugFrames.end(); I != E; ++I)
Devang Patel2c4ceb12009-11-21 02:48:08 +00002259 emitFunctionDebugFrame(*I);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002260
2261 // Compute DIE offsets and sizes.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002262 computeSizeAndOffsets();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002263
2264 // Emit all the DIEs into a debug info section
Devang Patel2c4ceb12009-11-21 02:48:08 +00002265 emitDebugInfo();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002266
2267 // Corresponding abbreviations into a abbrev section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002268 emitAbbreviations();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002269
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002270 // Emit info into a debug pubnames section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002271 emitDebugPubNames();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002272
Devang Patel193f7202009-11-24 01:14:22 +00002273 // Emit info into a debug pubtypes section.
2274 emitDebugPubTypes();
2275
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002276 // Emit info into a debug loc section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002277 emitDebugLoc();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002278
2279 // Emit info into a debug aranges section.
2280 EmitDebugARanges();
2281
2282 // Emit info into a debug ranges section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002283 emitDebugRanges();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002284
2285 // Emit info into a debug macinfo section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002286 emitDebugMacInfo();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002287
2288 // Emit inline info.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002289 emitDebugInlineInfo();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002290
Chris Lattnerbc733f52010-03-13 02:17:42 +00002291 // Emit info into a debug str section.
2292 emitDebugStr();
Jim Grosbach1e20b962010-07-21 21:21:52 +00002293
Devang Patele9a1cca2010-08-02 17:32:15 +00002294 // clean up.
2295 DeleteContainerSeconds(DeadFnScopeMap);
Devang Patel163a9f72010-05-10 22:49:55 +00002296 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2297 E = CUMap.end(); I != E; ++I)
2298 delete I->second;
2299 FirstCU = NULL; // Reset for the next Module, if any.
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002300}
2301
Devang Patel53bb5c92009-11-10 23:06:00 +00002302/// findAbstractVariable - Find abstract variable, if any, associated with Var.
Jim Grosbach1e20b962010-07-21 21:21:52 +00002303DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &Var,
Chris Lattnerde4845c2010-04-02 19:42:39 +00002304 DebugLoc ScopeLoc) {
Devang Patel53bb5c92009-11-10 23:06:00 +00002305
Devang Patel2db49d72010-05-07 18:11:54 +00002306 DbgVariable *AbsDbgVariable = AbstractVariables.lookup(Var);
Devang Patel53bb5c92009-11-10 23:06:00 +00002307 if (AbsDbgVariable)
2308 return AbsDbgVariable;
2309
Devang Patel2db49d72010-05-07 18:11:54 +00002310 LLVMContext &Ctx = Var->getContext();
Chris Lattnerde4845c2010-04-02 19:42:39 +00002311 DbgScope *Scope = AbstractScopes.lookup(ScopeLoc.getScope(Ctx));
Devang Patel53bb5c92009-11-10 23:06:00 +00002312 if (!Scope)
2313 return NULL;
2314
Devang Patel26c1e562010-05-20 16:36:41 +00002315 AbsDbgVariable = new DbgVariable(Var);
Devang Patel2c4ceb12009-11-21 02:48:08 +00002316 Scope->addVariable(AbsDbgVariable);
Devang Patel2db49d72010-05-07 18:11:54 +00002317 AbstractVariables[Var] = AbsDbgVariable;
Devang Patel53bb5c92009-11-10 23:06:00 +00002318 return AbsDbgVariable;
2319}
2320
Devang Patelee432862010-05-20 19:57:06 +00002321/// collectVariableInfoFromMMITable - Collect variable information from
2322/// side table maintained by MMI.
Jim Grosbach1e20b962010-07-21 21:21:52 +00002323void
Devang Patelee432862010-05-20 19:57:06 +00002324DwarfDebug::collectVariableInfoFromMMITable(const MachineFunction * MF,
2325 SmallPtrSet<const MDNode *, 16> &Processed) {
Chris Lattnerd38fee82010-04-05 00:13:49 +00002326 const LLVMContext &Ctx = Asm->MF->getFunction()->getContext();
Devang Patele717faa2009-10-06 01:26:37 +00002327 MachineModuleInfo::VariableDbgInfoMapTy &VMap = MMI->getVariableDbgInfo();
2328 for (MachineModuleInfo::VariableDbgInfoMapTy::iterator VI = VMap.begin(),
2329 VE = VMap.end(); VI != VE; ++VI) {
Devang Patele9f8f5e2010-05-07 20:54:48 +00002330 const MDNode *Var = VI->first;
Devang Patel53bb5c92009-11-10 23:06:00 +00002331 if (!Var) continue;
Devang Patel98e1cac2010-05-14 21:01:35 +00002332 Processed.insert(Var);
Chris Lattnerde4845c2010-04-02 19:42:39 +00002333 DIVariable DV(Var);
2334 const std::pair<unsigned, DebugLoc> &VP = VI->second;
Devang Patel53bb5c92009-11-10 23:06:00 +00002335
Chris Lattnerde4845c2010-04-02 19:42:39 +00002336 DbgScope *Scope = 0;
Devang Patele9f8f5e2010-05-07 20:54:48 +00002337 if (const MDNode *IA = VP.second.getInlinedAt(Ctx))
Chris Lattnerde4845c2010-04-02 19:42:39 +00002338 Scope = ConcreteScopes.lookup(IA);
2339 if (Scope == 0)
2340 Scope = DbgScopeMap.lookup(VP.second.getScope(Ctx));
Jim Grosbach1e20b962010-07-21 21:21:52 +00002341
Devang Patelfb0ee432009-11-10 23:20:04 +00002342 // If variable scope is not found then skip this variable.
Chris Lattnerde4845c2010-04-02 19:42:39 +00002343 if (Scope == 0)
Devang Patelfb0ee432009-11-10 23:20:04 +00002344 continue;
Devang Patel53bb5c92009-11-10 23:06:00 +00002345
Devang Patel26c1e562010-05-20 16:36:41 +00002346 DbgVariable *AbsDbgVariable = findAbstractVariable(DV, VP.second);
2347 DbgVariable *RegVar = new DbgVariable(DV);
2348 recordVariableFrameIndex(RegVar, VP.first);
Devang Patel2c4ceb12009-11-21 02:48:08 +00002349 Scope->addVariable(RegVar);
Devang Patel26c1e562010-05-20 16:36:41 +00002350 if (AbsDbgVariable) {
2351 recordVariableFrameIndex(AbsDbgVariable, VP.first);
2352 VarToAbstractVarMap[RegVar] = AbsDbgVariable;
2353 }
Devang Patele717faa2009-10-06 01:26:37 +00002354 }
Devang Patelee432862010-05-20 19:57:06 +00002355}
Devang Patel90a48ad2010-03-15 18:33:46 +00002356
Jim Grosbach1e20b962010-07-21 21:21:52 +00002357/// isDbgValueInDefinedReg - Return true if debug value, encoded by
Devang Patelc3f5f782010-05-25 23:40:22 +00002358/// DBG_VALUE instruction, is in a defined reg.
2359static bool isDbgValueInDefinedReg(const MachineInstr *MI) {
2360 assert (MI->isDebugValue() && "Invalid DBG_VALUE machine instruction!");
2361 if (MI->getOperand(0).isReg() && MI->getOperand(0).getReg())
2362 return true;
2363 return false;
2364}
2365
Devang Patelee432862010-05-20 19:57:06 +00002366/// collectVariableInfo - Populate DbgScope entries with variables' info.
Jim Grosbach1e20b962010-07-21 21:21:52 +00002367void
Devang Patel78e127d2010-06-25 22:07:34 +00002368DwarfDebug::collectVariableInfo(const MachineFunction *MF,
2369 SmallPtrSet<const MDNode *, 16> &Processed) {
Jim Grosbach1e20b962010-07-21 21:21:52 +00002370
Devang Patelee432862010-05-20 19:57:06 +00002371 /// collection info from MMI table.
2372 collectVariableInfoFromMMITable(MF, Processed);
2373
2374 SmallVector<const MachineInstr *, 8> DbgValues;
Devang Patel90a48ad2010-03-15 18:33:46 +00002375 // Collect variable information from DBG_VALUE machine instructions;
Chris Lattnerd38fee82010-04-05 00:13:49 +00002376 for (MachineFunction::const_iterator I = Asm->MF->begin(), E = Asm->MF->end();
Devang Patelee432862010-05-20 19:57:06 +00002377 I != E; ++I)
Devang Patel90a48ad2010-03-15 18:33:46 +00002378 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2379 II != IE; ++II) {
2380 const MachineInstr *MInsn = II;
Devang Patela36478f2011-01-11 21:42:10 +00002381 if (!MInsn->isDebugValue())
Devang Patel90a48ad2010-03-15 18:33:46 +00002382 continue;
Devang Patelee432862010-05-20 19:57:06 +00002383 DbgValues.push_back(MInsn);
2384 }
Devang Patel90a48ad2010-03-15 18:33:46 +00002385
Devang Patelc3f5f782010-05-25 23:40:22 +00002386 // This is a collection of DBV_VALUE instructions describing same variable.
2387 SmallVector<const MachineInstr *, 4> MultipleValues;
Devang Patelee432862010-05-20 19:57:06 +00002388 for(SmallVector<const MachineInstr *, 8>::iterator I = DbgValues.begin(),
2389 E = DbgValues.end(); I != E; ++I) {
2390 const MachineInstr *MInsn = *I;
Devang Patelc3f5f782010-05-25 23:40:22 +00002391 MultipleValues.clear();
2392 if (isDbgValueInDefinedReg(MInsn))
2393 MultipleValues.push_back(MInsn);
Devang Patelee432862010-05-20 19:57:06 +00002394 DIVariable DV(MInsn->getOperand(MInsn->getNumOperands() - 1).getMetadata());
2395 if (Processed.count(DV) != 0)
2396 continue;
2397
Devang Patel354eb7e2010-06-02 19:05:13 +00002398 const MachineInstr *PrevMI = MInsn;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002399 for (SmallVector<const MachineInstr *, 8>::iterator MI = I+1,
Devang Patelc3f5f782010-05-25 23:40:22 +00002400 ME = DbgValues.end(); MI != ME; ++MI) {
Jim Grosbach1e20b962010-07-21 21:21:52 +00002401 const MDNode *Var =
Devang Patelc3f5f782010-05-25 23:40:22 +00002402 (*MI)->getOperand((*MI)->getNumOperands()-1).getMetadata();
Devang Patela36478f2011-01-11 21:42:10 +00002403 if (Var == DV &&
Devang Patel354eb7e2010-06-02 19:05:13 +00002404 !PrevMI->isIdenticalTo(*MI))
Devang Patelc3f5f782010-05-25 23:40:22 +00002405 MultipleValues.push_back(*MI);
Devang Patel354eb7e2010-06-02 19:05:13 +00002406 PrevMI = *MI;
Devang Patelc3f5f782010-05-25 23:40:22 +00002407 }
2408
Devang Patela36478f2011-01-11 21:42:10 +00002409 DbgScope *Scope = NULL;
Devang Pateld8720f42010-05-27 20:25:04 +00002410 if (DV.getTag() == dwarf::DW_TAG_arg_variable &&
2411 DISubprogram(DV.getContext()).describes(MF->getFunction()))
Devang Patelc0c5a262010-05-21 00:10:20 +00002412 Scope = CurrentFnDbgScope;
Devang Patela36478f2011-01-11 21:42:10 +00002413 else
2414 Scope = findDbgScope(MInsn);
Devang Patelee432862010-05-20 19:57:06 +00002415 // If variable scope is not found then skip this variable.
Devang Patelc0c5a262010-05-21 00:10:20 +00002416 if (!Scope)
Devang Patelee432862010-05-20 19:57:06 +00002417 continue;
2418
2419 Processed.insert(DV);
Devang Patelee432862010-05-20 19:57:06 +00002420 DbgVariable *RegVar = new DbgVariable(DV);
Devang Patelee432862010-05-20 19:57:06 +00002421 Scope->addVariable(RegVar);
Devang Patelc0c5a262010-05-21 00:10:20 +00002422 if (DbgVariable *AbsVar = findAbstractVariable(DV, MInsn->getDebugLoc())) {
2423 DbgVariableToDbgInstMap[AbsVar] = MInsn;
2424 VarToAbstractVarMap[RegVar] = AbsVar;
Devang Patel90a48ad2010-03-15 18:33:46 +00002425 }
Devang Patelc3f5f782010-05-25 23:40:22 +00002426 if (MultipleValues.size() <= 1) {
2427 DbgVariableToDbgInstMap[RegVar] = MInsn;
2428 continue;
2429 }
2430
2431 // handle multiple DBG_VALUE instructions describing one variable.
Devang Patelc3f5f782010-05-25 23:40:22 +00002432 if (DotDebugLocEntries.empty())
Devang Patel80250682010-05-26 23:55:23 +00002433 RegVar->setDotDebugLocOffset(0);
2434 else
2435 RegVar->setDotDebugLocOffset(DotDebugLocEntries.size());
Devang Patele2df8422010-05-26 17:29:32 +00002436 const MachineInstr *Begin = NULL;
2437 const MachineInstr *End = NULL;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002438 for (SmallVector<const MachineInstr *, 4>::iterator
2439 MVI = MultipleValues.begin(), MVE = MultipleValues.end();
Devang Patel61409622010-07-07 20:12:52 +00002440 MVI != MVE; ++MVI) {
Devang Patele2df8422010-05-26 17:29:32 +00002441 if (!Begin) {
2442 Begin = *MVI;
2443 continue;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002444 }
Devang Patele2df8422010-05-26 17:29:32 +00002445 End = *MVI;
Devang Patelc3f5f782010-05-25 23:40:22 +00002446 MachineLocation MLoc;
Devang Patelb2cf5812010-08-04 18:40:52 +00002447 if (Begin->getNumOperands() == 3) {
2448 if (Begin->getOperand(0).isReg() && Begin->getOperand(1).isImm())
2449 MLoc.set(Begin->getOperand(0).getReg(), Begin->getOperand(1).getImm());
2450 } else
2451 MLoc = Asm->getDebugValueLocation(Begin);
2452
Devang Patele2df8422010-05-26 17:29:32 +00002453 const MCSymbol *FLabel = getLabelBeforeInsn(Begin);
2454 const MCSymbol *SLabel = getLabelBeforeInsn(End);
Devang Patel5573a7d2010-08-04 22:07:27 +00002455 if (MLoc.getReg())
2456 DotDebugLocEntries.push_back(DotDebugLocEntry(FLabel, SLabel, MLoc));
2457
Devang Patele2df8422010-05-26 17:29:32 +00002458 Begin = End;
2459 if (MVI + 1 == MVE) {
2460 // If End is the last instruction then its value is valid
Devang Patelc3f5f782010-05-25 23:40:22 +00002461 // until the end of the funtion.
Devang Patelb2cf5812010-08-04 18:40:52 +00002462 MachineLocation EMLoc;
2463 if (End->getNumOperands() == 3) {
2464 if (End->getOperand(0).isReg() && Begin->getOperand(1).isImm())
2465 EMLoc.set(Begin->getOperand(0).getReg(), Begin->getOperand(1).getImm());
2466 } else
2467 EMLoc = Asm->getDebugValueLocation(End);
Devang Patel5573a7d2010-08-04 22:07:27 +00002468 if (EMLoc.getReg())
2469 DotDebugLocEntries.
2470 push_back(DotDebugLocEntry(SLabel, FunctionEndSym, EMLoc));
Devang Patelc3f5f782010-05-25 23:40:22 +00002471 }
2472 }
2473 DotDebugLocEntries.push_back(DotDebugLocEntry());
Devang Patel90a48ad2010-03-15 18:33:46 +00002474 }
Devang Patel98e1cac2010-05-14 21:01:35 +00002475
2476 // Collect info for variables that were optimized out.
Devang Pateld1bbc6b2010-06-22 01:01:58 +00002477 const Function *F = MF->getFunction();
Devang Patel62367042010-11-10 22:19:21 +00002478 if (NamedMDNode *NMD = getFnSpecificMDNode(*(F->getParent()), F->getName())) {
Devang Patel98e1cac2010-05-14 21:01:35 +00002479 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
Dan Gohman872814a2010-07-21 18:54:18 +00002480 DIVariable DV(cast<MDNode>(NMD->getOperand(i)));
Devang Patelee432862010-05-20 19:57:06 +00002481 if (!DV || !Processed.insert(DV))
Devang Patel98e1cac2010-05-14 21:01:35 +00002482 continue;
2483 DbgScope *Scope = DbgScopeMap.lookup(DV.getContext());
2484 if (Scope)
Devang Patel26c1e562010-05-20 16:36:41 +00002485 Scope->addVariable(new DbgVariable(DV));
Devang Patel98e1cac2010-05-14 21:01:35 +00002486 }
2487 }
Devang Patelc3f5f782010-05-25 23:40:22 +00002488}
Devang Patel98e1cac2010-05-14 21:01:35 +00002489
Devang Patelc3f5f782010-05-25 23:40:22 +00002490/// getLabelBeforeInsn - Return Label preceding the instruction.
2491const MCSymbol *DwarfDebug::getLabelBeforeInsn(const MachineInstr *MI) {
2492 DenseMap<const MachineInstr *, MCSymbol *>::iterator I =
2493 LabelsBeforeInsn.find(MI);
2494 if (I == LabelsBeforeInsn.end())
2495 // FunctionBeginSym always preceeds all the instruction in current function.
2496 return FunctionBeginSym;
2497 return I->second;
2498}
2499
2500/// getLabelAfterInsn - Return Label immediately following the instruction.
2501const MCSymbol *DwarfDebug::getLabelAfterInsn(const MachineInstr *MI) {
2502 DenseMap<const MachineInstr *, MCSymbol *>::iterator I =
2503 LabelsAfterInsn.find(MI);
2504 if (I == LabelsAfterInsn.end())
2505 return NULL;
2506 return I->second;
Devang Patele717faa2009-10-06 01:26:37 +00002507}
2508
Devang Patelcbbe2872010-10-26 17:49:02 +00002509/// beginInstruction - Process beginning of an instruction.
2510void DwarfDebug::beginInstruction(const MachineInstr *MI) {
Devang Patelb2b31a62010-05-26 19:37:24 +00002511 if (InsnNeedsLabel.count(MI) == 0) {
2512 LabelsBeforeInsn[MI] = PrevLabel;
Devang Patel553881b2010-03-29 17:20:31 +00002513 return;
Devang Patelc3f5f782010-05-25 23:40:22 +00002514 }
Devang Patelaead63c2010-03-29 22:59:58 +00002515
Devang Patelb2b31a62010-05-26 19:37:24 +00002516 // Check location.
2517 DebugLoc DL = MI->getDebugLoc();
2518 if (!DL.isUnknown()) {
2519 const MDNode *Scope = DL.getScope(Asm->MF->getFunction()->getContext());
2520 PrevLabel = recordSourceLine(DL.getLine(), DL.getCol(), Scope);
Devang Pateleac9c072010-04-27 19:46:33 +00002521 PrevInstLoc = DL;
Devang Patelb2b31a62010-05-26 19:37:24 +00002522 LabelsBeforeInsn[MI] = PrevLabel;
2523 return;
Devang Pateleac9c072010-04-27 19:46:33 +00002524 }
Devang Patel553881b2010-03-29 17:20:31 +00002525
Jim Grosbach1e20b962010-07-21 21:21:52 +00002526 // If location is unknown then use temp label for this DBG_VALUE
Devang Patelb2b31a62010-05-26 19:37:24 +00002527 // instruction.
2528 if (MI->isDebugValue()) {
Devang Patel77051f52010-05-26 21:23:46 +00002529 PrevLabel = MMI->getContext().CreateTempSymbol();
2530 Asm->OutStreamer.EmitLabel(PrevLabel);
Devang Patelb2b31a62010-05-26 19:37:24 +00002531 LabelsBeforeInsn[MI] = PrevLabel;
2532 return;
2533 }
2534
2535 if (UnknownLocations) {
2536 PrevLabel = recordSourceLine(0, 0, 0);
2537 LabelsBeforeInsn[MI] = PrevLabel;
2538 return;
2539 }
2540
2541 assert (0 && "Instruction is not processed!");
Devang Patel0d20ac82009-10-06 01:50:42 +00002542}
2543
Devang Patelcbbe2872010-10-26 17:49:02 +00002544/// endInstruction - Process end of an instruction.
2545void DwarfDebug::endInstruction(const MachineInstr *MI) {
Devang Patel1c246352010-04-08 16:50:29 +00002546 if (InsnsEndScopeSet.count(MI) != 0) {
2547 // Emit a label if this instruction ends a scope.
2548 MCSymbol *Label = MMI->getContext().CreateTempSymbol();
2549 Asm->OutStreamer.EmitLabel(Label);
Devang Pateleac9c072010-04-27 19:46:33 +00002550 LabelsAfterInsn[MI] = Label;
Devang Patel1c246352010-04-08 16:50:29 +00002551 }
Devang Patel53bb5c92009-11-10 23:06:00 +00002552}
2553
Devang Pateleac9c072010-04-27 19:46:33 +00002554/// getOrCreateDbgScope - Create DbgScope for the scope.
Jim Grosbach1e20b962010-07-21 21:21:52 +00002555DbgScope *DwarfDebug::getOrCreateDbgScope(const MDNode *Scope,
Devang Patel61409622010-07-07 20:12:52 +00002556 const MDNode *InlinedAt) {
Devang Patel53bb5c92009-11-10 23:06:00 +00002557 if (!InlinedAt) {
2558 DbgScope *WScope = DbgScopeMap.lookup(Scope);
2559 if (WScope)
Devang Pateleac9c072010-04-27 19:46:33 +00002560 return WScope;
Devang Patel53bb5c92009-11-10 23:06:00 +00002561 WScope = new DbgScope(NULL, DIDescriptor(Scope), NULL);
2562 DbgScopeMap.insert(std::make_pair(Scope, WScope));
Devang Pateleac9c072010-04-27 19:46:33 +00002563 if (DIDescriptor(Scope).isLexicalBlock()) {
Jim Grosbach1e20b962010-07-21 21:21:52 +00002564 DbgScope *Parent =
Devang Patel2db49d72010-05-07 18:11:54 +00002565 getOrCreateDbgScope(DILexicalBlock(Scope).getContext(), NULL);
Devang Pateleac9c072010-04-27 19:46:33 +00002566 WScope->setParent(Parent);
2567 Parent->addScope(WScope);
2568 }
2569
2570 if (!WScope->getParent()) {
2571 StringRef SPName = DISubprogram(Scope).getLinkageName();
Stuart Hastingscad22ad2010-06-15 23:06:30 +00002572 // We used to check only for a linkage name, but that fails
2573 // since we began omitting the linkage name for private
2574 // functions. The new way is to check for the name in metadata,
2575 // but that's not supported in old .ll test cases. Ergo, we
2576 // check both.
Stuart Hastings215aa152010-06-11 20:08:44 +00002577 if (SPName == Asm->MF->getFunction()->getName() ||
2578 DISubprogram(Scope).getFunction() == Asm->MF->getFunction())
Devang Pateleac9c072010-04-27 19:46:33 +00002579 CurrentFnDbgScope = WScope;
2580 }
Jim Grosbach1e20b962010-07-21 21:21:52 +00002581
Devang Pateleac9c072010-04-27 19:46:33 +00002582 return WScope;
Devang Patel53bb5c92009-11-10 23:06:00 +00002583 }
2584
Devang Patel78e127d2010-06-25 22:07:34 +00002585 getOrCreateAbstractScope(Scope);
Devang Patel53bb5c92009-11-10 23:06:00 +00002586 DbgScope *WScope = DbgScopeMap.lookup(InlinedAt);
2587 if (WScope)
Devang Pateleac9c072010-04-27 19:46:33 +00002588 return WScope;
Devang Patel53bb5c92009-11-10 23:06:00 +00002589
2590 WScope = new DbgScope(NULL, DIDescriptor(Scope), InlinedAt);
2591 DbgScopeMap.insert(std::make_pair(InlinedAt, WScope));
2592 DILocation DL(InlinedAt);
Devang Pateleac9c072010-04-27 19:46:33 +00002593 DbgScope *Parent =
Devang Patel2db49d72010-05-07 18:11:54 +00002594 getOrCreateDbgScope(DL.getScope(), DL.getOrigLocation());
Devang Pateleac9c072010-04-27 19:46:33 +00002595 WScope->setParent(Parent);
2596 Parent->addScope(WScope);
2597
2598 ConcreteScopes[InlinedAt] = WScope;
Devang Pateleac9c072010-04-27 19:46:33 +00002599
2600 return WScope;
Devang Patel0d20ac82009-10-06 01:50:42 +00002601}
2602
Devang Pateleac9c072010-04-27 19:46:33 +00002603/// hasValidLocation - Return true if debug location entry attached with
2604/// machine instruction encodes valid location info.
2605static bool hasValidLocation(LLVMContext &Ctx,
2606 const MachineInstr *MInsn,
Devang Patele9f8f5e2010-05-07 20:54:48 +00002607 const MDNode *&Scope, const MDNode *&InlinedAt) {
Devang Pateleac9c072010-04-27 19:46:33 +00002608 DebugLoc DL = MInsn->getDebugLoc();
2609 if (DL.isUnknown()) return false;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002610
Devang Patele9f8f5e2010-05-07 20:54:48 +00002611 const MDNode *S = DL.getScope(Ctx);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002612
Devang Pateleac9c072010-04-27 19:46:33 +00002613 // There is no need to create another DIE for compile unit. For all
2614 // other scopes, create one DbgScope now. This will be translated
2615 // into a scope DIE at the end.
2616 if (DIScope(S).isCompileUnit()) return false;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002617
Devang Pateleac9c072010-04-27 19:46:33 +00002618 Scope = S;
2619 InlinedAt = DL.getInlinedAt(Ctx);
2620 return true;
2621}
2622
2623/// calculateDominanceGraph - Calculate dominance graph for DbgScope
2624/// hierarchy.
2625static void calculateDominanceGraph(DbgScope *Scope) {
2626 assert (Scope && "Unable to calculate scop edominance graph!");
2627 SmallVector<DbgScope *, 4> WorkStack;
2628 WorkStack.push_back(Scope);
2629 unsigned Counter = 0;
2630 while (!WorkStack.empty()) {
2631 DbgScope *WS = WorkStack.back();
2632 const SmallVector<DbgScope *, 4> &Children = WS->getScopes();
2633 bool visitedChildren = false;
2634 for (SmallVector<DbgScope *, 4>::const_iterator SI = Children.begin(),
2635 SE = Children.end(); SI != SE; ++SI) {
2636 DbgScope *ChildScope = *SI;
2637 if (!ChildScope->getDFSOut()) {
2638 WorkStack.push_back(ChildScope);
2639 visitedChildren = true;
2640 ChildScope->setDFSIn(++Counter);
2641 break;
2642 }
2643 }
2644 if (!visitedChildren) {
2645 WorkStack.pop_back();
2646 WS->setDFSOut(++Counter);
2647 }
2648 }
2649}
2650
2651/// printDbgScopeInfo - Print DbgScope info for each machine instruction.
Jim Grosbach1e20b962010-07-21 21:21:52 +00002652static
Devang Pateleac9c072010-04-27 19:46:33 +00002653void printDbgScopeInfo(LLVMContext &Ctx, const MachineFunction *MF,
2654 DenseMap<const MachineInstr *, DbgScope *> &MI2ScopeMap)
2655{
2656#ifndef NDEBUG
2657 unsigned PrevDFSIn = 0;
2658 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2659 I != E; ++I) {
2660 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2661 II != IE; ++II) {
2662 const MachineInstr *MInsn = II;
Devang Patele9f8f5e2010-05-07 20:54:48 +00002663 const MDNode *Scope = NULL;
2664 const MDNode *InlinedAt = NULL;
Devang Pateleac9c072010-04-27 19:46:33 +00002665
2666 // Check if instruction has valid location information.
2667 if (hasValidLocation(Ctx, MInsn, Scope, InlinedAt)) {
2668 dbgs() << " [ ";
Jim Grosbach1e20b962010-07-21 21:21:52 +00002669 if (InlinedAt)
Devang Pateleac9c072010-04-27 19:46:33 +00002670 dbgs() << "*";
Jim Grosbach1e20b962010-07-21 21:21:52 +00002671 DenseMap<const MachineInstr *, DbgScope *>::iterator DI =
Devang Pateleac9c072010-04-27 19:46:33 +00002672 MI2ScopeMap.find(MInsn);
2673 if (DI != MI2ScopeMap.end()) {
2674 DbgScope *S = DI->second;
2675 dbgs() << S->getDFSIn();
2676 PrevDFSIn = S->getDFSIn();
2677 } else
2678 dbgs() << PrevDFSIn;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002679 } else
Devang Pateleac9c072010-04-27 19:46:33 +00002680 dbgs() << " [ x" << PrevDFSIn;
2681 dbgs() << " ]";
2682 MInsn->dump();
2683 }
2684 dbgs() << "\n";
2685 }
2686#endif
2687}
Devang Patel2c4ceb12009-11-21 02:48:08 +00002688/// extractScopeInformation - Scan machine instructions in this function
Chris Lattner14d750d2010-03-31 05:39:57 +00002689/// and collect DbgScopes. Return true, if at least one scope was found.
Chris Lattnereec791a2010-01-26 23:18:02 +00002690bool DwarfDebug::extractScopeInformation() {
Devang Patelaf9e8472009-10-01 20:31:14 +00002691 // If scope information was extracted using .dbg intrinsics then there is not
2692 // any need to extract these information by scanning each instruction.
2693 if (!DbgScopeMap.empty())
2694 return false;
2695
Dan Gohman314bf7c2010-04-23 01:18:53 +00002696 // Scan each instruction and create scopes. First build working set of scopes.
Devang Pateleac9c072010-04-27 19:46:33 +00002697 LLVMContext &Ctx = Asm->MF->getFunction()->getContext();
2698 SmallVector<DbgRange, 4> MIRanges;
2699 DenseMap<const MachineInstr *, DbgScope *> MI2ScopeMap;
Devang Patele9f8f5e2010-05-07 20:54:48 +00002700 const MDNode *PrevScope = NULL;
2701 const MDNode *PrevInlinedAt = NULL;
Devang Pateleac9c072010-04-27 19:46:33 +00002702 const MachineInstr *RangeBeginMI = NULL;
2703 const MachineInstr *PrevMI = NULL;
Chris Lattnerd38fee82010-04-05 00:13:49 +00002704 for (MachineFunction::const_iterator I = Asm->MF->begin(), E = Asm->MF->end();
Devang Patelaf9e8472009-10-01 20:31:14 +00002705 I != E; ++I) {
2706 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2707 II != IE; ++II) {
2708 const MachineInstr *MInsn = II;
Devang Patele9f8f5e2010-05-07 20:54:48 +00002709 const MDNode *Scope = NULL;
2710 const MDNode *InlinedAt = NULL;
Devang Pateleac9c072010-04-27 19:46:33 +00002711
2712 // Check if instruction has valid location information.
2713 if (!hasValidLocation(Ctx, MInsn, Scope, InlinedAt)) {
2714 PrevMI = MInsn;
2715 continue;
2716 }
Jim Grosbach1e20b962010-07-21 21:21:52 +00002717
Devang Pateleac9c072010-04-27 19:46:33 +00002718 // If scope has not changed then skip this instruction.
2719 if (Scope == PrevScope && PrevInlinedAt == InlinedAt) {
2720 PrevMI = MInsn;
2721 continue;
2722 }
2723
Devang Pateld3526ea2011-02-15 17:56:09 +00002724 // Ignore DBG_VALUE. It does not contribute any instruction in output.
2725 if (MInsn->isDebugValue())
2726 continue;
2727
Jim Grosbach1e20b962010-07-21 21:21:52 +00002728 if (RangeBeginMI) {
2729 // If we have alread seen a beginning of a instruction range and
Devang Pateleac9c072010-04-27 19:46:33 +00002730 // current instruction scope does not match scope of first instruction
2731 // in this range then create a new instruction range.
2732 DbgRange R(RangeBeginMI, PrevMI);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002733 MI2ScopeMap[RangeBeginMI] = getOrCreateDbgScope(PrevScope,
Devang Patel61409622010-07-07 20:12:52 +00002734 PrevInlinedAt);
Devang Pateleac9c072010-04-27 19:46:33 +00002735 MIRanges.push_back(R);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002736 }
Devang Pateleac9c072010-04-27 19:46:33 +00002737
2738 // This is a beginning of a new instruction range.
2739 RangeBeginMI = MInsn;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002740
Devang Pateleac9c072010-04-27 19:46:33 +00002741 // Reset previous markers.
2742 PrevMI = MInsn;
2743 PrevScope = Scope;
2744 PrevInlinedAt = InlinedAt;
Devang Patel53bb5c92009-11-10 23:06:00 +00002745 }
2746 }
2747
Devang Pateleac9c072010-04-27 19:46:33 +00002748 // Create last instruction range.
2749 if (RangeBeginMI && PrevMI && PrevScope) {
2750 DbgRange R(RangeBeginMI, PrevMI);
2751 MIRanges.push_back(R);
2752 MI2ScopeMap[RangeBeginMI] = getOrCreateDbgScope(PrevScope, PrevInlinedAt);
Devang Patelaf9e8472009-10-01 20:31:14 +00002753 }
Jim Grosbach1e20b962010-07-21 21:21:52 +00002754
Devang Patel344130e2010-01-04 20:44:00 +00002755 if (!CurrentFnDbgScope)
2756 return false;
2757
Devang Pateleac9c072010-04-27 19:46:33 +00002758 calculateDominanceGraph(CurrentFnDbgScope);
2759 if (PrintDbgScope)
2760 printDbgScopeInfo(Ctx, Asm->MF, MI2ScopeMap);
2761
2762 // Find ranges of instructions covered by each DbgScope;
2763 DbgScope *PrevDbgScope = NULL;
2764 for (SmallVector<DbgRange, 4>::const_iterator RI = MIRanges.begin(),
2765 RE = MIRanges.end(); RI != RE; ++RI) {
2766 const DbgRange &R = *RI;
2767 DbgScope *S = MI2ScopeMap.lookup(R.first);
2768 assert (S && "Lost DbgScope for a machine instruction!");
2769 if (PrevDbgScope && !PrevDbgScope->dominates(S))
2770 PrevDbgScope->closeInsnRange(S);
2771 S->openInsnRange(R.first);
2772 S->extendInsnRange(R.second);
2773 PrevDbgScope = S;
2774 }
2775
2776 if (PrevDbgScope)
2777 PrevDbgScope->closeInsnRange();
Devang Patelaf9e8472009-10-01 20:31:14 +00002778
Devang Patele37b0c62010-04-08 18:43:56 +00002779 identifyScopeMarkers();
Devang Patel6122a4d2010-04-08 15:37:09 +00002780
2781 return !DbgScopeMap.empty();
2782}
2783
Jim Grosbach1e20b962010-07-21 21:21:52 +00002784/// identifyScopeMarkers() -
Devang Pateleac9c072010-04-27 19:46:33 +00002785/// Each DbgScope has first instruction and last instruction to mark beginning
2786/// and end of a scope respectively. Create an inverse map that list scopes
2787/// starts (and ends) with an instruction. One instruction may start (or end)
2788/// multiple scopes. Ignore scopes that are not reachable.
Devang Patele37b0c62010-04-08 18:43:56 +00002789void DwarfDebug::identifyScopeMarkers() {
Devang Patel42aafd72010-01-20 02:05:23 +00002790 SmallVector<DbgScope *, 4> WorkList;
2791 WorkList.push_back(CurrentFnDbgScope);
2792 while (!WorkList.empty()) {
Chris Lattner14d750d2010-03-31 05:39:57 +00002793 DbgScope *S = WorkList.pop_back_val();
Jim Grosbach1e20b962010-07-21 21:21:52 +00002794
Jeffrey Yasskin5c213dc2010-03-12 17:45:06 +00002795 const SmallVector<DbgScope *, 4> &Children = S->getScopes();
Jim Grosbach1e20b962010-07-21 21:21:52 +00002796 if (!Children.empty())
Jeffrey Yasskin5c213dc2010-03-12 17:45:06 +00002797 for (SmallVector<DbgScope *, 4>::const_iterator SI = Children.begin(),
Devang Patel42aafd72010-01-20 02:05:23 +00002798 SE = Children.end(); SI != SE; ++SI)
2799 WorkList.push_back(*SI);
2800
Devang Patel53bb5c92009-11-10 23:06:00 +00002801 if (S->isAbstractScope())
2802 continue;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002803
Devang Pateleac9c072010-04-27 19:46:33 +00002804 const SmallVector<DbgRange, 4> &Ranges = S->getRanges();
2805 if (Ranges.empty())
2806 continue;
2807 for (SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin(),
2808 RE = Ranges.end(); RI != RE; ++RI) {
Jim Grosbach1e20b962010-07-21 21:21:52 +00002809 assert(RI->first && "DbgRange does not have first instruction!");
2810 assert(RI->second && "DbgRange does not have second instruction!");
Devang Pateleac9c072010-04-27 19:46:33 +00002811 InsnsEndScopeSet.insert(RI->second);
2812 }
Devang Patelaf9e8472009-10-01 20:31:14 +00002813 }
Devang Patelaf9e8472009-10-01 20:31:14 +00002814}
2815
Dan Gohman084751c2010-04-20 00:37:27 +00002816/// FindFirstDebugLoc - Find the first debug location in the function. This
2817/// is intended to be an approximation for the source position of the
2818/// beginning of the function.
2819static DebugLoc FindFirstDebugLoc(const MachineFunction *MF) {
2820 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2821 I != E; ++I)
2822 for (MachineBasicBlock::const_iterator MBBI = I->begin(), MBBE = I->end();
2823 MBBI != MBBE; ++MBBI) {
2824 DebugLoc DL = MBBI->getDebugLoc();
2825 if (!DL.isUnknown())
2826 return DL;
2827 }
2828 return DebugLoc();
2829}
2830
Devang Patel9a31f0f2010-10-25 20:45:32 +00002831#ifndef NDEBUG
2832/// CheckLineNumbers - Count basicblocks whose instructions do not have any
2833/// line number information.
2834static void CheckLineNumbers(const MachineFunction *MF) {
2835 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2836 I != E; ++I) {
2837 bool FoundLineNo = false;
2838 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2839 II != IE; ++II) {
2840 const MachineInstr *MI = II;
2841 if (!MI->getDebugLoc().isUnknown()) {
2842 FoundLineNo = true;
2843 break;
2844 }
2845 }
Devang Patel4d7f9a02010-10-28 22:11:59 +00002846 if (!FoundLineNo && I->size())
Devang Patel9a31f0f2010-10-25 20:45:32 +00002847 ++BlocksWithoutLineNo;
2848 }
2849}
2850#endif
2851
Devang Patel2c4ceb12009-11-21 02:48:08 +00002852/// beginFunction - Gather pre-function debug information. Assumes being
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002853/// emitted immediately after the function entry point.
Chris Lattnereec791a2010-01-26 23:18:02 +00002854void DwarfDebug::beginFunction(const MachineFunction *MF) {
Chris Lattner994cb122010-04-05 03:52:55 +00002855 if (!MMI->hasDebugInfo()) return;
Bill Wendling5f017e82010-04-07 09:28:04 +00002856 if (!extractScopeInformation()) return;
Devang Patel60b35bd2009-10-06 18:37:31 +00002857
Devang Patel9a31f0f2010-10-25 20:45:32 +00002858#ifndef NDEBUG
2859 CheckLineNumbers(MF);
2860#endif
2861
Devang Pateleac9c072010-04-27 19:46:33 +00002862 FunctionBeginSym = Asm->GetTempSymbol("func_begin",
2863 Asm->getFunctionNumber());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002864 // Assumes in correct section after the entry point.
Devang Pateleac9c072010-04-27 19:46:33 +00002865 Asm->OutStreamer.EmitLabel(FunctionBeginSym);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002866
2867 // Emit label for the implicitly defined dbg.stoppoint at the start of the
2868 // function.
Dan Gohman084751c2010-04-20 00:37:27 +00002869 DebugLoc FDL = FindFirstDebugLoc(MF);
Chris Lattnerde4845c2010-04-02 19:42:39 +00002870 if (FDL.isUnknown()) return;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002871
Devang Patele9f8f5e2010-05-07 20:54:48 +00002872 const MDNode *Scope = FDL.getScope(MF->getFunction()->getContext());
Stuart Hastings0db42712010-07-19 23:56:30 +00002873 const MDNode *TheScope = 0;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002874
Chris Lattnerde4845c2010-04-02 19:42:39 +00002875 DISubprogram SP = getDISubprogram(Scope);
2876 unsigned Line, Col;
2877 if (SP.Verify()) {
2878 Line = SP.getLineNumber();
2879 Col = 0;
Stuart Hastings0db42712010-07-19 23:56:30 +00002880 TheScope = SP;
Chris Lattnerde4845c2010-04-02 19:42:39 +00002881 } else {
2882 Line = FDL.getLine();
2883 Col = FDL.getCol();
Stuart Hastings0db42712010-07-19 23:56:30 +00002884 TheScope = Scope;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002885 }
Jim Grosbach1e20b962010-07-21 21:21:52 +00002886
Stuart Hastings0db42712010-07-19 23:56:30 +00002887 recordSourceLine(Line, Col, TheScope);
Devang Patelb2b31a62010-05-26 19:37:24 +00002888
Devang Patelb9abe9f2010-06-02 16:42:51 +00002889 /// ProcessedArgs - Collection of arguments already processed.
2890 SmallPtrSet<const MDNode *, 8> ProcessedArgs;
2891
Devang Patelb2b31a62010-05-26 19:37:24 +00002892 DebugLoc PrevLoc;
2893 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2894 I != E; ++I)
2895 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2896 II != IE; ++II) {
2897 const MachineInstr *MI = II;
2898 DebugLoc DL = MI->getDebugLoc();
2899 if (MI->isDebugValue()) {
Devang Patelb2b31a62010-05-26 19:37:24 +00002900 assert (MI->getNumOperands() > 1 && "Invalid machine instruction!");
2901 DIVariable DV(MI->getOperand(MI->getNumOperands() - 1).getMetadata());
2902 if (!DV.Verify()) continue;
Devang Patel55e97172010-05-27 16:47:30 +00002903 // If DBG_VALUE is for a local variable then it needs a label.
Devang Patelb7313e22010-12-06 22:48:22 +00002904 if (DV.getTag() != dwarf::DW_TAG_arg_variable)
Devang Patelb2b31a62010-05-26 19:37:24 +00002905 InsnNeedsLabel.insert(MI);
Devang Patel55e97172010-05-27 16:47:30 +00002906 // DBG_VALUE for inlined functions argument needs a label.
Devang Patel7fb231c2010-07-01 21:38:08 +00002907 else if (!DISubprogram(getDISubprogram(DV.getContext())).
2908 describes(MF->getFunction()))
Devang Patel55e97172010-05-27 16:47:30 +00002909 InsnNeedsLabel.insert(MI);
2910 // DBG_VALUE indicating argument location change needs a label.
Devang Patelb7313e22010-12-06 22:48:22 +00002911 else if (!ProcessedArgs.insert(DV))
Devang Patelb2b31a62010-05-26 19:37:24 +00002912 InsnNeedsLabel.insert(MI);
2913 } else {
Jim Grosbach1e20b962010-07-21 21:21:52 +00002914 // If location is unknown then instruction needs a location only if
Devang Patelb2b31a62010-05-26 19:37:24 +00002915 // UnknownLocations flag is set.
2916 if (DL.isUnknown()) {
2917 if (UnknownLocations && !PrevLoc.isUnknown())
2918 InsnNeedsLabel.insert(MI);
2919 } else if (DL != PrevLoc)
2920 // Otherwise, instruction needs a location only if it is new location.
2921 InsnNeedsLabel.insert(MI);
2922 }
Jim Grosbach1e20b962010-07-21 21:21:52 +00002923
Devang Patelb2b31a62010-05-26 19:37:24 +00002924 if (!DL.isUnknown() || UnknownLocations)
2925 PrevLoc = DL;
2926 }
2927
2928 PrevLabel = FunctionBeginSym;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002929}
2930
Devang Patel2c4ceb12009-11-21 02:48:08 +00002931/// endFunction - Gather and emit post-function debug information.
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002932///
Chris Lattnereec791a2010-01-26 23:18:02 +00002933void DwarfDebug::endFunction(const MachineFunction *MF) {
Bill Wendling5f017e82010-04-07 09:28:04 +00002934 if (!MMI->hasDebugInfo() || DbgScopeMap.empty()) return;
Devang Patel70d75ca2009-11-12 19:02:56 +00002935
Devang Patel344130e2010-01-04 20:44:00 +00002936 if (CurrentFnDbgScope) {
Devang Patel65eb4822010-05-22 00:04:14 +00002937
Devang Patelc3f5f782010-05-25 23:40:22 +00002938 // Define end label for subprogram.
2939 FunctionEndSym = Asm->GetTempSymbol("func_end",
2940 Asm->getFunctionNumber());
2941 // Assumes in correct section after the entry point.
2942 Asm->OutStreamer.EmitLabel(FunctionEndSym);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002943
Devang Patel78e127d2010-06-25 22:07:34 +00002944 SmallPtrSet<const MDNode *, 16> ProcessedVars;
2945 collectVariableInfo(MF, ProcessedVars);
Devang Patel65eb4822010-05-22 00:04:14 +00002946
Devang Patel344130e2010-01-04 20:44:00 +00002947 // Construct abstract scopes.
2948 for (SmallVector<DbgScope *, 4>::iterator AI = AbstractScopesList.begin(),
Devang Patel78e127d2010-06-25 22:07:34 +00002949 AE = AbstractScopesList.end(); AI != AE; ++AI) {
Devang Patel78e127d2010-06-25 22:07:34 +00002950 DISubprogram SP((*AI)->getScopeNode());
2951 if (SP.Verify()) {
2952 // Collect info for variables that were optimized out.
2953 StringRef FName = SP.getLinkageName();
2954 if (FName.empty())
2955 FName = SP.getName();
Devang Patel62367042010-11-10 22:19:21 +00002956 if (NamedMDNode *NMD =
2957 getFnSpecificMDNode(*(MF->getFunction()->getParent()), FName)) {
Devang Patel78e127d2010-06-25 22:07:34 +00002958 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
Dan Gohman872814a2010-07-21 18:54:18 +00002959 DIVariable DV(cast<MDNode>(NMD->getOperand(i)));
Devang Patel78e127d2010-06-25 22:07:34 +00002960 if (!DV || !ProcessedVars.insert(DV))
2961 continue;
Devang Patel1d68d212010-06-30 00:11:08 +00002962 DbgScope *Scope = AbstractScopes.lookup(DV.getContext());
Devang Patel78e127d2010-06-25 22:07:34 +00002963 if (Scope)
2964 Scope->addVariable(new DbgVariable(DV));
2965 }
2966 }
2967 }
Devang Patel90e19aa2010-06-30 01:40:11 +00002968 if (ProcessedSPNodes.count((*AI)->getScopeNode()) == 0)
2969 constructScopeDIE(*AI);
Devang Patel78e127d2010-06-25 22:07:34 +00002970 }
Devang Patel61409622010-07-07 20:12:52 +00002971
Devang Patel9c488372010-05-04 06:15:30 +00002972 DIE *CurFnDIE = constructScopeDIE(CurrentFnDbgScope);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002973
Devang Patel9c488372010-05-04 06:15:30 +00002974 if (!DisableFramePointerElim(*MF))
Jim Grosbach1e20b962010-07-21 21:21:52 +00002975 addUInt(CurFnDIE, dwarf::DW_AT_APPLE_omit_frame_ptr,
Devang Patel9c488372010-05-04 06:15:30 +00002976 dwarf::DW_FORM_flag, 1);
2977
2978
Chris Lattnerd38fee82010-04-05 00:13:49 +00002979 DebugFrames.push_back(FunctionDebugFrameInfo(Asm->getFunctionNumber(),
Devang Patel344130e2010-01-04 20:44:00 +00002980 MMI->getFrameMoves()));
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002981 }
2982
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002983 // Clear debug info
Devang Patelf54b8522010-01-19 01:26:02 +00002984 CurrentFnDbgScope = NULL;
Devang Patelb2b31a62010-05-26 19:37:24 +00002985 InsnNeedsLabel.clear();
Devang Patel26c1e562010-05-20 16:36:41 +00002986 DbgVariableToFrameIndexMap.clear();
2987 VarToAbstractVarMap.clear();
2988 DbgVariableToDbgInstMap.clear();
Jeffrey Yasskin5c213dc2010-03-12 17:45:06 +00002989 DeleteContainerSeconds(DbgScopeMap);
Devang Patel51424712010-04-09 16:04:20 +00002990 InsnsEndScopeSet.clear();
Devang Patelf54b8522010-01-19 01:26:02 +00002991 ConcreteScopes.clear();
Jeffrey Yasskin5c213dc2010-03-12 17:45:06 +00002992 DeleteContainerSeconds(AbstractScopes);
Devang Patelf54b8522010-01-19 01:26:02 +00002993 AbstractScopesList.clear();
Jeffrey Yasskin5c213dc2010-03-12 17:45:06 +00002994 AbstractVariables.clear();
Devang Pateleac9c072010-04-27 19:46:33 +00002995 LabelsBeforeInsn.clear();
2996 LabelsAfterInsn.clear();
Devang Patelf2548ca2010-04-16 23:33:45 +00002997 PrevLabel = NULL;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002998}
2999
Devang Patel26c1e562010-05-20 16:36:41 +00003000/// recordVariableFrameIndex - Record a variable's index.
3001void DwarfDebug::recordVariableFrameIndex(const DbgVariable *V, int Index) {
3002 assert (V && "Invalid DbgVariable!");
3003 DbgVariableToFrameIndexMap[V] = Index;
3004}
3005
3006/// findVariableFrameIndex - Return true if frame index for the variable
3007/// is found. Update FI to hold value of the index.
3008bool DwarfDebug::findVariableFrameIndex(const DbgVariable *V, int *FI) {
3009 assert (V && "Invalid DbgVariable!");
3010 DenseMap<const DbgVariable *, int>::iterator I =
3011 DbgVariableToFrameIndexMap.find(V);
3012 if (I == DbgVariableToFrameIndexMap.end())
3013 return false;
3014 *FI = I->second;
3015 return true;
3016}
3017
Jim Grosbach1e20b962010-07-21 21:21:52 +00003018/// findDbgScope - Find DbgScope for the debug loc attached with an
Devang Patelee432862010-05-20 19:57:06 +00003019/// instruction.
3020DbgScope *DwarfDebug::findDbgScope(const MachineInstr *MInsn) {
3021 DbgScope *Scope = NULL;
Jim Grosbach1e20b962010-07-21 21:21:52 +00003022 LLVMContext &Ctx =
Devang Patelee432862010-05-20 19:57:06 +00003023 MInsn->getParent()->getParent()->getFunction()->getContext();
3024 DebugLoc DL = MInsn->getDebugLoc();
3025
Jim Grosbach1e20b962010-07-21 21:21:52 +00003026 if (DL.isUnknown())
Devang Patelee432862010-05-20 19:57:06 +00003027 return Scope;
3028
3029 if (const MDNode *IA = DL.getInlinedAt(Ctx))
3030 Scope = ConcreteScopes.lookup(IA);
3031 if (Scope == 0)
3032 Scope = DbgScopeMap.lookup(DL.getScope(Ctx));
Jim Grosbach1e20b962010-07-21 21:21:52 +00003033
Devang Patelee432862010-05-20 19:57:06 +00003034 return Scope;
3035}
3036
3037
Chris Lattnerc6087842010-03-09 04:54:43 +00003038/// recordSourceLine - Register a source line with debug info. Returns the
3039/// unique label that was emitted and which provides correspondence to
3040/// the source line list.
Jim Grosbach1e20b962010-07-21 21:21:52 +00003041MCSymbol *DwarfDebug::recordSourceLine(unsigned Line, unsigned Col,
Devang Patel61409622010-07-07 20:12:52 +00003042 const MDNode *S) {
Devang Patel65dbc902009-11-25 17:36:49 +00003043 StringRef Fn;
Devang Patelf84548d2009-10-05 18:03:19 +00003044
Dan Gohman1cc0d622010-05-05 23:41:32 +00003045 unsigned Src = 1;
3046 if (S) {
3047 DIDescriptor Scope(S);
Devang Patelf84548d2009-10-05 18:03:19 +00003048
Dan Gohman1cc0d622010-05-05 23:41:32 +00003049 if (Scope.isCompileUnit()) {
3050 DICompileUnit CU(S);
Dan Gohman1cc0d622010-05-05 23:41:32 +00003051 Fn = CU.getFilename();
Devang Patel3cabc9d2010-10-28 17:30:52 +00003052 } else if (Scope.isFile()) {
3053 DIFile F(S);
Devang Patel3cabc9d2010-10-28 17:30:52 +00003054 Fn = F.getFilename();
Dan Gohman1cc0d622010-05-05 23:41:32 +00003055 } else if (Scope.isSubprogram()) {
3056 DISubprogram SP(S);
Dan Gohman1cc0d622010-05-05 23:41:32 +00003057 Fn = SP.getFilename();
3058 } else if (Scope.isLexicalBlock()) {
3059 DILexicalBlock DB(S);
Dan Gohman1cc0d622010-05-05 23:41:32 +00003060 Fn = DB.getFilename();
3061 } else
3062 assert(0 && "Unexpected scope info");
3063
Rafael Espindola5c055632010-11-18 02:04:25 +00003064 Src = GetOrCreateSourceID(Fn);
Dan Gohman1cc0d622010-05-05 23:41:32 +00003065 }
3066
Rafael Espindola5c055632010-11-18 02:04:25 +00003067 Asm->OutStreamer.EmitDwarfLocDirective(Src, Line, Col, DWARF2_FLAG_IS_STMT,
3068 0, 0);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00003069
Rafael Espindola5c055632010-11-18 02:04:25 +00003070 MCSymbol *Label = MMI->getContext().CreateTempSymbol();
Chris Lattnerc6087842010-03-09 04:54:43 +00003071 Asm->OutStreamer.EmitLabel(Label);
3072 return Label;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00003073}
3074
Bill Wendling829e67b2009-05-20 23:22:40 +00003075//===----------------------------------------------------------------------===//
3076// Emit Methods
3077//===----------------------------------------------------------------------===//
3078
Devang Patel2c4ceb12009-11-21 02:48:08 +00003079/// computeSizeAndOffset - Compute the size and offset of a DIE.
Bill Wendling94d04b82009-05-20 23:21:38 +00003080///
Jim Grosbach7ab38df2009-11-22 19:20:36 +00003081unsigned
3082DwarfDebug::computeSizeAndOffset(DIE *Die, unsigned Offset, bool Last) {
Bill Wendling94d04b82009-05-20 23:21:38 +00003083 // Get the children.
3084 const std::vector<DIE *> &Children = Die->getChildren();
3085
3086 // If not last sibling and has children then add sibling offset attribute.
Jeffrey Yasskin638fe8d2010-03-22 18:47:14 +00003087 if (!Last && !Children.empty())
Benjamin Kramer345ef342010-03-31 19:34:01 +00003088 Die->addSiblingOffset(DIEValueAllocator);
Bill Wendling94d04b82009-05-20 23:21:38 +00003089
3090 // Record the abbreviation.
Devang Patel2c4ceb12009-11-21 02:48:08 +00003091 assignAbbrevNumber(Die->getAbbrev());
Bill Wendling94d04b82009-05-20 23:21:38 +00003092
3093 // Get the abbreviation for this DIE.
3094 unsigned AbbrevNumber = Die->getAbbrevNumber();
3095 const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
3096
3097 // Set DIE offset
3098 Die->setOffset(Offset);
3099
3100 // Start the size with the size of abbreviation code.
Chris Lattneraf76e592009-08-22 20:48:53 +00003101 Offset += MCAsmInfo::getULEB128Size(AbbrevNumber);
Bill Wendling94d04b82009-05-20 23:21:38 +00003102
3103 const SmallVector<DIEValue*, 32> &Values = Die->getValues();
3104 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
3105
3106 // Size the DIE attribute values.
3107 for (unsigned i = 0, N = Values.size(); i < N; ++i)
3108 // Size attribute value.
Chris Lattnera37d5382010-04-05 00:18:22 +00003109 Offset += Values[i]->SizeOf(Asm, AbbrevData[i].getForm());
Bill Wendling94d04b82009-05-20 23:21:38 +00003110
3111 // Size the DIE children if any.
3112 if (!Children.empty()) {
3113 assert(Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes &&
3114 "Children flag not set");
3115
3116 for (unsigned j = 0, M = Children.size(); j < M; ++j)
Devang Patel2c4ceb12009-11-21 02:48:08 +00003117 Offset = computeSizeAndOffset(Children[j], Offset, (j + 1) == M);
Bill Wendling94d04b82009-05-20 23:21:38 +00003118
3119 // End of children marker.
3120 Offset += sizeof(int8_t);
3121 }
3122
3123 Die->setSize(Offset - Die->getOffset());
3124 return Offset;
3125}
3126
Devang Patel2c4ceb12009-11-21 02:48:08 +00003127/// computeSizeAndOffsets - Compute the size and offset of all the DIEs.
Bill Wendling94d04b82009-05-20 23:21:38 +00003128///
Devang Patel2c4ceb12009-11-21 02:48:08 +00003129void DwarfDebug::computeSizeAndOffsets() {
Devang Patel163a9f72010-05-10 22:49:55 +00003130 unsigned PrevOffset = 0;
3131 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
3132 E = CUMap.end(); I != E; ++I) {
3133 // Compute size of compile unit header.
3134 static unsigned Offset = PrevOffset +
3135 sizeof(int32_t) + // Length of Compilation Unit Info
3136 sizeof(int16_t) + // DWARF version number
3137 sizeof(int32_t) + // Offset Into Abbrev. Section
3138 sizeof(int8_t); // Pointer Size (in bytes)
3139 computeSizeAndOffset(I->second->getCUDie(), Offset, true);
3140 PrevOffset = Offset;
3141 }
Bill Wendling94d04b82009-05-20 23:21:38 +00003142}
3143
Chris Lattner11b8f302010-04-04 23:02:02 +00003144/// EmitSectionSym - Switch to the specified MCSection and emit an assembler
3145/// temporary label to it if SymbolStem is specified.
Chris Lattner9c69e285532010-04-04 22:59:04 +00003146static MCSymbol *EmitSectionSym(AsmPrinter *Asm, const MCSection *Section,
Chris Lattner11b8f302010-04-04 23:02:02 +00003147 const char *SymbolStem = 0) {
Chris Lattner9c69e285532010-04-04 22:59:04 +00003148 Asm->OutStreamer.SwitchSection(Section);
Chris Lattner11b8f302010-04-04 23:02:02 +00003149 if (!SymbolStem) return 0;
Jim Grosbach1e20b962010-07-21 21:21:52 +00003150
Chris Lattner9c69e285532010-04-04 22:59:04 +00003151 MCSymbol *TmpSym = Asm->GetTempSymbol(SymbolStem);
3152 Asm->OutStreamer.EmitLabel(TmpSym);
3153 return TmpSym;
3154}
3155
3156/// EmitSectionLabels - Emit initial Dwarf sections with a label at
3157/// the start of each one.
Chris Lattnerfa070b02010-04-04 22:33:59 +00003158void DwarfDebug::EmitSectionLabels() {
Chris Lattner6c2f9e12009-08-19 05:49:37 +00003159 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
Daniel Dunbarf612ff62009-09-19 20:40:05 +00003160
Bill Wendling94d04b82009-05-20 23:21:38 +00003161 // Dwarf sections base addresses.
Chris Lattnerd38fee82010-04-05 00:13:49 +00003162 if (Asm->MAI->doesDwarfRequireFrameSection()) {
Chris Lattner9c69e285532010-04-04 22:59:04 +00003163 DwarfFrameSectionSym =
3164 EmitSectionSym(Asm, TLOF.getDwarfFrameSection(), "section_debug_frame");
3165 }
Bill Wendling94d04b82009-05-20 23:21:38 +00003166
Jim Grosbach1e20b962010-07-21 21:21:52 +00003167 DwarfInfoSectionSym =
Chris Lattner9c69e285532010-04-04 22:59:04 +00003168 EmitSectionSym(Asm, TLOF.getDwarfInfoSection(), "section_info");
Jim Grosbach1e20b962010-07-21 21:21:52 +00003169 DwarfAbbrevSectionSym =
Chris Lattner9c69e285532010-04-04 22:59:04 +00003170 EmitSectionSym(Asm, TLOF.getDwarfAbbrevSection(), "section_abbrev");
Chris Lattner11b8f302010-04-04 23:02:02 +00003171 EmitSectionSym(Asm, TLOF.getDwarfARangesSection());
Jim Grosbach1e20b962010-07-21 21:21:52 +00003172
Chris Lattner9c69e285532010-04-04 22:59:04 +00003173 if (const MCSection *MacroInfo = TLOF.getDwarfMacroInfoSection())
Chris Lattner11b8f302010-04-04 23:02:02 +00003174 EmitSectionSym(Asm, MacroInfo);
Bill Wendling94d04b82009-05-20 23:21:38 +00003175
Devang Patelaf608bd2010-08-24 00:06:12 +00003176 EmitSectionSym(Asm, TLOF.getDwarfLineSection(), "section_line");
Chris Lattner11b8f302010-04-04 23:02:02 +00003177 EmitSectionSym(Asm, TLOF.getDwarfLocSection());
3178 EmitSectionSym(Asm, TLOF.getDwarfPubNamesSection());
3179 EmitSectionSym(Asm, TLOF.getDwarfPubTypesSection());
Jim Grosbach1e20b962010-07-21 21:21:52 +00003180 DwarfStrSectionSym =
Chris Lattner9c69e285532010-04-04 22:59:04 +00003181 EmitSectionSym(Asm, TLOF.getDwarfStrSection(), "section_str");
Devang Patelf2548ca2010-04-16 23:33:45 +00003182 DwarfDebugRangeSectionSym = EmitSectionSym(Asm, TLOF.getDwarfRangesSection(),
3183 "debug_range");
Bill Wendling94d04b82009-05-20 23:21:38 +00003184
Devang Patelc3f5f782010-05-25 23:40:22 +00003185 DwarfDebugLocSectionSym = EmitSectionSym(Asm, TLOF.getDwarfLocSection(),
3186 "section_debug_loc");
3187
Chris Lattner9c69e285532010-04-04 22:59:04 +00003188 TextSectionSym = EmitSectionSym(Asm, TLOF.getTextSection(), "text_begin");
Chris Lattner4ad1efe2010-04-04 23:10:38 +00003189 EmitSectionSym(Asm, TLOF.getDataSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00003190}
3191
Devang Patel2c4ceb12009-11-21 02:48:08 +00003192/// emitDIE - Recusively Emits a debug information entry.
Bill Wendling94d04b82009-05-20 23:21:38 +00003193///
Devang Patel2c4ceb12009-11-21 02:48:08 +00003194void DwarfDebug::emitDIE(DIE *Die) {
Bill Wendling94d04b82009-05-20 23:21:38 +00003195 // Get the abbreviation for this DIE.
3196 unsigned AbbrevNumber = Die->getAbbrevNumber();
3197 const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
3198
Bill Wendling94d04b82009-05-20 23:21:38 +00003199 // Emit the code (index) for the abbreviation.
Chris Lattner3f53c832010-04-04 18:52:31 +00003200 if (Asm->isVerbose())
Chris Lattner894d75a2010-01-22 23:18:42 +00003201 Asm->OutStreamer.AddComment("Abbrev [" + Twine(AbbrevNumber) + "] 0x" +
3202 Twine::utohexstr(Die->getOffset()) + ":0x" +
3203 Twine::utohexstr(Die->getSize()) + " " +
3204 dwarf::TagString(Abbrev->getTag()));
Chris Lattner7e1a8f82010-04-04 19:09:29 +00003205 Asm->EmitULEB128(AbbrevNumber);
Bill Wendling94d04b82009-05-20 23:21:38 +00003206
Jeffrey Yasskin638fe8d2010-03-22 18:47:14 +00003207 const SmallVector<DIEValue*, 32> &Values = Die->getValues();
Bill Wendling94d04b82009-05-20 23:21:38 +00003208 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
3209
3210 // Emit the DIE attribute values.
3211 for (unsigned i = 0, N = Values.size(); i < N; ++i) {
3212 unsigned Attr = AbbrevData[i].getAttribute();
3213 unsigned Form = AbbrevData[i].getForm();
3214 assert(Form && "Too many attributes for DIE (check abbreviation)");
3215
Chris Lattner3f53c832010-04-04 18:52:31 +00003216 if (Asm->isVerbose())
Chris Lattnera8013622010-01-24 18:54:17 +00003217 Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr));
Jim Grosbach1e20b962010-07-21 21:21:52 +00003218
Bill Wendling94d04b82009-05-20 23:21:38 +00003219 switch (Attr) {
3220 case dwarf::DW_AT_sibling:
Devang Patel2c4ceb12009-11-21 02:48:08 +00003221 Asm->EmitInt32(Die->getSiblingOffset());
Bill Wendling94d04b82009-05-20 23:21:38 +00003222 break;
3223 case dwarf::DW_AT_abstract_origin: {
3224 DIEEntry *E = cast<DIEEntry>(Values[i]);
3225 DIE *Origin = E->getEntry();
Devang Patel53bb5c92009-11-10 23:06:00 +00003226 unsigned Addr = Origin->getOffset();
Bill Wendling94d04b82009-05-20 23:21:38 +00003227 Asm->EmitInt32(Addr);
3228 break;
3229 }
Devang Patelf2548ca2010-04-16 23:33:45 +00003230 case dwarf::DW_AT_ranges: {
3231 // DW_AT_range Value encodes offset in debug_range section.
3232 DIEInteger *V = cast<DIEInteger>(Values[i]);
Devang Patelb1fcfbe2010-09-02 16:43:44 +00003233
3234 if (Asm->MAI->doesDwarfUsesLabelOffsetForRanges()) {
3235 Asm->EmitLabelPlusOffset(DwarfDebugRangeSectionSym,
3236 V->getValue(),
3237 4);
3238 } else {
3239 Asm->EmitLabelOffsetDifference(DwarfDebugRangeSectionSym,
3240 V->getValue(),
3241 DwarfDebugRangeSectionSym,
3242 4);
3243 }
Devang Patelf2548ca2010-04-16 23:33:45 +00003244 break;
3245 }
Devang Patelc3f5f782010-05-25 23:40:22 +00003246 case dwarf::DW_AT_location: {
3247 if (UseDotDebugLocEntry.count(Die) != 0) {
3248 DIELabel *L = cast<DIELabel>(Values[i]);
3249 Asm->EmitLabelDifference(L->getValue(), DwarfDebugLocSectionSym, 4);
3250 } else
3251 Values[i]->EmitValue(Asm, Form);
3252 break;
3253 }
Devang Patel2a361602010-09-29 19:08:08 +00003254 case dwarf::DW_AT_accessibility: {
3255 if (Asm->isVerbose()) {
3256 DIEInteger *V = cast<DIEInteger>(Values[i]);
3257 Asm->OutStreamer.AddComment(dwarf::AccessibilityString(V->getValue()));
3258 }
3259 Values[i]->EmitValue(Asm, Form);
3260 break;
3261 }
Bill Wendling94d04b82009-05-20 23:21:38 +00003262 default:
3263 // Emit an attribute using the defined form.
Chris Lattnerd38fee82010-04-05 00:13:49 +00003264 Values[i]->EmitValue(Asm, Form);
Bill Wendling94d04b82009-05-20 23:21:38 +00003265 break;
3266 }
Bill Wendling94d04b82009-05-20 23:21:38 +00003267 }
3268
3269 // Emit the DIE children if any.
3270 if (Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes) {
3271 const std::vector<DIE *> &Children = Die->getChildren();
3272
3273 for (unsigned j = 0, M = Children.size(); j < M; ++j)
Devang Patel2c4ceb12009-11-21 02:48:08 +00003274 emitDIE(Children[j]);
Bill Wendling94d04b82009-05-20 23:21:38 +00003275
Chris Lattner3f53c832010-04-04 18:52:31 +00003276 if (Asm->isVerbose())
Chris Lattner233f52b2010-03-09 23:52:58 +00003277 Asm->OutStreamer.AddComment("End Of Children Mark");
3278 Asm->EmitInt8(0);
Bill Wendling94d04b82009-05-20 23:21:38 +00003279 }
3280}
3281
Devang Patel8a241142009-12-09 18:24:21 +00003282/// emitDebugInfo - Emit the debug info section.
Bill Wendling94d04b82009-05-20 23:21:38 +00003283///
Devang Patel8a241142009-12-09 18:24:21 +00003284void DwarfDebug::emitDebugInfo() {
3285 // Start debug info section.
3286 Asm->OutStreamer.SwitchSection(
3287 Asm->getObjFileLowering().getDwarfInfoSection());
Devang Patel163a9f72010-05-10 22:49:55 +00003288 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
3289 E = CUMap.end(); I != E; ++I) {
3290 CompileUnit *TheCU = I->second;
3291 DIE *Die = TheCU->getCUDie();
Jim Grosbach1e20b962010-07-21 21:21:52 +00003292
Devang Patel163a9f72010-05-10 22:49:55 +00003293 // Emit the compile units header.
3294 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_begin",
3295 TheCU->getID()));
Jim Grosbach1e20b962010-07-21 21:21:52 +00003296
Devang Patel163a9f72010-05-10 22:49:55 +00003297 // Emit size of content not including length itself
3298 unsigned ContentSize = Die->getSize() +
3299 sizeof(int16_t) + // DWARF version number
3300 sizeof(int32_t) + // Offset Into Abbrev. Section
3301 sizeof(int8_t) + // Pointer Size (in bytes)
3302 sizeof(int32_t); // FIXME - extra pad for gdb bug.
Jim Grosbach1e20b962010-07-21 21:21:52 +00003303
Devang Patel163a9f72010-05-10 22:49:55 +00003304 Asm->OutStreamer.AddComment("Length of Compilation Unit Info");
3305 Asm->EmitInt32(ContentSize);
3306 Asm->OutStreamer.AddComment("DWARF version number");
3307 Asm->EmitInt16(dwarf::DWARF_VERSION);
3308 Asm->OutStreamer.AddComment("Offset Into Abbrev. Section");
3309 Asm->EmitSectionOffset(Asm->GetTempSymbol("abbrev_begin"),
3310 DwarfAbbrevSectionSym);
3311 Asm->OutStreamer.AddComment("Address Size (in bytes)");
3312 Asm->EmitInt8(Asm->getTargetData().getPointerSize());
Jim Grosbach1e20b962010-07-21 21:21:52 +00003313
Devang Patel163a9f72010-05-10 22:49:55 +00003314 emitDIE(Die);
3315 // FIXME - extra padding for gdb bug.
3316 Asm->OutStreamer.AddComment("4 extra padding bytes for GDB");
3317 Asm->EmitInt8(0);
3318 Asm->EmitInt8(0);
3319 Asm->EmitInt8(0);
3320 Asm->EmitInt8(0);
3321 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_end", TheCU->getID()));
3322 }
Bill Wendling94d04b82009-05-20 23:21:38 +00003323}
3324
Devang Patel2c4ceb12009-11-21 02:48:08 +00003325/// emitAbbreviations - Emit the abbreviation section.
Bill Wendling94d04b82009-05-20 23:21:38 +00003326///
Devang Patel2c4ceb12009-11-21 02:48:08 +00003327void DwarfDebug::emitAbbreviations() const {
Bill Wendling94d04b82009-05-20 23:21:38 +00003328 // Check to see if it is worth the effort.
3329 if (!Abbreviations.empty()) {
3330 // Start the debug abbrev section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00003331 Asm->OutStreamer.SwitchSection(
3332 Asm->getObjFileLowering().getDwarfAbbrevSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00003333
Chris Lattnerc0215722010-04-04 19:25:43 +00003334 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_begin"));
Bill Wendling94d04b82009-05-20 23:21:38 +00003335
3336 // For each abbrevation.
3337 for (unsigned i = 0, N = Abbreviations.size(); i < N; ++i) {
3338 // Get abbreviation data
3339 const DIEAbbrev *Abbrev = Abbreviations[i];
3340
3341 // Emit the abbrevations code (base 1 index.)
Chris Lattner7e1a8f82010-04-04 19:09:29 +00003342 Asm->EmitULEB128(Abbrev->getNumber(), "Abbreviation Code");
Bill Wendling94d04b82009-05-20 23:21:38 +00003343
3344 // Emit the abbreviations data.
Chris Lattnerd38fee82010-04-05 00:13:49 +00003345 Abbrev->Emit(Asm);
Bill Wendling94d04b82009-05-20 23:21:38 +00003346 }
3347
3348 // Mark end of abbreviations.
Chris Lattner7e1a8f82010-04-04 19:09:29 +00003349 Asm->EmitULEB128(0, "EOM(3)");
Bill Wendling94d04b82009-05-20 23:21:38 +00003350
Chris Lattnerc0215722010-04-04 19:25:43 +00003351 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_end"));
Bill Wendling94d04b82009-05-20 23:21:38 +00003352 }
3353}
3354
Devang Patel2c4ceb12009-11-21 02:48:08 +00003355/// emitEndOfLineMatrix - Emit the last address of the section and the end of
Bill Wendling94d04b82009-05-20 23:21:38 +00003356/// the line matrix.
3357///
Devang Patel2c4ceb12009-11-21 02:48:08 +00003358void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) {
Bill Wendling94d04b82009-05-20 23:21:38 +00003359 // Define last address of section.
Chris Lattner233f52b2010-03-09 23:52:58 +00003360 Asm->OutStreamer.AddComment("Extended Op");
3361 Asm->EmitInt8(0);
Jim Grosbach1e20b962010-07-21 21:21:52 +00003362
Chris Lattner233f52b2010-03-09 23:52:58 +00003363 Asm->OutStreamer.AddComment("Op size");
Chris Lattnerd38fee82010-04-05 00:13:49 +00003364 Asm->EmitInt8(Asm->getTargetData().getPointerSize() + 1);
Chris Lattner233f52b2010-03-09 23:52:58 +00003365 Asm->OutStreamer.AddComment("DW_LNE_set_address");
3366 Asm->EmitInt8(dwarf::DW_LNE_set_address);
3367
3368 Asm->OutStreamer.AddComment("Section end label");
Chris Lattnerd85fc6e2010-03-10 01:17:49 +00003369
Chris Lattnerc0215722010-04-04 19:25:43 +00003370 Asm->OutStreamer.EmitSymbolValue(Asm->GetTempSymbol("section_end",SectionEnd),
Chris Lattnerd38fee82010-04-05 00:13:49 +00003371 Asm->getTargetData().getPointerSize(),
3372 0/*AddrSpace*/);
Bill Wendling94d04b82009-05-20 23:21:38 +00003373
3374 // Mark end of matrix.
Chris Lattner233f52b2010-03-09 23:52:58 +00003375 Asm->OutStreamer.AddComment("DW_LNE_end_sequence");
3376 Asm->EmitInt8(0);
Chris Lattner0ad9c912010-01-22 22:09:00 +00003377 Asm->EmitInt8(1);
Chris Lattner894d75a2010-01-22 23:18:42 +00003378 Asm->EmitInt8(1);
Bill Wendling94d04b82009-05-20 23:21:38 +00003379}
3380
Devang Patel2c4ceb12009-11-21 02:48:08 +00003381/// emitCommonDebugFrame - Emit common frame info into a debug frame section.
Bill Wendling94d04b82009-05-20 23:21:38 +00003382///
Devang Patel2c4ceb12009-11-21 02:48:08 +00003383void DwarfDebug::emitCommonDebugFrame() {
Chris Lattnerd38fee82010-04-05 00:13:49 +00003384 if (!Asm->MAI->doesDwarfRequireFrameSection())
Bill Wendling94d04b82009-05-20 23:21:38 +00003385 return;
3386
Chris Lattnerd38fee82010-04-05 00:13:49 +00003387 int stackGrowth = Asm->getTargetData().getPointerSize();
Anton Korobeynikov16c29b52011-01-10 12:39:04 +00003388 if (Asm->TM.getFrameLowering()->getStackGrowthDirection() ==
3389 TargetFrameLowering::StackGrowsDown)
Chris Lattnerd38fee82010-04-05 00:13:49 +00003390 stackGrowth *= -1;
Bill Wendling94d04b82009-05-20 23:21:38 +00003391
3392 // Start the dwarf frame section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00003393 Asm->OutStreamer.SwitchSection(
3394 Asm->getObjFileLowering().getDwarfFrameSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00003395
Chris Lattnerc0215722010-04-04 19:25:43 +00003396 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_frame_common"));
Chris Lattner233f52b2010-03-09 23:52:58 +00003397 Asm->OutStreamer.AddComment("Length of Common Information Entry");
Chris Lattnera6437182010-04-04 19:58:12 +00003398 Asm->EmitLabelDifference(Asm->GetTempSymbol("debug_frame_common_end"),
3399 Asm->GetTempSymbol("debug_frame_common_begin"), 4);
Bill Wendling94d04b82009-05-20 23:21:38 +00003400
Chris Lattnerc0215722010-04-04 19:25:43 +00003401 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_frame_common_begin"));
Chris Lattner233f52b2010-03-09 23:52:58 +00003402 Asm->OutStreamer.AddComment("CIE Identifier Tag");
Bill Wendling94d04b82009-05-20 23:21:38 +00003403 Asm->EmitInt32((int)dwarf::DW_CIE_ID);
Chris Lattner233f52b2010-03-09 23:52:58 +00003404 Asm->OutStreamer.AddComment("CIE Version");
Bill Wendling94d04b82009-05-20 23:21:38 +00003405 Asm->EmitInt8(dwarf::DW_CIE_VERSION);
Chris Lattner233f52b2010-03-09 23:52:58 +00003406 Asm->OutStreamer.AddComment("CIE Augmentation");
Chris Lattner4cf202b2010-01-23 03:11:46 +00003407 Asm->OutStreamer.EmitIntValue(0, 1, /*addrspace*/0); // nul terminator.
Chris Lattner7e1a8f82010-04-04 19:09:29 +00003408 Asm->EmitULEB128(1, "CIE Code Alignment Factor");
3409 Asm->EmitSLEB128(stackGrowth, "CIE Data Alignment Factor");
Chris Lattner233f52b2010-03-09 23:52:58 +00003410 Asm->OutStreamer.AddComment("CIE RA Column");
Chris Lattnerd38fee82010-04-05 00:13:49 +00003411 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
Anton Korobeynikov16c29b52011-01-10 12:39:04 +00003412 const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
Bill Wendling94d04b82009-05-20 23:21:38 +00003413 Asm->EmitInt8(RI->getDwarfRegNum(RI->getRARegister(), false));
Bill Wendling94d04b82009-05-20 23:21:38 +00003414
3415 std::vector<MachineMove> Moves;
Anton Korobeynikovd9e33852010-11-18 23:25:52 +00003416 TFI->getInitialFrameState(Moves);
Bill Wendling94d04b82009-05-20 23:21:38 +00003417
Chris Lattner02b86b92010-04-04 23:41:46 +00003418 Asm->EmitFrameMoves(Moves, 0, false);
Bill Wendling94d04b82009-05-20 23:21:38 +00003419
Chris Lattner059ea132010-04-28 01:05:45 +00003420 Asm->EmitAlignment(2);
Chris Lattnerc0215722010-04-04 19:25:43 +00003421 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_frame_common_end"));
Bill Wendling94d04b82009-05-20 23:21:38 +00003422}
3423
Devang Patel2c4ceb12009-11-21 02:48:08 +00003424/// emitFunctionDebugFrame - Emit per function frame info into a debug frame
Bill Wendling94d04b82009-05-20 23:21:38 +00003425/// section.
Chris Lattner206d61e2010-03-13 07:26:18 +00003426void DwarfDebug::
3427emitFunctionDebugFrame(const FunctionDebugFrameInfo &DebugFrameInfo) {
Chris Lattnerd38fee82010-04-05 00:13:49 +00003428 if (!Asm->MAI->doesDwarfRequireFrameSection())
Bill Wendling94d04b82009-05-20 23:21:38 +00003429 return;
3430
3431 // Start the dwarf frame section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00003432 Asm->OutStreamer.SwitchSection(
3433 Asm->getObjFileLowering().getDwarfFrameSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00003434
Chris Lattner233f52b2010-03-09 23:52:58 +00003435 Asm->OutStreamer.AddComment("Length of Frame Information Entry");
Chris Lattner206d61e2010-03-13 07:26:18 +00003436 MCSymbol *DebugFrameBegin =
Chris Lattnerc0215722010-04-04 19:25:43 +00003437 Asm->GetTempSymbol("debug_frame_begin", DebugFrameInfo.Number);
Chris Lattner206d61e2010-03-13 07:26:18 +00003438 MCSymbol *DebugFrameEnd =
Chris Lattnerc0215722010-04-04 19:25:43 +00003439 Asm->GetTempSymbol("debug_frame_end", DebugFrameInfo.Number);
Chris Lattnera6437182010-04-04 19:58:12 +00003440 Asm->EmitLabelDifference(DebugFrameEnd, DebugFrameBegin, 4);
Bill Wendling94d04b82009-05-20 23:21:38 +00003441
Chris Lattner206d61e2010-03-13 07:26:18 +00003442 Asm->OutStreamer.EmitLabel(DebugFrameBegin);
Bill Wendling94d04b82009-05-20 23:21:38 +00003443
Chris Lattner233f52b2010-03-09 23:52:58 +00003444 Asm->OutStreamer.AddComment("FDE CIE offset");
Jim Grosbach1e20b962010-07-21 21:21:52 +00003445 Asm->EmitSectionOffset(Asm->GetTempSymbol("debug_frame_common"),
Chris Lattner6189ed12010-04-04 23:25:33 +00003446 DwarfFrameSectionSym);
Bill Wendling94d04b82009-05-20 23:21:38 +00003447
Chris Lattner233f52b2010-03-09 23:52:58 +00003448 Asm->OutStreamer.AddComment("FDE initial location");
Chris Lattnerc0215722010-04-04 19:25:43 +00003449 MCSymbol *FuncBeginSym =
3450 Asm->GetTempSymbol("func_begin", DebugFrameInfo.Number);
Chris Lattnerfb658072010-03-13 07:40:56 +00003451 Asm->OutStreamer.EmitSymbolValue(FuncBeginSym,
Chris Lattnerd38fee82010-04-05 00:13:49 +00003452 Asm->getTargetData().getPointerSize(),
3453 0/*AddrSpace*/);
Jim Grosbach1e20b962010-07-21 21:21:52 +00003454
3455
Chris Lattner233f52b2010-03-09 23:52:58 +00003456 Asm->OutStreamer.AddComment("FDE address range");
Chris Lattnera6437182010-04-04 19:58:12 +00003457 Asm->EmitLabelDifference(Asm->GetTempSymbol("func_end",DebugFrameInfo.Number),
Chris Lattnerd38fee82010-04-05 00:13:49 +00003458 FuncBeginSym, Asm->getTargetData().getPointerSize());
Bill Wendling94d04b82009-05-20 23:21:38 +00003459
Chris Lattner02b86b92010-04-04 23:41:46 +00003460 Asm->EmitFrameMoves(DebugFrameInfo.Moves, FuncBeginSym, false);
Bill Wendling94d04b82009-05-20 23:21:38 +00003461
Chris Lattner059ea132010-04-28 01:05:45 +00003462 Asm->EmitAlignment(2);
Chris Lattner206d61e2010-03-13 07:26:18 +00003463 Asm->OutStreamer.EmitLabel(DebugFrameEnd);
Bill Wendling94d04b82009-05-20 23:21:38 +00003464}
3465
Devang Patel8a241142009-12-09 18:24:21 +00003466/// emitDebugPubNames - Emit visible names into a debug pubnames section.
3467///
3468void DwarfDebug::emitDebugPubNames() {
Devang Patel163a9f72010-05-10 22:49:55 +00003469 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
3470 E = CUMap.end(); I != E; ++I) {
3471 CompileUnit *TheCU = I->second;
3472 // Start the dwarf pubnames section.
3473 Asm->OutStreamer.SwitchSection(
3474 Asm->getObjFileLowering().getDwarfPubNamesSection());
Jim Grosbach1e20b962010-07-21 21:21:52 +00003475
Devang Patel163a9f72010-05-10 22:49:55 +00003476 Asm->OutStreamer.AddComment("Length of Public Names Info");
3477 Asm->EmitLabelDifference(
3478 Asm->GetTempSymbol("pubnames_end", TheCU->getID()),
3479 Asm->GetTempSymbol("pubnames_begin", TheCU->getID()), 4);
Jim Grosbach1e20b962010-07-21 21:21:52 +00003480
Devang Patel163a9f72010-05-10 22:49:55 +00003481 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_begin",
3482 TheCU->getID()));
Jim Grosbach1e20b962010-07-21 21:21:52 +00003483
Devang Patel163a9f72010-05-10 22:49:55 +00003484 Asm->OutStreamer.AddComment("DWARF Version");
Jim Grosbach1e20b962010-07-21 21:21:52 +00003485 Asm->EmitInt16(dwarf::DWARF_VERSION);
3486
Devang Patel163a9f72010-05-10 22:49:55 +00003487 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
Jim Grosbach1e20b962010-07-21 21:21:52 +00003488 Asm->EmitSectionOffset(Asm->GetTempSymbol("info_begin", TheCU->getID()),
Devang Patel163a9f72010-05-10 22:49:55 +00003489 DwarfInfoSectionSym);
Jim Grosbach1e20b962010-07-21 21:21:52 +00003490
Devang Patel163a9f72010-05-10 22:49:55 +00003491 Asm->OutStreamer.AddComment("Compilation Unit Length");
3492 Asm->EmitLabelDifference(Asm->GetTempSymbol("info_end", TheCU->getID()),
3493 Asm->GetTempSymbol("info_begin", TheCU->getID()),
3494 4);
Jim Grosbach1e20b962010-07-21 21:21:52 +00003495
Devang Patel163a9f72010-05-10 22:49:55 +00003496 const StringMap<DIE*> &Globals = TheCU->getGlobals();
3497 for (StringMap<DIE*>::const_iterator
3498 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
3499 const char *Name = GI->getKeyData();
3500 DIE *Entity = GI->second;
Jim Grosbach1e20b962010-07-21 21:21:52 +00003501
Devang Patel163a9f72010-05-10 22:49:55 +00003502 Asm->OutStreamer.AddComment("DIE offset");
3503 Asm->EmitInt32(Entity->getOffset());
Jim Grosbach1e20b962010-07-21 21:21:52 +00003504
Devang Patel163a9f72010-05-10 22:49:55 +00003505 if (Asm->isVerbose())
3506 Asm->OutStreamer.AddComment("External Name");
3507 Asm->OutStreamer.EmitBytes(StringRef(Name, strlen(Name)+1), 0);
3508 }
Jim Grosbach1e20b962010-07-21 21:21:52 +00003509
Devang Patel163a9f72010-05-10 22:49:55 +00003510 Asm->OutStreamer.AddComment("End Mark");
3511 Asm->EmitInt32(0);
3512 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_end",
3513 TheCU->getID()));
Bill Wendling94d04b82009-05-20 23:21:38 +00003514 }
Bill Wendling94d04b82009-05-20 23:21:38 +00003515}
3516
Devang Patel193f7202009-11-24 01:14:22 +00003517void DwarfDebug::emitDebugPubTypes() {
Devang Patel163a9f72010-05-10 22:49:55 +00003518 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
3519 E = CUMap.end(); I != E; ++I) {
3520 CompileUnit *TheCU = I->second;
3521 // Start the dwarf pubnames section.
3522 Asm->OutStreamer.SwitchSection(
3523 Asm->getObjFileLowering().getDwarfPubTypesSection());
3524 Asm->OutStreamer.AddComment("Length of Public Types Info");
3525 Asm->EmitLabelDifference(
3526 Asm->GetTempSymbol("pubtypes_end", TheCU->getID()),
3527 Asm->GetTempSymbol("pubtypes_begin", TheCU->getID()), 4);
Jim Grosbach1e20b962010-07-21 21:21:52 +00003528
Devang Patel163a9f72010-05-10 22:49:55 +00003529 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_begin",
3530 TheCU->getID()));
Jim Grosbach1e20b962010-07-21 21:21:52 +00003531
Devang Patel163a9f72010-05-10 22:49:55 +00003532 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DWARF Version");
3533 Asm->EmitInt16(dwarf::DWARF_VERSION);
Jim Grosbach1e20b962010-07-21 21:21:52 +00003534
Devang Patel163a9f72010-05-10 22:49:55 +00003535 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
3536 Asm->EmitSectionOffset(Asm->GetTempSymbol("info_begin", TheCU->getID()),
3537 DwarfInfoSectionSym);
Jim Grosbach1e20b962010-07-21 21:21:52 +00003538
Devang Patel163a9f72010-05-10 22:49:55 +00003539 Asm->OutStreamer.AddComment("Compilation Unit Length");
3540 Asm->EmitLabelDifference(Asm->GetTempSymbol("info_end", TheCU->getID()),
3541 Asm->GetTempSymbol("info_begin", TheCU->getID()),
3542 4);
Jim Grosbach1e20b962010-07-21 21:21:52 +00003543
Devang Patel163a9f72010-05-10 22:49:55 +00003544 const StringMap<DIE*> &Globals = TheCU->getGlobalTypes();
3545 for (StringMap<DIE*>::const_iterator
3546 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
3547 const char *Name = GI->getKeyData();
3548 DIE * Entity = GI->second;
Jim Grosbach1e20b962010-07-21 21:21:52 +00003549
Devang Patel163a9f72010-05-10 22:49:55 +00003550 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
3551 Asm->EmitInt32(Entity->getOffset());
Jim Grosbach1e20b962010-07-21 21:21:52 +00003552
Devang Patel163a9f72010-05-10 22:49:55 +00003553 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("External Name");
3554 Asm->OutStreamer.EmitBytes(StringRef(Name, GI->getKeyLength()+1), 0);
3555 }
Jim Grosbach1e20b962010-07-21 21:21:52 +00003556
Devang Patel163a9f72010-05-10 22:49:55 +00003557 Asm->OutStreamer.AddComment("End Mark");
Jim Grosbach1e20b962010-07-21 21:21:52 +00003558 Asm->EmitInt32(0);
Devang Patel163a9f72010-05-10 22:49:55 +00003559 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_end",
3560 TheCU->getID()));
Devang Patel193f7202009-11-24 01:14:22 +00003561 }
Devang Patel193f7202009-11-24 01:14:22 +00003562}
3563
Devang Patel2c4ceb12009-11-21 02:48:08 +00003564/// emitDebugStr - Emit visible names into a debug str section.
Bill Wendling94d04b82009-05-20 23:21:38 +00003565///
Devang Patel2c4ceb12009-11-21 02:48:08 +00003566void DwarfDebug::emitDebugStr() {
Bill Wendling94d04b82009-05-20 23:21:38 +00003567 // Check to see if it is worth the effort.
Chris Lattner0d9d70f2010-03-09 23:38:23 +00003568 if (StringPool.empty()) return;
Jim Grosbach1e20b962010-07-21 21:21:52 +00003569
Chris Lattner0d9d70f2010-03-09 23:38:23 +00003570 // Start the dwarf str section.
3571 Asm->OutStreamer.SwitchSection(
Chris Lattner6c2f9e12009-08-19 05:49:37 +00003572 Asm->getObjFileLowering().getDwarfStrSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00003573
Chris Lattnerbc733f52010-03-13 02:17:42 +00003574 // Get all of the string pool entries and put them in an array by their ID so
3575 // we can sort them.
Jim Grosbach1e20b962010-07-21 21:21:52 +00003576 SmallVector<std::pair<unsigned,
Chris Lattnerbc733f52010-03-13 02:17:42 +00003577 StringMapEntry<std::pair<MCSymbol*, unsigned> >*>, 64> Entries;
Jim Grosbach1e20b962010-07-21 21:21:52 +00003578
Chris Lattnerbc733f52010-03-13 02:17:42 +00003579 for (StringMap<std::pair<MCSymbol*, unsigned> >::iterator
3580 I = StringPool.begin(), E = StringPool.end(); I != E; ++I)
3581 Entries.push_back(std::make_pair(I->second.second, &*I));
Jim Grosbach1e20b962010-07-21 21:21:52 +00003582
Chris Lattnerbc733f52010-03-13 02:17:42 +00003583 array_pod_sort(Entries.begin(), Entries.end());
Jim Grosbach1e20b962010-07-21 21:21:52 +00003584
Chris Lattnerbc733f52010-03-13 02:17:42 +00003585 for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
Chris Lattner0d9d70f2010-03-09 23:38:23 +00003586 // Emit a label for reference from debug information entries.
Chris Lattnerbc733f52010-03-13 02:17:42 +00003587 Asm->OutStreamer.EmitLabel(Entries[i].second->getValue().first);
Jim Grosbach1e20b962010-07-21 21:21:52 +00003588
Chris Lattner0d9d70f2010-03-09 23:38:23 +00003589 // Emit the string itself.
Chris Lattnerbc733f52010-03-13 02:17:42 +00003590 Asm->OutStreamer.EmitBytes(Entries[i].second->getKey(), 0/*addrspace*/);
Bill Wendling94d04b82009-05-20 23:21:38 +00003591 }
3592}
3593
Devang Patel2c4ceb12009-11-21 02:48:08 +00003594/// emitDebugLoc - Emit visible names into a debug loc section.
Bill Wendling94d04b82009-05-20 23:21:38 +00003595///
Devang Patel2c4ceb12009-11-21 02:48:08 +00003596void DwarfDebug::emitDebugLoc() {
Devang Patel80250682010-05-26 23:55:23 +00003597 if (DotDebugLocEntries.empty())
3598 return;
3599
Devang Patel6c3ea902011-02-04 22:57:18 +00003600 for (SmallVector<DotDebugLocEntry, 4>::iterator
3601 I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
3602 I != E; ++I) {
3603 DotDebugLocEntry &Entry = *I;
3604 if (I + 1 != DotDebugLocEntries.end())
3605 Entry.Merge(I+1);
3606 }
3607
Bill Wendling94d04b82009-05-20 23:21:38 +00003608 // Start the dwarf loc section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00003609 Asm->OutStreamer.SwitchSection(
Devang Patelc3f5f782010-05-25 23:40:22 +00003610 Asm->getObjFileLowering().getDwarfLocSection());
3611 unsigned char Size = Asm->getTargetData().getPointerSize();
Devang Patel80250682010-05-26 23:55:23 +00003612 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", 0));
3613 unsigned index = 1;
Jim Grosbach1e20b962010-07-21 21:21:52 +00003614 for (SmallVector<DotDebugLocEntry, 4>::iterator
3615 I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
Devang Patel61409622010-07-07 20:12:52 +00003616 I != E; ++I, ++index) {
Devang Patel6c3ea902011-02-04 22:57:18 +00003617 DotDebugLocEntry &Entry = *I;
3618 if (Entry.isMerged()) continue;
Devang Patelc3f5f782010-05-25 23:40:22 +00003619 if (Entry.isEmpty()) {
3620 Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
3621 Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
Devang Patel80250682010-05-26 23:55:23 +00003622 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", index));
Devang Patelc3f5f782010-05-25 23:40:22 +00003623 } else {
3624 Asm->OutStreamer.EmitSymbolValue(Entry.Begin, Size, 0);
3625 Asm->OutStreamer.EmitSymbolValue(Entry.End, Size, 0);
3626 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
3627 unsigned Reg = RI->getDwarfRegNum(Entry.Loc.getReg(), false);
Devang Patelb2cf5812010-08-04 18:40:52 +00003628 if (int Offset = Entry.Loc.getOffset()) {
3629 // If the value is at a certain offset from frame register then
3630 // use DW_OP_fbreg.
3631 unsigned OffsetSize = Offset ? MCAsmInfo::getSLEB128Size(Offset) : 1;
Devang Patelc3f5f782010-05-25 23:40:22 +00003632 Asm->OutStreamer.AddComment("Loc expr size");
Devang Patelb2cf5812010-08-04 18:40:52 +00003633 Asm->EmitInt16(1 + OffsetSize);
3634 Asm->OutStreamer.AddComment(
3635 dwarf::OperationEncodingString(dwarf::DW_OP_fbreg));
3636 Asm->EmitInt8(dwarf::DW_OP_fbreg);
3637 Asm->OutStreamer.AddComment("Offset");
3638 Asm->EmitSLEB128(Offset);
Devang Patelc3f5f782010-05-25 23:40:22 +00003639 } else {
Devang Patelb2cf5812010-08-04 18:40:52 +00003640 if (Reg < 32) {
3641 Asm->OutStreamer.AddComment("Loc expr size");
3642 Asm->EmitInt16(1);
3643 Asm->OutStreamer.AddComment(
Devang Patela54e0cc2010-08-04 20:32:36 +00003644 dwarf::OperationEncodingString(dwarf::DW_OP_reg0 + Reg));
Devang Patelb2cf5812010-08-04 18:40:52 +00003645 Asm->EmitInt8(dwarf::DW_OP_reg0 + Reg);
3646 } else {
3647 Asm->OutStreamer.AddComment("Loc expr size");
3648 Asm->EmitInt16(1 + MCAsmInfo::getULEB128Size(Reg));
3649 Asm->EmitInt8(dwarf::DW_OP_regx);
3650 Asm->EmitULEB128(Reg);
3651 }
Devang Patelc3f5f782010-05-25 23:40:22 +00003652 }
3653 }
3654 }
Bill Wendling94d04b82009-05-20 23:21:38 +00003655}
3656
3657/// EmitDebugARanges - Emit visible names into a debug aranges section.
3658///
3659void DwarfDebug::EmitDebugARanges() {
3660 // Start the dwarf aranges section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00003661 Asm->OutStreamer.SwitchSection(
3662 Asm->getObjFileLowering().getDwarfARangesSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00003663}
3664
Devang Patel2c4ceb12009-11-21 02:48:08 +00003665/// emitDebugRanges - Emit visible names into a debug ranges section.
Bill Wendling94d04b82009-05-20 23:21:38 +00003666///
Devang Patel2c4ceb12009-11-21 02:48:08 +00003667void DwarfDebug::emitDebugRanges() {
Bill Wendling94d04b82009-05-20 23:21:38 +00003668 // Start the dwarf ranges section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00003669 Asm->OutStreamer.SwitchSection(
Devang Patelf2548ca2010-04-16 23:33:45 +00003670 Asm->getObjFileLowering().getDwarfRangesSection());
Devang Pateleac9c072010-04-27 19:46:33 +00003671 unsigned char Size = Asm->getTargetData().getPointerSize();
3672 for (SmallVector<const MCSymbol *, 8>::iterator
Jim Grosbach1e20b962010-07-21 21:21:52 +00003673 I = DebugRangeSymbols.begin(), E = DebugRangeSymbols.end();
Devang Pateleac9c072010-04-27 19:46:33 +00003674 I != E; ++I) {
3675 if (*I)
3676 Asm->OutStreamer.EmitSymbolValue(const_cast<MCSymbol*>(*I), Size, 0);
Devang Patelf2548ca2010-04-16 23:33:45 +00003677 else
Devang Pateleac9c072010-04-27 19:46:33 +00003678 Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
Devang Patelf2548ca2010-04-16 23:33:45 +00003679 }
Bill Wendling94d04b82009-05-20 23:21:38 +00003680}
3681
Devang Patel2c4ceb12009-11-21 02:48:08 +00003682/// emitDebugMacInfo - Emit visible names into a debug macinfo section.
Bill Wendling94d04b82009-05-20 23:21:38 +00003683///
Devang Patel2c4ceb12009-11-21 02:48:08 +00003684void DwarfDebug::emitDebugMacInfo() {
Daniel Dunbarf612ff62009-09-19 20:40:05 +00003685 if (const MCSection *LineInfo =
Chris Lattner18a4c162009-08-02 07:24:22 +00003686 Asm->getObjFileLowering().getDwarfMacroInfoSection()) {
Bill Wendling94d04b82009-05-20 23:21:38 +00003687 // Start the dwarf macinfo section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00003688 Asm->OutStreamer.SwitchSection(LineInfo);
Bill Wendling94d04b82009-05-20 23:21:38 +00003689 }
3690}
3691
Devang Patel2c4ceb12009-11-21 02:48:08 +00003692/// emitDebugInlineInfo - Emit inline info using following format.
Bill Wendling94d04b82009-05-20 23:21:38 +00003693/// Section Header:
3694/// 1. length of section
3695/// 2. Dwarf version number
3696/// 3. address size.
3697///
3698/// Entries (one "entry" for each function that was inlined):
3699///
3700/// 1. offset into __debug_str section for MIPS linkage name, if exists;
3701/// otherwise offset into __debug_str for regular function name.
3702/// 2. offset into __debug_str section for regular function name.
3703/// 3. an unsigned LEB128 number indicating the number of distinct inlining
3704/// instances for the function.
3705///
3706/// The rest of the entry consists of a {die_offset, low_pc} pair for each
3707/// inlined instance; the die_offset points to the inlined_subroutine die in the
3708/// __debug_info section, and the low_pc is the starting address for the
3709/// inlining instance.
Devang Patel2c4ceb12009-11-21 02:48:08 +00003710void DwarfDebug::emitDebugInlineInfo() {
Chris Lattnerd38fee82010-04-05 00:13:49 +00003711 if (!Asm->MAI->doesDwarfUsesInlineInfoSection())
Bill Wendling94d04b82009-05-20 23:21:38 +00003712 return;
3713
Devang Patel163a9f72010-05-10 22:49:55 +00003714 if (!FirstCU)
Bill Wendling94d04b82009-05-20 23:21:38 +00003715 return;
3716
Chris Lattner6c2f9e12009-08-19 05:49:37 +00003717 Asm->OutStreamer.SwitchSection(
3718 Asm->getObjFileLowering().getDwarfDebugInlineSection());
Chris Lattner0ad9c912010-01-22 22:09:00 +00003719
Chris Lattner233f52b2010-03-09 23:52:58 +00003720 Asm->OutStreamer.AddComment("Length of Debug Inlined Information Entry");
Chris Lattnera6437182010-04-04 19:58:12 +00003721 Asm->EmitLabelDifference(Asm->GetTempSymbol("debug_inlined_end", 1),
3722 Asm->GetTempSymbol("debug_inlined_begin", 1), 4);
Bill Wendling94d04b82009-05-20 23:21:38 +00003723
Chris Lattnerc0215722010-04-04 19:25:43 +00003724 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_begin", 1));
Bill Wendling94d04b82009-05-20 23:21:38 +00003725
Chris Lattner233f52b2010-03-09 23:52:58 +00003726 Asm->OutStreamer.AddComment("Dwarf Version");
3727 Asm->EmitInt16(dwarf::DWARF_VERSION);
3728 Asm->OutStreamer.AddComment("Address Size (in bytes)");
Chris Lattnerd38fee82010-04-05 00:13:49 +00003729 Asm->EmitInt8(Asm->getTargetData().getPointerSize());
Bill Wendling94d04b82009-05-20 23:21:38 +00003730
Devang Patele9f8f5e2010-05-07 20:54:48 +00003731 for (SmallVector<const MDNode *, 4>::iterator I = InlinedSPNodes.begin(),
Devang Patel53bb5c92009-11-10 23:06:00 +00003732 E = InlinedSPNodes.end(); I != E; ++I) {
Jim Grosbach31ef40e2009-11-21 23:12:12 +00003733
Devang Patele9f8f5e2010-05-07 20:54:48 +00003734 const MDNode *Node = *I;
3735 DenseMap<const MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator II
Jim Grosbach7ab38df2009-11-22 19:20:36 +00003736 = InlineInfo.find(Node);
Devang Patel53bb5c92009-11-10 23:06:00 +00003737 SmallVector<InlineInfoLabels, 4> &Labels = II->second;
Devang Patele4b27562009-08-28 23:24:31 +00003738 DISubprogram SP(Node);
Devang Patel65dbc902009-11-25 17:36:49 +00003739 StringRef LName = SP.getLinkageName();
3740 StringRef Name = SP.getName();
Bill Wendling94d04b82009-05-20 23:21:38 +00003741
Chris Lattner233f52b2010-03-09 23:52:58 +00003742 Asm->OutStreamer.AddComment("MIPS linkage name");
Chris Lattner4cf202b2010-01-23 03:11:46 +00003743 if (LName.empty()) {
3744 Asm->OutStreamer.EmitBytes(Name, 0);
3745 Asm->OutStreamer.EmitIntValue(0, 1, 0); // nul terminator.
Jim Grosbach1e20b962010-07-21 21:21:52 +00003746 } else
Chris Lattner6189ed12010-04-04 23:25:33 +00003747 Asm->EmitSectionOffset(getStringPoolEntry(getRealLinkageName(LName)),
3748 DwarfStrSectionSym);
Devang Patel53bb5c92009-11-10 23:06:00 +00003749
Chris Lattner233f52b2010-03-09 23:52:58 +00003750 Asm->OutStreamer.AddComment("Function name");
Chris Lattner6189ed12010-04-04 23:25:33 +00003751 Asm->EmitSectionOffset(getStringPoolEntry(Name), DwarfStrSectionSym);
Chris Lattner7e1a8f82010-04-04 19:09:29 +00003752 Asm->EmitULEB128(Labels.size(), "Inline count");
Bill Wendling94d04b82009-05-20 23:21:38 +00003753
Devang Patel53bb5c92009-11-10 23:06:00 +00003754 for (SmallVector<InlineInfoLabels, 4>::iterator LI = Labels.begin(),
Bill Wendling94d04b82009-05-20 23:21:38 +00003755 LE = Labels.end(); LI != LE; ++LI) {
Chris Lattner3f53c832010-04-04 18:52:31 +00003756 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
Chris Lattner6ed0f902010-03-09 00:31:02 +00003757 Asm->EmitInt32(LI->second->getOffset());
Bill Wendling94d04b82009-05-20 23:21:38 +00003758
Chris Lattner3f53c832010-04-04 18:52:31 +00003759 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("low_pc");
Chris Lattnerd38fee82010-04-05 00:13:49 +00003760 Asm->OutStreamer.EmitSymbolValue(LI->first,
3761 Asm->getTargetData().getPointerSize(),0);
Bill Wendling94d04b82009-05-20 23:21:38 +00003762 }
3763 }
3764
Chris Lattnerc0215722010-04-04 19:25:43 +00003765 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_end", 1));
Bill Wendling94d04b82009-05-20 23:21:38 +00003766}