blob: be5c206eeda5dd6f281c4fb8e693ddfb7d8b5ce5 [file] [log] [blame]
Bill Wendling0310d762009-05-15 09:23:25 +00001//===-- llvm/CodeGen/DwarfDebug.cpp - Dwarf Debug Framework ---------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file contains support for writing dwarf debug info into asm files.
11//
12//===----------------------------------------------------------------------===//
Chris Lattner6cde3e62010-03-09 00:39:24 +000013
Devang Patele4b27562009-08-28 23:24:31 +000014#define DEBUG_TYPE "dwarfdebug"
Bill Wendling0310d762009-05-15 09:23:25 +000015#include "DwarfDebug.h"
Chris Lattner74e41f92010-04-05 05:24:55 +000016#include "DIE.h"
Bill Wendling57fbba42010-04-05 22:59:21 +000017#include "llvm/Constants.h"
Bill Wendling0310d762009-05-15 09:23:25 +000018#include "llvm/Module.h"
Devang Patele449d1f2011-01-20 00:02:16 +000019#include "llvm/Instructions.h"
David Greeneb2c66fc2009-08-19 21:52:55 +000020#include "llvm/CodeGen/MachineFunction.h"
Bill Wendling0310d762009-05-15 09:23:25 +000021#include "llvm/CodeGen/MachineModuleInfo.h"
Chris Lattnerb7db7332010-03-09 01:58:53 +000022#include "llvm/MC/MCAsmInfo.h"
Chris Lattnera87dea42009-07-31 18:48:30 +000023#include "llvm/MC/MCSection.h"
Chris Lattner6c2f9e12009-08-19 05:49:37 +000024#include "llvm/MC/MCStreamer.h"
Chris Lattnerb7db7332010-03-09 01:58:53 +000025#include "llvm/MC/MCSymbol.h"
Chris Lattner45111d12010-01-16 21:57:06 +000026#include "llvm/Target/Mangler.h"
Bill Wendling0310d762009-05-15 09:23:25 +000027#include "llvm/Target/TargetData.h"
Anton Korobeynikov16c29b52011-01-10 12:39:04 +000028#include "llvm/Target/TargetFrameLowering.h"
Chris Lattnerf0144122009-07-28 03:13:23 +000029#include "llvm/Target/TargetLoweringObjectFile.h"
Chris Lattner9d1c1ad2010-04-04 18:06:11 +000030#include "llvm/Target/TargetMachine.h"
Chris Lattnerf0144122009-07-28 03:13:23 +000031#include "llvm/Target/TargetRegisterInfo.h"
Devang Patel2a4a3b72010-04-19 19:14:02 +000032#include "llvm/Target/TargetOptions.h"
Chris Lattner74e41f92010-04-05 05:24:55 +000033#include "llvm/Analysis/DebugInfo.h"
Devang Patel0eea95d2011-02-24 18:49:30 +000034#include "llvm/Analysis/DIBuilder.h"
Devang Patel9a31f0f2010-10-25 20:45:32 +000035#include "llvm/ADT/Statistic.h"
Jeffrey Yasskin5c213dc2010-03-12 17:45:06 +000036#include "llvm/ADT/STLExtras.h"
Chris Lattner23132b12009-08-24 03:52:50 +000037#include "llvm/ADT/StringExtras.h"
Devang Pateleac9c072010-04-27 19:46:33 +000038#include "llvm/Support/CommandLine.h"
Daniel Dunbar6e4bdfc2009-10-13 06:47:08 +000039#include "llvm/Support/Debug.h"
40#include "llvm/Support/ErrorHandling.h"
Devang Patel3139fcf2010-01-26 21:39:14 +000041#include "llvm/Support/ValueHandle.h"
Chris Lattner0ad9c912010-01-22 22:09:00 +000042#include "llvm/Support/FormattedStream.h"
Chris Lattnera87dea42009-07-31 18:48:30 +000043#include "llvm/Support/Timer.h"
Michael J. Spencer1f6efa32010-11-29 18:16:10 +000044#include "llvm/Support/Path.h"
Bill Wendling0310d762009-05-15 09:23:25 +000045using namespace llvm;
46
Devang Pateleac9c072010-04-27 19:46:33 +000047static cl::opt<bool> PrintDbgScope("print-dbgscope", cl::Hidden,
48 cl::desc("Print DbgScope information for each machine instruction"));
49
Jim Grosbach1e20b962010-07-21 21:21:52 +000050static cl::opt<bool> DisableDebugInfoPrinting("disable-debug-info-print",
Devang Patel61409622010-07-07 20:12:52 +000051 cl::Hidden,
Devang Pateleac9c072010-04-27 19:46:33 +000052 cl::desc("Disable debug info printing"));
53
Dan Gohman281d65d2010-05-07 01:08:53 +000054static cl::opt<bool> UnknownLocations("use-unknown-locations", cl::Hidden,
55 cl::desc("Make an absense of debug location information explicit."),
56 cl::init(false));
57
Nick Lewyckya568d662010-10-26 00:51:57 +000058#ifndef NDEBUG
Devang Patel9a31f0f2010-10-25 20:45:32 +000059STATISTIC(BlocksWithoutLineNo, "Number of blocks without any line number");
Nick Lewyckya568d662010-10-26 00:51:57 +000060#endif
Devang Patel9a31f0f2010-10-25 20:45:32 +000061
Bill Wendling5f017e82010-04-07 09:28:04 +000062namespace {
63 const char *DWARFGroupName = "DWARF Emission";
64 const char *DbgTimerName = "DWARF Debug Writer";
65} // end anonymous namespace
66
Bill Wendling0310d762009-05-15 09:23:25 +000067//===----------------------------------------------------------------------===//
68
69/// Configuration values for initial hash set sizes (log2).
70///
Bill Wendling0310d762009-05-15 09:23:25 +000071static const unsigned InitAbbreviationsSetSize = 9; // log2(512)
Bill Wendling0310d762009-05-15 09:23:25 +000072
73namespace llvm {
74
75//===----------------------------------------------------------------------===//
76/// CompileUnit - This dwarf writer support class manages information associate
77/// with a source file.
Nick Lewycky5f9843f2009-11-17 08:11:44 +000078class CompileUnit {
Bill Wendling0310d762009-05-15 09:23:25 +000079 /// ID - File identifier for source.
80 ///
81 unsigned ID;
82
83 /// Die - Compile unit debug information entry.
84 ///
Jeffrey Yasskin5c213dc2010-03-12 17:45:06 +000085 const OwningPtr<DIE> CUDie;
Bill Wendling0310d762009-05-15 09:23:25 +000086
Jeffrey Yasskind0f393d2010-03-11 18:29:55 +000087 /// IndexTyDie - An anonymous type for index type. Owned by CUDie.
Devang Patel6f01d9c2009-11-21 00:31:03 +000088 DIE *IndexTyDie;
89
Devang Patel869aa462010-07-07 20:49:57 +000090 /// MDNodeToDieMap - Tracks the mapping of unit level debug informaton
Bill Wendling0310d762009-05-15 09:23:25 +000091 /// variables to debug information entries.
Devang Patel869aa462010-07-07 20:49:57 +000092 DenseMap<const MDNode *, DIE *> MDNodeToDieMap;
Bill Wendling0310d762009-05-15 09:23:25 +000093
Devang Patel869aa462010-07-07 20:49:57 +000094 /// MDNodeToDIEEntryMap - Tracks the mapping of unit level debug informaton
Bill Wendling0310d762009-05-15 09:23:25 +000095 /// descriptors to debug information entries using a DIEEntry proxy.
Devang Patel869aa462010-07-07 20:49:57 +000096 DenseMap<const MDNode *, DIEEntry *> MDNodeToDIEEntryMap;
Bill Wendling0310d762009-05-15 09:23:25 +000097
98 /// Globals - A map of globally visible named entities for this unit.
99 ///
100 StringMap<DIE*> Globals;
101
Devang Patel193f7202009-11-24 01:14:22 +0000102 /// GlobalTypes - A map of globally visible types for this unit.
103 ///
104 StringMap<DIE*> GlobalTypes;
105
Bill Wendling0310d762009-05-15 09:23:25 +0000106public:
107 CompileUnit(unsigned I, DIE *D)
Devang Patel2c4ceb12009-11-21 02:48:08 +0000108 : ID(I), CUDie(D), IndexTyDie(0) {}
Bill Wendling0310d762009-05-15 09:23:25 +0000109
110 // Accessors.
Devang Patel193f7202009-11-24 01:14:22 +0000111 unsigned getID() const { return ID; }
Jeffrey Yasskind0f393d2010-03-11 18:29:55 +0000112 DIE* getCUDie() const { return CUDie.get(); }
Devang Patel193f7202009-11-24 01:14:22 +0000113 const StringMap<DIE*> &getGlobals() const { return Globals; }
114 const StringMap<DIE*> &getGlobalTypes() const { return GlobalTypes; }
Bill Wendling0310d762009-05-15 09:23:25 +0000115
116 /// hasContent - Return true if this compile unit has something to write out.
117 ///
Devang Patel2c4ceb12009-11-21 02:48:08 +0000118 bool hasContent() const { return !CUDie->getChildren().empty(); }
Bill Wendling0310d762009-05-15 09:23:25 +0000119
Devang Patel2c4ceb12009-11-21 02:48:08 +0000120 /// addGlobal - Add a new global entity to the compile unit.
Bill Wendling0310d762009-05-15 09:23:25 +0000121 ///
Benjamin Kramerbbb88db2010-03-31 20:15:45 +0000122 void addGlobal(StringRef Name, DIE *Die) { Globals[Name] = Die; }
Bill Wendling0310d762009-05-15 09:23:25 +0000123
Devang Patel193f7202009-11-24 01:14:22 +0000124 /// addGlobalType - Add a new global type to the compile unit.
125 ///
Jim Grosbach1e20b962010-07-21 21:21:52 +0000126 void addGlobalType(StringRef Name, DIE *Die) {
127 GlobalTypes[Name] = Die;
Devang Patel193f7202009-11-24 01:14:22 +0000128 }
129
Devang Patel017d1212009-11-20 21:37:22 +0000130 /// getDIE - Returns the debug information entry map slot for the
Bill Wendling0310d762009-05-15 09:23:25 +0000131 /// specified debug variable.
Devang Patel869aa462010-07-07 20:49:57 +0000132 DIE *getDIE(const MDNode *N) { return MDNodeToDieMap.lookup(N); }
Jim Grosbach31ef40e2009-11-21 23:12:12 +0000133
Devang Patel017d1212009-11-20 21:37:22 +0000134 /// insertDIE - Insert DIE into the map.
Devang Patele9f8f5e2010-05-07 20:54:48 +0000135 void insertDIE(const MDNode *N, DIE *D) {
Devang Patel869aa462010-07-07 20:49:57 +0000136 MDNodeToDieMap.insert(std::make_pair(N, D));
Devang Patel017d1212009-11-20 21:37:22 +0000137 }
Bill Wendling0310d762009-05-15 09:23:25 +0000138
Devang Patel017d1212009-11-20 21:37:22 +0000139 /// getDIEEntry - Returns the debug information entry for the speciefied
140 /// debug variable.
Jim Grosbach1e20b962010-07-21 21:21:52 +0000141 DIEEntry *getDIEEntry(const MDNode *N) {
142 DenseMap<const MDNode *, DIEEntry *>::iterator I =
143 MDNodeToDIEEntryMap.find(N);
Devang Patel869aa462010-07-07 20:49:57 +0000144 if (I == MDNodeToDIEEntryMap.end())
Devang Patel6404e4e2009-12-15 19:16:48 +0000145 return NULL;
146 return I->second;
147 }
Devang Patel017d1212009-11-20 21:37:22 +0000148
149 /// insertDIEEntry - Insert debug information entry into the map.
Devang Patele9f8f5e2010-05-07 20:54:48 +0000150 void insertDIEEntry(const MDNode *N, DIEEntry *E) {
Devang Patel869aa462010-07-07 20:49:57 +0000151 MDNodeToDIEEntryMap.insert(std::make_pair(N, E));
Bill Wendling0310d762009-05-15 09:23:25 +0000152 }
153
Devang Patel2c4ceb12009-11-21 02:48:08 +0000154 /// addDie - Adds or interns the DIE to the compile unit.
Bill Wendling0310d762009-05-15 09:23:25 +0000155 ///
Devang Patel2c4ceb12009-11-21 02:48:08 +0000156 void addDie(DIE *Buffer) {
157 this->CUDie->addChild(Buffer);
Bill Wendling0310d762009-05-15 09:23:25 +0000158 }
Devang Patel6f01d9c2009-11-21 00:31:03 +0000159
160 // getIndexTyDie - Get an anonymous type for index type.
161 DIE *getIndexTyDie() {
162 return IndexTyDie;
163 }
164
Jim Grosbach7ab38df2009-11-22 19:20:36 +0000165 // setIndexTyDie - Set D as anonymous type for index which can be reused
166 // later.
Devang Patel6f01d9c2009-11-21 00:31:03 +0000167 void setIndexTyDie(DIE *D) {
168 IndexTyDie = D;
169 }
170
Bill Wendling0310d762009-05-15 09:23:25 +0000171};
172
173//===----------------------------------------------------------------------===//
174/// DbgVariable - This class is used to track local variable information.
175///
Devang Patelf76a3d62009-11-16 21:53:40 +0000176class DbgVariable {
Bill Wendling0310d762009-05-15 09:23:25 +0000177 DIVariable Var; // Variable Descriptor.
Devang Patelc3f5f782010-05-25 23:40:22 +0000178 DIE *TheDIE; // Variable DIE.
179 unsigned DotDebugLocOffset; // Offset in DotDebugLocEntries.
Bill Wendling0310d762009-05-15 09:23:25 +0000180public:
Jeffrey Yasskin5c213dc2010-03-12 17:45:06 +0000181 // AbsVar may be NULL.
Devang Patelc3f5f782010-05-25 23:40:22 +0000182 DbgVariable(DIVariable V) : Var(V), TheDIE(0), DotDebugLocOffset(~0U) {}
Bill Wendling0310d762009-05-15 09:23:25 +0000183
184 // Accessors.
Devang Patel53bb5c92009-11-10 23:06:00 +0000185 DIVariable getVariable() const { return Var; }
Devang Patel53bb5c92009-11-10 23:06:00 +0000186 void setDIE(DIE *D) { TheDIE = D; }
187 DIE *getDIE() const { return TheDIE; }
Devang Patelc3f5f782010-05-25 23:40:22 +0000188 void setDotDebugLocOffset(unsigned O) { DotDebugLocOffset = O; }
189 unsigned getDotDebugLocOffset() const { return DotDebugLocOffset; }
Devang Patel8bd11de2010-08-09 21:01:39 +0000190 StringRef getName() const { return Var.getName(); }
191 unsigned getTag() const { return Var.getTag(); }
192 bool variableHasComplexAddress() const {
193 assert(Var.Verify() && "Invalid complex DbgVariable!");
194 return Var.hasComplexAddress();
195 }
196 bool isBlockByrefVariable() const {
197 assert(Var.Verify() && "Invalid complex DbgVariable!");
198 return Var.isBlockByrefVariable();
199 }
200 unsigned getNumAddrElements() const {
201 assert(Var.Verify() && "Invalid complex DbgVariable!");
202 return Var.getNumAddrElements();
203 }
204 uint64_t getAddrElement(unsigned i) const {
205 return Var.getAddrElement(i);
206 }
207 DIType getType() const {
208 DIType Ty = Var.getType();
209 // FIXME: isBlockByrefVariable should be reformulated in terms of complex
210 // addresses instead.
211 if (Var.isBlockByrefVariable()) {
212 /* Byref variables, in Blocks, are declared by the programmer as
213 "SomeType VarName;", but the compiler creates a
214 __Block_byref_x_VarName struct, and gives the variable VarName
215 either the struct, or a pointer to the struct, as its type. This
216 is necessary for various behind-the-scenes things the compiler
217 needs to do with by-reference variables in blocks.
218
219 However, as far as the original *programmer* is concerned, the
220 variable should still have type 'SomeType', as originally declared.
221
222 The following function dives into the __Block_byref_x_VarName
223 struct to find the original type of the variable. This will be
224 passed back to the code generating the type for the Debug
225 Information Entry for the variable 'VarName'. 'VarName' will then
226 have the original type 'SomeType' in its debug information.
227
228 The original type 'SomeType' will be the type of the field named
229 'VarName' inside the __Block_byref_x_VarName struct.
230
231 NOTE: In order for this to not completely fail on the debugger
232 side, the Debug Information Entry for the variable VarName needs to
233 have a DW_AT_location that tells the debugger how to unwind through
234 the pointers and __Block_byref_x_VarName struct to find the actual
235 value of the variable. The function addBlockByrefType does this. */
236 DIType subType = Ty;
237 unsigned tag = Ty.getTag();
238
239 if (tag == dwarf::DW_TAG_pointer_type) {
240 DIDerivedType DTy = DIDerivedType(Ty);
241 subType = DTy.getTypeDerivedFrom();
242 }
243
244 DICompositeType blockStruct = DICompositeType(subType);
245 DIArray Elements = blockStruct.getTypeArray();
246
247 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
248 DIDescriptor Element = Elements.getElement(i);
249 DIDerivedType DT = DIDerivedType(Element);
250 if (getName() == DT.getName())
251 return (DT.getTypeDerivedFrom());
252 }
253 return Ty;
254 }
255 return Ty;
256 }
Bill Wendling0310d762009-05-15 09:23:25 +0000257};
258
259//===----------------------------------------------------------------------===//
Devang Pateleac9c072010-04-27 19:46:33 +0000260/// DbgRange - This is used to track range of instructions with identical
261/// debug info scope.
262///
263typedef std::pair<const MachineInstr *, const MachineInstr *> DbgRange;
264
265//===----------------------------------------------------------------------===//
Bill Wendling0310d762009-05-15 09:23:25 +0000266/// DbgScope - This class is used to track scope information.
267///
Devang Patelf76a3d62009-11-16 21:53:40 +0000268class DbgScope {
Bill Wendling0310d762009-05-15 09:23:25 +0000269 DbgScope *Parent; // Parent to this scope.
Jim Grosbach31ef40e2009-11-21 23:12:12 +0000270 DIDescriptor Desc; // Debug info descriptor for scope.
Devang Patel3139fcf2010-01-26 21:39:14 +0000271 // Location at which this scope is inlined.
Jim Grosbach1e20b962010-07-21 21:21:52 +0000272 AssertingVH<const MDNode> InlinedAtLocation;
Devang Patel53bb5c92009-11-10 23:06:00 +0000273 bool AbstractScope; // Abstract Scope
Devang Pateld38dd112009-10-01 18:25:23 +0000274 const MachineInstr *LastInsn; // Last instruction of this scope.
275 const MachineInstr *FirstInsn; // First instruction of this scope.
Devang Pateleac9c072010-04-27 19:46:33 +0000276 unsigned DFSIn, DFSOut;
Jeffrey Yasskin5c213dc2010-03-12 17:45:06 +0000277 // Scopes defined in scope. Contents not owned.
278 SmallVector<DbgScope *, 4> Scopes;
279 // Variables declared in scope. Contents owned.
280 SmallVector<DbgVariable *, 8> Variables;
Devang Pateleac9c072010-04-27 19:46:33 +0000281 SmallVector<DbgRange, 4> Ranges;
Owen Anderson04c05f72009-06-24 22:53:20 +0000282 // Private state for dump()
283 mutable unsigned IndentLevel;
Bill Wendling0310d762009-05-15 09:23:25 +0000284public:
Devang Patele9f8f5e2010-05-07 20:54:48 +0000285 DbgScope(DbgScope *P, DIDescriptor D, const MDNode *I = 0)
Devang Patel53bb5c92009-11-10 23:06:00 +0000286 : Parent(P), Desc(D), InlinedAtLocation(I), AbstractScope(false),
Devang Pateleac9c072010-04-27 19:46:33 +0000287 LastInsn(0), FirstInsn(0),
288 DFSIn(0), DFSOut(0), IndentLevel(0) {}
Bill Wendling0310d762009-05-15 09:23:25 +0000289 virtual ~DbgScope();
290
291 // Accessors.
292 DbgScope *getParent() const { return Parent; }
Devang Patel53bb5c92009-11-10 23:06:00 +0000293 void setParent(DbgScope *P) { Parent = P; }
Bill Wendling0310d762009-05-15 09:23:25 +0000294 DIDescriptor getDesc() const { return Desc; }
Devang Patele9f8f5e2010-05-07 20:54:48 +0000295 const MDNode *getInlinedAt() const { return InlinedAtLocation; }
296 const MDNode *getScopeNode() const { return Desc; }
Jeffrey Yasskin5c213dc2010-03-12 17:45:06 +0000297 const SmallVector<DbgScope *, 4> &getScopes() { return Scopes; }
Devang Patele03161c2010-08-09 18:51:29 +0000298 const SmallVector<DbgVariable *, 8> &getDbgVariables() { return Variables; }
Devang Pateleac9c072010-04-27 19:46:33 +0000299 const SmallVector<DbgRange, 4> &getRanges() { return Ranges; }
300
301 /// openInsnRange - This scope covers instruction range starting from MI.
302 void openInsnRange(const MachineInstr *MI) {
Jim Grosbach1e20b962010-07-21 21:21:52 +0000303 if (!FirstInsn)
Devang Pateleac9c072010-04-27 19:46:33 +0000304 FirstInsn = MI;
Jim Grosbach1e20b962010-07-21 21:21:52 +0000305
Devang Pateleac9c072010-04-27 19:46:33 +0000306 if (Parent)
307 Parent->openInsnRange(MI);
308 }
309
Jim Grosbach1e20b962010-07-21 21:21:52 +0000310 /// extendInsnRange - Extend the current instruction range covered by
Devang Pateleac9c072010-04-27 19:46:33 +0000311 /// this scope.
312 void extendInsnRange(const MachineInstr *MI) {
313 assert (FirstInsn && "MI Range is not open!");
314 LastInsn = MI;
315 if (Parent)
316 Parent->extendInsnRange(MI);
317 }
318
319 /// closeInsnRange - Create a range based on FirstInsn and LastInsn collected
320 /// until now. This is used when a new scope is encountered while walking
321 /// machine instructions.
322 void closeInsnRange(DbgScope *NewScope = NULL) {
323 assert (LastInsn && "Last insn missing!");
324 Ranges.push_back(DbgRange(FirstInsn, LastInsn));
Jim Grosbach1e20b962010-07-21 21:21:52 +0000325 FirstInsn = NULL;
Devang Pateleac9c072010-04-27 19:46:33 +0000326 LastInsn = NULL;
Jim Grosbach1e20b962010-07-21 21:21:52 +0000327 // If Parent dominates NewScope then do not close Parent's instruction
Devang Pateleac9c072010-04-27 19:46:33 +0000328 // range.
329 if (Parent && (!NewScope || !Parent->dominates(NewScope)))
330 Parent->closeInsnRange(NewScope);
331 }
332
Devang Patel53bb5c92009-11-10 23:06:00 +0000333 void setAbstractScope() { AbstractScope = true; }
334 bool isAbstractScope() const { return AbstractScope; }
Devang Pateleac9c072010-04-27 19:46:33 +0000335
336 // Depth First Search support to walk and mainpluate DbgScope hierarchy.
337 unsigned getDFSOut() const { return DFSOut; }
338 void setDFSOut(unsigned O) { DFSOut = O; }
339 unsigned getDFSIn() const { return DFSIn; }
340 void setDFSIn(unsigned I) { DFSIn = I; }
341 bool dominates(const DbgScope *S) {
Jim Grosbach1e20b962010-07-21 21:21:52 +0000342 if (S == this)
Devang Pateleac9c072010-04-27 19:46:33 +0000343 return true;
344 if (DFSIn < S->getDFSIn() && DFSOut > S->getDFSOut())
345 return true;
346 return false;
347 }
Devang Patel53bb5c92009-11-10 23:06:00 +0000348
Devang Patel2c4ceb12009-11-21 02:48:08 +0000349 /// addScope - Add a scope to the scope.
Bill Wendling0310d762009-05-15 09:23:25 +0000350 ///
Devang Patel2c4ceb12009-11-21 02:48:08 +0000351 void addScope(DbgScope *S) { Scopes.push_back(S); }
Bill Wendling0310d762009-05-15 09:23:25 +0000352
Devang Patel2c4ceb12009-11-21 02:48:08 +0000353 /// addVariable - Add a variable to the scope.
Bill Wendling0310d762009-05-15 09:23:25 +0000354 ///
Devang Patel2c4ceb12009-11-21 02:48:08 +0000355 void addVariable(DbgVariable *V) { Variables.push_back(V); }
Bill Wendling0310d762009-05-15 09:23:25 +0000356
Bill Wendling0310d762009-05-15 09:23:25 +0000357#ifndef NDEBUG
358 void dump() const;
359#endif
360};
Devang Pateleac9c072010-04-27 19:46:33 +0000361
Chris Lattnerea761862010-04-05 04:09:20 +0000362} // end llvm namespace
Bill Wendling0310d762009-05-15 09:23:25 +0000363
364#ifndef NDEBUG
365void DbgScope::dump() const {
David Greenef83adbc2009-12-24 00:31:35 +0000366 raw_ostream &err = dbgs();
Chris Lattnerc281de12009-08-23 00:51:00 +0000367 err.indent(IndentLevel);
Devang Patele9f8f5e2010-05-07 20:54:48 +0000368 const MDNode *N = Desc;
Devang Patel53bb5c92009-11-10 23:06:00 +0000369 N->dump();
Devang Patel53bb5c92009-11-10 23:06:00 +0000370 if (AbstractScope)
371 err << "Abstract Scope\n";
Bill Wendling0310d762009-05-15 09:23:25 +0000372
373 IndentLevel += 2;
Devang Patel53bb5c92009-11-10 23:06:00 +0000374 if (!Scopes.empty())
375 err << "Children ...\n";
Bill Wendling0310d762009-05-15 09:23:25 +0000376 for (unsigned i = 0, e = Scopes.size(); i != e; ++i)
377 if (Scopes[i] != this)
378 Scopes[i]->dump();
379
380 IndentLevel -= 2;
381}
382#endif
383
Bill Wendling0310d762009-05-15 09:23:25 +0000384DbgScope::~DbgScope() {
Bill Wendling0310d762009-05-15 09:23:25 +0000385 for (unsigned j = 0, M = Variables.size(); j < M; ++j)
386 delete Variables[j];
Bill Wendling0310d762009-05-15 09:23:25 +0000387}
388
Chris Lattner49cd6642010-04-05 05:11:15 +0000389DwarfDebug::DwarfDebug(AsmPrinter *A, Module *M)
Devang Patel163a9f72010-05-10 22:49:55 +0000390 : Asm(A), MMI(Asm->MMI), FirstCU(0),
Jim Grosbach1e20b962010-07-21 21:21:52 +0000391 AbbreviationsSet(InitAbbreviationsSetSize),
Devang Patelf2548ca2010-04-16 23:33:45 +0000392 CurrentFnDbgScope(0), PrevLabel(NULL) {
Chris Lattnerbc733f52010-03-13 02:17:42 +0000393 NextStringPoolNumber = 0;
Jim Grosbach1e20b962010-07-21 21:21:52 +0000394
Chris Lattner4ad1efe2010-04-04 23:10:38 +0000395 DwarfFrameSectionSym = DwarfInfoSectionSym = DwarfAbbrevSectionSym = 0;
396 DwarfStrSectionSym = TextSectionSym = 0;
Jim Grosbach1e20b962010-07-21 21:21:52 +0000397 DwarfDebugRangeSectionSym = DwarfDebugLocSectionSym = 0;
Devang Patelc3f5f782010-05-25 23:40:22 +0000398 FunctionBeginSym = FunctionEndSym = 0;
Devang Patelca76f6f2010-07-08 20:10:35 +0000399 DIEIntegerOne = new (DIEValueAllocator) DIEInteger(1);
Dan Gohman03c3dc72010-06-18 15:56:31 +0000400 {
401 NamedRegionTimer T(DbgTimerName, DWARFGroupName, TimePassesIsEnabled);
402 beginModule(M);
Torok Edwin9c421072010-04-07 10:44:46 +0000403 }
Bill Wendling0310d762009-05-15 09:23:25 +0000404}
405DwarfDebug::~DwarfDebug() {
Benjamin Kramer345ef342010-03-31 19:34:01 +0000406 for (unsigned j = 0, M = DIEBlocks.size(); j < M; ++j)
407 DIEBlocks[j]->~DIEBlock();
Bill Wendling0310d762009-05-15 09:23:25 +0000408}
409
Chris Lattnerbc733f52010-03-13 02:17:42 +0000410MCSymbol *DwarfDebug::getStringPoolEntry(StringRef Str) {
411 std::pair<MCSymbol*, unsigned> &Entry = StringPool[Str];
412 if (Entry.first) return Entry.first;
413
414 Entry.second = NextStringPoolNumber++;
Chris Lattnerc0215722010-04-04 19:25:43 +0000415 return Entry.first = Asm->GetTempSymbol("string", Entry.second);
Chris Lattnerbc733f52010-03-13 02:17:42 +0000416}
417
418
Devang Patel2c4ceb12009-11-21 02:48:08 +0000419/// assignAbbrevNumber - Define a unique number for the abbreviation.
Bill Wendling0310d762009-05-15 09:23:25 +0000420///
Devang Patel2c4ceb12009-11-21 02:48:08 +0000421void DwarfDebug::assignAbbrevNumber(DIEAbbrev &Abbrev) {
Bill Wendling0310d762009-05-15 09:23:25 +0000422 // Profile the node so that we can make it unique.
423 FoldingSetNodeID ID;
424 Abbrev.Profile(ID);
425
426 // Check the set for priors.
427 DIEAbbrev *InSet = AbbreviationsSet.GetOrInsertNode(&Abbrev);
428
429 // If it's newly added.
430 if (InSet == &Abbrev) {
431 // Add to abbreviation list.
432 Abbreviations.push_back(&Abbrev);
433
434 // Assign the vector position + 1 as its number.
435 Abbrev.setNumber(Abbreviations.size());
436 } else {
437 // Assign existing abbreviation number.
438 Abbrev.setNumber(InSet->getNumber());
439 }
440}
441
Devang Patel2c4ceb12009-11-21 02:48:08 +0000442/// createDIEEntry - Creates a new DIEEntry to be a proxy for a debug
Bill Wendling995f80a2009-05-20 23:24:48 +0000443/// information entry.
Devang Patel2c4ceb12009-11-21 02:48:08 +0000444DIEEntry *DwarfDebug::createDIEEntry(DIE *Entry) {
Benjamin Kramer345ef342010-03-31 19:34:01 +0000445 DIEEntry *Value = new (DIEValueAllocator) DIEEntry(Entry);
Bill Wendling0310d762009-05-15 09:23:25 +0000446 return Value;
447}
448
Devang Patel2c4ceb12009-11-21 02:48:08 +0000449/// addUInt - Add an unsigned integer attribute data and value.
Bill Wendling0310d762009-05-15 09:23:25 +0000450///
Devang Patel2c4ceb12009-11-21 02:48:08 +0000451void DwarfDebug::addUInt(DIE *Die, unsigned Attribute,
Bill Wendling0310d762009-05-15 09:23:25 +0000452 unsigned Form, uint64_t Integer) {
453 if (!Form) Form = DIEInteger::BestForm(false, Integer);
Jim Grosbach1e20b962010-07-21 21:21:52 +0000454 DIEValue *Value = Integer == 1 ?
Devang Patelca76f6f2010-07-08 20:10:35 +0000455 DIEIntegerOne : new (DIEValueAllocator) DIEInteger(Integer);
Devang Patel2c4ceb12009-11-21 02:48:08 +0000456 Die->addValue(Attribute, Form, Value);
Bill Wendling0310d762009-05-15 09:23:25 +0000457}
458
Devang Patel2c4ceb12009-11-21 02:48:08 +0000459/// addSInt - Add an signed integer attribute data and value.
Bill Wendling0310d762009-05-15 09:23:25 +0000460///
Devang Patel2c4ceb12009-11-21 02:48:08 +0000461void DwarfDebug::addSInt(DIE *Die, unsigned Attribute,
Bill Wendling0310d762009-05-15 09:23:25 +0000462 unsigned Form, int64_t Integer) {
463 if (!Form) Form = DIEInteger::BestForm(true, Integer);
Benjamin Kramer345ef342010-03-31 19:34:01 +0000464 DIEValue *Value = new (DIEValueAllocator) DIEInteger(Integer);
Devang Patel2c4ceb12009-11-21 02:48:08 +0000465 Die->addValue(Attribute, Form, Value);
Bill Wendling0310d762009-05-15 09:23:25 +0000466}
467
Devang Patel69f57b12009-12-02 15:25:16 +0000468/// addString - Add a string attribute data and value. DIEString only
Jim Grosbach1e20b962010-07-21 21:21:52 +0000469/// keeps string reference.
Devang Patel2c4ceb12009-11-21 02:48:08 +0000470void DwarfDebug::addString(DIE *Die, unsigned Attribute, unsigned Form,
Chris Lattner4cf202b2010-01-23 03:11:46 +0000471 StringRef String) {
Benjamin Kramer345ef342010-03-31 19:34:01 +0000472 DIEValue *Value = new (DIEValueAllocator) DIEString(String);
Devang Patel2c4ceb12009-11-21 02:48:08 +0000473 Die->addValue(Attribute, Form, Value);
Bill Wendling0310d762009-05-15 09:23:25 +0000474}
475
Devang Patel2c4ceb12009-11-21 02:48:08 +0000476/// addLabel - Add a Dwarf label attribute data and value.
Bill Wendling0310d762009-05-15 09:23:25 +0000477///
Devang Patel2c4ceb12009-11-21 02:48:08 +0000478void DwarfDebug::addLabel(DIE *Die, unsigned Attribute, unsigned Form,
Chris Lattnerb98b1bf2010-03-08 22:23:36 +0000479 const MCSymbol *Label) {
Benjamin Kramer345ef342010-03-31 19:34:01 +0000480 DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
Devang Patel2c4ceb12009-11-21 02:48:08 +0000481 Die->addValue(Attribute, Form, Value);
Bill Wendling0310d762009-05-15 09:23:25 +0000482}
483
Devang Patel2c4ceb12009-11-21 02:48:08 +0000484/// addDelta - Add a label delta attribute data and value.
Bill Wendling0310d762009-05-15 09:23:25 +0000485///
Devang Patel2c4ceb12009-11-21 02:48:08 +0000486void DwarfDebug::addDelta(DIE *Die, unsigned Attribute, unsigned Form,
Chris Lattnerb98b1bf2010-03-08 22:23:36 +0000487 const MCSymbol *Hi, const MCSymbol *Lo) {
Benjamin Kramer345ef342010-03-31 19:34:01 +0000488 DIEValue *Value = new (DIEValueAllocator) DIEDelta(Hi, Lo);
Devang Patel2c4ceb12009-11-21 02:48:08 +0000489 Die->addValue(Attribute, Form, Value);
Bill Wendling0310d762009-05-15 09:23:25 +0000490}
491
Chris Lattner74e41f92010-04-05 05:24:55 +0000492/// addDIEEntry - Add a DIE attribute data and value.
493///
494void DwarfDebug::addDIEEntry(DIE *Die, unsigned Attribute, unsigned Form,
495 DIE *Entry) {
496 Die->addValue(Attribute, Form, createDIEEntry(Entry));
497}
498
499
Devang Patel2c4ceb12009-11-21 02:48:08 +0000500/// addBlock - Add block data.
Bill Wendling0310d762009-05-15 09:23:25 +0000501///
Devang Patel2c4ceb12009-11-21 02:48:08 +0000502void DwarfDebug::addBlock(DIE *Die, unsigned Attribute, unsigned Form,
Bill Wendling0310d762009-05-15 09:23:25 +0000503 DIEBlock *Block) {
Chris Lattnera37d5382010-04-05 00:18:22 +0000504 Block->ComputeSize(Asm);
Benjamin Kramer345ef342010-03-31 19:34:01 +0000505 DIEBlocks.push_back(Block); // Memoize so we can call the destructor later on.
Devang Patel2c4ceb12009-11-21 02:48:08 +0000506 Die->addValue(Attribute, Block->BestForm(), Block);
Bill Wendling0310d762009-05-15 09:23:25 +0000507}
508
Devang Patel2c4ceb12009-11-21 02:48:08 +0000509/// addSourceLine - Add location information to specified debug information
Bill Wendling0310d762009-05-15 09:23:25 +0000510/// entry.
Devang Patel85e95802010-08-10 04:09:06 +0000511void DwarfDebug::addSourceLine(DIE *Die, DIVariable V) {
Devang Patelc665a512010-05-07 23:33:41 +0000512 // Verify variable.
Devang Patel81625742010-08-09 20:20:05 +0000513 if (!V.Verify())
Bill Wendling0310d762009-05-15 09:23:25 +0000514 return;
515
Devang Patel81625742010-08-09 20:20:05 +0000516 unsigned Line = V.getLineNumber();
Devang Patelb2bada32010-10-08 17:18:54 +0000517 if (Line == 0)
518 return;
Devang Patel23670e52011-03-24 20:30:50 +0000519 unsigned FileID = GetOrCreateSourceID(V.getContext().getFilename(),
520 V.getContext().getDirectory());
Bill Wendling0310d762009-05-15 09:23:25 +0000521 assert(FileID && "Invalid file id");
Devang Patel2c4ceb12009-11-21 02:48:08 +0000522 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
523 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
Bill Wendling0310d762009-05-15 09:23:25 +0000524}
525
Devang Patel2c4ceb12009-11-21 02:48:08 +0000526/// addSourceLine - Add location information to specified debug information
Bill Wendling0310d762009-05-15 09:23:25 +0000527/// entry.
Devang Patel85e95802010-08-10 04:09:06 +0000528void DwarfDebug::addSourceLine(DIE *Die, DIGlobalVariable G) {
Devang Patelc665a512010-05-07 23:33:41 +0000529 // Verify global variable.
Devang Patel81625742010-08-09 20:20:05 +0000530 if (!G.Verify())
Bill Wendling0310d762009-05-15 09:23:25 +0000531 return;
532
Devang Patel81625742010-08-09 20:20:05 +0000533 unsigned Line = G.getLineNumber();
Devang Patelb2bada32010-10-08 17:18:54 +0000534 if (Line == 0)
535 return;
Devang Patel23670e52011-03-24 20:30:50 +0000536 unsigned FileID = GetOrCreateSourceID(G.getContext().getFilename(),
537 G.getContext().getDirectory());
Bill Wendling0310d762009-05-15 09:23:25 +0000538 assert(FileID && "Invalid file id");
Devang Patel2c4ceb12009-11-21 02:48:08 +0000539 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
540 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
Bill Wendling0310d762009-05-15 09:23:25 +0000541}
Devang Patel82dfc0c2009-08-31 22:47:13 +0000542
Devang Patel2c4ceb12009-11-21 02:48:08 +0000543/// addSourceLine - Add location information to specified debug information
Devang Patel82dfc0c2009-08-31 22:47:13 +0000544/// entry.
Devang Patel85e95802010-08-10 04:09:06 +0000545void DwarfDebug::addSourceLine(DIE *Die, DISubprogram SP) {
Devang Patelc665a512010-05-07 23:33:41 +0000546 // Verify subprogram.
Devang Patel81625742010-08-09 20:20:05 +0000547 if (!SP.Verify())
Devang Patel82dfc0c2009-08-31 22:47:13 +0000548 return;
Caroline Ticec6f9d622009-09-11 18:25:54 +0000549 // If the line number is 0, don't add it.
Devang Patel81625742010-08-09 20:20:05 +0000550 if (SP.getLineNumber() == 0)
Caroline Ticec6f9d622009-09-11 18:25:54 +0000551 return;
552
Devang Patel81625742010-08-09 20:20:05 +0000553 unsigned Line = SP.getLineNumber();
554 if (!SP.getContext().Verify())
Devang Patel77bf2952010-03-08 22:02:50 +0000555 return;
Devang Patel23670e52011-03-24 20:30:50 +0000556 unsigned FileID = GetOrCreateSourceID(SP.getFilename(), SP.getDirectory());
Devang Patel82dfc0c2009-08-31 22:47:13 +0000557 assert(FileID && "Invalid file id");
Devang Patel2c4ceb12009-11-21 02:48:08 +0000558 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
559 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
Devang Patel82dfc0c2009-08-31 22:47:13 +0000560}
561
Devang Patel2c4ceb12009-11-21 02:48:08 +0000562/// addSourceLine - Add location information to specified debug information
Devang Patel82dfc0c2009-08-31 22:47:13 +0000563/// entry.
Devang Patel85e95802010-08-10 04:09:06 +0000564void DwarfDebug::addSourceLine(DIE *Die, DIType Ty) {
Devang Patelc665a512010-05-07 23:33:41 +0000565 // Verify type.
Devang Patel81625742010-08-09 20:20:05 +0000566 if (!Ty.Verify())
Bill Wendling0310d762009-05-15 09:23:25 +0000567 return;
568
Devang Patel81625742010-08-09 20:20:05 +0000569 unsigned Line = Ty.getLineNumber();
Devang Patelb2bada32010-10-08 17:18:54 +0000570 if (Line == 0 || !Ty.getContext().Verify())
Devang Patel77bf2952010-03-08 22:02:50 +0000571 return;
Devang Patel23670e52011-03-24 20:30:50 +0000572 unsigned FileID = GetOrCreateSourceID(Ty.getFilename(), Ty.getDirectory());
Bill Wendling0310d762009-05-15 09:23:25 +0000573 assert(FileID && "Invalid file id");
Devang Patel2c4ceb12009-11-21 02:48:08 +0000574 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
575 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
Bill Wendling0310d762009-05-15 09:23:25 +0000576}
577
Devang Patel6404e4e2009-12-15 19:16:48 +0000578/// addSourceLine - Add location information to specified debug information
579/// entry.
Devang Patel85e95802010-08-10 04:09:06 +0000580void DwarfDebug::addSourceLine(DIE *Die, DINameSpace NS) {
Devang Patelc665a512010-05-07 23:33:41 +0000581 // Verify namespace.
Devang Patel81625742010-08-09 20:20:05 +0000582 if (!NS.Verify())
Devang Patel6404e4e2009-12-15 19:16:48 +0000583 return;
584
Devang Patel81625742010-08-09 20:20:05 +0000585 unsigned Line = NS.getLineNumber();
Devang Patelb2bada32010-10-08 17:18:54 +0000586 if (Line == 0)
587 return;
Devang Patel81625742010-08-09 20:20:05 +0000588 StringRef FN = NS.getFilename();
Devang Patel6404e4e2009-12-15 19:16:48 +0000589
Devang Patel23670e52011-03-24 20:30:50 +0000590 unsigned FileID = GetOrCreateSourceID(FN, NS.getDirectory());
Devang Patel6404e4e2009-12-15 19:16:48 +0000591 assert(FileID && "Invalid file id");
592 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
593 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
594}
595
Devang Patel9e3bd2c2010-08-31 06:11:28 +0000596/// addVariableAddress - Add DW_AT_location attribute for a DbgVariable based
597/// on provided frame index.
598void DwarfDebug::addVariableAddress(DbgVariable *&DV, DIE *Die, int64_t FI) {
599 MachineLocation Location;
600 unsigned FrameReg;
Anton Korobeynikov16c29b52011-01-10 12:39:04 +0000601 const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
Anton Korobeynikov82f58742010-11-20 15:59:32 +0000602 int Offset = TFI->getFrameIndexReference(*Asm->MF, FI, FrameReg);
Devang Patel9e3bd2c2010-08-31 06:11:28 +0000603 Location.set(FrameReg, Offset);
604
Devang Patel8bd11de2010-08-09 21:01:39 +0000605 if (DV->variableHasComplexAddress())
606 addComplexAddress(DV, Die, dwarf::DW_AT_location, Location);
607 else if (DV->isBlockByrefVariable())
608 addBlockByrefAddress(DV, Die, dwarf::DW_AT_location, Location);
609 else
610 addAddress(Die, dwarf::DW_AT_location, Location);
Caroline Ticedc8f6042009-08-31 21:19:37 +0000611}
612
Devang Patel2c4ceb12009-11-21 02:48:08 +0000613/// addComplexAddress - Start with the address based on the location provided,
Mike Stump3e4c9bd2009-09-30 00:08:22 +0000614/// and generate the DWARF information necessary to find the actual variable
615/// given the extra address information encoded in the DIVariable, starting from
616/// the starting location. Add the DWARF information to the die.
617///
Devang Patel2c4ceb12009-11-21 02:48:08 +0000618void DwarfDebug::addComplexAddress(DbgVariable *&DV, DIE *Die,
Mike Stump3e4c9bd2009-09-30 00:08:22 +0000619 unsigned Attribute,
620 const MachineLocation &Location) {
Devang Patel8bd11de2010-08-09 21:01:39 +0000621 DIType Ty = DV->getType();
Mike Stump3e4c9bd2009-09-30 00:08:22 +0000622
623 // Decode the original location, and use that as the start of the byref
624 // variable's location.
Chris Lattnerd38fee82010-04-05 00:13:49 +0000625 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
Mike Stump3e4c9bd2009-09-30 00:08:22 +0000626 unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
Benjamin Kramer345ef342010-03-31 19:34:01 +0000627 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Mike Stump3e4c9bd2009-09-30 00:08:22 +0000628
629 if (Location.isReg()) {
630 if (Reg < 32) {
Devang Patel2c4ceb12009-11-21 02:48:08 +0000631 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
Mike Stump3e4c9bd2009-09-30 00:08:22 +0000632 } else {
Devang Pateldacde942011-01-19 23:04:47 +0000633 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
Devang Patel2c4ceb12009-11-21 02:48:08 +0000634 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
Mike Stump3e4c9bd2009-09-30 00:08:22 +0000635 }
636 } else {
637 if (Reg < 32)
Devang Patel2c4ceb12009-11-21 02:48:08 +0000638 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
Mike Stump3e4c9bd2009-09-30 00:08:22 +0000639 else {
Devang Patel2c4ceb12009-11-21 02:48:08 +0000640 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
641 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
Mike Stump3e4c9bd2009-09-30 00:08:22 +0000642 }
643
Devang Patel2c4ceb12009-11-21 02:48:08 +0000644 addUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
Mike Stump3e4c9bd2009-09-30 00:08:22 +0000645 }
646
Devang Patel8bd11de2010-08-09 21:01:39 +0000647 for (unsigned i = 0, N = DV->getNumAddrElements(); i < N; ++i) {
648 uint64_t Element = DV->getAddrElement(i);
Mike Stump3e4c9bd2009-09-30 00:08:22 +0000649
Devang Patel0eea95d2011-02-24 18:49:30 +0000650 if (Element == DIBuilder::OpPlus) {
Devang Patel2c4ceb12009-11-21 02:48:08 +0000651 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
Devang Patel8bd11de2010-08-09 21:01:39 +0000652 addUInt(Block, 0, dwarf::DW_FORM_udata, DV->getAddrElement(++i));
Devang Patel0eea95d2011-02-24 18:49:30 +0000653 } else if (Element == DIBuilder::OpDeref) {
Devang Patel2c4ceb12009-11-21 02:48:08 +0000654 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Devang Patel0eea95d2011-02-24 18:49:30 +0000655 } else llvm_unreachable("unknown DIBuilder Opcode");
Mike Stump3e4c9bd2009-09-30 00:08:22 +0000656 }
657
658 // Now attach the location information to the DIE.
Devang Patel2c4ceb12009-11-21 02:48:08 +0000659 addBlock(Die, Attribute, 0, Block);
Mike Stump3e4c9bd2009-09-30 00:08:22 +0000660}
661
Caroline Ticedc8f6042009-08-31 21:19:37 +0000662/* Byref variables, in Blocks, are declared by the programmer as "SomeType
663 VarName;", but the compiler creates a __Block_byref_x_VarName struct, and
664 gives the variable VarName either the struct, or a pointer to the struct, as
665 its type. This is necessary for various behind-the-scenes things the
666 compiler needs to do with by-reference variables in Blocks.
667
668 However, as far as the original *programmer* is concerned, the variable
669 should still have type 'SomeType', as originally declared.
670
Devang Patel2c4ceb12009-11-21 02:48:08 +0000671 The function getBlockByrefType dives into the __Block_byref_x_VarName
Caroline Ticedc8f6042009-08-31 21:19:37 +0000672 struct to find the original type of the variable, which is then assigned to
673 the variable's Debug Information Entry as its real type. So far, so good.
674 However now the debugger will expect the variable VarName to have the type
675 SomeType. So we need the location attribute for the variable to be an
Daniel Dunbarf612ff62009-09-19 20:40:05 +0000676 expression that explains to the debugger how to navigate through the
Caroline Ticedc8f6042009-08-31 21:19:37 +0000677 pointers and struct to find the actual variable of type SomeType.
678
679 The following function does just that. We start by getting
680 the "normal" location for the variable. This will be the location
681 of either the struct __Block_byref_x_VarName or the pointer to the
682 struct __Block_byref_x_VarName.
683
684 The struct will look something like:
685
686 struct __Block_byref_x_VarName {
687 ... <various fields>
688 struct __Block_byref_x_VarName *forwarding;
689 ... <various other fields>
690 SomeType VarName;
691 ... <maybe more fields>
692 };
693
694 If we are given the struct directly (as our starting point) we
695 need to tell the debugger to:
696
697 1). Add the offset of the forwarding field.
698
Dan Gohmanf451cb82010-02-10 16:03:48 +0000699 2). Follow that pointer to get the real __Block_byref_x_VarName
Caroline Ticedc8f6042009-08-31 21:19:37 +0000700 struct to use (the real one may have been copied onto the heap).
701
702 3). Add the offset for the field VarName, to find the actual variable.
703
704 If we started with a pointer to the struct, then we need to
705 dereference that pointer first, before the other steps.
706 Translating this into DWARF ops, we will need to append the following
707 to the current location description for the variable:
708
709 DW_OP_deref -- optional, if we start with a pointer
710 DW_OP_plus_uconst <forward_fld_offset>
711 DW_OP_deref
712 DW_OP_plus_uconst <varName_fld_offset>
713
714 That is what this function does. */
715
Devang Patel2c4ceb12009-11-21 02:48:08 +0000716/// addBlockByrefAddress - Start with the address based on the location
Caroline Ticedc8f6042009-08-31 21:19:37 +0000717/// provided, and generate the DWARF information necessary to find the
718/// actual Block variable (navigating the Block struct) based on the
719/// starting location. Add the DWARF information to the die. For
720/// more information, read large comment just above here.
721///
Devang Patel2c4ceb12009-11-21 02:48:08 +0000722void DwarfDebug::addBlockByrefAddress(DbgVariable *&DV, DIE *Die,
Daniel Dunbar00564992009-09-19 20:40:14 +0000723 unsigned Attribute,
724 const MachineLocation &Location) {
Devang Patel8bd11de2010-08-09 21:01:39 +0000725 DIType Ty = DV->getType();
Caroline Ticedc8f6042009-08-31 21:19:37 +0000726 DIType TmpTy = Ty;
727 unsigned Tag = Ty.getTag();
728 bool isPointer = false;
729
Devang Patel8bd11de2010-08-09 21:01:39 +0000730 StringRef varName = DV->getName();
Caroline Ticedc8f6042009-08-31 21:19:37 +0000731
732 if (Tag == dwarf::DW_TAG_pointer_type) {
Devang Patel2db49d72010-05-07 18:11:54 +0000733 DIDerivedType DTy = DIDerivedType(Ty);
Caroline Ticedc8f6042009-08-31 21:19:37 +0000734 TmpTy = DTy.getTypeDerivedFrom();
735 isPointer = true;
736 }
737
Devang Patel2db49d72010-05-07 18:11:54 +0000738 DICompositeType blockStruct = DICompositeType(TmpTy);
Caroline Ticedc8f6042009-08-31 21:19:37 +0000739
Daniel Dunbar00564992009-09-19 20:40:14 +0000740 // Find the __forwarding field and the variable field in the __Block_byref
741 // struct.
Daniel Dunbar00564992009-09-19 20:40:14 +0000742 DIArray Fields = blockStruct.getTypeArray();
743 DIDescriptor varField = DIDescriptor();
744 DIDescriptor forwardingField = DIDescriptor();
Caroline Ticedc8f6042009-08-31 21:19:37 +0000745
Daniel Dunbar00564992009-09-19 20:40:14 +0000746 for (unsigned i = 0, N = Fields.getNumElements(); i < N; ++i) {
747 DIDescriptor Element = Fields.getElement(i);
Devang Patel2db49d72010-05-07 18:11:54 +0000748 DIDerivedType DT = DIDerivedType(Element);
Devang Patel65dbc902009-11-25 17:36:49 +0000749 StringRef fieldName = DT.getName();
750 if (fieldName == "__forwarding")
Daniel Dunbar00564992009-09-19 20:40:14 +0000751 forwardingField = Element;
Devang Patel65dbc902009-11-25 17:36:49 +0000752 else if (fieldName == varName)
Daniel Dunbar00564992009-09-19 20:40:14 +0000753 varField = Element;
754 }
Daniel Dunbarf612ff62009-09-19 20:40:05 +0000755
Daniel Dunbar00564992009-09-19 20:40:14 +0000756 // Get the offsets for the forwarding field and the variable field.
Chris Lattner1d65ba72010-03-31 06:06:37 +0000757 unsigned forwardingFieldOffset =
Devang Patel2db49d72010-05-07 18:11:54 +0000758 DIDerivedType(forwardingField).getOffsetInBits() >> 3;
Chris Lattner1d65ba72010-03-31 06:06:37 +0000759 unsigned varFieldOffset =
Devang Patel2db49d72010-05-07 18:11:54 +0000760 DIDerivedType(varField).getOffsetInBits() >> 3;
Caroline Ticedc8f6042009-08-31 21:19:37 +0000761
Mike Stump7e3720d2009-09-24 23:21:26 +0000762 // Decode the original location, and use that as the start of the byref
763 // variable's location.
Chris Lattnerd38fee82010-04-05 00:13:49 +0000764 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
Daniel Dunbar00564992009-09-19 20:40:14 +0000765 unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
Benjamin Kramer345ef342010-03-31 19:34:01 +0000766 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Caroline Ticedc8f6042009-08-31 21:19:37 +0000767
Daniel Dunbar00564992009-09-19 20:40:14 +0000768 if (Location.isReg()) {
769 if (Reg < 32)
Devang Patel2c4ceb12009-11-21 02:48:08 +0000770 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
Daniel Dunbar00564992009-09-19 20:40:14 +0000771 else {
Devang Pateldacde942011-01-19 23:04:47 +0000772 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
Devang Patel2c4ceb12009-11-21 02:48:08 +0000773 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
Daniel Dunbar00564992009-09-19 20:40:14 +0000774 }
775 } else {
776 if (Reg < 32)
Devang Patel2c4ceb12009-11-21 02:48:08 +0000777 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
Daniel Dunbar00564992009-09-19 20:40:14 +0000778 else {
Devang Patel2c4ceb12009-11-21 02:48:08 +0000779 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
780 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
Daniel Dunbar00564992009-09-19 20:40:14 +0000781 }
Caroline Ticedc8f6042009-08-31 21:19:37 +0000782
Devang Patel2c4ceb12009-11-21 02:48:08 +0000783 addUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
Daniel Dunbar00564992009-09-19 20:40:14 +0000784 }
Caroline Ticedc8f6042009-08-31 21:19:37 +0000785
Mike Stump7e3720d2009-09-24 23:21:26 +0000786 // If we started with a pointer to the __Block_byref... struct, then
Daniel Dunbar00564992009-09-19 20:40:14 +0000787 // the first thing we need to do is dereference the pointer (DW_OP_deref).
Daniel Dunbar00564992009-09-19 20:40:14 +0000788 if (isPointer)
Devang Patel2c4ceb12009-11-21 02:48:08 +0000789 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Caroline Ticedc8f6042009-08-31 21:19:37 +0000790
Daniel Dunbar00564992009-09-19 20:40:14 +0000791 // Next add the offset for the '__forwarding' field:
792 // DW_OP_plus_uconst ForwardingFieldOffset. Note there's no point in
793 // adding the offset if it's 0.
Daniel Dunbar00564992009-09-19 20:40:14 +0000794 if (forwardingFieldOffset > 0) {
Devang Patel2c4ceb12009-11-21 02:48:08 +0000795 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
796 addUInt(Block, 0, dwarf::DW_FORM_udata, forwardingFieldOffset);
Daniel Dunbar00564992009-09-19 20:40:14 +0000797 }
Caroline Ticedc8f6042009-08-31 21:19:37 +0000798
Daniel Dunbar00564992009-09-19 20:40:14 +0000799 // Now dereference the __forwarding field to get to the real __Block_byref
800 // struct: DW_OP_deref.
Devang Patel2c4ceb12009-11-21 02:48:08 +0000801 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Caroline Ticedc8f6042009-08-31 21:19:37 +0000802
Daniel Dunbar00564992009-09-19 20:40:14 +0000803 // Now that we've got the real __Block_byref... struct, add the offset
804 // for the variable's field to get to the location of the actual variable:
805 // DW_OP_plus_uconst varFieldOffset. Again, don't add if it's 0.
Daniel Dunbar00564992009-09-19 20:40:14 +0000806 if (varFieldOffset > 0) {
Devang Patel2c4ceb12009-11-21 02:48:08 +0000807 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
808 addUInt(Block, 0, dwarf::DW_FORM_udata, varFieldOffset);
Daniel Dunbar00564992009-09-19 20:40:14 +0000809 }
Caroline Ticedc8f6042009-08-31 21:19:37 +0000810
Daniel Dunbar00564992009-09-19 20:40:14 +0000811 // Now attach the location information to the DIE.
Devang Patel2c4ceb12009-11-21 02:48:08 +0000812 addBlock(Die, Attribute, 0, Block);
Caroline Ticedc8f6042009-08-31 21:19:37 +0000813}
814
Devang Patel2c4ceb12009-11-21 02:48:08 +0000815/// addAddress - Add an address attribute to a die based on the location
Bill Wendling0310d762009-05-15 09:23:25 +0000816/// provided.
Devang Patel2c4ceb12009-11-21 02:48:08 +0000817void DwarfDebug::addAddress(DIE *Die, unsigned Attribute,
Bill Wendling0310d762009-05-15 09:23:25 +0000818 const MachineLocation &Location) {
Chris Lattnerd38fee82010-04-05 00:13:49 +0000819 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
Bill Wendling0310d762009-05-15 09:23:25 +0000820 unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
Benjamin Kramer345ef342010-03-31 19:34:01 +0000821 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Devang Patelbe90c3a2010-09-22 21:10:38 +0000822
Devang Patelc8821042010-11-02 17:37:00 +0000823 if (RI->getFrameRegister(*Asm->MF) == Location.getReg()
Devang Patelbe90c3a2010-09-22 21:10:38 +0000824 && Location.getOffset()) {
825 // If variable offset is based in frame register then use fbreg.
826 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_fbreg);
827 addSInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
828 addBlock(Die, Attribute, 0, Block);
829 return;
830 }
Bill Wendling0310d762009-05-15 09:23:25 +0000831
832 if (Location.isReg()) {
833 if (Reg < 32) {
Devang Patel2c4ceb12009-11-21 02:48:08 +0000834 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
Bill Wendling0310d762009-05-15 09:23:25 +0000835 } else {
Devang Patel2c4ceb12009-11-21 02:48:08 +0000836 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
837 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
Bill Wendling0310d762009-05-15 09:23:25 +0000838 }
839 } else {
840 if (Reg < 32) {
Devang Patel2c4ceb12009-11-21 02:48:08 +0000841 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
Bill Wendling0310d762009-05-15 09:23:25 +0000842 } else {
Devang Patel2c4ceb12009-11-21 02:48:08 +0000843 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
844 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
Bill Wendling0310d762009-05-15 09:23:25 +0000845 }
846
Devang Patel2c4ceb12009-11-21 02:48:08 +0000847 addUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
Bill Wendling0310d762009-05-15 09:23:25 +0000848 }
849
Devang Patel2c4ceb12009-11-21 02:48:08 +0000850 addBlock(Die, Attribute, 0, Block);
Bill Wendling0310d762009-05-15 09:23:25 +0000851}
852
Devang Patela43098d2010-04-28 01:03:09 +0000853/// addRegisterAddress - Add register location entry in variable DIE.
Devang Patel522ad742010-11-12 23:20:42 +0000854bool DwarfDebug::addRegisterAddress(DIE *Die, const MachineOperand &MO) {
Devang Patela43098d2010-04-28 01:03:09 +0000855 assert (MO.isReg() && "Invalid machine operand!");
856 if (!MO.getReg())
857 return false;
858 MachineLocation Location;
859 Location.set(MO.getReg());
860 addAddress(Die, dwarf::DW_AT_location, Location);
Devang Patela43098d2010-04-28 01:03:09 +0000861 return true;
862}
863
864/// addConstantValue - Add constant value entry in variable DIE.
Devang Patel522ad742010-11-12 23:20:42 +0000865bool DwarfDebug::addConstantValue(DIE *Die, const MachineOperand &MO) {
Devang Patela43098d2010-04-28 01:03:09 +0000866 assert (MO.isImm() && "Invalid machine operand!");
867 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
868 unsigned Imm = MO.getImm();
869 addUInt(Block, 0, dwarf::DW_FORM_udata, Imm);
870 addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
Devang Patela43098d2010-04-28 01:03:09 +0000871 return true;
872}
873
874/// addConstantFPValue - Add constant value entry in variable DIE.
Devang Patel522ad742010-11-12 23:20:42 +0000875bool DwarfDebug::addConstantFPValue(DIE *Die, const MachineOperand &MO) {
Devang Patela43098d2010-04-28 01:03:09 +0000876 assert (MO.isFPImm() && "Invalid machine operand!");
877 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
878 APFloat FPImm = MO.getFPImm()->getValueAPF();
Jim Grosbach1e20b962010-07-21 21:21:52 +0000879
Devang Patela43098d2010-04-28 01:03:09 +0000880 // Get the raw data form of the floating point.
881 const APInt FltVal = FPImm.bitcastToAPInt();
882 const char *FltPtr = (const char*)FltVal.getRawData();
Jim Grosbach1e20b962010-07-21 21:21:52 +0000883
Devang Patela43098d2010-04-28 01:03:09 +0000884 int NumBytes = FltVal.getBitWidth() / 8; // 8 bits per byte.
885 bool LittleEndian = Asm->getTargetData().isLittleEndian();
886 int Incr = (LittleEndian ? 1 : -1);
887 int Start = (LittleEndian ? 0 : NumBytes - 1);
888 int Stop = (LittleEndian ? NumBytes : -1);
Jim Grosbach1e20b962010-07-21 21:21:52 +0000889
Devang Patela43098d2010-04-28 01:03:09 +0000890 // Output the constant to DWARF one byte at a time.
891 for (; Start != Stop; Start += Incr)
892 addUInt(Block, 0, dwarf::DW_FORM_data1,
893 (unsigned char)0xFF & FltPtr[Start]);
Jim Grosbach1e20b962010-07-21 21:21:52 +0000894
Devang Patela43098d2010-04-28 01:03:09 +0000895 addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
Jim Grosbach1e20b962010-07-21 21:21:52 +0000896 return true;
Devang Patela43098d2010-04-28 01:03:09 +0000897}
898
Devang Patel76a788c2011-01-06 21:39:25 +0000899/// addConstantValue - Add constant value entry in variable DIE.
900bool DwarfDebug::addConstantValue(DIE *Die, ConstantInt *CI,
901 bool Unsigned) {
902 if (CI->getBitWidth() <= 64) {
903 if (Unsigned)
904 addUInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_udata,
905 CI->getZExtValue());
906 else
907 addSInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata,
908 CI->getSExtValue());
909 return true;
910 }
911
912 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
913
914 // Get the raw data form of the large APInt.
915 const APInt Val = CI->getValue();
916 const char *Ptr = (const char*)Val.getRawData();
917
918 int NumBytes = Val.getBitWidth() / 8; // 8 bits per byte.
919 bool LittleEndian = Asm->getTargetData().isLittleEndian();
920 int Incr = (LittleEndian ? 1 : -1);
921 int Start = (LittleEndian ? 0 : NumBytes - 1);
922 int Stop = (LittleEndian ? NumBytes : -1);
923
924 // Output the constant to DWARF one byte at a time.
925 for (; Start != Stop; Start += Incr)
926 addUInt(Block, 0, dwarf::DW_FORM_data1,
927 (unsigned char)0xFF & Ptr[Start]);
928
929 addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
930 return true;
931}
Devang Patela43098d2010-04-28 01:03:09 +0000932
Devang Patelb4c2bc252011-04-05 21:08:24 +0000933/// addTemplateParams - Add template parameters in buffer.
934void DwarfDebug::addTemplateParams(DIE &Buffer, DIArray TParams) {
935 // Add template parameters.
936 for (unsigned i = 0, e = TParams.getNumElements(); i != e; ++i) {
937 DIDescriptor Element = TParams.getElement(i);
938 if (Element.isTemplateTypeParameter())
939 Buffer.addChild(getOrCreateTemplateTypeParameterDIE(
940 DITemplateTypeParameter(Element)));
941 else if (Element.isTemplateValueParameter())
942 Buffer.addChild(getOrCreateTemplateValueParameterDIE(
943 DITemplateValueParameter(Element)));
944 }
945
946}
Devang Patelc366f832009-12-10 19:14:49 +0000947/// addToContextOwner - Add Die into the list of its context owner's children.
948void DwarfDebug::addToContextOwner(DIE *Die, DIDescriptor Context) {
Devang Patel3c91b052010-03-08 20:52:55 +0000949 if (Context.isType()) {
Devang Patel2db49d72010-05-07 18:11:54 +0000950 DIE *ContextDIE = getOrCreateTypeDIE(DIType(Context));
Devang Patelc366f832009-12-10 19:14:49 +0000951 ContextDIE->addChild(Die);
Devang Patel6404e4e2009-12-15 19:16:48 +0000952 } else if (Context.isNameSpace()) {
Devang Patel2db49d72010-05-07 18:11:54 +0000953 DIE *ContextDIE = getOrCreateNameSpace(DINameSpace(Context));
Devang Patel6404e4e2009-12-15 19:16:48 +0000954 ContextDIE->addChild(Die);
Stuart Hastings215aa152010-06-11 20:08:44 +0000955 } else if (Context.isSubprogram()) {
Devang Patelee70fa72010-09-27 23:15:27 +0000956 DIE *ContextDIE = createSubprogramDIE(DISubprogram(Context));
Stuart Hastings215aa152010-06-11 20:08:44 +0000957 ContextDIE->addChild(Die);
Devang Patel163a9f72010-05-10 22:49:55 +0000958 } else if (DIE *ContextDIE = getCompileUnit(Context)->getDIE(Context))
Devang Patelc366f832009-12-10 19:14:49 +0000959 ContextDIE->addChild(Die);
Jim Grosbach1e20b962010-07-21 21:21:52 +0000960 else
Devang Patel163a9f72010-05-10 22:49:55 +0000961 getCompileUnit(Context)->addDie(Die);
Devang Patelc366f832009-12-10 19:14:49 +0000962}
963
Devang Patel16ced732009-12-10 18:05:33 +0000964/// getOrCreateTypeDIE - Find existing DIE or create new DIE for the
965/// given DIType.
966DIE *DwarfDebug::getOrCreateTypeDIE(DIType Ty) {
Devang Patel163a9f72010-05-10 22:49:55 +0000967 CompileUnit *TypeCU = getCompileUnit(Ty);
968 DIE *TyDIE = TypeCU->getDIE(Ty);
Devang Patel16ced732009-12-10 18:05:33 +0000969 if (TyDIE)
970 return TyDIE;
971
972 // Create new type.
973 TyDIE = new DIE(dwarf::DW_TAG_base_type);
Devang Patel163a9f72010-05-10 22:49:55 +0000974 TypeCU->insertDIE(Ty, TyDIE);
Devang Patel16ced732009-12-10 18:05:33 +0000975 if (Ty.isBasicType())
Devang Patel2db49d72010-05-07 18:11:54 +0000976 constructTypeDIE(*TyDIE, DIBasicType(Ty));
Devang Patel16ced732009-12-10 18:05:33 +0000977 else if (Ty.isCompositeType())
Devang Patel2db49d72010-05-07 18:11:54 +0000978 constructTypeDIE(*TyDIE, DICompositeType(Ty));
Devang Patel16ced732009-12-10 18:05:33 +0000979 else {
980 assert(Ty.isDerivedType() && "Unknown kind of DIType");
Devang Patel2db49d72010-05-07 18:11:54 +0000981 constructTypeDIE(*TyDIE, DIDerivedType(Ty));
Devang Patel16ced732009-12-10 18:05:33 +0000982 }
983
Devang Patelc366f832009-12-10 19:14:49 +0000984 addToContextOwner(TyDIE, Ty.getContext());
Devang Patel16ced732009-12-10 18:05:33 +0000985 return TyDIE;
986}
987
Devang Patel2c4ceb12009-11-21 02:48:08 +0000988/// addType - Add a new type attribute to the specified entity.
Devang Patel8a241142009-12-09 18:24:21 +0000989void DwarfDebug::addType(DIE *Entity, DIType Ty) {
Devang Patel9c004872010-05-07 21:45:47 +0000990 if (!Ty.Verify())
Bill Wendling0310d762009-05-15 09:23:25 +0000991 return;
992
993 // Check for pre-existence.
Devang Patel163a9f72010-05-10 22:49:55 +0000994 CompileUnit *TypeCU = getCompileUnit(Ty);
995 DIEEntry *Entry = TypeCU->getDIEEntry(Ty);
Bill Wendling0310d762009-05-15 09:23:25 +0000996 // If it exists then use the existing value.
Devang Patel2c4ceb12009-11-21 02:48:08 +0000997 if (Entry) {
998 Entity->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, Entry);
Bill Wendling0310d762009-05-15 09:23:25 +0000999 return;
1000 }
1001
Bill Wendling0310d762009-05-15 09:23:25 +00001002 // Construct type.
Devang Patel16ced732009-12-10 18:05:33 +00001003 DIE *Buffer = getOrCreateTypeDIE(Ty);
Bill Wendling0310d762009-05-15 09:23:25 +00001004
Jeffrey Yasskin5c213dc2010-03-12 17:45:06 +00001005 // Set up proxy.
1006 Entry = createDIEEntry(Buffer);
Devang Patel163a9f72010-05-10 22:49:55 +00001007 TypeCU->insertDIEEntry(Ty, Entry);
Jeffrey Yasskin5c213dc2010-03-12 17:45:06 +00001008
Devang Patel2c4ceb12009-11-21 02:48:08 +00001009 Entity->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, Entry);
Bill Wendling0310d762009-05-15 09:23:25 +00001010}
1011
Devang Patel2c4ceb12009-11-21 02:48:08 +00001012/// constructTypeDIE - Construct basic type die from DIBasicType.
Devang Patel8a241142009-12-09 18:24:21 +00001013void DwarfDebug::constructTypeDIE(DIE &Buffer, DIBasicType BTy) {
Bill Wendling0310d762009-05-15 09:23:25 +00001014 // Get core information.
Devang Patel65dbc902009-11-25 17:36:49 +00001015 StringRef Name = BTy.getName();
Bill Wendling0310d762009-05-15 09:23:25 +00001016 Buffer.setTag(dwarf::DW_TAG_base_type);
Devang Patel2c4ceb12009-11-21 02:48:08 +00001017 addUInt(&Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
Bill Wendling0310d762009-05-15 09:23:25 +00001018 BTy.getEncoding());
1019
1020 // Add name if not anonymous or intermediate type.
Devang Patel65dbc902009-11-25 17:36:49 +00001021 if (!Name.empty())
Devang Patel2c4ceb12009-11-21 02:48:08 +00001022 addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
Bill Wendling0310d762009-05-15 09:23:25 +00001023 uint64_t Size = BTy.getSizeInBits() >> 3;
Devang Patel2c4ceb12009-11-21 02:48:08 +00001024 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
Bill Wendling0310d762009-05-15 09:23:25 +00001025}
1026
Devang Patel2c4ceb12009-11-21 02:48:08 +00001027/// constructTypeDIE - Construct derived type die from DIDerivedType.
Devang Patel8a241142009-12-09 18:24:21 +00001028void DwarfDebug::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) {
Bill Wendling0310d762009-05-15 09:23:25 +00001029 // Get core information.
Devang Patel65dbc902009-11-25 17:36:49 +00001030 StringRef Name = DTy.getName();
Bill Wendling0310d762009-05-15 09:23:25 +00001031 uint64_t Size = DTy.getSizeInBits() >> 3;
1032 unsigned Tag = DTy.getTag();
1033
1034 // FIXME - Workaround for templates.
1035 if (Tag == dwarf::DW_TAG_inheritance) Tag = dwarf::DW_TAG_reference_type;
1036
1037 Buffer.setTag(Tag);
1038
1039 // Map to main type, void will not have a type.
1040 DIType FromTy = DTy.getTypeDerivedFrom();
Devang Patel8a241142009-12-09 18:24:21 +00001041 addType(&Buffer, FromTy);
Bill Wendling0310d762009-05-15 09:23:25 +00001042
1043 // Add name if not anonymous or intermediate type.
Devang Pateldeea5642009-11-30 23:56:56 +00001044 if (!Name.empty())
Devang Patel2c4ceb12009-11-21 02:48:08 +00001045 addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
Bill Wendling0310d762009-05-15 09:23:25 +00001046
1047 // Add size if non-zero (derived types might be zero-sized.)
1048 if (Size)
Devang Patel2c4ceb12009-11-21 02:48:08 +00001049 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
Bill Wendling0310d762009-05-15 09:23:25 +00001050
1051 // Add source line info if available and TyDesc is not a forward declaration.
Devang Patel05f6fa82009-11-23 18:43:37 +00001052 if (!DTy.isForwardDecl())
Devang Patel81625742010-08-09 20:20:05 +00001053 addSourceLine(&Buffer, DTy);
Bill Wendling0310d762009-05-15 09:23:25 +00001054}
1055
Devang Patel2c4ceb12009-11-21 02:48:08 +00001056/// constructTypeDIE - Construct type DIE from DICompositeType.
Devang Patel8a241142009-12-09 18:24:21 +00001057void DwarfDebug::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
Bill Wendling0310d762009-05-15 09:23:25 +00001058 // Get core information.
Devang Patel65dbc902009-11-25 17:36:49 +00001059 StringRef Name = CTy.getName();
Bill Wendling0310d762009-05-15 09:23:25 +00001060
1061 uint64_t Size = CTy.getSizeInBits() >> 3;
1062 unsigned Tag = CTy.getTag();
1063 Buffer.setTag(Tag);
1064
1065 switch (Tag) {
1066 case dwarf::DW_TAG_vector_type:
1067 case dwarf::DW_TAG_array_type:
Devang Patel8a241142009-12-09 18:24:21 +00001068 constructArrayTypeDIE(Buffer, &CTy);
Bill Wendling0310d762009-05-15 09:23:25 +00001069 break;
1070 case dwarf::DW_TAG_enumeration_type: {
1071 DIArray Elements = CTy.getTypeArray();
1072
1073 // Add enumerators to enumeration type.
1074 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1075 DIE *ElemDie = NULL;
Devang Patel2db49d72010-05-07 18:11:54 +00001076 DIDescriptor Enum(Elements.getElement(i));
Devang Patel3c91b052010-03-08 20:52:55 +00001077 if (Enum.isEnumerator()) {
Devang Patel2db49d72010-05-07 18:11:54 +00001078 ElemDie = constructEnumTypeDIE(DIEnumerator(Enum));
Devang Patel2c4ceb12009-11-21 02:48:08 +00001079 Buffer.addChild(ElemDie);
Devang Patelc5254722009-10-09 17:51:49 +00001080 }
Bill Wendling0310d762009-05-15 09:23:25 +00001081 }
1082 }
1083 break;
1084 case dwarf::DW_TAG_subroutine_type: {
1085 // Add return type.
1086 DIArray Elements = CTy.getTypeArray();
1087 DIDescriptor RTy = Elements.getElement(0);
Devang Patel2db49d72010-05-07 18:11:54 +00001088 addType(&Buffer, DIType(RTy));
Bill Wendling0310d762009-05-15 09:23:25 +00001089
Devang Pateld6747df2010-10-06 20:50:40 +00001090 bool isPrototyped = true;
Bill Wendling0310d762009-05-15 09:23:25 +00001091 // Add arguments.
1092 for (unsigned i = 1, N = Elements.getNumElements(); i < N; ++i) {
Bill Wendling0310d762009-05-15 09:23:25 +00001093 DIDescriptor Ty = Elements.getElement(i);
Devang Pateld6747df2010-10-06 20:50:40 +00001094 if (Ty.isUnspecifiedParameter()) {
1095 DIE *Arg = new DIE(dwarf::DW_TAG_unspecified_parameters);
1096 Buffer.addChild(Arg);
1097 isPrototyped = false;
1098 } else {
1099 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1100 addType(Arg, DIType(Ty));
1101 Buffer.addChild(Arg);
1102 }
Bill Wendling0310d762009-05-15 09:23:25 +00001103 }
Devang Pateld6747df2010-10-06 20:50:40 +00001104 // Add prototype flag.
1105 if (isPrototyped)
1106 addUInt(&Buffer, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
Bill Wendling0310d762009-05-15 09:23:25 +00001107 }
1108 break;
1109 case dwarf::DW_TAG_structure_type:
1110 case dwarf::DW_TAG_union_type:
1111 case dwarf::DW_TAG_class_type: {
1112 // Add elements to structure type.
1113 DIArray Elements = CTy.getTypeArray();
1114
1115 // A forward struct declared type may not have elements available.
Devang Patel3c91b052010-03-08 20:52:55 +00001116 unsigned N = Elements.getNumElements();
1117 if (N == 0)
Bill Wendling0310d762009-05-15 09:23:25 +00001118 break;
1119
1120 // Add elements to structure type.
Devang Patel3c91b052010-03-08 20:52:55 +00001121 for (unsigned i = 0; i < N; ++i) {
Bill Wendling0310d762009-05-15 09:23:25 +00001122 DIDescriptor Element = Elements.getElement(i);
1123 DIE *ElemDie = NULL;
Devang Patel1a301232010-09-29 21:44:16 +00001124 if (Element.isSubprogram()) {
1125 DISubprogram SP(Element);
Devang Patel2db49d72010-05-07 18:11:54 +00001126 ElemDie = createSubprogramDIE(DISubprogram(Element));
Devang Patel1a301232010-09-29 21:44:16 +00001127 if (SP.isProtected())
1128 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1129 dwarf::DW_ACCESS_protected);
1130 else if (SP.isPrivate())
1131 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1132 dwarf::DW_ACCESS_private);
1133 else
1134 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1135 dwarf::DW_ACCESS_public);
Devang Patel21ea1d52010-10-01 23:31:40 +00001136 if (SP.isExplicit())
1137 addUInt(ElemDie, dwarf::DW_AT_explicit, dwarf::DW_FORM_flag, 1);
Devang Patel1a301232010-09-29 21:44:16 +00001138 }
Devang Patel3c91b052010-03-08 20:52:55 +00001139 else if (Element.isVariable()) {
Devang Patel2db49d72010-05-07 18:11:54 +00001140 DIVariable DV(Element);
Devang Patel1ee0cb92010-01-30 01:08:30 +00001141 ElemDie = new DIE(dwarf::DW_TAG_variable);
1142 addString(ElemDie, dwarf::DW_AT_name, dwarf::DW_FORM_string,
1143 DV.getName());
1144 addType(ElemDie, DV.getType());
1145 addUInt(ElemDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1146 addUInt(ElemDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
Devang Patel81625742010-08-09 20:20:05 +00001147 addSourceLine(ElemDie, DV);
Devang Patel3c91b052010-03-08 20:52:55 +00001148 } else if (Element.isDerivedType())
Devang Patel2db49d72010-05-07 18:11:54 +00001149 ElemDie = createMemberDIE(DIDerivedType(Element));
Devang Patel3c91b052010-03-08 20:52:55 +00001150 else
1151 continue;
Devang Patel2c4ceb12009-11-21 02:48:08 +00001152 Buffer.addChild(ElemDie);
Bill Wendling0310d762009-05-15 09:23:25 +00001153 }
1154
Devang Patela1ba2692009-08-27 23:51:51 +00001155 if (CTy.isAppleBlockExtension())
Devang Patel2c4ceb12009-11-21 02:48:08 +00001156 addUInt(&Buffer, dwarf::DW_AT_APPLE_block, dwarf::DW_FORM_flag, 1);
Bill Wendling0310d762009-05-15 09:23:25 +00001157
1158 unsigned RLang = CTy.getRunTimeLang();
1159 if (RLang)
Devang Patel2c4ceb12009-11-21 02:48:08 +00001160 addUInt(&Buffer, dwarf::DW_AT_APPLE_runtime_class,
Bill Wendling0310d762009-05-15 09:23:25 +00001161 dwarf::DW_FORM_data1, RLang);
Devang Patelb5544992010-01-26 21:16:06 +00001162
1163 DICompositeType ContainingType = CTy.getContainingType();
Devang Patel2db49d72010-05-07 18:11:54 +00001164 if (DIDescriptor(ContainingType).isCompositeType())
Jim Grosbach1e20b962010-07-21 21:21:52 +00001165 addDIEEntry(&Buffer, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4,
Devang Patel2db49d72010-05-07 18:11:54 +00001166 getOrCreateTypeDIE(DIType(ContainingType)));
Stuart Hastings215aa152010-06-11 20:08:44 +00001167 else {
1168 DIDescriptor Context = CTy.getContext();
1169 addToContextOwner(&Buffer, Context);
1170 }
Devang Patel7e2cb112011-02-02 21:38:25 +00001171
Devang Patelb4c2bc252011-04-05 21:08:24 +00001172 if (Tag == dwarf::DW_TAG_class_type)
1173 addTemplateParams(Buffer, CTy.getTemplateParams());
1174
Bill Wendling0310d762009-05-15 09:23:25 +00001175 break;
1176 }
1177 default:
1178 break;
1179 }
1180
1181 // Add name if not anonymous or intermediate type.
Devang Patel65dbc902009-11-25 17:36:49 +00001182 if (!Name.empty())
Devang Patel2c4ceb12009-11-21 02:48:08 +00001183 addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
Bill Wendling0310d762009-05-15 09:23:25 +00001184
Jim Grosbach1e20b962010-07-21 21:21:52 +00001185 if (Tag == dwarf::DW_TAG_enumeration_type || Tag == dwarf::DW_TAG_class_type
Devang Patel61409622010-07-07 20:12:52 +00001186 || Tag == dwarf::DW_TAG_structure_type || Tag == dwarf::DW_TAG_union_type)
1187 {
Bill Wendling0310d762009-05-15 09:23:25 +00001188 // Add size if non-zero (derived types might be zero-sized.)
1189 if (Size)
Devang Patel2c4ceb12009-11-21 02:48:08 +00001190 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
Bill Wendling0310d762009-05-15 09:23:25 +00001191 else {
1192 // Add zero size if it is not a forward declaration.
1193 if (CTy.isForwardDecl())
Devang Patel2c4ceb12009-11-21 02:48:08 +00001194 addUInt(&Buffer, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
Bill Wendling0310d762009-05-15 09:23:25 +00001195 else
Devang Patel2c4ceb12009-11-21 02:48:08 +00001196 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, 0);
Bill Wendling0310d762009-05-15 09:23:25 +00001197 }
1198
1199 // Add source line info if available.
1200 if (!CTy.isForwardDecl())
Devang Patel81625742010-08-09 20:20:05 +00001201 addSourceLine(&Buffer, CTy);
Bill Wendling0310d762009-05-15 09:23:25 +00001202 }
1203}
1204
Devang Patel7e2cb112011-02-02 21:38:25 +00001205/// getOrCreateTemplateTypeParameterDIE - Find existing DIE or create new DIE
1206/// for the given DITemplateTypeParameter.
1207DIE *
1208DwarfDebug::getOrCreateTemplateTypeParameterDIE(DITemplateTypeParameter TP) {
1209 CompileUnit *TypeCU = getCompileUnit(TP);
1210 DIE *ParamDIE = TypeCU->getDIE(TP);
1211 if (ParamDIE)
1212 return ParamDIE;
1213
1214 ParamDIE = new DIE(dwarf::DW_TAG_template_type_parameter);
1215 addType(ParamDIE, TP.getType());
1216 addString(ParamDIE, dwarf::DW_AT_name, dwarf::DW_FORM_string, TP.getName());
1217 return ParamDIE;
1218}
1219
Devang Patele7d93872011-02-02 22:35:53 +00001220/// getOrCreateTemplateValueParameterDIE - Find existing DIE or create new DIE
1221/// for the given DITemplateValueParameter.
1222DIE *
1223DwarfDebug::getOrCreateTemplateValueParameterDIE(DITemplateValueParameter TPV) {
1224 CompileUnit *TVCU = getCompileUnit(TPV);
1225 DIE *ParamDIE = TVCU->getDIE(TPV);
1226 if (ParamDIE)
1227 return ParamDIE;
1228
1229 ParamDIE = new DIE(dwarf::DW_TAG_template_value_parameter);
1230 addType(ParamDIE, TPV.getType());
Devang Patele050f502011-04-05 20:14:13 +00001231 if (!TPV.getName().empty())
1232 addString(ParamDIE, dwarf::DW_AT_name, dwarf::DW_FORM_string, TPV.getName());
Devang Patele7d93872011-02-02 22:35:53 +00001233 addUInt(ParamDIE, dwarf::DW_AT_const_value, dwarf::DW_FORM_udata,
1234 TPV.getValue());
1235 return ParamDIE;
1236}
1237
Devang Patel2c4ceb12009-11-21 02:48:08 +00001238/// constructSubrangeDIE - Construct subrange DIE from DISubrange.
1239void DwarfDebug::constructSubrangeDIE(DIE &Buffer, DISubrange SR, DIE *IndexTy){
Bill Wendling0310d762009-05-15 09:23:25 +00001240 int64_t L = SR.getLo();
1241 int64_t H = SR.getHi();
1242 DIE *DW_Subrange = new DIE(dwarf::DW_TAG_subrange_type);
1243
Devang Patel2c4ceb12009-11-21 02:48:08 +00001244 addDIEEntry(DW_Subrange, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IndexTy);
Devang Patel6325a532009-08-14 20:59:16 +00001245 if (L)
Devang Patel2c4ceb12009-11-21 02:48:08 +00001246 addSInt(DW_Subrange, dwarf::DW_AT_lower_bound, 0, L);
Devang Pateld55224c2009-12-04 23:10:24 +00001247 addSInt(DW_Subrange, dwarf::DW_AT_upper_bound, 0, H);
Bill Wendling0310d762009-05-15 09:23:25 +00001248
Devang Patel2c4ceb12009-11-21 02:48:08 +00001249 Buffer.addChild(DW_Subrange);
Bill Wendling0310d762009-05-15 09:23:25 +00001250}
1251
Devang Patel2c4ceb12009-11-21 02:48:08 +00001252/// constructArrayTypeDIE - Construct array type DIE from DICompositeType.
Devang Patel8a241142009-12-09 18:24:21 +00001253void DwarfDebug::constructArrayTypeDIE(DIE &Buffer,
Bill Wendling0310d762009-05-15 09:23:25 +00001254 DICompositeType *CTy) {
1255 Buffer.setTag(dwarf::DW_TAG_array_type);
1256 if (CTy->getTag() == dwarf::DW_TAG_vector_type)
Devang Patel2c4ceb12009-11-21 02:48:08 +00001257 addUInt(&Buffer, dwarf::DW_AT_GNU_vector, dwarf::DW_FORM_flag, 1);
Bill Wendling0310d762009-05-15 09:23:25 +00001258
1259 // Emit derived type.
Devang Patel8a241142009-12-09 18:24:21 +00001260 addType(&Buffer, CTy->getTypeDerivedFrom());
Bill Wendling0310d762009-05-15 09:23:25 +00001261 DIArray Elements = CTy->getTypeArray();
1262
Devang Patel6f01d9c2009-11-21 00:31:03 +00001263 // Get an anonymous type for index type.
Devang Patel163a9f72010-05-10 22:49:55 +00001264 CompileUnit *TheCU = getCompileUnit(*CTy);
1265 DIE *IdxTy = TheCU->getIndexTyDie();
Devang Patel6f01d9c2009-11-21 00:31:03 +00001266 if (!IdxTy) {
1267 // Construct an anonymous type for index type.
1268 IdxTy = new DIE(dwarf::DW_TAG_base_type);
Devang Patel2c4ceb12009-11-21 02:48:08 +00001269 addUInt(IdxTy, dwarf::DW_AT_byte_size, 0, sizeof(int32_t));
1270 addUInt(IdxTy, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
Devang Patel6f01d9c2009-11-21 00:31:03 +00001271 dwarf::DW_ATE_signed);
Devang Patel163a9f72010-05-10 22:49:55 +00001272 TheCU->addDie(IdxTy);
1273 TheCU->setIndexTyDie(IdxTy);
Devang Patel6f01d9c2009-11-21 00:31:03 +00001274 }
Bill Wendling0310d762009-05-15 09:23:25 +00001275
1276 // Add subranges to array type.
1277 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1278 DIDescriptor Element = Elements.getElement(i);
1279 if (Element.getTag() == dwarf::DW_TAG_subrange_type)
Devang Patel2db49d72010-05-07 18:11:54 +00001280 constructSubrangeDIE(Buffer, DISubrange(Element), IdxTy);
Bill Wendling0310d762009-05-15 09:23:25 +00001281 }
1282}
1283
Devang Patel2c4ceb12009-11-21 02:48:08 +00001284/// constructEnumTypeDIE - Construct enum type DIE from DIEnumerator.
Devang Patel3c91b052010-03-08 20:52:55 +00001285DIE *DwarfDebug::constructEnumTypeDIE(DIEnumerator ETy) {
Bill Wendling0310d762009-05-15 09:23:25 +00001286 DIE *Enumerator = new DIE(dwarf::DW_TAG_enumerator);
Devang Patel3c91b052010-03-08 20:52:55 +00001287 StringRef Name = ETy.getName();
Devang Patel2c4ceb12009-11-21 02:48:08 +00001288 addString(Enumerator, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
Devang Patel3c91b052010-03-08 20:52:55 +00001289 int64_t Value = ETy.getEnumValue();
Devang Patel2c4ceb12009-11-21 02:48:08 +00001290 addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, Value);
Bill Wendling0310d762009-05-15 09:23:25 +00001291 return Enumerator;
1292}
1293
Jim Grosbach1e20b962010-07-21 21:21:52 +00001294/// getRealLinkageName - If special LLVM prefix that is used to inform the asm
Devang Patel351ca332010-01-05 01:46:14 +00001295/// printer to not emit usual symbol prefix before the symbol name is used then
1296/// return linkage name after skipping this special LLVM prefix.
1297static StringRef getRealLinkageName(StringRef LinkageName) {
1298 char One = '\1';
1299 if (LinkageName.startswith(StringRef(&One, 1)))
1300 return LinkageName.substr(1);
1301 return LinkageName;
1302}
1303
Devang Patel2c4ceb12009-11-21 02:48:08 +00001304/// createMemberDIE - Create new member DIE.
Devang Patelecbd8e82010-08-10 04:12:17 +00001305DIE *DwarfDebug::createMemberDIE(DIDerivedType DT) {
Bill Wendling0310d762009-05-15 09:23:25 +00001306 DIE *MemberDie = new DIE(DT.getTag());
Devang Patel65dbc902009-11-25 17:36:49 +00001307 StringRef Name = DT.getName();
1308 if (!Name.empty())
Devang Patel2c4ceb12009-11-21 02:48:08 +00001309 addString(MemberDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
Jim Grosbach1e20b962010-07-21 21:21:52 +00001310
Devang Patel8a241142009-12-09 18:24:21 +00001311 addType(MemberDie, DT.getTypeDerivedFrom());
Bill Wendling0310d762009-05-15 09:23:25 +00001312
Devang Patel81625742010-08-09 20:20:05 +00001313 addSourceLine(MemberDie, DT);
Bill Wendling0310d762009-05-15 09:23:25 +00001314
Benjamin Kramer345ef342010-03-31 19:34:01 +00001315 DIEBlock *MemLocationDie = new (DIEValueAllocator) DIEBlock();
Devang Patel2c4ceb12009-11-21 02:48:08 +00001316 addUInt(MemLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
Devang Patel33db5082009-11-04 22:06:12 +00001317
Bill Wendling0310d762009-05-15 09:23:25 +00001318 uint64_t Size = DT.getSizeInBits();
Devang Patel61ecbd12009-11-04 23:48:00 +00001319 uint64_t FieldSize = DT.getOriginalTypeSize();
Bill Wendling0310d762009-05-15 09:23:25 +00001320
1321 if (Size != FieldSize) {
1322 // Handle bitfield.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001323 addUInt(MemberDie, dwarf::DW_AT_byte_size, 0, DT.getOriginalTypeSize()>>3);
1324 addUInt(MemberDie, dwarf::DW_AT_bit_size, 0, DT.getSizeInBits());
Bill Wendling0310d762009-05-15 09:23:25 +00001325
1326 uint64_t Offset = DT.getOffsetInBits();
Bill Wendling0310d762009-05-15 09:23:25 +00001327 uint64_t AlignMask = ~(DT.getAlignInBits() - 1);
1328 uint64_t HiMark = (Offset + FieldSize) & AlignMask;
Benjamin Kramer3d594fd2010-01-07 17:50:57 +00001329 uint64_t FieldOffset = (HiMark - FieldSize);
Bill Wendling0310d762009-05-15 09:23:25 +00001330 Offset -= FieldOffset;
1331
1332 // Maybe we need to work from the other end.
Chris Lattnerd38fee82010-04-05 00:13:49 +00001333 if (Asm->getTargetData().isLittleEndian())
1334 Offset = FieldSize - (Offset + Size);
Devang Patel2c4ceb12009-11-21 02:48:08 +00001335 addUInt(MemberDie, dwarf::DW_AT_bit_offset, 0, Offset);
Bill Wendling0310d762009-05-15 09:23:25 +00001336
Devang Patel33db5082009-11-04 22:06:12 +00001337 // Here WD_AT_data_member_location points to the anonymous
1338 // field that includes this bit field.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001339 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, FieldOffset >> 3);
Devang Patel33db5082009-11-04 22:06:12 +00001340
1341 } else
1342 // This is not a bitfield.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001343 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits() >> 3);
Devang Patel33db5082009-11-04 22:06:12 +00001344
Devang Patelc1dc8ff2010-02-03 20:08:48 +00001345 if (DT.getTag() == dwarf::DW_TAG_inheritance
1346 && DT.isVirtual()) {
1347
1348 // For C++, virtual base classes are not at fixed offset. Use following
1349 // expression to extract appropriate offset from vtable.
1350 // BaseAddr = ObAddr + *((*ObAddr) - Offset)
1351
Benjamin Kramer345ef342010-03-31 19:34:01 +00001352 DIEBlock *VBaseLocationDie = new (DIEValueAllocator) DIEBlock();
Devang Patelc1dc8ff2010-02-03 20:08:48 +00001353 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_dup);
1354 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1355 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1356 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits());
1357 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_minus);
1358 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1359 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1360
Jim Grosbach1e20b962010-07-21 21:21:52 +00001361 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0,
Devang Patelc1dc8ff2010-02-03 20:08:48 +00001362 VBaseLocationDie);
1363 } else
1364 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, MemLocationDie);
Bill Wendling0310d762009-05-15 09:23:25 +00001365
1366 if (DT.isProtected())
Devang Patel5d11eb02009-12-03 19:11:07 +00001367 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
Bill Wendling0310d762009-05-15 09:23:25 +00001368 dwarf::DW_ACCESS_protected);
1369 else if (DT.isPrivate())
Devang Patel5d11eb02009-12-03 19:11:07 +00001370 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
Bill Wendling0310d762009-05-15 09:23:25 +00001371 dwarf::DW_ACCESS_private);
Devang Patel2a361602010-09-29 19:08:08 +00001372 // Otherwise C++ member and base classes are considered public.
1373 else if (DT.getCompileUnit().getLanguage() == dwarf::DW_LANG_C_plus_plus)
Devang Patel5d11eb02009-12-03 19:11:07 +00001374 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1375 dwarf::DW_ACCESS_public);
1376 if (DT.isVirtual())
1377 addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_flag,
1378 dwarf::DW_VIRTUALITY_virtual);
Bill Wendling0310d762009-05-15 09:23:25 +00001379 return MemberDie;
1380}
1381
Devang Patelffe966c2009-12-14 16:18:45 +00001382/// createSubprogramDIE - Create new DIE using SP.
Devang Patelee70fa72010-09-27 23:15:27 +00001383DIE *DwarfDebug::createSubprogramDIE(DISubprogram SP) {
Devang Patel163a9f72010-05-10 22:49:55 +00001384 CompileUnit *SPCU = getCompileUnit(SP);
1385 DIE *SPDie = SPCU->getDIE(SP);
Devang Patelffe966c2009-12-14 16:18:45 +00001386 if (SPDie)
1387 return SPDie;
1388
1389 SPDie = new DIE(dwarf::DW_TAG_subprogram);
Devang Patel1eac3e72010-03-02 17:58:15 +00001390 // Constructors and operators for anonymous aggregates do not have names.
Devang Patel6b506cb2010-03-02 01:26:20 +00001391 if (!SP.getName().empty())
1392 addString(SPDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, SP.getName());
Bill Wendling0310d762009-05-15 09:23:25 +00001393
Devang Patel65dbc902009-11-25 17:36:49 +00001394 StringRef LinkageName = SP.getLinkageName();
Devang Patel351ca332010-01-05 01:46:14 +00001395 if (!LinkageName.empty())
Devang Patel2c4ceb12009-11-21 02:48:08 +00001396 addString(SPDie, dwarf::DW_AT_MIPS_linkage_name, dwarf::DW_FORM_string,
Devang Patel351ca332010-01-05 01:46:14 +00001397 getRealLinkageName(LinkageName));
1398
Devang Patel81625742010-08-09 20:20:05 +00001399 addSourceLine(SPDie, SP);
Bill Wendling0310d762009-05-15 09:23:25 +00001400
Devang Patel7b172c62010-10-07 22:03:01 +00001401 if (SP.isPrototyped())
Devang Patel2c4ceb12009-11-21 02:48:08 +00001402 addUInt(SPDie, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
Bill Wendling0310d762009-05-15 09:23:25 +00001403
1404 // Add Return Type.
Devang Patel1d5cc1d2009-12-03 01:25:38 +00001405 DICompositeType SPTy = SP.getType();
1406 DIArray Args = SPTy.getTypeArray();
Bill Wendling0310d762009-05-15 09:23:25 +00001407 unsigned SPTag = SPTy.getTag();
Devang Patel5d11eb02009-12-03 19:11:07 +00001408
Devang Patel3c91b052010-03-08 20:52:55 +00001409 if (Args.getNumElements() == 0 || SPTag != dwarf::DW_TAG_subroutine_type)
Devang Patel8a241142009-12-09 18:24:21 +00001410 addType(SPDie, SPTy);
Devang Patel1d5cc1d2009-12-03 01:25:38 +00001411 else
Devang Patel2db49d72010-05-07 18:11:54 +00001412 addType(SPDie, DIType(Args.getElement(0)));
Devang Patel1d5cc1d2009-12-03 01:25:38 +00001413
Devang Patel5d11eb02009-12-03 19:11:07 +00001414 unsigned VK = SP.getVirtuality();
1415 if (VK) {
1416 addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_flag, VK);
Benjamin Kramer345ef342010-03-31 19:34:01 +00001417 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Devang Patel5d11eb02009-12-03 19:11:07 +00001418 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
Devang Pateld639c7c2010-12-09 00:10:40 +00001419 addUInt(Block, 0, dwarf::DW_FORM_udata, SP.getVirtualIndex());
Devang Patel5d11eb02009-12-03 19:11:07 +00001420 addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, 0, Block);
Jim Grosbach1e20b962010-07-21 21:21:52 +00001421 ContainingTypeMap.insert(std::make_pair(SPDie,
Devang Patel2db49d72010-05-07 18:11:54 +00001422 SP.getContainingType()));
Devang Patel5d11eb02009-12-03 19:11:07 +00001423 }
1424
Devang Patelee70fa72010-09-27 23:15:27 +00001425 if (!SP.isDefinition()) {
Devang Patel2c4ceb12009-11-21 02:48:08 +00001426 addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
Bill Wendling0310d762009-05-15 09:23:25 +00001427
1428 // Add arguments. Do not add arguments for subprogram definition. They will
Devang Patel1d5cc1d2009-12-03 01:25:38 +00001429 // be handled while processing variables.
1430 DICompositeType SPTy = SP.getType();
1431 DIArray Args = SPTy.getTypeArray();
1432 unsigned SPTag = SPTy.getTag();
1433
Bill Wendling0310d762009-05-15 09:23:25 +00001434 if (SPTag == dwarf::DW_TAG_subroutine_type)
1435 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
1436 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
Devang Patel2db49d72010-05-07 18:11:54 +00001437 DIType ATy = DIType(DIType(Args.getElement(i)));
Devang Patelb4645642010-02-06 01:02:37 +00001438 addType(Arg, ATy);
1439 if (ATy.isArtificial())
1440 addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
Devang Patel2c4ceb12009-11-21 02:48:08 +00001441 SPDie->addChild(Arg);
Bill Wendling0310d762009-05-15 09:23:25 +00001442 }
1443 }
1444
Devang Patel4e0d19d2010-02-03 19:57:19 +00001445 if (SP.isArtificial())
1446 addUInt(SPDie, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1447
Devang Patelccff8122010-04-30 19:38:23 +00001448 if (!SP.isLocalToUnit())
1449 addUInt(SPDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
Jim Grosbach1e20b962010-07-21 21:21:52 +00001450
Devang Patelccff8122010-04-30 19:38:23 +00001451 if (SP.isOptimized())
1452 addUInt(SPDie, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1);
1453
Jim Grosbach91729002010-07-21 23:03:52 +00001454 if (unsigned isa = Asm->getISAEncoding()) {
1455 addUInt(SPDie, dwarf::DW_AT_APPLE_isa, dwarf::DW_FORM_flag, isa);
1456 }
1457
Devang Patelccff8122010-04-30 19:38:23 +00001458 // DW_TAG_inlined_subroutine may refer to this DIE.
Devang Patel163a9f72010-05-10 22:49:55 +00001459 SPCU->insertDIE(SP, SPDie);
Devang Patelccff8122010-04-30 19:38:23 +00001460
Stuart Hastings215aa152010-06-11 20:08:44 +00001461 // Add to context owner.
1462 addToContextOwner(SPDie, SP.getContext());
1463
Bill Wendling0310d762009-05-15 09:23:25 +00001464 return SPDie;
1465}
1466
Devang Patele9f8f5e2010-05-07 20:54:48 +00001467DbgScope *DwarfDebug::getOrCreateAbstractScope(const MDNode *N) {
Chris Lattnered7a77b2010-03-31 05:36:29 +00001468 assert(N && "Invalid Scope encoding!");
Devang Patel53bb5c92009-11-10 23:06:00 +00001469
1470 DbgScope *AScope = AbstractScopes.lookup(N);
1471 if (AScope)
1472 return AScope;
Jim Grosbach31ef40e2009-11-21 23:12:12 +00001473
Devang Patel53bb5c92009-11-10 23:06:00 +00001474 DbgScope *Parent = NULL;
1475
1476 DIDescriptor Scope(N);
1477 if (Scope.isLexicalBlock()) {
1478 DILexicalBlock DB(N);
1479 DIDescriptor ParentDesc = DB.getContext();
Devang Patel2db49d72010-05-07 18:11:54 +00001480 Parent = getOrCreateAbstractScope(ParentDesc);
Devang Patel53bb5c92009-11-10 23:06:00 +00001481 }
1482
1483 AScope = new DbgScope(Parent, DIDescriptor(N), NULL);
1484
1485 if (Parent)
Devang Patel2c4ceb12009-11-21 02:48:08 +00001486 Parent->addScope(AScope);
Devang Patel53bb5c92009-11-10 23:06:00 +00001487 AScope->setAbstractScope();
1488 AbstractScopes[N] = AScope;
1489 if (DIDescriptor(N).isSubprogram())
1490 AbstractScopesList.push_back(AScope);
1491 return AScope;
1492}
Devang Patelaf9e8472009-10-01 20:31:14 +00001493
Devang Patel5f094002010-04-06 23:53:48 +00001494/// isSubprogramContext - Return true if Context is either a subprogram
1495/// or another context nested inside a subprogram.
Devang Patele9f8f5e2010-05-07 20:54:48 +00001496static bool isSubprogramContext(const MDNode *Context) {
Devang Patel5f094002010-04-06 23:53:48 +00001497 if (!Context)
1498 return false;
1499 DIDescriptor D(Context);
1500 if (D.isSubprogram())
1501 return true;
1502 if (D.isType())
Devang Patel2db49d72010-05-07 18:11:54 +00001503 return isSubprogramContext(DIType(Context).getContext());
Devang Patel5f094002010-04-06 23:53:48 +00001504 return false;
1505}
1506
Jim Grosbach31ef40e2009-11-21 23:12:12 +00001507/// updateSubprogramScopeDIE - Find DIE for the given subprogram and
Devang Patel2c4ceb12009-11-21 02:48:08 +00001508/// attach appropriate DW_AT_low_pc and DW_AT_high_pc attributes.
1509/// If there are global variables in this scope then create and insert
1510/// DIEs for these variables.
Devang Patele9f8f5e2010-05-07 20:54:48 +00001511DIE *DwarfDebug::updateSubprogramScopeDIE(const MDNode *SPNode) {
Devang Patel163a9f72010-05-10 22:49:55 +00001512 CompileUnit *SPCU = getCompileUnit(SPNode);
1513 DIE *SPDie = SPCU->getDIE(SPNode);
Devang Patel8aa61472010-07-07 22:20:57 +00001514
Chris Lattnerd38fee82010-04-05 00:13:49 +00001515 assert(SPDie && "Unable to find subprogram DIE!");
1516 DISubprogram SP(SPNode);
Jim Grosbach1e20b962010-07-21 21:21:52 +00001517
Chris Lattnerd38fee82010-04-05 00:13:49 +00001518 // There is not any need to generate specification DIE for a function
1519 // defined at compile unit level. If a function is defined inside another
1520 // function then gdb prefers the definition at top level and but does not
Jim Grosbach1e20b962010-07-21 21:21:52 +00001521 // expect specification DIE in parent function. So avoid creating
Chris Lattnerd38fee82010-04-05 00:13:49 +00001522 // specification DIE for a function defined inside a function.
1523 if (SP.isDefinition() && !SP.getContext().isCompileUnit() &&
Jim Grosbach1e20b962010-07-21 21:21:52 +00001524 !SP.getContext().isFile() &&
Devang Patel2db49d72010-05-07 18:11:54 +00001525 !isSubprogramContext(SP.getContext())) {
Chris Lattnerd38fee82010-04-05 00:13:49 +00001526 addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
Jim Grosbach1e20b962010-07-21 21:21:52 +00001527
1528 // Add arguments.
Chris Lattnerd38fee82010-04-05 00:13:49 +00001529 DICompositeType SPTy = SP.getType();
1530 DIArray Args = SPTy.getTypeArray();
1531 unsigned SPTag = SPTy.getTag();
1532 if (SPTag == dwarf::DW_TAG_subroutine_type)
1533 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
1534 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
Devang Patel2db49d72010-05-07 18:11:54 +00001535 DIType ATy = DIType(DIType(Args.getElement(i)));
Chris Lattnerd38fee82010-04-05 00:13:49 +00001536 addType(Arg, ATy);
1537 if (ATy.isArtificial())
1538 addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1539 SPDie->addChild(Arg);
1540 }
1541 DIE *SPDeclDie = SPDie;
1542 SPDie = new DIE(dwarf::DW_TAG_subprogram);
Jim Grosbach1e20b962010-07-21 21:21:52 +00001543 addDIEEntry(SPDie, dwarf::DW_AT_specification, dwarf::DW_FORM_ref4,
Chris Lattnerd38fee82010-04-05 00:13:49 +00001544 SPDeclDie);
Devang Patel163a9f72010-05-10 22:49:55 +00001545 SPCU->addDie(SPDie);
Chris Lattnerd38fee82010-04-05 00:13:49 +00001546 }
Jim Grosbach1e20b962010-07-21 21:21:52 +00001547
Devang Patel8aa61472010-07-07 22:20:57 +00001548 // Pick up abstract subprogram DIE.
1549 if (DIE *AbsSPDIE = AbstractSPDies.lookup(SPNode)) {
1550 SPDie = new DIE(dwarf::DW_TAG_subprogram);
1551 addDIEEntry(SPDie, dwarf::DW_AT_abstract_origin,
1552 dwarf::DW_FORM_ref4, AbsSPDIE);
1553 SPCU->addDie(SPDie);
1554 }
1555
Chris Lattnerd38fee82010-04-05 00:13:49 +00001556 addLabel(SPDie, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
1557 Asm->GetTempSymbol("func_begin", Asm->getFunctionNumber()));
1558 addLabel(SPDie, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
1559 Asm->GetTempSymbol("func_end", Asm->getFunctionNumber()));
1560 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
1561 MachineLocation Location(RI->getFrameRegister(*Asm->MF));
1562 addAddress(SPDie, dwarf::DW_AT_frame_base, Location);
Devang Patelb4645642010-02-06 01:02:37 +00001563
Chris Lattnerd38fee82010-04-05 00:13:49 +00001564 return SPDie;
Devang Patel53bb5c92009-11-10 23:06:00 +00001565}
1566
Jim Grosbach31ef40e2009-11-21 23:12:12 +00001567/// constructLexicalScope - Construct new DW_TAG_lexical_block
Devang Patel2c4ceb12009-11-21 02:48:08 +00001568/// for this scope and attach DW_AT_low_pc/DW_AT_high_pc labels.
1569DIE *DwarfDebug::constructLexicalScopeDIE(DbgScope *Scope) {
Devang Pateleac9c072010-04-27 19:46:33 +00001570
1571 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_lexical_block);
1572 if (Scope->isAbstractScope())
1573 return ScopeDIE;
1574
1575 const SmallVector<DbgRange, 4> &Ranges = Scope->getRanges();
1576 if (Ranges.empty())
1577 return 0;
1578
1579 SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin();
1580 if (Ranges.size() > 1) {
1581 // .debug_range section has not been laid out yet. Emit offset in
Jim Grosbach1e20b962010-07-21 21:21:52 +00001582 // .debug_range as a uint, size 4, for now. emitDIE will handle
Devang Pateleac9c072010-04-27 19:46:33 +00001583 // DW_AT_ranges appropriately.
1584 addUInt(ScopeDIE, dwarf::DW_AT_ranges, dwarf::DW_FORM_data4,
1585 DebugRangeSymbols.size() * Asm->getTargetData().getPointerSize());
1586 for (SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin(),
1587 RE = Ranges.end(); RI != RE; ++RI) {
Devang Patelc3f5f782010-05-25 23:40:22 +00001588 DebugRangeSymbols.push_back(getLabelBeforeInsn(RI->first));
1589 DebugRangeSymbols.push_back(getLabelAfterInsn(RI->second));
Devang Pateleac9c072010-04-27 19:46:33 +00001590 }
1591 DebugRangeSymbols.push_back(NULL);
1592 DebugRangeSymbols.push_back(NULL);
1593 return ScopeDIE;
1594 }
1595
Devang Patelc3f5f782010-05-25 23:40:22 +00001596 const MCSymbol *Start = getLabelBeforeInsn(RI->first);
1597 const MCSymbol *End = getLabelAfterInsn(RI->second);
Devang Pateleac9c072010-04-27 19:46:33 +00001598
Devang Patelc3f5f782010-05-25 23:40:22 +00001599 if (End == 0) return 0;
Devang Patel53bb5c92009-11-10 23:06:00 +00001600
Chris Lattnerb7db7332010-03-09 01:58:53 +00001601 assert(Start->isDefined() && "Invalid starting label for an inlined scope!");
1602 assert(End->isDefined() && "Invalid end label for an inlined scope!");
Jim Grosbach1e20b962010-07-21 21:21:52 +00001603
Devang Pateleac9c072010-04-27 19:46:33 +00001604 addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, Start);
1605 addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr, End);
Devang Patel53bb5c92009-11-10 23:06:00 +00001606
1607 return ScopeDIE;
1608}
1609
Devang Patel2c4ceb12009-11-21 02:48:08 +00001610/// constructInlinedScopeDIE - This scope represents inlined body of
1611/// a function. Construct DIE to represent this concrete inlined copy
1612/// of the function.
1613DIE *DwarfDebug::constructInlinedScopeDIE(DbgScope *Scope) {
Devang Pateleac9c072010-04-27 19:46:33 +00001614
1615 const SmallVector<DbgRange, 4> &Ranges = Scope->getRanges();
Jim Grosbach1e20b962010-07-21 21:21:52 +00001616 assert (Ranges.empty() == false
Devang Pateleac9c072010-04-27 19:46:33 +00001617 && "DbgScope does not have instruction markers!");
1618
1619 // FIXME : .debug_inlined section specification does not clearly state how
1620 // to emit inlined scope that is split into multiple instruction ranges.
1621 // For now, use first instruction range and emit low_pc/high_pc pair and
1622 // corresponding .debug_inlined section entry for this pair.
1623 SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin();
Devang Patelc3f5f782010-05-25 23:40:22 +00001624 const MCSymbol *StartLabel = getLabelBeforeInsn(RI->first);
1625 const MCSymbol *EndLabel = getLabelAfterInsn(RI->second);
Devang Pateleac9c072010-04-27 19:46:33 +00001626
Devang Patel0afbf232010-07-08 22:39:20 +00001627 if (StartLabel == 0 || EndLabel == 0) {
Devang Pateleac9c072010-04-27 19:46:33 +00001628 assert (0 && "Unexpected Start and End labels for a inlined scope!");
1629 return 0;
1630 }
Chris Lattnerb7db7332010-03-09 01:58:53 +00001631 assert(StartLabel->isDefined() &&
Chris Lattnera34ec2292010-03-09 01:51:43 +00001632 "Invalid starting label for an inlined scope!");
Chris Lattnerb7db7332010-03-09 01:58:53 +00001633 assert(EndLabel->isDefined() &&
Chris Lattnera34ec2292010-03-09 01:51:43 +00001634 "Invalid end label for an inlined scope!");
Devang Pateleac9c072010-04-27 19:46:33 +00001635
Devang Patel3c91b052010-03-08 20:52:55 +00001636 if (!Scope->getScopeNode())
Devang Patel0ef3fa62010-03-08 19:20:38 +00001637 return NULL;
Devang Patel3c91b052010-03-08 20:52:55 +00001638 DIScope DS(Scope->getScopeNode());
Devang Patel53bb5c92009-11-10 23:06:00 +00001639 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_inlined_subroutine);
1640
Devang Patel2db49d72010-05-07 18:11:54 +00001641 DISubprogram InlinedSP = getDISubprogram(DS);
Devang Patel163a9f72010-05-10 22:49:55 +00001642 CompileUnit *TheCU = getCompileUnit(InlinedSP);
1643 DIE *OriginDIE = TheCU->getDIE(InlinedSP);
Chris Lattnered7a77b2010-03-31 05:36:29 +00001644 assert(OriginDIE && "Unable to find Origin DIE!");
Devang Patel2c4ceb12009-11-21 02:48:08 +00001645 addDIEEntry(ScopeDIE, dwarf::DW_AT_abstract_origin,
Devang Patel53bb5c92009-11-10 23:06:00 +00001646 dwarf::DW_FORM_ref4, OriginDIE);
1647
Chris Lattner6ed0f902010-03-09 00:31:02 +00001648 addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, StartLabel);
Chris Lattnerb7db7332010-03-09 01:58:53 +00001649 addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr, EndLabel);
Devang Patel53bb5c92009-11-10 23:06:00 +00001650
1651 InlinedSubprogramDIEs.insert(OriginDIE);
1652
1653 // Track the start label for this inlined function.
Devang Patele9f8f5e2010-05-07 20:54:48 +00001654 DenseMap<const MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator
Devang Patel2db49d72010-05-07 18:11:54 +00001655 I = InlineInfo.find(InlinedSP);
Devang Patel53bb5c92009-11-10 23:06:00 +00001656
1657 if (I == InlineInfo.end()) {
Devang Patel2db49d72010-05-07 18:11:54 +00001658 InlineInfo[InlinedSP].push_back(std::make_pair(StartLabel,
Jim Grosbach7ab38df2009-11-22 19:20:36 +00001659 ScopeDIE));
Devang Patel2db49d72010-05-07 18:11:54 +00001660 InlinedSPNodes.push_back(InlinedSP);
Devang Patel53bb5c92009-11-10 23:06:00 +00001661 } else
Chris Lattner6ed0f902010-03-09 00:31:02 +00001662 I->second.push_back(std::make_pair(StartLabel, ScopeDIE));
Devang Patel53bb5c92009-11-10 23:06:00 +00001663
Devang Patel53bb5c92009-11-10 23:06:00 +00001664 DILocation DL(Scope->getInlinedAt());
Devang Patel163a9f72010-05-10 22:49:55 +00001665 addUInt(ScopeDIE, dwarf::DW_AT_call_file, 0, TheCU->getID());
Devang Patel2c4ceb12009-11-21 02:48:08 +00001666 addUInt(ScopeDIE, dwarf::DW_AT_call_line, 0, DL.getLineNumber());
Devang Patel53bb5c92009-11-10 23:06:00 +00001667
1668 return ScopeDIE;
1669}
1670
Devang Patel2c4ceb12009-11-21 02:48:08 +00001671
1672/// constructVariableDIE - Construct a DIE for the given DbgVariable.
Devang Patel8a241142009-12-09 18:24:21 +00001673DIE *DwarfDebug::constructVariableDIE(DbgVariable *DV, DbgScope *Scope) {
Devang Patel8bd11de2010-08-09 21:01:39 +00001674 StringRef Name = DV->getName();
Devang Patel65dbc902009-11-25 17:36:49 +00001675 if (Name.empty())
Devang Patel3fb6bd62009-11-13 02:25:26 +00001676 return NULL;
Devang Patel53bb5c92009-11-10 23:06:00 +00001677
1678 // Translate tag to proper Dwarf tag. The result variable is dropped for
1679 // now.
1680 unsigned Tag;
Devang Patel8bd11de2010-08-09 21:01:39 +00001681 switch (DV->getTag()) {
Devang Patel53bb5c92009-11-10 23:06:00 +00001682 case dwarf::DW_TAG_return_variable:
1683 return NULL;
1684 case dwarf::DW_TAG_arg_variable:
1685 Tag = dwarf::DW_TAG_formal_parameter;
1686 break;
1687 case dwarf::DW_TAG_auto_variable: // fall thru
1688 default:
1689 Tag = dwarf::DW_TAG_variable;
1690 break;
1691 }
1692
1693 // Define variable debug information entry.
1694 DIE *VariableDie = new DIE(Tag);
1695
Devang Patel53bb5c92009-11-10 23:06:00 +00001696 DIE *AbsDIE = NULL;
Devang Patel26c1e562010-05-20 16:36:41 +00001697 DenseMap<const DbgVariable *, const DbgVariable *>::iterator
1698 V2AVI = VarToAbstractVarMap.find(DV);
1699 if (V2AVI != VarToAbstractVarMap.end())
1700 AbsDIE = V2AVI->second->getDIE();
Jim Grosbach31ef40e2009-11-21 23:12:12 +00001701
Devang Patel26c1e562010-05-20 16:36:41 +00001702 if (AbsDIE)
Devang Patel2c4ceb12009-11-21 02:48:08 +00001703 addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin,
Devang Patel53bb5c92009-11-10 23:06:00 +00001704 dwarf::DW_FORM_ref4, AbsDIE);
Devang Patel53bb5c92009-11-10 23:06:00 +00001705 else {
Devang Patel2c4ceb12009-11-21 02:48:08 +00001706 addString(VariableDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
Devang Patel8bd11de2010-08-09 21:01:39 +00001707 addSourceLine(VariableDie, DV->getVariable());
Devang Patel53bb5c92009-11-10 23:06:00 +00001708
1709 // Add variable type.
Devang Patel8bd11de2010-08-09 21:01:39 +00001710 addType(VariableDie, DV->getType());
Devang Patel53bb5c92009-11-10 23:06:00 +00001711 }
1712
Devang Patel8bd11de2010-08-09 21:01:39 +00001713 if (Tag == dwarf::DW_TAG_formal_parameter && DV->getType().isArtificial())
Devang Patelb4645642010-02-06 01:02:37 +00001714 addUInt(VariableDie, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
Devang Patel3cf763d2010-09-29 23:07:21 +00001715 else if (DIVariable(DV->getVariable()).isArtificial())
1716 addUInt(VariableDie, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
Devang Patelc3f5f782010-05-25 23:40:22 +00001717
1718 if (Scope->isAbstractScope()) {
1719 DV->setDIE(VariableDie);
1720 return VariableDie;
1721 }
1722
1723 // Add variable address.
1724
1725 unsigned Offset = DV->getDotDebugLocOffset();
1726 if (Offset != ~0U) {
1727 addLabel(VariableDie, dwarf::DW_AT_location, dwarf::DW_FORM_data4,
1728 Asm->GetTempSymbol("debug_loc", Offset));
1729 DV->setDIE(VariableDie);
1730 UseDotDebugLocEntry.insert(VariableDie);
1731 return VariableDie;
1732 }
1733
1734 // Check if variable is described by a DBG_VALUE instruction.
1735 DenseMap<const DbgVariable *, const MachineInstr *>::iterator DVI =
1736 DbgVariableToDbgInstMap.find(DV);
1737 if (DVI != DbgVariableToDbgInstMap.end()) {
1738 const MachineInstr *DVInsn = DVI->second;
Devang Patelc3f5f782010-05-25 23:40:22 +00001739 bool updated = false;
Jim Grosbach1e20b962010-07-21 21:21:52 +00001740 // FIXME : Handle getNumOperands != 3
Devang Patelc3f5f782010-05-25 23:40:22 +00001741 if (DVInsn->getNumOperands() == 3) {
Devang Patel0b48ead2010-08-31 22:22:42 +00001742 if (DVInsn->getOperand(0).isReg()) {
1743 const MachineOperand RegOp = DVInsn->getOperand(0);
1744 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
1745 if (DVInsn->getOperand(1).isImm() &&
1746 TRI->getFrameRegister(*Asm->MF) == RegOp.getReg()) {
1747 addVariableAddress(DV, VariableDie, DVInsn->getOperand(1).getImm());
1748 updated = true;
1749 } else
Devang Patel522ad742010-11-12 23:20:42 +00001750 updated = addRegisterAddress(VariableDie, RegOp);
Devang Patel0b48ead2010-08-31 22:22:42 +00001751 }
Devang Patelc3f5f782010-05-25 23:40:22 +00001752 else if (DVInsn->getOperand(0).isImm())
Devang Patel522ad742010-11-12 23:20:42 +00001753 updated = addConstantValue(VariableDie, DVInsn->getOperand(0));
Jim Grosbach1e20b962010-07-21 21:21:52 +00001754 else if (DVInsn->getOperand(0).isFPImm())
1755 updated =
Devang Patel522ad742010-11-12 23:20:42 +00001756 addConstantFPValue(VariableDie, DVInsn->getOperand(0));
Devang Patelc3f5f782010-05-25 23:40:22 +00001757 } else {
1758 MachineLocation Location = Asm->getDebugValueLocation(DVInsn);
1759 if (Location.getReg()) {
1760 addAddress(VariableDie, dwarf::DW_AT_location, Location);
Devang Patelc3f5f782010-05-25 23:40:22 +00001761 updated = true;
1762 }
1763 }
1764 if (!updated) {
1765 // If variableDie is not updated then DBG_VALUE instruction does not
1766 // have valid variable info.
1767 delete VariableDie;
1768 return NULL;
1769 }
1770 DV->setDIE(VariableDie);
1771 return VariableDie;
Jim Grosbach1e20b962010-07-21 21:21:52 +00001772 }
Devang Patelc3f5f782010-05-25 23:40:22 +00001773
1774 // .. else use frame index, if available.
Devang Patelc3f5f782010-05-25 23:40:22 +00001775 int FI = 0;
Devang Patel9e3bd2c2010-08-31 06:11:28 +00001776 if (findVariableFrameIndex(DV, &FI))
1777 addVariableAddress(DV, VariableDie, FI);
1778
Devang Patel53bb5c92009-11-10 23:06:00 +00001779 DV->setDIE(VariableDie);
1780 return VariableDie;
1781
1782}
Devang Patel2c4ceb12009-11-21 02:48:08 +00001783
Devang Patel193f7202009-11-24 01:14:22 +00001784void DwarfDebug::addPubTypes(DISubprogram SP) {
1785 DICompositeType SPTy = SP.getType();
1786 unsigned SPTag = SPTy.getTag();
Jim Grosbach1e20b962010-07-21 21:21:52 +00001787 if (SPTag != dwarf::DW_TAG_subroutine_type)
Devang Patel193f7202009-11-24 01:14:22 +00001788 return;
1789
1790 DIArray Args = SPTy.getTypeArray();
Devang Patel193f7202009-11-24 01:14:22 +00001791 for (unsigned i = 0, e = Args.getNumElements(); i != e; ++i) {
Devang Patel2db49d72010-05-07 18:11:54 +00001792 DIType ATy(Args.getElement(i));
Devang Patel9c004872010-05-07 21:45:47 +00001793 if (!ATy.Verify())
Devang Patel193f7202009-11-24 01:14:22 +00001794 continue;
1795 DICompositeType CATy = getDICompositeType(ATy);
Devang Patel2db49d72010-05-07 18:11:54 +00001796 if (DIDescriptor(CATy).Verify() && !CATy.getName().empty()
Devang Patel50d80e32010-04-13 20:35:04 +00001797 && !CATy.isForwardDecl()) {
Devang Patel163a9f72010-05-10 22:49:55 +00001798 CompileUnit *TheCU = getCompileUnit(CATy);
1799 if (DIEEntry *Entry = TheCU->getDIEEntry(CATy))
1800 TheCU->addGlobalType(CATy.getName(), Entry->getEntry());
Devang Patel193f7202009-11-24 01:14:22 +00001801 }
1802 }
1803}
1804
Devang Patel2c4ceb12009-11-21 02:48:08 +00001805/// constructScopeDIE - Construct a DIE for this scope.
1806DIE *DwarfDebug::constructScopeDIE(DbgScope *Scope) {
Devang Patel3c91b052010-03-08 20:52:55 +00001807 if (!Scope || !Scope->getScopeNode())
1808 return NULL;
Jim Grosbach1e20b962010-07-21 21:21:52 +00001809
Devang Patel5bc9fec2011-02-19 01:31:27 +00001810 SmallVector <DIE *, 8> Children;
Devang Patel0478c152011-03-01 22:58:55 +00001811
1812 // Collect arguments for current function.
1813 if (Scope == CurrentFnDbgScope)
1814 for (unsigned i = 0, N = CurrentFnArguments.size(); i < N; ++i)
1815 if (DbgVariable *ArgDV = CurrentFnArguments[i])
1816 if (DIE *Arg = constructVariableDIE(ArgDV, Scope))
1817 Children.push_back(Arg);
1818
Devang Patel5bc9fec2011-02-19 01:31:27 +00001819 // Collect lexical scope childrens first.
1820 const SmallVector<DbgVariable *, 8> &Variables = Scope->getDbgVariables();
1821 for (unsigned i = 0, N = Variables.size(); i < N; ++i)
1822 if (DIE *Variable = constructVariableDIE(Variables[i], Scope))
1823 Children.push_back(Variable);
1824 const SmallVector<DbgScope *, 4> &Scopes = Scope->getScopes();
1825 for (unsigned j = 0, M = Scopes.size(); j < M; ++j)
1826 if (DIE *Nested = constructScopeDIE(Scopes[j]))
1827 Children.push_back(Nested);
Devang Patel3c91b052010-03-08 20:52:55 +00001828 DIScope DS(Scope->getScopeNode());
1829 DIE *ScopeDIE = NULL;
1830 if (Scope->getInlinedAt())
1831 ScopeDIE = constructInlinedScopeDIE(Scope);
1832 else if (DS.isSubprogram()) {
Devang Patel0dd45582010-06-28 20:53:04 +00001833 ProcessedSPNodes.insert(DS);
Devang Patel8aa61472010-07-07 22:20:57 +00001834 if (Scope->isAbstractScope()) {
Devang Patel163a9f72010-05-10 22:49:55 +00001835 ScopeDIE = getCompileUnit(DS)->getDIE(DS);
Devang Patel8aa61472010-07-07 22:20:57 +00001836 // Note down abstract DIE.
1837 if (ScopeDIE)
1838 AbstractSPDies.insert(std::make_pair(DS, ScopeDIE));
1839 }
Devang Patel3c91b052010-03-08 20:52:55 +00001840 else
Devang Patel2db49d72010-05-07 18:11:54 +00001841 ScopeDIE = updateSubprogramScopeDIE(DS);
Devang Patel3c91b052010-03-08 20:52:55 +00001842 }
Devang Patel5bc9fec2011-02-19 01:31:27 +00001843 else {
1844 // There is no need to emit empty lexical block DIE.
1845 if (Children.empty())
1846 return NULL;
Devang Patel3c91b052010-03-08 20:52:55 +00001847 ScopeDIE = constructLexicalScopeDIE(Scope);
Devang Patel5bc9fec2011-02-19 01:31:27 +00001848 }
1849
Devang Patelaead63c2010-03-29 22:59:58 +00001850 if (!ScopeDIE) return NULL;
Jim Grosbach1e20b962010-07-21 21:21:52 +00001851
Devang Patel5bc9fec2011-02-19 01:31:27 +00001852 // Add children
1853 for (SmallVector<DIE *, 8>::iterator I = Children.begin(),
1854 E = Children.end(); I != E; ++I)
1855 ScopeDIE->addChild(*I);
Devang Patel193f7202009-11-24 01:14:22 +00001856
Jim Grosbach1e20b962010-07-21 21:21:52 +00001857 if (DS.isSubprogram())
Devang Patel2db49d72010-05-07 18:11:54 +00001858 addPubTypes(DISubprogram(DS));
Jim Grosbach1e20b962010-07-21 21:21:52 +00001859
Devang Patel193f7202009-11-24 01:14:22 +00001860 return ScopeDIE;
Devang Patel53bb5c92009-11-10 23:06:00 +00001861}
1862
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001863/// GetOrCreateSourceID - Look up the source id with the given directory and
1864/// source file names. If none currently exists, create a new id and insert it
1865/// in the SourceIds map. This can update DirectoryNames and SourceFileNames
1866/// maps as well.
Devang Patel2f584852010-07-24 00:53:22 +00001867
Devang Patel23670e52011-03-24 20:30:50 +00001868unsigned DwarfDebug::GetOrCreateSourceID(StringRef FileName,
1869 StringRef DirName) {
Devang Patel1905a182010-09-16 20:57:49 +00001870 // If FE did not provide a file name, then assume stdin.
1871 if (FileName.empty())
Devang Patel23670e52011-03-24 20:30:50 +00001872 return GetOrCreateSourceID("<stdin>", StringRef());
1873
1874 // MCStream expects full path name as filename.
1875 if (!DirName.empty() && !FileName.startswith("/")) {
1876 std::string FullPathName(DirName.data());
1877 if (!DirName.endswith("/"))
1878 FullPathName += "/";
1879 FullPathName += FileName.data();
1880 // Here FullPathName will be copied into StringMap by GetOrCreateSourceID.
1881 return GetOrCreateSourceID(StringRef(FullPathName), StringRef());
1882 }
Devang Patel1905a182010-09-16 20:57:49 +00001883
Rafael Espindola5c055632010-11-18 02:04:25 +00001884 StringMapEntry<unsigned> &Entry = SourceIdMap.GetOrCreateValue(FileName);
1885 if (Entry.getValue())
1886 return Entry.getValue();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001887
Rafael Espindola5c055632010-11-18 02:04:25 +00001888 unsigned SrcId = SourceIdMap.size();
1889 Entry.setValue(SrcId);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001890
Rafael Espindola5c055632010-11-18 02:04:25 +00001891 // Print out a .file directive to specify files for .loc directives.
Devang Patel23670e52011-03-24 20:30:50 +00001892 Asm->OutStreamer.EmitDwarfFileDirective(SrcId, Entry.getKey());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001893
1894 return SrcId;
1895}
1896
Devang Patel6404e4e2009-12-15 19:16:48 +00001897/// getOrCreateNameSpace - Create a DIE for DINameSpace.
1898DIE *DwarfDebug::getOrCreateNameSpace(DINameSpace NS) {
Devang Patel163a9f72010-05-10 22:49:55 +00001899 CompileUnit *TheCU = getCompileUnit(NS);
1900 DIE *NDie = TheCU->getDIE(NS);
Devang Patel6404e4e2009-12-15 19:16:48 +00001901 if (NDie)
1902 return NDie;
1903 NDie = new DIE(dwarf::DW_TAG_namespace);
Devang Patel163a9f72010-05-10 22:49:55 +00001904 TheCU->insertDIE(NS, NDie);
Devang Patel6404e4e2009-12-15 19:16:48 +00001905 if (!NS.getName().empty())
1906 addString(NDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, NS.getName());
Devang Patel81625742010-08-09 20:20:05 +00001907 addSourceLine(NDie, NS);
Devang Patel6404e4e2009-12-15 19:16:48 +00001908 addToContextOwner(NDie, NS.getContext());
1909 return NDie;
1910}
1911
Jim Grosbach1e20b962010-07-21 21:21:52 +00001912/// constructCompileUnit - Create new CompileUnit for the given
Devang Patel163a9f72010-05-10 22:49:55 +00001913/// metadata node with tag DW_TAG_compile_unit.
Devang Patele9f8f5e2010-05-07 20:54:48 +00001914void DwarfDebug::constructCompileUnit(const MDNode *N) {
Devang Patele4b27562009-08-28 23:24:31 +00001915 DICompileUnit DIUnit(N);
Devang Patel65dbc902009-11-25 17:36:49 +00001916 StringRef FN = DIUnit.getFilename();
1917 StringRef Dir = DIUnit.getDirectory();
Devang Patel23670e52011-03-24 20:30:50 +00001918 unsigned ID = GetOrCreateSourceID(FN, Dir);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001919
1920 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
Devang Patel2c4ceb12009-11-21 02:48:08 +00001921 addString(Die, dwarf::DW_AT_producer, dwarf::DW_FORM_string,
Devang Patel5ccdd102009-09-29 18:40:58 +00001922 DIUnit.getProducer());
Devang Patel3a4ae322011-02-23 22:37:04 +00001923 addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data2,
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001924 DIUnit.getLanguage());
Devang Patel2c4ceb12009-11-21 02:48:08 +00001925 addString(Die, dwarf::DW_AT_name, dwarf::DW_FORM_string, FN);
Devang Patel5098da02010-04-26 22:54:28 +00001926 // Use DW_AT_entry_pc instead of DW_AT_low_pc/DW_AT_high_pc pair. This
1927 // simplifies debug range entries.
Devang Patel9b93b6b2010-06-28 22:22:47 +00001928 addUInt(Die, dwarf::DW_AT_entry_pc, dwarf::DW_FORM_addr, 0);
Devang Patel4a602ca2010-03-22 23:11:36 +00001929 // DW_AT_stmt_list is a offset of line number information for this
Devang Patelaf608bd2010-08-24 00:06:12 +00001930 // compile unit in debug_line section.
Devang Patelae84d5b2010-08-31 23:50:19 +00001931 if (Asm->MAI->doesDwarfUsesAbsoluteLabelForStmtList())
Cameron Zwarichf754f502011-02-25 16:30:32 +00001932 addLabel(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_addr,
1933 Asm->GetTempSymbol("section_line"));
Devang Patelae84d5b2010-08-31 23:50:19 +00001934 else
1935 addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4, 0);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001936
Devang Patel65dbc902009-11-25 17:36:49 +00001937 if (!Dir.empty())
Devang Patel2c4ceb12009-11-21 02:48:08 +00001938 addString(Die, dwarf::DW_AT_comp_dir, dwarf::DW_FORM_string, Dir);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001939 if (DIUnit.isOptimized())
Devang Patel2c4ceb12009-11-21 02:48:08 +00001940 addUInt(Die, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001941
Devang Patel65dbc902009-11-25 17:36:49 +00001942 StringRef Flags = DIUnit.getFlags();
1943 if (!Flags.empty())
Devang Patel2c4ceb12009-11-21 02:48:08 +00001944 addString(Die, dwarf::DW_AT_APPLE_flags, dwarf::DW_FORM_string, Flags);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001945
1946 unsigned RVer = DIUnit.getRunTimeVersion();
1947 if (RVer)
Devang Patel2c4ceb12009-11-21 02:48:08 +00001948 addUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers,
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001949 dwarf::DW_FORM_data1, RVer);
1950
Devang Patel163a9f72010-05-10 22:49:55 +00001951 CompileUnit *NewCU = new CompileUnit(ID, Die);
1952 if (!FirstCU)
1953 FirstCU = NewCU;
1954 CUMap.insert(std::make_pair(N, NewCU));
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001955}
1956
Devang Patel163a9f72010-05-10 22:49:55 +00001957/// getCompielUnit - Get CompileUnit DIE.
1958CompileUnit *DwarfDebug::getCompileUnit(const MDNode *N) const {
1959 assert (N && "Invalid DwarfDebug::getCompileUnit argument!");
1960 DIDescriptor D(N);
1961 const MDNode *CUNode = NULL;
1962 if (D.isCompileUnit())
1963 CUNode = N;
1964 else if (D.isSubprogram())
1965 CUNode = DISubprogram(N).getCompileUnit();
1966 else if (D.isType())
1967 CUNode = DIType(N).getCompileUnit();
1968 else if (D.isGlobalVariable())
1969 CUNode = DIGlobalVariable(N).getCompileUnit();
1970 else if (D.isVariable())
1971 CUNode = DIVariable(N).getCompileUnit();
1972 else if (D.isNameSpace())
1973 CUNode = DINameSpace(N).getCompileUnit();
1974 else if (D.isFile())
1975 CUNode = DIFile(N).getCompileUnit();
1976 else
1977 return FirstCU;
1978
1979 DenseMap<const MDNode *, CompileUnit *>::const_iterator I
1980 = CUMap.find(CUNode);
1981 if (I == CUMap.end())
1982 return FirstCU;
1983 return I->second;
1984}
1985
Devang Patel0c4720c2010-08-23 18:25:56 +00001986/// isUnsignedDIType - Return true if type encoding is unsigned.
1987static bool isUnsignedDIType(DIType Ty) {
1988 DIDerivedType DTy(Ty);
1989 if (DTy.Verify())
1990 return isUnsignedDIType(DTy.getTypeDerivedFrom());
1991
1992 DIBasicType BTy(Ty);
1993 if (BTy.Verify()) {
1994 unsigned Encoding = BTy.getEncoding();
1995 if (Encoding == dwarf::DW_ATE_unsigned ||
1996 Encoding == dwarf::DW_ATE_unsigned_char)
1997 return true;
1998 }
1999 return false;
2000}
Devang Patel163a9f72010-05-10 22:49:55 +00002001
Devang Patele449d1f2011-01-20 00:02:16 +00002002// Return const exprssion if value is a GEP to access merged global
2003// constant. e.g.
2004// i8* getelementptr ({ i8, i8, i8, i8 }* @_MergedGlobals, i32 0, i32 0)
2005static const ConstantExpr *getMergedGlobalExpr(const Value *V) {
2006 const ConstantExpr *CE = dyn_cast_or_null<ConstantExpr>(V);
2007 if (!CE || CE->getNumOperands() != 3 ||
2008 CE->getOpcode() != Instruction::GetElementPtr)
2009 return NULL;
2010
2011 // First operand points to a global value.
2012 if (!isa<GlobalValue>(CE->getOperand(0)))
2013 return NULL;
2014
2015 // Second operand is zero.
2016 const ConstantInt *CI =
2017 dyn_cast_or_null<ConstantInt>(CE->getOperand(1));
2018 if (!CI || !CI->isZero())
2019 return NULL;
2020
2021 // Third operand is offset.
2022 if (!isa<ConstantInt>(CE->getOperand(2)))
2023 return NULL;
2024
2025 return CE;
2026}
2027
Devang Patel163a9f72010-05-10 22:49:55 +00002028/// constructGlobalVariableDIE - Construct global variable DIE.
Devang Patele9f8f5e2010-05-07 20:54:48 +00002029void DwarfDebug::constructGlobalVariableDIE(const MDNode *N) {
Devang Patel9fa539c2010-08-10 01:37:23 +00002030 DIGlobalVariable GV(N);
Daniel Dunbarf612ff62009-09-19 20:40:05 +00002031
Devang Patel905cf5e2009-09-04 23:59:07 +00002032 // If debug information is malformed then ignore it.
Devang Patel9fa539c2010-08-10 01:37:23 +00002033 if (GV.Verify() == false)
Devang Patel905cf5e2009-09-04 23:59:07 +00002034 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002035
2036 // Check for pre-existence.
Devang Patel163a9f72010-05-10 22:49:55 +00002037 CompileUnit *TheCU = getCompileUnit(N);
Devang Patel9fa539c2010-08-10 01:37:23 +00002038 if (TheCU->getDIE(GV))
Devang Patel13e16b62009-06-26 01:49:18 +00002039 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002040
Devang Patel9fa539c2010-08-10 01:37:23 +00002041 DIType GTy = GV.getType();
Devang Patel29368072010-08-10 07:11:13 +00002042 DIE *VariableDIE = new DIE(GV.getTag());
2043
2044 bool isGlobalVariable = GV.getGlobal() != NULL;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002045
Devang Patel9fa539c2010-08-10 01:37:23 +00002046 // Add name.
2047 addString(VariableDIE, dwarf::DW_AT_name, dwarf::DW_FORM_string,
2048 GV.getDisplayName());
2049 StringRef LinkageName = GV.getLinkageName();
Devang Patel29368072010-08-10 07:11:13 +00002050 if (!LinkageName.empty() && isGlobalVariable)
Devang Patel9fa539c2010-08-10 01:37:23 +00002051 addString(VariableDIE, dwarf::DW_AT_MIPS_linkage_name, dwarf::DW_FORM_string,
2052 getRealLinkageName(LinkageName));
2053 // Add type.
2054 addType(VariableDIE, GTy);
Devang Patel50d80e32010-04-13 20:35:04 +00002055 if (GTy.isCompositeType() && !GTy.getName().empty()
2056 && !GTy.isForwardDecl()) {
Devang Patel163a9f72010-05-10 22:49:55 +00002057 DIEEntry *Entry = TheCU->getDIEEntry(GTy);
Chris Lattnered7a77b2010-03-31 05:36:29 +00002058 assert(Entry && "Missing global type!");
Devang Patel163a9f72010-05-10 22:49:55 +00002059 TheCU->addGlobalType(GTy.getName(), Entry->getEntry());
Devang Patel193f7202009-11-24 01:14:22 +00002060 }
Devang Patel9fa539c2010-08-10 01:37:23 +00002061 // Add scoping info.
2062 if (!GV.isLocalToUnit()) {
2063 addUInt(VariableDIE, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
2064 // Expose as global.
2065 TheCU->addGlobal(GV.getName(), VariableDIE);
2066 }
2067 // Add line number info.
2068 addSourceLine(VariableDIE, GV);
2069 // Add to map.
2070 TheCU->insertDIE(N, VariableDIE);
2071 // Add to context owner.
2072 DIDescriptor GVContext = GV.getContext();
2073 addToContextOwner(VariableDIE, GVContext);
2074 // Add location.
Devang Patel29368072010-08-10 07:11:13 +00002075 if (isGlobalVariable) {
2076 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
2077 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
2078 addLabel(Block, 0, dwarf::DW_FORM_udata,
2079 Asm->Mang->getSymbol(GV.getGlobal()));
2080 // Do not create specification DIE if context is either compile unit
2081 // or a subprogram.
2082 if (GV.isDefinition() && !GVContext.isCompileUnit() &&
2083 !GVContext.isFile() && !isSubprogramContext(GVContext)) {
2084 // Create specification DIE.
2085 DIE *VariableSpecDIE = new DIE(dwarf::DW_TAG_variable);
2086 addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification,
2087 dwarf::DW_FORM_ref4, VariableDIE);
2088 addBlock(VariableSpecDIE, dwarf::DW_AT_location, 0, Block);
2089 addUInt(VariableDIE, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
2090 TheCU->addDie(VariableSpecDIE);
2091 } else {
2092 addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
2093 }
Devang Patel76a788c2011-01-06 21:39:25 +00002094 } else if (ConstantInt *CI =
2095 dyn_cast_or_null<ConstantInt>(GV.getConstant()))
2096 addConstantValue(VariableDIE, CI, isUnsignedDIType(GTy));
Devang Patele449d1f2011-01-20 00:02:16 +00002097 else if (const ConstantExpr *CE = getMergedGlobalExpr(N->getOperand(11))) {
2098 // GV is a merged global.
2099 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
2100 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
2101 addLabel(Block, 0, dwarf::DW_FORM_udata,
2102 Asm->Mang->getSymbol(cast<GlobalValue>(CE->getOperand(0))));
2103 ConstantInt *CII = cast<ConstantInt>(CE->getOperand(2));
2104 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
2105 addUInt(Block, 0, dwarf::DW_FORM_udata, CII->getZExtValue());
2106 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
2107 addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
2108 }
Devang Patel76a788c2011-01-06 21:39:25 +00002109
Devang Patel13e16b62009-06-26 01:49:18 +00002110 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002111}
2112
Devang Patel163a9f72010-05-10 22:49:55 +00002113/// construct SubprogramDIE - Construct subprogram DIE.
Devang Patele9f8f5e2010-05-07 20:54:48 +00002114void DwarfDebug::constructSubprogramDIE(const MDNode *N) {
Devang Patele4b27562009-08-28 23:24:31 +00002115 DISubprogram SP(N);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002116
Stuart Hastings639336e2010-04-06 21:38:29 +00002117 // Check for pre-existence.
Devang Patel163a9f72010-05-10 22:49:55 +00002118 CompileUnit *TheCU = getCompileUnit(N);
2119 if (TheCU->getDIE(N))
Stuart Hastings639336e2010-04-06 21:38:29 +00002120 return;
2121
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002122 if (!SP.isDefinition())
2123 // This is a method declaration which will be handled while constructing
2124 // class type.
Devang Patel13e16b62009-06-26 01:49:18 +00002125 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002126
Stuart Hastings639336e2010-04-06 21:38:29 +00002127 DIE *SubprogramDie = createSubprogramDIE(SP);
2128
2129 // Add to map.
Devang Patel163a9f72010-05-10 22:49:55 +00002130 TheCU->insertDIE(N, SubprogramDie);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002131
2132 // Add to context owner.
Devang Patel6404e4e2009-12-15 19:16:48 +00002133 addToContextOwner(SubprogramDie, SP.getContext());
Devang Patel0000fad2009-12-08 23:21:45 +00002134
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002135 // Expose as global.
Devang Patel163a9f72010-05-10 22:49:55 +00002136 TheCU->addGlobal(SP.getName(), SubprogramDie);
Devang Patel193f7202009-11-24 01:14:22 +00002137
Devang Patel13e16b62009-06-26 01:49:18 +00002138 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002139}
2140
Devang Patel2c4ceb12009-11-21 02:48:08 +00002141/// beginModule - Emit all Dwarf sections that should come prior to the
Daniel Dunbar00564992009-09-19 20:40:14 +00002142/// content. Create global DIEs and emit initial debug info sections.
2143/// This is inovked by the target AsmPrinter.
Chris Lattner75f50722010-04-04 07:48:20 +00002144void DwarfDebug::beginModule(Module *M) {
Devang Pateleac9c072010-04-27 19:46:33 +00002145 if (DisableDebugInfoPrinting)
2146 return;
2147
Devang Patel78ab9e22009-07-30 18:56:46 +00002148 DebugInfoFinder DbgFinder;
2149 DbgFinder.processModule(*M);
Devang Patel13e16b62009-06-26 01:49:18 +00002150
Chris Lattnerd850ac72010-04-05 02:19:28 +00002151 bool HasDebugInfo = false;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002152
Chris Lattnerd850ac72010-04-05 02:19:28 +00002153 // Scan all the compile-units to see if there are any marked as the main unit.
2154 // if not, we do not generate debug info.
2155 for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
2156 E = DbgFinder.compile_unit_end(); I != E; ++I) {
2157 if (DICompileUnit(*I).isMain()) {
2158 HasDebugInfo = true;
2159 break;
2160 }
2161 }
Jim Grosbach1e20b962010-07-21 21:21:52 +00002162
Chris Lattnerd850ac72010-04-05 02:19:28 +00002163 if (!HasDebugInfo) return;
2164
2165 // Tell MMI that we have debug info.
2166 MMI->setDebugInfoAvailability(true);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002167
Chris Lattnerbe15beb2010-04-04 23:17:54 +00002168 // Emit initial sections.
Chris Lattnerd850ac72010-04-05 02:19:28 +00002169 EmitSectionLabels();
Jim Grosbach1e20b962010-07-21 21:21:52 +00002170
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002171 // Create all the compile unit DIEs.
Devang Patel78ab9e22009-07-30 18:56:46 +00002172 for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
2173 E = DbgFinder.compile_unit_end(); I != E; ++I)
Devang Patel2c4ceb12009-11-21 02:48:08 +00002174 constructCompileUnit(*I);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002175
Devang Patel53bb5c92009-11-10 23:06:00 +00002176 // Create DIEs for each subprogram.
Devang Patel78ab9e22009-07-30 18:56:46 +00002177 for (DebugInfoFinder::iterator I = DbgFinder.subprogram_begin(),
2178 E = DbgFinder.subprogram_end(); I != E; ++I)
Devang Patel2c4ceb12009-11-21 02:48:08 +00002179 constructSubprogramDIE(*I);
Devang Patel13e16b62009-06-26 01:49:18 +00002180
Devang Patelc366f832009-12-10 19:14:49 +00002181 // Create DIEs for each global variable.
2182 for (DebugInfoFinder::iterator I = DbgFinder.global_variable_begin(),
2183 E = DbgFinder.global_variable_end(); I != E; ++I)
2184 constructGlobalVariableDIE(*I);
2185
Devang Patele7e5a0f2010-08-10 20:01:20 +00002186 //getOrCreateTypeDIE
2187 if (NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.enum"))
2188 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i)
2189 getOrCreateTypeDIE(DIType(NMD->getOperand(i)));
2190
Devang Patel1a7ca032010-09-28 18:08:20 +00002191 if (NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.ty"))
2192 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i)
2193 getOrCreateTypeDIE(DIType(NMD->getOperand(i)));
2194
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002195 // Prime section data.
Chris Lattnerf0144122009-07-28 03:13:23 +00002196 SectionMap.insert(Asm->getObjFileLowering().getTextSection());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002197}
2198
Devang Patel2c4ceb12009-11-21 02:48:08 +00002199/// endModule - Emit all Dwarf sections that should come after the content.
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002200///
Devang Patel2c4ceb12009-11-21 02:48:08 +00002201void DwarfDebug::endModule() {
Devang Patel163a9f72010-05-10 22:49:55 +00002202 if (!FirstCU) return;
Devang Patel4a1cad62010-06-28 18:25:03 +00002203 const Module *M = MMI->getModule();
Devang Patele9a1cca2010-08-02 17:32:15 +00002204 DenseMap<const MDNode *, DbgScope *> DeadFnScopeMap;
Devang Patel4a1cad62010-06-28 18:25:03 +00002205 if (NamedMDNode *AllSPs = M->getNamedMetadata("llvm.dbg.sp")) {
2206 for (unsigned SI = 0, SE = AllSPs->getNumOperands(); SI != SE; ++SI) {
2207 if (ProcessedSPNodes.count(AllSPs->getOperand(SI)) != 0) continue;
2208 DISubprogram SP(AllSPs->getOperand(SI));
2209 if (!SP.Verify()) continue;
2210
2211 // Collect info for variables that were optimized out.
Devang Patel8b3a6b62010-07-19 17:53:55 +00002212 if (!SP.isDefinition()) continue;
Devang Patel4a1cad62010-06-28 18:25:03 +00002213 StringRef FName = SP.getLinkageName();
2214 if (FName.empty())
2215 FName = SP.getName();
Devang Patel62367042010-11-10 22:19:21 +00002216 NamedMDNode *NMD = getFnSpecificMDNode(*(MMI->getModule()), FName);
Devang Patel4a1cad62010-06-28 18:25:03 +00002217 if (!NMD) continue;
2218 unsigned E = NMD->getNumOperands();
2219 if (!E) continue;
2220 DbgScope *Scope = new DbgScope(NULL, DIDescriptor(SP), NULL);
Devang Patele9a1cca2010-08-02 17:32:15 +00002221 DeadFnScopeMap[SP] = Scope;
Devang Patel4a1cad62010-06-28 18:25:03 +00002222 for (unsigned I = 0; I != E; ++I) {
2223 DIVariable DV(NMD->getOperand(I));
2224 if (!DV.Verify()) continue;
2225 Scope->addVariable(new DbgVariable(DV));
2226 }
Jim Grosbach1e20b962010-07-21 21:21:52 +00002227
Devang Patel4a1cad62010-06-28 18:25:03 +00002228 // Construct subprogram DIE and add variables DIEs.
2229 constructSubprogramDIE(SP);
2230 DIE *ScopeDIE = getCompileUnit(SP)->getDIE(SP);
Devang Patele03161c2010-08-09 18:51:29 +00002231 const SmallVector<DbgVariable *, 8> &Variables = Scope->getDbgVariables();
Devang Patel4a1cad62010-06-28 18:25:03 +00002232 for (unsigned i = 0, N = Variables.size(); i < N; ++i) {
2233 DIE *VariableDIE = constructVariableDIE(Variables[i], Scope);
2234 if (VariableDIE)
2235 ScopeDIE->addChild(VariableDIE);
2236 }
2237 }
2238 }
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002239
Devang Patel53bb5c92009-11-10 23:06:00 +00002240 // Attach DW_AT_inline attribute with inlined subprogram DIEs.
2241 for (SmallPtrSet<DIE *, 4>::iterator AI = InlinedSubprogramDIEs.begin(),
2242 AE = InlinedSubprogramDIEs.end(); AI != AE; ++AI) {
2243 DIE *ISP = *AI;
Devang Patel2c4ceb12009-11-21 02:48:08 +00002244 addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
Devang Patel53bb5c92009-11-10 23:06:00 +00002245 }
2246
Devang Patele9f8f5e2010-05-07 20:54:48 +00002247 for (DenseMap<DIE *, const MDNode *>::iterator CI = ContainingTypeMap.begin(),
Devang Patel5d11eb02009-12-03 19:11:07 +00002248 CE = ContainingTypeMap.end(); CI != CE; ++CI) {
2249 DIE *SPDie = CI->first;
Devang Patele9f8f5e2010-05-07 20:54:48 +00002250 const MDNode *N = dyn_cast_or_null<MDNode>(CI->second);
Devang Patel5d11eb02009-12-03 19:11:07 +00002251 if (!N) continue;
Devang Patel163a9f72010-05-10 22:49:55 +00002252 DIE *NDie = getCompileUnit(N)->getDIE(N);
Devang Patel5d11eb02009-12-03 19:11:07 +00002253 if (!NDie) continue;
2254 addDIEEntry(SPDie, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, NDie);
Devang Patel5d11eb02009-12-03 19:11:07 +00002255 }
2256
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002257 // Standard sections final addresses.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002258 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getTextSection());
Chris Lattnerc0215722010-04-04 19:25:43 +00002259 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("text_end"));
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002260 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getDataSection());
Chris Lattnerc0215722010-04-04 19:25:43 +00002261 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("data_end"));
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002262
2263 // End text sections.
2264 for (unsigned i = 1, N = SectionMap.size(); i <= N; ++i) {
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002265 Asm->OutStreamer.SwitchSection(SectionMap[i]);
Chris Lattnerc0215722010-04-04 19:25:43 +00002266 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("section_end", i));
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002267 }
2268
2269 // Emit common frame information.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002270 emitCommonDebugFrame();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002271
2272 // Emit function debug frame information
2273 for (std::vector<FunctionDebugFrameInfo>::iterator I = DebugFrames.begin(),
2274 E = DebugFrames.end(); I != E; ++I)
Devang Patel2c4ceb12009-11-21 02:48:08 +00002275 emitFunctionDebugFrame(*I);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002276
2277 // Compute DIE offsets and sizes.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002278 computeSizeAndOffsets();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002279
2280 // Emit all the DIEs into a debug info section
Devang Patel2c4ceb12009-11-21 02:48:08 +00002281 emitDebugInfo();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002282
2283 // Corresponding abbreviations into a abbrev section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002284 emitAbbreviations();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002285
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002286 // Emit info into a debug pubnames section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002287 emitDebugPubNames();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002288
Devang Patel193f7202009-11-24 01:14:22 +00002289 // Emit info into a debug pubtypes section.
2290 emitDebugPubTypes();
2291
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002292 // Emit info into a debug loc section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002293 emitDebugLoc();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002294
2295 // Emit info into a debug aranges section.
2296 EmitDebugARanges();
2297
2298 // Emit info into a debug ranges section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002299 emitDebugRanges();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002300
2301 // Emit info into a debug macinfo section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002302 emitDebugMacInfo();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002303
2304 // Emit inline info.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002305 emitDebugInlineInfo();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002306
Chris Lattnerbc733f52010-03-13 02:17:42 +00002307 // Emit info into a debug str section.
2308 emitDebugStr();
Jim Grosbach1e20b962010-07-21 21:21:52 +00002309
Devang Patele9a1cca2010-08-02 17:32:15 +00002310 // clean up.
2311 DeleteContainerSeconds(DeadFnScopeMap);
Devang Patel163a9f72010-05-10 22:49:55 +00002312 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2313 E = CUMap.end(); I != E; ++I)
2314 delete I->second;
2315 FirstCU = NULL; // Reset for the next Module, if any.
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002316}
2317
Devang Patel53bb5c92009-11-10 23:06:00 +00002318/// findAbstractVariable - Find abstract variable, if any, associated with Var.
Jim Grosbach1e20b962010-07-21 21:21:52 +00002319DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &Var,
Chris Lattnerde4845c2010-04-02 19:42:39 +00002320 DebugLoc ScopeLoc) {
Devang Patel53bb5c92009-11-10 23:06:00 +00002321
Devang Patel2db49d72010-05-07 18:11:54 +00002322 DbgVariable *AbsDbgVariable = AbstractVariables.lookup(Var);
Devang Patel53bb5c92009-11-10 23:06:00 +00002323 if (AbsDbgVariable)
2324 return AbsDbgVariable;
2325
Devang Patel2db49d72010-05-07 18:11:54 +00002326 LLVMContext &Ctx = Var->getContext();
Chris Lattnerde4845c2010-04-02 19:42:39 +00002327 DbgScope *Scope = AbstractScopes.lookup(ScopeLoc.getScope(Ctx));
Devang Patel53bb5c92009-11-10 23:06:00 +00002328 if (!Scope)
2329 return NULL;
2330
Devang Patel26c1e562010-05-20 16:36:41 +00002331 AbsDbgVariable = new DbgVariable(Var);
Devang Patel2c4ceb12009-11-21 02:48:08 +00002332 Scope->addVariable(AbsDbgVariable);
Devang Patel2db49d72010-05-07 18:11:54 +00002333 AbstractVariables[Var] = AbsDbgVariable;
Devang Patel53bb5c92009-11-10 23:06:00 +00002334 return AbsDbgVariable;
2335}
2336
Devang Patel0478c152011-03-01 22:58:55 +00002337/// addCurrentFnArgument - If Var is an current function argument that add
2338/// it in CurrentFnArguments list.
2339bool DwarfDebug::addCurrentFnArgument(const MachineFunction *MF,
2340 DbgVariable *Var, DbgScope *Scope) {
2341 if (Scope != CurrentFnDbgScope)
2342 return false;
2343 DIVariable DV = Var->getVariable();
2344 if (DV.getTag() != dwarf::DW_TAG_arg_variable)
2345 return false;
2346 unsigned ArgNo = DV.getArgNumber();
2347 if (ArgNo == 0)
2348 return false;
2349
Devang Patelcb3a6572011-03-03 20:02:02 +00002350 size_t Size = CurrentFnArguments.size();
2351 if (Size == 0)
Devang Patel0478c152011-03-01 22:58:55 +00002352 CurrentFnArguments.resize(MF->getFunction()->arg_size());
Devang Patelbbd0f452011-03-03 21:49:41 +00002353 // llvm::Function argument size is not good indicator of how many
Devang Patel6f676be2011-03-03 20:08:10 +00002354 // arguments does the function have at source level.
2355 if (ArgNo > Size)
Devang Patelcb3a6572011-03-03 20:02:02 +00002356 CurrentFnArguments.resize(ArgNo * 2);
Devang Patel0478c152011-03-01 22:58:55 +00002357 CurrentFnArguments[ArgNo - 1] = Var;
2358 return true;
2359}
2360
Devang Patelee432862010-05-20 19:57:06 +00002361/// collectVariableInfoFromMMITable - Collect variable information from
2362/// side table maintained by MMI.
Jim Grosbach1e20b962010-07-21 21:21:52 +00002363void
Devang Patelee432862010-05-20 19:57:06 +00002364DwarfDebug::collectVariableInfoFromMMITable(const MachineFunction * MF,
2365 SmallPtrSet<const MDNode *, 16> &Processed) {
Chris Lattnerd38fee82010-04-05 00:13:49 +00002366 const LLVMContext &Ctx = Asm->MF->getFunction()->getContext();
Devang Patele717faa2009-10-06 01:26:37 +00002367 MachineModuleInfo::VariableDbgInfoMapTy &VMap = MMI->getVariableDbgInfo();
2368 for (MachineModuleInfo::VariableDbgInfoMapTy::iterator VI = VMap.begin(),
2369 VE = VMap.end(); VI != VE; ++VI) {
Devang Patele9f8f5e2010-05-07 20:54:48 +00002370 const MDNode *Var = VI->first;
Devang Patel53bb5c92009-11-10 23:06:00 +00002371 if (!Var) continue;
Devang Patel98e1cac2010-05-14 21:01:35 +00002372 Processed.insert(Var);
Chris Lattnerde4845c2010-04-02 19:42:39 +00002373 DIVariable DV(Var);
2374 const std::pair<unsigned, DebugLoc> &VP = VI->second;
Devang Patel53bb5c92009-11-10 23:06:00 +00002375
Chris Lattnerde4845c2010-04-02 19:42:39 +00002376 DbgScope *Scope = 0;
Devang Patele9f8f5e2010-05-07 20:54:48 +00002377 if (const MDNode *IA = VP.second.getInlinedAt(Ctx))
Chris Lattnerde4845c2010-04-02 19:42:39 +00002378 Scope = ConcreteScopes.lookup(IA);
2379 if (Scope == 0)
2380 Scope = DbgScopeMap.lookup(VP.second.getScope(Ctx));
Jim Grosbach1e20b962010-07-21 21:21:52 +00002381
Devang Patelfb0ee432009-11-10 23:20:04 +00002382 // If variable scope is not found then skip this variable.
Chris Lattnerde4845c2010-04-02 19:42:39 +00002383 if (Scope == 0)
Devang Patelfb0ee432009-11-10 23:20:04 +00002384 continue;
Devang Patel53bb5c92009-11-10 23:06:00 +00002385
Devang Patel26c1e562010-05-20 16:36:41 +00002386 DbgVariable *AbsDbgVariable = findAbstractVariable(DV, VP.second);
2387 DbgVariable *RegVar = new DbgVariable(DV);
2388 recordVariableFrameIndex(RegVar, VP.first);
Devang Patel0478c152011-03-01 22:58:55 +00002389 if (!addCurrentFnArgument(MF, RegVar, Scope))
2390 Scope->addVariable(RegVar);
Devang Patel26c1e562010-05-20 16:36:41 +00002391 if (AbsDbgVariable) {
2392 recordVariableFrameIndex(AbsDbgVariable, VP.first);
2393 VarToAbstractVarMap[RegVar] = AbsDbgVariable;
2394 }
Devang Patele717faa2009-10-06 01:26:37 +00002395 }
Devang Patelee432862010-05-20 19:57:06 +00002396}
Devang Patel90a48ad2010-03-15 18:33:46 +00002397
Jim Grosbach1e20b962010-07-21 21:21:52 +00002398/// isDbgValueInDefinedReg - Return true if debug value, encoded by
Devang Patelc3f5f782010-05-25 23:40:22 +00002399/// DBG_VALUE instruction, is in a defined reg.
2400static bool isDbgValueInDefinedReg(const MachineInstr *MI) {
2401 assert (MI->isDebugValue() && "Invalid DBG_VALUE machine instruction!");
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00002402 return MI->getNumOperands() == 3 &&
2403 MI->getOperand(0).isReg() && MI->getOperand(0).getReg() &&
2404 MI->getOperand(1).isImm() && MI->getOperand(1).getImm() == 0;
Devang Patelc3f5f782010-05-25 23:40:22 +00002405}
2406
Devang Patelee432862010-05-20 19:57:06 +00002407/// collectVariableInfo - Populate DbgScope entries with variables' info.
Jim Grosbach1e20b962010-07-21 21:21:52 +00002408void
Devang Patel78e127d2010-06-25 22:07:34 +00002409DwarfDebug::collectVariableInfo(const MachineFunction *MF,
2410 SmallPtrSet<const MDNode *, 16> &Processed) {
Jim Grosbach1e20b962010-07-21 21:21:52 +00002411
Devang Patelee432862010-05-20 19:57:06 +00002412 /// collection info from MMI table.
2413 collectVariableInfoFromMMITable(MF, Processed);
2414
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00002415 for (SmallVectorImpl<const MDNode*>::const_iterator
2416 UVI = UserVariables.begin(), UVE = UserVariables.end(); UVI != UVE;
2417 ++UVI) {
2418 const MDNode *Var = *UVI;
2419 if (Processed.count(Var))
Devang Patelee432862010-05-20 19:57:06 +00002420 continue;
2421
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00002422 // History contains relevant DBG_VALUE instructions for Var and instructions
2423 // clobbering it.
2424 SmallVectorImpl<const MachineInstr*> &History = DbgValues[Var];
2425 if (History.empty())
2426 continue;
2427 const MachineInstr *MInsn = History.front();
Devang Patelc3f5f782010-05-25 23:40:22 +00002428
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00002429 DIVariable DV(Var);
Devang Patela36478f2011-01-11 21:42:10 +00002430 DbgScope *Scope = NULL;
Devang Pateld8720f42010-05-27 20:25:04 +00002431 if (DV.getTag() == dwarf::DW_TAG_arg_variable &&
2432 DISubprogram(DV.getContext()).describes(MF->getFunction()))
Devang Patelc0c5a262010-05-21 00:10:20 +00002433 Scope = CurrentFnDbgScope;
Devang Patela36478f2011-01-11 21:42:10 +00002434 else
2435 Scope = findDbgScope(MInsn);
Devang Patelee432862010-05-20 19:57:06 +00002436 // If variable scope is not found then skip this variable.
Devang Patelc0c5a262010-05-21 00:10:20 +00002437 if (!Scope)
Devang Patelee432862010-05-20 19:57:06 +00002438 continue;
2439
2440 Processed.insert(DV);
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00002441 assert(MInsn->isDebugValue() && "History must begin with debug value");
Devang Patelee432862010-05-20 19:57:06 +00002442 DbgVariable *RegVar = new DbgVariable(DV);
Devang Patel0478c152011-03-01 22:58:55 +00002443 if (!addCurrentFnArgument(MF, RegVar, Scope))
2444 Scope->addVariable(RegVar);
Devang Patelc0c5a262010-05-21 00:10:20 +00002445 if (DbgVariable *AbsVar = findAbstractVariable(DV, MInsn->getDebugLoc())) {
2446 DbgVariableToDbgInstMap[AbsVar] = MInsn;
2447 VarToAbstractVarMap[RegVar] = AbsVar;
Devang Patel90a48ad2010-03-15 18:33:46 +00002448 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00002449
2450 // Simple ranges that are fully coalesced.
2451 if (History.size() <= 1 || (History.size() == 2 &&
2452 MInsn->isIdenticalTo(History.back()))) {
Devang Patelc3f5f782010-05-25 23:40:22 +00002453 DbgVariableToDbgInstMap[RegVar] = MInsn;
2454 continue;
2455 }
2456
2457 // handle multiple DBG_VALUE instructions describing one variable.
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00002458 RegVar->setDotDebugLocOffset(DotDebugLocEntries.size());
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00002459
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00002460 for (SmallVectorImpl<const MachineInstr*>::const_iterator
2461 HI = History.begin(), HE = History.end(); HI != HE; ++HI) {
2462 const MachineInstr *Begin = *HI;
2463 assert(Begin->isDebugValue() && "Invalid History entry");
Devang Patelc3f5f782010-05-25 23:40:22 +00002464 MachineLocation MLoc;
Devang Patelb2cf5812010-08-04 18:40:52 +00002465 if (Begin->getNumOperands() == 3) {
2466 if (Begin->getOperand(0).isReg() && Begin->getOperand(1).isImm())
2467 MLoc.set(Begin->getOperand(0).getReg(), Begin->getOperand(1).getImm());
2468 } else
2469 MLoc = Asm->getDebugValueLocation(Begin);
2470
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00002471 // FIXME: emitDebugLoc only understands registers.
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00002472 if (!MLoc.getReg())
2473 continue;
Jakob Stoklund Olesene17232e2011-03-22 00:21:41 +00002474
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00002475 // Compute the range for a register location.
2476 const MCSymbol *FLabel = getLabelBeforeInsn(Begin);
2477 const MCSymbol *SLabel = 0;
2478
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00002479 if (HI + 1 == HE)
2480 // If Begin is the last instruction in History then its value is valid
Devang Patelc3f5f782010-05-25 23:40:22 +00002481 // until the end of the funtion.
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00002482 SLabel = FunctionEndSym;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00002483 else {
2484 const MachineInstr *End = HI[1];
2485 if (End->isDebugValue())
2486 SLabel = getLabelBeforeInsn(End);
2487 else {
2488 // End is a normal instruction clobbering the range.
2489 SLabel = getLabelAfterInsn(End);
2490 assert(SLabel && "Forgot label after clobber instruction");
2491 ++HI;
2492 }
2493 }
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00002494
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00002495 // The value is valid until the next DBG_VALUE or clobber.
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00002496 DotDebugLocEntries.push_back(DotDebugLocEntry(FLabel, SLabel, MLoc));
Devang Patelc3f5f782010-05-25 23:40:22 +00002497 }
2498 DotDebugLocEntries.push_back(DotDebugLocEntry());
Devang Patel90a48ad2010-03-15 18:33:46 +00002499 }
Devang Patel98e1cac2010-05-14 21:01:35 +00002500
2501 // Collect info for variables that were optimized out.
Devang Pateld1bbc6b2010-06-22 01:01:58 +00002502 const Function *F = MF->getFunction();
Devang Patel62367042010-11-10 22:19:21 +00002503 if (NamedMDNode *NMD = getFnSpecificMDNode(*(F->getParent()), F->getName())) {
Devang Patel98e1cac2010-05-14 21:01:35 +00002504 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
Dan Gohman872814a2010-07-21 18:54:18 +00002505 DIVariable DV(cast<MDNode>(NMD->getOperand(i)));
Devang Patelee432862010-05-20 19:57:06 +00002506 if (!DV || !Processed.insert(DV))
Devang Patel98e1cac2010-05-14 21:01:35 +00002507 continue;
2508 DbgScope *Scope = DbgScopeMap.lookup(DV.getContext());
2509 if (Scope)
Devang Patel26c1e562010-05-20 16:36:41 +00002510 Scope->addVariable(new DbgVariable(DV));
Devang Patel98e1cac2010-05-14 21:01:35 +00002511 }
2512 }
Devang Patelc3f5f782010-05-25 23:40:22 +00002513}
Devang Patel98e1cac2010-05-14 21:01:35 +00002514
Devang Patelc3f5f782010-05-25 23:40:22 +00002515/// getLabelBeforeInsn - Return Label preceding the instruction.
2516const MCSymbol *DwarfDebug::getLabelBeforeInsn(const MachineInstr *MI) {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00002517 MCSymbol *Label = LabelsBeforeInsn.lookup(MI);
2518 assert(Label && "Didn't insert label before instruction");
2519 return Label;
Devang Patelc3f5f782010-05-25 23:40:22 +00002520}
2521
2522/// getLabelAfterInsn - Return Label immediately following the instruction.
2523const MCSymbol *DwarfDebug::getLabelAfterInsn(const MachineInstr *MI) {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00002524 return LabelsAfterInsn.lookup(MI);
Devang Patele717faa2009-10-06 01:26:37 +00002525}
2526
Devang Patelcbbe2872010-10-26 17:49:02 +00002527/// beginInstruction - Process beginning of an instruction.
2528void DwarfDebug::beginInstruction(const MachineInstr *MI) {
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00002529 // Check if source location changes, but ignore DBG_VALUE locations.
2530 if (!MI->isDebugValue()) {
2531 DebugLoc DL = MI->getDebugLoc();
2532 if (DL != PrevInstLoc && (!DL.isUnknown() || UnknownLocations)) {
2533 PrevInstLoc = DL;
2534 if (!DL.isUnknown()) {
2535 const MDNode *Scope = DL.getScope(Asm->MF->getFunction()->getContext());
2536 recordSourceLine(DL.getLine(), DL.getCol(), Scope);
2537 } else
2538 recordSourceLine(0, 0, 0);
2539 }
Devang Patelc3f5f782010-05-25 23:40:22 +00002540 }
Devang Patelaead63c2010-03-29 22:59:58 +00002541
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00002542 // Insert labels where requested.
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00002543 DenseMap<const MachineInstr*, MCSymbol*>::iterator I =
2544 LabelsBeforeInsn.find(MI);
2545
2546 // No label needed.
2547 if (I == LabelsBeforeInsn.end())
2548 return;
2549
2550 // Label already assigned.
2551 if (I->second)
Devang Patelb2b31a62010-05-26 19:37:24 +00002552 return;
Devang Patel553881b2010-03-29 17:20:31 +00002553
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00002554 if (!PrevLabel) {
Devang Patel77051f52010-05-26 21:23:46 +00002555 PrevLabel = MMI->getContext().CreateTempSymbol();
2556 Asm->OutStreamer.EmitLabel(PrevLabel);
Devang Patelb2b31a62010-05-26 19:37:24 +00002557 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00002558 I->second = PrevLabel;
Devang Patel0d20ac82009-10-06 01:50:42 +00002559}
2560
Devang Patelcbbe2872010-10-26 17:49:02 +00002561/// endInstruction - Process end of an instruction.
2562void DwarfDebug::endInstruction(const MachineInstr *MI) {
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00002563 // Don't create a new label after DBG_VALUE instructions.
2564 // They don't generate code.
2565 if (!MI->isDebugValue())
2566 PrevLabel = 0;
2567
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00002568 DenseMap<const MachineInstr*, MCSymbol*>::iterator I =
2569 LabelsAfterInsn.find(MI);
2570
2571 // No label needed.
2572 if (I == LabelsAfterInsn.end())
2573 return;
2574
2575 // Label already assigned.
2576 if (I->second)
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00002577 return;
2578
2579 // We need a label after this instruction.
2580 if (!PrevLabel) {
2581 PrevLabel = MMI->getContext().CreateTempSymbol();
2582 Asm->OutStreamer.EmitLabel(PrevLabel);
Devang Patel1c246352010-04-08 16:50:29 +00002583 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00002584 I->second = PrevLabel;
Devang Patel53bb5c92009-11-10 23:06:00 +00002585}
2586
Devang Pateleac9c072010-04-27 19:46:33 +00002587/// getOrCreateDbgScope - Create DbgScope for the scope.
Jim Grosbach1e20b962010-07-21 21:21:52 +00002588DbgScope *DwarfDebug::getOrCreateDbgScope(const MDNode *Scope,
Devang Patel61409622010-07-07 20:12:52 +00002589 const MDNode *InlinedAt) {
Devang Patel53bb5c92009-11-10 23:06:00 +00002590 if (!InlinedAt) {
2591 DbgScope *WScope = DbgScopeMap.lookup(Scope);
2592 if (WScope)
Devang Pateleac9c072010-04-27 19:46:33 +00002593 return WScope;
Devang Patel53bb5c92009-11-10 23:06:00 +00002594 WScope = new DbgScope(NULL, DIDescriptor(Scope), NULL);
2595 DbgScopeMap.insert(std::make_pair(Scope, WScope));
Devang Pateleac9c072010-04-27 19:46:33 +00002596 if (DIDescriptor(Scope).isLexicalBlock()) {
Jim Grosbach1e20b962010-07-21 21:21:52 +00002597 DbgScope *Parent =
Devang Patel2db49d72010-05-07 18:11:54 +00002598 getOrCreateDbgScope(DILexicalBlock(Scope).getContext(), NULL);
Devang Pateleac9c072010-04-27 19:46:33 +00002599 WScope->setParent(Parent);
2600 Parent->addScope(WScope);
2601 }
2602
2603 if (!WScope->getParent()) {
2604 StringRef SPName = DISubprogram(Scope).getLinkageName();
Stuart Hastingscad22ad2010-06-15 23:06:30 +00002605 // We used to check only for a linkage name, but that fails
2606 // since we began omitting the linkage name for private
2607 // functions. The new way is to check for the name in metadata,
2608 // but that's not supported in old .ll test cases. Ergo, we
2609 // check both.
Stuart Hastings215aa152010-06-11 20:08:44 +00002610 if (SPName == Asm->MF->getFunction()->getName() ||
2611 DISubprogram(Scope).getFunction() == Asm->MF->getFunction())
Devang Pateleac9c072010-04-27 19:46:33 +00002612 CurrentFnDbgScope = WScope;
2613 }
Jim Grosbach1e20b962010-07-21 21:21:52 +00002614
Devang Pateleac9c072010-04-27 19:46:33 +00002615 return WScope;
Devang Patel53bb5c92009-11-10 23:06:00 +00002616 }
2617
Devang Patel78e127d2010-06-25 22:07:34 +00002618 getOrCreateAbstractScope(Scope);
Devang Patel53bb5c92009-11-10 23:06:00 +00002619 DbgScope *WScope = DbgScopeMap.lookup(InlinedAt);
2620 if (WScope)
Devang Pateleac9c072010-04-27 19:46:33 +00002621 return WScope;
Devang Patel53bb5c92009-11-10 23:06:00 +00002622
2623 WScope = new DbgScope(NULL, DIDescriptor(Scope), InlinedAt);
2624 DbgScopeMap.insert(std::make_pair(InlinedAt, WScope));
2625 DILocation DL(InlinedAt);
Devang Pateleac9c072010-04-27 19:46:33 +00002626 DbgScope *Parent =
Devang Patel2db49d72010-05-07 18:11:54 +00002627 getOrCreateDbgScope(DL.getScope(), DL.getOrigLocation());
Devang Pateleac9c072010-04-27 19:46:33 +00002628 WScope->setParent(Parent);
2629 Parent->addScope(WScope);
2630
2631 ConcreteScopes[InlinedAt] = WScope;
Devang Pateleac9c072010-04-27 19:46:33 +00002632
2633 return WScope;
Devang Patel0d20ac82009-10-06 01:50:42 +00002634}
2635
Devang Pateleac9c072010-04-27 19:46:33 +00002636/// hasValidLocation - Return true if debug location entry attached with
2637/// machine instruction encodes valid location info.
2638static bool hasValidLocation(LLVMContext &Ctx,
2639 const MachineInstr *MInsn,
Devang Patele9f8f5e2010-05-07 20:54:48 +00002640 const MDNode *&Scope, const MDNode *&InlinedAt) {
Devang Pateleac9c072010-04-27 19:46:33 +00002641 DebugLoc DL = MInsn->getDebugLoc();
2642 if (DL.isUnknown()) return false;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002643
Devang Patele9f8f5e2010-05-07 20:54:48 +00002644 const MDNode *S = DL.getScope(Ctx);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002645
Devang Pateleac9c072010-04-27 19:46:33 +00002646 // There is no need to create another DIE for compile unit. For all
2647 // other scopes, create one DbgScope now. This will be translated
2648 // into a scope DIE at the end.
2649 if (DIScope(S).isCompileUnit()) return false;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002650
Devang Pateleac9c072010-04-27 19:46:33 +00002651 Scope = S;
2652 InlinedAt = DL.getInlinedAt(Ctx);
2653 return true;
2654}
2655
2656/// calculateDominanceGraph - Calculate dominance graph for DbgScope
2657/// hierarchy.
2658static void calculateDominanceGraph(DbgScope *Scope) {
2659 assert (Scope && "Unable to calculate scop edominance graph!");
2660 SmallVector<DbgScope *, 4> WorkStack;
2661 WorkStack.push_back(Scope);
2662 unsigned Counter = 0;
2663 while (!WorkStack.empty()) {
2664 DbgScope *WS = WorkStack.back();
2665 const SmallVector<DbgScope *, 4> &Children = WS->getScopes();
2666 bool visitedChildren = false;
2667 for (SmallVector<DbgScope *, 4>::const_iterator SI = Children.begin(),
2668 SE = Children.end(); SI != SE; ++SI) {
2669 DbgScope *ChildScope = *SI;
2670 if (!ChildScope->getDFSOut()) {
2671 WorkStack.push_back(ChildScope);
2672 visitedChildren = true;
2673 ChildScope->setDFSIn(++Counter);
2674 break;
2675 }
2676 }
2677 if (!visitedChildren) {
2678 WorkStack.pop_back();
2679 WS->setDFSOut(++Counter);
2680 }
2681 }
2682}
2683
2684/// printDbgScopeInfo - Print DbgScope info for each machine instruction.
Jim Grosbach1e20b962010-07-21 21:21:52 +00002685static
Devang Pateleac9c072010-04-27 19:46:33 +00002686void printDbgScopeInfo(LLVMContext &Ctx, const MachineFunction *MF,
2687 DenseMap<const MachineInstr *, DbgScope *> &MI2ScopeMap)
2688{
2689#ifndef NDEBUG
2690 unsigned PrevDFSIn = 0;
2691 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2692 I != E; ++I) {
2693 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2694 II != IE; ++II) {
2695 const MachineInstr *MInsn = II;
Devang Patele9f8f5e2010-05-07 20:54:48 +00002696 const MDNode *Scope = NULL;
2697 const MDNode *InlinedAt = NULL;
Devang Pateleac9c072010-04-27 19:46:33 +00002698
2699 // Check if instruction has valid location information.
2700 if (hasValidLocation(Ctx, MInsn, Scope, InlinedAt)) {
2701 dbgs() << " [ ";
Jim Grosbach1e20b962010-07-21 21:21:52 +00002702 if (InlinedAt)
Devang Pateleac9c072010-04-27 19:46:33 +00002703 dbgs() << "*";
Jim Grosbach1e20b962010-07-21 21:21:52 +00002704 DenseMap<const MachineInstr *, DbgScope *>::iterator DI =
Devang Pateleac9c072010-04-27 19:46:33 +00002705 MI2ScopeMap.find(MInsn);
2706 if (DI != MI2ScopeMap.end()) {
2707 DbgScope *S = DI->second;
2708 dbgs() << S->getDFSIn();
2709 PrevDFSIn = S->getDFSIn();
2710 } else
2711 dbgs() << PrevDFSIn;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002712 } else
Devang Pateleac9c072010-04-27 19:46:33 +00002713 dbgs() << " [ x" << PrevDFSIn;
2714 dbgs() << " ]";
2715 MInsn->dump();
2716 }
2717 dbgs() << "\n";
2718 }
2719#endif
2720}
Devang Patel2c4ceb12009-11-21 02:48:08 +00002721/// extractScopeInformation - Scan machine instructions in this function
Chris Lattner14d750d2010-03-31 05:39:57 +00002722/// and collect DbgScopes. Return true, if at least one scope was found.
Chris Lattnereec791a2010-01-26 23:18:02 +00002723bool DwarfDebug::extractScopeInformation() {
Devang Patelaf9e8472009-10-01 20:31:14 +00002724 // If scope information was extracted using .dbg intrinsics then there is not
2725 // any need to extract these information by scanning each instruction.
2726 if (!DbgScopeMap.empty())
2727 return false;
2728
Dan Gohman314bf7c2010-04-23 01:18:53 +00002729 // Scan each instruction and create scopes. First build working set of scopes.
Devang Pateleac9c072010-04-27 19:46:33 +00002730 LLVMContext &Ctx = Asm->MF->getFunction()->getContext();
2731 SmallVector<DbgRange, 4> MIRanges;
2732 DenseMap<const MachineInstr *, DbgScope *> MI2ScopeMap;
Devang Patele9f8f5e2010-05-07 20:54:48 +00002733 const MDNode *PrevScope = NULL;
2734 const MDNode *PrevInlinedAt = NULL;
Devang Pateleac9c072010-04-27 19:46:33 +00002735 const MachineInstr *RangeBeginMI = NULL;
2736 const MachineInstr *PrevMI = NULL;
Chris Lattnerd38fee82010-04-05 00:13:49 +00002737 for (MachineFunction::const_iterator I = Asm->MF->begin(), E = Asm->MF->end();
Devang Patelaf9e8472009-10-01 20:31:14 +00002738 I != E; ++I) {
2739 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2740 II != IE; ++II) {
2741 const MachineInstr *MInsn = II;
Devang Patele9f8f5e2010-05-07 20:54:48 +00002742 const MDNode *Scope = NULL;
2743 const MDNode *InlinedAt = NULL;
Devang Pateleac9c072010-04-27 19:46:33 +00002744
2745 // Check if instruction has valid location information.
2746 if (!hasValidLocation(Ctx, MInsn, Scope, InlinedAt)) {
2747 PrevMI = MInsn;
2748 continue;
2749 }
Jim Grosbach1e20b962010-07-21 21:21:52 +00002750
Devang Pateleac9c072010-04-27 19:46:33 +00002751 // If scope has not changed then skip this instruction.
2752 if (Scope == PrevScope && PrevInlinedAt == InlinedAt) {
2753 PrevMI = MInsn;
2754 continue;
2755 }
2756
Devang Pateld3526ea2011-02-15 17:56:09 +00002757 // Ignore DBG_VALUE. It does not contribute any instruction in output.
2758 if (MInsn->isDebugValue())
2759 continue;
2760
Jim Grosbach1e20b962010-07-21 21:21:52 +00002761 if (RangeBeginMI) {
2762 // If we have alread seen a beginning of a instruction range and
Devang Pateleac9c072010-04-27 19:46:33 +00002763 // current instruction scope does not match scope of first instruction
2764 // in this range then create a new instruction range.
2765 DbgRange R(RangeBeginMI, PrevMI);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002766 MI2ScopeMap[RangeBeginMI] = getOrCreateDbgScope(PrevScope,
Devang Patel61409622010-07-07 20:12:52 +00002767 PrevInlinedAt);
Devang Pateleac9c072010-04-27 19:46:33 +00002768 MIRanges.push_back(R);
Jim Grosbach1e20b962010-07-21 21:21:52 +00002769 }
Devang Pateleac9c072010-04-27 19:46:33 +00002770
2771 // This is a beginning of a new instruction range.
2772 RangeBeginMI = MInsn;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002773
Devang Pateleac9c072010-04-27 19:46:33 +00002774 // Reset previous markers.
2775 PrevMI = MInsn;
2776 PrevScope = Scope;
2777 PrevInlinedAt = InlinedAt;
Devang Patel53bb5c92009-11-10 23:06:00 +00002778 }
2779 }
2780
Devang Pateleac9c072010-04-27 19:46:33 +00002781 // Create last instruction range.
2782 if (RangeBeginMI && PrevMI && PrevScope) {
2783 DbgRange R(RangeBeginMI, PrevMI);
2784 MIRanges.push_back(R);
2785 MI2ScopeMap[RangeBeginMI] = getOrCreateDbgScope(PrevScope, PrevInlinedAt);
Devang Patelaf9e8472009-10-01 20:31:14 +00002786 }
Jim Grosbach1e20b962010-07-21 21:21:52 +00002787
Devang Patel344130e2010-01-04 20:44:00 +00002788 if (!CurrentFnDbgScope)
2789 return false;
2790
Devang Pateleac9c072010-04-27 19:46:33 +00002791 calculateDominanceGraph(CurrentFnDbgScope);
2792 if (PrintDbgScope)
2793 printDbgScopeInfo(Ctx, Asm->MF, MI2ScopeMap);
2794
2795 // Find ranges of instructions covered by each DbgScope;
2796 DbgScope *PrevDbgScope = NULL;
2797 for (SmallVector<DbgRange, 4>::const_iterator RI = MIRanges.begin(),
2798 RE = MIRanges.end(); RI != RE; ++RI) {
2799 const DbgRange &R = *RI;
2800 DbgScope *S = MI2ScopeMap.lookup(R.first);
2801 assert (S && "Lost DbgScope for a machine instruction!");
2802 if (PrevDbgScope && !PrevDbgScope->dominates(S))
2803 PrevDbgScope->closeInsnRange(S);
2804 S->openInsnRange(R.first);
2805 S->extendInsnRange(R.second);
2806 PrevDbgScope = S;
2807 }
2808
2809 if (PrevDbgScope)
2810 PrevDbgScope->closeInsnRange();
Devang Patelaf9e8472009-10-01 20:31:14 +00002811
Devang Patele37b0c62010-04-08 18:43:56 +00002812 identifyScopeMarkers();
Devang Patel6122a4d2010-04-08 15:37:09 +00002813
2814 return !DbgScopeMap.empty();
2815}
2816
Jim Grosbach1e20b962010-07-21 21:21:52 +00002817/// identifyScopeMarkers() -
Devang Pateleac9c072010-04-27 19:46:33 +00002818/// Each DbgScope has first instruction and last instruction to mark beginning
2819/// and end of a scope respectively. Create an inverse map that list scopes
2820/// starts (and ends) with an instruction. One instruction may start (or end)
2821/// multiple scopes. Ignore scopes that are not reachable.
Devang Patele37b0c62010-04-08 18:43:56 +00002822void DwarfDebug::identifyScopeMarkers() {
Devang Patel42aafd72010-01-20 02:05:23 +00002823 SmallVector<DbgScope *, 4> WorkList;
2824 WorkList.push_back(CurrentFnDbgScope);
2825 while (!WorkList.empty()) {
Chris Lattner14d750d2010-03-31 05:39:57 +00002826 DbgScope *S = WorkList.pop_back_val();
Jim Grosbach1e20b962010-07-21 21:21:52 +00002827
Jeffrey Yasskin5c213dc2010-03-12 17:45:06 +00002828 const SmallVector<DbgScope *, 4> &Children = S->getScopes();
Jim Grosbach1e20b962010-07-21 21:21:52 +00002829 if (!Children.empty())
Jeffrey Yasskin5c213dc2010-03-12 17:45:06 +00002830 for (SmallVector<DbgScope *, 4>::const_iterator SI = Children.begin(),
Devang Patel42aafd72010-01-20 02:05:23 +00002831 SE = Children.end(); SI != SE; ++SI)
2832 WorkList.push_back(*SI);
2833
Devang Patel53bb5c92009-11-10 23:06:00 +00002834 if (S->isAbstractScope())
2835 continue;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002836
Devang Pateleac9c072010-04-27 19:46:33 +00002837 const SmallVector<DbgRange, 4> &Ranges = S->getRanges();
2838 if (Ranges.empty())
2839 continue;
2840 for (SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin(),
2841 RE = Ranges.end(); RI != RE; ++RI) {
Jim Grosbach1e20b962010-07-21 21:21:52 +00002842 assert(RI->first && "DbgRange does not have first instruction!");
2843 assert(RI->second && "DbgRange does not have second instruction!");
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00002844 requestLabelBeforeInsn(RI->first);
2845 requestLabelAfterInsn(RI->second);
Devang Pateleac9c072010-04-27 19:46:33 +00002846 }
Devang Patelaf9e8472009-10-01 20:31:14 +00002847 }
Devang Patelaf9e8472009-10-01 20:31:14 +00002848}
2849
Dan Gohman084751c2010-04-20 00:37:27 +00002850/// FindFirstDebugLoc - Find the first debug location in the function. This
2851/// is intended to be an approximation for the source position of the
2852/// beginning of the function.
2853static DebugLoc FindFirstDebugLoc(const MachineFunction *MF) {
2854 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2855 I != E; ++I)
2856 for (MachineBasicBlock::const_iterator MBBI = I->begin(), MBBE = I->end();
2857 MBBI != MBBE; ++MBBI) {
2858 DebugLoc DL = MBBI->getDebugLoc();
2859 if (!DL.isUnknown())
2860 return DL;
2861 }
2862 return DebugLoc();
2863}
2864
Devang Patel9a31f0f2010-10-25 20:45:32 +00002865#ifndef NDEBUG
2866/// CheckLineNumbers - Count basicblocks whose instructions do not have any
2867/// line number information.
2868static void CheckLineNumbers(const MachineFunction *MF) {
2869 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2870 I != E; ++I) {
2871 bool FoundLineNo = false;
2872 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2873 II != IE; ++II) {
2874 const MachineInstr *MI = II;
2875 if (!MI->getDebugLoc().isUnknown()) {
2876 FoundLineNo = true;
2877 break;
2878 }
2879 }
Devang Patel4d7f9a02010-10-28 22:11:59 +00002880 if (!FoundLineNo && I->size())
Devang Patel9a31f0f2010-10-25 20:45:32 +00002881 ++BlocksWithoutLineNo;
2882 }
2883}
2884#endif
2885
Devang Patel2c4ceb12009-11-21 02:48:08 +00002886/// beginFunction - Gather pre-function debug information. Assumes being
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002887/// emitted immediately after the function entry point.
Chris Lattnereec791a2010-01-26 23:18:02 +00002888void DwarfDebug::beginFunction(const MachineFunction *MF) {
Chris Lattner994cb122010-04-05 03:52:55 +00002889 if (!MMI->hasDebugInfo()) return;
Bill Wendling5f017e82010-04-07 09:28:04 +00002890 if (!extractScopeInformation()) return;
Devang Patel60b35bd2009-10-06 18:37:31 +00002891
Devang Patel9a31f0f2010-10-25 20:45:32 +00002892#ifndef NDEBUG
2893 CheckLineNumbers(MF);
2894#endif
2895
Devang Pateleac9c072010-04-27 19:46:33 +00002896 FunctionBeginSym = Asm->GetTempSymbol("func_begin",
2897 Asm->getFunctionNumber());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002898 // Assumes in correct section after the entry point.
Devang Pateleac9c072010-04-27 19:46:33 +00002899 Asm->OutStreamer.EmitLabel(FunctionBeginSym);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002900
2901 // Emit label for the implicitly defined dbg.stoppoint at the start of the
2902 // function.
Dan Gohman084751c2010-04-20 00:37:27 +00002903 DebugLoc FDL = FindFirstDebugLoc(MF);
Chris Lattnerde4845c2010-04-02 19:42:39 +00002904 if (FDL.isUnknown()) return;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002905
Devang Patele9f8f5e2010-05-07 20:54:48 +00002906 const MDNode *Scope = FDL.getScope(MF->getFunction()->getContext());
Stuart Hastings0db42712010-07-19 23:56:30 +00002907 const MDNode *TheScope = 0;
Jim Grosbach1e20b962010-07-21 21:21:52 +00002908
Chris Lattnerde4845c2010-04-02 19:42:39 +00002909 DISubprogram SP = getDISubprogram(Scope);
2910 unsigned Line, Col;
2911 if (SP.Verify()) {
2912 Line = SP.getLineNumber();
2913 Col = 0;
Stuart Hastings0db42712010-07-19 23:56:30 +00002914 TheScope = SP;
Chris Lattnerde4845c2010-04-02 19:42:39 +00002915 } else {
2916 Line = FDL.getLine();
2917 Col = FDL.getCol();
Stuart Hastings0db42712010-07-19 23:56:30 +00002918 TheScope = Scope;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002919 }
Jim Grosbach1e20b962010-07-21 21:21:52 +00002920
Stuart Hastings0db42712010-07-19 23:56:30 +00002921 recordSourceLine(Line, Col, TheScope);
Devang Patelb2b31a62010-05-26 19:37:24 +00002922
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00002923 assert(UserVariables.empty() && DbgValues.empty() && "Maps weren't cleaned");
2924
Devang Patelb9abe9f2010-06-02 16:42:51 +00002925 /// ProcessedArgs - Collection of arguments already processed.
2926 SmallPtrSet<const MDNode *, 8> ProcessedArgs;
2927
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00002928 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
2929
2930 /// LiveUserVar - Map physreg numbers to the MDNode they contain.
2931 std::vector<const MDNode*> LiveUserVar(TRI->getNumRegs());
2932
Devang Patelb2b31a62010-05-26 19:37:24 +00002933 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00002934 I != E; ++I) {
2935 bool AtBlockEntry = true;
Devang Patelb2b31a62010-05-26 19:37:24 +00002936 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2937 II != IE; ++II) {
2938 const MachineInstr *MI = II;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00002939
Devang Patelb2b31a62010-05-26 19:37:24 +00002940 if (MI->isDebugValue()) {
Devang Patelb2b31a62010-05-26 19:37:24 +00002941 assert (MI->getNumOperands() > 1 && "Invalid machine instruction!");
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00002942
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00002943 // Keep track of user variables.
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00002944 const MDNode *Var =
2945 MI->getOperand(MI->getNumOperands() - 1).getMetadata();
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00002946
2947 // Variable is in a register, we need to check for clobbers.
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00002948 if (isDbgValueInDefinedReg(MI))
2949 LiveUserVar[MI->getOperand(0).getReg()] = Var;
2950
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00002951 // Check the history of this variable.
2952 SmallVectorImpl<const MachineInstr*> &History = DbgValues[Var];
2953 if (History.empty()) {
2954 UserVariables.push_back(Var);
2955 // The first mention of a function argument gets the FunctionBeginSym
2956 // label, so arguments are visible when breaking at function entry.
2957 DIVariable DV(Var);
2958 if (DV.Verify() && DV.getTag() == dwarf::DW_TAG_arg_variable &&
2959 DISubprogram(getDISubprogram(DV.getContext()))
2960 .describes(MF->getFunction()))
2961 LabelsBeforeInsn[MI] = FunctionBeginSym;
2962 } else {
2963 // We have seen this variable before. Try to coalesce DBG_VALUEs.
2964 const MachineInstr *Prev = History.back();
2965 if (Prev->isDebugValue()) {
2966 // Coalesce identical entries at the end of History.
2967 if (History.size() >= 2 &&
2968 Prev->isIdenticalTo(History[History.size() - 2]))
2969 History.pop_back();
2970
2971 // Terminate old register assignments that don't reach MI;
2972 MachineFunction::const_iterator PrevMBB = Prev->getParent();
2973 if (PrevMBB != I && (!AtBlockEntry || llvm::next(PrevMBB) != I) &&
2974 isDbgValueInDefinedReg(Prev)) {
2975 // Previous register assignment needs to terminate at the end of
2976 // its basic block.
2977 MachineBasicBlock::const_iterator LastMI =
2978 PrevMBB->getLastNonDebugInstr();
2979 if (LastMI == PrevMBB->end())
2980 // Drop DBG_VALUE for empty range.
2981 History.pop_back();
2982 else {
2983 // Terminate after LastMI.
2984 History.push_back(LastMI);
2985 }
2986 }
2987 }
2988 }
2989 History.push_back(MI);
Devang Patelb2b31a62010-05-26 19:37:24 +00002990 } else {
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00002991 // Not a DBG_VALUE instruction.
2992 if (!MI->isLabel())
2993 AtBlockEntry = false;
2994
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00002995 // Check if the instruction clobbers any registers with debug vars.
2996 for (MachineInstr::const_mop_iterator MOI = MI->operands_begin(),
2997 MOE = MI->operands_end(); MOI != MOE; ++MOI) {
2998 if (!MOI->isReg() || !MOI->isDef() || !MOI->getReg())
2999 continue;
3000 for (const unsigned *AI = TRI->getOverlaps(MOI->getReg());
3001 unsigned Reg = *AI; ++AI) {
3002 const MDNode *Var = LiveUserVar[Reg];
3003 if (!Var)
3004 continue;
3005 // Reg is now clobbered.
3006 LiveUserVar[Reg] = 0;
3007
3008 // Was MD last defined by a DBG_VALUE referring to Reg?
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00003009 DbgValueHistoryMap::iterator HistI = DbgValues.find(Var);
3010 if (HistI == DbgValues.end())
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00003011 continue;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00003012 SmallVectorImpl<const MachineInstr*> &History = HistI->second;
3013 if (History.empty())
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00003014 continue;
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00003015 const MachineInstr *Prev = History.back();
3016 // Sanity-check: Register assignments are terminated at the end of
3017 // their block.
3018 if (!Prev->isDebugValue() || Prev->getParent() != MI->getParent())
3019 continue;
3020 // Is the variable still in Reg?
3021 if (!isDbgValueInDefinedReg(Prev) ||
3022 Prev->getOperand(0).getReg() != Reg)
3023 continue;
3024 // Var is clobbered. Make sure the next instruction gets a label.
3025 History.push_back(MI);
Jakob Stoklund Olesen28cf1152011-03-22 22:33:08 +00003026 }
3027 }
Devang Patelb2b31a62010-05-26 19:37:24 +00003028 }
Devang Patelb2b31a62010-05-26 19:37:24 +00003029 }
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00003030 }
3031
3032 for (DbgValueHistoryMap::iterator I = DbgValues.begin(), E = DbgValues.end();
3033 I != E; ++I) {
3034 SmallVectorImpl<const MachineInstr*> &History = I->second;
3035 if (History.empty())
3036 continue;
3037
3038 // Make sure the final register assignments are terminated.
3039 const MachineInstr *Prev = History.back();
3040 if (Prev->isDebugValue() && isDbgValueInDefinedReg(Prev)) {
3041 const MachineBasicBlock *PrevMBB = Prev->getParent();
3042 MachineBasicBlock::const_iterator LastMI = PrevMBB->getLastNonDebugInstr();
3043 if (LastMI == PrevMBB->end())
3044 // Drop DBG_VALUE for empty range.
3045 History.pop_back();
3046 else {
3047 // Terminate after LastMI.
3048 History.push_back(LastMI);
3049 }
3050 }
3051 // Request labels for the full history.
3052 for (unsigned i = 0, e = History.size(); i != e; ++i) {
3053 const MachineInstr *MI = History[i];
3054 if (MI->isDebugValue())
3055 requestLabelBeforeInsn(MI);
3056 else
3057 requestLabelAfterInsn(MI);
3058 }
3059 }
Devang Patelb2b31a62010-05-26 19:37:24 +00003060
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00003061 PrevInstLoc = DebugLoc();
Devang Patelb2b31a62010-05-26 19:37:24 +00003062 PrevLabel = FunctionBeginSym;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00003063}
3064
Devang Patel2c4ceb12009-11-21 02:48:08 +00003065/// endFunction - Gather and emit post-function debug information.
Bill Wendlingf0fb9872009-05-20 23:19:06 +00003066///
Chris Lattnereec791a2010-01-26 23:18:02 +00003067void DwarfDebug::endFunction(const MachineFunction *MF) {
Bill Wendling5f017e82010-04-07 09:28:04 +00003068 if (!MMI->hasDebugInfo() || DbgScopeMap.empty()) return;
Devang Patel70d75ca2009-11-12 19:02:56 +00003069
Devang Patel344130e2010-01-04 20:44:00 +00003070 if (CurrentFnDbgScope) {
Devang Patel65eb4822010-05-22 00:04:14 +00003071
Devang Patelc3f5f782010-05-25 23:40:22 +00003072 // Define end label for subprogram.
3073 FunctionEndSym = Asm->GetTempSymbol("func_end",
3074 Asm->getFunctionNumber());
3075 // Assumes in correct section after the entry point.
3076 Asm->OutStreamer.EmitLabel(FunctionEndSym);
Jim Grosbach1e20b962010-07-21 21:21:52 +00003077
Devang Patel78e127d2010-06-25 22:07:34 +00003078 SmallPtrSet<const MDNode *, 16> ProcessedVars;
3079 collectVariableInfo(MF, ProcessedVars);
Devang Patel65eb4822010-05-22 00:04:14 +00003080
Devang Patel344130e2010-01-04 20:44:00 +00003081 // Construct abstract scopes.
3082 for (SmallVector<DbgScope *, 4>::iterator AI = AbstractScopesList.begin(),
Devang Patel78e127d2010-06-25 22:07:34 +00003083 AE = AbstractScopesList.end(); AI != AE; ++AI) {
Devang Patel78e127d2010-06-25 22:07:34 +00003084 DISubprogram SP((*AI)->getScopeNode());
3085 if (SP.Verify()) {
3086 // Collect info for variables that were optimized out.
3087 StringRef FName = SP.getLinkageName();
3088 if (FName.empty())
3089 FName = SP.getName();
Devang Patel62367042010-11-10 22:19:21 +00003090 if (NamedMDNode *NMD =
3091 getFnSpecificMDNode(*(MF->getFunction()->getParent()), FName)) {
Devang Patel78e127d2010-06-25 22:07:34 +00003092 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
Dan Gohman872814a2010-07-21 18:54:18 +00003093 DIVariable DV(cast<MDNode>(NMD->getOperand(i)));
Devang Patel78e127d2010-06-25 22:07:34 +00003094 if (!DV || !ProcessedVars.insert(DV))
3095 continue;
Devang Patel1d68d212010-06-30 00:11:08 +00003096 DbgScope *Scope = AbstractScopes.lookup(DV.getContext());
Devang Patel78e127d2010-06-25 22:07:34 +00003097 if (Scope)
3098 Scope->addVariable(new DbgVariable(DV));
3099 }
3100 }
3101 }
Devang Patel90e19aa2010-06-30 01:40:11 +00003102 if (ProcessedSPNodes.count((*AI)->getScopeNode()) == 0)
3103 constructScopeDIE(*AI);
Devang Patel78e127d2010-06-25 22:07:34 +00003104 }
Devang Patel61409622010-07-07 20:12:52 +00003105
Devang Patel9c488372010-05-04 06:15:30 +00003106 DIE *CurFnDIE = constructScopeDIE(CurrentFnDbgScope);
Jim Grosbach1e20b962010-07-21 21:21:52 +00003107
Devang Patel9c488372010-05-04 06:15:30 +00003108 if (!DisableFramePointerElim(*MF))
Jim Grosbach1e20b962010-07-21 21:21:52 +00003109 addUInt(CurFnDIE, dwarf::DW_AT_APPLE_omit_frame_ptr,
Devang Patel9c488372010-05-04 06:15:30 +00003110 dwarf::DW_FORM_flag, 1);
3111
3112
Chris Lattnerd38fee82010-04-05 00:13:49 +00003113 DebugFrames.push_back(FunctionDebugFrameInfo(Asm->getFunctionNumber(),
Devang Patel344130e2010-01-04 20:44:00 +00003114 MMI->getFrameMoves()));
Bill Wendlingf0fb9872009-05-20 23:19:06 +00003115 }
3116
Bill Wendlingf0fb9872009-05-20 23:19:06 +00003117 // Clear debug info
Devang Patelf54b8522010-01-19 01:26:02 +00003118 CurrentFnDbgScope = NULL;
Devang Patel0478c152011-03-01 22:58:55 +00003119 CurrentFnArguments.clear();
Devang Patel26c1e562010-05-20 16:36:41 +00003120 DbgVariableToFrameIndexMap.clear();
3121 VarToAbstractVarMap.clear();
3122 DbgVariableToDbgInstMap.clear();
Jeffrey Yasskin5c213dc2010-03-12 17:45:06 +00003123 DeleteContainerSeconds(DbgScopeMap);
Jakob Stoklund Olesenadb877d2011-03-26 02:19:36 +00003124 UserVariables.clear();
3125 DbgValues.clear();
Devang Patelf54b8522010-01-19 01:26:02 +00003126 ConcreteScopes.clear();
Jeffrey Yasskin5c213dc2010-03-12 17:45:06 +00003127 DeleteContainerSeconds(AbstractScopes);
Devang Patelf54b8522010-01-19 01:26:02 +00003128 AbstractScopesList.clear();
Jeffrey Yasskin5c213dc2010-03-12 17:45:06 +00003129 AbstractVariables.clear();
Devang Pateleac9c072010-04-27 19:46:33 +00003130 LabelsBeforeInsn.clear();
3131 LabelsAfterInsn.clear();
Devang Patelf2548ca2010-04-16 23:33:45 +00003132 PrevLabel = NULL;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00003133}
3134
Devang Patel26c1e562010-05-20 16:36:41 +00003135/// recordVariableFrameIndex - Record a variable's index.
3136void DwarfDebug::recordVariableFrameIndex(const DbgVariable *V, int Index) {
3137 assert (V && "Invalid DbgVariable!");
3138 DbgVariableToFrameIndexMap[V] = Index;
3139}
3140
3141/// findVariableFrameIndex - Return true if frame index for the variable
3142/// is found. Update FI to hold value of the index.
3143bool DwarfDebug::findVariableFrameIndex(const DbgVariable *V, int *FI) {
3144 assert (V && "Invalid DbgVariable!");
3145 DenseMap<const DbgVariable *, int>::iterator I =
3146 DbgVariableToFrameIndexMap.find(V);
3147 if (I == DbgVariableToFrameIndexMap.end())
3148 return false;
3149 *FI = I->second;
3150 return true;
3151}
3152
Jim Grosbach1e20b962010-07-21 21:21:52 +00003153/// findDbgScope - Find DbgScope for the debug loc attached with an
Devang Patelee432862010-05-20 19:57:06 +00003154/// instruction.
3155DbgScope *DwarfDebug::findDbgScope(const MachineInstr *MInsn) {
3156 DbgScope *Scope = NULL;
Jim Grosbach1e20b962010-07-21 21:21:52 +00003157 LLVMContext &Ctx =
Devang Patelee432862010-05-20 19:57:06 +00003158 MInsn->getParent()->getParent()->getFunction()->getContext();
3159 DebugLoc DL = MInsn->getDebugLoc();
3160
Jim Grosbach1e20b962010-07-21 21:21:52 +00003161 if (DL.isUnknown())
Devang Patelee432862010-05-20 19:57:06 +00003162 return Scope;
3163
3164 if (const MDNode *IA = DL.getInlinedAt(Ctx))
3165 Scope = ConcreteScopes.lookup(IA);
3166 if (Scope == 0)
3167 Scope = DbgScopeMap.lookup(DL.getScope(Ctx));
Jim Grosbach1e20b962010-07-21 21:21:52 +00003168
Devang Patelee432862010-05-20 19:57:06 +00003169 return Scope;
3170}
3171
3172
Chris Lattnerc6087842010-03-09 04:54:43 +00003173/// recordSourceLine - Register a source line with debug info. Returns the
3174/// unique label that was emitted and which provides correspondence to
3175/// the source line list.
Jakob Stoklund Olesen15a3ea02011-03-25 17:20:59 +00003176void DwarfDebug::recordSourceLine(unsigned Line, unsigned Col, const MDNode *S){
Devang Patel65dbc902009-11-25 17:36:49 +00003177 StringRef Fn;
Devang Patel23670e52011-03-24 20:30:50 +00003178 StringRef Dir;
Dan Gohman1cc0d622010-05-05 23:41:32 +00003179 unsigned Src = 1;
3180 if (S) {
3181 DIDescriptor Scope(S);
Devang Patelf84548d2009-10-05 18:03:19 +00003182
Dan Gohman1cc0d622010-05-05 23:41:32 +00003183 if (Scope.isCompileUnit()) {
3184 DICompileUnit CU(S);
Dan Gohman1cc0d622010-05-05 23:41:32 +00003185 Fn = CU.getFilename();
Devang Patel23670e52011-03-24 20:30:50 +00003186 Dir = CU.getDirectory();
Devang Patel3cabc9d2010-10-28 17:30:52 +00003187 } else if (Scope.isFile()) {
3188 DIFile F(S);
Devang Patel3cabc9d2010-10-28 17:30:52 +00003189 Fn = F.getFilename();
Devang Patel23670e52011-03-24 20:30:50 +00003190 Dir = F.getDirectory();
Dan Gohman1cc0d622010-05-05 23:41:32 +00003191 } else if (Scope.isSubprogram()) {
3192 DISubprogram SP(S);
Dan Gohman1cc0d622010-05-05 23:41:32 +00003193 Fn = SP.getFilename();
Devang Patel23670e52011-03-24 20:30:50 +00003194 Dir = SP.getDirectory();
Dan Gohman1cc0d622010-05-05 23:41:32 +00003195 } else if (Scope.isLexicalBlock()) {
3196 DILexicalBlock DB(S);
Dan Gohman1cc0d622010-05-05 23:41:32 +00003197 Fn = DB.getFilename();
Devang Patel23670e52011-03-24 20:30:50 +00003198 Dir = DB.getDirectory();
Dan Gohman1cc0d622010-05-05 23:41:32 +00003199 } else
3200 assert(0 && "Unexpected scope info");
3201
Devang Patel23670e52011-03-24 20:30:50 +00003202 Src = GetOrCreateSourceID(Fn, Dir);
Dan Gohman1cc0d622010-05-05 23:41:32 +00003203 }
3204
Rafael Espindola5c055632010-11-18 02:04:25 +00003205 Asm->OutStreamer.EmitDwarfLocDirective(Src, Line, Col, DWARF2_FLAG_IS_STMT,
3206 0, 0);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00003207}
3208
Bill Wendling829e67b2009-05-20 23:22:40 +00003209//===----------------------------------------------------------------------===//
3210// Emit Methods
3211//===----------------------------------------------------------------------===//
3212
Devang Patel2c4ceb12009-11-21 02:48:08 +00003213/// computeSizeAndOffset - Compute the size and offset of a DIE.
Bill Wendling94d04b82009-05-20 23:21:38 +00003214///
Jim Grosbach7ab38df2009-11-22 19:20:36 +00003215unsigned
3216DwarfDebug::computeSizeAndOffset(DIE *Die, unsigned Offset, bool Last) {
Bill Wendling94d04b82009-05-20 23:21:38 +00003217 // Get the children.
3218 const std::vector<DIE *> &Children = Die->getChildren();
3219
3220 // If not last sibling and has children then add sibling offset attribute.
Jeffrey Yasskin638fe8d2010-03-22 18:47:14 +00003221 if (!Last && !Children.empty())
Benjamin Kramer345ef342010-03-31 19:34:01 +00003222 Die->addSiblingOffset(DIEValueAllocator);
Bill Wendling94d04b82009-05-20 23:21:38 +00003223
3224 // Record the abbreviation.
Devang Patel2c4ceb12009-11-21 02:48:08 +00003225 assignAbbrevNumber(Die->getAbbrev());
Bill Wendling94d04b82009-05-20 23:21:38 +00003226
3227 // Get the abbreviation for this DIE.
3228 unsigned AbbrevNumber = Die->getAbbrevNumber();
3229 const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
3230
3231 // Set DIE offset
3232 Die->setOffset(Offset);
3233
3234 // Start the size with the size of abbreviation code.
Chris Lattneraf76e592009-08-22 20:48:53 +00003235 Offset += MCAsmInfo::getULEB128Size(AbbrevNumber);
Bill Wendling94d04b82009-05-20 23:21:38 +00003236
3237 const SmallVector<DIEValue*, 32> &Values = Die->getValues();
3238 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
3239
3240 // Size the DIE attribute values.
3241 for (unsigned i = 0, N = Values.size(); i < N; ++i)
3242 // Size attribute value.
Chris Lattnera37d5382010-04-05 00:18:22 +00003243 Offset += Values[i]->SizeOf(Asm, AbbrevData[i].getForm());
Bill Wendling94d04b82009-05-20 23:21:38 +00003244
3245 // Size the DIE children if any.
3246 if (!Children.empty()) {
3247 assert(Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes &&
3248 "Children flag not set");
3249
3250 for (unsigned j = 0, M = Children.size(); j < M; ++j)
Devang Patel2c4ceb12009-11-21 02:48:08 +00003251 Offset = computeSizeAndOffset(Children[j], Offset, (j + 1) == M);
Bill Wendling94d04b82009-05-20 23:21:38 +00003252
3253 // End of children marker.
3254 Offset += sizeof(int8_t);
3255 }
3256
3257 Die->setSize(Offset - Die->getOffset());
3258 return Offset;
3259}
3260
Devang Patel2c4ceb12009-11-21 02:48:08 +00003261/// computeSizeAndOffsets - Compute the size and offset of all the DIEs.
Bill Wendling94d04b82009-05-20 23:21:38 +00003262///
Devang Patel2c4ceb12009-11-21 02:48:08 +00003263void DwarfDebug::computeSizeAndOffsets() {
Devang Patel163a9f72010-05-10 22:49:55 +00003264 unsigned PrevOffset = 0;
3265 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
3266 E = CUMap.end(); I != E; ++I) {
3267 // Compute size of compile unit header.
3268 static unsigned Offset = PrevOffset +
3269 sizeof(int32_t) + // Length of Compilation Unit Info
3270 sizeof(int16_t) + // DWARF version number
3271 sizeof(int32_t) + // Offset Into Abbrev. Section
3272 sizeof(int8_t); // Pointer Size (in bytes)
3273 computeSizeAndOffset(I->second->getCUDie(), Offset, true);
3274 PrevOffset = Offset;
3275 }
Bill Wendling94d04b82009-05-20 23:21:38 +00003276}
3277
Chris Lattner11b8f302010-04-04 23:02:02 +00003278/// EmitSectionSym - Switch to the specified MCSection and emit an assembler
3279/// temporary label to it if SymbolStem is specified.
Chris Lattner9c69e285532010-04-04 22:59:04 +00003280static MCSymbol *EmitSectionSym(AsmPrinter *Asm, const MCSection *Section,
Chris Lattner11b8f302010-04-04 23:02:02 +00003281 const char *SymbolStem = 0) {
Chris Lattner9c69e285532010-04-04 22:59:04 +00003282 Asm->OutStreamer.SwitchSection(Section);
Chris Lattner11b8f302010-04-04 23:02:02 +00003283 if (!SymbolStem) return 0;
Jim Grosbach1e20b962010-07-21 21:21:52 +00003284
Chris Lattner9c69e285532010-04-04 22:59:04 +00003285 MCSymbol *TmpSym = Asm->GetTempSymbol(SymbolStem);
3286 Asm->OutStreamer.EmitLabel(TmpSym);
3287 return TmpSym;
3288}
3289
3290/// EmitSectionLabels - Emit initial Dwarf sections with a label at
3291/// the start of each one.
Chris Lattnerfa070b02010-04-04 22:33:59 +00003292void DwarfDebug::EmitSectionLabels() {
Chris Lattner6c2f9e12009-08-19 05:49:37 +00003293 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
Daniel Dunbarf612ff62009-09-19 20:40:05 +00003294
Bill Wendling94d04b82009-05-20 23:21:38 +00003295 // Dwarf sections base addresses.
Chris Lattnerd38fee82010-04-05 00:13:49 +00003296 if (Asm->MAI->doesDwarfRequireFrameSection()) {
Chris Lattner9c69e285532010-04-04 22:59:04 +00003297 DwarfFrameSectionSym =
3298 EmitSectionSym(Asm, TLOF.getDwarfFrameSection(), "section_debug_frame");
3299 }
Bill Wendling94d04b82009-05-20 23:21:38 +00003300
Jim Grosbach1e20b962010-07-21 21:21:52 +00003301 DwarfInfoSectionSym =
Chris Lattner9c69e285532010-04-04 22:59:04 +00003302 EmitSectionSym(Asm, TLOF.getDwarfInfoSection(), "section_info");
Jim Grosbach1e20b962010-07-21 21:21:52 +00003303 DwarfAbbrevSectionSym =
Chris Lattner9c69e285532010-04-04 22:59:04 +00003304 EmitSectionSym(Asm, TLOF.getDwarfAbbrevSection(), "section_abbrev");
Chris Lattner11b8f302010-04-04 23:02:02 +00003305 EmitSectionSym(Asm, TLOF.getDwarfARangesSection());
Jim Grosbach1e20b962010-07-21 21:21:52 +00003306
Chris Lattner9c69e285532010-04-04 22:59:04 +00003307 if (const MCSection *MacroInfo = TLOF.getDwarfMacroInfoSection())
Chris Lattner11b8f302010-04-04 23:02:02 +00003308 EmitSectionSym(Asm, MacroInfo);
Bill Wendling94d04b82009-05-20 23:21:38 +00003309
Devang Patelaf608bd2010-08-24 00:06:12 +00003310 EmitSectionSym(Asm, TLOF.getDwarfLineSection(), "section_line");
Chris Lattner11b8f302010-04-04 23:02:02 +00003311 EmitSectionSym(Asm, TLOF.getDwarfLocSection());
3312 EmitSectionSym(Asm, TLOF.getDwarfPubNamesSection());
3313 EmitSectionSym(Asm, TLOF.getDwarfPubTypesSection());
Jim Grosbach1e20b962010-07-21 21:21:52 +00003314 DwarfStrSectionSym =
Chris Lattner9c69e285532010-04-04 22:59:04 +00003315 EmitSectionSym(Asm, TLOF.getDwarfStrSection(), "section_str");
Devang Patelf2548ca2010-04-16 23:33:45 +00003316 DwarfDebugRangeSectionSym = EmitSectionSym(Asm, TLOF.getDwarfRangesSection(),
3317 "debug_range");
Bill Wendling94d04b82009-05-20 23:21:38 +00003318
Devang Patelc3f5f782010-05-25 23:40:22 +00003319 DwarfDebugLocSectionSym = EmitSectionSym(Asm, TLOF.getDwarfLocSection(),
3320 "section_debug_loc");
3321
Chris Lattner9c69e285532010-04-04 22:59:04 +00003322 TextSectionSym = EmitSectionSym(Asm, TLOF.getTextSection(), "text_begin");
Chris Lattner4ad1efe2010-04-04 23:10:38 +00003323 EmitSectionSym(Asm, TLOF.getDataSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00003324}
3325
Devang Patel2c4ceb12009-11-21 02:48:08 +00003326/// emitDIE - Recusively Emits a debug information entry.
Bill Wendling94d04b82009-05-20 23:21:38 +00003327///
Devang Patel2c4ceb12009-11-21 02:48:08 +00003328void DwarfDebug::emitDIE(DIE *Die) {
Bill Wendling94d04b82009-05-20 23:21:38 +00003329 // Get the abbreviation for this DIE.
3330 unsigned AbbrevNumber = Die->getAbbrevNumber();
3331 const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
3332
Bill Wendling94d04b82009-05-20 23:21:38 +00003333 // Emit the code (index) for the abbreviation.
Chris Lattner3f53c832010-04-04 18:52:31 +00003334 if (Asm->isVerbose())
Chris Lattner894d75a2010-01-22 23:18:42 +00003335 Asm->OutStreamer.AddComment("Abbrev [" + Twine(AbbrevNumber) + "] 0x" +
3336 Twine::utohexstr(Die->getOffset()) + ":0x" +
3337 Twine::utohexstr(Die->getSize()) + " " +
3338 dwarf::TagString(Abbrev->getTag()));
Chris Lattner7e1a8f82010-04-04 19:09:29 +00003339 Asm->EmitULEB128(AbbrevNumber);
Bill Wendling94d04b82009-05-20 23:21:38 +00003340
Jeffrey Yasskin638fe8d2010-03-22 18:47:14 +00003341 const SmallVector<DIEValue*, 32> &Values = Die->getValues();
Bill Wendling94d04b82009-05-20 23:21:38 +00003342 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
3343
3344 // Emit the DIE attribute values.
3345 for (unsigned i = 0, N = Values.size(); i < N; ++i) {
3346 unsigned Attr = AbbrevData[i].getAttribute();
3347 unsigned Form = AbbrevData[i].getForm();
3348 assert(Form && "Too many attributes for DIE (check abbreviation)");
3349
Chris Lattner3f53c832010-04-04 18:52:31 +00003350 if (Asm->isVerbose())
Chris Lattnera8013622010-01-24 18:54:17 +00003351 Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr));
Jim Grosbach1e20b962010-07-21 21:21:52 +00003352
Bill Wendling94d04b82009-05-20 23:21:38 +00003353 switch (Attr) {
3354 case dwarf::DW_AT_sibling:
Devang Patel2c4ceb12009-11-21 02:48:08 +00003355 Asm->EmitInt32(Die->getSiblingOffset());
Bill Wendling94d04b82009-05-20 23:21:38 +00003356 break;
3357 case dwarf::DW_AT_abstract_origin: {
3358 DIEEntry *E = cast<DIEEntry>(Values[i]);
3359 DIE *Origin = E->getEntry();
Devang Patel53bb5c92009-11-10 23:06:00 +00003360 unsigned Addr = Origin->getOffset();
Bill Wendling94d04b82009-05-20 23:21:38 +00003361 Asm->EmitInt32(Addr);
3362 break;
3363 }
Devang Patelf2548ca2010-04-16 23:33:45 +00003364 case dwarf::DW_AT_ranges: {
3365 // DW_AT_range Value encodes offset in debug_range section.
3366 DIEInteger *V = cast<DIEInteger>(Values[i]);
Devang Patelb1fcfbe2010-09-02 16:43:44 +00003367
3368 if (Asm->MAI->doesDwarfUsesLabelOffsetForRanges()) {
3369 Asm->EmitLabelPlusOffset(DwarfDebugRangeSectionSym,
3370 V->getValue(),
3371 4);
3372 } else {
3373 Asm->EmitLabelOffsetDifference(DwarfDebugRangeSectionSym,
3374 V->getValue(),
3375 DwarfDebugRangeSectionSym,
3376 4);
3377 }
Devang Patelf2548ca2010-04-16 23:33:45 +00003378 break;
3379 }
Devang Patelc3f5f782010-05-25 23:40:22 +00003380 case dwarf::DW_AT_location: {
3381 if (UseDotDebugLocEntry.count(Die) != 0) {
3382 DIELabel *L = cast<DIELabel>(Values[i]);
Daniel Dunbar83320a02011-03-16 22:16:39 +00003383 Asm->EmitLabelDifference(L->getValue(), DwarfDebugLocSectionSym, 4);
Devang Patelc3f5f782010-05-25 23:40:22 +00003384 } else
3385 Values[i]->EmitValue(Asm, Form);
3386 break;
3387 }
Devang Patel2a361602010-09-29 19:08:08 +00003388 case dwarf::DW_AT_accessibility: {
3389 if (Asm->isVerbose()) {
3390 DIEInteger *V = cast<DIEInteger>(Values[i]);
3391 Asm->OutStreamer.AddComment(dwarf::AccessibilityString(V->getValue()));
3392 }
3393 Values[i]->EmitValue(Asm, Form);
3394 break;
3395 }
Bill Wendling94d04b82009-05-20 23:21:38 +00003396 default:
3397 // Emit an attribute using the defined form.
Chris Lattnerd38fee82010-04-05 00:13:49 +00003398 Values[i]->EmitValue(Asm, Form);
Bill Wendling94d04b82009-05-20 23:21:38 +00003399 break;
3400 }
Bill Wendling94d04b82009-05-20 23:21:38 +00003401 }
3402
3403 // Emit the DIE children if any.
3404 if (Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes) {
3405 const std::vector<DIE *> &Children = Die->getChildren();
3406
3407 for (unsigned j = 0, M = Children.size(); j < M; ++j)
Devang Patel2c4ceb12009-11-21 02:48:08 +00003408 emitDIE(Children[j]);
Bill Wendling94d04b82009-05-20 23:21:38 +00003409
Chris Lattner3f53c832010-04-04 18:52:31 +00003410 if (Asm->isVerbose())
Chris Lattner233f52b2010-03-09 23:52:58 +00003411 Asm->OutStreamer.AddComment("End Of Children Mark");
3412 Asm->EmitInt8(0);
Bill Wendling94d04b82009-05-20 23:21:38 +00003413 }
3414}
3415
Devang Patel8a241142009-12-09 18:24:21 +00003416/// emitDebugInfo - Emit the debug info section.
Bill Wendling94d04b82009-05-20 23:21:38 +00003417///
Devang Patel8a241142009-12-09 18:24:21 +00003418void DwarfDebug::emitDebugInfo() {
3419 // Start debug info section.
3420 Asm->OutStreamer.SwitchSection(
3421 Asm->getObjFileLowering().getDwarfInfoSection());
Devang Patel163a9f72010-05-10 22:49:55 +00003422 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
3423 E = CUMap.end(); I != E; ++I) {
3424 CompileUnit *TheCU = I->second;
3425 DIE *Die = TheCU->getCUDie();
Jim Grosbach1e20b962010-07-21 21:21:52 +00003426
Devang Patel163a9f72010-05-10 22:49:55 +00003427 // Emit the compile units header.
3428 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_begin",
3429 TheCU->getID()));
Jim Grosbach1e20b962010-07-21 21:21:52 +00003430
Devang Patel163a9f72010-05-10 22:49:55 +00003431 // Emit size of content not including length itself
3432 unsigned ContentSize = Die->getSize() +
3433 sizeof(int16_t) + // DWARF version number
3434 sizeof(int32_t) + // Offset Into Abbrev. Section
3435 sizeof(int8_t) + // Pointer Size (in bytes)
3436 sizeof(int32_t); // FIXME - extra pad for gdb bug.
Jim Grosbach1e20b962010-07-21 21:21:52 +00003437
Devang Patel163a9f72010-05-10 22:49:55 +00003438 Asm->OutStreamer.AddComment("Length of Compilation Unit Info");
3439 Asm->EmitInt32(ContentSize);
3440 Asm->OutStreamer.AddComment("DWARF version number");
3441 Asm->EmitInt16(dwarf::DWARF_VERSION);
3442 Asm->OutStreamer.AddComment("Offset Into Abbrev. Section");
3443 Asm->EmitSectionOffset(Asm->GetTempSymbol("abbrev_begin"),
3444 DwarfAbbrevSectionSym);
3445 Asm->OutStreamer.AddComment("Address Size (in bytes)");
3446 Asm->EmitInt8(Asm->getTargetData().getPointerSize());
Jim Grosbach1e20b962010-07-21 21:21:52 +00003447
Devang Patel163a9f72010-05-10 22:49:55 +00003448 emitDIE(Die);
3449 // FIXME - extra padding for gdb bug.
3450 Asm->OutStreamer.AddComment("4 extra padding bytes for GDB");
3451 Asm->EmitInt8(0);
3452 Asm->EmitInt8(0);
3453 Asm->EmitInt8(0);
3454 Asm->EmitInt8(0);
3455 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_end", TheCU->getID()));
3456 }
Bill Wendling94d04b82009-05-20 23:21:38 +00003457}
3458
Devang Patel2c4ceb12009-11-21 02:48:08 +00003459/// emitAbbreviations - Emit the abbreviation section.
Bill Wendling94d04b82009-05-20 23:21:38 +00003460///
Devang Patel2c4ceb12009-11-21 02:48:08 +00003461void DwarfDebug::emitAbbreviations() const {
Bill Wendling94d04b82009-05-20 23:21:38 +00003462 // Check to see if it is worth the effort.
3463 if (!Abbreviations.empty()) {
3464 // Start the debug abbrev section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00003465 Asm->OutStreamer.SwitchSection(
3466 Asm->getObjFileLowering().getDwarfAbbrevSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00003467
Chris Lattnerc0215722010-04-04 19:25:43 +00003468 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_begin"));
Bill Wendling94d04b82009-05-20 23:21:38 +00003469
3470 // For each abbrevation.
3471 for (unsigned i = 0, N = Abbreviations.size(); i < N; ++i) {
3472 // Get abbreviation data
3473 const DIEAbbrev *Abbrev = Abbreviations[i];
3474
3475 // Emit the abbrevations code (base 1 index.)
Chris Lattner7e1a8f82010-04-04 19:09:29 +00003476 Asm->EmitULEB128(Abbrev->getNumber(), "Abbreviation Code");
Bill Wendling94d04b82009-05-20 23:21:38 +00003477
3478 // Emit the abbreviations data.
Chris Lattnerd38fee82010-04-05 00:13:49 +00003479 Abbrev->Emit(Asm);
Bill Wendling94d04b82009-05-20 23:21:38 +00003480 }
3481
3482 // Mark end of abbreviations.
Chris Lattner7e1a8f82010-04-04 19:09:29 +00003483 Asm->EmitULEB128(0, "EOM(3)");
Bill Wendling94d04b82009-05-20 23:21:38 +00003484
Chris Lattnerc0215722010-04-04 19:25:43 +00003485 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_end"));
Bill Wendling94d04b82009-05-20 23:21:38 +00003486 }
3487}
3488
Devang Patel2c4ceb12009-11-21 02:48:08 +00003489/// emitEndOfLineMatrix - Emit the last address of the section and the end of
Bill Wendling94d04b82009-05-20 23:21:38 +00003490/// the line matrix.
3491///
Devang Patel2c4ceb12009-11-21 02:48:08 +00003492void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) {
Bill Wendling94d04b82009-05-20 23:21:38 +00003493 // Define last address of section.
Chris Lattner233f52b2010-03-09 23:52:58 +00003494 Asm->OutStreamer.AddComment("Extended Op");
3495 Asm->EmitInt8(0);
Jim Grosbach1e20b962010-07-21 21:21:52 +00003496
Chris Lattner233f52b2010-03-09 23:52:58 +00003497 Asm->OutStreamer.AddComment("Op size");
Chris Lattnerd38fee82010-04-05 00:13:49 +00003498 Asm->EmitInt8(Asm->getTargetData().getPointerSize() + 1);
Chris Lattner233f52b2010-03-09 23:52:58 +00003499 Asm->OutStreamer.AddComment("DW_LNE_set_address");
3500 Asm->EmitInt8(dwarf::DW_LNE_set_address);
3501
3502 Asm->OutStreamer.AddComment("Section end label");
Chris Lattnerd85fc6e2010-03-10 01:17:49 +00003503
Chris Lattnerc0215722010-04-04 19:25:43 +00003504 Asm->OutStreamer.EmitSymbolValue(Asm->GetTempSymbol("section_end",SectionEnd),
Chris Lattnerd38fee82010-04-05 00:13:49 +00003505 Asm->getTargetData().getPointerSize(),
3506 0/*AddrSpace*/);
Bill Wendling94d04b82009-05-20 23:21:38 +00003507
3508 // Mark end of matrix.
Chris Lattner233f52b2010-03-09 23:52:58 +00003509 Asm->OutStreamer.AddComment("DW_LNE_end_sequence");
3510 Asm->EmitInt8(0);
Chris Lattner0ad9c912010-01-22 22:09:00 +00003511 Asm->EmitInt8(1);
Chris Lattner894d75a2010-01-22 23:18:42 +00003512 Asm->EmitInt8(1);
Bill Wendling94d04b82009-05-20 23:21:38 +00003513}
3514
Devang Patel2c4ceb12009-11-21 02:48:08 +00003515/// emitCommonDebugFrame - Emit common frame info into a debug frame section.
Bill Wendling94d04b82009-05-20 23:21:38 +00003516///
Devang Patel2c4ceb12009-11-21 02:48:08 +00003517void DwarfDebug::emitCommonDebugFrame() {
Chris Lattnerd38fee82010-04-05 00:13:49 +00003518 if (!Asm->MAI->doesDwarfRequireFrameSection())
Bill Wendling94d04b82009-05-20 23:21:38 +00003519 return;
3520
Chris Lattnerd38fee82010-04-05 00:13:49 +00003521 int stackGrowth = Asm->getTargetData().getPointerSize();
Anton Korobeynikov16c29b52011-01-10 12:39:04 +00003522 if (Asm->TM.getFrameLowering()->getStackGrowthDirection() ==
3523 TargetFrameLowering::StackGrowsDown)
Chris Lattnerd38fee82010-04-05 00:13:49 +00003524 stackGrowth *= -1;
Bill Wendling94d04b82009-05-20 23:21:38 +00003525
3526 // Start the dwarf frame section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00003527 Asm->OutStreamer.SwitchSection(
3528 Asm->getObjFileLowering().getDwarfFrameSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00003529
Chris Lattnerc0215722010-04-04 19:25:43 +00003530 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_frame_common"));
Chris Lattner233f52b2010-03-09 23:52:58 +00003531 Asm->OutStreamer.AddComment("Length of Common Information Entry");
Chris Lattnera6437182010-04-04 19:58:12 +00003532 Asm->EmitLabelDifference(Asm->GetTempSymbol("debug_frame_common_end"),
3533 Asm->GetTempSymbol("debug_frame_common_begin"), 4);
Bill Wendling94d04b82009-05-20 23:21:38 +00003534
Chris Lattnerc0215722010-04-04 19:25:43 +00003535 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_frame_common_begin"));
Chris Lattner233f52b2010-03-09 23:52:58 +00003536 Asm->OutStreamer.AddComment("CIE Identifier Tag");
Bill Wendling94d04b82009-05-20 23:21:38 +00003537 Asm->EmitInt32((int)dwarf::DW_CIE_ID);
Chris Lattner233f52b2010-03-09 23:52:58 +00003538 Asm->OutStreamer.AddComment("CIE Version");
Bill Wendling94d04b82009-05-20 23:21:38 +00003539 Asm->EmitInt8(dwarf::DW_CIE_VERSION);
Chris Lattner233f52b2010-03-09 23:52:58 +00003540 Asm->OutStreamer.AddComment("CIE Augmentation");
Chris Lattner4cf202b2010-01-23 03:11:46 +00003541 Asm->OutStreamer.EmitIntValue(0, 1, /*addrspace*/0); // nul terminator.
Chris Lattner7e1a8f82010-04-04 19:09:29 +00003542 Asm->EmitULEB128(1, "CIE Code Alignment Factor");
3543 Asm->EmitSLEB128(stackGrowth, "CIE Data Alignment Factor");
Chris Lattner233f52b2010-03-09 23:52:58 +00003544 Asm->OutStreamer.AddComment("CIE RA Column");
Chris Lattnerd38fee82010-04-05 00:13:49 +00003545 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
Anton Korobeynikov16c29b52011-01-10 12:39:04 +00003546 const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
Bill Wendling94d04b82009-05-20 23:21:38 +00003547 Asm->EmitInt8(RI->getDwarfRegNum(RI->getRARegister(), false));
Bill Wendling94d04b82009-05-20 23:21:38 +00003548
3549 std::vector<MachineMove> Moves;
Anton Korobeynikovd9e33852010-11-18 23:25:52 +00003550 TFI->getInitialFrameState(Moves);
Bill Wendling94d04b82009-05-20 23:21:38 +00003551
Chris Lattner02b86b92010-04-04 23:41:46 +00003552 Asm->EmitFrameMoves(Moves, 0, false);
Bill Wendling94d04b82009-05-20 23:21:38 +00003553
Chris Lattner059ea132010-04-28 01:05:45 +00003554 Asm->EmitAlignment(2);
Chris Lattnerc0215722010-04-04 19:25:43 +00003555 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_frame_common_end"));
Bill Wendling94d04b82009-05-20 23:21:38 +00003556}
3557
Devang Patel2c4ceb12009-11-21 02:48:08 +00003558/// emitFunctionDebugFrame - Emit per function frame info into a debug frame
Bill Wendling94d04b82009-05-20 23:21:38 +00003559/// section.
Chris Lattner206d61e2010-03-13 07:26:18 +00003560void DwarfDebug::
3561emitFunctionDebugFrame(const FunctionDebugFrameInfo &DebugFrameInfo) {
Chris Lattnerd38fee82010-04-05 00:13:49 +00003562 if (!Asm->MAI->doesDwarfRequireFrameSection())
Bill Wendling94d04b82009-05-20 23:21:38 +00003563 return;
3564
3565 // Start the dwarf frame section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00003566 Asm->OutStreamer.SwitchSection(
3567 Asm->getObjFileLowering().getDwarfFrameSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00003568
Chris Lattner233f52b2010-03-09 23:52:58 +00003569 Asm->OutStreamer.AddComment("Length of Frame Information Entry");
Chris Lattner206d61e2010-03-13 07:26:18 +00003570 MCSymbol *DebugFrameBegin =
Chris Lattnerc0215722010-04-04 19:25:43 +00003571 Asm->GetTempSymbol("debug_frame_begin", DebugFrameInfo.Number);
Chris Lattner206d61e2010-03-13 07:26:18 +00003572 MCSymbol *DebugFrameEnd =
Chris Lattnerc0215722010-04-04 19:25:43 +00003573 Asm->GetTempSymbol("debug_frame_end", DebugFrameInfo.Number);
Chris Lattnera6437182010-04-04 19:58:12 +00003574 Asm->EmitLabelDifference(DebugFrameEnd, DebugFrameBegin, 4);
Bill Wendling94d04b82009-05-20 23:21:38 +00003575
Chris Lattner206d61e2010-03-13 07:26:18 +00003576 Asm->OutStreamer.EmitLabel(DebugFrameBegin);
Bill Wendling94d04b82009-05-20 23:21:38 +00003577
Chris Lattner233f52b2010-03-09 23:52:58 +00003578 Asm->OutStreamer.AddComment("FDE CIE offset");
Jim Grosbach1e20b962010-07-21 21:21:52 +00003579 Asm->EmitSectionOffset(Asm->GetTempSymbol("debug_frame_common"),
Chris Lattner6189ed12010-04-04 23:25:33 +00003580 DwarfFrameSectionSym);
Bill Wendling94d04b82009-05-20 23:21:38 +00003581
Chris Lattner233f52b2010-03-09 23:52:58 +00003582 Asm->OutStreamer.AddComment("FDE initial location");
Chris Lattnerc0215722010-04-04 19:25:43 +00003583 MCSymbol *FuncBeginSym =
3584 Asm->GetTempSymbol("func_begin", DebugFrameInfo.Number);
Chris Lattnerfb658072010-03-13 07:40:56 +00003585 Asm->OutStreamer.EmitSymbolValue(FuncBeginSym,
Chris Lattnerd38fee82010-04-05 00:13:49 +00003586 Asm->getTargetData().getPointerSize(),
3587 0/*AddrSpace*/);
Jim Grosbach1e20b962010-07-21 21:21:52 +00003588
3589
Chris Lattner233f52b2010-03-09 23:52:58 +00003590 Asm->OutStreamer.AddComment("FDE address range");
Chris Lattnera6437182010-04-04 19:58:12 +00003591 Asm->EmitLabelDifference(Asm->GetTempSymbol("func_end",DebugFrameInfo.Number),
Chris Lattnerd38fee82010-04-05 00:13:49 +00003592 FuncBeginSym, Asm->getTargetData().getPointerSize());
Bill Wendling94d04b82009-05-20 23:21:38 +00003593
Chris Lattner02b86b92010-04-04 23:41:46 +00003594 Asm->EmitFrameMoves(DebugFrameInfo.Moves, FuncBeginSym, false);
Bill Wendling94d04b82009-05-20 23:21:38 +00003595
Chris Lattner059ea132010-04-28 01:05:45 +00003596 Asm->EmitAlignment(2);
Chris Lattner206d61e2010-03-13 07:26:18 +00003597 Asm->OutStreamer.EmitLabel(DebugFrameEnd);
Bill Wendling94d04b82009-05-20 23:21:38 +00003598}
3599
Devang Patel8a241142009-12-09 18:24:21 +00003600/// emitDebugPubNames - Emit visible names into a debug pubnames section.
3601///
3602void DwarfDebug::emitDebugPubNames() {
Devang Patel163a9f72010-05-10 22:49:55 +00003603 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
3604 E = CUMap.end(); I != E; ++I) {
3605 CompileUnit *TheCU = I->second;
3606 // Start the dwarf pubnames section.
3607 Asm->OutStreamer.SwitchSection(
3608 Asm->getObjFileLowering().getDwarfPubNamesSection());
Jim Grosbach1e20b962010-07-21 21:21:52 +00003609
Devang Patel163a9f72010-05-10 22:49:55 +00003610 Asm->OutStreamer.AddComment("Length of Public Names Info");
3611 Asm->EmitLabelDifference(
3612 Asm->GetTempSymbol("pubnames_end", TheCU->getID()),
3613 Asm->GetTempSymbol("pubnames_begin", TheCU->getID()), 4);
Jim Grosbach1e20b962010-07-21 21:21:52 +00003614
Devang Patel163a9f72010-05-10 22:49:55 +00003615 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_begin",
3616 TheCU->getID()));
Jim Grosbach1e20b962010-07-21 21:21:52 +00003617
Devang Patel163a9f72010-05-10 22:49:55 +00003618 Asm->OutStreamer.AddComment("DWARF Version");
Jim Grosbach1e20b962010-07-21 21:21:52 +00003619 Asm->EmitInt16(dwarf::DWARF_VERSION);
3620
Devang Patel163a9f72010-05-10 22:49:55 +00003621 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
Jim Grosbach1e20b962010-07-21 21:21:52 +00003622 Asm->EmitSectionOffset(Asm->GetTempSymbol("info_begin", TheCU->getID()),
Devang Patel163a9f72010-05-10 22:49:55 +00003623 DwarfInfoSectionSym);
Jim Grosbach1e20b962010-07-21 21:21:52 +00003624
Devang Patel163a9f72010-05-10 22:49:55 +00003625 Asm->OutStreamer.AddComment("Compilation Unit Length");
3626 Asm->EmitLabelDifference(Asm->GetTempSymbol("info_end", TheCU->getID()),
3627 Asm->GetTempSymbol("info_begin", TheCU->getID()),
3628 4);
Jim Grosbach1e20b962010-07-21 21:21:52 +00003629
Devang Patel163a9f72010-05-10 22:49:55 +00003630 const StringMap<DIE*> &Globals = TheCU->getGlobals();
3631 for (StringMap<DIE*>::const_iterator
3632 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
3633 const char *Name = GI->getKeyData();
3634 DIE *Entity = GI->second;
Jim Grosbach1e20b962010-07-21 21:21:52 +00003635
Devang Patel163a9f72010-05-10 22:49:55 +00003636 Asm->OutStreamer.AddComment("DIE offset");
3637 Asm->EmitInt32(Entity->getOffset());
Jim Grosbach1e20b962010-07-21 21:21:52 +00003638
Devang Patel163a9f72010-05-10 22:49:55 +00003639 if (Asm->isVerbose())
3640 Asm->OutStreamer.AddComment("External Name");
3641 Asm->OutStreamer.EmitBytes(StringRef(Name, strlen(Name)+1), 0);
3642 }
Jim Grosbach1e20b962010-07-21 21:21:52 +00003643
Devang Patel163a9f72010-05-10 22:49:55 +00003644 Asm->OutStreamer.AddComment("End Mark");
3645 Asm->EmitInt32(0);
3646 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_end",
3647 TheCU->getID()));
Bill Wendling94d04b82009-05-20 23:21:38 +00003648 }
Bill Wendling94d04b82009-05-20 23:21:38 +00003649}
3650
Devang Patel193f7202009-11-24 01:14:22 +00003651void DwarfDebug::emitDebugPubTypes() {
Devang Patel163a9f72010-05-10 22:49:55 +00003652 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
3653 E = CUMap.end(); I != E; ++I) {
3654 CompileUnit *TheCU = I->second;
3655 // Start the dwarf pubnames section.
3656 Asm->OutStreamer.SwitchSection(
3657 Asm->getObjFileLowering().getDwarfPubTypesSection());
3658 Asm->OutStreamer.AddComment("Length of Public Types Info");
3659 Asm->EmitLabelDifference(
3660 Asm->GetTempSymbol("pubtypes_end", TheCU->getID()),
3661 Asm->GetTempSymbol("pubtypes_begin", TheCU->getID()), 4);
Jim Grosbach1e20b962010-07-21 21:21:52 +00003662
Devang Patel163a9f72010-05-10 22:49:55 +00003663 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_begin",
3664 TheCU->getID()));
Jim Grosbach1e20b962010-07-21 21:21:52 +00003665
Devang Patel163a9f72010-05-10 22:49:55 +00003666 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DWARF Version");
3667 Asm->EmitInt16(dwarf::DWARF_VERSION);
Jim Grosbach1e20b962010-07-21 21:21:52 +00003668
Devang Patel163a9f72010-05-10 22:49:55 +00003669 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
3670 Asm->EmitSectionOffset(Asm->GetTempSymbol("info_begin", TheCU->getID()),
3671 DwarfInfoSectionSym);
Jim Grosbach1e20b962010-07-21 21:21:52 +00003672
Devang Patel163a9f72010-05-10 22:49:55 +00003673 Asm->OutStreamer.AddComment("Compilation Unit Length");
3674 Asm->EmitLabelDifference(Asm->GetTempSymbol("info_end", TheCU->getID()),
3675 Asm->GetTempSymbol("info_begin", TheCU->getID()),
3676 4);
Jim Grosbach1e20b962010-07-21 21:21:52 +00003677
Devang Patel163a9f72010-05-10 22:49:55 +00003678 const StringMap<DIE*> &Globals = TheCU->getGlobalTypes();
3679 for (StringMap<DIE*>::const_iterator
3680 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
3681 const char *Name = GI->getKeyData();
3682 DIE * Entity = GI->second;
Jim Grosbach1e20b962010-07-21 21:21:52 +00003683
Devang Patel163a9f72010-05-10 22:49:55 +00003684 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
3685 Asm->EmitInt32(Entity->getOffset());
Jim Grosbach1e20b962010-07-21 21:21:52 +00003686
Devang Patel163a9f72010-05-10 22:49:55 +00003687 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("External Name");
3688 Asm->OutStreamer.EmitBytes(StringRef(Name, GI->getKeyLength()+1), 0);
3689 }
Jim Grosbach1e20b962010-07-21 21:21:52 +00003690
Devang Patel163a9f72010-05-10 22:49:55 +00003691 Asm->OutStreamer.AddComment("End Mark");
Jim Grosbach1e20b962010-07-21 21:21:52 +00003692 Asm->EmitInt32(0);
Devang Patel163a9f72010-05-10 22:49:55 +00003693 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_end",
3694 TheCU->getID()));
Devang Patel193f7202009-11-24 01:14:22 +00003695 }
Devang Patel193f7202009-11-24 01:14:22 +00003696}
3697
Devang Patel2c4ceb12009-11-21 02:48:08 +00003698/// emitDebugStr - Emit visible names into a debug str section.
Bill Wendling94d04b82009-05-20 23:21:38 +00003699///
Devang Patel2c4ceb12009-11-21 02:48:08 +00003700void DwarfDebug::emitDebugStr() {
Bill Wendling94d04b82009-05-20 23:21:38 +00003701 // Check to see if it is worth the effort.
Chris Lattner0d9d70f2010-03-09 23:38:23 +00003702 if (StringPool.empty()) return;
Jim Grosbach1e20b962010-07-21 21:21:52 +00003703
Chris Lattner0d9d70f2010-03-09 23:38:23 +00003704 // Start the dwarf str section.
3705 Asm->OutStreamer.SwitchSection(
Chris Lattner6c2f9e12009-08-19 05:49:37 +00003706 Asm->getObjFileLowering().getDwarfStrSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00003707
Chris Lattnerbc733f52010-03-13 02:17:42 +00003708 // Get all of the string pool entries and put them in an array by their ID so
3709 // we can sort them.
Jim Grosbach1e20b962010-07-21 21:21:52 +00003710 SmallVector<std::pair<unsigned,
Chris Lattnerbc733f52010-03-13 02:17:42 +00003711 StringMapEntry<std::pair<MCSymbol*, unsigned> >*>, 64> Entries;
Jim Grosbach1e20b962010-07-21 21:21:52 +00003712
Chris Lattnerbc733f52010-03-13 02:17:42 +00003713 for (StringMap<std::pair<MCSymbol*, unsigned> >::iterator
3714 I = StringPool.begin(), E = StringPool.end(); I != E; ++I)
3715 Entries.push_back(std::make_pair(I->second.second, &*I));
Jim Grosbach1e20b962010-07-21 21:21:52 +00003716
Chris Lattnerbc733f52010-03-13 02:17:42 +00003717 array_pod_sort(Entries.begin(), Entries.end());
Jim Grosbach1e20b962010-07-21 21:21:52 +00003718
Chris Lattnerbc733f52010-03-13 02:17:42 +00003719 for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
Chris Lattner0d9d70f2010-03-09 23:38:23 +00003720 // Emit a label for reference from debug information entries.
Chris Lattnerbc733f52010-03-13 02:17:42 +00003721 Asm->OutStreamer.EmitLabel(Entries[i].second->getValue().first);
Jim Grosbach1e20b962010-07-21 21:21:52 +00003722
Chris Lattner0d9d70f2010-03-09 23:38:23 +00003723 // Emit the string itself.
Chris Lattnerbc733f52010-03-13 02:17:42 +00003724 Asm->OutStreamer.EmitBytes(Entries[i].second->getKey(), 0/*addrspace*/);
Bill Wendling94d04b82009-05-20 23:21:38 +00003725 }
3726}
3727
Devang Patel2c4ceb12009-11-21 02:48:08 +00003728/// emitDebugLoc - Emit visible names into a debug loc section.
Bill Wendling94d04b82009-05-20 23:21:38 +00003729///
Devang Patel2c4ceb12009-11-21 02:48:08 +00003730void DwarfDebug::emitDebugLoc() {
Devang Patel80250682010-05-26 23:55:23 +00003731 if (DotDebugLocEntries.empty())
3732 return;
3733
Devang Patel6c3ea902011-02-04 22:57:18 +00003734 for (SmallVector<DotDebugLocEntry, 4>::iterator
3735 I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
3736 I != E; ++I) {
3737 DotDebugLocEntry &Entry = *I;
3738 if (I + 1 != DotDebugLocEntries.end())
3739 Entry.Merge(I+1);
3740 }
3741
Daniel Dunbar83320a02011-03-16 22:16:39 +00003742 // Start the dwarf loc section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00003743 Asm->OutStreamer.SwitchSection(
Devang Patelc3f5f782010-05-25 23:40:22 +00003744 Asm->getObjFileLowering().getDwarfLocSection());
3745 unsigned char Size = Asm->getTargetData().getPointerSize();
Devang Patel80250682010-05-26 23:55:23 +00003746 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", 0));
3747 unsigned index = 1;
Jim Grosbach1e20b962010-07-21 21:21:52 +00003748 for (SmallVector<DotDebugLocEntry, 4>::iterator
3749 I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
Devang Patel61409622010-07-07 20:12:52 +00003750 I != E; ++I, ++index) {
Devang Patel6c3ea902011-02-04 22:57:18 +00003751 DotDebugLocEntry &Entry = *I;
3752 if (Entry.isMerged()) continue;
Devang Patelc3f5f782010-05-25 23:40:22 +00003753 if (Entry.isEmpty()) {
3754 Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
3755 Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
Devang Patel80250682010-05-26 23:55:23 +00003756 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", index));
Devang Patelc3f5f782010-05-25 23:40:22 +00003757 } else {
3758 Asm->OutStreamer.EmitSymbolValue(Entry.Begin, Size, 0);
3759 Asm->OutStreamer.EmitSymbolValue(Entry.End, Size, 0);
3760 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
3761 unsigned Reg = RI->getDwarfRegNum(Entry.Loc.getReg(), false);
Devang Patelb2cf5812010-08-04 18:40:52 +00003762 if (int Offset = Entry.Loc.getOffset()) {
3763 // If the value is at a certain offset from frame register then
3764 // use DW_OP_fbreg.
3765 unsigned OffsetSize = Offset ? MCAsmInfo::getSLEB128Size(Offset) : 1;
Devang Patelc3f5f782010-05-25 23:40:22 +00003766 Asm->OutStreamer.AddComment("Loc expr size");
Devang Patelb2cf5812010-08-04 18:40:52 +00003767 Asm->EmitInt16(1 + OffsetSize);
3768 Asm->OutStreamer.AddComment(
3769 dwarf::OperationEncodingString(dwarf::DW_OP_fbreg));
3770 Asm->EmitInt8(dwarf::DW_OP_fbreg);
3771 Asm->OutStreamer.AddComment("Offset");
3772 Asm->EmitSLEB128(Offset);
Devang Patelc3f5f782010-05-25 23:40:22 +00003773 } else {
Devang Patelb2cf5812010-08-04 18:40:52 +00003774 if (Reg < 32) {
3775 Asm->OutStreamer.AddComment("Loc expr size");
3776 Asm->EmitInt16(1);
3777 Asm->OutStreamer.AddComment(
Devang Patela54e0cc2010-08-04 20:32:36 +00003778 dwarf::OperationEncodingString(dwarf::DW_OP_reg0 + Reg));
Devang Patelb2cf5812010-08-04 18:40:52 +00003779 Asm->EmitInt8(dwarf::DW_OP_reg0 + Reg);
3780 } else {
3781 Asm->OutStreamer.AddComment("Loc expr size");
3782 Asm->EmitInt16(1 + MCAsmInfo::getULEB128Size(Reg));
3783 Asm->EmitInt8(dwarf::DW_OP_regx);
3784 Asm->EmitULEB128(Reg);
3785 }
Devang Patelc3f5f782010-05-25 23:40:22 +00003786 }
3787 }
3788 }
Bill Wendling94d04b82009-05-20 23:21:38 +00003789}
3790
3791/// EmitDebugARanges - Emit visible names into a debug aranges section.
3792///
3793void DwarfDebug::EmitDebugARanges() {
3794 // Start the dwarf aranges section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00003795 Asm->OutStreamer.SwitchSection(
3796 Asm->getObjFileLowering().getDwarfARangesSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00003797}
3798
Devang Patel2c4ceb12009-11-21 02:48:08 +00003799/// emitDebugRanges - Emit visible names into a debug ranges section.
Bill Wendling94d04b82009-05-20 23:21:38 +00003800///
Devang Patel2c4ceb12009-11-21 02:48:08 +00003801void DwarfDebug::emitDebugRanges() {
Bill Wendling94d04b82009-05-20 23:21:38 +00003802 // Start the dwarf ranges section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00003803 Asm->OutStreamer.SwitchSection(
Devang Patelf2548ca2010-04-16 23:33:45 +00003804 Asm->getObjFileLowering().getDwarfRangesSection());
Devang Pateleac9c072010-04-27 19:46:33 +00003805 unsigned char Size = Asm->getTargetData().getPointerSize();
3806 for (SmallVector<const MCSymbol *, 8>::iterator
Jim Grosbach1e20b962010-07-21 21:21:52 +00003807 I = DebugRangeSymbols.begin(), E = DebugRangeSymbols.end();
Devang Pateleac9c072010-04-27 19:46:33 +00003808 I != E; ++I) {
3809 if (*I)
3810 Asm->OutStreamer.EmitSymbolValue(const_cast<MCSymbol*>(*I), Size, 0);
Devang Patelf2548ca2010-04-16 23:33:45 +00003811 else
Devang Pateleac9c072010-04-27 19:46:33 +00003812 Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
Devang Patelf2548ca2010-04-16 23:33:45 +00003813 }
Bill Wendling94d04b82009-05-20 23:21:38 +00003814}
3815
Devang Patel2c4ceb12009-11-21 02:48:08 +00003816/// emitDebugMacInfo - Emit visible names into a debug macinfo section.
Bill Wendling94d04b82009-05-20 23:21:38 +00003817///
Devang Patel2c4ceb12009-11-21 02:48:08 +00003818void DwarfDebug::emitDebugMacInfo() {
Daniel Dunbarf612ff62009-09-19 20:40:05 +00003819 if (const MCSection *LineInfo =
Chris Lattner18a4c162009-08-02 07:24:22 +00003820 Asm->getObjFileLowering().getDwarfMacroInfoSection()) {
Bill Wendling94d04b82009-05-20 23:21:38 +00003821 // Start the dwarf macinfo section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00003822 Asm->OutStreamer.SwitchSection(LineInfo);
Bill Wendling94d04b82009-05-20 23:21:38 +00003823 }
3824}
3825
Devang Patel2c4ceb12009-11-21 02:48:08 +00003826/// emitDebugInlineInfo - Emit inline info using following format.
Bill Wendling94d04b82009-05-20 23:21:38 +00003827/// Section Header:
3828/// 1. length of section
3829/// 2. Dwarf version number
3830/// 3. address size.
3831///
3832/// Entries (one "entry" for each function that was inlined):
3833///
3834/// 1. offset into __debug_str section for MIPS linkage name, if exists;
3835/// otherwise offset into __debug_str for regular function name.
3836/// 2. offset into __debug_str section for regular function name.
3837/// 3. an unsigned LEB128 number indicating the number of distinct inlining
3838/// instances for the function.
3839///
3840/// The rest of the entry consists of a {die_offset, low_pc} pair for each
3841/// inlined instance; the die_offset points to the inlined_subroutine die in the
3842/// __debug_info section, and the low_pc is the starting address for the
3843/// inlining instance.
Devang Patel2c4ceb12009-11-21 02:48:08 +00003844void DwarfDebug::emitDebugInlineInfo() {
Chris Lattnerd38fee82010-04-05 00:13:49 +00003845 if (!Asm->MAI->doesDwarfUsesInlineInfoSection())
Bill Wendling94d04b82009-05-20 23:21:38 +00003846 return;
3847
Devang Patel163a9f72010-05-10 22:49:55 +00003848 if (!FirstCU)
Bill Wendling94d04b82009-05-20 23:21:38 +00003849 return;
3850
Chris Lattner6c2f9e12009-08-19 05:49:37 +00003851 Asm->OutStreamer.SwitchSection(
3852 Asm->getObjFileLowering().getDwarfDebugInlineSection());
Chris Lattner0ad9c912010-01-22 22:09:00 +00003853
Chris Lattner233f52b2010-03-09 23:52:58 +00003854 Asm->OutStreamer.AddComment("Length of Debug Inlined Information Entry");
Chris Lattnera6437182010-04-04 19:58:12 +00003855 Asm->EmitLabelDifference(Asm->GetTempSymbol("debug_inlined_end", 1),
3856 Asm->GetTempSymbol("debug_inlined_begin", 1), 4);
Bill Wendling94d04b82009-05-20 23:21:38 +00003857
Chris Lattnerc0215722010-04-04 19:25:43 +00003858 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_begin", 1));
Bill Wendling94d04b82009-05-20 23:21:38 +00003859
Chris Lattner233f52b2010-03-09 23:52:58 +00003860 Asm->OutStreamer.AddComment("Dwarf Version");
3861 Asm->EmitInt16(dwarf::DWARF_VERSION);
3862 Asm->OutStreamer.AddComment("Address Size (in bytes)");
Chris Lattnerd38fee82010-04-05 00:13:49 +00003863 Asm->EmitInt8(Asm->getTargetData().getPointerSize());
Bill Wendling94d04b82009-05-20 23:21:38 +00003864
Devang Patele9f8f5e2010-05-07 20:54:48 +00003865 for (SmallVector<const MDNode *, 4>::iterator I = InlinedSPNodes.begin(),
Devang Patel53bb5c92009-11-10 23:06:00 +00003866 E = InlinedSPNodes.end(); I != E; ++I) {
Jim Grosbach31ef40e2009-11-21 23:12:12 +00003867
Devang Patele9f8f5e2010-05-07 20:54:48 +00003868 const MDNode *Node = *I;
3869 DenseMap<const MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator II
Jim Grosbach7ab38df2009-11-22 19:20:36 +00003870 = InlineInfo.find(Node);
Devang Patel53bb5c92009-11-10 23:06:00 +00003871 SmallVector<InlineInfoLabels, 4> &Labels = II->second;
Devang Patele4b27562009-08-28 23:24:31 +00003872 DISubprogram SP(Node);
Devang Patel65dbc902009-11-25 17:36:49 +00003873 StringRef LName = SP.getLinkageName();
3874 StringRef Name = SP.getName();
Bill Wendling94d04b82009-05-20 23:21:38 +00003875
Chris Lattner233f52b2010-03-09 23:52:58 +00003876 Asm->OutStreamer.AddComment("MIPS linkage name");
Chris Lattner4cf202b2010-01-23 03:11:46 +00003877 if (LName.empty()) {
3878 Asm->OutStreamer.EmitBytes(Name, 0);
3879 Asm->OutStreamer.EmitIntValue(0, 1, 0); // nul terminator.
Jim Grosbach1e20b962010-07-21 21:21:52 +00003880 } else
Chris Lattner6189ed12010-04-04 23:25:33 +00003881 Asm->EmitSectionOffset(getStringPoolEntry(getRealLinkageName(LName)),
3882 DwarfStrSectionSym);
Devang Patel53bb5c92009-11-10 23:06:00 +00003883
Chris Lattner233f52b2010-03-09 23:52:58 +00003884 Asm->OutStreamer.AddComment("Function name");
Chris Lattner6189ed12010-04-04 23:25:33 +00003885 Asm->EmitSectionOffset(getStringPoolEntry(Name), DwarfStrSectionSym);
Chris Lattner7e1a8f82010-04-04 19:09:29 +00003886 Asm->EmitULEB128(Labels.size(), "Inline count");
Bill Wendling94d04b82009-05-20 23:21:38 +00003887
Devang Patel53bb5c92009-11-10 23:06:00 +00003888 for (SmallVector<InlineInfoLabels, 4>::iterator LI = Labels.begin(),
Bill Wendling94d04b82009-05-20 23:21:38 +00003889 LE = Labels.end(); LI != LE; ++LI) {
Chris Lattner3f53c832010-04-04 18:52:31 +00003890 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
Chris Lattner6ed0f902010-03-09 00:31:02 +00003891 Asm->EmitInt32(LI->second->getOffset());
Bill Wendling94d04b82009-05-20 23:21:38 +00003892
Chris Lattner3f53c832010-04-04 18:52:31 +00003893 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("low_pc");
Chris Lattnerd38fee82010-04-05 00:13:49 +00003894 Asm->OutStreamer.EmitSymbolValue(LI->first,
3895 Asm->getTargetData().getPointerSize(),0);
Bill Wendling94d04b82009-05-20 23:21:38 +00003896 }
3897 }
3898
Chris Lattnerc0215722010-04-04 19:25:43 +00003899 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_end", 1));
Bill Wendling94d04b82009-05-20 23:21:38 +00003900}