blob: e2767b9e18762d79f5c8ddf4c1a22d3845f2d898 [file] [log] [blame]
Bill Wendling2f921f82009-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 Lattnerb14490d2010-03-09 00:39:24 +000013
Devang Patel80ae3492009-08-28 23:24:31 +000014#define DEBUG_TYPE "dwarfdebug"
Bill Wendling2f921f82009-05-15 09:23:25 +000015#include "DwarfDebug.h"
Chris Lattner3f3fb972010-04-05 05:24:55 +000016#include "DIE.h"
Bill Wendling30346342010-04-05 22:59:21 +000017#include "llvm/Constants.h"
Bill Wendling2f921f82009-05-15 09:23:25 +000018#include "llvm/Module.h"
David Greene829b3e82009-08-19 21:52:55 +000019#include "llvm/CodeGen/MachineFunction.h"
Bill Wendling2f921f82009-05-15 09:23:25 +000020#include "llvm/CodeGen/MachineModuleInfo.h"
Chris Lattnere13c3722010-03-09 01:58:53 +000021#include "llvm/MC/MCAsmInfo.h"
Chris Lattner4d2c0f92009-07-31 18:48:30 +000022#include "llvm/MC/MCSection.h"
Chris Lattner4b7dadb2009-08-19 05:49:37 +000023#include "llvm/MC/MCStreamer.h"
Chris Lattnere13c3722010-03-09 01:58:53 +000024#include "llvm/MC/MCSymbol.h"
Chris Lattnerf62e3ee2010-01-16 21:57:06 +000025#include "llvm/Target/Mangler.h"
Bill Wendling2f921f82009-05-15 09:23:25 +000026#include "llvm/Target/TargetData.h"
27#include "llvm/Target/TargetFrameInfo.h"
Chris Lattner5e693ed2009-07-28 03:13:23 +000028#include "llvm/Target/TargetLoweringObjectFile.h"
Chris Lattner21dc46e2010-04-04 18:06:11 +000029#include "llvm/Target/TargetMachine.h"
Chris Lattner5e693ed2009-07-28 03:13:23 +000030#include "llvm/Target/TargetRegisterInfo.h"
Chris Lattner3f3fb972010-04-05 05:24:55 +000031#include "llvm/Analysis/DebugInfo.h"
Jeffrey Yasskin35b4e4f2010-03-12 17:45:06 +000032#include "llvm/ADT/STLExtras.h"
Chris Lattner06fa1762009-08-24 03:52:50 +000033#include "llvm/ADT/StringExtras.h"
Daniel Dunbarcdf01b52009-10-13 06:47:08 +000034#include "llvm/Support/Debug.h"
35#include "llvm/Support/ErrorHandling.h"
Devang Patel1973df22010-01-26 21:39:14 +000036#include "llvm/Support/ValueHandle.h"
Chris Lattnerf5c834f2010-01-22 22:09:00 +000037#include "llvm/Support/FormattedStream.h"
Chris Lattner4d2c0f92009-07-31 18:48:30 +000038#include "llvm/Support/Timer.h"
39#include "llvm/System/Path.h"
Bill Wendling2f921f82009-05-15 09:23:25 +000040using namespace llvm;
41
Bill Wendlingfcc14142010-04-07 09:28:04 +000042namespace {
43 const char *DWARFGroupName = "DWARF Emission";
44 const char *DbgTimerName = "DWARF Debug Writer";
45} // end anonymous namespace
46
Bill Wendling2f921f82009-05-15 09:23:25 +000047//===----------------------------------------------------------------------===//
48
49/// Configuration values for initial hash set sizes (log2).
50///
Bill Wendling2f921f82009-05-15 09:23:25 +000051static const unsigned InitAbbreviationsSetSize = 9; // log2(512)
Bill Wendling2f921f82009-05-15 09:23:25 +000052
53namespace llvm {
54
55//===----------------------------------------------------------------------===//
56/// CompileUnit - This dwarf writer support class manages information associate
57/// with a source file.
Nick Lewyckyb7993d62009-11-17 08:11:44 +000058class CompileUnit {
Bill Wendling2f921f82009-05-15 09:23:25 +000059 /// ID - File identifier for source.
60 ///
61 unsigned ID;
62
63 /// Die - Compile unit debug information entry.
64 ///
Jeffrey Yasskin35b4e4f2010-03-12 17:45:06 +000065 const OwningPtr<DIE> CUDie;
Bill Wendling2f921f82009-05-15 09:23:25 +000066
Jeffrey Yasskin0708de12010-03-11 18:29:55 +000067 /// IndexTyDie - An anonymous type for index type. Owned by CUDie.
Devang Patel92e8c652009-11-21 00:31:03 +000068 DIE *IndexTyDie;
69
Bill Wendling2f921f82009-05-15 09:23:25 +000070 /// GVToDieMap - Tracks the mapping of unit level debug informaton
71 /// variables to debug information entries.
Devang Patel80ae3492009-08-28 23:24:31 +000072 /// FIXME : Rename GVToDieMap -> NodeToDieMap
Devang Patel018b29b2010-01-19 06:19:05 +000073 DenseMap<MDNode *, DIE *> GVToDieMap;
Bill Wendling2f921f82009-05-15 09:23:25 +000074
75 /// GVToDIEEntryMap - Tracks the mapping of unit level debug informaton
76 /// descriptors to debug information entries using a DIEEntry proxy.
Devang Patel80ae3492009-08-28 23:24:31 +000077 /// FIXME : Rename
Devang Patel018b29b2010-01-19 06:19:05 +000078 DenseMap<MDNode *, DIEEntry *> GVToDIEEntryMap;
Bill Wendling2f921f82009-05-15 09:23:25 +000079
80 /// Globals - A map of globally visible named entities for this unit.
81 ///
82 StringMap<DIE*> Globals;
83
Devang Patel04d2f2d2009-11-24 01:14:22 +000084 /// GlobalTypes - A map of globally visible types for this unit.
85 ///
86 StringMap<DIE*> GlobalTypes;
87
Bill Wendling2f921f82009-05-15 09:23:25 +000088public:
89 CompileUnit(unsigned I, DIE *D)
Devang Patel930143b2009-11-21 02:48:08 +000090 : ID(I), CUDie(D), IndexTyDie(0) {}
Bill Wendling2f921f82009-05-15 09:23:25 +000091
92 // Accessors.
Devang Patel04d2f2d2009-11-24 01:14:22 +000093 unsigned getID() const { return ID; }
Jeffrey Yasskin0708de12010-03-11 18:29:55 +000094 DIE* getCUDie() const { return CUDie.get(); }
Devang Patel04d2f2d2009-11-24 01:14:22 +000095 const StringMap<DIE*> &getGlobals() const { return Globals; }
96 const StringMap<DIE*> &getGlobalTypes() const { return GlobalTypes; }
Bill Wendling2f921f82009-05-15 09:23:25 +000097
98 /// hasContent - Return true if this compile unit has something to write out.
99 ///
Devang Patel930143b2009-11-21 02:48:08 +0000100 bool hasContent() const { return !CUDie->getChildren().empty(); }
Bill Wendling2f921f82009-05-15 09:23:25 +0000101
Devang Patel930143b2009-11-21 02:48:08 +0000102 /// addGlobal - Add a new global entity to the compile unit.
Bill Wendling2f921f82009-05-15 09:23:25 +0000103 ///
Benjamin Kramer96956ed2010-03-31 20:15:45 +0000104 void addGlobal(StringRef Name, DIE *Die) { Globals[Name] = Die; }
Bill Wendling2f921f82009-05-15 09:23:25 +0000105
Devang Patel04d2f2d2009-11-24 01:14:22 +0000106 /// addGlobalType - Add a new global type to the compile unit.
107 ///
Benjamin Kramer96956ed2010-03-31 20:15:45 +0000108 void addGlobalType(StringRef Name, DIE *Die) {
Devang Patel04d2f2d2009-11-24 01:14:22 +0000109 GlobalTypes[Name] = Die;
110 }
111
Devang Patele064ad42009-11-20 21:37:22 +0000112 /// getDIE - Returns the debug information entry map slot for the
Bill Wendling2f921f82009-05-15 09:23:25 +0000113 /// specified debug variable.
Devang Patele064ad42009-11-20 21:37:22 +0000114 DIE *getDIE(MDNode *N) { return GVToDieMap.lookup(N); }
Jim Grosbach042483e2009-11-21 23:12:12 +0000115
Devang Patele064ad42009-11-20 21:37:22 +0000116 /// insertDIE - Insert DIE into the map.
117 void insertDIE(MDNode *N, DIE *D) {
118 GVToDieMap.insert(std::make_pair(N, D));
119 }
Bill Wendling2f921f82009-05-15 09:23:25 +0000120
Devang Patele064ad42009-11-20 21:37:22 +0000121 /// getDIEEntry - Returns the debug information entry for the speciefied
122 /// debug variable.
Devang Patel1f4690c2009-12-15 19:16:48 +0000123 DIEEntry *getDIEEntry(MDNode *N) {
Devang Patel018b29b2010-01-19 06:19:05 +0000124 DenseMap<MDNode *, DIEEntry *>::iterator I = GVToDIEEntryMap.find(N);
Devang Patel1f4690c2009-12-15 19:16:48 +0000125 if (I == GVToDIEEntryMap.end())
126 return NULL;
127 return I->second;
128 }
Devang Patele064ad42009-11-20 21:37:22 +0000129
130 /// insertDIEEntry - Insert debug information entry into the map.
131 void insertDIEEntry(MDNode *N, DIEEntry *E) {
132 GVToDIEEntryMap.insert(std::make_pair(N, E));
Bill Wendling2f921f82009-05-15 09:23:25 +0000133 }
134
Devang Patel930143b2009-11-21 02:48:08 +0000135 /// addDie - Adds or interns the DIE to the compile unit.
Bill Wendling2f921f82009-05-15 09:23:25 +0000136 ///
Devang Patel930143b2009-11-21 02:48:08 +0000137 void addDie(DIE *Buffer) {
138 this->CUDie->addChild(Buffer);
Bill Wendling2f921f82009-05-15 09:23:25 +0000139 }
Devang Patel92e8c652009-11-21 00:31:03 +0000140
141 // getIndexTyDie - Get an anonymous type for index type.
142 DIE *getIndexTyDie() {
143 return IndexTyDie;
144 }
145
Jim Grosbach00e9c612009-11-22 19:20:36 +0000146 // setIndexTyDie - Set D as anonymous type for index which can be reused
147 // later.
Devang Patel92e8c652009-11-21 00:31:03 +0000148 void setIndexTyDie(DIE *D) {
149 IndexTyDie = D;
150 }
151
Bill Wendling2f921f82009-05-15 09:23:25 +0000152};
153
154//===----------------------------------------------------------------------===//
155/// DbgVariable - This class is used to track local variable information.
156///
Devang Patelf3d7c082009-11-16 21:53:40 +0000157class DbgVariable {
Bill Wendling2f921f82009-05-15 09:23:25 +0000158 DIVariable Var; // Variable Descriptor.
159 unsigned FrameIndex; // Variable frame index.
Devang Patela3e9c9c2010-03-15 18:33:46 +0000160 const MachineInstr *DbgValueMInsn; // DBG_VALUE
Devang Patel23b2ae62010-03-29 22:59:58 +0000161 // DbgValueLabel - DBG_VALUE is effective from this label.
162 MCSymbol *DbgValueLabel;
Jeffrey Yasskin35b4e4f2010-03-12 17:45:06 +0000163 DbgVariable *const AbstractVar; // Abstract variable for this variable.
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000164 DIE *TheDIE;
Bill Wendling2f921f82009-05-15 09:23:25 +0000165public:
Jeffrey Yasskin35b4e4f2010-03-12 17:45:06 +0000166 // AbsVar may be NULL.
167 DbgVariable(DIVariable V, unsigned I, DbgVariable *AbsVar)
Devang Patel23b2ae62010-03-29 22:59:58 +0000168 : Var(V), FrameIndex(I), DbgValueMInsn(0),
169 DbgValueLabel(0), AbstractVar(AbsVar), TheDIE(0) {}
Devang Patela3e9c9c2010-03-15 18:33:46 +0000170 DbgVariable(DIVariable V, const MachineInstr *MI, DbgVariable *AbsVar)
Devang Patel23b2ae62010-03-29 22:59:58 +0000171 : Var(V), FrameIndex(0), DbgValueMInsn(MI), DbgValueLabel(0),
172 AbstractVar(AbsVar), TheDIE(0)
Devang Patela3e9c9c2010-03-15 18:33:46 +0000173 {}
Bill Wendling2f921f82009-05-15 09:23:25 +0000174
175 // Accessors.
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000176 DIVariable getVariable() const { return Var; }
177 unsigned getFrameIndex() const { return FrameIndex; }
Devang Patela3e9c9c2010-03-15 18:33:46 +0000178 const MachineInstr *getDbgValue() const { return DbgValueMInsn; }
Devang Patel23b2ae62010-03-29 22:59:58 +0000179 MCSymbol *getDbgValueLabel() const { return DbgValueLabel; }
180 void setDbgValueLabel(MCSymbol *L) { DbgValueLabel = L; }
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000181 DbgVariable *getAbstractVariable() const { return AbstractVar; }
182 void setDIE(DIE *D) { TheDIE = D; }
183 DIE *getDIE() const { return TheDIE; }
Bill Wendling2f921f82009-05-15 09:23:25 +0000184};
185
186//===----------------------------------------------------------------------===//
187/// DbgScope - This class is used to track scope information.
188///
Devang Patelf3d7c082009-11-16 21:53:40 +0000189class DbgScope {
Bill Wendling2f921f82009-05-15 09:23:25 +0000190 DbgScope *Parent; // Parent to this scope.
Jim Grosbach042483e2009-11-21 23:12:12 +0000191 DIDescriptor Desc; // Debug info descriptor for scope.
Devang Patel1973df22010-01-26 21:39:14 +0000192 // Location at which this scope is inlined.
193 AssertingVH<MDNode> InlinedAtLocation;
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000194 bool AbstractScope; // Abstract Scope
Devang Patel787f94c2009-10-01 18:25:23 +0000195 const MachineInstr *LastInsn; // Last instruction of this scope.
196 const MachineInstr *FirstInsn; // First instruction of this scope.
Jeffrey Yasskin35b4e4f2010-03-12 17:45:06 +0000197 // Scopes defined in scope. Contents not owned.
198 SmallVector<DbgScope *, 4> Scopes;
199 // Variables declared in scope. Contents owned.
200 SmallVector<DbgVariable *, 8> Variables;
Daniel Dunbarc418d6b2009-09-19 20:40:05 +0000201
Owen Anderson9becc182009-06-24 22:53:20 +0000202 // Private state for dump()
203 mutable unsigned IndentLevel;
Bill Wendling2f921f82009-05-15 09:23:25 +0000204public:
Devang Patel6875c5eb2009-10-14 21:08:09 +0000205 DbgScope(DbgScope *P, DIDescriptor D, MDNode *I = 0)
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000206 : Parent(P), Desc(D), InlinedAtLocation(I), AbstractScope(false),
Devang Patel6875c5eb2009-10-14 21:08:09 +0000207 LastInsn(0), FirstInsn(0), IndentLevel(0) {}
Bill Wendling2f921f82009-05-15 09:23:25 +0000208 virtual ~DbgScope();
209
210 // Accessors.
211 DbgScope *getParent() const { return Parent; }
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000212 void setParent(DbgScope *P) { Parent = P; }
Bill Wendling2f921f82009-05-15 09:23:25 +0000213 DIDescriptor getDesc() const { return Desc; }
Chris Lattnerb7aa9522010-03-13 02:17:42 +0000214 MDNode *getInlinedAt() const { return InlinedAtLocation; }
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000215 MDNode *getScopeNode() const { return Desc.getNode(); }
Jeffrey Yasskin35b4e4f2010-03-12 17:45:06 +0000216 const SmallVector<DbgScope *, 4> &getScopes() { return Scopes; }
217 const SmallVector<DbgVariable *, 8> &getVariables() { return Variables; }
Devang Patel787f94c2009-10-01 18:25:23 +0000218 void setLastInsn(const MachineInstr *MI) { LastInsn = MI; }
219 const MachineInstr *getLastInsn() { return LastInsn; }
220 void setFirstInsn(const MachineInstr *MI) { FirstInsn = MI; }
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000221 void setAbstractScope() { AbstractScope = true; }
222 bool isAbstractScope() const { return AbstractScope; }
Devang Patel787f94c2009-10-01 18:25:23 +0000223 const MachineInstr *getFirstInsn() { return FirstInsn; }
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000224
Devang Patel930143b2009-11-21 02:48:08 +0000225 /// addScope - Add a scope to the scope.
Bill Wendling2f921f82009-05-15 09:23:25 +0000226 ///
Devang Patel930143b2009-11-21 02:48:08 +0000227 void addScope(DbgScope *S) { Scopes.push_back(S); }
Bill Wendling2f921f82009-05-15 09:23:25 +0000228
Devang Patel930143b2009-11-21 02:48:08 +0000229 /// addVariable - Add a variable to the scope.
Bill Wendling2f921f82009-05-15 09:23:25 +0000230 ///
Devang Patel930143b2009-11-21 02:48:08 +0000231 void addVariable(DbgVariable *V) { Variables.push_back(V); }
Bill Wendling2f921f82009-05-15 09:23:25 +0000232
Devang Patel530a0752010-01-04 20:44:00 +0000233 void fixInstructionMarkers(DenseMap<const MachineInstr *,
234 unsigned> &MIIndexMap) {
Chris Lattner8d2fe282010-03-31 05:36:29 +0000235 assert(getFirstInsn() && "First instruction is missing!");
Devang Patel530a0752010-01-04 20:44:00 +0000236
237 // Use the end of last child scope as end of this scope.
Jeffrey Yasskin35b4e4f2010-03-12 17:45:06 +0000238 const SmallVector<DbgScope *, 4> &Scopes = getScopes();
Devang Pateld146e2e2010-01-05 16:59:17 +0000239 const MachineInstr *LastInsn = getFirstInsn();
Devang Patel530a0752010-01-04 20:44:00 +0000240 unsigned LIndex = 0;
241 if (Scopes.empty()) {
Chris Lattner8d2fe282010-03-31 05:36:29 +0000242 assert(getLastInsn() && "Inner most scope does not have last insn!");
Devang Patel530a0752010-01-04 20:44:00 +0000243 return;
244 }
Jeffrey Yasskin35b4e4f2010-03-12 17:45:06 +0000245 for (SmallVector<DbgScope *, 4>::const_iterator SI = Scopes.begin(),
Devang Patel530a0752010-01-04 20:44:00 +0000246 SE = Scopes.end(); SI != SE; ++SI) {
247 DbgScope *DS = *SI;
248 DS->fixInstructionMarkers(MIIndexMap);
249 const MachineInstr *DSLastInsn = DS->getLastInsn();
250 unsigned DSI = MIIndexMap[DSLastInsn];
251 if (DSI > LIndex) {
252 LastInsn = DSLastInsn;
253 LIndex = DSI;
254 }
255 }
Devang Patelca55a042010-02-17 02:20:34 +0000256
257 unsigned CurrentLastInsnIndex = 0;
258 if (const MachineInstr *CL = getLastInsn())
259 CurrentLastInsnIndex = MIIndexMap[CL];
260 unsigned FIndex = MIIndexMap[getFirstInsn()];
261
262 // Set LastInsn as the last instruction for this scope only if
263 // it follows
264 // 1) this scope's first instruction and
265 // 2) current last instruction for this scope, if any.
266 if (LIndex >= CurrentLastInsnIndex && LIndex >= FIndex)
267 setLastInsn(LastInsn);
Devang Patel75cc16c2009-10-01 20:31:14 +0000268 }
269
Bill Wendling2f921f82009-05-15 09:23:25 +0000270#ifndef NDEBUG
271 void dump() const;
272#endif
273};
Chris Lattnerf5d06362010-04-05 04:09:20 +0000274
275} // end llvm namespace
Bill Wendling2f921f82009-05-15 09:23:25 +0000276
277#ifndef NDEBUG
278void DbgScope::dump() const {
David Greenec230cb92009-12-24 00:31:35 +0000279 raw_ostream &err = dbgs();
Chris Lattner81e8e022009-08-23 00:51:00 +0000280 err.indent(IndentLevel);
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000281 MDNode *N = Desc.getNode();
282 N->dump();
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000283 if (AbstractScope)
284 err << "Abstract Scope\n";
Bill Wendling2f921f82009-05-15 09:23:25 +0000285
286 IndentLevel += 2;
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000287 if (!Scopes.empty())
288 err << "Children ...\n";
Bill Wendling2f921f82009-05-15 09:23:25 +0000289 for (unsigned i = 0, e = Scopes.size(); i != e; ++i)
290 if (Scopes[i] != this)
291 Scopes[i]->dump();
292
293 IndentLevel -= 2;
294}
295#endif
296
Bill Wendling2f921f82009-05-15 09:23:25 +0000297DbgScope::~DbgScope() {
Bill Wendling2f921f82009-05-15 09:23:25 +0000298 for (unsigned j = 0, M = Variables.size(); j < M; ++j)
299 delete Variables[j];
Bill Wendling2f921f82009-05-15 09:23:25 +0000300}
301
Chris Lattnerf0d6bd32010-04-05 05:11:15 +0000302DwarfDebug::DwarfDebug(AsmPrinter *A, Module *M)
Chris Lattner3a383cb2010-04-05 00:13:49 +0000303 : Asm(A), MMI(Asm->MMI), ModuleCU(0),
Chris Lattner196dbdc2010-04-05 03:52:55 +0000304 AbbreviationsSet(InitAbbreviationsSetSize),
Bill Wendlingfcc14142010-04-07 09:28:04 +0000305 CurrentFnDbgScope(0) {
Chris Lattnerb7aa9522010-03-13 02:17:42 +0000306 NextStringPoolNumber = 0;
Chris Lattner6629ca92010-04-04 22:59:04 +0000307
Chris Lattnere58b5472010-04-04 23:10:38 +0000308 DwarfFrameSectionSym = DwarfInfoSectionSym = DwarfAbbrevSectionSym = 0;
309 DwarfStrSectionSym = TextSectionSym = 0;
Torok Edwinf8dba242010-04-07 10:44:46 +0000310
311 if (TimePassesIsEnabled) {
312 NamedRegionTimer T(DbgTimerName, DWARFGroupName);
313 beginModule(M);
314 } else {
315 beginModule(M);
316 }
Bill Wendling2f921f82009-05-15 09:23:25 +0000317}
318DwarfDebug::~DwarfDebug() {
Benjamin Kramer74729ae2010-03-31 19:34:01 +0000319 for (unsigned j = 0, M = DIEBlocks.size(); j < M; ++j)
320 DIEBlocks[j]->~DIEBlock();
Bill Wendling2f921f82009-05-15 09:23:25 +0000321}
322
Chris Lattnerb7aa9522010-03-13 02:17:42 +0000323MCSymbol *DwarfDebug::getStringPoolEntry(StringRef Str) {
324 std::pair<MCSymbol*, unsigned> &Entry = StringPool[Str];
325 if (Entry.first) return Entry.first;
326
327 Entry.second = NextStringPoolNumber++;
Chris Lattnera179b522010-04-04 19:25:43 +0000328 return Entry.first = Asm->GetTempSymbol("string", Entry.second);
Chris Lattnerb7aa9522010-03-13 02:17:42 +0000329}
330
331
Devang Patel930143b2009-11-21 02:48:08 +0000332/// assignAbbrevNumber - Define a unique number for the abbreviation.
Bill Wendling2f921f82009-05-15 09:23:25 +0000333///
Devang Patel930143b2009-11-21 02:48:08 +0000334void DwarfDebug::assignAbbrevNumber(DIEAbbrev &Abbrev) {
Bill Wendling2f921f82009-05-15 09:23:25 +0000335 // Profile the node so that we can make it unique.
336 FoldingSetNodeID ID;
337 Abbrev.Profile(ID);
338
339 // Check the set for priors.
340 DIEAbbrev *InSet = AbbreviationsSet.GetOrInsertNode(&Abbrev);
341
342 // If it's newly added.
343 if (InSet == &Abbrev) {
344 // Add to abbreviation list.
345 Abbreviations.push_back(&Abbrev);
346
347 // Assign the vector position + 1 as its number.
348 Abbrev.setNumber(Abbreviations.size());
349 } else {
350 // Assign existing abbreviation number.
351 Abbrev.setNumber(InSet->getNumber());
352 }
353}
354
Devang Patel930143b2009-11-21 02:48:08 +0000355/// createDIEEntry - Creates a new DIEEntry to be a proxy for a debug
Bill Wendlingbcad77a2009-05-20 23:24:48 +0000356/// information entry.
Devang Patel930143b2009-11-21 02:48:08 +0000357DIEEntry *DwarfDebug::createDIEEntry(DIE *Entry) {
Benjamin Kramer74729ae2010-03-31 19:34:01 +0000358 DIEEntry *Value = new (DIEValueAllocator) DIEEntry(Entry);
Bill Wendling2f921f82009-05-15 09:23:25 +0000359 return Value;
360}
361
Devang Patel930143b2009-11-21 02:48:08 +0000362/// addUInt - Add an unsigned integer attribute data and value.
Bill Wendling2f921f82009-05-15 09:23:25 +0000363///
Devang Patel930143b2009-11-21 02:48:08 +0000364void DwarfDebug::addUInt(DIE *Die, unsigned Attribute,
Bill Wendling2f921f82009-05-15 09:23:25 +0000365 unsigned Form, uint64_t Integer) {
366 if (!Form) Form = DIEInteger::BestForm(false, Integer);
Benjamin Kramer74729ae2010-03-31 19:34:01 +0000367 DIEValue *Value = new (DIEValueAllocator) DIEInteger(Integer);
Devang Patel930143b2009-11-21 02:48:08 +0000368 Die->addValue(Attribute, Form, Value);
Bill Wendling2f921f82009-05-15 09:23:25 +0000369}
370
Devang Patel930143b2009-11-21 02:48:08 +0000371/// addSInt - Add an signed integer attribute data and value.
Bill Wendling2f921f82009-05-15 09:23:25 +0000372///
Devang Patel930143b2009-11-21 02:48:08 +0000373void DwarfDebug::addSInt(DIE *Die, unsigned Attribute,
Bill Wendling2f921f82009-05-15 09:23:25 +0000374 unsigned Form, int64_t Integer) {
375 if (!Form) Form = DIEInteger::BestForm(true, Integer);
Benjamin Kramer74729ae2010-03-31 19:34:01 +0000376 DIEValue *Value = new (DIEValueAllocator) DIEInteger(Integer);
Devang Patel930143b2009-11-21 02:48:08 +0000377 Die->addValue(Attribute, Form, Value);
Bill Wendling2f921f82009-05-15 09:23:25 +0000378}
379
Devang Patel8c339592009-12-02 15:25:16 +0000380/// addString - Add a string attribute data and value. DIEString only
381/// keeps string reference.
Devang Patel930143b2009-11-21 02:48:08 +0000382void DwarfDebug::addString(DIE *Die, unsigned Attribute, unsigned Form,
Chris Lattnerc3f23b82010-01-23 03:11:46 +0000383 StringRef String) {
Benjamin Kramer74729ae2010-03-31 19:34:01 +0000384 DIEValue *Value = new (DIEValueAllocator) DIEString(String);
Devang Patel930143b2009-11-21 02:48:08 +0000385 Die->addValue(Attribute, Form, Value);
Bill Wendling2f921f82009-05-15 09:23:25 +0000386}
387
Devang Patel930143b2009-11-21 02:48:08 +0000388/// addLabel - Add a Dwarf label attribute data and value.
Bill Wendling2f921f82009-05-15 09:23:25 +0000389///
Devang Patel930143b2009-11-21 02:48:08 +0000390void DwarfDebug::addLabel(DIE *Die, unsigned Attribute, unsigned Form,
Chris Lattnerbc9210c2010-03-08 22:23:36 +0000391 const MCSymbol *Label) {
Benjamin Kramer74729ae2010-03-31 19:34:01 +0000392 DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
Devang Patel930143b2009-11-21 02:48:08 +0000393 Die->addValue(Attribute, Form, Value);
Bill Wendling2f921f82009-05-15 09:23:25 +0000394}
395
Devang Patel930143b2009-11-21 02:48:08 +0000396/// addDelta - Add a label delta attribute data and value.
Bill Wendling2f921f82009-05-15 09:23:25 +0000397///
Devang Patel930143b2009-11-21 02:48:08 +0000398void DwarfDebug::addDelta(DIE *Die, unsigned Attribute, unsigned Form,
Chris Lattnerbc9210c2010-03-08 22:23:36 +0000399 const MCSymbol *Hi, const MCSymbol *Lo) {
Benjamin Kramer74729ae2010-03-31 19:34:01 +0000400 DIEValue *Value = new (DIEValueAllocator) DIEDelta(Hi, Lo);
Devang Patel930143b2009-11-21 02:48:08 +0000401 Die->addValue(Attribute, Form, Value);
Bill Wendling2f921f82009-05-15 09:23:25 +0000402}
403
Chris Lattner3f3fb972010-04-05 05:24:55 +0000404/// addDIEEntry - Add a DIE attribute data and value.
405///
406void DwarfDebug::addDIEEntry(DIE *Die, unsigned Attribute, unsigned Form,
407 DIE *Entry) {
408 Die->addValue(Attribute, Form, createDIEEntry(Entry));
409}
410
411
Devang Patel930143b2009-11-21 02:48:08 +0000412/// addBlock - Add block data.
Bill Wendling2f921f82009-05-15 09:23:25 +0000413///
Devang Patel930143b2009-11-21 02:48:08 +0000414void DwarfDebug::addBlock(DIE *Die, unsigned Attribute, unsigned Form,
Bill Wendling2f921f82009-05-15 09:23:25 +0000415 DIEBlock *Block) {
Chris Lattner5a00dea2010-04-05 00:18:22 +0000416 Block->ComputeSize(Asm);
Benjamin Kramer74729ae2010-03-31 19:34:01 +0000417 DIEBlocks.push_back(Block); // Memoize so we can call the destructor later on.
Devang Patel930143b2009-11-21 02:48:08 +0000418 Die->addValue(Attribute, Block->BestForm(), Block);
Bill Wendling2f921f82009-05-15 09:23:25 +0000419}
420
Devang Patel930143b2009-11-21 02:48:08 +0000421/// addSourceLine - Add location information to specified debug information
Bill Wendling2f921f82009-05-15 09:23:25 +0000422/// entry.
Devang Patel930143b2009-11-21 02:48:08 +0000423void DwarfDebug::addSourceLine(DIE *Die, const DIVariable *V) {
Bill Wendling2f921f82009-05-15 09:23:25 +0000424 // If there is no compile unit specified, don't add a line #.
Devang Patel3b548aa2010-03-08 20:52:55 +0000425 if (!V->getCompileUnit().Verify())
Bill Wendling2f921f82009-05-15 09:23:25 +0000426 return;
427
428 unsigned Line = V->getLineNumber();
Devang Patel8119fe872010-03-08 22:02:50 +0000429 unsigned FileID = GetOrCreateSourceID(V->getContext().getDirectory(),
430 V->getContext().getFilename());
Bill Wendling2f921f82009-05-15 09:23:25 +0000431 assert(FileID && "Invalid file id");
Devang Patel930143b2009-11-21 02:48:08 +0000432 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
433 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
Bill Wendling2f921f82009-05-15 09:23:25 +0000434}
435
Devang Patel930143b2009-11-21 02:48:08 +0000436/// addSourceLine - Add location information to specified debug information
Bill Wendling2f921f82009-05-15 09:23:25 +0000437/// entry.
Devang Patel930143b2009-11-21 02:48:08 +0000438void DwarfDebug::addSourceLine(DIE *Die, const DIGlobal *G) {
Bill Wendling2f921f82009-05-15 09:23:25 +0000439 // If there is no compile unit specified, don't add a line #.
Devang Patel3b548aa2010-03-08 20:52:55 +0000440 if (!G->getCompileUnit().Verify())
Bill Wendling2f921f82009-05-15 09:23:25 +0000441 return;
442
443 unsigned Line = G->getLineNumber();
Devang Patel8119fe872010-03-08 22:02:50 +0000444 unsigned FileID = GetOrCreateSourceID(G->getContext().getDirectory(),
445 G->getContext().getFilename());
Bill Wendling2f921f82009-05-15 09:23:25 +0000446 assert(FileID && "Invalid file id");
Devang Patel930143b2009-11-21 02:48:08 +0000447 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
448 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
Bill Wendling2f921f82009-05-15 09:23:25 +0000449}
Devang Patelb2de5fa2009-08-31 22:47:13 +0000450
Devang Patel930143b2009-11-21 02:48:08 +0000451/// addSourceLine - Add location information to specified debug information
Devang Patelb2de5fa2009-08-31 22:47:13 +0000452/// entry.
Devang Patel930143b2009-11-21 02:48:08 +0000453void DwarfDebug::addSourceLine(DIE *Die, const DISubprogram *SP) {
Devang Patelb2de5fa2009-08-31 22:47:13 +0000454 // If there is no compile unit specified, don't add a line #.
Devang Patel3b548aa2010-03-08 20:52:55 +0000455 if (!SP->getCompileUnit().Verify())
Devang Patelb2de5fa2009-08-31 22:47:13 +0000456 return;
Caroline Tice183a5192009-09-11 18:25:54 +0000457 // If the line number is 0, don't add it.
458 if (SP->getLineNumber() == 0)
459 return;
460
Devang Patelb2de5fa2009-08-31 22:47:13 +0000461 unsigned Line = SP->getLineNumber();
Devang Patel8119fe872010-03-08 22:02:50 +0000462 if (!SP->getContext().Verify())
463 return;
Devang Patel834392f2010-03-24 21:30:35 +0000464 unsigned FileID = GetOrCreateSourceID(SP->getDirectory(),
465 SP->getFilename());
Devang Patelb2de5fa2009-08-31 22:47:13 +0000466 assert(FileID && "Invalid file id");
Devang Patel930143b2009-11-21 02:48:08 +0000467 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
468 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
Devang Patelb2de5fa2009-08-31 22:47:13 +0000469}
470
Devang Patel930143b2009-11-21 02:48:08 +0000471/// addSourceLine - Add location information to specified debug information
Devang Patelb2de5fa2009-08-31 22:47:13 +0000472/// entry.
Devang Patel930143b2009-11-21 02:48:08 +0000473void DwarfDebug::addSourceLine(DIE *Die, const DIType *Ty) {
Bill Wendling2f921f82009-05-15 09:23:25 +0000474 // If there is no compile unit specified, don't add a line #.
475 DICompileUnit CU = Ty->getCompileUnit();
Devang Patel3b548aa2010-03-08 20:52:55 +0000476 if (!CU.Verify())
Bill Wendling2f921f82009-05-15 09:23:25 +0000477 return;
478
479 unsigned Line = Ty->getLineNumber();
Devang Patel8119fe872010-03-08 22:02:50 +0000480 if (!Ty->getContext().Verify())
481 return;
482 unsigned FileID = GetOrCreateSourceID(Ty->getContext().getDirectory(),
483 Ty->getContext().getFilename());
Bill Wendling2f921f82009-05-15 09:23:25 +0000484 assert(FileID && "Invalid file id");
Devang Patel930143b2009-11-21 02:48:08 +0000485 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
486 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
Bill Wendling2f921f82009-05-15 09:23:25 +0000487}
488
Devang Patel1f4690c2009-12-15 19:16:48 +0000489/// addSourceLine - Add location information to specified debug information
490/// entry.
491void DwarfDebug::addSourceLine(DIE *Die, const DINameSpace *NS) {
492 // If there is no compile unit specified, don't add a line #.
Devang Patel3b548aa2010-03-08 20:52:55 +0000493 if (!NS->getCompileUnit().Verify())
Devang Patel1f4690c2009-12-15 19:16:48 +0000494 return;
495
496 unsigned Line = NS->getLineNumber();
497 StringRef FN = NS->getFilename();
498 StringRef Dir = NS->getDirectory();
499
500 unsigned FileID = GetOrCreateSourceID(Dir, FN);
501 assert(FileID && "Invalid file id");
502 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
503 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
504}
505
Caroline Ticec87c1e22009-08-31 21:19:37 +0000506/* Byref variables, in Blocks, are declared by the programmer as
507 "SomeType VarName;", but the compiler creates a
508 __Block_byref_x_VarName struct, and gives the variable VarName
509 either the struct, or a pointer to the struct, as its type. This
510 is necessary for various behind-the-scenes things the compiler
511 needs to do with by-reference variables in blocks.
512
513 However, as far as the original *programmer* is concerned, the
514 variable should still have type 'SomeType', as originally declared.
515
516 The following function dives into the __Block_byref_x_VarName
517 struct to find the original type of the variable. This will be
518 passed back to the code generating the type for the Debug
519 Information Entry for the variable 'VarName'. 'VarName' will then
520 have the original type 'SomeType' in its debug information.
521
522 The original type 'SomeType' will be the type of the field named
523 'VarName' inside the __Block_byref_x_VarName struct.
524
525 NOTE: In order for this to not completely fail on the debugger
526 side, the Debug Information Entry for the variable VarName needs to
527 have a DW_AT_location that tells the debugger how to unwind through
528 the pointers and __Block_byref_x_VarName struct to find the actual
Devang Patel930143b2009-11-21 02:48:08 +0000529 value of the variable. The function addBlockByrefType does this. */
Caroline Ticec87c1e22009-08-31 21:19:37 +0000530
531/// Find the type the programmer originally declared the variable to be
532/// and return that type.
533///
Devang Patel930143b2009-11-21 02:48:08 +0000534DIType DwarfDebug::getBlockByrefType(DIType Ty, std::string Name) {
Caroline Ticec87c1e22009-08-31 21:19:37 +0000535
536 DIType subType = Ty;
537 unsigned tag = Ty.getTag();
538
539 if (tag == dwarf::DW_TAG_pointer_type) {
Mike Stump14cf8ec2009-09-30 00:08:22 +0000540 DIDerivedType DTy = DIDerivedType(Ty.getNode());
Caroline Ticec87c1e22009-08-31 21:19:37 +0000541 subType = DTy.getTypeDerivedFrom();
542 }
543
544 DICompositeType blockStruct = DICompositeType(subType.getNode());
Caroline Ticec87c1e22009-08-31 21:19:37 +0000545 DIArray Elements = blockStruct.getTypeArray();
546
Caroline Ticec87c1e22009-08-31 21:19:37 +0000547 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
548 DIDescriptor Element = Elements.getElement(i);
549 DIDerivedType DT = DIDerivedType(Element.getNode());
Devang Patel2d9caf92009-11-25 17:36:49 +0000550 if (Name == DT.getName())
Caroline Ticec87c1e22009-08-31 21:19:37 +0000551 return (DT.getTypeDerivedFrom());
552 }
553
554 return Ty;
555}
556
Devang Patel930143b2009-11-21 02:48:08 +0000557/// addComplexAddress - Start with the address based on the location provided,
Mike Stump14cf8ec2009-09-30 00:08:22 +0000558/// and generate the DWARF information necessary to find the actual variable
559/// given the extra address information encoded in the DIVariable, starting from
560/// the starting location. Add the DWARF information to the die.
561///
Devang Patel930143b2009-11-21 02:48:08 +0000562void DwarfDebug::addComplexAddress(DbgVariable *&DV, DIE *Die,
Mike Stump14cf8ec2009-09-30 00:08:22 +0000563 unsigned Attribute,
564 const MachineLocation &Location) {
565 const DIVariable &VD = DV->getVariable();
566 DIType Ty = VD.getType();
567
568 // Decode the original location, and use that as the start of the byref
569 // variable's location.
Chris Lattner3a383cb2010-04-05 00:13:49 +0000570 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
Mike Stump14cf8ec2009-09-30 00:08:22 +0000571 unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
Benjamin Kramer74729ae2010-03-31 19:34:01 +0000572 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Mike Stump14cf8ec2009-09-30 00:08:22 +0000573
574 if (Location.isReg()) {
575 if (Reg < 32) {
Devang Patel930143b2009-11-21 02:48:08 +0000576 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
Mike Stump14cf8ec2009-09-30 00:08:22 +0000577 } else {
578 Reg = Reg - dwarf::DW_OP_reg0;
Devang Patel930143b2009-11-21 02:48:08 +0000579 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
580 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
Mike Stump14cf8ec2009-09-30 00:08:22 +0000581 }
582 } else {
583 if (Reg < 32)
Devang Patel930143b2009-11-21 02:48:08 +0000584 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
Mike Stump14cf8ec2009-09-30 00:08:22 +0000585 else {
Devang Patel930143b2009-11-21 02:48:08 +0000586 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
587 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
Mike Stump14cf8ec2009-09-30 00:08:22 +0000588 }
589
Devang Patel930143b2009-11-21 02:48:08 +0000590 addUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
Mike Stump14cf8ec2009-09-30 00:08:22 +0000591 }
592
593 for (unsigned i = 0, N = VD.getNumAddrElements(); i < N; ++i) {
594 uint64_t Element = VD.getAddrElement(i);
595
596 if (Element == DIFactory::OpPlus) {
Devang Patel930143b2009-11-21 02:48:08 +0000597 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
598 addUInt(Block, 0, dwarf::DW_FORM_udata, VD.getAddrElement(++i));
Mike Stump14cf8ec2009-09-30 00:08:22 +0000599 } else if (Element == DIFactory::OpDeref) {
Devang Patel930143b2009-11-21 02:48:08 +0000600 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Mike Stump14cf8ec2009-09-30 00:08:22 +0000601 } else llvm_unreachable("unknown DIFactory Opcode");
602 }
603
604 // Now attach the location information to the DIE.
Devang Patel930143b2009-11-21 02:48:08 +0000605 addBlock(Die, Attribute, 0, Block);
Mike Stump14cf8ec2009-09-30 00:08:22 +0000606}
607
Caroline Ticec87c1e22009-08-31 21:19:37 +0000608/* Byref variables, in Blocks, are declared by the programmer as "SomeType
609 VarName;", but the compiler creates a __Block_byref_x_VarName struct, and
610 gives the variable VarName either the struct, or a pointer to the struct, as
611 its type. This is necessary for various behind-the-scenes things the
612 compiler needs to do with by-reference variables in Blocks.
613
614 However, as far as the original *programmer* is concerned, the variable
615 should still have type 'SomeType', as originally declared.
616
Devang Patel930143b2009-11-21 02:48:08 +0000617 The function getBlockByrefType dives into the __Block_byref_x_VarName
Caroline Ticec87c1e22009-08-31 21:19:37 +0000618 struct to find the original type of the variable, which is then assigned to
619 the variable's Debug Information Entry as its real type. So far, so good.
620 However now the debugger will expect the variable VarName to have the type
621 SomeType. So we need the location attribute for the variable to be an
Daniel Dunbarc418d6b2009-09-19 20:40:05 +0000622 expression that explains to the debugger how to navigate through the
Caroline Ticec87c1e22009-08-31 21:19:37 +0000623 pointers and struct to find the actual variable of type SomeType.
624
625 The following function does just that. We start by getting
626 the "normal" location for the variable. This will be the location
627 of either the struct __Block_byref_x_VarName or the pointer to the
628 struct __Block_byref_x_VarName.
629
630 The struct will look something like:
631
632 struct __Block_byref_x_VarName {
633 ... <various fields>
634 struct __Block_byref_x_VarName *forwarding;
635 ... <various other fields>
636 SomeType VarName;
637 ... <maybe more fields>
638 };
639
640 If we are given the struct directly (as our starting point) we
641 need to tell the debugger to:
642
643 1). Add the offset of the forwarding field.
644
Dan Gohman4a618822010-02-10 16:03:48 +0000645 2). Follow that pointer to get the real __Block_byref_x_VarName
Caroline Ticec87c1e22009-08-31 21:19:37 +0000646 struct to use (the real one may have been copied onto the heap).
647
648 3). Add the offset for the field VarName, to find the actual variable.
649
650 If we started with a pointer to the struct, then we need to
651 dereference that pointer first, before the other steps.
652 Translating this into DWARF ops, we will need to append the following
653 to the current location description for the variable:
654
655 DW_OP_deref -- optional, if we start with a pointer
656 DW_OP_plus_uconst <forward_fld_offset>
657 DW_OP_deref
658 DW_OP_plus_uconst <varName_fld_offset>
659
660 That is what this function does. */
661
Devang Patel930143b2009-11-21 02:48:08 +0000662/// addBlockByrefAddress - Start with the address based on the location
Caroline Ticec87c1e22009-08-31 21:19:37 +0000663/// provided, and generate the DWARF information necessary to find the
664/// actual Block variable (navigating the Block struct) based on the
665/// starting location. Add the DWARF information to the die. For
666/// more information, read large comment just above here.
667///
Devang Patel930143b2009-11-21 02:48:08 +0000668void DwarfDebug::addBlockByrefAddress(DbgVariable *&DV, DIE *Die,
Daniel Dunbarbe22ec42009-09-19 20:40:14 +0000669 unsigned Attribute,
670 const MachineLocation &Location) {
Caroline Ticec87c1e22009-08-31 21:19:37 +0000671 const DIVariable &VD = DV->getVariable();
672 DIType Ty = VD.getType();
673 DIType TmpTy = Ty;
674 unsigned Tag = Ty.getTag();
675 bool isPointer = false;
676
Devang Patel2d9caf92009-11-25 17:36:49 +0000677 StringRef varName = VD.getName();
Caroline Ticec87c1e22009-08-31 21:19:37 +0000678
679 if (Tag == dwarf::DW_TAG_pointer_type) {
Mike Stump14cf8ec2009-09-30 00:08:22 +0000680 DIDerivedType DTy = DIDerivedType(Ty.getNode());
Caroline Ticec87c1e22009-08-31 21:19:37 +0000681 TmpTy = DTy.getTypeDerivedFrom();
682 isPointer = true;
683 }
684
685 DICompositeType blockStruct = DICompositeType(TmpTy.getNode());
686
Daniel Dunbarbe22ec42009-09-19 20:40:14 +0000687 // Find the __forwarding field and the variable field in the __Block_byref
688 // struct.
Daniel Dunbarbe22ec42009-09-19 20:40:14 +0000689 DIArray Fields = blockStruct.getTypeArray();
690 DIDescriptor varField = DIDescriptor();
691 DIDescriptor forwardingField = DIDescriptor();
Caroline Ticec87c1e22009-08-31 21:19:37 +0000692
Daniel Dunbarbe22ec42009-09-19 20:40:14 +0000693 for (unsigned i = 0, N = Fields.getNumElements(); i < N; ++i) {
694 DIDescriptor Element = Fields.getElement(i);
695 DIDerivedType DT = DIDerivedType(Element.getNode());
Devang Patel2d9caf92009-11-25 17:36:49 +0000696 StringRef fieldName = DT.getName();
697 if (fieldName == "__forwarding")
Daniel Dunbarbe22ec42009-09-19 20:40:14 +0000698 forwardingField = Element;
Devang Patel2d9caf92009-11-25 17:36:49 +0000699 else if (fieldName == varName)
Daniel Dunbarbe22ec42009-09-19 20:40:14 +0000700 varField = Element;
701 }
Daniel Dunbarc418d6b2009-09-19 20:40:05 +0000702
Daniel Dunbarbe22ec42009-09-19 20:40:14 +0000703 // Get the offsets for the forwarding field and the variable field.
Chris Lattner71696ef2010-03-31 06:06:37 +0000704 unsigned forwardingFieldOffset =
Daniel Dunbarbe22ec42009-09-19 20:40:14 +0000705 DIDerivedType(forwardingField.getNode()).getOffsetInBits() >> 3;
Chris Lattner71696ef2010-03-31 06:06:37 +0000706 unsigned varFieldOffset =
Daniel Dunbarbe22ec42009-09-19 20:40:14 +0000707 DIDerivedType(varField.getNode()).getOffsetInBits() >> 3;
Caroline Ticec87c1e22009-08-31 21:19:37 +0000708
Mike Stump944fa252009-09-24 23:21:26 +0000709 // Decode the original location, and use that as the start of the byref
710 // variable's location.
Chris Lattner3a383cb2010-04-05 00:13:49 +0000711 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
Daniel Dunbarbe22ec42009-09-19 20:40:14 +0000712 unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
Benjamin Kramer74729ae2010-03-31 19:34:01 +0000713 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Caroline Ticec87c1e22009-08-31 21:19:37 +0000714
Daniel Dunbarbe22ec42009-09-19 20:40:14 +0000715 if (Location.isReg()) {
716 if (Reg < 32)
Devang Patel930143b2009-11-21 02:48:08 +0000717 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
Daniel Dunbarbe22ec42009-09-19 20:40:14 +0000718 else {
719 Reg = Reg - dwarf::DW_OP_reg0;
Devang Patel930143b2009-11-21 02:48:08 +0000720 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
721 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
Daniel Dunbarbe22ec42009-09-19 20:40:14 +0000722 }
723 } else {
724 if (Reg < 32)
Devang Patel930143b2009-11-21 02:48:08 +0000725 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
Daniel Dunbarbe22ec42009-09-19 20:40:14 +0000726 else {
Devang Patel930143b2009-11-21 02:48:08 +0000727 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
728 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
Daniel Dunbarbe22ec42009-09-19 20:40:14 +0000729 }
Caroline Ticec87c1e22009-08-31 21:19:37 +0000730
Devang Patel930143b2009-11-21 02:48:08 +0000731 addUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
Daniel Dunbarbe22ec42009-09-19 20:40:14 +0000732 }
Caroline Ticec87c1e22009-08-31 21:19:37 +0000733
Mike Stump944fa252009-09-24 23:21:26 +0000734 // If we started with a pointer to the __Block_byref... struct, then
Daniel Dunbarbe22ec42009-09-19 20:40:14 +0000735 // the first thing we need to do is dereference the pointer (DW_OP_deref).
Daniel Dunbarbe22ec42009-09-19 20:40:14 +0000736 if (isPointer)
Devang Patel930143b2009-11-21 02:48:08 +0000737 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Caroline Ticec87c1e22009-08-31 21:19:37 +0000738
Daniel Dunbarbe22ec42009-09-19 20:40:14 +0000739 // Next add the offset for the '__forwarding' field:
740 // DW_OP_plus_uconst ForwardingFieldOffset. Note there's no point in
741 // adding the offset if it's 0.
Daniel Dunbarbe22ec42009-09-19 20:40:14 +0000742 if (forwardingFieldOffset > 0) {
Devang Patel930143b2009-11-21 02:48:08 +0000743 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
744 addUInt(Block, 0, dwarf::DW_FORM_udata, forwardingFieldOffset);
Daniel Dunbarbe22ec42009-09-19 20:40:14 +0000745 }
Caroline Ticec87c1e22009-08-31 21:19:37 +0000746
Daniel Dunbarbe22ec42009-09-19 20:40:14 +0000747 // Now dereference the __forwarding field to get to the real __Block_byref
748 // struct: DW_OP_deref.
Devang Patel930143b2009-11-21 02:48:08 +0000749 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Caroline Ticec87c1e22009-08-31 21:19:37 +0000750
Daniel Dunbarbe22ec42009-09-19 20:40:14 +0000751 // Now that we've got the real __Block_byref... struct, add the offset
752 // for the variable's field to get to the location of the actual variable:
753 // DW_OP_plus_uconst varFieldOffset. Again, don't add if it's 0.
Daniel Dunbarbe22ec42009-09-19 20:40:14 +0000754 if (varFieldOffset > 0) {
Devang Patel930143b2009-11-21 02:48:08 +0000755 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
756 addUInt(Block, 0, dwarf::DW_FORM_udata, varFieldOffset);
Daniel Dunbarbe22ec42009-09-19 20:40:14 +0000757 }
Caroline Ticec87c1e22009-08-31 21:19:37 +0000758
Daniel Dunbarbe22ec42009-09-19 20:40:14 +0000759 // Now attach the location information to the DIE.
Devang Patel930143b2009-11-21 02:48:08 +0000760 addBlock(Die, Attribute, 0, Block);
Caroline Ticec87c1e22009-08-31 21:19:37 +0000761}
762
Devang Patel930143b2009-11-21 02:48:08 +0000763/// addAddress - Add an address attribute to a die based on the location
Bill Wendling2f921f82009-05-15 09:23:25 +0000764/// provided.
Devang Patel930143b2009-11-21 02:48:08 +0000765void DwarfDebug::addAddress(DIE *Die, unsigned Attribute,
Bill Wendling2f921f82009-05-15 09:23:25 +0000766 const MachineLocation &Location) {
Chris Lattner3a383cb2010-04-05 00:13:49 +0000767 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
Bill Wendling2f921f82009-05-15 09:23:25 +0000768 unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
Benjamin Kramer74729ae2010-03-31 19:34:01 +0000769 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Bill Wendling2f921f82009-05-15 09:23:25 +0000770
771 if (Location.isReg()) {
772 if (Reg < 32) {
Devang Patel930143b2009-11-21 02:48:08 +0000773 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
Bill Wendling2f921f82009-05-15 09:23:25 +0000774 } else {
Devang Patel930143b2009-11-21 02:48:08 +0000775 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
776 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
Bill Wendling2f921f82009-05-15 09:23:25 +0000777 }
778 } else {
779 if (Reg < 32) {
Devang Patel930143b2009-11-21 02:48:08 +0000780 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
Bill Wendling2f921f82009-05-15 09:23:25 +0000781 } else {
Devang Patel930143b2009-11-21 02:48:08 +0000782 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
783 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
Bill Wendling2f921f82009-05-15 09:23:25 +0000784 }
785
Devang Patel930143b2009-11-21 02:48:08 +0000786 addUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
Bill Wendling2f921f82009-05-15 09:23:25 +0000787 }
788
Devang Patel930143b2009-11-21 02:48:08 +0000789 addBlock(Die, Attribute, 0, Block);
Bill Wendling2f921f82009-05-15 09:23:25 +0000790}
791
Devang Patel2b75ed22009-12-10 19:14:49 +0000792/// addToContextOwner - Add Die into the list of its context owner's children.
793void DwarfDebug::addToContextOwner(DIE *Die, DIDescriptor Context) {
Devang Patel3b548aa2010-03-08 20:52:55 +0000794 if (Context.isType()) {
Devang Patel2b75ed22009-12-10 19:14:49 +0000795 DIE *ContextDIE = getOrCreateTypeDIE(DIType(Context.getNode()));
796 ContextDIE->addChild(Die);
Devang Patel1f4690c2009-12-15 19:16:48 +0000797 } else if (Context.isNameSpace()) {
798 DIE *ContextDIE = getOrCreateNameSpace(DINameSpace(Context.getNode()));
799 ContextDIE->addChild(Die);
Devang Patel2b75ed22009-12-10 19:14:49 +0000800 } else if (DIE *ContextDIE = ModuleCU->getDIE(Context.getNode()))
801 ContextDIE->addChild(Die);
802 else
803 ModuleCU->addDie(Die);
804}
805
Devang Patelb5b60ea2009-12-10 18:05:33 +0000806/// getOrCreateTypeDIE - Find existing DIE or create new DIE for the
807/// given DIType.
808DIE *DwarfDebug::getOrCreateTypeDIE(DIType Ty) {
809 DIE *TyDIE = ModuleCU->getDIE(Ty.getNode());
810 if (TyDIE)
811 return TyDIE;
812
813 // Create new type.
814 TyDIE = new DIE(dwarf::DW_TAG_base_type);
815 ModuleCU->insertDIE(Ty.getNode(), TyDIE);
816 if (Ty.isBasicType())
817 constructTypeDIE(*TyDIE, DIBasicType(Ty.getNode()));
818 else if (Ty.isCompositeType())
819 constructTypeDIE(*TyDIE, DICompositeType(Ty.getNode()));
820 else {
821 assert(Ty.isDerivedType() && "Unknown kind of DIType");
822 constructTypeDIE(*TyDIE, DIDerivedType(Ty.getNode()));
823 }
824
Devang Patel2b75ed22009-12-10 19:14:49 +0000825 addToContextOwner(TyDIE, Ty.getContext());
Devang Patelb5b60ea2009-12-10 18:05:33 +0000826 return TyDIE;
827}
828
Devang Patel930143b2009-11-21 02:48:08 +0000829/// addType - Add a new type attribute to the specified entity.
Devang Patel9ccfb642009-12-09 18:24:21 +0000830void DwarfDebug::addType(DIE *Entity, DIType Ty) {
Devang Patel3b548aa2010-03-08 20:52:55 +0000831 if (!Ty.isValid())
Bill Wendling2f921f82009-05-15 09:23:25 +0000832 return;
833
834 // Check for pre-existence.
Devang Patel9ccfb642009-12-09 18:24:21 +0000835 DIEEntry *Entry = ModuleCU->getDIEEntry(Ty.getNode());
Bill Wendling2f921f82009-05-15 09:23:25 +0000836 // If it exists then use the existing value.
Devang Patel930143b2009-11-21 02:48:08 +0000837 if (Entry) {
838 Entity->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, Entry);
Bill Wendling2f921f82009-05-15 09:23:25 +0000839 return;
840 }
841
Bill Wendling2f921f82009-05-15 09:23:25 +0000842 // Construct type.
Devang Patelb5b60ea2009-12-10 18:05:33 +0000843 DIE *Buffer = getOrCreateTypeDIE(Ty);
Bill Wendling2f921f82009-05-15 09:23:25 +0000844
Jeffrey Yasskin35b4e4f2010-03-12 17:45:06 +0000845 // Set up proxy.
846 Entry = createDIEEntry(Buffer);
847 ModuleCU->insertDIEEntry(Ty.getNode(), Entry);
848
Devang Patel930143b2009-11-21 02:48:08 +0000849 Entity->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, Entry);
Bill Wendling2f921f82009-05-15 09:23:25 +0000850}
851
Devang Patel930143b2009-11-21 02:48:08 +0000852/// constructTypeDIE - Construct basic type die from DIBasicType.
Devang Patel9ccfb642009-12-09 18:24:21 +0000853void DwarfDebug::constructTypeDIE(DIE &Buffer, DIBasicType BTy) {
Bill Wendling2f921f82009-05-15 09:23:25 +0000854 // Get core information.
Devang Patel2d9caf92009-11-25 17:36:49 +0000855 StringRef Name = BTy.getName();
Bill Wendling2f921f82009-05-15 09:23:25 +0000856 Buffer.setTag(dwarf::DW_TAG_base_type);
Devang Patel930143b2009-11-21 02:48:08 +0000857 addUInt(&Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
Bill Wendling2f921f82009-05-15 09:23:25 +0000858 BTy.getEncoding());
859
860 // Add name if not anonymous or intermediate type.
Devang Patel2d9caf92009-11-25 17:36:49 +0000861 if (!Name.empty())
Devang Patel930143b2009-11-21 02:48:08 +0000862 addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
Bill Wendling2f921f82009-05-15 09:23:25 +0000863 uint64_t Size = BTy.getSizeInBits() >> 3;
Devang Patel930143b2009-11-21 02:48:08 +0000864 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
Bill Wendling2f921f82009-05-15 09:23:25 +0000865}
866
Devang Patel930143b2009-11-21 02:48:08 +0000867/// constructTypeDIE - Construct derived type die from DIDerivedType.
Devang Patel9ccfb642009-12-09 18:24:21 +0000868void DwarfDebug::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) {
Bill Wendling2f921f82009-05-15 09:23:25 +0000869 // Get core information.
Devang Patel2d9caf92009-11-25 17:36:49 +0000870 StringRef Name = DTy.getName();
Bill Wendling2f921f82009-05-15 09:23:25 +0000871 uint64_t Size = DTy.getSizeInBits() >> 3;
872 unsigned Tag = DTy.getTag();
873
874 // FIXME - Workaround for templates.
875 if (Tag == dwarf::DW_TAG_inheritance) Tag = dwarf::DW_TAG_reference_type;
876
877 Buffer.setTag(Tag);
878
879 // Map to main type, void will not have a type.
880 DIType FromTy = DTy.getTypeDerivedFrom();
Devang Patel9ccfb642009-12-09 18:24:21 +0000881 addType(&Buffer, FromTy);
Bill Wendling2f921f82009-05-15 09:23:25 +0000882
883 // Add name if not anonymous or intermediate type.
Devang Patelae466ef2009-11-30 23:56:56 +0000884 if (!Name.empty())
Devang Patel930143b2009-11-21 02:48:08 +0000885 addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
Bill Wendling2f921f82009-05-15 09:23:25 +0000886
887 // Add size if non-zero (derived types might be zero-sized.)
888 if (Size)
Devang Patel930143b2009-11-21 02:48:08 +0000889 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
Bill Wendling2f921f82009-05-15 09:23:25 +0000890
891 // Add source line info if available and TyDesc is not a forward declaration.
Devang Patelb5b51592009-11-23 18:43:37 +0000892 if (!DTy.isForwardDecl())
Devang Patel930143b2009-11-21 02:48:08 +0000893 addSourceLine(&Buffer, &DTy);
Bill Wendling2f921f82009-05-15 09:23:25 +0000894}
895
Devang Patel930143b2009-11-21 02:48:08 +0000896/// constructTypeDIE - Construct type DIE from DICompositeType.
Devang Patel9ccfb642009-12-09 18:24:21 +0000897void DwarfDebug::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
Bill Wendling2f921f82009-05-15 09:23:25 +0000898 // Get core information.
Devang Patel2d9caf92009-11-25 17:36:49 +0000899 StringRef Name = CTy.getName();
Bill Wendling2f921f82009-05-15 09:23:25 +0000900
901 uint64_t Size = CTy.getSizeInBits() >> 3;
902 unsigned Tag = CTy.getTag();
903 Buffer.setTag(Tag);
904
905 switch (Tag) {
906 case dwarf::DW_TAG_vector_type:
907 case dwarf::DW_TAG_array_type:
Devang Patel9ccfb642009-12-09 18:24:21 +0000908 constructArrayTypeDIE(Buffer, &CTy);
Bill Wendling2f921f82009-05-15 09:23:25 +0000909 break;
910 case dwarf::DW_TAG_enumeration_type: {
911 DIArray Elements = CTy.getTypeArray();
912
913 // Add enumerators to enumeration type.
914 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
915 DIE *ElemDie = NULL;
Devang Patel3b548aa2010-03-08 20:52:55 +0000916 DIDescriptor Enum(Elements.getElement(i).getNode());
917 if (Enum.isEnumerator()) {
918 ElemDie = constructEnumTypeDIE(DIEnumerator(Enum.getNode()));
Devang Patel930143b2009-11-21 02:48:08 +0000919 Buffer.addChild(ElemDie);
Devang Patelfafa1fe2009-10-09 17:51:49 +0000920 }
Bill Wendling2f921f82009-05-15 09:23:25 +0000921 }
922 }
923 break;
924 case dwarf::DW_TAG_subroutine_type: {
925 // Add return type.
926 DIArray Elements = CTy.getTypeArray();
927 DIDescriptor RTy = Elements.getElement(0);
Devang Patel9ccfb642009-12-09 18:24:21 +0000928 addType(&Buffer, DIType(RTy.getNode()));
Bill Wendling2f921f82009-05-15 09:23:25 +0000929
930 // Add prototype flag.
Devang Patel930143b2009-11-21 02:48:08 +0000931 addUInt(&Buffer, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
Bill Wendling2f921f82009-05-15 09:23:25 +0000932
933 // Add arguments.
934 for (unsigned i = 1, N = Elements.getNumElements(); i < N; ++i) {
935 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
936 DIDescriptor Ty = Elements.getElement(i);
Devang Patel9ccfb642009-12-09 18:24:21 +0000937 addType(Arg, DIType(Ty.getNode()));
Devang Patel930143b2009-11-21 02:48:08 +0000938 Buffer.addChild(Arg);
Bill Wendling2f921f82009-05-15 09:23:25 +0000939 }
940 }
941 break;
942 case dwarf::DW_TAG_structure_type:
943 case dwarf::DW_TAG_union_type:
944 case dwarf::DW_TAG_class_type: {
945 // Add elements to structure type.
946 DIArray Elements = CTy.getTypeArray();
947
948 // A forward struct declared type may not have elements available.
Devang Patel3b548aa2010-03-08 20:52:55 +0000949 unsigned N = Elements.getNumElements();
950 if (N == 0)
Bill Wendling2f921f82009-05-15 09:23:25 +0000951 break;
952
953 // Add elements to structure type.
Devang Patel3b548aa2010-03-08 20:52:55 +0000954 for (unsigned i = 0; i < N; ++i) {
Bill Wendling2f921f82009-05-15 09:23:25 +0000955 DIDescriptor Element = Elements.getElement(i);
956 DIE *ElemDie = NULL;
Devang Patel3b548aa2010-03-08 20:52:55 +0000957 if (Element.isSubprogram())
Devang Patel525dda02009-12-14 16:18:45 +0000958 ElemDie = createSubprogramDIE(DISubprogram(Element.getNode()));
Devang Patel3b548aa2010-03-08 20:52:55 +0000959 else if (Element.isVariable()) {
Devang Patel160c92d2010-01-30 01:08:30 +0000960 DIVariable DV(Element.getNode());
961 ElemDie = new DIE(dwarf::DW_TAG_variable);
962 addString(ElemDie, dwarf::DW_AT_name, dwarf::DW_FORM_string,
963 DV.getName());
964 addType(ElemDie, DV.getType());
965 addUInt(ElemDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
966 addUInt(ElemDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
967 addSourceLine(ElemDie, &DV);
Devang Patel3b548aa2010-03-08 20:52:55 +0000968 } else if (Element.isDerivedType())
Devang Patel9ccfb642009-12-09 18:24:21 +0000969 ElemDie = createMemberDIE(DIDerivedType(Element.getNode()));
Devang Patel3b548aa2010-03-08 20:52:55 +0000970 else
971 continue;
Devang Patel930143b2009-11-21 02:48:08 +0000972 Buffer.addChild(ElemDie);
Bill Wendling2f921f82009-05-15 09:23:25 +0000973 }
974
Devang Patel3082c012009-08-27 23:51:51 +0000975 if (CTy.isAppleBlockExtension())
Devang Patel930143b2009-11-21 02:48:08 +0000976 addUInt(&Buffer, dwarf::DW_AT_APPLE_block, dwarf::DW_FORM_flag, 1);
Bill Wendling2f921f82009-05-15 09:23:25 +0000977
978 unsigned RLang = CTy.getRunTimeLang();
979 if (RLang)
Devang Patel930143b2009-11-21 02:48:08 +0000980 addUInt(&Buffer, dwarf::DW_AT_APPLE_runtime_class,
Bill Wendling2f921f82009-05-15 09:23:25 +0000981 dwarf::DW_FORM_data1, RLang);
Devang Patel303a1be2010-01-26 21:16:06 +0000982
983 DICompositeType ContainingType = CTy.getContainingType();
Devang Patel3b548aa2010-03-08 20:52:55 +0000984 if (DIDescriptor(ContainingType.getNode()).isCompositeType())
Devang Patel303a1be2010-01-26 21:16:06 +0000985 addDIEEntry(&Buffer, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4,
986 getOrCreateTypeDIE(DIType(ContainingType.getNode())));
Bill Wendling2f921f82009-05-15 09:23:25 +0000987 break;
988 }
989 default:
990 break;
991 }
992
993 // Add name if not anonymous or intermediate type.
Devang Patel2d9caf92009-11-25 17:36:49 +0000994 if (!Name.empty())
Devang Patel930143b2009-11-21 02:48:08 +0000995 addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
Bill Wendling2f921f82009-05-15 09:23:25 +0000996
Devang Patelaedd6f52010-01-29 18:34:58 +0000997 if (Tag == dwarf::DW_TAG_enumeration_type || Tag == dwarf::DW_TAG_class_type ||
Bill Wendling2f921f82009-05-15 09:23:25 +0000998 Tag == dwarf::DW_TAG_structure_type || Tag == dwarf::DW_TAG_union_type) {
999 // Add size if non-zero (derived types might be zero-sized.)
1000 if (Size)
Devang Patel930143b2009-11-21 02:48:08 +00001001 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
Bill Wendling2f921f82009-05-15 09:23:25 +00001002 else {
1003 // Add zero size if it is not a forward declaration.
1004 if (CTy.isForwardDecl())
Devang Patel930143b2009-11-21 02:48:08 +00001005 addUInt(&Buffer, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
Bill Wendling2f921f82009-05-15 09:23:25 +00001006 else
Devang Patel930143b2009-11-21 02:48:08 +00001007 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, 0);
Bill Wendling2f921f82009-05-15 09:23:25 +00001008 }
1009
1010 // Add source line info if available.
1011 if (!CTy.isForwardDecl())
Devang Patel930143b2009-11-21 02:48:08 +00001012 addSourceLine(&Buffer, &CTy);
Bill Wendling2f921f82009-05-15 09:23:25 +00001013 }
1014}
1015
Devang Patel930143b2009-11-21 02:48:08 +00001016/// constructSubrangeDIE - Construct subrange DIE from DISubrange.
1017void DwarfDebug::constructSubrangeDIE(DIE &Buffer, DISubrange SR, DIE *IndexTy){
Bill Wendling2f921f82009-05-15 09:23:25 +00001018 int64_t L = SR.getLo();
1019 int64_t H = SR.getHi();
1020 DIE *DW_Subrange = new DIE(dwarf::DW_TAG_subrange_type);
1021
Devang Patel930143b2009-11-21 02:48:08 +00001022 addDIEEntry(DW_Subrange, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IndexTy);
Devang Patelf691df32009-08-14 20:59:16 +00001023 if (L)
Devang Patel930143b2009-11-21 02:48:08 +00001024 addSInt(DW_Subrange, dwarf::DW_AT_lower_bound, 0, L);
Devang Patel8f046022009-12-04 23:10:24 +00001025 addSInt(DW_Subrange, dwarf::DW_AT_upper_bound, 0, H);
Bill Wendling2f921f82009-05-15 09:23:25 +00001026
Devang Patel930143b2009-11-21 02:48:08 +00001027 Buffer.addChild(DW_Subrange);
Bill Wendling2f921f82009-05-15 09:23:25 +00001028}
1029
Devang Patel930143b2009-11-21 02:48:08 +00001030/// constructArrayTypeDIE - Construct array type DIE from DICompositeType.
Devang Patel9ccfb642009-12-09 18:24:21 +00001031void DwarfDebug::constructArrayTypeDIE(DIE &Buffer,
Bill Wendling2f921f82009-05-15 09:23:25 +00001032 DICompositeType *CTy) {
1033 Buffer.setTag(dwarf::DW_TAG_array_type);
1034 if (CTy->getTag() == dwarf::DW_TAG_vector_type)
Devang Patel930143b2009-11-21 02:48:08 +00001035 addUInt(&Buffer, dwarf::DW_AT_GNU_vector, dwarf::DW_FORM_flag, 1);
Bill Wendling2f921f82009-05-15 09:23:25 +00001036
1037 // Emit derived type.
Devang Patel9ccfb642009-12-09 18:24:21 +00001038 addType(&Buffer, CTy->getTypeDerivedFrom());
Bill Wendling2f921f82009-05-15 09:23:25 +00001039 DIArray Elements = CTy->getTypeArray();
1040
Devang Patel92e8c652009-11-21 00:31:03 +00001041 // Get an anonymous type for index type.
Devang Patel9ccfb642009-12-09 18:24:21 +00001042 DIE *IdxTy = ModuleCU->getIndexTyDie();
Devang Patel92e8c652009-11-21 00:31:03 +00001043 if (!IdxTy) {
1044 // Construct an anonymous type for index type.
1045 IdxTy = new DIE(dwarf::DW_TAG_base_type);
Devang Patel930143b2009-11-21 02:48:08 +00001046 addUInt(IdxTy, dwarf::DW_AT_byte_size, 0, sizeof(int32_t));
1047 addUInt(IdxTy, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
Devang Patel92e8c652009-11-21 00:31:03 +00001048 dwarf::DW_ATE_signed);
Devang Patel9ccfb642009-12-09 18:24:21 +00001049 ModuleCU->addDie(IdxTy);
1050 ModuleCU->setIndexTyDie(IdxTy);
Devang Patel92e8c652009-11-21 00:31:03 +00001051 }
Bill Wendling2f921f82009-05-15 09:23:25 +00001052
1053 // Add subranges to array type.
1054 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1055 DIDescriptor Element = Elements.getElement(i);
1056 if (Element.getTag() == dwarf::DW_TAG_subrange_type)
Devang Patel930143b2009-11-21 02:48:08 +00001057 constructSubrangeDIE(Buffer, DISubrange(Element.getNode()), IdxTy);
Bill Wendling2f921f82009-05-15 09:23:25 +00001058 }
1059}
1060
Devang Patel930143b2009-11-21 02:48:08 +00001061/// constructEnumTypeDIE - Construct enum type DIE from DIEnumerator.
Devang Patel3b548aa2010-03-08 20:52:55 +00001062DIE *DwarfDebug::constructEnumTypeDIE(DIEnumerator ETy) {
Bill Wendling2f921f82009-05-15 09:23:25 +00001063 DIE *Enumerator = new DIE(dwarf::DW_TAG_enumerator);
Devang Patel3b548aa2010-03-08 20:52:55 +00001064 StringRef Name = ETy.getName();
Devang Patel930143b2009-11-21 02:48:08 +00001065 addString(Enumerator, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
Devang Patel3b548aa2010-03-08 20:52:55 +00001066 int64_t Value = ETy.getEnumValue();
Devang Patel930143b2009-11-21 02:48:08 +00001067 addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, Value);
Bill Wendling2f921f82009-05-15 09:23:25 +00001068 return Enumerator;
1069}
1070
Devang Patel43ef34d2010-01-05 01:46:14 +00001071/// getRealLinkageName - If special LLVM prefix that is used to inform the asm
1072/// printer to not emit usual symbol prefix before the symbol name is used then
1073/// return linkage name after skipping this special LLVM prefix.
1074static StringRef getRealLinkageName(StringRef LinkageName) {
1075 char One = '\1';
1076 if (LinkageName.startswith(StringRef(&One, 1)))
1077 return LinkageName.substr(1);
1078 return LinkageName;
1079}
1080
Devang Patel930143b2009-11-21 02:48:08 +00001081/// createGlobalVariableDIE - Create new DIE using GV.
Devang Patel9ccfb642009-12-09 18:24:21 +00001082DIE *DwarfDebug::createGlobalVariableDIE(const DIGlobalVariable &GV) {
Jim Grosbach00e9c612009-11-22 19:20:36 +00001083 // If the global variable was optmized out then no need to create debug info
1084 // entry.
Devang Patelcc11371b2009-11-06 17:58:12 +00001085 if (!GV.getGlobal()) return NULL;
Devang Patel2d9caf92009-11-25 17:36:49 +00001086 if (GV.getDisplayName().empty()) return NULL;
Devang Patel06ce6502009-11-06 01:30:04 +00001087
Bill Wendling2f921f82009-05-15 09:23:25 +00001088 DIE *GVDie = new DIE(dwarf::DW_TAG_variable);
Jim Grosbach042483e2009-11-21 23:12:12 +00001089 addString(GVDie, dwarf::DW_AT_name, dwarf::DW_FORM_string,
Devang Patelb2969422009-09-29 18:40:58 +00001090 GV.getDisplayName());
1091
Devang Patel2d9caf92009-11-25 17:36:49 +00001092 StringRef LinkageName = GV.getLinkageName();
Devang Patel43ef34d2010-01-05 01:46:14 +00001093 if (!LinkageName.empty())
Devang Patel930143b2009-11-21 02:48:08 +00001094 addString(GVDie, dwarf::DW_AT_MIPS_linkage_name, dwarf::DW_FORM_string,
Devang Patel43ef34d2010-01-05 01:46:14 +00001095 getRealLinkageName(LinkageName));
1096
Devang Patel9ccfb642009-12-09 18:24:21 +00001097 addType(GVDie, GV.getType());
Bill Wendling2f921f82009-05-15 09:23:25 +00001098 if (!GV.isLocalToUnit())
Devang Patel930143b2009-11-21 02:48:08 +00001099 addUInt(GVDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
1100 addSourceLine(GVDie, &GV);
Devang Patel4144a822009-10-05 23:22:08 +00001101
Bill Wendling2f921f82009-05-15 09:23:25 +00001102 return GVDie;
1103}
1104
Devang Patel930143b2009-11-21 02:48:08 +00001105/// createMemberDIE - Create new member DIE.
Devang Patel9ccfb642009-12-09 18:24:21 +00001106DIE *DwarfDebug::createMemberDIE(const DIDerivedType &DT) {
Bill Wendling2f921f82009-05-15 09:23:25 +00001107 DIE *MemberDie = new DIE(DT.getTag());
Devang Patel2d9caf92009-11-25 17:36:49 +00001108 StringRef Name = DT.getName();
1109 if (!Name.empty())
Devang Patel930143b2009-11-21 02:48:08 +00001110 addString(MemberDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
Devang Patel2d9caf92009-11-25 17:36:49 +00001111
Devang Patel9ccfb642009-12-09 18:24:21 +00001112 addType(MemberDie, DT.getTypeDerivedFrom());
Bill Wendling2f921f82009-05-15 09:23:25 +00001113
Devang Patel930143b2009-11-21 02:48:08 +00001114 addSourceLine(MemberDie, &DT);
Bill Wendling2f921f82009-05-15 09:23:25 +00001115
Benjamin Kramer74729ae2010-03-31 19:34:01 +00001116 DIEBlock *MemLocationDie = new (DIEValueAllocator) DIEBlock();
Devang Patel930143b2009-11-21 02:48:08 +00001117 addUInt(MemLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
Devang Patel67f56f02009-11-04 22:06:12 +00001118
Bill Wendling2f921f82009-05-15 09:23:25 +00001119 uint64_t Size = DT.getSizeInBits();
Devang Patelf05d5722009-11-04 23:48:00 +00001120 uint64_t FieldSize = DT.getOriginalTypeSize();
Bill Wendling2f921f82009-05-15 09:23:25 +00001121
1122 if (Size != FieldSize) {
1123 // Handle bitfield.
Devang Patel930143b2009-11-21 02:48:08 +00001124 addUInt(MemberDie, dwarf::DW_AT_byte_size, 0, DT.getOriginalTypeSize()>>3);
1125 addUInt(MemberDie, dwarf::DW_AT_bit_size, 0, DT.getSizeInBits());
Bill Wendling2f921f82009-05-15 09:23:25 +00001126
1127 uint64_t Offset = DT.getOffsetInBits();
Bill Wendling2f921f82009-05-15 09:23:25 +00001128 uint64_t AlignMask = ~(DT.getAlignInBits() - 1);
1129 uint64_t HiMark = (Offset + FieldSize) & AlignMask;
Benjamin Kramer2b459982010-01-07 17:50:57 +00001130 uint64_t FieldOffset = (HiMark - FieldSize);
Bill Wendling2f921f82009-05-15 09:23:25 +00001131 Offset -= FieldOffset;
1132
1133 // Maybe we need to work from the other end.
Chris Lattner3a383cb2010-04-05 00:13:49 +00001134 if (Asm->getTargetData().isLittleEndian())
1135 Offset = FieldSize - (Offset + Size);
Devang Patel930143b2009-11-21 02:48:08 +00001136 addUInt(MemberDie, dwarf::DW_AT_bit_offset, 0, Offset);
Bill Wendling2f921f82009-05-15 09:23:25 +00001137
Devang Patel67f56f02009-11-04 22:06:12 +00001138 // Here WD_AT_data_member_location points to the anonymous
1139 // field that includes this bit field.
Devang Patel930143b2009-11-21 02:48:08 +00001140 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, FieldOffset >> 3);
Devang Patel67f56f02009-11-04 22:06:12 +00001141
1142 } else
1143 // This is not a bitfield.
Devang Patel930143b2009-11-21 02:48:08 +00001144 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits() >> 3);
Devang Patel67f56f02009-11-04 22:06:12 +00001145
Devang Pateld2316892010-02-03 20:08:48 +00001146 if (DT.getTag() == dwarf::DW_TAG_inheritance
1147 && DT.isVirtual()) {
1148
1149 // For C++, virtual base classes are not at fixed offset. Use following
1150 // expression to extract appropriate offset from vtable.
1151 // BaseAddr = ObAddr + *((*ObAddr) - Offset)
1152
Benjamin Kramer74729ae2010-03-31 19:34:01 +00001153 DIEBlock *VBaseLocationDie = new (DIEValueAllocator) DIEBlock();
Devang Pateld2316892010-02-03 20:08:48 +00001154 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_dup);
1155 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1156 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1157 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits());
1158 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_minus);
1159 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1160 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1161
1162 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0,
1163 VBaseLocationDie);
1164 } else
1165 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, MemLocationDie);
Bill Wendling2f921f82009-05-15 09:23:25 +00001166
1167 if (DT.isProtected())
Devang Pateleb57c592009-12-03 19:11:07 +00001168 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
Bill Wendling2f921f82009-05-15 09:23:25 +00001169 dwarf::DW_ACCESS_protected);
1170 else if (DT.isPrivate())
Devang Pateleb57c592009-12-03 19:11:07 +00001171 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
Bill Wendling2f921f82009-05-15 09:23:25 +00001172 dwarf::DW_ACCESS_private);
Devang Pateleb57c592009-12-03 19:11:07 +00001173 else if (DT.getTag() == dwarf::DW_TAG_inheritance)
1174 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1175 dwarf::DW_ACCESS_public);
1176 if (DT.isVirtual())
1177 addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_flag,
1178 dwarf::DW_VIRTUALITY_virtual);
Bill Wendling2f921f82009-05-15 09:23:25 +00001179 return MemberDie;
1180}
1181
Devang Patel525dda02009-12-14 16:18:45 +00001182/// createSubprogramDIE - Create new DIE using SP.
1183DIE *DwarfDebug::createSubprogramDIE(const DISubprogram &SP, bool MakeDecl) {
1184 DIE *SPDie = ModuleCU->getDIE(SP.getNode());
1185 if (SPDie)
1186 return SPDie;
1187
1188 SPDie = new DIE(dwarf::DW_TAG_subprogram);
Devang Patelf200b392010-03-02 17:58:15 +00001189 // Constructors and operators for anonymous aggregates do not have names.
Devang Pateld0fa3042010-03-02 01:26:20 +00001190 if (!SP.getName().empty())
1191 addString(SPDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, SP.getName());
Bill Wendling2f921f82009-05-15 09:23:25 +00001192
Devang Patel2d9caf92009-11-25 17:36:49 +00001193 StringRef LinkageName = SP.getLinkageName();
Devang Patel43ef34d2010-01-05 01:46:14 +00001194 if (!LinkageName.empty())
Devang Patel930143b2009-11-21 02:48:08 +00001195 addString(SPDie, dwarf::DW_AT_MIPS_linkage_name, dwarf::DW_FORM_string,
Devang Patel43ef34d2010-01-05 01:46:14 +00001196 getRealLinkageName(LinkageName));
1197
Devang Patel930143b2009-11-21 02:48:08 +00001198 addSourceLine(SPDie, &SP);
Bill Wendling2f921f82009-05-15 09:23:25 +00001199
Bill Wendling2f921f82009-05-15 09:23:25 +00001200 // Add prototyped tag, if C or ObjC.
1201 unsigned Lang = SP.getCompileUnit().getLanguage();
1202 if (Lang == dwarf::DW_LANG_C99 || Lang == dwarf::DW_LANG_C89 ||
1203 Lang == dwarf::DW_LANG_ObjC)
Devang Patel930143b2009-11-21 02:48:08 +00001204 addUInt(SPDie, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
Bill Wendling2f921f82009-05-15 09:23:25 +00001205
1206 // Add Return Type.
Devang Patel236526d2009-12-03 01:25:38 +00001207 DICompositeType SPTy = SP.getType();
1208 DIArray Args = SPTy.getTypeArray();
Bill Wendling2f921f82009-05-15 09:23:25 +00001209 unsigned SPTag = SPTy.getTag();
Devang Pateleb57c592009-12-03 19:11:07 +00001210
Devang Patel3b548aa2010-03-08 20:52:55 +00001211 if (Args.getNumElements() == 0 || SPTag != dwarf::DW_TAG_subroutine_type)
Devang Patel9ccfb642009-12-09 18:24:21 +00001212 addType(SPDie, SPTy);
Devang Patel236526d2009-12-03 01:25:38 +00001213 else
Devang Patel9ccfb642009-12-09 18:24:21 +00001214 addType(SPDie, DIType(Args.getElement(0).getNode()));
Devang Patel236526d2009-12-03 01:25:38 +00001215
Devang Pateleb57c592009-12-03 19:11:07 +00001216 unsigned VK = SP.getVirtuality();
1217 if (VK) {
1218 addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_flag, VK);
Benjamin Kramer74729ae2010-03-31 19:34:01 +00001219 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Devang Pateleb57c592009-12-03 19:11:07 +00001220 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1221 addUInt(Block, 0, dwarf::DW_FORM_data1, SP.getVirtualIndex());
1222 addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, 0, Block);
Devang Patel018b29b2010-01-19 06:19:05 +00001223 ContainingTypeMap.insert(std::make_pair(SPDie,
1224 SP.getContainingType().getNode()));
Devang Pateleb57c592009-12-03 19:11:07 +00001225 }
1226
Devang Patel525dda02009-12-14 16:18:45 +00001227 if (MakeDecl || !SP.isDefinition()) {
Devang Patel930143b2009-11-21 02:48:08 +00001228 addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
Bill Wendling2f921f82009-05-15 09:23:25 +00001229
1230 // Add arguments. Do not add arguments for subprogram definition. They will
Devang Patel236526d2009-12-03 01:25:38 +00001231 // be handled while processing variables.
1232 DICompositeType SPTy = SP.getType();
1233 DIArray Args = SPTy.getTypeArray();
1234 unsigned SPTag = SPTy.getTag();
1235
Bill Wendling2f921f82009-05-15 09:23:25 +00001236 if (SPTag == dwarf::DW_TAG_subroutine_type)
1237 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
1238 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
Devang Patel6efc8e52010-02-06 01:02:37 +00001239 DIType ATy = DIType(DIType(Args.getElement(i).getNode()));
1240 addType(Arg, ATy);
1241 if (ATy.isArtificial())
1242 addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
Devang Patel930143b2009-11-21 02:48:08 +00001243 SPDie->addChild(Arg);
Bill Wendling2f921f82009-05-15 09:23:25 +00001244 }
1245 }
1246
Devang Patel999b4992010-02-03 19:57:19 +00001247 if (SP.isArtificial())
1248 addUInt(SPDie, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1249
Bill Wendling2f921f82009-05-15 09:23:25 +00001250 // DW_TAG_inlined_subroutine may refer to this DIE.
Devang Patel9ccfb642009-12-09 18:24:21 +00001251 ModuleCU->insertDIE(SP.getNode(), SPDie);
Bill Wendling2f921f82009-05-15 09:23:25 +00001252 return SPDie;
1253}
1254
Devang Patel4c603b12010-04-01 17:16:48 +00001255/// getUpdatedDbgScope - Find DbgScope assicated with the instruction.
1256/// Update scope hierarchy. Create abstract scope if required.
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001257DbgScope *DwarfDebug::getUpdatedDbgScope(MDNode *N, const MachineInstr *MI,
Chris Lattner8d2fe282010-03-31 05:36:29 +00001258 MDNode *InlinedAt) {
1259 assert(N && "Invalid Scope encoding!");
1260 assert(MI && "Missing machine instruction!");
Devang Patel4c603b12010-04-01 17:16:48 +00001261 bool isAConcreteScope = InlinedAt != 0;
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001262
1263 DbgScope *NScope = NULL;
1264
1265 if (InlinedAt)
1266 NScope = DbgScopeMap.lookup(InlinedAt);
1267 else
1268 NScope = DbgScopeMap.lookup(N);
Chris Lattner8d2fe282010-03-31 05:36:29 +00001269 assert(NScope && "Unable to find working scope!");
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001270
1271 if (NScope->getFirstInsn())
1272 return NScope;
Devang Patel75cc16c2009-10-01 20:31:14 +00001273
1274 DbgScope *Parent = NULL;
Devang Patel4c603b12010-04-01 17:16:48 +00001275 if (isAConcreteScope) {
Devang Patel6875c5eb2009-10-14 21:08:09 +00001276 DILocation IL(InlinedAt);
Jim Grosbach042483e2009-11-21 23:12:12 +00001277 Parent = getUpdatedDbgScope(IL.getScope().getNode(), MI,
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001278 IL.getOrigLocation().getNode());
Chris Lattner8d2fe282010-03-31 05:36:29 +00001279 assert(Parent && "Unable to find Parent scope!");
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001280 NScope->setParent(Parent);
Devang Patel930143b2009-11-21 02:48:08 +00001281 Parent->addScope(NScope);
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001282 } else if (DIDescriptor(N).isLexicalBlock()) {
1283 DILexicalBlock DB(N);
Devang Patel3b548aa2010-03-08 20:52:55 +00001284 Parent = getUpdatedDbgScope(DB.getContext().getNode(), MI, InlinedAt);
1285 NScope->setParent(Parent);
1286 Parent->addScope(NScope);
Devang Patel6875c5eb2009-10-14 21:08:09 +00001287 }
Devang Patel75cc16c2009-10-01 20:31:14 +00001288
Devang Patelcfeaa482009-10-27 20:47:17 +00001289 NScope->setFirstInsn(MI);
Devang Patel75cc16c2009-10-01 20:31:14 +00001290
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001291 if (!Parent && !InlinedAt) {
Devang Patel78319c62009-11-11 00:31:36 +00001292 StringRef SPName = DISubprogram(N).getLinkageName();
Chris Lattner3a383cb2010-04-05 00:13:49 +00001293 if (SPName == Asm->MF->getFunction()->getName())
Devang Patel78319c62009-11-11 00:31:36 +00001294 CurrentFnDbgScope = NScope;
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001295 }
Devang Patel75cc16c2009-10-01 20:31:14 +00001296
Devang Patel4c603b12010-04-01 17:16:48 +00001297 if (isAConcreteScope) {
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001298 ConcreteScopes[InlinedAt] = NScope;
1299 getOrCreateAbstractScope(N);
1300 }
1301
Devang Patelcfeaa482009-10-27 20:47:17 +00001302 return NScope;
Devang Patel75cc16c2009-10-01 20:31:14 +00001303}
1304
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001305DbgScope *DwarfDebug::getOrCreateAbstractScope(MDNode *N) {
Chris Lattner8d2fe282010-03-31 05:36:29 +00001306 assert(N && "Invalid Scope encoding!");
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001307
1308 DbgScope *AScope = AbstractScopes.lookup(N);
1309 if (AScope)
1310 return AScope;
Jim Grosbach042483e2009-11-21 23:12:12 +00001311
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001312 DbgScope *Parent = NULL;
1313
1314 DIDescriptor Scope(N);
1315 if (Scope.isLexicalBlock()) {
1316 DILexicalBlock DB(N);
1317 DIDescriptor ParentDesc = DB.getContext();
Devang Patel3b548aa2010-03-08 20:52:55 +00001318 Parent = getOrCreateAbstractScope(ParentDesc.getNode());
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001319 }
1320
1321 AScope = new DbgScope(Parent, DIDescriptor(N), NULL);
1322
1323 if (Parent)
Devang Patel930143b2009-11-21 02:48:08 +00001324 Parent->addScope(AScope);
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001325 AScope->setAbstractScope();
1326 AbstractScopes[N] = AScope;
1327 if (DIDescriptor(N).isSubprogram())
1328 AbstractScopesList.push_back(AScope);
1329 return AScope;
1330}
Devang Patel75cc16c2009-10-01 20:31:14 +00001331
Devang Patel019922d2010-04-06 23:53:48 +00001332/// isSubprogramContext - Return true if Context is either a subprogram
1333/// or another context nested inside a subprogram.
1334bool isSubprogramContext(MDNode *Context) {
1335 if (!Context)
1336 return false;
1337 DIDescriptor D(Context);
1338 if (D.isSubprogram())
1339 return true;
1340 if (D.isType())
1341 return isSubprogramContext(DIType(Context).getContext().getNode());
1342 return false;
1343}
1344
Jim Grosbach042483e2009-11-21 23:12:12 +00001345/// updateSubprogramScopeDIE - Find DIE for the given subprogram and
Devang Patel930143b2009-11-21 02:48:08 +00001346/// attach appropriate DW_AT_low_pc and DW_AT_high_pc attributes.
1347/// If there are global variables in this scope then create and insert
1348/// DIEs for these variables.
1349DIE *DwarfDebug::updateSubprogramScopeDIE(MDNode *SPNode) {
Chris Lattner3a383cb2010-04-05 00:13:49 +00001350 DIE *SPDie = ModuleCU->getDIE(SPNode);
1351 assert(SPDie && "Unable to find subprogram DIE!");
1352 DISubprogram SP(SPNode);
Chris Lattner2c3f4782010-03-13 07:26:18 +00001353
Chris Lattner3a383cb2010-04-05 00:13:49 +00001354 // There is not any need to generate specification DIE for a function
1355 // defined at compile unit level. If a function is defined inside another
1356 // function then gdb prefers the definition at top level and but does not
1357 // expect specification DIE in parent function. So avoid creating
1358 // specification DIE for a function defined inside a function.
1359 if (SP.isDefinition() && !SP.getContext().isCompileUnit() &&
Devang Patel019922d2010-04-06 23:53:48 +00001360 !SP.getContext().isFile() &&
1361 !isSubprogramContext(SP.getContext().getNode())) {
Chris Lattner3a383cb2010-04-05 00:13:49 +00001362 addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1363
1364 // Add arguments.
1365 DICompositeType SPTy = SP.getType();
1366 DIArray Args = SPTy.getTypeArray();
1367 unsigned SPTag = SPTy.getTag();
1368 if (SPTag == dwarf::DW_TAG_subroutine_type)
1369 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
1370 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1371 DIType ATy = DIType(DIType(Args.getElement(i).getNode()));
1372 addType(Arg, ATy);
1373 if (ATy.isArtificial())
1374 addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1375 SPDie->addChild(Arg);
1376 }
1377 DIE *SPDeclDie = SPDie;
1378 SPDie = new DIE(dwarf::DW_TAG_subprogram);
1379 addDIEEntry(SPDie, dwarf::DW_AT_specification, dwarf::DW_FORM_ref4,
1380 SPDeclDie);
1381 ModuleCU->addDie(SPDie);
1382 }
1383
1384 addLabel(SPDie, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
1385 Asm->GetTempSymbol("func_begin", Asm->getFunctionNumber()));
1386 addLabel(SPDie, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
1387 Asm->GetTempSymbol("func_end", Asm->getFunctionNumber()));
1388 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
1389 MachineLocation Location(RI->getFrameRegister(*Asm->MF));
1390 addAddress(SPDie, dwarf::DW_AT_frame_base, Location);
Devang Patel6efc8e52010-02-06 01:02:37 +00001391
Chris Lattner3a383cb2010-04-05 00:13:49 +00001392 if (!DISubprogram(SPNode).isLocalToUnit())
1393 addUInt(SPDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
1394
1395 return SPDie;
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001396}
1397
Jim Grosbach042483e2009-11-21 23:12:12 +00001398/// constructLexicalScope - Construct new DW_TAG_lexical_block
Devang Patel930143b2009-11-21 02:48:08 +00001399/// for this scope and attach DW_AT_low_pc/DW_AT_high_pc labels.
1400DIE *DwarfDebug::constructLexicalScopeDIE(DbgScope *Scope) {
Devang Patel3ebd8932010-04-08 16:50:29 +00001401
1402 MCSymbol *Start = InsnBeforeLabelMap.lookup(Scope->getFirstInsn());
1403 MCSymbol *End = InsnAfterLabelMap.lookup(Scope->getLastInsn());
Devang Patel23b2ae62010-03-29 22:59:58 +00001404 if (Start == 0 || End == 0) return 0;
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001405
Chris Lattnere13c3722010-03-09 01:58:53 +00001406 assert(Start->isDefined() && "Invalid starting label for an inlined scope!");
1407 assert(End->isDefined() && "Invalid end label for an inlined scope!");
Chris Lattnerc3b70f62010-03-09 01:51:43 +00001408
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001409 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_lexical_block);
1410 if (Scope->isAbstractScope())
1411 return ScopeDIE;
1412
Devang Patel930143b2009-11-21 02:48:08 +00001413 addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
Chris Lattner3a383cb2010-04-05 00:13:49 +00001414 Start ? Start : Asm->GetTempSymbol("func_begin",
1415 Asm->getFunctionNumber()));
Devang Patel930143b2009-11-21 02:48:08 +00001416 addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
Chris Lattner3a383cb2010-04-05 00:13:49 +00001417 End ? End : Asm->GetTempSymbol("func_end",Asm->getFunctionNumber()));
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001418
1419 return ScopeDIE;
1420}
1421
Devang Patel930143b2009-11-21 02:48:08 +00001422/// constructInlinedScopeDIE - This scope represents inlined body of
1423/// a function. Construct DIE to represent this concrete inlined copy
1424/// of the function.
1425DIE *DwarfDebug::constructInlinedScopeDIE(DbgScope *Scope) {
Devang Patel3ebd8932010-04-08 16:50:29 +00001426 MCSymbol *StartLabel = InsnBeforeLabelMap.lookup(Scope->getFirstInsn());
1427 MCSymbol *EndLabel = InsnAfterLabelMap.lookup(Scope->getLastInsn());
Devang Patel23b2ae62010-03-29 22:59:58 +00001428 if (StartLabel == 0 || EndLabel == 0) return 0;
Chris Lattner54a68762010-03-09 04:48:35 +00001429
Chris Lattnere13c3722010-03-09 01:58:53 +00001430 assert(StartLabel->isDefined() &&
Chris Lattnerc3b70f62010-03-09 01:51:43 +00001431 "Invalid starting label for an inlined scope!");
Chris Lattnere13c3722010-03-09 01:58:53 +00001432 assert(EndLabel->isDefined() &&
Chris Lattnerc3b70f62010-03-09 01:51:43 +00001433 "Invalid end label for an inlined scope!");
Devang Patel3b548aa2010-03-08 20:52:55 +00001434 if (!Scope->getScopeNode())
Devang Patelbc97f6b2010-03-08 19:20:38 +00001435 return NULL;
Devang Patel3b548aa2010-03-08 20:52:55 +00001436 DIScope DS(Scope->getScopeNode());
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001437 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_inlined_subroutine);
1438
1439 DISubprogram InlinedSP = getDISubprogram(DS.getNode());
Devang Patele064ad42009-11-20 21:37:22 +00001440 DIE *OriginDIE = ModuleCU->getDIE(InlinedSP.getNode());
Chris Lattner8d2fe282010-03-31 05:36:29 +00001441 assert(OriginDIE && "Unable to find Origin DIE!");
Devang Patel930143b2009-11-21 02:48:08 +00001442 addDIEEntry(ScopeDIE, dwarf::DW_AT_abstract_origin,
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001443 dwarf::DW_FORM_ref4, OriginDIE);
1444
Chris Lattner085b6522010-03-09 00:31:02 +00001445 addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, StartLabel);
Chris Lattnere13c3722010-03-09 01:58:53 +00001446 addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr, EndLabel);
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001447
1448 InlinedSubprogramDIEs.insert(OriginDIE);
1449
1450 // Track the start label for this inlined function.
Devang Patel018b29b2010-01-19 06:19:05 +00001451 DenseMap<MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001452 I = InlineInfo.find(InlinedSP.getNode());
1453
1454 if (I == InlineInfo.end()) {
Chris Lattner085b6522010-03-09 00:31:02 +00001455 InlineInfo[InlinedSP.getNode()].push_back(std::make_pair(StartLabel,
Jim Grosbach00e9c612009-11-22 19:20:36 +00001456 ScopeDIE));
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001457 InlinedSPNodes.push_back(InlinedSP.getNode());
1458 } else
Chris Lattner085b6522010-03-09 00:31:02 +00001459 I->second.push_back(std::make_pair(StartLabel, ScopeDIE));
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001460
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001461 DILocation DL(Scope->getInlinedAt());
Devang Patel930143b2009-11-21 02:48:08 +00001462 addUInt(ScopeDIE, dwarf::DW_AT_call_file, 0, ModuleCU->getID());
1463 addUInt(ScopeDIE, dwarf::DW_AT_call_line, 0, DL.getLineNumber());
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001464
1465 return ScopeDIE;
1466}
1467
Devang Patel930143b2009-11-21 02:48:08 +00001468
1469/// constructVariableDIE - Construct a DIE for the given DbgVariable.
Devang Patel9ccfb642009-12-09 18:24:21 +00001470DIE *DwarfDebug::constructVariableDIE(DbgVariable *DV, DbgScope *Scope) {
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001471 // Get the descriptor.
1472 const DIVariable &VD = DV->getVariable();
Devang Patel2d9caf92009-11-25 17:36:49 +00001473 StringRef Name = VD.getName();
1474 if (Name.empty())
Devang Patel97f99fa2009-11-13 02:25:26 +00001475 return NULL;
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001476
1477 // Translate tag to proper Dwarf tag. The result variable is dropped for
1478 // now.
1479 unsigned Tag;
1480 switch (VD.getTag()) {
1481 case dwarf::DW_TAG_return_variable:
1482 return NULL;
1483 case dwarf::DW_TAG_arg_variable:
1484 Tag = dwarf::DW_TAG_formal_parameter;
1485 break;
1486 case dwarf::DW_TAG_auto_variable: // fall thru
1487 default:
1488 Tag = dwarf::DW_TAG_variable;
1489 break;
1490 }
1491
1492 // Define variable debug information entry.
1493 DIE *VariableDie = new DIE(Tag);
1494
1495
1496 DIE *AbsDIE = NULL;
1497 if (DbgVariable *AV = DV->getAbstractVariable())
1498 AbsDIE = AV->getDIE();
Jim Grosbach042483e2009-11-21 23:12:12 +00001499
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001500 if (AbsDIE) {
1501 DIScope DS(Scope->getScopeNode());
1502 DISubprogram InlinedSP = getDISubprogram(DS.getNode());
Devang Patele064ad42009-11-20 21:37:22 +00001503 DIE *OriginSPDIE = ModuleCU->getDIE(InlinedSP.getNode());
Daniel Dunbar75b4d352009-11-11 03:09:50 +00001504 (void) OriginSPDIE;
Chris Lattner8d2fe282010-03-31 05:36:29 +00001505 assert(OriginSPDIE && "Unable to find Origin DIE for the SP!");
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001506 DIE *AbsDIE = DV->getAbstractVariable()->getDIE();
Chris Lattner8d2fe282010-03-31 05:36:29 +00001507 assert(AbsDIE && "Unable to find Origin DIE for the Variable!");
Devang Patel930143b2009-11-21 02:48:08 +00001508 addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin,
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001509 dwarf::DW_FORM_ref4, AbsDIE);
1510 }
1511 else {
Devang Patel930143b2009-11-21 02:48:08 +00001512 addString(VariableDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1513 addSourceLine(VariableDie, &VD);
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001514
1515 // Add variable type.
Jim Grosbach042483e2009-11-21 23:12:12 +00001516 // FIXME: isBlockByrefVariable should be reformulated in terms of complex
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001517 // addresses instead.
1518 if (VD.isBlockByrefVariable())
Devang Patel9ccfb642009-12-09 18:24:21 +00001519 addType(VariableDie, getBlockByrefType(VD.getType(), Name));
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001520 else
Devang Patel9ccfb642009-12-09 18:24:21 +00001521 addType(VariableDie, VD.getType());
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001522 }
1523
1524 // Add variable address.
1525 if (!Scope->isAbstractScope()) {
Devang Patela3e9c9c2010-03-15 18:33:46 +00001526 // Check if variable is described by DBG_VALUE instruction.
1527 if (const MachineInstr *DbgValueInsn = DV->getDbgValue()) {
1528 if (DbgValueInsn->getNumOperands() == 3) {
1529 // FIXME : Handle getNumOperands != 3
1530 if (DbgValueInsn->getOperand(0).getType()
1531 == MachineOperand::MO_Register
1532 && DbgValueInsn->getOperand(0).getReg()) {
1533 MachineLocation Location;
1534 Location.set(DbgValueInsn->getOperand(0).getReg());
1535 addAddress(VariableDie, dwarf::DW_AT_location, Location);
Devang Patel23b2ae62010-03-29 22:59:58 +00001536 if (MCSymbol *VS = DV->getDbgValueLabel())
1537 addLabel(VariableDie, dwarf::DW_AT_start_scope, dwarf::DW_FORM_addr,
1538 VS);
Devang Patela3e9c9c2010-03-15 18:33:46 +00001539 } else if (DbgValueInsn->getOperand(0).getType() ==
1540 MachineOperand::MO_Immediate) {
Benjamin Kramer74729ae2010-03-31 19:34:01 +00001541 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Devang Patela3e9c9c2010-03-15 18:33:46 +00001542 unsigned Imm = DbgValueInsn->getOperand(0).getImm();
1543 addUInt(Block, 0, dwarf::DW_FORM_udata, Imm);
1544 addBlock(VariableDie, dwarf::DW_AT_const_value, 0, Block);
Devang Patel23b2ae62010-03-29 22:59:58 +00001545 if (MCSymbol *VS = DV->getDbgValueLabel())
1546 addLabel(VariableDie, dwarf::DW_AT_start_scope, dwarf::DW_FORM_addr,
1547 VS);
Bill Wendling30346342010-04-05 22:59:21 +00001548 } else if (DbgValueInsn->getOperand(0).getType() ==
1549 MachineOperand::MO_FPImmediate) {
1550 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1551 APFloat FPImm = DbgValueInsn->getOperand(0).getFPImm()->getValueAPF();
1552
1553 // Get the raw data form of the floating point.
1554 const APInt FltVal = FPImm.bitcastToAPInt();
1555 const char *FltPtr = (const char*)FltVal.getRawData();
1556
John McCall796583e2010-04-06 23:35:53 +00001557 int NumBytes = FltVal.getBitWidth() / 8; // 8 bits per byte.
Bill Wendling30346342010-04-05 22:59:21 +00001558 bool LittleEndian = Asm->getTargetData().isLittleEndian();
1559 int Incr = (LittleEndian ? 1 : -1);
1560 int Start = (LittleEndian ? 0 : NumBytes - 1);
1561 int Stop = (LittleEndian ? NumBytes : -1);
1562
1563 // Output the constant to DWARF one byte at a time.
1564 for (; Start != Stop; Start += Incr)
1565 addUInt(Block, 0, dwarf::DW_FORM_data1,
1566 (unsigned char)0xFF & FltPtr[Start]);
1567
1568 addBlock(VariableDie, dwarf::DW_AT_const_value, 0, Block);
1569
1570 if (MCSymbol *VS = DV->getDbgValueLabel())
1571 addLabel(VariableDie, dwarf::DW_AT_start_scope, dwarf::DW_FORM_addr,
1572 VS);
Devang Patela3e9c9c2010-03-15 18:33:46 +00001573 } else {
1574 //FIXME : Handle other operand types.
1575 delete VariableDie;
1576 return NULL;
1577 }
1578 }
1579 } else {
1580 MachineLocation Location;
1581 unsigned FrameReg;
Chris Lattner3a383cb2010-04-05 00:13:49 +00001582 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
1583 int Offset = RI->getFrameIndexReference(*Asm->MF, DV->getFrameIndex(),
Chris Lattner71696ef2010-03-31 06:06:37 +00001584 FrameReg);
Devang Patela3e9c9c2010-03-15 18:33:46 +00001585 Location.set(FrameReg, Offset);
1586
1587 if (VD.hasComplexAddress())
1588 addComplexAddress(DV, VariableDie, dwarf::DW_AT_location, Location);
1589 else if (VD.isBlockByrefVariable())
1590 addBlockByrefAddress(DV, VariableDie, dwarf::DW_AT_location, Location);
1591 else
1592 addAddress(VariableDie, dwarf::DW_AT_location, Location);
1593 }
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001594 }
Devang Patel6efc8e52010-02-06 01:02:37 +00001595
1596 if (Tag == dwarf::DW_TAG_formal_parameter && VD.getType().isArtificial())
1597 addUInt(VariableDie, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001598 DV->setDIE(VariableDie);
1599 return VariableDie;
1600
1601}
Devang Patel930143b2009-11-21 02:48:08 +00001602
Devang Patel04d2f2d2009-11-24 01:14:22 +00001603void DwarfDebug::addPubTypes(DISubprogram SP) {
1604 DICompositeType SPTy = SP.getType();
1605 unsigned SPTag = SPTy.getTag();
1606 if (SPTag != dwarf::DW_TAG_subroutine_type)
1607 return;
1608
1609 DIArray Args = SPTy.getTypeArray();
Devang Patel04d2f2d2009-11-24 01:14:22 +00001610 for (unsigned i = 0, e = Args.getNumElements(); i != e; ++i) {
1611 DIType ATy(Args.getElement(i).getNode());
Devang Patel3b548aa2010-03-08 20:52:55 +00001612 if (!ATy.isValid())
Devang Patel04d2f2d2009-11-24 01:14:22 +00001613 continue;
1614 DICompositeType CATy = getDICompositeType(ATy);
Devang Patel12d150e2010-04-13 20:35:04 +00001615 if (DIDescriptor(CATy.getNode()).Verify() && !CATy.getName().empty()
1616 && !CATy.isForwardDecl()) {
Devang Patel04d2f2d2009-11-24 01:14:22 +00001617 if (DIEEntry *Entry = ModuleCU->getDIEEntry(CATy.getNode()))
1618 ModuleCU->addGlobalType(CATy.getName(), Entry->getEntry());
1619 }
1620 }
1621}
1622
Devang Patel930143b2009-11-21 02:48:08 +00001623/// constructScopeDIE - Construct a DIE for this scope.
1624DIE *DwarfDebug::constructScopeDIE(DbgScope *Scope) {
Devang Patel3b548aa2010-03-08 20:52:55 +00001625 if (!Scope || !Scope->getScopeNode())
1626 return NULL;
1627
1628 DIScope DS(Scope->getScopeNode());
1629 DIE *ScopeDIE = NULL;
1630 if (Scope->getInlinedAt())
1631 ScopeDIE = constructInlinedScopeDIE(Scope);
1632 else if (DS.isSubprogram()) {
1633 if (Scope->isAbstractScope())
1634 ScopeDIE = ModuleCU->getDIE(DS.getNode());
1635 else
1636 ScopeDIE = updateSubprogramScopeDIE(DS.getNode());
1637 }
Devang Patel23b2ae62010-03-29 22:59:58 +00001638 else
Devang Patel3b548aa2010-03-08 20:52:55 +00001639 ScopeDIE = constructLexicalScopeDIE(Scope);
Devang Patel23b2ae62010-03-29 22:59:58 +00001640 if (!ScopeDIE) return NULL;
Devang Patel3b548aa2010-03-08 20:52:55 +00001641
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001642 // Add variables to scope.
Jeffrey Yasskin35b4e4f2010-03-12 17:45:06 +00001643 const SmallVector<DbgVariable *, 8> &Variables = Scope->getVariables();
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001644 for (unsigned i = 0, N = Variables.size(); i < N; ++i) {
Devang Patel9ccfb642009-12-09 18:24:21 +00001645 DIE *VariableDIE = constructVariableDIE(Variables[i], Scope);
Jim Grosbach042483e2009-11-21 23:12:12 +00001646 if (VariableDIE)
Devang Patel930143b2009-11-21 02:48:08 +00001647 ScopeDIE->addChild(VariableDIE);
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001648 }
1649
1650 // Add nested scopes.
Jeffrey Yasskin35b4e4f2010-03-12 17:45:06 +00001651 const SmallVector<DbgScope *, 4> &Scopes = Scope->getScopes();
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001652 for (unsigned j = 0, M = Scopes.size(); j < M; ++j) {
1653 // Define the Scope debug information entry.
Devang Patel930143b2009-11-21 02:48:08 +00001654 DIE *NestedDIE = constructScopeDIE(Scopes[j]);
Jim Grosbach042483e2009-11-21 23:12:12 +00001655 if (NestedDIE)
Devang Patel930143b2009-11-21 02:48:08 +00001656 ScopeDIE->addChild(NestedDIE);
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001657 }
Devang Patel04d2f2d2009-11-24 01:14:22 +00001658
1659 if (DS.isSubprogram())
1660 addPubTypes(DISubprogram(DS.getNode()));
1661
1662 return ScopeDIE;
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001663}
1664
Bill Wendling2b128d72009-05-20 23:19:06 +00001665/// GetOrCreateSourceID - Look up the source id with the given directory and
1666/// source file names. If none currently exists, create a new id and insert it
1667/// in the SourceIds map. This can update DirectoryNames and SourceFileNames
1668/// maps as well.
Chris Lattner71696ef2010-03-31 06:06:37 +00001669unsigned DwarfDebug::GetOrCreateSourceID(StringRef DirName, StringRef FileName){
Bill Wendling2b128d72009-05-20 23:19:06 +00001670 unsigned DId;
1671 StringMap<unsigned>::iterator DI = DirectoryIdMap.find(DirName);
1672 if (DI != DirectoryIdMap.end()) {
1673 DId = DI->getValue();
1674 } else {
1675 DId = DirectoryNames.size() + 1;
1676 DirectoryIdMap[DirName] = DId;
1677 DirectoryNames.push_back(DirName);
1678 }
1679
1680 unsigned FId;
1681 StringMap<unsigned>::iterator FI = SourceFileIdMap.find(FileName);
1682 if (FI != SourceFileIdMap.end()) {
1683 FId = FI->getValue();
1684 } else {
1685 FId = SourceFileNames.size() + 1;
1686 SourceFileIdMap[FileName] = FId;
1687 SourceFileNames.push_back(FileName);
1688 }
1689
1690 DenseMap<std::pair<unsigned, unsigned>, unsigned>::iterator SI =
1691 SourceIdMap.find(std::make_pair(DId, FId));
1692 if (SI != SourceIdMap.end())
1693 return SI->second;
1694
1695 unsigned SrcId = SourceIds.size() + 1; // DW_AT_decl_file cannot be 0.
1696 SourceIdMap[std::make_pair(DId, FId)] = SrcId;
1697 SourceIds.push_back(std::make_pair(DId, FId));
1698
1699 return SrcId;
1700}
1701
Devang Patel1f4690c2009-12-15 19:16:48 +00001702/// getOrCreateNameSpace - Create a DIE for DINameSpace.
1703DIE *DwarfDebug::getOrCreateNameSpace(DINameSpace NS) {
1704 DIE *NDie = ModuleCU->getDIE(NS.getNode());
1705 if (NDie)
1706 return NDie;
1707 NDie = new DIE(dwarf::DW_TAG_namespace);
1708 ModuleCU->insertDIE(NS.getNode(), NDie);
1709 if (!NS.getName().empty())
1710 addString(NDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, NS.getName());
1711 addSourceLine(NDie, &NS);
1712 addToContextOwner(NDie, NS.getContext());
1713 return NDie;
1714}
1715
Jeffrey Yasskin0708de12010-03-11 18:29:55 +00001716void DwarfDebug::constructCompileUnit(MDNode *N) {
Devang Patel80ae3492009-08-28 23:24:31 +00001717 DICompileUnit DIUnit(N);
Jeffrey Yasskin0708de12010-03-11 18:29:55 +00001718 // Use first compile unit marked as isMain as the compile unit for this
1719 // module.
1720 if (ModuleCU || !DIUnit.isMain())
1721 return;
Devang Patel2d9caf92009-11-25 17:36:49 +00001722 StringRef FN = DIUnit.getFilename();
1723 StringRef Dir = DIUnit.getDirectory();
Devang Patelb2969422009-09-29 18:40:58 +00001724 unsigned ID = GetOrCreateSourceID(Dir, FN);
Bill Wendling2b128d72009-05-20 23:19:06 +00001725
1726 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
Devang Patel930143b2009-11-21 02:48:08 +00001727 addString(Die, dwarf::DW_AT_producer, dwarf::DW_FORM_string,
Devang Patelb2969422009-09-29 18:40:58 +00001728 DIUnit.getProducer());
Devang Patel930143b2009-11-21 02:48:08 +00001729 addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data1,
Bill Wendling2b128d72009-05-20 23:19:06 +00001730 DIUnit.getLanguage());
Devang Patel930143b2009-11-21 02:48:08 +00001731 addString(Die, dwarf::DW_AT_name, dwarf::DW_FORM_string, FN);
Chris Lattner6629ca92010-04-04 22:59:04 +00001732 addLabel(Die, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, TextSectionSym);
Devang Pateld22ed622010-03-22 23:11:36 +00001733 addLabel(Die, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
Chris Lattnera179b522010-04-04 19:25:43 +00001734 Asm->GetTempSymbol("text_end"));
Devang Pateld22ed622010-03-22 23:11:36 +00001735 // DW_AT_stmt_list is a offset of line number information for this
1736 // compile unit in debug_line section. It is always zero when only one
1737 // compile unit is emitted in one object file.
1738 addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4, 0);
Bill Wendling2b128d72009-05-20 23:19:06 +00001739
Devang Patel2d9caf92009-11-25 17:36:49 +00001740 if (!Dir.empty())
Devang Patel930143b2009-11-21 02:48:08 +00001741 addString(Die, dwarf::DW_AT_comp_dir, dwarf::DW_FORM_string, Dir);
Bill Wendling2b128d72009-05-20 23:19:06 +00001742 if (DIUnit.isOptimized())
Devang Patel930143b2009-11-21 02:48:08 +00001743 addUInt(Die, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1);
Bill Wendling2b128d72009-05-20 23:19:06 +00001744
Devang Patel2d9caf92009-11-25 17:36:49 +00001745 StringRef Flags = DIUnit.getFlags();
1746 if (!Flags.empty())
Devang Patel930143b2009-11-21 02:48:08 +00001747 addString(Die, dwarf::DW_AT_APPLE_flags, dwarf::DW_FORM_string, Flags);
Bill Wendling2b128d72009-05-20 23:19:06 +00001748
1749 unsigned RVer = DIUnit.getRunTimeVersion();
1750 if (RVer)
Devang Patel930143b2009-11-21 02:48:08 +00001751 addUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers,
Bill Wendling2b128d72009-05-20 23:19:06 +00001752 dwarf::DW_FORM_data1, RVer);
1753
Jeffrey Yasskin0708de12010-03-11 18:29:55 +00001754 assert(!ModuleCU &&
1755 "ModuleCU assigned since the top of constructCompileUnit");
1756 ModuleCU = new CompileUnit(ID, Die);
Bill Wendling2b128d72009-05-20 23:19:06 +00001757}
1758
Devang Patel930143b2009-11-21 02:48:08 +00001759void DwarfDebug::constructGlobalVariableDIE(MDNode *N) {
Devang Patel80ae3492009-08-28 23:24:31 +00001760 DIGlobalVariable DI_GV(N);
Daniel Dunbarc418d6b2009-09-19 20:40:05 +00001761
Devang Patelf5d53602009-09-04 23:59:07 +00001762 // If debug information is malformed then ignore it.
1763 if (DI_GV.Verify() == false)
1764 return;
Bill Wendling2b128d72009-05-20 23:19:06 +00001765
1766 // Check for pre-existence.
Devang Patele064ad42009-11-20 21:37:22 +00001767 if (ModuleCU->getDIE(DI_GV.getNode()))
Devang Patel0751a282009-06-26 01:49:18 +00001768 return;
Bill Wendling2b128d72009-05-20 23:19:06 +00001769
Devang Patel9ccfb642009-12-09 18:24:21 +00001770 DIE *VariableDie = createGlobalVariableDIE(DI_GV);
Devang Patel2eec32d2009-12-10 23:25:41 +00001771 if (!VariableDie)
1772 return;
Bill Wendling2b128d72009-05-20 23:19:06 +00001773
Bill Wendling2b128d72009-05-20 23:19:06 +00001774 // Add to map.
Devang Patele064ad42009-11-20 21:37:22 +00001775 ModuleCU->insertDIE(N, VariableDie);
Bill Wendling2b128d72009-05-20 23:19:06 +00001776
1777 // Add to context owner.
Devang Patel89880c82010-01-15 01:12:22 +00001778 DIDescriptor GVContext = DI_GV.getContext();
1779 // Do not create specification DIE if context is either compile unit
1780 // or a subprogram.
Chris Lattner71696ef2010-03-31 06:06:37 +00001781 if (DI_GV.isDefinition() && !GVContext.isCompileUnit() &&
Devang Patel019922d2010-04-06 23:53:48 +00001782 !GVContext.isFile() &&
1783 !isSubprogramContext(GVContext.getNode())) {
Devang Patel1f4690c2009-12-15 19:16:48 +00001784 // Create specification DIE.
1785 DIE *VariableSpecDIE = new DIE(dwarf::DW_TAG_variable);
1786 addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification,
1787 dwarf::DW_FORM_ref4, VariableDie);
Benjamin Kramer74729ae2010-03-31 19:34:01 +00001788 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Devang Patel1f4690c2009-12-15 19:16:48 +00001789 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
Chris Lattner8dcf41e2010-03-08 22:31:46 +00001790 addLabel(Block, 0, dwarf::DW_FORM_udata,
Chris Lattner9e4cafe2010-03-12 21:09:07 +00001791 Asm->Mang->getSymbol(DI_GV.getGlobal()));
Devang Patel1f4690c2009-12-15 19:16:48 +00001792 addBlock(VariableSpecDIE, dwarf::DW_AT_location, 0, Block);
Devang Patelce25dd72010-02-09 01:58:33 +00001793 addUInt(VariableDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
Devang Patel1f4690c2009-12-15 19:16:48 +00001794 ModuleCU->addDie(VariableSpecDIE);
1795 } else {
Benjamin Kramer74729ae2010-03-31 19:34:01 +00001796 DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
Devang Patel1f4690c2009-12-15 19:16:48 +00001797 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
Chris Lattner8dcf41e2010-03-08 22:31:46 +00001798 addLabel(Block, 0, dwarf::DW_FORM_udata,
Chris Lattner9e4cafe2010-03-12 21:09:07 +00001799 Asm->Mang->getSymbol(DI_GV.getGlobal()));
Devang Patel1f4690c2009-12-15 19:16:48 +00001800 addBlock(VariableDie, dwarf::DW_AT_location, 0, Block);
1801 }
Devang Patel89880c82010-01-15 01:12:22 +00001802 addToContextOwner(VariableDie, GVContext);
Devang Patel2b75ed22009-12-10 19:14:49 +00001803
Bill Wendling2b128d72009-05-20 23:19:06 +00001804 // Expose as global. FIXME - need to check external flag.
Devang Patel930143b2009-11-21 02:48:08 +00001805 ModuleCU->addGlobal(DI_GV.getName(), VariableDie);
Devang Patel04d2f2d2009-11-24 01:14:22 +00001806
1807 DIType GTy = DI_GV.getType();
Devang Patel12d150e2010-04-13 20:35:04 +00001808 if (GTy.isCompositeType() && !GTy.getName().empty()
1809 && !GTy.isForwardDecl()) {
Devang Patel04d2f2d2009-11-24 01:14:22 +00001810 DIEEntry *Entry = ModuleCU->getDIEEntry(GTy.getNode());
Chris Lattner8d2fe282010-03-31 05:36:29 +00001811 assert(Entry && "Missing global type!");
Devang Patel04d2f2d2009-11-24 01:14:22 +00001812 ModuleCU->addGlobalType(GTy.getName(), Entry->getEntry());
1813 }
Devang Patel0751a282009-06-26 01:49:18 +00001814 return;
Bill Wendling2b128d72009-05-20 23:19:06 +00001815}
1816
Devang Patel930143b2009-11-21 02:48:08 +00001817void DwarfDebug::constructSubprogramDIE(MDNode *N) {
Devang Patel80ae3492009-08-28 23:24:31 +00001818 DISubprogram SP(N);
Bill Wendling2b128d72009-05-20 23:19:06 +00001819
Stuart Hastings4bd3dd92010-04-06 21:38:29 +00001820 // Check for pre-existence.
1821 if (ModuleCU->getDIE(N))
1822 return;
1823
Bill Wendling2b128d72009-05-20 23:19:06 +00001824 if (!SP.isDefinition())
1825 // This is a method declaration which will be handled while constructing
1826 // class type.
Devang Patel0751a282009-06-26 01:49:18 +00001827 return;
Bill Wendling2b128d72009-05-20 23:19:06 +00001828
Stuart Hastings4bd3dd92010-04-06 21:38:29 +00001829 DIE *SubprogramDie = createSubprogramDIE(SP);
1830
1831 // Add to map.
1832 ModuleCU->insertDIE(N, SubprogramDie);
Bill Wendling2b128d72009-05-20 23:19:06 +00001833
1834 // Add to context owner.
Devang Patel1f4690c2009-12-15 19:16:48 +00001835 addToContextOwner(SubprogramDie, SP.getContext());
Devang Patel512001a2009-12-08 23:21:45 +00001836
Bill Wendling2b128d72009-05-20 23:19:06 +00001837 // Expose as global.
Devang Patel930143b2009-11-21 02:48:08 +00001838 ModuleCU->addGlobal(SP.getName(), SubprogramDie);
Devang Patel04d2f2d2009-11-24 01:14:22 +00001839
Devang Patel0751a282009-06-26 01:49:18 +00001840 return;
Bill Wendling2b128d72009-05-20 23:19:06 +00001841}
1842
Devang Patel930143b2009-11-21 02:48:08 +00001843/// beginModule - Emit all Dwarf sections that should come prior to the
Daniel Dunbarbe22ec42009-09-19 20:40:14 +00001844/// content. Create global DIEs and emit initial debug info sections.
1845/// This is inovked by the target AsmPrinter.
Chris Lattner11980022010-04-04 07:48:20 +00001846void DwarfDebug::beginModule(Module *M) {
Devang Patel63524442009-07-30 18:56:46 +00001847 DebugInfoFinder DbgFinder;
1848 DbgFinder.processModule(*M);
Devang Patel0751a282009-06-26 01:49:18 +00001849
Chris Lattner7cfa70e2010-04-05 02:19:28 +00001850 bool HasDebugInfo = false;
1851
1852 // Scan all the compile-units to see if there are any marked as the main unit.
1853 // if not, we do not generate debug info.
1854 for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
1855 E = DbgFinder.compile_unit_end(); I != E; ++I) {
1856 if (DICompileUnit(*I).isMain()) {
1857 HasDebugInfo = true;
1858 break;
1859 }
1860 }
1861
1862 if (!HasDebugInfo) return;
1863
1864 // Tell MMI that we have debug info.
1865 MMI->setDebugInfoAvailability(true);
1866
Chris Lattnerd442aa32010-04-04 23:17:54 +00001867 // Emit initial sections.
Chris Lattner7cfa70e2010-04-05 02:19:28 +00001868 EmitSectionLabels();
Chris Lattnerd442aa32010-04-04 23:17:54 +00001869
Bill Wendling2b128d72009-05-20 23:19:06 +00001870 // Create all the compile unit DIEs.
Devang Patel63524442009-07-30 18:56:46 +00001871 for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
1872 E = DbgFinder.compile_unit_end(); I != E; ++I)
Devang Patel930143b2009-11-21 02:48:08 +00001873 constructCompileUnit(*I);
Bill Wendling2b128d72009-05-20 23:19:06 +00001874
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001875 // Create DIEs for each subprogram.
Devang Patel63524442009-07-30 18:56:46 +00001876 for (DebugInfoFinder::iterator I = DbgFinder.subprogram_begin(),
1877 E = DbgFinder.subprogram_end(); I != E; ++I)
Devang Patel930143b2009-11-21 02:48:08 +00001878 constructSubprogramDIE(*I);
Devang Patel0751a282009-06-26 01:49:18 +00001879
Devang Patel2b75ed22009-12-10 19:14:49 +00001880 // Create DIEs for each global variable.
1881 for (DebugInfoFinder::iterator I = DbgFinder.global_variable_begin(),
1882 E = DbgFinder.global_variable_end(); I != E; ++I)
1883 constructGlobalVariableDIE(*I);
1884
Bill Wendling2b128d72009-05-20 23:19:06 +00001885 // Prime section data.
Chris Lattner5e693ed2009-07-28 03:13:23 +00001886 SectionMap.insert(Asm->getObjFileLowering().getTextSection());
Bill Wendling2b128d72009-05-20 23:19:06 +00001887
1888 // Print out .file directives to specify files for .loc directives. These are
1889 // printed out early so that they precede any .loc directives.
Chris Lattner3a383cb2010-04-05 00:13:49 +00001890 if (Asm->MAI->hasDotLocAndDotFile()) {
Bill Wendling2b128d72009-05-20 23:19:06 +00001891 for (unsigned i = 1, e = getNumSourceIds()+1; i != e; ++i) {
1892 // Remember source id starts at 1.
1893 std::pair<unsigned, unsigned> Id = getSourceDirectoryAndFileIds(i);
Chris Lattnerf5c834f2010-01-22 22:09:00 +00001894 // FIXME: don't use sys::path for this! This should not depend on the
1895 // host.
Bill Wendling2b128d72009-05-20 23:19:06 +00001896 sys::Path FullPath(getSourceDirectoryName(Id.first));
1897 bool AppendOk =
1898 FullPath.appendComponent(getSourceFileName(Id.second));
1899 assert(AppendOk && "Could not append filename to directory!");
1900 AppendOk = false;
Chris Lattner601ef332010-01-25 18:58:59 +00001901 Asm->OutStreamer.EmitDwarfFileDirective(i, FullPath.str());
Bill Wendling2b128d72009-05-20 23:19:06 +00001902 }
1903 }
Bill Wendling2b128d72009-05-20 23:19:06 +00001904}
1905
Devang Patel930143b2009-11-21 02:48:08 +00001906/// endModule - Emit all Dwarf sections that should come after the content.
Bill Wendling2b128d72009-05-20 23:19:06 +00001907///
Devang Patel930143b2009-11-21 02:48:08 +00001908void DwarfDebug::endModule() {
Bill Wendlingfcc14142010-04-07 09:28:04 +00001909 if (!ModuleCU) return;
Bill Wendling2b128d72009-05-20 23:19:06 +00001910
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001911 // Attach DW_AT_inline attribute with inlined subprogram DIEs.
1912 for (SmallPtrSet<DIE *, 4>::iterator AI = InlinedSubprogramDIEs.begin(),
1913 AE = InlinedSubprogramDIEs.end(); AI != AE; ++AI) {
1914 DIE *ISP = *AI;
Devang Patel930143b2009-11-21 02:48:08 +00001915 addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001916 }
1917
Devang Patel018b29b2010-01-19 06:19:05 +00001918 for (DenseMap<DIE *, MDNode *>::iterator CI = ContainingTypeMap.begin(),
Devang Pateleb57c592009-12-03 19:11:07 +00001919 CE = ContainingTypeMap.end(); CI != CE; ++CI) {
1920 DIE *SPDie = CI->first;
1921 MDNode *N = dyn_cast_or_null<MDNode>(CI->second);
1922 if (!N) continue;
1923 DIE *NDie = ModuleCU->getDIE(N);
1924 if (!NDie) continue;
1925 addDIEEntry(SPDie, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, NDie);
Devang Pateleb57c592009-12-03 19:11:07 +00001926 }
1927
Bill Wendling2b128d72009-05-20 23:19:06 +00001928 // Standard sections final addresses.
Chris Lattner4b7dadb2009-08-19 05:49:37 +00001929 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getTextSection());
Chris Lattnera179b522010-04-04 19:25:43 +00001930 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("text_end"));
Chris Lattner4b7dadb2009-08-19 05:49:37 +00001931 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getDataSection());
Chris Lattnera179b522010-04-04 19:25:43 +00001932 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("data_end"));
Bill Wendling2b128d72009-05-20 23:19:06 +00001933
1934 // End text sections.
1935 for (unsigned i = 1, N = SectionMap.size(); i <= N; ++i) {
Chris Lattner4b7dadb2009-08-19 05:49:37 +00001936 Asm->OutStreamer.SwitchSection(SectionMap[i]);
Chris Lattnera179b522010-04-04 19:25:43 +00001937 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("section_end", i));
Bill Wendling2b128d72009-05-20 23:19:06 +00001938 }
1939
1940 // Emit common frame information.
Devang Patel930143b2009-11-21 02:48:08 +00001941 emitCommonDebugFrame();
Bill Wendling2b128d72009-05-20 23:19:06 +00001942
1943 // Emit function debug frame information
1944 for (std::vector<FunctionDebugFrameInfo>::iterator I = DebugFrames.begin(),
1945 E = DebugFrames.end(); I != E; ++I)
Devang Patel930143b2009-11-21 02:48:08 +00001946 emitFunctionDebugFrame(*I);
Bill Wendling2b128d72009-05-20 23:19:06 +00001947
1948 // Compute DIE offsets and sizes.
Devang Patel930143b2009-11-21 02:48:08 +00001949 computeSizeAndOffsets();
Bill Wendling2b128d72009-05-20 23:19:06 +00001950
1951 // Emit all the DIEs into a debug info section
Devang Patel930143b2009-11-21 02:48:08 +00001952 emitDebugInfo();
Bill Wendling2b128d72009-05-20 23:19:06 +00001953
1954 // Corresponding abbreviations into a abbrev section.
Devang Patel930143b2009-11-21 02:48:08 +00001955 emitAbbreviations();
Bill Wendling2b128d72009-05-20 23:19:06 +00001956
1957 // Emit source line correspondence into a debug line section.
Devang Patel930143b2009-11-21 02:48:08 +00001958 emitDebugLines();
Bill Wendling2b128d72009-05-20 23:19:06 +00001959
1960 // Emit info into a debug pubnames section.
Devang Patel930143b2009-11-21 02:48:08 +00001961 emitDebugPubNames();
Bill Wendling2b128d72009-05-20 23:19:06 +00001962
Devang Patel04d2f2d2009-11-24 01:14:22 +00001963 // Emit info into a debug pubtypes section.
1964 emitDebugPubTypes();
1965
Bill Wendling2b128d72009-05-20 23:19:06 +00001966 // Emit info into a debug loc section.
Devang Patel930143b2009-11-21 02:48:08 +00001967 emitDebugLoc();
Bill Wendling2b128d72009-05-20 23:19:06 +00001968
1969 // Emit info into a debug aranges section.
1970 EmitDebugARanges();
1971
1972 // Emit info into a debug ranges section.
Devang Patel930143b2009-11-21 02:48:08 +00001973 emitDebugRanges();
Bill Wendling2b128d72009-05-20 23:19:06 +00001974
1975 // Emit info into a debug macinfo section.
Devang Patel930143b2009-11-21 02:48:08 +00001976 emitDebugMacInfo();
Bill Wendling2b128d72009-05-20 23:19:06 +00001977
1978 // Emit inline info.
Devang Patel930143b2009-11-21 02:48:08 +00001979 emitDebugInlineInfo();
Bill Wendling2b128d72009-05-20 23:19:06 +00001980
Chris Lattnerb7aa9522010-03-13 02:17:42 +00001981 // Emit info into a debug str section.
1982 emitDebugStr();
1983
Jeffrey Yasskin0708de12010-03-11 18:29:55 +00001984 delete ModuleCU;
1985 ModuleCU = NULL; // Reset for the next Module, if any.
Bill Wendling2b128d72009-05-20 23:19:06 +00001986}
1987
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001988/// findAbstractVariable - Find abstract variable, if any, associated with Var.
Jim Grosbach00e9c612009-11-22 19:20:36 +00001989DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &Var,
1990 unsigned FrameIdx,
Chris Lattner915c5f92010-04-02 19:42:39 +00001991 DebugLoc ScopeLoc) {
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001992
1993 DbgVariable *AbsDbgVariable = AbstractVariables.lookup(Var.getNode());
1994 if (AbsDbgVariable)
1995 return AbsDbgVariable;
1996
Chris Lattner915c5f92010-04-02 19:42:39 +00001997 LLVMContext &Ctx = Var.getNode()->getContext();
1998 DbgScope *Scope = AbstractScopes.lookup(ScopeLoc.getScope(Ctx));
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001999 if (!Scope)
2000 return NULL;
2001
Jeffrey Yasskin35b4e4f2010-03-12 17:45:06 +00002002 AbsDbgVariable = new DbgVariable(Var, FrameIdx,
2003 NULL /* No more-abstract variable*/);
Devang Patel930143b2009-11-21 02:48:08 +00002004 Scope->addVariable(AbsDbgVariable);
Devang Patelf6eeaeb2009-11-10 23:06:00 +00002005 AbstractVariables[Var.getNode()] = AbsDbgVariable;
2006 return AbsDbgVariable;
2007}
2008
Devang Patela3e9c9c2010-03-15 18:33:46 +00002009/// findAbstractVariable - Find abstract variable, if any, associated with Var.
2010/// FIXME : Refactor findAbstractVariable.
2011DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &Var,
2012 const MachineInstr *MI,
Chris Lattner915c5f92010-04-02 19:42:39 +00002013 DebugLoc ScopeLoc) {
Devang Patela3e9c9c2010-03-15 18:33:46 +00002014
2015 DbgVariable *AbsDbgVariable = AbstractVariables.lookup(Var.getNode());
2016 if (AbsDbgVariable)
2017 return AbsDbgVariable;
2018
Chris Lattner915c5f92010-04-02 19:42:39 +00002019 LLVMContext &Ctx = Var.getNode()->getContext();
2020 DbgScope *Scope = AbstractScopes.lookup(ScopeLoc.getScope(Ctx));
Devang Patela3e9c9c2010-03-15 18:33:46 +00002021 if (!Scope)
2022 return NULL;
2023
Devang Patel23b2ae62010-03-29 22:59:58 +00002024 AbsDbgVariable = new DbgVariable(Var, MI,
Devang Patela3e9c9c2010-03-15 18:33:46 +00002025 NULL /* No more-abstract variable*/);
2026 Scope->addVariable(AbsDbgVariable);
2027 AbstractVariables[Var.getNode()] = AbsDbgVariable;
Devang Patel23b2ae62010-03-29 22:59:58 +00002028 DbgValueStartMap[MI] = AbsDbgVariable;
Devang Patela3e9c9c2010-03-15 18:33:46 +00002029 return AbsDbgVariable;
2030}
2031
Devang Patel930143b2009-11-21 02:48:08 +00002032/// collectVariableInfo - Populate DbgScope entries with variables' info.
2033void DwarfDebug::collectVariableInfo() {
Chris Lattner3a383cb2010-04-05 00:13:49 +00002034 const LLVMContext &Ctx = Asm->MF->getFunction()->getContext();
Chris Lattner915c5f92010-04-02 19:42:39 +00002035
Devang Patel475d32a2009-10-06 01:26:37 +00002036 MachineModuleInfo::VariableDbgInfoMapTy &VMap = MMI->getVariableDbgInfo();
2037 for (MachineModuleInfo::VariableDbgInfoMapTy::iterator VI = VMap.begin(),
2038 VE = VMap.end(); VI != VE; ++VI) {
Devang Patelac277eb2010-01-22 22:52:10 +00002039 MDNode *Var = VI->first;
Devang Patelf6eeaeb2009-11-10 23:06:00 +00002040 if (!Var) continue;
Chris Lattner915c5f92010-04-02 19:42:39 +00002041 DIVariable DV(Var);
2042 const std::pair<unsigned, DebugLoc> &VP = VI->second;
Devang Patelf6eeaeb2009-11-10 23:06:00 +00002043
Chris Lattner915c5f92010-04-02 19:42:39 +00002044 DbgScope *Scope = 0;
2045 if (MDNode *IA = VP.second.getInlinedAt(Ctx))
2046 Scope = ConcreteScopes.lookup(IA);
2047 if (Scope == 0)
2048 Scope = DbgScopeMap.lookup(VP.second.getScope(Ctx));
2049
Devang Patelcdb7d442009-11-10 23:20:04 +00002050 // If variable scope is not found then skip this variable.
Chris Lattner915c5f92010-04-02 19:42:39 +00002051 if (Scope == 0)
Devang Patelcdb7d442009-11-10 23:20:04 +00002052 continue;
Devang Patelf6eeaeb2009-11-10 23:06:00 +00002053
Chris Lattner915c5f92010-04-02 19:42:39 +00002054 DbgVariable *AbsDbgVariable = findAbstractVariable(DV, VP.first, VP.second);
Jeffrey Yasskin35b4e4f2010-03-12 17:45:06 +00002055 DbgVariable *RegVar = new DbgVariable(DV, VP.first, AbsDbgVariable);
Devang Patel930143b2009-11-21 02:48:08 +00002056 Scope->addVariable(RegVar);
Devang Patel475d32a2009-10-06 01:26:37 +00002057 }
Devang Patela3e9c9c2010-03-15 18:33:46 +00002058
2059 // Collect variable information from DBG_VALUE machine instructions;
Chris Lattner3a383cb2010-04-05 00:13:49 +00002060 for (MachineFunction::const_iterator I = Asm->MF->begin(), E = Asm->MF->end();
Devang Patela3e9c9c2010-03-15 18:33:46 +00002061 I != E; ++I) {
2062 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2063 II != IE; ++II) {
2064 const MachineInstr *MInsn = II;
Chris Lattner848c7d22010-03-31 05:39:57 +00002065 if (!MInsn->isDebugValue())
Devang Patela3e9c9c2010-03-15 18:33:46 +00002066 continue;
Devang Patel23b2ae62010-03-29 22:59:58 +00002067
Devang Patela3e9c9c2010-03-15 18:33:46 +00002068 // FIXME : Lift this restriction.
2069 if (MInsn->getNumOperands() != 3)
2070 continue;
Chris Lattner009de332010-03-31 03:34:40 +00002071 DIVariable DV((MDNode*)(MInsn->getOperand(MInsn->getNumOperands()
2072 - 1).getMetadata()));
Devang Patela3e9c9c2010-03-15 18:33:46 +00002073 if (DV.getTag() == dwarf::DW_TAG_arg_variable) {
2074 // FIXME Handle inlined subroutine arguments.
2075 DbgVariable *ArgVar = new DbgVariable(DV, MInsn, NULL);
2076 CurrentFnDbgScope->addVariable(ArgVar);
Devang Patel23b2ae62010-03-29 22:59:58 +00002077 DbgValueStartMap[MInsn] = ArgVar;
Devang Patela3e9c9c2010-03-15 18:33:46 +00002078 continue;
2079 }
2080
2081 DebugLoc DL = MInsn->getDebugLoc();
2082 if (DL.isUnknown()) continue;
Chris Lattner915c5f92010-04-02 19:42:39 +00002083 DbgScope *Scope = 0;
2084 if (MDNode *IA = DL.getInlinedAt(Ctx))
2085 Scope = ConcreteScopes.lookup(IA);
2086 if (Scope == 0)
2087 Scope = DbgScopeMap.lookup(DL.getScope(Ctx));
2088
Devang Patela3e9c9c2010-03-15 18:33:46 +00002089 // If variable scope is not found then skip this variable.
Chris Lattner915c5f92010-04-02 19:42:39 +00002090 if (Scope == 0)
Devang Patela3e9c9c2010-03-15 18:33:46 +00002091 continue;
2092
Chris Lattner915c5f92010-04-02 19:42:39 +00002093 DbgVariable *AbsDbgVariable = findAbstractVariable(DV, MInsn, DL);
Devang Patela3e9c9c2010-03-15 18:33:46 +00002094 DbgVariable *RegVar = new DbgVariable(DV, MInsn, AbsDbgVariable);
Devang Patel23b2ae62010-03-29 22:59:58 +00002095 DbgValueStartMap[MInsn] = RegVar;
Devang Patela3e9c9c2010-03-15 18:33:46 +00002096 Scope->addVariable(RegVar);
2097 }
2098 }
Devang Patel475d32a2009-10-06 01:26:37 +00002099}
2100
Devang Patelbd477be2010-03-29 17:20:31 +00002101/// beginScope - Process beginning of a scope.
2102void DwarfDebug::beginScope(const MachineInstr *MI) {
Devang Patelbd477be2010-03-29 17:20:31 +00002103 // Check location.
2104 DebugLoc DL = MI->getDebugLoc();
2105 if (DL.isUnknown())
2106 return;
Devang Patelbd477be2010-03-29 17:20:31 +00002107
2108 // Check and update last known location info.
Chris Lattner915c5f92010-04-02 19:42:39 +00002109 if (DL == PrevInstLoc)
2110 return;
2111
Chris Lattner3a383cb2010-04-05 00:13:49 +00002112 MDNode *Scope = DL.getScope(Asm->MF->getFunction()->getContext());
Chris Lattner915c5f92010-04-02 19:42:39 +00002113
2114 // FIXME: Should only verify each scope once!
2115 if (!DIScope(Scope).Verify())
Devang Patelbd477be2010-03-29 17:20:31 +00002116 return;
Devang Patelbd477be2010-03-29 17:20:31 +00002117
Devang Patel23b2ae62010-03-29 22:59:58 +00002118 // DBG_VALUE instruction establishes new value.
Chris Lattner848c7d22010-03-31 05:39:57 +00002119 if (MI->isDebugValue()) {
Devang Patel23b2ae62010-03-29 22:59:58 +00002120 DenseMap<const MachineInstr *, DbgVariable *>::iterator DI
2121 = DbgValueStartMap.find(MI);
2122 if (DI != DbgValueStartMap.end()) {
Chris Lattner915c5f92010-04-02 19:42:39 +00002123 MCSymbol *Label = recordSourceLine(DL.getLine(), DL.getCol(), Scope);
2124 PrevInstLoc = DL;
Devang Patel23b2ae62010-03-29 22:59:58 +00002125 DI->second->setDbgValueLabel(Label);
2126 }
Devang Patel67d94ab2010-03-30 18:07:00 +00002127 return;
Devang Patel23b2ae62010-03-29 22:59:58 +00002128 }
2129
Devang Patelbd477be2010-03-29 17:20:31 +00002130 // Emit a label to indicate location change. This is used for line
2131 // table even if this instruction does start a new scope.
Chris Lattner915c5f92010-04-02 19:42:39 +00002132 MCSymbol *Label = recordSourceLine(DL.getLine(), DL.getCol(), Scope);
2133 PrevInstLoc = DL;
Devang Patelbd477be2010-03-29 17:20:31 +00002134
Devang Patel3ebd8932010-04-08 16:50:29 +00002135 // If this instruction begins a scope then note down corresponding label.
2136 if (InsnsBeginScopeSet.count(MI) != 0)
2137 InsnBeforeLabelMap[MI] = Label;
Devang Patel8db360d2009-10-06 01:50:42 +00002138}
2139
Devang Patel930143b2009-11-21 02:48:08 +00002140/// endScope - Process end of a scope.
2141void DwarfDebug::endScope(const MachineInstr *MI) {
Devang Patelbd477be2010-03-29 17:20:31 +00002142 // Ignore DBG_VALUE instruction.
Chris Lattner848c7d22010-03-31 05:39:57 +00002143 if (MI->isDebugValue())
Devang Patelbd477be2010-03-29 17:20:31 +00002144 return;
2145
2146 // Check location.
2147 DebugLoc DL = MI->getDebugLoc();
2148 if (DL.isUnknown())
2149 return;
Chris Lattner915c5f92010-04-02 19:42:39 +00002150
Devang Patel3ebd8932010-04-08 16:50:29 +00002151 if (InsnsEndScopeSet.count(MI) != 0) {
2152 // Emit a label if this instruction ends a scope.
2153 MCSymbol *Label = MMI->getContext().CreateTempSymbol();
2154 Asm->OutStreamer.EmitLabel(Label);
2155 InsnAfterLabelMap[MI] = Label;
2156 }
Devang Patelf6eeaeb2009-11-10 23:06:00 +00002157}
2158
2159/// createDbgScope - Create DbgScope for the scope.
2160void DwarfDebug::createDbgScope(MDNode *Scope, MDNode *InlinedAt) {
Devang Patelf6eeaeb2009-11-10 23:06:00 +00002161 if (!InlinedAt) {
2162 DbgScope *WScope = DbgScopeMap.lookup(Scope);
2163 if (WScope)
2164 return;
2165 WScope = new DbgScope(NULL, DIDescriptor(Scope), NULL);
2166 DbgScopeMap.insert(std::make_pair(Scope, WScope));
Jim Grosbach042483e2009-11-21 23:12:12 +00002167 if (DIDescriptor(Scope).isLexicalBlock())
Devang Patel4450f262009-11-11 00:18:40 +00002168 createDbgScope(DILexicalBlock(Scope).getContext().getNode(), NULL);
Devang Patelf6eeaeb2009-11-10 23:06:00 +00002169 return;
2170 }
2171
2172 DbgScope *WScope = DbgScopeMap.lookup(InlinedAt);
2173 if (WScope)
2174 return;
2175
2176 WScope = new DbgScope(NULL, DIDescriptor(Scope), InlinedAt);
2177 DbgScopeMap.insert(std::make_pair(InlinedAt, WScope));
2178 DILocation DL(InlinedAt);
2179 createDbgScope(DL.getScope().getNode(), DL.getOrigLocation().getNode());
Devang Patel8db360d2009-10-06 01:50:42 +00002180}
2181
Devang Patel930143b2009-11-21 02:48:08 +00002182/// extractScopeInformation - Scan machine instructions in this function
Chris Lattner848c7d22010-03-31 05:39:57 +00002183/// and collect DbgScopes. Return true, if at least one scope was found.
Chris Lattner76555b52010-01-26 23:18:02 +00002184bool DwarfDebug::extractScopeInformation() {
Devang Patel75cc16c2009-10-01 20:31:14 +00002185 // If scope information was extracted using .dbg intrinsics then there is not
2186 // any need to extract these information by scanning each instruction.
2187 if (!DbgScopeMap.empty())
2188 return false;
2189
Devang Patel530a0752010-01-04 20:44:00 +00002190 DenseMap<const MachineInstr *, unsigned> MIIndexMap;
2191 unsigned MIIndex = 0;
Chris Lattner3a383cb2010-04-05 00:13:49 +00002192 LLVMContext &Ctx = Asm->MF->getFunction()->getContext();
Chris Lattner915c5f92010-04-02 19:42:39 +00002193
Devang Patelf6eeaeb2009-11-10 23:06:00 +00002194 // Scan each instruction and create scopes. First build working set of scopes.
Chris Lattner3a383cb2010-04-05 00:13:49 +00002195 for (MachineFunction::const_iterator I = Asm->MF->begin(), E = Asm->MF->end();
Devang Patel75cc16c2009-10-01 20:31:14 +00002196 I != E; ++I) {
2197 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2198 II != IE; ++II) {
2199 const MachineInstr *MInsn = II;
Devang Patela3e9c9c2010-03-15 18:33:46 +00002200 // FIXME : Remove DBG_VALUE check.
Chris Lattner848c7d22010-03-31 05:39:57 +00002201 if (MInsn->isDebugValue()) continue;
Devang Patel530a0752010-01-04 20:44:00 +00002202 MIIndexMap[MInsn] = MIIndex++;
Chris Lattner915c5f92010-04-02 19:42:39 +00002203
Devang Patel75cc16c2009-10-01 20:31:14 +00002204 DebugLoc DL = MInsn->getDebugLoc();
Devang Patelf6eeaeb2009-11-10 23:06:00 +00002205 if (DL.isUnknown()) continue;
Chris Lattner915c5f92010-04-02 19:42:39 +00002206
2207 MDNode *Scope = DL.getScope(Ctx);
2208
Devang Patel75cc16c2009-10-01 20:31:14 +00002209 // There is no need to create another DIE for compile unit. For all
Jim Grosbach042483e2009-11-21 23:12:12 +00002210 // other scopes, create one DbgScope now. This will be translated
Devang Patel75cc16c2009-10-01 20:31:14 +00002211 // into a scope DIE at the end.
Chris Lattner915c5f92010-04-02 19:42:39 +00002212 if (DIScope(Scope).isCompileUnit()) continue;
2213 createDbgScope(Scope, DL.getInlinedAt(Ctx));
Devang Patelf6eeaeb2009-11-10 23:06:00 +00002214 }
2215 }
2216
Devang Patel18737b22010-04-01 22:47:29 +00002217
Devang Patelf6eeaeb2009-11-10 23:06:00 +00002218 // Build scope hierarchy using working set of scopes.
Chris Lattner3a383cb2010-04-05 00:13:49 +00002219 for (MachineFunction::const_iterator I = Asm->MF->begin(), E = Asm->MF->end();
Devang Patelf6eeaeb2009-11-10 23:06:00 +00002220 I != E; ++I) {
2221 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2222 II != IE; ++II) {
2223 const MachineInstr *MInsn = II;
Devang Patela3e9c9c2010-03-15 18:33:46 +00002224 // FIXME : Remove DBG_VALUE check.
Chris Lattner848c7d22010-03-31 05:39:57 +00002225 if (MInsn->isDebugValue()) continue;
Devang Patelf6eeaeb2009-11-10 23:06:00 +00002226 DebugLoc DL = MInsn->getDebugLoc();
Chris Lattner915c5f92010-04-02 19:42:39 +00002227 if (DL.isUnknown()) continue;
2228
2229 MDNode *Scope = DL.getScope(Ctx);
2230 if (Scope == 0) continue;
2231
Devang Patelf6eeaeb2009-11-10 23:06:00 +00002232 // There is no need to create another DIE for compile unit. For all
Jim Grosbach042483e2009-11-21 23:12:12 +00002233 // other scopes, create one DbgScope now. This will be translated
Devang Patelf6eeaeb2009-11-10 23:06:00 +00002234 // into a scope DIE at the end.
Chris Lattner915c5f92010-04-02 19:42:39 +00002235 if (DIScope(Scope).isCompileUnit()) continue;
2236 DbgScope *DScope = getUpdatedDbgScope(Scope, MInsn, DL.getInlinedAt(Ctx));
2237 DScope->setLastInsn(MInsn);
Devang Patel75cc16c2009-10-01 20:31:14 +00002238 }
2239 }
2240
Devang Patel530a0752010-01-04 20:44:00 +00002241 if (!CurrentFnDbgScope)
2242 return false;
2243
2244 CurrentFnDbgScope->fixInstructionMarkers(MIIndexMap);
Devang Patel75cc16c2009-10-01 20:31:14 +00002245
Devang Patel359b0132010-04-08 18:43:56 +00002246 identifyScopeMarkers();
Devang Patelf1d5a1e2010-04-08 15:37:09 +00002247
2248 return !DbgScopeMap.empty();
2249}
2250
Devang Patel359b0132010-04-08 18:43:56 +00002251/// identifyScopeMarkers() - Indentify instructions that are marking
2252/// beginning of or end of a scope.
2253void DwarfDebug::identifyScopeMarkers() {
Devang Patelf1d5a1e2010-04-08 15:37:09 +00002254
Devang Patel75cc16c2009-10-01 20:31:14 +00002255 // Each scope has first instruction and last instruction to mark beginning
2256 // and end of a scope respectively. Create an inverse map that list scopes
2257 // starts (and ends) with an instruction. One instruction may start (or end)
Devang Patel7771b7c2010-01-20 02:05:23 +00002258 // multiple scopes. Ignore scopes that are not reachable.
2259 SmallVector<DbgScope *, 4> WorkList;
2260 WorkList.push_back(CurrentFnDbgScope);
2261 while (!WorkList.empty()) {
Chris Lattner848c7d22010-03-31 05:39:57 +00002262 DbgScope *S = WorkList.pop_back_val();
Devang Patel7771b7c2010-01-20 02:05:23 +00002263
Jeffrey Yasskin35b4e4f2010-03-12 17:45:06 +00002264 const SmallVector<DbgScope *, 4> &Children = S->getScopes();
Devang Patel7771b7c2010-01-20 02:05:23 +00002265 if (!Children.empty())
Jeffrey Yasskin35b4e4f2010-03-12 17:45:06 +00002266 for (SmallVector<DbgScope *, 4>::const_iterator SI = Children.begin(),
Devang Patel7771b7c2010-01-20 02:05:23 +00002267 SE = Children.end(); SI != SE; ++SI)
2268 WorkList.push_back(*SI);
2269
Devang Patelf6eeaeb2009-11-10 23:06:00 +00002270 if (S->isAbstractScope())
2271 continue;
Devang Patel3ebd8932010-04-08 16:50:29 +00002272 assert(S->getFirstInsn() && "DbgScope does not have first instruction!");
2273 InsnsBeginScopeSet.insert(S->getFirstInsn());
Devang Patel75cc16c2009-10-01 20:31:14 +00002274
Devang Patel3ebd8932010-04-08 16:50:29 +00002275 assert(S->getLastInsn() && "DbgScope does not have last instruction!");
2276 InsnsEndScopeSet.insert(S->getLastInsn());
Devang Patel75cc16c2009-10-01 20:31:14 +00002277 }
Devang Patel75cc16c2009-10-01 20:31:14 +00002278}
2279
Devang Patel930143b2009-11-21 02:48:08 +00002280/// beginFunction - Gather pre-function debug information. Assumes being
Bill Wendling2b128d72009-05-20 23:19:06 +00002281/// emitted immediately after the function entry point.
Chris Lattner76555b52010-01-26 23:18:02 +00002282void DwarfDebug::beginFunction(const MachineFunction *MF) {
Chris Lattner196dbdc2010-04-05 03:52:55 +00002283 if (!MMI->hasDebugInfo()) return;
Bill Wendlingfcc14142010-04-07 09:28:04 +00002284 if (!extractScopeInformation()) return;
Chris Lattner47879752010-03-29 20:38:20 +00002285
Devang Patel930143b2009-11-21 02:48:08 +00002286 collectVariableInfo();
Devang Patel4598eb62009-10-06 18:37:31 +00002287
Bill Wendling2b128d72009-05-20 23:19:06 +00002288 // Assumes in correct section after the entry point.
Chris Lattnera179b522010-04-04 19:25:43 +00002289 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("func_begin",
Chris Lattner3a383cb2010-04-05 00:13:49 +00002290 Asm->getFunctionNumber()));
Bill Wendling2b128d72009-05-20 23:19:06 +00002291
2292 // Emit label for the implicitly defined dbg.stoppoint at the start of the
2293 // function.
Devang Pateldf45c7f2009-10-09 22:42:28 +00002294 DebugLoc FDL = MF->getDefaultDebugLoc();
Chris Lattner915c5f92010-04-02 19:42:39 +00002295 if (FDL.isUnknown()) return;
2296
2297 MDNode *Scope = FDL.getScope(MF->getFunction()->getContext());
2298
2299 DISubprogram SP = getDISubprogram(Scope);
2300 unsigned Line, Col;
2301 if (SP.Verify()) {
2302 Line = SP.getLineNumber();
2303 Col = 0;
2304 } else {
2305 Line = FDL.getLine();
2306 Col = FDL.getCol();
Bill Wendling2b128d72009-05-20 23:19:06 +00002307 }
Chris Lattner915c5f92010-04-02 19:42:39 +00002308
2309 recordSourceLine(Line, Col, Scope);
Bill Wendling2b128d72009-05-20 23:19:06 +00002310}
2311
Devang Patel930143b2009-11-21 02:48:08 +00002312/// endFunction - Gather and emit post-function debug information.
Bill Wendling2b128d72009-05-20 23:19:06 +00002313///
Chris Lattner76555b52010-01-26 23:18:02 +00002314void DwarfDebug::endFunction(const MachineFunction *MF) {
Bill Wendlingfcc14142010-04-07 09:28:04 +00002315 if (!MMI->hasDebugInfo() || DbgScopeMap.empty()) return;
Devang Patel2904aa92009-11-12 19:02:56 +00002316
Devang Patel530a0752010-01-04 20:44:00 +00002317 if (CurrentFnDbgScope) {
2318 // Define end label for subprogram.
Chris Lattner3a383cb2010-04-05 00:13:49 +00002319 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("func_end",
2320 Asm->getFunctionNumber()));
Devang Patel530a0752010-01-04 20:44:00 +00002321
2322 // Get function line info.
2323 if (!Lines.empty()) {
2324 // Get section line info.
2325 unsigned ID = SectionMap.insert(Asm->getCurrentSection());
2326 if (SectionSourceLines.size() < ID) SectionSourceLines.resize(ID);
2327 std::vector<SrcLineInfo> &SectionLineInfos = SectionSourceLines[ID-1];
2328 // Append the function info to section info.
2329 SectionLineInfos.insert(SectionLineInfos.end(),
2330 Lines.begin(), Lines.end());
2331 }
2332
2333 // Construct abstract scopes.
2334 for (SmallVector<DbgScope *, 4>::iterator AI = AbstractScopesList.begin(),
2335 AE = AbstractScopesList.end(); AI != AE; ++AI)
2336 constructScopeDIE(*AI);
2337
2338 constructScopeDIE(CurrentFnDbgScope);
2339
Chris Lattner3a383cb2010-04-05 00:13:49 +00002340 DebugFrames.push_back(FunctionDebugFrameInfo(Asm->getFunctionNumber(),
Devang Patel530a0752010-01-04 20:44:00 +00002341 MMI->getFrameMoves()));
Bill Wendling2b128d72009-05-20 23:19:06 +00002342 }
2343
Bill Wendling2b128d72009-05-20 23:19:06 +00002344 // Clear debug info
Devang Patelfe189e62010-01-19 01:26:02 +00002345 CurrentFnDbgScope = NULL;
Jeffrey Yasskin35b4e4f2010-03-12 17:45:06 +00002346 DeleteContainerSeconds(DbgScopeMap);
Devang Patel541019d2010-04-09 16:04:20 +00002347 InsnsBeginScopeSet.clear();
2348 InsnsEndScopeSet.clear();
Devang Patel23b2ae62010-03-29 22:59:58 +00002349 DbgValueStartMap.clear();
Devang Patelfe189e62010-01-19 01:26:02 +00002350 ConcreteScopes.clear();
Jeffrey Yasskin35b4e4f2010-03-12 17:45:06 +00002351 DeleteContainerSeconds(AbstractScopes);
Devang Patelfe189e62010-01-19 01:26:02 +00002352 AbstractScopesList.clear();
Jeffrey Yasskin35b4e4f2010-03-12 17:45:06 +00002353 AbstractVariables.clear();
Devang Patelb7eadda2010-04-14 01:18:28 +00002354 InsnBeforeLabelMap.clear();
2355 InsnAfterLabelMap.clear();
Bill Wendling2b128d72009-05-20 23:19:06 +00002356 Lines.clear();
Bill Wendling2b128d72009-05-20 23:19:06 +00002357}
2358
Chris Lattnerba35a672010-03-09 04:54:43 +00002359/// recordSourceLine - Register a source line with debug info. Returns the
2360/// unique label that was emitted and which provides correspondence to
2361/// the source line list.
2362MCSymbol *DwarfDebug::recordSourceLine(unsigned Line, unsigned Col, MDNode *S) {
Devang Patel2d9caf92009-11-25 17:36:49 +00002363 StringRef Dir;
2364 StringRef Fn;
Devang Patel2089d162009-10-05 18:03:19 +00002365
2366 DIDescriptor Scope(S);
2367 if (Scope.isCompileUnit()) {
2368 DICompileUnit CU(S);
2369 Dir = CU.getDirectory();
2370 Fn = CU.getFilename();
2371 } else if (Scope.isSubprogram()) {
2372 DISubprogram SP(S);
2373 Dir = SP.getDirectory();
2374 Fn = SP.getFilename();
2375 } else if (Scope.isLexicalBlock()) {
2376 DILexicalBlock DB(S);
2377 Dir = DB.getDirectory();
2378 Fn = DB.getFilename();
2379 } else
Chris Lattner2c3f4782010-03-13 07:26:18 +00002380 assert(0 && "Unexpected scope info");
Devang Patel2089d162009-10-05 18:03:19 +00002381
2382 unsigned Src = GetOrCreateSourceID(Dir, Fn);
Chris Lattner6e52e9d2010-03-14 08:36:50 +00002383 MCSymbol *Label = MMI->getContext().CreateTempSymbol();
Chris Lattnerb4666f42010-03-14 08:15:55 +00002384 Lines.push_back(SrcLineInfo(Line, Col, Src, Label));
Bill Wendling2b128d72009-05-20 23:19:06 +00002385
Chris Lattnerba35a672010-03-09 04:54:43 +00002386 Asm->OutStreamer.EmitLabel(Label);
2387 return Label;
Bill Wendling2b128d72009-05-20 23:19:06 +00002388}
2389
Bill Wendling806535f2009-05-20 23:22:40 +00002390//===----------------------------------------------------------------------===//
2391// Emit Methods
2392//===----------------------------------------------------------------------===//
2393
Devang Patel930143b2009-11-21 02:48:08 +00002394/// computeSizeAndOffset - Compute the size and offset of a DIE.
Bill Wendling480ff322009-05-20 23:21:38 +00002395///
Jim Grosbach00e9c612009-11-22 19:20:36 +00002396unsigned
2397DwarfDebug::computeSizeAndOffset(DIE *Die, unsigned Offset, bool Last) {
Bill Wendling480ff322009-05-20 23:21:38 +00002398 // Get the children.
2399 const std::vector<DIE *> &Children = Die->getChildren();
2400
2401 // If not last sibling and has children then add sibling offset attribute.
Jeffrey Yasskin54ebc982010-03-22 18:47:14 +00002402 if (!Last && !Children.empty())
Benjamin Kramer74729ae2010-03-31 19:34:01 +00002403 Die->addSiblingOffset(DIEValueAllocator);
Bill Wendling480ff322009-05-20 23:21:38 +00002404
2405 // Record the abbreviation.
Devang Patel930143b2009-11-21 02:48:08 +00002406 assignAbbrevNumber(Die->getAbbrev());
Bill Wendling480ff322009-05-20 23:21:38 +00002407
2408 // Get the abbreviation for this DIE.
2409 unsigned AbbrevNumber = Die->getAbbrevNumber();
2410 const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2411
2412 // Set DIE offset
2413 Die->setOffset(Offset);
2414
2415 // Start the size with the size of abbreviation code.
Chris Lattner7b26fce2009-08-22 20:48:53 +00002416 Offset += MCAsmInfo::getULEB128Size(AbbrevNumber);
Bill Wendling480ff322009-05-20 23:21:38 +00002417
2418 const SmallVector<DIEValue*, 32> &Values = Die->getValues();
2419 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
2420
2421 // Size the DIE attribute values.
2422 for (unsigned i = 0, N = Values.size(); i < N; ++i)
2423 // Size attribute value.
Chris Lattner5a00dea2010-04-05 00:18:22 +00002424 Offset += Values[i]->SizeOf(Asm, AbbrevData[i].getForm());
Bill Wendling480ff322009-05-20 23:21:38 +00002425
2426 // Size the DIE children if any.
2427 if (!Children.empty()) {
2428 assert(Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes &&
2429 "Children flag not set");
2430
2431 for (unsigned j = 0, M = Children.size(); j < M; ++j)
Devang Patel930143b2009-11-21 02:48:08 +00002432 Offset = computeSizeAndOffset(Children[j], Offset, (j + 1) == M);
Bill Wendling480ff322009-05-20 23:21:38 +00002433
2434 // End of children marker.
2435 Offset += sizeof(int8_t);
2436 }
2437
2438 Die->setSize(Offset - Die->getOffset());
2439 return Offset;
2440}
2441
Devang Patel930143b2009-11-21 02:48:08 +00002442/// computeSizeAndOffsets - Compute the size and offset of all the DIEs.
Bill Wendling480ff322009-05-20 23:21:38 +00002443///
Devang Patel930143b2009-11-21 02:48:08 +00002444void DwarfDebug::computeSizeAndOffsets() {
Bill Wendling480ff322009-05-20 23:21:38 +00002445 // Compute size of compile unit header.
2446 static unsigned Offset =
2447 sizeof(int32_t) + // Length of Compilation Unit Info
2448 sizeof(int16_t) + // DWARF version number
2449 sizeof(int32_t) + // Offset Into Abbrev. Section
2450 sizeof(int8_t); // Pointer Size (in bytes)
2451
Devang Patel930143b2009-11-21 02:48:08 +00002452 computeSizeAndOffset(ModuleCU->getCUDie(), Offset, true);
Devang Patel40d78412009-06-29 20:45:18 +00002453 CompileUnitOffsets[ModuleCU] = 0;
Bill Wendling480ff322009-05-20 23:21:38 +00002454}
2455
Chris Lattner1fbf53b2010-04-04 23:02:02 +00002456/// EmitSectionSym - Switch to the specified MCSection and emit an assembler
2457/// temporary label to it if SymbolStem is specified.
Chris Lattner6629ca92010-04-04 22:59:04 +00002458static MCSymbol *EmitSectionSym(AsmPrinter *Asm, const MCSection *Section,
Chris Lattner1fbf53b2010-04-04 23:02:02 +00002459 const char *SymbolStem = 0) {
Chris Lattner6629ca92010-04-04 22:59:04 +00002460 Asm->OutStreamer.SwitchSection(Section);
Chris Lattner1fbf53b2010-04-04 23:02:02 +00002461 if (!SymbolStem) return 0;
2462
Chris Lattner6629ca92010-04-04 22:59:04 +00002463 MCSymbol *TmpSym = Asm->GetTempSymbol(SymbolStem);
2464 Asm->OutStreamer.EmitLabel(TmpSym);
2465 return TmpSym;
2466}
2467
2468/// EmitSectionLabels - Emit initial Dwarf sections with a label at
2469/// the start of each one.
Chris Lattner46355d82010-04-04 22:33:59 +00002470void DwarfDebug::EmitSectionLabels() {
Chris Lattner4b7dadb2009-08-19 05:49:37 +00002471 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
Daniel Dunbarc418d6b2009-09-19 20:40:05 +00002472
Bill Wendling480ff322009-05-20 23:21:38 +00002473 // Dwarf sections base addresses.
Chris Lattner3a383cb2010-04-05 00:13:49 +00002474 if (Asm->MAI->doesDwarfRequireFrameSection()) {
Chris Lattner6629ca92010-04-04 22:59:04 +00002475 DwarfFrameSectionSym =
2476 EmitSectionSym(Asm, TLOF.getDwarfFrameSection(), "section_debug_frame");
2477 }
Bill Wendling480ff322009-05-20 23:21:38 +00002478
Chris Lattner6629ca92010-04-04 22:59:04 +00002479 DwarfInfoSectionSym =
2480 EmitSectionSym(Asm, TLOF.getDwarfInfoSection(), "section_info");
2481 DwarfAbbrevSectionSym =
2482 EmitSectionSym(Asm, TLOF.getDwarfAbbrevSection(), "section_abbrev");
Chris Lattner1fbf53b2010-04-04 23:02:02 +00002483 EmitSectionSym(Asm, TLOF.getDwarfARangesSection());
Chris Lattner6629ca92010-04-04 22:59:04 +00002484
2485 if (const MCSection *MacroInfo = TLOF.getDwarfMacroInfoSection())
Chris Lattner1fbf53b2010-04-04 23:02:02 +00002486 EmitSectionSym(Asm, MacroInfo);
Bill Wendling480ff322009-05-20 23:21:38 +00002487
Chris Lattner1fbf53b2010-04-04 23:02:02 +00002488 EmitSectionSym(Asm, TLOF.getDwarfLineSection());
2489 EmitSectionSym(Asm, TLOF.getDwarfLocSection());
2490 EmitSectionSym(Asm, TLOF.getDwarfPubNamesSection());
2491 EmitSectionSym(Asm, TLOF.getDwarfPubTypesSection());
Chris Lattner6629ca92010-04-04 22:59:04 +00002492 DwarfStrSectionSym =
2493 EmitSectionSym(Asm, TLOF.getDwarfStrSection(), "section_str");
Chris Lattner1fbf53b2010-04-04 23:02:02 +00002494 EmitSectionSym(Asm, TLOF.getDwarfRangesSection());
Bill Wendling480ff322009-05-20 23:21:38 +00002495
Chris Lattner6629ca92010-04-04 22:59:04 +00002496 TextSectionSym = EmitSectionSym(Asm, TLOF.getTextSection(), "text_begin");
Chris Lattnere58b5472010-04-04 23:10:38 +00002497 EmitSectionSym(Asm, TLOF.getDataSection());
Bill Wendling480ff322009-05-20 23:21:38 +00002498}
2499
Devang Patel930143b2009-11-21 02:48:08 +00002500/// emitDIE - Recusively Emits a debug information entry.
Bill Wendling480ff322009-05-20 23:21:38 +00002501///
Devang Patel930143b2009-11-21 02:48:08 +00002502void DwarfDebug::emitDIE(DIE *Die) {
Bill Wendling480ff322009-05-20 23:21:38 +00002503 // Get the abbreviation for this DIE.
2504 unsigned AbbrevNumber = Die->getAbbrevNumber();
2505 const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2506
Bill Wendling480ff322009-05-20 23:21:38 +00002507 // Emit the code (index) for the abbreviation.
Chris Lattner7bde8c02010-04-04 18:52:31 +00002508 if (Asm->isVerbose())
Chris Lattnerfa823552010-01-22 23:18:42 +00002509 Asm->OutStreamer.AddComment("Abbrev [" + Twine(AbbrevNumber) + "] 0x" +
2510 Twine::utohexstr(Die->getOffset()) + ":0x" +
2511 Twine::utohexstr(Die->getSize()) + " " +
2512 dwarf::TagString(Abbrev->getTag()));
Chris Lattner9efd1182010-04-04 19:09:29 +00002513 Asm->EmitULEB128(AbbrevNumber);
Bill Wendling480ff322009-05-20 23:21:38 +00002514
Jeffrey Yasskin54ebc982010-03-22 18:47:14 +00002515 const SmallVector<DIEValue*, 32> &Values = Die->getValues();
Bill Wendling480ff322009-05-20 23:21:38 +00002516 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
2517
2518 // Emit the DIE attribute values.
2519 for (unsigned i = 0, N = Values.size(); i < N; ++i) {
2520 unsigned Attr = AbbrevData[i].getAttribute();
2521 unsigned Form = AbbrevData[i].getForm();
2522 assert(Form && "Too many attributes for DIE (check abbreviation)");
2523
Chris Lattner7bde8c02010-04-04 18:52:31 +00002524 if (Asm->isVerbose())
Chris Lattner5adf9872010-01-24 18:54:17 +00002525 Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr));
2526
Bill Wendling480ff322009-05-20 23:21:38 +00002527 switch (Attr) {
2528 case dwarf::DW_AT_sibling:
Devang Patel930143b2009-11-21 02:48:08 +00002529 Asm->EmitInt32(Die->getSiblingOffset());
Bill Wendling480ff322009-05-20 23:21:38 +00002530 break;
2531 case dwarf::DW_AT_abstract_origin: {
2532 DIEEntry *E = cast<DIEEntry>(Values[i]);
2533 DIE *Origin = E->getEntry();
Devang Patelf6eeaeb2009-11-10 23:06:00 +00002534 unsigned Addr = Origin->getOffset();
Bill Wendling480ff322009-05-20 23:21:38 +00002535 Asm->EmitInt32(Addr);
2536 break;
2537 }
2538 default:
2539 // Emit an attribute using the defined form.
Chris Lattner3a383cb2010-04-05 00:13:49 +00002540 Values[i]->EmitValue(Asm, Form);
Bill Wendling480ff322009-05-20 23:21:38 +00002541 break;
2542 }
Bill Wendling480ff322009-05-20 23:21:38 +00002543 }
2544
2545 // Emit the DIE children if any.
2546 if (Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes) {
2547 const std::vector<DIE *> &Children = Die->getChildren();
2548
2549 for (unsigned j = 0, M = Children.size(); j < M; ++j)
Devang Patel930143b2009-11-21 02:48:08 +00002550 emitDIE(Children[j]);
Bill Wendling480ff322009-05-20 23:21:38 +00002551
Chris Lattner7bde8c02010-04-04 18:52:31 +00002552 if (Asm->isVerbose())
Chris Lattner566cae92010-03-09 23:52:58 +00002553 Asm->OutStreamer.AddComment("End Of Children Mark");
2554 Asm->EmitInt8(0);
Bill Wendling480ff322009-05-20 23:21:38 +00002555 }
2556}
2557
Devang Patel9ccfb642009-12-09 18:24:21 +00002558/// emitDebugInfo - Emit the debug info section.
Bill Wendling480ff322009-05-20 23:21:38 +00002559///
Devang Patel9ccfb642009-12-09 18:24:21 +00002560void DwarfDebug::emitDebugInfo() {
2561 // Start debug info section.
2562 Asm->OutStreamer.SwitchSection(
2563 Asm->getObjFileLowering().getDwarfInfoSection());
2564 DIE *Die = ModuleCU->getCUDie();
Bill Wendling480ff322009-05-20 23:21:38 +00002565
2566 // Emit the compile units header.
Chris Lattnera179b522010-04-04 19:25:43 +00002567 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_begin",
2568 ModuleCU->getID()));
Bill Wendling480ff322009-05-20 23:21:38 +00002569
2570 // Emit size of content not including length itself
2571 unsigned ContentSize = Die->getSize() +
2572 sizeof(int16_t) + // DWARF version number
2573 sizeof(int32_t) + // Offset Into Abbrev. Section
2574 sizeof(int8_t) + // Pointer Size (in bytes)
2575 sizeof(int32_t); // FIXME - extra pad for gdb bug.
2576
Chris Lattner566cae92010-03-09 23:52:58 +00002577 Asm->OutStreamer.AddComment("Length of Compilation Unit Info");
2578 Asm->EmitInt32(ContentSize);
2579 Asm->OutStreamer.AddComment("DWARF version number");
2580 Asm->EmitInt16(dwarf::DWARF_VERSION);
2581 Asm->OutStreamer.AddComment("Offset Into Abbrev. Section");
Chris Lattner70a4fce2010-04-04 23:25:33 +00002582 Asm->EmitSectionOffset(Asm->GetTempSymbol("abbrev_begin"),
2583 DwarfAbbrevSectionSym);
Chris Lattner566cae92010-03-09 23:52:58 +00002584 Asm->OutStreamer.AddComment("Address Size (in bytes)");
Chris Lattner3a383cb2010-04-05 00:13:49 +00002585 Asm->EmitInt8(Asm->getTargetData().getPointerSize());
Bill Wendling480ff322009-05-20 23:21:38 +00002586
Devang Patel930143b2009-11-21 02:48:08 +00002587 emitDIE(Die);
Bill Wendling480ff322009-05-20 23:21:38 +00002588 // FIXME - extra padding for gdb bug.
Chris Lattner566cae92010-03-09 23:52:58 +00002589 Asm->OutStreamer.AddComment("4 extra padding bytes for GDB");
2590 Asm->EmitInt8(0);
2591 Asm->EmitInt8(0);
2592 Asm->EmitInt8(0);
2593 Asm->EmitInt8(0);
Chris Lattnera179b522010-04-04 19:25:43 +00002594 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_end", ModuleCU->getID()));
Bill Wendling480ff322009-05-20 23:21:38 +00002595}
2596
Devang Patel930143b2009-11-21 02:48:08 +00002597/// emitAbbreviations - Emit the abbreviation section.
Bill Wendling480ff322009-05-20 23:21:38 +00002598///
Devang Patel930143b2009-11-21 02:48:08 +00002599void DwarfDebug::emitAbbreviations() const {
Bill Wendling480ff322009-05-20 23:21:38 +00002600 // Check to see if it is worth the effort.
2601 if (!Abbreviations.empty()) {
2602 // Start the debug abbrev section.
Chris Lattner4b7dadb2009-08-19 05:49:37 +00002603 Asm->OutStreamer.SwitchSection(
2604 Asm->getObjFileLowering().getDwarfAbbrevSection());
Bill Wendling480ff322009-05-20 23:21:38 +00002605
Chris Lattnera179b522010-04-04 19:25:43 +00002606 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_begin"));
Bill Wendling480ff322009-05-20 23:21:38 +00002607
2608 // For each abbrevation.
2609 for (unsigned i = 0, N = Abbreviations.size(); i < N; ++i) {
2610 // Get abbreviation data
2611 const DIEAbbrev *Abbrev = Abbreviations[i];
2612
2613 // Emit the abbrevations code (base 1 index.)
Chris Lattner9efd1182010-04-04 19:09:29 +00002614 Asm->EmitULEB128(Abbrev->getNumber(), "Abbreviation Code");
Bill Wendling480ff322009-05-20 23:21:38 +00002615
2616 // Emit the abbreviations data.
Chris Lattner3a383cb2010-04-05 00:13:49 +00002617 Abbrev->Emit(Asm);
Bill Wendling480ff322009-05-20 23:21:38 +00002618 }
2619
2620 // Mark end of abbreviations.
Chris Lattner9efd1182010-04-04 19:09:29 +00002621 Asm->EmitULEB128(0, "EOM(3)");
Bill Wendling480ff322009-05-20 23:21:38 +00002622
Chris Lattnera179b522010-04-04 19:25:43 +00002623 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_end"));
Bill Wendling480ff322009-05-20 23:21:38 +00002624 }
2625}
2626
Devang Patel930143b2009-11-21 02:48:08 +00002627/// emitEndOfLineMatrix - Emit the last address of the section and the end of
Bill Wendling480ff322009-05-20 23:21:38 +00002628/// the line matrix.
2629///
Devang Patel930143b2009-11-21 02:48:08 +00002630void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) {
Bill Wendling480ff322009-05-20 23:21:38 +00002631 // Define last address of section.
Chris Lattner566cae92010-03-09 23:52:58 +00002632 Asm->OutStreamer.AddComment("Extended Op");
2633 Asm->EmitInt8(0);
2634
2635 Asm->OutStreamer.AddComment("Op size");
Chris Lattner3a383cb2010-04-05 00:13:49 +00002636 Asm->EmitInt8(Asm->getTargetData().getPointerSize() + 1);
Chris Lattner566cae92010-03-09 23:52:58 +00002637 Asm->OutStreamer.AddComment("DW_LNE_set_address");
2638 Asm->EmitInt8(dwarf::DW_LNE_set_address);
2639
2640 Asm->OutStreamer.AddComment("Section end label");
Chris Lattnerb245dfb2010-03-10 01:17:49 +00002641
Chris Lattnera179b522010-04-04 19:25:43 +00002642 Asm->OutStreamer.EmitSymbolValue(Asm->GetTempSymbol("section_end",SectionEnd),
Chris Lattner3a383cb2010-04-05 00:13:49 +00002643 Asm->getTargetData().getPointerSize(),
2644 0/*AddrSpace*/);
Bill Wendling480ff322009-05-20 23:21:38 +00002645
2646 // Mark end of matrix.
Chris Lattner566cae92010-03-09 23:52:58 +00002647 Asm->OutStreamer.AddComment("DW_LNE_end_sequence");
2648 Asm->EmitInt8(0);
Chris Lattnerf5c834f2010-01-22 22:09:00 +00002649 Asm->EmitInt8(1);
Chris Lattnerfa823552010-01-22 23:18:42 +00002650 Asm->EmitInt8(1);
Bill Wendling480ff322009-05-20 23:21:38 +00002651}
2652
Devang Patel930143b2009-11-21 02:48:08 +00002653/// emitDebugLines - Emit source line information.
Bill Wendling480ff322009-05-20 23:21:38 +00002654///
Devang Patel930143b2009-11-21 02:48:08 +00002655void DwarfDebug::emitDebugLines() {
Bill Wendling480ff322009-05-20 23:21:38 +00002656 // If the target is using .loc/.file, the assembler will be emitting the
2657 // .debug_line table automatically.
Chris Lattner3a383cb2010-04-05 00:13:49 +00002658 if (Asm->MAI->hasDotLocAndDotFile())
Bill Wendling480ff322009-05-20 23:21:38 +00002659 return;
2660
2661 // Minimum line delta, thus ranging from -10..(255-10).
2662 const int MinLineDelta = -(dwarf::DW_LNS_fixed_advance_pc + 1);
2663 // Maximum line delta, thus ranging from -10..(255-10).
2664 const int MaxLineDelta = 255 + MinLineDelta;
2665
2666 // Start the dwarf line section.
Chris Lattner4b7dadb2009-08-19 05:49:37 +00002667 Asm->OutStreamer.SwitchSection(
2668 Asm->getObjFileLowering().getDwarfLineSection());
Bill Wendling480ff322009-05-20 23:21:38 +00002669
2670 // Construct the section header.
Chris Lattner566cae92010-03-09 23:52:58 +00002671 Asm->OutStreamer.AddComment("Length of Source Line Info");
Chris Lattnerf1429f12010-04-04 19:58:12 +00002672 Asm->EmitLabelDifference(Asm->GetTempSymbol("line_end"),
2673 Asm->GetTempSymbol("line_begin"), 4);
Chris Lattnera179b522010-04-04 19:25:43 +00002674 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("line_begin"));
Bill Wendling480ff322009-05-20 23:21:38 +00002675
Chris Lattner566cae92010-03-09 23:52:58 +00002676 Asm->OutStreamer.AddComment("DWARF version number");
2677 Asm->EmitInt16(dwarf::DWARF_VERSION);
Bill Wendling480ff322009-05-20 23:21:38 +00002678
Chris Lattner566cae92010-03-09 23:52:58 +00002679 Asm->OutStreamer.AddComment("Prolog Length");
Chris Lattnerf1429f12010-04-04 19:58:12 +00002680 Asm->EmitLabelDifference(Asm->GetTempSymbol("line_prolog_end"),
2681 Asm->GetTempSymbol("line_prolog_begin"), 4);
Chris Lattnera179b522010-04-04 19:25:43 +00002682 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("line_prolog_begin"));
Bill Wendling480ff322009-05-20 23:21:38 +00002683
Chris Lattner566cae92010-03-09 23:52:58 +00002684 Asm->OutStreamer.AddComment("Minimum Instruction Length");
2685 Asm->EmitInt8(1);
2686 Asm->OutStreamer.AddComment("Default is_stmt_start flag");
2687 Asm->EmitInt8(1);
2688 Asm->OutStreamer.AddComment("Line Base Value (Special Opcodes)");
2689 Asm->EmitInt8(MinLineDelta);
2690 Asm->OutStreamer.AddComment("Line Range Value (Special Opcodes)");
2691 Asm->EmitInt8(MaxLineDelta);
2692 Asm->OutStreamer.AddComment("Special Opcode Base");
2693 Asm->EmitInt8(-MinLineDelta);
Bill Wendling480ff322009-05-20 23:21:38 +00002694
2695 // Line number standard opcode encodings argument count
Chris Lattner566cae92010-03-09 23:52:58 +00002696 Asm->OutStreamer.AddComment("DW_LNS_copy arg count");
2697 Asm->EmitInt8(0);
2698 Asm->OutStreamer.AddComment("DW_LNS_advance_pc arg count");
2699 Asm->EmitInt8(1);
2700 Asm->OutStreamer.AddComment("DW_LNS_advance_line arg count");
2701 Asm->EmitInt8(1);
2702 Asm->OutStreamer.AddComment("DW_LNS_set_file arg count");
2703 Asm->EmitInt8(1);
2704 Asm->OutStreamer.AddComment("DW_LNS_set_column arg count");
2705 Asm->EmitInt8(1);
2706 Asm->OutStreamer.AddComment("DW_LNS_negate_stmt arg count");
2707 Asm->EmitInt8(0);
2708 Asm->OutStreamer.AddComment("DW_LNS_set_basic_block arg count");
2709 Asm->EmitInt8(0);
2710 Asm->OutStreamer.AddComment("DW_LNS_const_add_pc arg count");
2711 Asm->EmitInt8(0);
2712 Asm->OutStreamer.AddComment("DW_LNS_fixed_advance_pc arg count");
2713 Asm->EmitInt8(1);
Bill Wendling480ff322009-05-20 23:21:38 +00002714
2715 // Emit directories.
2716 for (unsigned DI = 1, DE = getNumSourceDirectories()+1; DI != DE; ++DI) {
Chris Lattnerc3f23b82010-01-23 03:11:46 +00002717 const std::string &Dir = getSourceDirectoryName(DI);
Chris Lattner7bde8c02010-04-04 18:52:31 +00002718 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("Directory");
Chris Lattnerc3f23b82010-01-23 03:11:46 +00002719 Asm->OutStreamer.EmitBytes(StringRef(Dir.c_str(), Dir.size()+1), 0);
Bill Wendling480ff322009-05-20 23:21:38 +00002720 }
2721
Chris Lattner566cae92010-03-09 23:52:58 +00002722 Asm->OutStreamer.AddComment("End of directories");
2723 Asm->EmitInt8(0);
Bill Wendling480ff322009-05-20 23:21:38 +00002724
2725 // Emit files.
2726 for (unsigned SI = 1, SE = getNumSourceIds()+1; SI != SE; ++SI) {
2727 // Remember source id starts at 1.
2728 std::pair<unsigned, unsigned> Id = getSourceDirectoryAndFileIds(SI);
Chris Lattnerc3f23b82010-01-23 03:11:46 +00002729 const std::string &FN = getSourceFileName(Id.second);
Chris Lattner7bde8c02010-04-04 18:52:31 +00002730 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("Source");
Chris Lattnerc3f23b82010-01-23 03:11:46 +00002731 Asm->OutStreamer.EmitBytes(StringRef(FN.c_str(), FN.size()+1), 0);
2732
Chris Lattner9efd1182010-04-04 19:09:29 +00002733 Asm->EmitULEB128(Id.first, "Directory #");
2734 Asm->EmitULEB128(0, "Mod date");
2735 Asm->EmitULEB128(0, "File size");
Bill Wendling480ff322009-05-20 23:21:38 +00002736 }
2737
Chris Lattner566cae92010-03-09 23:52:58 +00002738 Asm->OutStreamer.AddComment("End of files");
2739 Asm->EmitInt8(0);
Bill Wendling480ff322009-05-20 23:21:38 +00002740
Chris Lattnera179b522010-04-04 19:25:43 +00002741 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("line_prolog_end"));
Bill Wendling480ff322009-05-20 23:21:38 +00002742
2743 // A sequence for each text section.
2744 unsigned SecSrcLinesSize = SectionSourceLines.size();
2745
2746 for (unsigned j = 0; j < SecSrcLinesSize; ++j) {
2747 // Isolate current sections line info.
2748 const std::vector<SrcLineInfo> &LineInfos = SectionSourceLines[j];
2749
Bill Wendling480ff322009-05-20 23:21:38 +00002750 // Dwarf assumes we start with first line of first source file.
2751 unsigned Source = 1;
2752 unsigned Line = 1;
2753
2754 // Construct rows of the address, source, line, column matrix.
2755 for (unsigned i = 0, N = LineInfos.size(); i < N; ++i) {
2756 const SrcLineInfo &LineInfo = LineInfos[i];
Chris Lattnerb4666f42010-03-14 08:15:55 +00002757 MCSymbol *Label = LineInfo.getLabel();
Chris Lattneree95d4c2010-03-14 02:20:58 +00002758 if (!Label->isDefined()) continue; // Not emitted, in dead code.
Bill Wendling480ff322009-05-20 23:21:38 +00002759
Caroline Tice183a5192009-09-11 18:25:54 +00002760 if (LineInfo.getLine() == 0) continue;
2761
Chris Lattner3d72a672010-03-09 23:38:23 +00002762 if (Asm->isVerbose()) {
Chris Lattner7e998b72010-03-10 01:04:13 +00002763 std::pair<unsigned, unsigned> SrcID =
Bill Wendling480ff322009-05-20 23:21:38 +00002764 getSourceDirectoryAndFileIds(LineInfo.getSourceID());
Chris Lattner7e998b72010-03-10 01:04:13 +00002765 Asm->OutStreamer.AddComment(Twine(getSourceDirectoryName(SrcID.first)) +
Chris Lattnera26fbe42010-03-10 02:29:31 +00002766 "/" +
2767 Twine(getSourceFileName(SrcID.second)) +
Chris Lattner7e998b72010-03-10 01:04:13 +00002768 ":" + Twine(LineInfo.getLine()));
Bill Wendling480ff322009-05-20 23:21:38 +00002769 }
2770
2771 // Define the line address.
Chris Lattner566cae92010-03-09 23:52:58 +00002772 Asm->OutStreamer.AddComment("Extended Op");
2773 Asm->EmitInt8(0);
2774 Asm->OutStreamer.AddComment("Op size");
Chris Lattner3a383cb2010-04-05 00:13:49 +00002775 Asm->EmitInt8(Asm->getTargetData().getPointerSize() + 1);
Chris Lattner566cae92010-03-09 23:52:58 +00002776
2777 Asm->OutStreamer.AddComment("DW_LNE_set_address");
2778 Asm->EmitInt8(dwarf::DW_LNE_set_address);
2779
2780 Asm->OutStreamer.AddComment("Location label");
Chris Lattner3a383cb2010-04-05 00:13:49 +00002781 Asm->OutStreamer.EmitSymbolValue(Label,
2782 Asm->getTargetData().getPointerSize(),
Chris Lattneree95d4c2010-03-14 02:20:58 +00002783 0/*AddrSpace*/);
Chris Lattnerb245dfb2010-03-10 01:17:49 +00002784
Bill Wendling480ff322009-05-20 23:21:38 +00002785 // If change of source, then switch to the new source.
2786 if (Source != LineInfo.getSourceID()) {
2787 Source = LineInfo.getSourceID();
Chris Lattner566cae92010-03-09 23:52:58 +00002788 Asm->OutStreamer.AddComment("DW_LNS_set_file");
2789 Asm->EmitInt8(dwarf::DW_LNS_set_file);
Chris Lattner9efd1182010-04-04 19:09:29 +00002790 Asm->EmitULEB128(Source, "New Source");
Bill Wendling480ff322009-05-20 23:21:38 +00002791 }
2792
2793 // If change of line.
2794 if (Line != LineInfo.getLine()) {
2795 // Determine offset.
2796 int Offset = LineInfo.getLine() - Line;
2797 int Delta = Offset - MinLineDelta;
2798
2799 // Update line.
2800 Line = LineInfo.getLine();
2801
2802 // If delta is small enough and in range...
2803 if (Delta >= 0 && Delta < (MaxLineDelta - 1)) {
2804 // ... then use fast opcode.
Chris Lattner566cae92010-03-09 23:52:58 +00002805 Asm->OutStreamer.AddComment("Line Delta");
2806 Asm->EmitInt8(Delta - MinLineDelta);
Bill Wendling480ff322009-05-20 23:21:38 +00002807 } else {
2808 // ... otherwise use long hand.
Chris Lattner566cae92010-03-09 23:52:58 +00002809 Asm->OutStreamer.AddComment("DW_LNS_advance_line");
Bill Wendling480ff322009-05-20 23:21:38 +00002810 Asm->EmitInt8(dwarf::DW_LNS_advance_line);
Chris Lattner9efd1182010-04-04 19:09:29 +00002811 Asm->EmitSLEB128(Offset, "Line Offset");
Chris Lattner566cae92010-03-09 23:52:58 +00002812 Asm->OutStreamer.AddComment("DW_LNS_copy");
2813 Asm->EmitInt8(dwarf::DW_LNS_copy);
Bill Wendling480ff322009-05-20 23:21:38 +00002814 }
2815 } else {
2816 // Copy the previous row (different address or source)
Chris Lattner566cae92010-03-09 23:52:58 +00002817 Asm->OutStreamer.AddComment("DW_LNS_copy");
2818 Asm->EmitInt8(dwarf::DW_LNS_copy);
Bill Wendling480ff322009-05-20 23:21:38 +00002819 }
2820 }
2821
Devang Patel930143b2009-11-21 02:48:08 +00002822 emitEndOfLineMatrix(j + 1);
Bill Wendling480ff322009-05-20 23:21:38 +00002823 }
2824
2825 if (SecSrcLinesSize == 0)
2826 // Because we're emitting a debug_line section, we still need a line
2827 // table. The linker and friends expect it to exist. If there's nothing to
2828 // put into it, emit an empty table.
Devang Patel930143b2009-11-21 02:48:08 +00002829 emitEndOfLineMatrix(1);
Bill Wendling480ff322009-05-20 23:21:38 +00002830
Chris Lattnera179b522010-04-04 19:25:43 +00002831 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("line_end"));
Bill Wendling480ff322009-05-20 23:21:38 +00002832}
2833
Devang Patel930143b2009-11-21 02:48:08 +00002834/// emitCommonDebugFrame - Emit common frame info into a debug frame section.
Bill Wendling480ff322009-05-20 23:21:38 +00002835///
Devang Patel930143b2009-11-21 02:48:08 +00002836void DwarfDebug::emitCommonDebugFrame() {
Chris Lattner3a383cb2010-04-05 00:13:49 +00002837 if (!Asm->MAI->doesDwarfRequireFrameSection())
Bill Wendling480ff322009-05-20 23:21:38 +00002838 return;
2839
Chris Lattner3a383cb2010-04-05 00:13:49 +00002840 int stackGrowth = Asm->getTargetData().getPointerSize();
2841 if (Asm->TM.getFrameInfo()->getStackGrowthDirection() ==
2842 TargetFrameInfo::StackGrowsDown)
2843 stackGrowth *= -1;
Bill Wendling480ff322009-05-20 23:21:38 +00002844
2845 // Start the dwarf frame section.
Chris Lattner4b7dadb2009-08-19 05:49:37 +00002846 Asm->OutStreamer.SwitchSection(
2847 Asm->getObjFileLowering().getDwarfFrameSection());
Bill Wendling480ff322009-05-20 23:21:38 +00002848
Chris Lattnera179b522010-04-04 19:25:43 +00002849 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_frame_common"));
Chris Lattner566cae92010-03-09 23:52:58 +00002850 Asm->OutStreamer.AddComment("Length of Common Information Entry");
Chris Lattnerf1429f12010-04-04 19:58:12 +00002851 Asm->EmitLabelDifference(Asm->GetTempSymbol("debug_frame_common_end"),
2852 Asm->GetTempSymbol("debug_frame_common_begin"), 4);
Bill Wendling480ff322009-05-20 23:21:38 +00002853
Chris Lattnera179b522010-04-04 19:25:43 +00002854 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_frame_common_begin"));
Chris Lattner566cae92010-03-09 23:52:58 +00002855 Asm->OutStreamer.AddComment("CIE Identifier Tag");
Bill Wendling480ff322009-05-20 23:21:38 +00002856 Asm->EmitInt32((int)dwarf::DW_CIE_ID);
Chris Lattner566cae92010-03-09 23:52:58 +00002857 Asm->OutStreamer.AddComment("CIE Version");
Bill Wendling480ff322009-05-20 23:21:38 +00002858 Asm->EmitInt8(dwarf::DW_CIE_VERSION);
Chris Lattner566cae92010-03-09 23:52:58 +00002859 Asm->OutStreamer.AddComment("CIE Augmentation");
Chris Lattnerc3f23b82010-01-23 03:11:46 +00002860 Asm->OutStreamer.EmitIntValue(0, 1, /*addrspace*/0); // nul terminator.
Chris Lattner9efd1182010-04-04 19:09:29 +00002861 Asm->EmitULEB128(1, "CIE Code Alignment Factor");
2862 Asm->EmitSLEB128(stackGrowth, "CIE Data Alignment Factor");
Chris Lattner566cae92010-03-09 23:52:58 +00002863 Asm->OutStreamer.AddComment("CIE RA Column");
Chris Lattner3a383cb2010-04-05 00:13:49 +00002864 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
Bill Wendling480ff322009-05-20 23:21:38 +00002865 Asm->EmitInt8(RI->getDwarfRegNum(RI->getRARegister(), false));
Bill Wendling480ff322009-05-20 23:21:38 +00002866
2867 std::vector<MachineMove> Moves;
2868 RI->getInitialFrameState(Moves);
2869
Chris Lattneraabc6042010-04-04 23:41:46 +00002870 Asm->EmitFrameMoves(Moves, 0, false);
Bill Wendling480ff322009-05-20 23:21:38 +00002871
2872 Asm->EmitAlignment(2, 0, 0, false);
Chris Lattnera179b522010-04-04 19:25:43 +00002873 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_frame_common_end"));
Bill Wendling480ff322009-05-20 23:21:38 +00002874}
2875
Devang Patel930143b2009-11-21 02:48:08 +00002876/// emitFunctionDebugFrame - Emit per function frame info into a debug frame
Bill Wendling480ff322009-05-20 23:21:38 +00002877/// section.
Chris Lattner2c3f4782010-03-13 07:26:18 +00002878void DwarfDebug::
2879emitFunctionDebugFrame(const FunctionDebugFrameInfo &DebugFrameInfo) {
Chris Lattner3a383cb2010-04-05 00:13:49 +00002880 if (!Asm->MAI->doesDwarfRequireFrameSection())
Bill Wendling480ff322009-05-20 23:21:38 +00002881 return;
2882
2883 // Start the dwarf frame section.
Chris Lattner4b7dadb2009-08-19 05:49:37 +00002884 Asm->OutStreamer.SwitchSection(
2885 Asm->getObjFileLowering().getDwarfFrameSection());
Bill Wendling480ff322009-05-20 23:21:38 +00002886
Chris Lattner566cae92010-03-09 23:52:58 +00002887 Asm->OutStreamer.AddComment("Length of Frame Information Entry");
Chris Lattner2c3f4782010-03-13 07:26:18 +00002888 MCSymbol *DebugFrameBegin =
Chris Lattnera179b522010-04-04 19:25:43 +00002889 Asm->GetTempSymbol("debug_frame_begin", DebugFrameInfo.Number);
Chris Lattner2c3f4782010-03-13 07:26:18 +00002890 MCSymbol *DebugFrameEnd =
Chris Lattnera179b522010-04-04 19:25:43 +00002891 Asm->GetTempSymbol("debug_frame_end", DebugFrameInfo.Number);
Chris Lattnerf1429f12010-04-04 19:58:12 +00002892 Asm->EmitLabelDifference(DebugFrameEnd, DebugFrameBegin, 4);
Bill Wendling480ff322009-05-20 23:21:38 +00002893
Chris Lattner2c3f4782010-03-13 07:26:18 +00002894 Asm->OutStreamer.EmitLabel(DebugFrameBegin);
Bill Wendling480ff322009-05-20 23:21:38 +00002895
Chris Lattner566cae92010-03-09 23:52:58 +00002896 Asm->OutStreamer.AddComment("FDE CIE offset");
Chris Lattner70a4fce2010-04-04 23:25:33 +00002897 Asm->EmitSectionOffset(Asm->GetTempSymbol("debug_frame_common"),
2898 DwarfFrameSectionSym);
Bill Wendling480ff322009-05-20 23:21:38 +00002899
Chris Lattner566cae92010-03-09 23:52:58 +00002900 Asm->OutStreamer.AddComment("FDE initial location");
Chris Lattnera179b522010-04-04 19:25:43 +00002901 MCSymbol *FuncBeginSym =
2902 Asm->GetTempSymbol("func_begin", DebugFrameInfo.Number);
Chris Lattner8811e122010-03-13 07:40:56 +00002903 Asm->OutStreamer.EmitSymbolValue(FuncBeginSym,
Chris Lattner3a383cb2010-04-05 00:13:49 +00002904 Asm->getTargetData().getPointerSize(),
2905 0/*AddrSpace*/);
Chris Lattnerb245dfb2010-03-10 01:17:49 +00002906
2907
Chris Lattner566cae92010-03-09 23:52:58 +00002908 Asm->OutStreamer.AddComment("FDE address range");
Chris Lattnerf1429f12010-04-04 19:58:12 +00002909 Asm->EmitLabelDifference(Asm->GetTempSymbol("func_end",DebugFrameInfo.Number),
Chris Lattner3a383cb2010-04-05 00:13:49 +00002910 FuncBeginSym, Asm->getTargetData().getPointerSize());
Bill Wendling480ff322009-05-20 23:21:38 +00002911
Chris Lattneraabc6042010-04-04 23:41:46 +00002912 Asm->EmitFrameMoves(DebugFrameInfo.Moves, FuncBeginSym, false);
Bill Wendling480ff322009-05-20 23:21:38 +00002913
2914 Asm->EmitAlignment(2, 0, 0, false);
Chris Lattner2c3f4782010-03-13 07:26:18 +00002915 Asm->OutStreamer.EmitLabel(DebugFrameEnd);
Bill Wendling480ff322009-05-20 23:21:38 +00002916}
2917
Devang Patel9ccfb642009-12-09 18:24:21 +00002918/// emitDebugPubNames - Emit visible names into a debug pubnames section.
2919///
2920void DwarfDebug::emitDebugPubNames() {
2921 // Start the dwarf pubnames section.
2922 Asm->OutStreamer.SwitchSection(
2923 Asm->getObjFileLowering().getDwarfPubNamesSection());
2924
Chris Lattner566cae92010-03-09 23:52:58 +00002925 Asm->OutStreamer.AddComment("Length of Public Names Info");
Chris Lattnerf1429f12010-04-04 19:58:12 +00002926 Asm->EmitLabelDifference(
2927 Asm->GetTempSymbol("pubnames_end", ModuleCU->getID()),
2928 Asm->GetTempSymbol("pubnames_begin", ModuleCU->getID()), 4);
Bill Wendling480ff322009-05-20 23:21:38 +00002929
Chris Lattnera179b522010-04-04 19:25:43 +00002930 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_begin",
2931 ModuleCU->getID()));
Bill Wendling480ff322009-05-20 23:21:38 +00002932
Chris Lattner566cae92010-03-09 23:52:58 +00002933 Asm->OutStreamer.AddComment("DWARF Version");
2934 Asm->EmitInt16(dwarf::DWARF_VERSION);
Bill Wendling480ff322009-05-20 23:21:38 +00002935
Chris Lattner566cae92010-03-09 23:52:58 +00002936 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
Chris Lattner70a4fce2010-04-04 23:25:33 +00002937 Asm->EmitSectionOffset(Asm->GetTempSymbol("info_begin", ModuleCU->getID()),
2938 DwarfInfoSectionSym);
Bill Wendling480ff322009-05-20 23:21:38 +00002939
Chris Lattner566cae92010-03-09 23:52:58 +00002940 Asm->OutStreamer.AddComment("Compilation Unit Length");
Chris Lattnerf1429f12010-04-04 19:58:12 +00002941 Asm->EmitLabelDifference(Asm->GetTempSymbol("info_end", ModuleCU->getID()),
2942 Asm->GetTempSymbol("info_begin", ModuleCU->getID()),
2943 4);
Bill Wendling480ff322009-05-20 23:21:38 +00002944
Devang Patel9ccfb642009-12-09 18:24:21 +00002945 const StringMap<DIE*> &Globals = ModuleCU->getGlobals();
Bill Wendling480ff322009-05-20 23:21:38 +00002946 for (StringMap<DIE*>::const_iterator
2947 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2948 const char *Name = GI->getKeyData();
Chris Lattner566cae92010-03-09 23:52:58 +00002949 DIE *Entity = GI->second;
Bill Wendling480ff322009-05-20 23:21:38 +00002950
Chris Lattner566cae92010-03-09 23:52:58 +00002951 Asm->OutStreamer.AddComment("DIE offset");
2952 Asm->EmitInt32(Entity->getOffset());
Chris Lattnerc3f23b82010-01-23 03:11:46 +00002953
Chris Lattner7bde8c02010-04-04 18:52:31 +00002954 if (Asm->isVerbose())
Chris Lattnerc3f23b82010-01-23 03:11:46 +00002955 Asm->OutStreamer.AddComment("External Name");
2956 Asm->OutStreamer.EmitBytes(StringRef(Name, strlen(Name)+1), 0);
Bill Wendling480ff322009-05-20 23:21:38 +00002957 }
2958
Chris Lattner566cae92010-03-09 23:52:58 +00002959 Asm->OutStreamer.AddComment("End Mark");
2960 Asm->EmitInt32(0);
Chris Lattnera179b522010-04-04 19:25:43 +00002961 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_end",
2962 ModuleCU->getID()));
Bill Wendling480ff322009-05-20 23:21:38 +00002963}
2964
Devang Patel04d2f2d2009-11-24 01:14:22 +00002965void DwarfDebug::emitDebugPubTypes() {
Devang Patelc8654eb2009-11-24 19:18:41 +00002966 // Start the dwarf pubnames section.
2967 Asm->OutStreamer.SwitchSection(
2968 Asm->getObjFileLowering().getDwarfPubTypesSection());
Chris Lattner566cae92010-03-09 23:52:58 +00002969 Asm->OutStreamer.AddComment("Length of Public Types Info");
Chris Lattnerf1429f12010-04-04 19:58:12 +00002970 Asm->EmitLabelDifference(
2971 Asm->GetTempSymbol("pubtypes_end", ModuleCU->getID()),
2972 Asm->GetTempSymbol("pubtypes_begin", ModuleCU->getID()), 4);
Devang Patel04d2f2d2009-11-24 01:14:22 +00002973
Chris Lattnera179b522010-04-04 19:25:43 +00002974 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_begin",
2975 ModuleCU->getID()));
Devang Patel04d2f2d2009-11-24 01:14:22 +00002976
Chris Lattner7bde8c02010-04-04 18:52:31 +00002977 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DWARF Version");
Devang Patel057c6422010-02-02 03:47:27 +00002978 Asm->EmitInt16(dwarf::DWARF_VERSION);
Devang Patel04d2f2d2009-11-24 01:14:22 +00002979
Chris Lattner566cae92010-03-09 23:52:58 +00002980 Asm->OutStreamer.AddComment("Offset of Compilation ModuleCU Info");
Chris Lattner70a4fce2010-04-04 23:25:33 +00002981 Asm->EmitSectionOffset(Asm->GetTempSymbol("info_begin", ModuleCU->getID()),
2982 DwarfInfoSectionSym);
Devang Patel04d2f2d2009-11-24 01:14:22 +00002983
Chris Lattner566cae92010-03-09 23:52:58 +00002984 Asm->OutStreamer.AddComment("Compilation ModuleCU Length");
Chris Lattnerf1429f12010-04-04 19:58:12 +00002985 Asm->EmitLabelDifference(Asm->GetTempSymbol("info_end", ModuleCU->getID()),
2986 Asm->GetTempSymbol("info_begin", ModuleCU->getID()),
2987 4);
Devang Patel04d2f2d2009-11-24 01:14:22 +00002988
2989 const StringMap<DIE*> &Globals = ModuleCU->getGlobalTypes();
2990 for (StringMap<DIE*>::const_iterator
2991 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2992 const char *Name = GI->getKeyData();
2993 DIE * Entity = GI->second;
2994
Chris Lattner7bde8c02010-04-04 18:52:31 +00002995 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
Devang Patel057c6422010-02-02 03:47:27 +00002996 Asm->EmitInt32(Entity->getOffset());
Chris Lattnerc3f23b82010-01-23 03:11:46 +00002997
Chris Lattner7bde8c02010-04-04 18:52:31 +00002998 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("External Name");
Devang Patel6d404ad2010-02-02 03:37:03 +00002999 Asm->OutStreamer.EmitBytes(StringRef(Name, GI->getKeyLength()+1), 0);
Devang Patel04d2f2d2009-11-24 01:14:22 +00003000 }
3001
Chris Lattner566cae92010-03-09 23:52:58 +00003002 Asm->OutStreamer.AddComment("End Mark");
3003 Asm->EmitInt32(0);
Chris Lattnera179b522010-04-04 19:25:43 +00003004 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_end",
3005 ModuleCU->getID()));
Devang Patel04d2f2d2009-11-24 01:14:22 +00003006}
3007
Devang Patel930143b2009-11-21 02:48:08 +00003008/// emitDebugStr - Emit visible names into a debug str section.
Bill Wendling480ff322009-05-20 23:21:38 +00003009///
Devang Patel930143b2009-11-21 02:48:08 +00003010void DwarfDebug::emitDebugStr() {
Bill Wendling480ff322009-05-20 23:21:38 +00003011 // Check to see if it is worth the effort.
Chris Lattner3d72a672010-03-09 23:38:23 +00003012 if (StringPool.empty()) return;
3013
3014 // Start the dwarf str section.
3015 Asm->OutStreamer.SwitchSection(
Chris Lattner4b7dadb2009-08-19 05:49:37 +00003016 Asm->getObjFileLowering().getDwarfStrSection());
Bill Wendling480ff322009-05-20 23:21:38 +00003017
Chris Lattnerb7aa9522010-03-13 02:17:42 +00003018 // Get all of the string pool entries and put them in an array by their ID so
3019 // we can sort them.
3020 SmallVector<std::pair<unsigned,
3021 StringMapEntry<std::pair<MCSymbol*, unsigned> >*>, 64> Entries;
3022
3023 for (StringMap<std::pair<MCSymbol*, unsigned> >::iterator
3024 I = StringPool.begin(), E = StringPool.end(); I != E; ++I)
3025 Entries.push_back(std::make_pair(I->second.second, &*I));
3026
3027 array_pod_sort(Entries.begin(), Entries.end());
3028
3029 for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
Chris Lattner3d72a672010-03-09 23:38:23 +00003030 // Emit a label for reference from debug information entries.
Chris Lattnerb7aa9522010-03-13 02:17:42 +00003031 Asm->OutStreamer.EmitLabel(Entries[i].second->getValue().first);
Chris Lattner3d72a672010-03-09 23:38:23 +00003032
3033 // Emit the string itself.
Chris Lattnerb7aa9522010-03-13 02:17:42 +00003034 Asm->OutStreamer.EmitBytes(Entries[i].second->getKey(), 0/*addrspace*/);
Bill Wendling480ff322009-05-20 23:21:38 +00003035 }
3036}
3037
Devang Patel930143b2009-11-21 02:48:08 +00003038/// emitDebugLoc - Emit visible names into a debug loc section.
Bill Wendling480ff322009-05-20 23:21:38 +00003039///
Devang Patel930143b2009-11-21 02:48:08 +00003040void DwarfDebug::emitDebugLoc() {
Bill Wendling480ff322009-05-20 23:21:38 +00003041 // Start the dwarf loc section.
Chris Lattner4b7dadb2009-08-19 05:49:37 +00003042 Asm->OutStreamer.SwitchSection(
3043 Asm->getObjFileLowering().getDwarfLocSection());
Bill Wendling480ff322009-05-20 23:21:38 +00003044}
3045
3046/// EmitDebugARanges - Emit visible names into a debug aranges section.
3047///
3048void DwarfDebug::EmitDebugARanges() {
3049 // Start the dwarf aranges section.
Chris Lattner4b7dadb2009-08-19 05:49:37 +00003050 Asm->OutStreamer.SwitchSection(
3051 Asm->getObjFileLowering().getDwarfARangesSection());
Bill Wendling480ff322009-05-20 23:21:38 +00003052}
3053
Devang Patel930143b2009-11-21 02:48:08 +00003054/// emitDebugRanges - Emit visible names into a debug ranges section.
Bill Wendling480ff322009-05-20 23:21:38 +00003055///
Devang Patel930143b2009-11-21 02:48:08 +00003056void DwarfDebug::emitDebugRanges() {
Bill Wendling480ff322009-05-20 23:21:38 +00003057 // Start the dwarf ranges section.
Chris Lattner4b7dadb2009-08-19 05:49:37 +00003058 Asm->OutStreamer.SwitchSection(
3059 Asm->getObjFileLowering().getDwarfRangesSection());
Bill Wendling480ff322009-05-20 23:21:38 +00003060}
3061
Devang Patel930143b2009-11-21 02:48:08 +00003062/// emitDebugMacInfo - Emit visible names into a debug macinfo section.
Bill Wendling480ff322009-05-20 23:21:38 +00003063///
Devang Patel930143b2009-11-21 02:48:08 +00003064void DwarfDebug::emitDebugMacInfo() {
Daniel Dunbarc418d6b2009-09-19 20:40:05 +00003065 if (const MCSection *LineInfo =
Chris Lattner1472cf52009-08-02 07:24:22 +00003066 Asm->getObjFileLowering().getDwarfMacroInfoSection()) {
Bill Wendling480ff322009-05-20 23:21:38 +00003067 // Start the dwarf macinfo section.
Chris Lattner4b7dadb2009-08-19 05:49:37 +00003068 Asm->OutStreamer.SwitchSection(LineInfo);
Bill Wendling480ff322009-05-20 23:21:38 +00003069 }
3070}
3071
Devang Patel930143b2009-11-21 02:48:08 +00003072/// emitDebugInlineInfo - Emit inline info using following format.
Bill Wendling480ff322009-05-20 23:21:38 +00003073/// Section Header:
3074/// 1. length of section
3075/// 2. Dwarf version number
3076/// 3. address size.
3077///
3078/// Entries (one "entry" for each function that was inlined):
3079///
3080/// 1. offset into __debug_str section for MIPS linkage name, if exists;
3081/// otherwise offset into __debug_str for regular function name.
3082/// 2. offset into __debug_str section for regular function name.
3083/// 3. an unsigned LEB128 number indicating the number of distinct inlining
3084/// instances for the function.
3085///
3086/// The rest of the entry consists of a {die_offset, low_pc} pair for each
3087/// inlined instance; the die_offset points to the inlined_subroutine die in the
3088/// __debug_info section, and the low_pc is the starting address for the
3089/// inlining instance.
Devang Patel930143b2009-11-21 02:48:08 +00003090void DwarfDebug::emitDebugInlineInfo() {
Chris Lattner3a383cb2010-04-05 00:13:49 +00003091 if (!Asm->MAI->doesDwarfUsesInlineInfoSection())
Bill Wendling480ff322009-05-20 23:21:38 +00003092 return;
3093
Devang Patel40d78412009-06-29 20:45:18 +00003094 if (!ModuleCU)
Bill Wendling480ff322009-05-20 23:21:38 +00003095 return;
3096
Chris Lattner4b7dadb2009-08-19 05:49:37 +00003097 Asm->OutStreamer.SwitchSection(
3098 Asm->getObjFileLowering().getDwarfDebugInlineSection());
Chris Lattnerf5c834f2010-01-22 22:09:00 +00003099
Chris Lattner566cae92010-03-09 23:52:58 +00003100 Asm->OutStreamer.AddComment("Length of Debug Inlined Information Entry");
Chris Lattnerf1429f12010-04-04 19:58:12 +00003101 Asm->EmitLabelDifference(Asm->GetTempSymbol("debug_inlined_end", 1),
3102 Asm->GetTempSymbol("debug_inlined_begin", 1), 4);
Bill Wendling480ff322009-05-20 23:21:38 +00003103
Chris Lattnera179b522010-04-04 19:25:43 +00003104 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_begin", 1));
Bill Wendling480ff322009-05-20 23:21:38 +00003105
Chris Lattner566cae92010-03-09 23:52:58 +00003106 Asm->OutStreamer.AddComment("Dwarf Version");
3107 Asm->EmitInt16(dwarf::DWARF_VERSION);
3108 Asm->OutStreamer.AddComment("Address Size (in bytes)");
Chris Lattner3a383cb2010-04-05 00:13:49 +00003109 Asm->EmitInt8(Asm->getTargetData().getPointerSize());
Bill Wendling480ff322009-05-20 23:21:38 +00003110
Devang Patelf6eeaeb2009-11-10 23:06:00 +00003111 for (SmallVector<MDNode *, 4>::iterator I = InlinedSPNodes.begin(),
3112 E = InlinedSPNodes.end(); I != E; ++I) {
Jim Grosbach042483e2009-11-21 23:12:12 +00003113
Devang Patelf6eeaeb2009-11-10 23:06:00 +00003114 MDNode *Node = *I;
Devang Patel018b29b2010-01-19 06:19:05 +00003115 DenseMap<MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator II
Jim Grosbach00e9c612009-11-22 19:20:36 +00003116 = InlineInfo.find(Node);
Devang Patelf6eeaeb2009-11-10 23:06:00 +00003117 SmallVector<InlineInfoLabels, 4> &Labels = II->second;
Devang Patel80ae3492009-08-28 23:24:31 +00003118 DISubprogram SP(Node);
Devang Patel2d9caf92009-11-25 17:36:49 +00003119 StringRef LName = SP.getLinkageName();
3120 StringRef Name = SP.getName();
Bill Wendling480ff322009-05-20 23:21:38 +00003121
Chris Lattner566cae92010-03-09 23:52:58 +00003122 Asm->OutStreamer.AddComment("MIPS linkage name");
Chris Lattnerc3f23b82010-01-23 03:11:46 +00003123 if (LName.empty()) {
3124 Asm->OutStreamer.EmitBytes(Name, 0);
3125 Asm->OutStreamer.EmitIntValue(0, 1, 0); // nul terminator.
3126 } else
Chris Lattner70a4fce2010-04-04 23:25:33 +00003127 Asm->EmitSectionOffset(getStringPoolEntry(getRealLinkageName(LName)),
3128 DwarfStrSectionSym);
Devang Patelf6eeaeb2009-11-10 23:06:00 +00003129
Chris Lattner566cae92010-03-09 23:52:58 +00003130 Asm->OutStreamer.AddComment("Function name");
Chris Lattner70a4fce2010-04-04 23:25:33 +00003131 Asm->EmitSectionOffset(getStringPoolEntry(Name), DwarfStrSectionSym);
Chris Lattner9efd1182010-04-04 19:09:29 +00003132 Asm->EmitULEB128(Labels.size(), "Inline count");
Bill Wendling480ff322009-05-20 23:21:38 +00003133
Devang Patelf6eeaeb2009-11-10 23:06:00 +00003134 for (SmallVector<InlineInfoLabels, 4>::iterator LI = Labels.begin(),
Bill Wendling480ff322009-05-20 23:21:38 +00003135 LE = Labels.end(); LI != LE; ++LI) {
Chris Lattner7bde8c02010-04-04 18:52:31 +00003136 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
Chris Lattner085b6522010-03-09 00:31:02 +00003137 Asm->EmitInt32(LI->second->getOffset());
Bill Wendling480ff322009-05-20 23:21:38 +00003138
Chris Lattner7bde8c02010-04-04 18:52:31 +00003139 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("low_pc");
Chris Lattner3a383cb2010-04-05 00:13:49 +00003140 Asm->OutStreamer.EmitSymbolValue(LI->first,
3141 Asm->getTargetData().getPointerSize(),0);
Bill Wendling480ff322009-05-20 23:21:38 +00003142 }
3143 }
3144
Chris Lattnera179b522010-04-04 19:25:43 +00003145 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_end", 1));
Bill Wendling480ff322009-05-20 23:21:38 +00003146}