blob: 1c2f7fc419d22c5e32abc98fb9b74c5d08006b89 [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//===----------------------------------------------------------------------===//
Devang Patel80ae3492009-08-28 23:24:31 +000013#define DEBUG_TYPE "dwarfdebug"
Bill Wendling2f921f82009-05-15 09:23:25 +000014#include "DwarfDebug.h"
15#include "llvm/Module.h"
David Greene829b3e82009-08-19 21:52:55 +000016#include "llvm/CodeGen/MachineFunction.h"
Bill Wendling2f921f82009-05-15 09:23:25 +000017#include "llvm/CodeGen/MachineModuleInfo.h"
Chris Lattner4d2c0f92009-07-31 18:48:30 +000018#include "llvm/MC/MCSection.h"
Chris Lattner4b7dadb2009-08-19 05:49:37 +000019#include "llvm/MC/MCStreamer.h"
Chris Lattner7b26fce2009-08-22 20:48:53 +000020#include "llvm/MC/MCAsmInfo.h"
Chris Lattnerf62e3ee2010-01-16 21:57:06 +000021#include "llvm/Target/Mangler.h"
Bill Wendling2f921f82009-05-15 09:23:25 +000022#include "llvm/Target/TargetData.h"
23#include "llvm/Target/TargetFrameInfo.h"
Chris Lattner5e693ed2009-07-28 03:13:23 +000024#include "llvm/Target/TargetLoweringObjectFile.h"
25#include "llvm/Target/TargetRegisterInfo.h"
Chris Lattner06fa1762009-08-24 03:52:50 +000026#include "llvm/ADT/StringExtras.h"
Daniel Dunbarcdf01b52009-10-13 06:47:08 +000027#include "llvm/Support/Debug.h"
28#include "llvm/Support/ErrorHandling.h"
Devang Patel1973df22010-01-26 21:39:14 +000029#include "llvm/Support/ValueHandle.h"
Chris Lattnerf5c834f2010-01-22 22:09:00 +000030#include "llvm/Support/FormattedStream.h"
Chris Lattner4d2c0f92009-07-31 18:48:30 +000031#include "llvm/Support/Timer.h"
32#include "llvm/System/Path.h"
Bill Wendling2f921f82009-05-15 09:23:25 +000033using namespace llvm;
34
Bill Wendling2f921f82009-05-15 09:23:25 +000035//===----------------------------------------------------------------------===//
36
37/// Configuration values for initial hash set sizes (log2).
38///
Bill Wendling2f921f82009-05-15 09:23:25 +000039static const unsigned InitAbbreviationsSetSize = 9; // log2(512)
Bill Wendling2f921f82009-05-15 09:23:25 +000040
41namespace llvm {
42
43//===----------------------------------------------------------------------===//
44/// CompileUnit - This dwarf writer support class manages information associate
45/// with a source file.
Nick Lewyckyb7993d62009-11-17 08:11:44 +000046class CompileUnit {
Bill Wendling2f921f82009-05-15 09:23:25 +000047 /// ID - File identifier for source.
48 ///
49 unsigned ID;
50
51 /// Die - Compile unit debug information entry.
52 ///
Devang Patel930143b2009-11-21 02:48:08 +000053 DIE *CUDie;
Bill Wendling2f921f82009-05-15 09:23:25 +000054
Devang Patel92e8c652009-11-21 00:31:03 +000055 /// IndexTyDie - An anonymous type for index type.
56 DIE *IndexTyDie;
57
Bill Wendling2f921f82009-05-15 09:23:25 +000058 /// GVToDieMap - Tracks the mapping of unit level debug informaton
59 /// variables to debug information entries.
Devang Patel80ae3492009-08-28 23:24:31 +000060 /// FIXME : Rename GVToDieMap -> NodeToDieMap
Devang Patel018b29b2010-01-19 06:19:05 +000061 DenseMap<MDNode *, DIE *> GVToDieMap;
Bill Wendling2f921f82009-05-15 09:23:25 +000062
63 /// GVToDIEEntryMap - Tracks the mapping of unit level debug informaton
64 /// descriptors to debug information entries using a DIEEntry proxy.
Devang Patel80ae3492009-08-28 23:24:31 +000065 /// FIXME : Rename
Devang Patel018b29b2010-01-19 06:19:05 +000066 DenseMap<MDNode *, DIEEntry *> GVToDIEEntryMap;
Bill Wendling2f921f82009-05-15 09:23:25 +000067
68 /// Globals - A map of globally visible named entities for this unit.
69 ///
70 StringMap<DIE*> Globals;
71
Devang Patel04d2f2d2009-11-24 01:14:22 +000072 /// GlobalTypes - A map of globally visible types for this unit.
73 ///
74 StringMap<DIE*> GlobalTypes;
75
Bill Wendling2f921f82009-05-15 09:23:25 +000076public:
77 CompileUnit(unsigned I, DIE *D)
Devang Patel930143b2009-11-21 02:48:08 +000078 : ID(I), CUDie(D), IndexTyDie(0) {}
79 ~CompileUnit() { delete CUDie; delete IndexTyDie; }
Bill Wendling2f921f82009-05-15 09:23:25 +000080
81 // Accessors.
Devang Patel04d2f2d2009-11-24 01:14:22 +000082 unsigned getID() const { return ID; }
83 DIE* getCUDie() const { return CUDie; }
84 const StringMap<DIE*> &getGlobals() const { return Globals; }
85 const StringMap<DIE*> &getGlobalTypes() const { return GlobalTypes; }
Bill Wendling2f921f82009-05-15 09:23:25 +000086
87 /// hasContent - Return true if this compile unit has something to write out.
88 ///
Devang Patel930143b2009-11-21 02:48:08 +000089 bool hasContent() const { return !CUDie->getChildren().empty(); }
Bill Wendling2f921f82009-05-15 09:23:25 +000090
Devang Patel930143b2009-11-21 02:48:08 +000091 /// addGlobal - Add a new global entity to the compile unit.
Bill Wendling2f921f82009-05-15 09:23:25 +000092 ///
Devang Patel930143b2009-11-21 02:48:08 +000093 void addGlobal(const std::string &Name, DIE *Die) { Globals[Name] = Die; }
Bill Wendling2f921f82009-05-15 09:23:25 +000094
Devang Patel04d2f2d2009-11-24 01:14:22 +000095 /// addGlobalType - Add a new global type to the compile unit.
96 ///
97 void addGlobalType(const std::string &Name, DIE *Die) {
98 GlobalTypes[Name] = Die;
99 }
100
Devang Patele064ad42009-11-20 21:37:22 +0000101 /// getDIE - Returns the debug information entry map slot for the
Bill Wendling2f921f82009-05-15 09:23:25 +0000102 /// specified debug variable.
Devang Patele064ad42009-11-20 21:37:22 +0000103 DIE *getDIE(MDNode *N) { return GVToDieMap.lookup(N); }
Jim Grosbach042483e2009-11-21 23:12:12 +0000104
Devang Patele064ad42009-11-20 21:37:22 +0000105 /// insertDIE - Insert DIE into the map.
106 void insertDIE(MDNode *N, DIE *D) {
107 GVToDieMap.insert(std::make_pair(N, D));
108 }
Bill Wendling2f921f82009-05-15 09:23:25 +0000109
Devang Patele064ad42009-11-20 21:37:22 +0000110 /// getDIEEntry - Returns the debug information entry for the speciefied
111 /// debug variable.
Devang Patel1f4690c2009-12-15 19:16:48 +0000112 DIEEntry *getDIEEntry(MDNode *N) {
Devang Patel018b29b2010-01-19 06:19:05 +0000113 DenseMap<MDNode *, DIEEntry *>::iterator I = GVToDIEEntryMap.find(N);
Devang Patel1f4690c2009-12-15 19:16:48 +0000114 if (I == GVToDIEEntryMap.end())
115 return NULL;
116 return I->second;
117 }
Devang Patele064ad42009-11-20 21:37:22 +0000118
119 /// insertDIEEntry - Insert debug information entry into the map.
120 void insertDIEEntry(MDNode *N, DIEEntry *E) {
121 GVToDIEEntryMap.insert(std::make_pair(N, E));
Bill Wendling2f921f82009-05-15 09:23:25 +0000122 }
123
Devang Patel930143b2009-11-21 02:48:08 +0000124 /// addDie - Adds or interns the DIE to the compile unit.
Bill Wendling2f921f82009-05-15 09:23:25 +0000125 ///
Devang Patel930143b2009-11-21 02:48:08 +0000126 void addDie(DIE *Buffer) {
127 this->CUDie->addChild(Buffer);
Bill Wendling2f921f82009-05-15 09:23:25 +0000128 }
Devang Patel92e8c652009-11-21 00:31:03 +0000129
130 // getIndexTyDie - Get an anonymous type for index type.
131 DIE *getIndexTyDie() {
132 return IndexTyDie;
133 }
134
Jim Grosbach00e9c612009-11-22 19:20:36 +0000135 // setIndexTyDie - Set D as anonymous type for index which can be reused
136 // later.
Devang Patel92e8c652009-11-21 00:31:03 +0000137 void setIndexTyDie(DIE *D) {
138 IndexTyDie = D;
139 }
140
Bill Wendling2f921f82009-05-15 09:23:25 +0000141};
142
143//===----------------------------------------------------------------------===//
144/// DbgVariable - This class is used to track local variable information.
145///
Devang Patelf3d7c082009-11-16 21:53:40 +0000146class DbgVariable {
Bill Wendling2f921f82009-05-15 09:23:25 +0000147 DIVariable Var; // Variable Descriptor.
148 unsigned FrameIndex; // Variable frame index.
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000149 DbgVariable *AbstractVar; // Abstract variable for this variable.
150 DIE *TheDIE;
Bill Wendling2f921f82009-05-15 09:23:25 +0000151public:
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000152 DbgVariable(DIVariable V, unsigned I)
153 : Var(V), FrameIndex(I), AbstractVar(0), TheDIE(0) {}
Bill Wendling2f921f82009-05-15 09:23:25 +0000154
155 // Accessors.
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000156 DIVariable getVariable() const { return Var; }
157 unsigned getFrameIndex() const { return FrameIndex; }
158 void setAbstractVariable(DbgVariable *V) { AbstractVar = V; }
159 DbgVariable *getAbstractVariable() const { return AbstractVar; }
160 void setDIE(DIE *D) { TheDIE = D; }
161 DIE *getDIE() const { return TheDIE; }
Bill Wendling2f921f82009-05-15 09:23:25 +0000162};
163
164//===----------------------------------------------------------------------===//
165/// DbgScope - This class is used to track scope information.
166///
Devang Patelf3d7c082009-11-16 21:53:40 +0000167class DbgScope {
Bill Wendling2f921f82009-05-15 09:23:25 +0000168 DbgScope *Parent; // Parent to this scope.
Jim Grosbach042483e2009-11-21 23:12:12 +0000169 DIDescriptor Desc; // Debug info descriptor for scope.
Devang Patel1973df22010-01-26 21:39:14 +0000170 // Location at which this scope is inlined.
171 AssertingVH<MDNode> InlinedAtLocation;
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000172 bool AbstractScope; // Abstract Scope
Bill Wendling2f921f82009-05-15 09:23:25 +0000173 unsigned StartLabelID; // Label ID of the beginning of scope.
174 unsigned EndLabelID; // Label ID of the end of scope.
Devang Patel787f94c2009-10-01 18:25:23 +0000175 const MachineInstr *LastInsn; // Last instruction of this scope.
176 const MachineInstr *FirstInsn; // First instruction of this scope.
Bill Wendling2f921f82009-05-15 09:23:25 +0000177 SmallVector<DbgScope *, 4> Scopes; // Scopes defined in scope.
178 SmallVector<DbgVariable *, 8> Variables;// Variables declared in scope.
Daniel Dunbarc418d6b2009-09-19 20:40:05 +0000179
Owen Anderson9becc182009-06-24 22:53:20 +0000180 // Private state for dump()
181 mutable unsigned IndentLevel;
Bill Wendling2f921f82009-05-15 09:23:25 +0000182public:
Devang Patel6875c5eb2009-10-14 21:08:09 +0000183 DbgScope(DbgScope *P, DIDescriptor D, MDNode *I = 0)
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000184 : Parent(P), Desc(D), InlinedAtLocation(I), AbstractScope(false),
Jim Grosbach042483e2009-11-21 23:12:12 +0000185 StartLabelID(0), EndLabelID(0),
Devang Patel6875c5eb2009-10-14 21:08:09 +0000186 LastInsn(0), FirstInsn(0), IndentLevel(0) {}
Bill Wendling2f921f82009-05-15 09:23:25 +0000187 virtual ~DbgScope();
188
189 // Accessors.
190 DbgScope *getParent() const { return Parent; }
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000191 void setParent(DbgScope *P) { Parent = P; }
Bill Wendling2f921f82009-05-15 09:23:25 +0000192 DIDescriptor getDesc() const { return Desc; }
Jim Grosbach042483e2009-11-21 23:12:12 +0000193 MDNode *getInlinedAt() const {
Devang Patel1973df22010-01-26 21:39:14 +0000194 return InlinedAtLocation;
Devang Patel6875c5eb2009-10-14 21:08:09 +0000195 }
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000196 MDNode *getScopeNode() const { return Desc.getNode(); }
Bill Wendling2f921f82009-05-15 09:23:25 +0000197 unsigned getStartLabelID() const { return StartLabelID; }
198 unsigned getEndLabelID() const { return EndLabelID; }
199 SmallVector<DbgScope *, 4> &getScopes() { return Scopes; }
200 SmallVector<DbgVariable *, 8> &getVariables() { return Variables; }
Bill Wendling2f921f82009-05-15 09:23:25 +0000201 void setStartLabelID(unsigned S) { StartLabelID = S; }
202 void setEndLabelID(unsigned E) { EndLabelID = E; }
Devang Patel787f94c2009-10-01 18:25:23 +0000203 void setLastInsn(const MachineInstr *MI) { LastInsn = MI; }
204 const MachineInstr *getLastInsn() { return LastInsn; }
205 void setFirstInsn(const MachineInstr *MI) { FirstInsn = MI; }
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000206 void setAbstractScope() { AbstractScope = true; }
207 bool isAbstractScope() const { return AbstractScope; }
Devang Patel787f94c2009-10-01 18:25:23 +0000208 const MachineInstr *getFirstInsn() { return FirstInsn; }
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000209
Devang Patel930143b2009-11-21 02:48:08 +0000210 /// addScope - Add a scope to the scope.
Bill Wendling2f921f82009-05-15 09:23:25 +0000211 ///
Devang Patel930143b2009-11-21 02:48:08 +0000212 void addScope(DbgScope *S) { Scopes.push_back(S); }
Bill Wendling2f921f82009-05-15 09:23:25 +0000213
Devang Patel930143b2009-11-21 02:48:08 +0000214 /// addVariable - Add a variable to the scope.
Bill Wendling2f921f82009-05-15 09:23:25 +0000215 ///
Devang Patel930143b2009-11-21 02:48:08 +0000216 void addVariable(DbgVariable *V) { Variables.push_back(V); }
Bill Wendling2f921f82009-05-15 09:23:25 +0000217
Devang Patel530a0752010-01-04 20:44:00 +0000218 void fixInstructionMarkers(DenseMap<const MachineInstr *,
219 unsigned> &MIIndexMap) {
Devang Patel75cc16c2009-10-01 20:31:14 +0000220 assert (getFirstInsn() && "First instruction is missing!");
Devang Patel530a0752010-01-04 20:44:00 +0000221
222 // Use the end of last child scope as end of this scope.
Devang Patel75cc16c2009-10-01 20:31:14 +0000223 SmallVector<DbgScope *, 4> &Scopes = getScopes();
Devang Pateld146e2e2010-01-05 16:59:17 +0000224 const MachineInstr *LastInsn = getFirstInsn();
Devang Patel530a0752010-01-04 20:44:00 +0000225 unsigned LIndex = 0;
226 if (Scopes.empty()) {
227 assert (getLastInsn() && "Inner most scope does not have last insn!");
228 return;
229 }
230 for (SmallVector<DbgScope *, 4>::iterator SI = Scopes.begin(),
231 SE = Scopes.end(); SI != SE; ++SI) {
232 DbgScope *DS = *SI;
233 DS->fixInstructionMarkers(MIIndexMap);
234 const MachineInstr *DSLastInsn = DS->getLastInsn();
235 unsigned DSI = MIIndexMap[DSLastInsn];
236 if (DSI > LIndex) {
237 LastInsn = DSLastInsn;
238 LIndex = DSI;
239 }
240 }
241 setLastInsn(LastInsn);
Devang Patel75cc16c2009-10-01 20:31:14 +0000242 }
243
Bill Wendling2f921f82009-05-15 09:23:25 +0000244#ifndef NDEBUG
245 void dump() const;
246#endif
247};
248
249#ifndef NDEBUG
250void DbgScope::dump() const {
David Greenec230cb92009-12-24 00:31:35 +0000251 raw_ostream &err = dbgs();
Chris Lattner81e8e022009-08-23 00:51:00 +0000252 err.indent(IndentLevel);
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000253 MDNode *N = Desc.getNode();
254 N->dump();
Chris Lattner81e8e022009-08-23 00:51:00 +0000255 err << " [" << StartLabelID << ", " << EndLabelID << "]\n";
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000256 if (AbstractScope)
257 err << "Abstract Scope\n";
Bill Wendling2f921f82009-05-15 09:23:25 +0000258
259 IndentLevel += 2;
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000260 if (!Scopes.empty())
261 err << "Children ...\n";
Bill Wendling2f921f82009-05-15 09:23:25 +0000262 for (unsigned i = 0, e = Scopes.size(); i != e; ++i)
263 if (Scopes[i] != this)
264 Scopes[i]->dump();
265
266 IndentLevel -= 2;
267}
268#endif
269
Bill Wendling2f921f82009-05-15 09:23:25 +0000270DbgScope::~DbgScope() {
271 for (unsigned i = 0, N = Scopes.size(); i < N; ++i)
272 delete Scopes[i];
273 for (unsigned j = 0, M = Variables.size(); j < M; ++j)
274 delete Variables[j];
Bill Wendling2f921f82009-05-15 09:23:25 +0000275}
276
277} // end llvm namespace
278
Chris Lattner7b26fce2009-08-22 20:48:53 +0000279DwarfDebug::DwarfDebug(raw_ostream &OS, AsmPrinter *A, const MCAsmInfo *T)
Chris Lattner69bb0262010-01-22 22:23:57 +0000280 : DwarfPrinter(OS, A, T, "dbg"), ModuleCU(0),
Bill Wendling2f921f82009-05-15 09:23:25 +0000281 AbbreviationsSet(InitAbbreviationsSetSize), Abbreviations(),
Devang Patel930143b2009-11-21 02:48:08 +0000282 DIEValues(), StringPool(),
Bill Wendling2f921f82009-05-15 09:23:25 +0000283 SectionSourceLines(), didInitial(false), shouldEmit(false),
Devang Patelf6eeaeb2009-11-10 23:06:00 +0000284 CurrentFnDbgScope(0), DebugTimer(0) {
Bill Wendling2f921f82009-05-15 09:23:25 +0000285 if (TimePassesIsEnabled)
Chris Lattnerf81add32009-12-28 07:41:18 +0000286 DebugTimer = new Timer("Dwarf Debug Writer");
Bill Wendling2f921f82009-05-15 09:23:25 +0000287}
288DwarfDebug::~DwarfDebug() {
Devang Patel930143b2009-11-21 02:48:08 +0000289 for (unsigned j = 0, M = DIEValues.size(); j < M; ++j)
290 delete DIEValues[j];
Bill Wendling2f921f82009-05-15 09:23:25 +0000291
Bill Wendling2f921f82009-05-15 09:23:25 +0000292 delete DebugTimer;
293}
294
Devang Patel930143b2009-11-21 02:48:08 +0000295/// assignAbbrevNumber - Define a unique number for the abbreviation.
Bill Wendling2f921f82009-05-15 09:23:25 +0000296///
Devang Patel930143b2009-11-21 02:48:08 +0000297void DwarfDebug::assignAbbrevNumber(DIEAbbrev &Abbrev) {
Bill Wendling2f921f82009-05-15 09:23:25 +0000298 // Profile the node so that we can make it unique.
299 FoldingSetNodeID ID;
300 Abbrev.Profile(ID);
301
302 // Check the set for priors.
303 DIEAbbrev *InSet = AbbreviationsSet.GetOrInsertNode(&Abbrev);
304
305 // If it's newly added.
306 if (InSet == &Abbrev) {
307 // Add to abbreviation list.
308 Abbreviations.push_back(&Abbrev);
309
310 // Assign the vector position + 1 as its number.
311 Abbrev.setNumber(Abbreviations.size());
312 } else {
313 // Assign existing abbreviation number.
314 Abbrev.setNumber(InSet->getNumber());
315 }
316}
317
Devang Patel930143b2009-11-21 02:48:08 +0000318/// createDIEEntry - Creates a new DIEEntry to be a proxy for a debug
Bill Wendlingbcad77a2009-05-20 23:24:48 +0000319/// information entry.
Devang Patel930143b2009-11-21 02:48:08 +0000320DIEEntry *DwarfDebug::createDIEEntry(DIE *Entry) {
Devang Patel92e8c652009-11-21 00:31:03 +0000321 DIEEntry *Value = new DIEEntry(Entry);
Devang Patel930143b2009-11-21 02:48:08 +0000322 DIEValues.push_back(Value);
Bill Wendling2f921f82009-05-15 09:23:25 +0000323 return Value;
324}
325
Devang Patel930143b2009-11-21 02:48:08 +0000326/// addUInt - Add an unsigned integer attribute data and value.
Bill Wendling2f921f82009-05-15 09:23:25 +0000327///
Devang Patel930143b2009-11-21 02:48:08 +0000328void DwarfDebug::addUInt(DIE *Die, unsigned Attribute,
Bill Wendling2f921f82009-05-15 09:23:25 +0000329 unsigned Form, uint64_t Integer) {
330 if (!Form) Form = DIEInteger::BestForm(false, Integer);
Devang Patel92e8c652009-11-21 00:31:03 +0000331 DIEValue *Value = new DIEInteger(Integer);
Devang Patel930143b2009-11-21 02:48:08 +0000332 DIEValues.push_back(Value);
333 Die->addValue(Attribute, Form, Value);
Bill Wendling2f921f82009-05-15 09:23:25 +0000334}
335
Devang Patel930143b2009-11-21 02:48:08 +0000336/// addSInt - Add an signed integer attribute data and value.
Bill Wendling2f921f82009-05-15 09:23:25 +0000337///
Devang Patel930143b2009-11-21 02:48:08 +0000338void DwarfDebug::addSInt(DIE *Die, unsigned Attribute,
Bill Wendling2f921f82009-05-15 09:23:25 +0000339 unsigned Form, int64_t Integer) {
340 if (!Form) Form = DIEInteger::BestForm(true, Integer);
Devang Patel92e8c652009-11-21 00:31:03 +0000341 DIEValue *Value = new DIEInteger(Integer);
Devang Patel930143b2009-11-21 02:48:08 +0000342 DIEValues.push_back(Value);
343 Die->addValue(Attribute, Form, Value);
Bill Wendling2f921f82009-05-15 09:23:25 +0000344}
345
Devang Patel8c339592009-12-02 15:25:16 +0000346/// addString - Add a string attribute data and value. DIEString only
347/// keeps string reference.
Devang Patel930143b2009-11-21 02:48:08 +0000348void DwarfDebug::addString(DIE *Die, unsigned Attribute, unsigned Form,
Chris Lattnerc3f23b82010-01-23 03:11:46 +0000349 StringRef String) {
Devang Patel92e8c652009-11-21 00:31:03 +0000350 DIEValue *Value = new DIEString(String);
Devang Patel930143b2009-11-21 02:48:08 +0000351 DIEValues.push_back(Value);
352 Die->addValue(Attribute, Form, Value);
Bill Wendling2f921f82009-05-15 09:23:25 +0000353}
354
Devang Patel930143b2009-11-21 02:48:08 +0000355/// addLabel - Add a Dwarf label attribute data and value.
Bill Wendling2f921f82009-05-15 09:23:25 +0000356///
Devang Patel930143b2009-11-21 02:48:08 +0000357void DwarfDebug::addLabel(DIE *Die, unsigned Attribute, unsigned Form,
Bill Wendling2f921f82009-05-15 09:23:25 +0000358 const DWLabel &Label) {
Devang Patel92e8c652009-11-21 00:31:03 +0000359 DIEValue *Value = new DIEDwarfLabel(Label);
Devang Patel930143b2009-11-21 02:48:08 +0000360 DIEValues.push_back(Value);
361 Die->addValue(Attribute, Form, Value);
Bill Wendling2f921f82009-05-15 09:23:25 +0000362}
363
Devang Patel930143b2009-11-21 02:48:08 +0000364/// addObjectLabel - Add an non-Dwarf label attribute data and value.
Bill Wendling2f921f82009-05-15 09:23:25 +0000365///
Devang Patel930143b2009-11-21 02:48:08 +0000366void DwarfDebug::addObjectLabel(DIE *Die, unsigned Attribute, unsigned Form,
Chris Lattner06d45f62010-01-16 18:50:28 +0000367 const MCSymbol *Sym) {
368 DIEValue *Value = new DIEObjectLabel(Sym);
Devang Patel930143b2009-11-21 02:48:08 +0000369 DIEValues.push_back(Value);
370 Die->addValue(Attribute, Form, Value);
Bill Wendling2f921f82009-05-15 09:23:25 +0000371}
372
Devang Patel930143b2009-11-21 02:48:08 +0000373/// addSectionOffset - Add a section offset label attribute data and value.
Bill Wendling2f921f82009-05-15 09:23:25 +0000374///
Devang Patel930143b2009-11-21 02:48:08 +0000375void DwarfDebug::addSectionOffset(DIE *Die, unsigned Attribute, unsigned Form,
Bill Wendling2f921f82009-05-15 09:23:25 +0000376 const DWLabel &Label, const DWLabel &Section,
377 bool isEH, bool useSet) {
Devang Patel92e8c652009-11-21 00:31:03 +0000378 DIEValue *Value = new DIESectionOffset(Label, Section, isEH, useSet);
Devang Patel930143b2009-11-21 02:48:08 +0000379 DIEValues.push_back(Value);
380 Die->addValue(Attribute, Form, Value);
Bill Wendling2f921f82009-05-15 09:23:25 +0000381}
382
Devang Patel930143b2009-11-21 02:48:08 +0000383/// addDelta - Add a label delta attribute data and value.
Bill Wendling2f921f82009-05-15 09:23:25 +0000384///
Devang Patel930143b2009-11-21 02:48:08 +0000385void DwarfDebug::addDelta(DIE *Die, unsigned Attribute, unsigned Form,
Bill Wendling2f921f82009-05-15 09:23:25 +0000386 const DWLabel &Hi, const DWLabel &Lo) {
Devang Patel92e8c652009-11-21 00:31:03 +0000387 DIEValue *Value = new DIEDelta(Hi, Lo);
Devang Patel930143b2009-11-21 02:48:08 +0000388 DIEValues.push_back(Value);
389 Die->addValue(Attribute, Form, Value);
Bill Wendling2f921f82009-05-15 09:23:25 +0000390}
391
Devang Patel930143b2009-11-21 02:48:08 +0000392/// addBlock - Add block data.
Bill Wendling2f921f82009-05-15 09:23:25 +0000393///
Devang Patel930143b2009-11-21 02:48:08 +0000394void DwarfDebug::addBlock(DIE *Die, unsigned Attribute, unsigned Form,
Bill Wendling2f921f82009-05-15 09:23:25 +0000395 DIEBlock *Block) {
396 Block->ComputeSize(TD);
Devang Patel930143b2009-11-21 02:48:08 +0000397 DIEValues.push_back(Block);
398 Die->addValue(Attribute, Block->BestForm(), Block);
Bill Wendling2f921f82009-05-15 09:23:25 +0000399}
400
Devang Patel930143b2009-11-21 02:48:08 +0000401/// addSourceLine - Add location information to specified debug information
Bill Wendling2f921f82009-05-15 09:23:25 +0000402/// entry.
Devang Patel930143b2009-11-21 02:48:08 +0000403void DwarfDebug::addSourceLine(DIE *Die, const DIVariable *V) {
Bill Wendling2f921f82009-05-15 09:23:25 +0000404 // If there is no compile unit specified, don't add a line #.
405 if (V->getCompileUnit().isNull())
406 return;
407
408 unsigned Line = V->getLineNumber();
Devang Patelb314bd62009-12-11 21:37:07 +0000409 unsigned FileID = findCompileUnit(V->getCompileUnit())->getID();
Bill Wendling2f921f82009-05-15 09:23:25 +0000410 assert(FileID && "Invalid file id");
Devang Patel930143b2009-11-21 02:48:08 +0000411 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
412 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
Bill Wendling2f921f82009-05-15 09:23:25 +0000413}
414
Devang Patel930143b2009-11-21 02:48:08 +0000415/// addSourceLine - Add location information to specified debug information
Bill Wendling2f921f82009-05-15 09:23:25 +0000416/// entry.
Devang Patel930143b2009-11-21 02:48:08 +0000417void DwarfDebug::addSourceLine(DIE *Die, const DIGlobal *G) {
Bill Wendling2f921f82009-05-15 09:23:25 +0000418 // If there is no compile unit specified, don't add a line #.
419 if (G->getCompileUnit().isNull())
420 return;
421
422 unsigned Line = G->getLineNumber();
Devang Patelb314bd62009-12-11 21:37:07 +0000423 unsigned FileID = findCompileUnit(G->getCompileUnit())->getID();
Bill Wendling2f921f82009-05-15 09:23:25 +0000424 assert(FileID && "Invalid file id");
Devang Patel930143b2009-11-21 02:48:08 +0000425 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
426 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
Bill Wendling2f921f82009-05-15 09:23:25 +0000427}
Devang Patelb2de5fa2009-08-31 22:47:13 +0000428
Devang Patel930143b2009-11-21 02:48:08 +0000429/// addSourceLine - Add location information to specified debug information
Devang Patelb2de5fa2009-08-31 22:47:13 +0000430/// entry.
Devang Patel930143b2009-11-21 02:48:08 +0000431void DwarfDebug::addSourceLine(DIE *Die, const DISubprogram *SP) {
Devang Patelb2de5fa2009-08-31 22:47:13 +0000432 // If there is no compile unit specified, don't add a line #.
433 if (SP->getCompileUnit().isNull())
434 return;
Caroline Tice183a5192009-09-11 18:25:54 +0000435 // If the line number is 0, don't add it.
436 if (SP->getLineNumber() == 0)
437 return;
438
Devang Patelb2de5fa2009-08-31 22:47:13 +0000439
440 unsigned Line = SP->getLineNumber();
Devang Patelb314bd62009-12-11 21:37:07 +0000441 unsigned FileID = findCompileUnit(SP->getCompileUnit())->getID();
Devang Patelb2de5fa2009-08-31 22:47:13 +0000442 assert(FileID && "Invalid file id");
Devang Patel930143b2009-11-21 02:48:08 +0000443 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
444 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
Devang Patelb2de5fa2009-08-31 22:47:13 +0000445}
446
Devang Patel930143b2009-11-21 02:48:08 +0000447/// addSourceLine - Add location information to specified debug information
Devang Patelb2de5fa2009-08-31 22:47:13 +0000448/// entry.
Devang Patel930143b2009-11-21 02:48:08 +0000449void DwarfDebug::addSourceLine(DIE *Die, const DIType *Ty) {
Bill Wendling2f921f82009-05-15 09:23:25 +0000450 // If there is no compile unit specified, don't add a line #.
451 DICompileUnit CU = Ty->getCompileUnit();
452 if (CU.isNull())
453 return;
454
455 unsigned Line = Ty->getLineNumber();
Devang Patelb314bd62009-12-11 21:37:07 +0000456 unsigned FileID = findCompileUnit(CU)->getID();
Bill Wendling2f921f82009-05-15 09:23:25 +0000457 assert(FileID && "Invalid file id");
Devang Patel930143b2009-11-21 02:48:08 +0000458 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
459 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
Bill Wendling2f921f82009-05-15 09:23:25 +0000460}
461
Devang Patel1f4690c2009-12-15 19:16:48 +0000462/// addSourceLine - Add location information to specified debug information
463/// entry.
464void DwarfDebug::addSourceLine(DIE *Die, const DINameSpace *NS) {
465 // If there is no compile unit specified, don't add a line #.
466 if (NS->getCompileUnit().isNull())
467 return;
468
469 unsigned Line = NS->getLineNumber();
470 StringRef FN = NS->getFilename();
471 StringRef Dir = NS->getDirectory();
472
473 unsigned FileID = GetOrCreateSourceID(Dir, FN);
474 assert(FileID && "Invalid file id");
475 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
476 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
477}
478
Caroline Ticec87c1e22009-08-31 21:19:37 +0000479/* Byref variables, in Blocks, are declared by the programmer as
480 "SomeType VarName;", but the compiler creates a
481 __Block_byref_x_VarName struct, and gives the variable VarName
482 either the struct, or a pointer to the struct, as its type. This
483 is necessary for various behind-the-scenes things the compiler
484 needs to do with by-reference variables in blocks.
485
486 However, as far as the original *programmer* is concerned, the
487 variable should still have type 'SomeType', as originally declared.
488
489 The following function dives into the __Block_byref_x_VarName
490 struct to find the original type of the variable. This will be
491 passed back to the code generating the type for the Debug
492 Information Entry for the variable 'VarName'. 'VarName' will then
493 have the original type 'SomeType' in its debug information.
494
495 The original type 'SomeType' will be the type of the field named
496 'VarName' inside the __Block_byref_x_VarName struct.
497
498 NOTE: In order for this to not completely fail on the debugger
499 side, the Debug Information Entry for the variable VarName needs to
500 have a DW_AT_location that tells the debugger how to unwind through
501 the pointers and __Block_byref_x_VarName struct to find the actual
Devang Patel930143b2009-11-21 02:48:08 +0000502 value of the variable. The function addBlockByrefType does this. */
Caroline Ticec87c1e22009-08-31 21:19:37 +0000503
504/// Find the type the programmer originally declared the variable to be
505/// and return that type.
506///
Devang Patel930143b2009-11-21 02:48:08 +0000507DIType DwarfDebug::getBlockByrefType(DIType Ty, std::string Name) {
Caroline Ticec87c1e22009-08-31 21:19:37 +0000508
509 DIType subType = Ty;
510 unsigned tag = Ty.getTag();
511
512 if (tag == dwarf::DW_TAG_pointer_type) {
Mike Stump14cf8ec2009-09-30 00:08:22 +0000513 DIDerivedType DTy = DIDerivedType(Ty.getNode());
Caroline Ticec87c1e22009-08-31 21:19:37 +0000514 subType = DTy.getTypeDerivedFrom();
515 }
516
517 DICompositeType blockStruct = DICompositeType(subType.getNode());
518
519 DIArray Elements = blockStruct.getTypeArray();
520
521 if (Elements.isNull())
522 return Ty;
523
524 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
525 DIDescriptor Element = Elements.getElement(i);
526 DIDerivedType DT = DIDerivedType(Element.getNode());
Devang Patel2d9caf92009-11-25 17:36:49 +0000527 if (Name == DT.getName())
Caroline Ticec87c1e22009-08-31 21:19:37 +0000528 return (DT.getTypeDerivedFrom());
529 }
530
531 return Ty;
532}
533
Devang Patel930143b2009-11-21 02:48:08 +0000534/// addComplexAddress - Start with the address based on the location provided,
Mike Stump14cf8ec2009-09-30 00:08:22 +0000535/// and generate the DWARF information necessary to find the actual variable
536/// given the extra address information encoded in the DIVariable, starting from
537/// the starting location. Add the DWARF information to the die.
538///
Devang Patel930143b2009-11-21 02:48:08 +0000539void DwarfDebug::addComplexAddress(DbgVariable *&DV, DIE *Die,
Mike Stump14cf8ec2009-09-30 00:08:22 +0000540 unsigned Attribute,
541 const MachineLocation &Location) {
542 const DIVariable &VD = DV->getVariable();
543 DIType Ty = VD.getType();
544
545 // Decode the original location, and use that as the start of the byref
546 // variable's location.
547 unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
548 DIEBlock *Block = new DIEBlock();
549
550 if (Location.isReg()) {
551 if (Reg < 32) {
Devang Patel930143b2009-11-21 02:48:08 +0000552 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
Mike Stump14cf8ec2009-09-30 00:08:22 +0000553 } else {
554 Reg = Reg - dwarf::DW_OP_reg0;
Devang Patel930143b2009-11-21 02:48:08 +0000555 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
556 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
Mike Stump14cf8ec2009-09-30 00:08:22 +0000557 }
558 } else {
559 if (Reg < 32)
Devang Patel930143b2009-11-21 02:48:08 +0000560 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
Mike Stump14cf8ec2009-09-30 00:08:22 +0000561 else {
Devang Patel930143b2009-11-21 02:48:08 +0000562 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
563 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
Mike Stump14cf8ec2009-09-30 00:08:22 +0000564 }
565
Devang Patel930143b2009-11-21 02:48:08 +0000566 addUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
Mike Stump14cf8ec2009-09-30 00:08:22 +0000567 }
568
569 for (unsigned i = 0, N = VD.getNumAddrElements(); i < N; ++i) {
570 uint64_t Element = VD.getAddrElement(i);
571
572 if (Element == DIFactory::OpPlus) {
Devang Patel930143b2009-11-21 02:48:08 +0000573 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
574 addUInt(Block, 0, dwarf::DW_FORM_udata, VD.getAddrElement(++i));
Mike Stump14cf8ec2009-09-30 00:08:22 +0000575 } else if (Element == DIFactory::OpDeref) {
Devang Patel930143b2009-11-21 02:48:08 +0000576 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Mike Stump14cf8ec2009-09-30 00:08:22 +0000577 } else llvm_unreachable("unknown DIFactory Opcode");
578 }
579
580 // Now attach the location information to the DIE.
Devang Patel930143b2009-11-21 02:48:08 +0000581 addBlock(Die, Attribute, 0, Block);
Mike Stump14cf8ec2009-09-30 00:08:22 +0000582}
583
Caroline Ticec87c1e22009-08-31 21:19:37 +0000584/* Byref variables, in Blocks, are declared by the programmer as "SomeType
585 VarName;", but the compiler creates a __Block_byref_x_VarName struct, and
586 gives the variable VarName either the struct, or a pointer to the struct, as
587 its type. This is necessary for various behind-the-scenes things the
588 compiler needs to do with by-reference variables in Blocks.
589
590 However, as far as the original *programmer* is concerned, the variable
591 should still have type 'SomeType', as originally declared.
592
Devang Patel930143b2009-11-21 02:48:08 +0000593 The function getBlockByrefType dives into the __Block_byref_x_VarName
Caroline Ticec87c1e22009-08-31 21:19:37 +0000594 struct to find the original type of the variable, which is then assigned to
595 the variable's Debug Information Entry as its real type. So far, so good.
596 However now the debugger will expect the variable VarName to have the type
597 SomeType. So we need the location attribute for the variable to be an
Daniel Dunbarc418d6b2009-09-19 20:40:05 +0000598 expression that explains to the debugger how to navigate through the
Caroline Ticec87c1e22009-08-31 21:19:37 +0000599 pointers and struct to find the actual variable of type SomeType.
600
601 The following function does just that. We start by getting
602 the "normal" location for the variable. This will be the location
603 of either the struct __Block_byref_x_VarName or the pointer to the
604 struct __Block_byref_x_VarName.
605
606 The struct will look something like:
607
608 struct __Block_byref_x_VarName {
609 ... <various fields>
610 struct __Block_byref_x_VarName *forwarding;
611 ... <various other fields>
612 SomeType VarName;
613 ... <maybe more fields>
614 };
615
616 If we are given the struct directly (as our starting point) we
617 need to tell the debugger to:
618
619 1). Add the offset of the forwarding field.
620
621 2). Follow that pointer to get the the real __Block_byref_x_VarName
622 struct to use (the real one may have been copied onto the heap).
623
624 3). Add the offset for the field VarName, to find the actual variable.
625
626 If we started with a pointer to the struct, then we need to
627 dereference that pointer first, before the other steps.
628 Translating this into DWARF ops, we will need to append the following
629 to the current location description for the variable:
630
631 DW_OP_deref -- optional, if we start with a pointer
632 DW_OP_plus_uconst <forward_fld_offset>
633 DW_OP_deref
634 DW_OP_plus_uconst <varName_fld_offset>
635
636 That is what this function does. */
637
Devang Patel930143b2009-11-21 02:48:08 +0000638/// addBlockByrefAddress - Start with the address based on the location
Caroline Ticec87c1e22009-08-31 21:19:37 +0000639/// provided, and generate the DWARF information necessary to find the
640/// actual Block variable (navigating the Block struct) based on the
641/// starting location. Add the DWARF information to the die. For
642/// more information, read large comment just above here.
643///
Devang Patel930143b2009-11-21 02:48:08 +0000644void DwarfDebug::addBlockByrefAddress(DbgVariable *&DV, DIE *Die,
Daniel Dunbarbe22ec42009-09-19 20:40:14 +0000645 unsigned Attribute,
646 const MachineLocation &Location) {
Caroline Ticec87c1e22009-08-31 21:19:37 +0000647 const DIVariable &VD = DV->getVariable();
648 DIType Ty = VD.getType();
649 DIType TmpTy = Ty;
650 unsigned Tag = Ty.getTag();
651 bool isPointer = false;
652
Devang Patel2d9caf92009-11-25 17:36:49 +0000653 StringRef varName = VD.getName();
Caroline Ticec87c1e22009-08-31 21:19:37 +0000654
655 if (Tag == dwarf::DW_TAG_pointer_type) {
Mike Stump14cf8ec2009-09-30 00:08:22 +0000656 DIDerivedType DTy = DIDerivedType(Ty.getNode());
Caroline Ticec87c1e22009-08-31 21:19:37 +0000657 TmpTy = DTy.getTypeDerivedFrom();
658 isPointer = true;
659 }
660
661 DICompositeType blockStruct = DICompositeType(TmpTy.getNode());
662
Daniel Dunbarbe22ec42009-09-19 20:40:14 +0000663 // Find the __forwarding field and the variable field in the __Block_byref
664 // struct.
Daniel Dunbarbe22ec42009-09-19 20:40:14 +0000665 DIArray Fields = blockStruct.getTypeArray();
666 DIDescriptor varField = DIDescriptor();
667 DIDescriptor forwardingField = DIDescriptor();
Caroline Ticec87c1e22009-08-31 21:19:37 +0000668
669
Daniel Dunbarbe22ec42009-09-19 20:40:14 +0000670 for (unsigned i = 0, N = Fields.getNumElements(); i < N; ++i) {
671 DIDescriptor Element = Fields.getElement(i);
672 DIDerivedType DT = DIDerivedType(Element.getNode());
Devang Patel2d9caf92009-11-25 17:36:49 +0000673 StringRef fieldName = DT.getName();
674 if (fieldName == "__forwarding")
Daniel Dunbarbe22ec42009-09-19 20:40:14 +0000675 forwardingField = Element;
Devang Patel2d9caf92009-11-25 17:36:49 +0000676 else if (fieldName == varName)
Daniel Dunbarbe22ec42009-09-19 20:40:14 +0000677 varField = Element;
678 }
Daniel Dunbarc418d6b2009-09-19 20:40:05 +0000679
Mike Stump944fa252009-09-24 23:21:26 +0000680 assert(!varField.isNull() && "Can't find byref variable in Block struct");
681 assert(!forwardingField.isNull()
682 && "Can't find forwarding field in Block struct");
Caroline Ticec87c1e22009-08-31 21:19:37 +0000683
Daniel Dunbarbe22ec42009-09-19 20:40:14 +0000684 // Get the offsets for the forwarding field and the variable field.
Daniel Dunbarbe22ec42009-09-19 20:40:14 +0000685 unsigned int forwardingFieldOffset =
686 DIDerivedType(forwardingField.getNode()).getOffsetInBits() >> 3;
687 unsigned int varFieldOffset =
688 DIDerivedType(varField.getNode()).getOffsetInBits() >> 3;
Caroline Ticec87c1e22009-08-31 21:19:37 +0000689
Mike Stump944fa252009-09-24 23:21:26 +0000690 // Decode the original location, and use that as the start of the byref
691 // variable's location.
Daniel Dunbarbe22ec42009-09-19 20:40:14 +0000692 unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
693 DIEBlock *Block = new DIEBlock();
Caroline Ticec87c1e22009-08-31 21:19:37 +0000694
Daniel Dunbarbe22ec42009-09-19 20:40:14 +0000695 if (Location.isReg()) {
696 if (Reg < 32)
Devang Patel930143b2009-11-21 02:48:08 +0000697 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
Daniel Dunbarbe22ec42009-09-19 20:40:14 +0000698 else {
699 Reg = Reg - dwarf::DW_OP_reg0;
Devang Patel930143b2009-11-21 02:48:08 +0000700 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
701 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
Daniel Dunbarbe22ec42009-09-19 20:40:14 +0000702 }
703 } else {
704 if (Reg < 32)
Devang Patel930143b2009-11-21 02:48:08 +0000705 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
Daniel Dunbarbe22ec42009-09-19 20:40:14 +0000706 else {
Devang Patel930143b2009-11-21 02:48:08 +0000707 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
708 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
Daniel Dunbarbe22ec42009-09-19 20:40:14 +0000709 }
Caroline Ticec87c1e22009-08-31 21:19:37 +0000710
Devang Patel930143b2009-11-21 02:48:08 +0000711 addUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
Daniel Dunbarbe22ec42009-09-19 20:40:14 +0000712 }
Caroline Ticec87c1e22009-08-31 21:19:37 +0000713
Mike Stump944fa252009-09-24 23:21:26 +0000714 // If we started with a pointer to the __Block_byref... struct, then
Daniel Dunbarbe22ec42009-09-19 20:40:14 +0000715 // the first thing we need to do is dereference the pointer (DW_OP_deref).
Daniel Dunbarbe22ec42009-09-19 20:40:14 +0000716 if (isPointer)
Devang Patel930143b2009-11-21 02:48:08 +0000717 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Caroline Ticec87c1e22009-08-31 21:19:37 +0000718
Daniel Dunbarbe22ec42009-09-19 20:40:14 +0000719 // Next add the offset for the '__forwarding' field:
720 // DW_OP_plus_uconst ForwardingFieldOffset. Note there's no point in
721 // adding the offset if it's 0.
Daniel Dunbarbe22ec42009-09-19 20:40:14 +0000722 if (forwardingFieldOffset > 0) {
Devang Patel930143b2009-11-21 02:48:08 +0000723 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
724 addUInt(Block, 0, dwarf::DW_FORM_udata, forwardingFieldOffset);
Daniel Dunbarbe22ec42009-09-19 20:40:14 +0000725 }
Caroline Ticec87c1e22009-08-31 21:19:37 +0000726
Daniel Dunbarbe22ec42009-09-19 20:40:14 +0000727 // Now dereference the __forwarding field to get to the real __Block_byref
728 // struct: DW_OP_deref.
Devang Patel930143b2009-11-21 02:48:08 +0000729 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Caroline Ticec87c1e22009-08-31 21:19:37 +0000730
Daniel Dunbarbe22ec42009-09-19 20:40:14 +0000731 // Now that we've got the real __Block_byref... struct, add the offset
732 // for the variable's field to get to the location of the actual variable:
733 // DW_OP_plus_uconst varFieldOffset. Again, don't add if it's 0.
Daniel Dunbarbe22ec42009-09-19 20:40:14 +0000734 if (varFieldOffset > 0) {
Devang Patel930143b2009-11-21 02:48:08 +0000735 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
736 addUInt(Block, 0, dwarf::DW_FORM_udata, varFieldOffset);
Daniel Dunbarbe22ec42009-09-19 20:40:14 +0000737 }
Caroline Ticec87c1e22009-08-31 21:19:37 +0000738
Daniel Dunbarbe22ec42009-09-19 20:40:14 +0000739 // Now attach the location information to the DIE.
Devang Patel930143b2009-11-21 02:48:08 +0000740 addBlock(Die, Attribute, 0, Block);
Caroline Ticec87c1e22009-08-31 21:19:37 +0000741}
742
Devang Patel930143b2009-11-21 02:48:08 +0000743/// addAddress - Add an address attribute to a die based on the location
Bill Wendling2f921f82009-05-15 09:23:25 +0000744/// provided.
Devang Patel930143b2009-11-21 02:48:08 +0000745void DwarfDebug::addAddress(DIE *Die, unsigned Attribute,
Bill Wendling2f921f82009-05-15 09:23:25 +0000746 const MachineLocation &Location) {
747 unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
748 DIEBlock *Block = new DIEBlock();
749
750 if (Location.isReg()) {
751 if (Reg < 32) {
Devang Patel930143b2009-11-21 02:48:08 +0000752 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
Bill Wendling2f921f82009-05-15 09:23:25 +0000753 } else {
Devang Patel930143b2009-11-21 02:48:08 +0000754 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
755 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
Bill Wendling2f921f82009-05-15 09:23:25 +0000756 }
757 } else {
758 if (Reg < 32) {
Devang Patel930143b2009-11-21 02:48:08 +0000759 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
Bill Wendling2f921f82009-05-15 09:23:25 +0000760 } else {
Devang Patel930143b2009-11-21 02:48:08 +0000761 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
762 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
Bill Wendling2f921f82009-05-15 09:23:25 +0000763 }
764
Devang Patel930143b2009-11-21 02:48:08 +0000765 addUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
Bill Wendling2f921f82009-05-15 09:23:25 +0000766 }
767
Devang Patel930143b2009-11-21 02:48:08 +0000768 addBlock(Die, Attribute, 0, Block);
Bill Wendling2f921f82009-05-15 09:23:25 +0000769}
770
Devang Patel2b75ed22009-12-10 19:14:49 +0000771/// addToContextOwner - Add Die into the list of its context owner's children.
772void DwarfDebug::addToContextOwner(DIE *Die, DIDescriptor Context) {
773 if (Context.isNull())
774 ModuleCU->addDie(Die);
775 else if (Context.isType()) {
776 DIE *ContextDIE = getOrCreateTypeDIE(DIType(Context.getNode()));
777 ContextDIE->addChild(Die);
Devang Patel1f4690c2009-12-15 19:16:48 +0000778 } else if (Context.isNameSpace()) {
779 DIE *ContextDIE = getOrCreateNameSpace(DINameSpace(Context.getNode()));
780 ContextDIE->addChild(Die);
Devang Patel2b75ed22009-12-10 19:14:49 +0000781 } else if (DIE *ContextDIE = ModuleCU->getDIE(Context.getNode()))
782 ContextDIE->addChild(Die);
783 else
784 ModuleCU->addDie(Die);
785}
786
Devang Patelb5b60ea2009-12-10 18:05:33 +0000787/// getOrCreateTypeDIE - Find existing DIE or create new DIE for the
788/// given DIType.
789DIE *DwarfDebug::getOrCreateTypeDIE(DIType Ty) {
790 DIE *TyDIE = ModuleCU->getDIE(Ty.getNode());
791 if (TyDIE)
792 return TyDIE;
793
794 // Create new type.
795 TyDIE = new DIE(dwarf::DW_TAG_base_type);
796 ModuleCU->insertDIE(Ty.getNode(), TyDIE);
797 if (Ty.isBasicType())
798 constructTypeDIE(*TyDIE, DIBasicType(Ty.getNode()));
799 else if (Ty.isCompositeType())
800 constructTypeDIE(*TyDIE, DICompositeType(Ty.getNode()));
801 else {
802 assert(Ty.isDerivedType() && "Unknown kind of DIType");
803 constructTypeDIE(*TyDIE, DIDerivedType(Ty.getNode()));
804 }
805
Devang Patel2b75ed22009-12-10 19:14:49 +0000806 addToContextOwner(TyDIE, Ty.getContext());
Devang Patelb5b60ea2009-12-10 18:05:33 +0000807 return TyDIE;
808}
809
Devang Patel930143b2009-11-21 02:48:08 +0000810/// addType - Add a new type attribute to the specified entity.
Devang Patel9ccfb642009-12-09 18:24:21 +0000811void DwarfDebug::addType(DIE *Entity, DIType Ty) {
Bill Wendling2f921f82009-05-15 09:23:25 +0000812 if (Ty.isNull())
813 return;
814
815 // Check for pre-existence.
Devang Patel9ccfb642009-12-09 18:24:21 +0000816 DIEEntry *Entry = ModuleCU->getDIEEntry(Ty.getNode());
Bill Wendling2f921f82009-05-15 09:23:25 +0000817 // If it exists then use the existing value.
Devang Patel930143b2009-11-21 02:48:08 +0000818 if (Entry) {
819 Entity->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, Entry);
Bill Wendling2f921f82009-05-15 09:23:25 +0000820 return;
821 }
822
823 // Set up proxy.
Devang Patel930143b2009-11-21 02:48:08 +0000824 Entry = createDIEEntry();
Devang Patel9ccfb642009-12-09 18:24:21 +0000825 ModuleCU->insertDIEEntry(Ty.getNode(), Entry);
Bill Wendling2f921f82009-05-15 09:23:25 +0000826
827 // Construct type.
Devang Patelb5b60ea2009-12-10 18:05:33 +0000828 DIE *Buffer = getOrCreateTypeDIE(Ty);
Bill Wendling2f921f82009-05-15 09:23:25 +0000829
Devang Patel930143b2009-11-21 02:48:08 +0000830 Entry->setEntry(Buffer);
831 Entity->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, Entry);
Bill Wendling2f921f82009-05-15 09:23:25 +0000832}
833
Devang Patel930143b2009-11-21 02:48:08 +0000834/// constructTypeDIE - Construct basic type die from DIBasicType.
Devang Patel9ccfb642009-12-09 18:24:21 +0000835void DwarfDebug::constructTypeDIE(DIE &Buffer, DIBasicType BTy) {
Bill Wendling2f921f82009-05-15 09:23:25 +0000836 // Get core information.
Devang Patel2d9caf92009-11-25 17:36:49 +0000837 StringRef Name = BTy.getName();
Bill Wendling2f921f82009-05-15 09:23:25 +0000838 Buffer.setTag(dwarf::DW_TAG_base_type);
Devang Patel930143b2009-11-21 02:48:08 +0000839 addUInt(&Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
Bill Wendling2f921f82009-05-15 09:23:25 +0000840 BTy.getEncoding());
841
842 // Add name if not anonymous or intermediate type.
Devang Patel2d9caf92009-11-25 17:36:49 +0000843 if (!Name.empty())
Devang Patel930143b2009-11-21 02:48:08 +0000844 addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
Bill Wendling2f921f82009-05-15 09:23:25 +0000845 uint64_t Size = BTy.getSizeInBits() >> 3;
Devang Patel930143b2009-11-21 02:48:08 +0000846 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
Bill Wendling2f921f82009-05-15 09:23:25 +0000847}
848
Devang Patel930143b2009-11-21 02:48:08 +0000849/// constructTypeDIE - Construct derived type die from DIDerivedType.
Devang Patel9ccfb642009-12-09 18:24:21 +0000850void DwarfDebug::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) {
Bill Wendling2f921f82009-05-15 09:23:25 +0000851 // Get core information.
Devang Patel2d9caf92009-11-25 17:36:49 +0000852 StringRef Name = DTy.getName();
Bill Wendling2f921f82009-05-15 09:23:25 +0000853 uint64_t Size = DTy.getSizeInBits() >> 3;
854 unsigned Tag = DTy.getTag();
855
856 // FIXME - Workaround for templates.
857 if (Tag == dwarf::DW_TAG_inheritance) Tag = dwarf::DW_TAG_reference_type;
858
859 Buffer.setTag(Tag);
860
861 // Map to main type, void will not have a type.
862 DIType FromTy = DTy.getTypeDerivedFrom();
Devang Patel9ccfb642009-12-09 18:24:21 +0000863 addType(&Buffer, FromTy);
Bill Wendling2f921f82009-05-15 09:23:25 +0000864
865 // Add name if not anonymous or intermediate type.
Devang Patelae466ef2009-11-30 23:56:56 +0000866 if (!Name.empty())
Devang Patel930143b2009-11-21 02:48:08 +0000867 addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
Bill Wendling2f921f82009-05-15 09:23:25 +0000868
869 // Add size if non-zero (derived types might be zero-sized.)
870 if (Size)
Devang Patel930143b2009-11-21 02:48:08 +0000871 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
Bill Wendling2f921f82009-05-15 09:23:25 +0000872
873 // Add source line info if available and TyDesc is not a forward declaration.
Devang Patelb5b51592009-11-23 18:43:37 +0000874 if (!DTy.isForwardDecl())
Devang Patel930143b2009-11-21 02:48:08 +0000875 addSourceLine(&Buffer, &DTy);
Bill Wendling2f921f82009-05-15 09:23:25 +0000876}
877
Devang Patel930143b2009-11-21 02:48:08 +0000878/// constructTypeDIE - Construct type DIE from DICompositeType.
Devang Patel9ccfb642009-12-09 18:24:21 +0000879void DwarfDebug::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
Bill Wendling2f921f82009-05-15 09:23:25 +0000880 // Get core information.
Devang Patel2d9caf92009-11-25 17:36:49 +0000881 StringRef Name = CTy.getName();
Bill Wendling2f921f82009-05-15 09:23:25 +0000882
883 uint64_t Size = CTy.getSizeInBits() >> 3;
884 unsigned Tag = CTy.getTag();
885 Buffer.setTag(Tag);
886
887 switch (Tag) {
888 case dwarf::DW_TAG_vector_type:
889 case dwarf::DW_TAG_array_type:
Devang Patel9ccfb642009-12-09 18:24:21 +0000890 constructArrayTypeDIE(Buffer, &CTy);
Bill Wendling2f921f82009-05-15 09:23:25 +0000891 break;
892 case dwarf::DW_TAG_enumeration_type: {
893 DIArray Elements = CTy.getTypeArray();
894
895 // Add enumerators to enumeration type.
896 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
897 DIE *ElemDie = NULL;
Devang Patel80ae3492009-08-28 23:24:31 +0000898 DIEnumerator Enum(Elements.getElement(i).getNode());
Devang Patelfafa1fe2009-10-09 17:51:49 +0000899 if (!Enum.isNull()) {
Devang Patel9ccfb642009-12-09 18:24:21 +0000900 ElemDie = constructEnumTypeDIE(&Enum);
Devang Patel930143b2009-11-21 02:48:08 +0000901 Buffer.addChild(ElemDie);
Devang Patelfafa1fe2009-10-09 17:51:49 +0000902 }
Bill Wendling2f921f82009-05-15 09:23:25 +0000903 }
904 }
905 break;
906 case dwarf::DW_TAG_subroutine_type: {
907 // Add return type.
908 DIArray Elements = CTy.getTypeArray();
909 DIDescriptor RTy = Elements.getElement(0);
Devang Patel9ccfb642009-12-09 18:24:21 +0000910 addType(&Buffer, DIType(RTy.getNode()));
Bill Wendling2f921f82009-05-15 09:23:25 +0000911
912 // Add prototype flag.
Devang Patel930143b2009-11-21 02:48:08 +0000913 addUInt(&Buffer, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
Bill Wendling2f921f82009-05-15 09:23:25 +0000914
915 // Add arguments.
916 for (unsigned i = 1, N = Elements.getNumElements(); i < N; ++i) {
917 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
918 DIDescriptor Ty = Elements.getElement(i);
Devang Patel9ccfb642009-12-09 18:24:21 +0000919 addType(Arg, DIType(Ty.getNode()));
Devang Patel930143b2009-11-21 02:48:08 +0000920 Buffer.addChild(Arg);
Bill Wendling2f921f82009-05-15 09:23:25 +0000921 }
922 }
923 break;
924 case dwarf::DW_TAG_structure_type:
925 case dwarf::DW_TAG_union_type:
926 case dwarf::DW_TAG_class_type: {
927 // Add elements to structure type.
928 DIArray Elements = CTy.getTypeArray();
929
930 // A forward struct declared type may not have elements available.
931 if (Elements.isNull())
932 break;
933
934 // Add elements to structure type.
935 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
936 DIDescriptor Element = Elements.getElement(i);
Devang Patel80ae3492009-08-28 23:24:31 +0000937 if (Element.isNull())
938 continue;
Bill Wendling2f921f82009-05-15 09:23:25 +0000939 DIE *ElemDie = NULL;
940 if (Element.getTag() == dwarf::DW_TAG_subprogram)
Devang Patel525dda02009-12-14 16:18:45 +0000941 ElemDie = createSubprogramDIE(DISubprogram(Element.getNode()));
Devang Patel160c92d2010-01-30 01:08:30 +0000942 else if (Element.getTag() == dwarf::DW_TAG_auto_variable) {
943 DIVariable DV(Element.getNode());
944 ElemDie = new DIE(dwarf::DW_TAG_variable);
945 addString(ElemDie, dwarf::DW_AT_name, dwarf::DW_FORM_string,
946 DV.getName());
947 addType(ElemDie, DV.getType());
948 addUInt(ElemDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
949 addUInt(ElemDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
950 addSourceLine(ElemDie, &DV);
951 } else
Devang Patel9ccfb642009-12-09 18:24:21 +0000952 ElemDie = createMemberDIE(DIDerivedType(Element.getNode()));
Devang Patel930143b2009-11-21 02:48:08 +0000953 Buffer.addChild(ElemDie);
Bill Wendling2f921f82009-05-15 09:23:25 +0000954 }
955
Devang Patel3082c012009-08-27 23:51:51 +0000956 if (CTy.isAppleBlockExtension())
Devang Patel930143b2009-11-21 02:48:08 +0000957 addUInt(&Buffer, dwarf::DW_AT_APPLE_block, dwarf::DW_FORM_flag, 1);
Bill Wendling2f921f82009-05-15 09:23:25 +0000958
959 unsigned RLang = CTy.getRunTimeLang();
960 if (RLang)
Devang Patel930143b2009-11-21 02:48:08 +0000961 addUInt(&Buffer, dwarf::DW_AT_APPLE_runtime_class,
Bill Wendling2f921f82009-05-15 09:23:25 +0000962 dwarf::DW_FORM_data1, RLang);
Devang Patel303a1be2010-01-26 21:16:06 +0000963
964 DICompositeType ContainingType = CTy.getContainingType();
965 if (!ContainingType.isNull())
966 addDIEEntry(&Buffer, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4,
967 getOrCreateTypeDIE(DIType(ContainingType.getNode())));
Bill Wendling2f921f82009-05-15 09:23:25 +0000968 break;
969 }
970 default:
971 break;
972 }
973
974 // Add name if not anonymous or intermediate type.
Devang Patel2d9caf92009-11-25 17:36:49 +0000975 if (!Name.empty())
Devang Patel930143b2009-11-21 02:48:08 +0000976 addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
Bill Wendling2f921f82009-05-15 09:23:25 +0000977
Devang Patelaedd6f52010-01-29 18:34:58 +0000978 if (Tag == dwarf::DW_TAG_enumeration_type || Tag == dwarf::DW_TAG_class_type ||
Bill Wendling2f921f82009-05-15 09:23:25 +0000979 Tag == dwarf::DW_TAG_structure_type || Tag == dwarf::DW_TAG_union_type) {
980 // Add size if non-zero (derived types might be zero-sized.)
981 if (Size)
Devang Patel930143b2009-11-21 02:48:08 +0000982 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
Bill Wendling2f921f82009-05-15 09:23:25 +0000983 else {
984 // Add zero size if it is not a forward declaration.
985 if (CTy.isForwardDecl())
Devang Patel930143b2009-11-21 02:48:08 +0000986 addUInt(&Buffer, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
Bill Wendling2f921f82009-05-15 09:23:25 +0000987 else
Devang Patel930143b2009-11-21 02:48:08 +0000988 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, 0);
Bill Wendling2f921f82009-05-15 09:23:25 +0000989 }
990
991 // Add source line info if available.
992 if (!CTy.isForwardDecl())
Devang Patel930143b2009-11-21 02:48:08 +0000993 addSourceLine(&Buffer, &CTy);
Bill Wendling2f921f82009-05-15 09:23:25 +0000994 }
995}
996
Devang Patel930143b2009-11-21 02:48:08 +0000997/// constructSubrangeDIE - Construct subrange DIE from DISubrange.
998void DwarfDebug::constructSubrangeDIE(DIE &Buffer, DISubrange SR, DIE *IndexTy){
Bill Wendling2f921f82009-05-15 09:23:25 +0000999 int64_t L = SR.getLo();
1000 int64_t H = SR.getHi();
1001 DIE *DW_Subrange = new DIE(dwarf::DW_TAG_subrange_type);
1002
Devang Patel930143b2009-11-21 02:48:08 +00001003 addDIEEntry(DW_Subrange, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IndexTy);
Devang Patelf691df32009-08-14 20:59:16 +00001004 if (L)
Devang Patel930143b2009-11-21 02:48:08 +00001005 addSInt(DW_Subrange, dwarf::DW_AT_lower_bound, 0, L);
Devang Patel8f046022009-12-04 23:10:24 +00001006 addSInt(DW_Subrange, dwarf::DW_AT_upper_bound, 0, H);
Bill Wendling2f921f82009-05-15 09:23:25 +00001007
Devang Patel930143b2009-11-21 02:48:08 +00001008 Buffer.addChild(DW_Subrange);
Bill Wendling2f921f82009-05-15 09:23:25 +00001009}
1010
Devang Patel930143b2009-11-21 02:48:08 +00001011/// constructArrayTypeDIE - Construct array type DIE from DICompositeType.
Devang Patel9ccfb642009-12-09 18:24:21 +00001012void DwarfDebug::constructArrayTypeDIE(DIE &Buffer,
Bill Wendling2f921f82009-05-15 09:23:25 +00001013 DICompositeType *CTy) {
1014 Buffer.setTag(dwarf::DW_TAG_array_type);
1015 if (CTy->getTag() == dwarf::DW_TAG_vector_type)
Devang Patel930143b2009-11-21 02:48:08 +00001016 addUInt(&Buffer, dwarf::DW_AT_GNU_vector, dwarf::DW_FORM_flag, 1);
Bill Wendling2f921f82009-05-15 09:23:25 +00001017
1018 // Emit derived type.
Devang Patel9ccfb642009-12-09 18:24:21 +00001019 addType(&Buffer, CTy->getTypeDerivedFrom());
Bill Wendling2f921f82009-05-15 09:23:25 +00001020 DIArray Elements = CTy->getTypeArray();
1021
Devang Patel92e8c652009-11-21 00:31:03 +00001022 // Get an anonymous type for index type.
Devang Patel9ccfb642009-12-09 18:24:21 +00001023 DIE *IdxTy = ModuleCU->getIndexTyDie();
Devang Patel92e8c652009-11-21 00:31:03 +00001024 if (!IdxTy) {
1025 // Construct an anonymous type for index type.
1026 IdxTy = new DIE(dwarf::DW_TAG_base_type);
Devang Patel930143b2009-11-21 02:48:08 +00001027 addUInt(IdxTy, dwarf::DW_AT_byte_size, 0, sizeof(int32_t));
1028 addUInt(IdxTy, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
Devang Patel92e8c652009-11-21 00:31:03 +00001029 dwarf::DW_ATE_signed);
Devang Patel9ccfb642009-12-09 18:24:21 +00001030 ModuleCU->addDie(IdxTy);
1031 ModuleCU->setIndexTyDie(IdxTy);
Devang Patel92e8c652009-11-21 00:31:03 +00001032 }
Bill Wendling2f921f82009-05-15 09:23:25 +00001033
1034 // Add subranges to array type.
1035 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1036 DIDescriptor Element = Elements.getElement(i);
1037 if (Element.getTag() == dwarf::DW_TAG_subrange_type)
Devang Patel930143b2009-11-21 02:48:08 +00001038 constructSubrangeDIE(Buffer, DISubrange(Element.getNode()), IdxTy);
Bill Wendling2f921f82009-05-15 09:23:25 +00001039 }
1040}
1041
Devang Patel930143b2009-11-21 02:48:08 +00001042/// constructEnumTypeDIE - Construct enum type DIE from DIEnumerator.
Devang Patel9ccfb642009-12-09 18:24:21 +00001043DIE *DwarfDebug::constructEnumTypeDIE(DIEnumerator *ETy) {
Bill Wendling2f921f82009-05-15 09:23:25 +00001044 DIE *Enumerator = new DIE(dwarf::DW_TAG_enumerator);
Devang Patel2d9caf92009-11-25 17:36:49 +00001045 StringRef Name = ETy->getName();
Devang Patel930143b2009-11-21 02:48:08 +00001046 addString(Enumerator, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
Bill Wendling2f921f82009-05-15 09:23:25 +00001047 int64_t Value = ETy->getEnumValue();
Devang Patel930143b2009-11-21 02:48:08 +00001048 addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, Value);
Bill Wendling2f921f82009-05-15 09:23:25 +00001049 return Enumerator;
1050}
1051
Devang Patel43ef34d2010-01-05 01:46:14 +00001052/// getRealLinkageName - If special LLVM prefix that is used to inform the asm
1053/// printer to not emit usual symbol prefix before the symbol name is used then
1054/// return linkage name after skipping this special LLVM prefix.
1055static StringRef getRealLinkageName(StringRef LinkageName) {
1056 char One = '\1';
1057 if (LinkageName.startswith(StringRef(&One, 1)))
1058 return LinkageName.substr(1);
1059 return LinkageName;
1060}
1061
Devang Patel930143b2009-11-21 02:48:08 +00001062/// createGlobalVariableDIE - Create new DIE using GV.
Devang Patel9ccfb642009-12-09 18:24:21 +00001063DIE *DwarfDebug::createGlobalVariableDIE(const DIGlobalVariable &GV) {
Jim Grosbach00e9c612009-11-22 19:20:36 +00001064 // If the global variable was optmized out then no need to create debug info
1065 // entry.
Devang Patelcc11371b2009-11-06 17:58:12 +00001066 if (!GV.getGlobal()) return NULL;
Devang Patel2d9caf92009-11-25 17:36:49 +00001067 if (GV.getDisplayName().empty()) return NULL;
Devang Patel06ce6502009-11-06 01:30:04 +00001068
Bill Wendling2f921f82009-05-15 09:23:25 +00001069 DIE *GVDie = new DIE(dwarf::DW_TAG_variable);
Jim Grosbach042483e2009-11-21 23:12:12 +00001070 addString(GVDie, dwarf::DW_AT_name, dwarf::DW_FORM_string,
Devang Patelb2969422009-09-29 18:40:58 +00001071 GV.getDisplayName());
1072
Devang Patel2d9caf92009-11-25 17:36:49 +00001073 StringRef LinkageName = GV.getLinkageName();
Devang Patel43ef34d2010-01-05 01:46:14 +00001074 if (!LinkageName.empty())
Devang Patel930143b2009-11-21 02:48:08 +00001075 addString(GVDie, dwarf::DW_AT_MIPS_linkage_name, dwarf::DW_FORM_string,
Devang Patel43ef34d2010-01-05 01:46:14 +00001076 getRealLinkageName(LinkageName));
1077
Devang Patel9ccfb642009-12-09 18:24:21 +00001078 addType(GVDie, GV.getType());
Bill Wendling2f921f82009-05-15 09:23:25 +00001079 if (!GV.isLocalToUnit())
Devang Patel930143b2009-11-21 02:48:08 +00001080 addUInt(GVDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
1081 addSourceLine(GVDie, &GV);
Devang Patel4144a822009-10-05 23:22:08 +00001082
Bill Wendling2f921f82009-05-15 09:23:25 +00001083 return GVDie;
1084}
1085
Devang Patel930143b2009-11-21 02:48:08 +00001086/// createMemberDIE - Create new member DIE.
Devang Patel9ccfb642009-12-09 18:24:21 +00001087DIE *DwarfDebug::createMemberDIE(const DIDerivedType &DT) {
Bill Wendling2f921f82009-05-15 09:23:25 +00001088 DIE *MemberDie = new DIE(DT.getTag());
Devang Patel2d9caf92009-11-25 17:36:49 +00001089 StringRef Name = DT.getName();
1090 if (!Name.empty())
Devang Patel930143b2009-11-21 02:48:08 +00001091 addString(MemberDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
Devang Patel2d9caf92009-11-25 17:36:49 +00001092
Devang Patel9ccfb642009-12-09 18:24:21 +00001093 addType(MemberDie, DT.getTypeDerivedFrom());
Bill Wendling2f921f82009-05-15 09:23:25 +00001094
Devang Patel930143b2009-11-21 02:48:08 +00001095 addSourceLine(MemberDie, &DT);
Bill Wendling2f921f82009-05-15 09:23:25 +00001096
Devang Patel67f56f02009-11-04 22:06:12 +00001097 DIEBlock *MemLocationDie = new DIEBlock();
Devang Patel930143b2009-11-21 02:48:08 +00001098 addUInt(MemLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
Devang Patel67f56f02009-11-04 22:06:12 +00001099
Bill Wendling2f921f82009-05-15 09:23:25 +00001100 uint64_t Size = DT.getSizeInBits();
Devang Patelf05d5722009-11-04 23:48:00 +00001101 uint64_t FieldSize = DT.getOriginalTypeSize();
Bill Wendling2f921f82009-05-15 09:23:25 +00001102
1103 if (Size != FieldSize) {
1104 // Handle bitfield.
Devang Patel930143b2009-11-21 02:48:08 +00001105 addUInt(MemberDie, dwarf::DW_AT_byte_size, 0, DT.getOriginalTypeSize()>>3);
1106 addUInt(MemberDie, dwarf::DW_AT_bit_size, 0, DT.getSizeInBits());
Bill Wendling2f921f82009-05-15 09:23:25 +00001107
1108 uint64_t Offset = DT.getOffsetInBits();
Bill Wendling2f921f82009-05-15 09:23:25 +00001109 uint64_t AlignMask = ~(DT.getAlignInBits() - 1);
1110 uint64_t HiMark = (Offset + FieldSize) & AlignMask;
Benjamin Kramer2b459982010-01-07 17:50:57 +00001111 uint64_t FieldOffset = (HiMark - FieldSize);
Bill Wendling2f921f82009-05-15 09:23:25 +00001112 Offset -= FieldOffset;
1113
1114 // Maybe we need to work from the other end.
1115 if (TD->isLittleEndian()) Offset = FieldSize - (Offset + Size);
Devang Patel930143b2009-11-21 02:48:08 +00001116 addUInt(MemberDie, dwarf::DW_AT_bit_offset, 0, Offset);
Bill Wendling2f921f82009-05-15 09:23:25 +00001117
Devang Patel67f56f02009-11-04 22:06:12 +00001118 // Here WD_AT_data_member_location points to the anonymous
1119 // field that includes this bit field.
Devang Patel930143b2009-11-21 02:48:08 +00001120 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, FieldOffset >> 3);
Devang Patel67f56f02009-11-04 22:06:12 +00001121
1122 } else
1123 // This is not a bitfield.
Devang Patel930143b2009-11-21 02:48:08 +00001124 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits() >> 3);
Devang Patel67f56f02009-11-04 22:06:12 +00001125
Devang Patel930143b2009-11-21 02:48:08 +00001126 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, MemLocationDie);
Bill Wendling2f921f82009-05-15 09:23:25 +00001127
1128 if (DT.isProtected())
Devang Pateleb57c592009-12-03 19:11:07 +00001129 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
Bill Wendling2f921f82009-05-15 09:23:25 +00001130 dwarf::DW_ACCESS_protected);
1131 else if (DT.isPrivate())
Devang Pateleb57c592009-12-03 19:11:07 +00001132 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
Bill Wendling2f921f82009-05-15 09:23:25 +00001133 dwarf::DW_ACCESS_private);
Devang Pateleb57c592009-12-03 19:11:07 +00001134 else if (DT.getTag() == dwarf::DW_TAG_inheritance)
1135 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1136 dwarf::DW_ACCESS_public);
1137 if (DT.isVirtual())
1138 addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_flag,
1139 dwarf::DW_VIRTUALITY_virtual);
Bill Wendling2f921f82009-05-15 09:23:25 +00001140 return MemberDie;
1141}
1142
Devang Patel525dda02009-12-14 16:18:45 +00001143/// createSubprogramDIE - Create new DIE using SP.
1144DIE *DwarfDebug::createSubprogramDIE(const DISubprogram &SP, bool MakeDecl) {
1145 DIE *SPDie = ModuleCU->getDIE(SP.getNode());
1146 if (SPDie)
1147 return SPDie;
1148
1149 SPDie = new DIE(dwarf::DW_TAG_subprogram);
Devang Patel2d9caf92009-11-25 17:36:49 +00001150 addString(SPDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, SP.getName());
Bill Wendling2f921f82009-05-15 09:23:25 +00001151
Devang Patel2d9caf92009-11-25 17:36:49 +00001152 StringRef LinkageName = SP.getLinkageName();
Devang Patel43ef34d2010-01-05 01:46:14 +00001153 if (!LinkageName.empty())
Devang Patel930143b2009-11-21 02:48:08 +00001154 addString(SPDie, dwarf::DW_AT_MIPS_linkage_name, dwarf::DW_FORM_string,
Devang Patel43ef34d2010-01-05 01:46:14 +00001155 getRealLinkageName(LinkageName));
1156
Devang Patel930143b2009-11-21 02:48:08 +00001157 addSourceLine(SPDie, &SP);
Bill Wendling2f921f82009-05-15 09:23:25 +00001158
Bill Wendling2f921f82009-05-15 09:23:25 +00001159 // Add prototyped tag, if C or ObjC.
1160 unsigned Lang = SP.getCompileUnit().getLanguage();
1161 if (Lang == dwarf::DW_LANG_C99 || Lang == dwarf::DW_LANG_C89 ||
1162 Lang == dwarf::DW_LANG_ObjC)
Devang Patel930143b2009-11-21 02:48:08 +00001163 addUInt(SPDie, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
Bill Wendling2f921f82009-05-15 09:23:25 +00001164
1165 // Add Return Type.
Devang Patel236526d2009-12-03 01:25:38 +00001166 DICompositeType SPTy = SP.getType();
1167 DIArray Args = SPTy.getTypeArray();
Bill Wendling2f921f82009-05-15 09:23:25 +00001168 unsigned SPTag = SPTy.getTag();
Devang Pateleb57c592009-12-03 19:11:07 +00001169
Devang Patel236526d2009-12-03 01:25:38 +00001170 if (Args.isNull() || SPTag != dwarf::DW_TAG_subroutine_type)
Devang Patel9ccfb642009-12-09 18:24:21 +00001171 addType(SPDie, SPTy);
Devang Patel236526d2009-12-03 01:25:38 +00001172 else
Devang Patel9ccfb642009-12-09 18:24:21 +00001173 addType(SPDie, DIType(Args.getElement(0).getNode()));
Devang Patel236526d2009-12-03 01:25:38 +00001174
Devang Pateleb57c592009-12-03 19:11:07 +00001175 unsigned VK = SP.getVirtuality();
1176 if (VK) {
1177 addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_flag, VK);
1178 DIEBlock *Block = new DIEBlock();
1179 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1180 addUInt(Block, 0, dwarf::DW_FORM_data1, SP.getVirtualIndex());
1181 addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, 0, Block);
Devang Patel018b29b2010-01-19 06:19:05 +00001182 ContainingTypeMap.insert(std::make_pair(SPDie,
1183 SP.getContainingType().getNode()));
Devang Pateleb57c592009-12-03 19:11:07 +00001184 }
1185
Devang Patel525dda02009-12-14 16:18:45 +00001186 if (MakeDecl || !SP.isDefinition()) {
Devang Patel930143b2009-11-21 02:48:08 +00001187 addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
Bill Wendling2f921f82009-05-15 09:23:25 +00001188
1189 // Add arguments. Do not add arguments for subprogram definition. They will
Devang Patel236526d2009-12-03 01:25:38 +00001190 // be handled while processing variables.
1191 DICompositeType SPTy = SP.getType();
1192 DIArray Args = SPTy.getTypeArray();
1193 unsigned SPTag = SPTy.getTag();
1194
Bill Wendling2f921f82009-05-15 09:23:25 +00001195 if (SPTag == dwarf::DW_TAG_subroutine_type)
1196 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
1197 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
Devang Patel9ccfb642009-12-09 18:24:21 +00001198 addType(Arg, DIType(Args.getElement(i).getNode()));
Devang Patel930143b2009-11-21 02:48:08 +00001199 addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1); // ??
1200 SPDie->addChild(Arg);
Bill Wendling2f921f82009-05-15 09:23:25 +00001201 }
1202 }
1203
Bill Wendling2f921f82009-05-15 09:23:25 +00001204 // DW_TAG_inlined_subroutine may refer to this DIE.
Devang Patel9ccfb642009-12-09 18:24:21 +00001205 ModuleCU->insertDIE(SP.getNode(), SPDie);
Bill Wendling2f921f82009-05-15 09:23:25 +00001206 return SPDie;
1207}
1208
Devang Patel930143b2009-11-21 02:48:08 +00001209/// findCompileUnit - Get the compile unit for the given descriptor.
Bill Wendling2f921f82009-05-15 09:23:25 +00001210///
Devang Patelb314bd62009-12-11 21:37:07 +00001211CompileUnit *DwarfDebug::findCompileUnit(DICompileUnit Unit) {
Bill Wendling2f921f82009-05-15 09:23:25 +00001212 DenseMap<Value *, CompileUnit *>::const_iterator I =
Devang Patel80ae3492009-08-28 23:24:31 +00001213 CompileUnitMap.find(Unit.getNode());
Devang Patelb314bd62009-12-11 21:37:07 +00001214 if (I == CompileUnitMap.end())
1215 return constructCompileUnit(Unit.getNode());
1216 return I->second;
Bill Wendling2f921f82009-05-15 09:23:25 +00001217}
1218
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001219/// getUpdatedDbgScope - Find or create DbgScope assicated with the instruction.
1220/// Initialize scope and update scope hierarchy.
1221DbgScope *DwarfDebug::getUpdatedDbgScope(MDNode *N, const MachineInstr *MI,
1222 MDNode *InlinedAt) {
1223 assert (N && "Invalid Scope encoding!");
1224 assert (MI && "Missing machine instruction!");
1225 bool GetConcreteScope = (MI && InlinedAt);
1226
1227 DbgScope *NScope = NULL;
1228
1229 if (InlinedAt)
1230 NScope = DbgScopeMap.lookup(InlinedAt);
1231 else
1232 NScope = DbgScopeMap.lookup(N);
1233 assert (NScope && "Unable to find working scope!");
1234
1235 if (NScope->getFirstInsn())
1236 return NScope;
Devang Patel75cc16c2009-10-01 20:31:14 +00001237
1238 DbgScope *Parent = NULL;
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001239 if (GetConcreteScope) {
Devang Patel6875c5eb2009-10-14 21:08:09 +00001240 DILocation IL(InlinedAt);
Jim Grosbach042483e2009-11-21 23:12:12 +00001241 Parent = getUpdatedDbgScope(IL.getScope().getNode(), MI,
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001242 IL.getOrigLocation().getNode());
1243 assert (Parent && "Unable to find Parent scope!");
1244 NScope->setParent(Parent);
Devang Patel930143b2009-11-21 02:48:08 +00001245 Parent->addScope(NScope);
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001246 } else if (DIDescriptor(N).isLexicalBlock()) {
1247 DILexicalBlock DB(N);
1248 if (!DB.getContext().isNull()) {
1249 Parent = getUpdatedDbgScope(DB.getContext().getNode(), MI, InlinedAt);
1250 NScope->setParent(Parent);
Devang Patel930143b2009-11-21 02:48:08 +00001251 Parent->addScope(NScope);
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001252 }
Devang Patel6875c5eb2009-10-14 21:08:09 +00001253 }
Devang Patel75cc16c2009-10-01 20:31:14 +00001254
Devang Patelcfeaa482009-10-27 20:47:17 +00001255 NScope->setFirstInsn(MI);
Devang Patel75cc16c2009-10-01 20:31:14 +00001256
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001257 if (!Parent && !InlinedAt) {
Devang Patel78319c62009-11-11 00:31:36 +00001258 StringRef SPName = DISubprogram(N).getLinkageName();
1259 if (SPName == MF->getFunction()->getName())
1260 CurrentFnDbgScope = NScope;
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001261 }
Devang Patel75cc16c2009-10-01 20:31:14 +00001262
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001263 if (GetConcreteScope) {
1264 ConcreteScopes[InlinedAt] = NScope;
1265 getOrCreateAbstractScope(N);
1266 }
1267
Devang Patelcfeaa482009-10-27 20:47:17 +00001268 return NScope;
Devang Patel75cc16c2009-10-01 20:31:14 +00001269}
1270
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001271DbgScope *DwarfDebug::getOrCreateAbstractScope(MDNode *N) {
1272 assert (N && "Invalid Scope encoding!");
1273
1274 DbgScope *AScope = AbstractScopes.lookup(N);
1275 if (AScope)
1276 return AScope;
Jim Grosbach042483e2009-11-21 23:12:12 +00001277
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001278 DbgScope *Parent = NULL;
1279
1280 DIDescriptor Scope(N);
1281 if (Scope.isLexicalBlock()) {
1282 DILexicalBlock DB(N);
1283 DIDescriptor ParentDesc = DB.getContext();
1284 if (!ParentDesc.isNull())
1285 Parent = getOrCreateAbstractScope(ParentDesc.getNode());
1286 }
1287
1288 AScope = new DbgScope(Parent, DIDescriptor(N), NULL);
1289
1290 if (Parent)
Devang Patel930143b2009-11-21 02:48:08 +00001291 Parent->addScope(AScope);
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001292 AScope->setAbstractScope();
1293 AbstractScopes[N] = AScope;
1294 if (DIDescriptor(N).isSubprogram())
1295 AbstractScopesList.push_back(AScope);
1296 return AScope;
1297}
Devang Patel75cc16c2009-10-01 20:31:14 +00001298
Jim Grosbach042483e2009-11-21 23:12:12 +00001299/// updateSubprogramScopeDIE - Find DIE for the given subprogram and
Devang Patel930143b2009-11-21 02:48:08 +00001300/// attach appropriate DW_AT_low_pc and DW_AT_high_pc attributes.
1301/// If there are global variables in this scope then create and insert
1302/// DIEs for these variables.
1303DIE *DwarfDebug::updateSubprogramScopeDIE(MDNode *SPNode) {
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001304
Devang Patele064ad42009-11-20 21:37:22 +00001305 DIE *SPDie = ModuleCU->getDIE(SPNode);
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001306 assert (SPDie && "Unable to find subprogram DIE!");
Devang Patel525dda02009-12-14 16:18:45 +00001307 DISubprogram SP(SPNode);
1308 if (SP.isDefinition() && !SP.getContext().isCompileUnit()) {
1309 addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1310 // Add arguments.
1311 DICompositeType SPTy = SP.getType();
1312 DIArray Args = SPTy.getTypeArray();
1313 unsigned SPTag = SPTy.getTag();
1314 if (SPTag == dwarf::DW_TAG_subroutine_type)
1315 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
1316 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1317 addType(Arg, DIType(Args.getElement(i).getNode()));
1318 addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1); // ??
1319 SPDie->addChild(Arg);
1320 }
1321 DIE *SPDeclDie = SPDie;
1322 SPDie = new DIE(dwarf::DW_TAG_subprogram);
1323 addDIEEntry(SPDie, dwarf::DW_AT_specification, dwarf::DW_FORM_ref4,
1324 SPDeclDie);
Devang Patel525dda02009-12-14 16:18:45 +00001325 ModuleCU->addDie(SPDie);
1326 }
1327
Devang Patel930143b2009-11-21 02:48:08 +00001328 addLabel(SPDie, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001329 DWLabel("func_begin", SubprogramCount));
Devang Patel930143b2009-11-21 02:48:08 +00001330 addLabel(SPDie, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001331 DWLabel("func_end", SubprogramCount));
1332 MachineLocation Location(RI->getFrameRegister(*MF));
Devang Patel930143b2009-11-21 02:48:08 +00001333 addAddress(SPDie, dwarf::DW_AT_frame_base, Location);
Jim Grosbach042483e2009-11-21 23:12:12 +00001334
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001335 if (!DISubprogram(SPNode).isLocalToUnit())
Devang Patel930143b2009-11-21 02:48:08 +00001336 addUInt(SPDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001337
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001338 return SPDie;
1339}
1340
Jim Grosbach042483e2009-11-21 23:12:12 +00001341/// constructLexicalScope - Construct new DW_TAG_lexical_block
Devang Patel930143b2009-11-21 02:48:08 +00001342/// for this scope and attach DW_AT_low_pc/DW_AT_high_pc labels.
1343DIE *DwarfDebug::constructLexicalScopeDIE(DbgScope *Scope) {
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001344 unsigned StartID = MMI->MappedLabel(Scope->getStartLabelID());
1345 unsigned EndID = MMI->MappedLabel(Scope->getEndLabelID());
1346
1347 // Ignore empty scopes.
1348 if (StartID == EndID && StartID != 0)
1349 return NULL;
1350
1351 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_lexical_block);
1352 if (Scope->isAbstractScope())
1353 return ScopeDIE;
1354
Devang Patel930143b2009-11-21 02:48:08 +00001355 addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
Jim Grosbach042483e2009-11-21 23:12:12 +00001356 StartID ?
1357 DWLabel("label", StartID)
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001358 : DWLabel("func_begin", SubprogramCount));
Devang Patel930143b2009-11-21 02:48:08 +00001359 addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
Jim Grosbach042483e2009-11-21 23:12:12 +00001360 EndID ?
1361 DWLabel("label", EndID)
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001362 : DWLabel("func_end", SubprogramCount));
1363
1364
1365
1366 return ScopeDIE;
1367}
1368
Devang Patel930143b2009-11-21 02:48:08 +00001369/// constructInlinedScopeDIE - This scope represents inlined body of
1370/// a function. Construct DIE to represent this concrete inlined copy
1371/// of the function.
1372DIE *DwarfDebug::constructInlinedScopeDIE(DbgScope *Scope) {
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001373 unsigned StartID = MMI->MappedLabel(Scope->getStartLabelID());
1374 unsigned EndID = MMI->MappedLabel(Scope->getEndLabelID());
1375 assert (StartID && "Invalid starting label for an inlined scope!");
1376 assert (EndID && "Invalid end label for an inlined scope!");
1377 // Ignore empty scopes.
1378 if (StartID == EndID && StartID != 0)
1379 return NULL;
1380
1381 DIScope DS(Scope->getScopeNode());
1382 if (DS.isNull())
1383 return NULL;
1384 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_inlined_subroutine);
1385
1386 DISubprogram InlinedSP = getDISubprogram(DS.getNode());
Devang Patele064ad42009-11-20 21:37:22 +00001387 DIE *OriginDIE = ModuleCU->getDIE(InlinedSP.getNode());
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001388 assert (OriginDIE && "Unable to find Origin DIE!");
Devang Patel930143b2009-11-21 02:48:08 +00001389 addDIEEntry(ScopeDIE, dwarf::DW_AT_abstract_origin,
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001390 dwarf::DW_FORM_ref4, OriginDIE);
1391
Devang Patel930143b2009-11-21 02:48:08 +00001392 addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001393 DWLabel("label", StartID));
Devang Patel930143b2009-11-21 02:48:08 +00001394 addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001395 DWLabel("label", EndID));
1396
1397 InlinedSubprogramDIEs.insert(OriginDIE);
1398
1399 // Track the start label for this inlined function.
Devang Patel018b29b2010-01-19 06:19:05 +00001400 DenseMap<MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001401 I = InlineInfo.find(InlinedSP.getNode());
1402
1403 if (I == InlineInfo.end()) {
Jim Grosbach00e9c612009-11-22 19:20:36 +00001404 InlineInfo[InlinedSP.getNode()].push_back(std::make_pair(StartID,
1405 ScopeDIE));
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001406 InlinedSPNodes.push_back(InlinedSP.getNode());
1407 } else
1408 I->second.push_back(std::make_pair(StartID, ScopeDIE));
1409
1410 StringPool.insert(InlinedSP.getName());
Devang Patel43ef34d2010-01-05 01:46:14 +00001411 StringPool.insert(getRealLinkageName(InlinedSP.getLinkageName()));
1412
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001413 DILocation DL(Scope->getInlinedAt());
Devang Patel930143b2009-11-21 02:48:08 +00001414 addUInt(ScopeDIE, dwarf::DW_AT_call_file, 0, ModuleCU->getID());
1415 addUInt(ScopeDIE, dwarf::DW_AT_call_line, 0, DL.getLineNumber());
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001416
1417 return ScopeDIE;
1418}
1419
Devang Patel930143b2009-11-21 02:48:08 +00001420
1421/// constructVariableDIE - Construct a DIE for the given DbgVariable.
Devang Patel9ccfb642009-12-09 18:24:21 +00001422DIE *DwarfDebug::constructVariableDIE(DbgVariable *DV, DbgScope *Scope) {
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001423 // Get the descriptor.
1424 const DIVariable &VD = DV->getVariable();
Devang Patel2d9caf92009-11-25 17:36:49 +00001425 StringRef Name = VD.getName();
1426 if (Name.empty())
Devang Patel97f99fa2009-11-13 02:25:26 +00001427 return NULL;
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001428
1429 // Translate tag to proper Dwarf tag. The result variable is dropped for
1430 // now.
1431 unsigned Tag;
1432 switch (VD.getTag()) {
1433 case dwarf::DW_TAG_return_variable:
1434 return NULL;
1435 case dwarf::DW_TAG_arg_variable:
1436 Tag = dwarf::DW_TAG_formal_parameter;
1437 break;
1438 case dwarf::DW_TAG_auto_variable: // fall thru
1439 default:
1440 Tag = dwarf::DW_TAG_variable;
1441 break;
1442 }
1443
1444 // Define variable debug information entry.
1445 DIE *VariableDie = new DIE(Tag);
1446
1447
1448 DIE *AbsDIE = NULL;
1449 if (DbgVariable *AV = DV->getAbstractVariable())
1450 AbsDIE = AV->getDIE();
Jim Grosbach042483e2009-11-21 23:12:12 +00001451
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001452 if (AbsDIE) {
1453 DIScope DS(Scope->getScopeNode());
1454 DISubprogram InlinedSP = getDISubprogram(DS.getNode());
Devang Patele064ad42009-11-20 21:37:22 +00001455 DIE *OriginSPDIE = ModuleCU->getDIE(InlinedSP.getNode());
Daniel Dunbar75b4d352009-11-11 03:09:50 +00001456 (void) OriginSPDIE;
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001457 assert (OriginSPDIE && "Unable to find Origin DIE for the SP!");
1458 DIE *AbsDIE = DV->getAbstractVariable()->getDIE();
1459 assert (AbsDIE && "Unable to find Origin DIE for the Variable!");
Devang Patel930143b2009-11-21 02:48:08 +00001460 addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin,
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001461 dwarf::DW_FORM_ref4, AbsDIE);
1462 }
1463 else {
Devang Patel930143b2009-11-21 02:48:08 +00001464 addString(VariableDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1465 addSourceLine(VariableDie, &VD);
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001466
1467 // Add variable type.
Jim Grosbach042483e2009-11-21 23:12:12 +00001468 // FIXME: isBlockByrefVariable should be reformulated in terms of complex
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001469 // addresses instead.
1470 if (VD.isBlockByrefVariable())
Devang Patel9ccfb642009-12-09 18:24:21 +00001471 addType(VariableDie, getBlockByrefType(VD.getType(), Name));
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001472 else
Devang Patel9ccfb642009-12-09 18:24:21 +00001473 addType(VariableDie, VD.getType());
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001474 }
1475
1476 // Add variable address.
1477 if (!Scope->isAbstractScope()) {
1478 MachineLocation Location;
Jim Grosbachbf6d3582009-11-22 20:14:00 +00001479 unsigned FrameReg;
1480 int Offset = RI->getFrameIndexReference(*MF, DV->getFrameIndex(), FrameReg);
1481 Location.set(FrameReg, Offset);
Jim Grosbach042483e2009-11-21 23:12:12 +00001482
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001483 if (VD.hasComplexAddress())
Devang Patel930143b2009-11-21 02:48:08 +00001484 addComplexAddress(DV, VariableDie, dwarf::DW_AT_location, Location);
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001485 else if (VD.isBlockByrefVariable())
Devang Patel930143b2009-11-21 02:48:08 +00001486 addBlockByrefAddress(DV, VariableDie, dwarf::DW_AT_location, Location);
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001487 else
Devang Patel930143b2009-11-21 02:48:08 +00001488 addAddress(VariableDie, dwarf::DW_AT_location, Location);
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001489 }
1490 DV->setDIE(VariableDie);
1491 return VariableDie;
1492
1493}
Devang Patel930143b2009-11-21 02:48:08 +00001494
Devang Patel04d2f2d2009-11-24 01:14:22 +00001495void DwarfDebug::addPubTypes(DISubprogram SP) {
1496 DICompositeType SPTy = SP.getType();
1497 unsigned SPTag = SPTy.getTag();
1498 if (SPTag != dwarf::DW_TAG_subroutine_type)
1499 return;
1500
1501 DIArray Args = SPTy.getTypeArray();
1502 if (Args.isNull())
1503 return;
1504
1505 for (unsigned i = 0, e = Args.getNumElements(); i != e; ++i) {
1506 DIType ATy(Args.getElement(i).getNode());
1507 if (ATy.isNull())
1508 continue;
1509 DICompositeType CATy = getDICompositeType(ATy);
Devang Patel2d9caf92009-11-25 17:36:49 +00001510 if (!CATy.isNull() && !CATy.getName().empty()) {
Devang Patel04d2f2d2009-11-24 01:14:22 +00001511 if (DIEEntry *Entry = ModuleCU->getDIEEntry(CATy.getNode()))
1512 ModuleCU->addGlobalType(CATy.getName(), Entry->getEntry());
1513 }
1514 }
1515}
1516
Devang Patel930143b2009-11-21 02:48:08 +00001517/// constructScopeDIE - Construct a DIE for this scope.
1518DIE *DwarfDebug::constructScopeDIE(DbgScope *Scope) {
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001519 if (!Scope)
1520 return NULL;
1521 DIScope DS(Scope->getScopeNode());
1522 if (DS.isNull())
1523 return NULL;
1524
1525 DIE *ScopeDIE = NULL;
1526 if (Scope->getInlinedAt())
Devang Patel930143b2009-11-21 02:48:08 +00001527 ScopeDIE = constructInlinedScopeDIE(Scope);
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001528 else if (DS.isSubprogram()) {
1529 if (Scope->isAbstractScope())
Devang Patele064ad42009-11-20 21:37:22 +00001530 ScopeDIE = ModuleCU->getDIE(DS.getNode());
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001531 else
Devang Patel930143b2009-11-21 02:48:08 +00001532 ScopeDIE = updateSubprogramScopeDIE(DS.getNode());
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001533 }
1534 else {
Devang Patel930143b2009-11-21 02:48:08 +00001535 ScopeDIE = constructLexicalScopeDIE(Scope);
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001536 if (!ScopeDIE) return NULL;
1537 }
1538
1539 // Add variables to scope.
1540 SmallVector<DbgVariable *, 8> &Variables = Scope->getVariables();
1541 for (unsigned i = 0, N = Variables.size(); i < N; ++i) {
Devang Patel9ccfb642009-12-09 18:24:21 +00001542 DIE *VariableDIE = constructVariableDIE(Variables[i], Scope);
Jim Grosbach042483e2009-11-21 23:12:12 +00001543 if (VariableDIE)
Devang Patel930143b2009-11-21 02:48:08 +00001544 ScopeDIE->addChild(VariableDIE);
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001545 }
1546
1547 // Add nested scopes.
1548 SmallVector<DbgScope *, 4> &Scopes = Scope->getScopes();
1549 for (unsigned j = 0, M = Scopes.size(); j < M; ++j) {
1550 // Define the Scope debug information entry.
Devang Patel930143b2009-11-21 02:48:08 +00001551 DIE *NestedDIE = constructScopeDIE(Scopes[j]);
Jim Grosbach042483e2009-11-21 23:12:12 +00001552 if (NestedDIE)
Devang Patel930143b2009-11-21 02:48:08 +00001553 ScopeDIE->addChild(NestedDIE);
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001554 }
Devang Patel04d2f2d2009-11-24 01:14:22 +00001555
1556 if (DS.isSubprogram())
1557 addPubTypes(DISubprogram(DS.getNode()));
1558
1559 return ScopeDIE;
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001560}
1561
Bill Wendling2b128d72009-05-20 23:19:06 +00001562/// GetOrCreateSourceID - Look up the source id with the given directory and
1563/// source file names. If none currently exists, create a new id and insert it
1564/// in the SourceIds map. This can update DirectoryNames and SourceFileNames
1565/// maps as well.
Devang Patel2d9caf92009-11-25 17:36:49 +00001566unsigned DwarfDebug::GetOrCreateSourceID(StringRef DirName, StringRef FileName) {
Bill Wendling2b128d72009-05-20 23:19:06 +00001567 unsigned DId;
1568 StringMap<unsigned>::iterator DI = DirectoryIdMap.find(DirName);
1569 if (DI != DirectoryIdMap.end()) {
1570 DId = DI->getValue();
1571 } else {
1572 DId = DirectoryNames.size() + 1;
1573 DirectoryIdMap[DirName] = DId;
1574 DirectoryNames.push_back(DirName);
1575 }
1576
1577 unsigned FId;
1578 StringMap<unsigned>::iterator FI = SourceFileIdMap.find(FileName);
1579 if (FI != SourceFileIdMap.end()) {
1580 FId = FI->getValue();
1581 } else {
1582 FId = SourceFileNames.size() + 1;
1583 SourceFileIdMap[FileName] = FId;
1584 SourceFileNames.push_back(FileName);
1585 }
1586
1587 DenseMap<std::pair<unsigned, unsigned>, unsigned>::iterator SI =
1588 SourceIdMap.find(std::make_pair(DId, FId));
1589 if (SI != SourceIdMap.end())
1590 return SI->second;
1591
1592 unsigned SrcId = SourceIds.size() + 1; // DW_AT_decl_file cannot be 0.
1593 SourceIdMap[std::make_pair(DId, FId)] = SrcId;
1594 SourceIds.push_back(std::make_pair(DId, FId));
1595
1596 return SrcId;
1597}
1598
Devang Patel1f4690c2009-12-15 19:16:48 +00001599/// getOrCreateNameSpace - Create a DIE for DINameSpace.
1600DIE *DwarfDebug::getOrCreateNameSpace(DINameSpace NS) {
1601 DIE *NDie = ModuleCU->getDIE(NS.getNode());
1602 if (NDie)
1603 return NDie;
1604 NDie = new DIE(dwarf::DW_TAG_namespace);
1605 ModuleCU->insertDIE(NS.getNode(), NDie);
1606 if (!NS.getName().empty())
1607 addString(NDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, NS.getName());
1608 addSourceLine(NDie, &NS);
1609 addToContextOwner(NDie, NS.getContext());
1610 return NDie;
1611}
1612
Devang Patelb314bd62009-12-11 21:37:07 +00001613CompileUnit *DwarfDebug::constructCompileUnit(MDNode *N) {
Devang Patel80ae3492009-08-28 23:24:31 +00001614 DICompileUnit DIUnit(N);
Devang Patel2d9caf92009-11-25 17:36:49 +00001615 StringRef FN = DIUnit.getFilename();
1616 StringRef Dir = DIUnit.getDirectory();
Devang Patelb2969422009-09-29 18:40:58 +00001617 unsigned ID = GetOrCreateSourceID(Dir, FN);
Bill Wendling2b128d72009-05-20 23:19:06 +00001618
1619 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
Devang Patel930143b2009-11-21 02:48:08 +00001620 addSectionOffset(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4,
Bill Wendling2b128d72009-05-20 23:19:06 +00001621 DWLabel("section_line", 0), DWLabel("section_line", 0),
1622 false);
Devang Patel930143b2009-11-21 02:48:08 +00001623 addString(Die, dwarf::DW_AT_producer, dwarf::DW_FORM_string,
Devang Patelb2969422009-09-29 18:40:58 +00001624 DIUnit.getProducer());
Devang Patel930143b2009-11-21 02:48:08 +00001625 addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data1,
Bill Wendling2b128d72009-05-20 23:19:06 +00001626 DIUnit.getLanguage());
Devang Patel930143b2009-11-21 02:48:08 +00001627 addString(Die, dwarf::DW_AT_name, dwarf::DW_FORM_string, FN);
Bill Wendling2b128d72009-05-20 23:19:06 +00001628
Devang Patel2d9caf92009-11-25 17:36:49 +00001629 if (!Dir.empty())
Devang Patel930143b2009-11-21 02:48:08 +00001630 addString(Die, dwarf::DW_AT_comp_dir, dwarf::DW_FORM_string, Dir);
Bill Wendling2b128d72009-05-20 23:19:06 +00001631 if (DIUnit.isOptimized())
Devang Patel930143b2009-11-21 02:48:08 +00001632 addUInt(Die, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1);
Bill Wendling2b128d72009-05-20 23:19:06 +00001633
Devang Patel2d9caf92009-11-25 17:36:49 +00001634 StringRef Flags = DIUnit.getFlags();
1635 if (!Flags.empty())
Devang Patel930143b2009-11-21 02:48:08 +00001636 addString(Die, dwarf::DW_AT_APPLE_flags, dwarf::DW_FORM_string, Flags);
Bill Wendling2b128d72009-05-20 23:19:06 +00001637
1638 unsigned RVer = DIUnit.getRunTimeVersion();
1639 if (RVer)
Devang Patel930143b2009-11-21 02:48:08 +00001640 addUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers,
Bill Wendling2b128d72009-05-20 23:19:06 +00001641 dwarf::DW_FORM_data1, RVer);
1642
1643 CompileUnit *Unit = new CompileUnit(ID, Die);
Devang Patel40d78412009-06-29 20:45:18 +00001644 if (!ModuleCU && DIUnit.isMain()) {
Devang Patel86353452009-06-29 20:38:13 +00001645 // Use first compile unit marked as isMain as the compile unit
1646 // for this module.
Devang Patel40d78412009-06-29 20:45:18 +00001647 ModuleCU = Unit;
Devang Patel86353452009-06-29 20:38:13 +00001648 }
Bill Wendling2b128d72009-05-20 23:19:06 +00001649
Devang Patel80ae3492009-08-28 23:24:31 +00001650 CompileUnitMap[DIUnit.getNode()] = Unit;
Bill Wendling2b128d72009-05-20 23:19:06 +00001651 CompileUnits.push_back(Unit);
Devang Patelb314bd62009-12-11 21:37:07 +00001652 return Unit;
Bill Wendling2b128d72009-05-20 23:19:06 +00001653}
1654
Devang Patel930143b2009-11-21 02:48:08 +00001655void DwarfDebug::constructGlobalVariableDIE(MDNode *N) {
Devang Patel80ae3492009-08-28 23:24:31 +00001656 DIGlobalVariable DI_GV(N);
Daniel Dunbarc418d6b2009-09-19 20:40:05 +00001657
Devang Patelf5d53602009-09-04 23:59:07 +00001658 // If debug information is malformed then ignore it.
1659 if (DI_GV.Verify() == false)
1660 return;
Bill Wendling2b128d72009-05-20 23:19:06 +00001661
1662 // Check for pre-existence.
Devang Patele064ad42009-11-20 21:37:22 +00001663 if (ModuleCU->getDIE(DI_GV.getNode()))
Devang Patel0751a282009-06-26 01:49:18 +00001664 return;
Bill Wendling2b128d72009-05-20 23:19:06 +00001665
Devang Patel9ccfb642009-12-09 18:24:21 +00001666 DIE *VariableDie = createGlobalVariableDIE(DI_GV);
Devang Patel2eec32d2009-12-10 23:25:41 +00001667 if (!VariableDie)
1668 return;
Bill Wendling2b128d72009-05-20 23:19:06 +00001669
Bill Wendling2b128d72009-05-20 23:19:06 +00001670 // Add to map.
Devang Patele064ad42009-11-20 21:37:22 +00001671 ModuleCU->insertDIE(N, VariableDie);
Bill Wendling2b128d72009-05-20 23:19:06 +00001672
1673 // Add to context owner.
Devang Patel89880c82010-01-15 01:12:22 +00001674 DIDescriptor GVContext = DI_GV.getContext();
1675 // Do not create specification DIE if context is either compile unit
1676 // or a subprogram.
1677 if (DI_GV.isDefinition() && !GVContext.isCompileUnit()
1678 && !GVContext.isSubprogram()) {
Devang Patel1f4690c2009-12-15 19:16:48 +00001679 // Create specification DIE.
1680 DIE *VariableSpecDIE = new DIE(dwarf::DW_TAG_variable);
1681 addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification,
1682 dwarf::DW_FORM_ref4, VariableDie);
1683 DIEBlock *Block = new DIEBlock();
1684 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
1685 addObjectLabel(Block, 0, dwarf::DW_FORM_udata,
Chris Lattner06d45f62010-01-16 18:50:28 +00001686 Asm->GetGlobalValueSymbol(DI_GV.getGlobal()));
Devang Patel1f4690c2009-12-15 19:16:48 +00001687 addBlock(VariableSpecDIE, dwarf::DW_AT_location, 0, Block);
1688 ModuleCU->addDie(VariableSpecDIE);
1689 } else {
1690 DIEBlock *Block = new DIEBlock();
1691 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
1692 addObjectLabel(Block, 0, dwarf::DW_FORM_udata,
Chris Lattner06d45f62010-01-16 18:50:28 +00001693 Asm->GetGlobalValueSymbol(DI_GV.getGlobal()));
Devang Patel1f4690c2009-12-15 19:16:48 +00001694 addBlock(VariableDie, dwarf::DW_AT_location, 0, Block);
1695 }
Devang Patel89880c82010-01-15 01:12:22 +00001696 addToContextOwner(VariableDie, GVContext);
Devang Patel2b75ed22009-12-10 19:14:49 +00001697
Bill Wendling2b128d72009-05-20 23:19:06 +00001698 // Expose as global. FIXME - need to check external flag.
Devang Patel930143b2009-11-21 02:48:08 +00001699 ModuleCU->addGlobal(DI_GV.getName(), VariableDie);
Devang Patel04d2f2d2009-11-24 01:14:22 +00001700
1701 DIType GTy = DI_GV.getType();
Devang Patel2d9caf92009-11-25 17:36:49 +00001702 if (GTy.isCompositeType() && !GTy.getName().empty()) {
Devang Patel04d2f2d2009-11-24 01:14:22 +00001703 DIEEntry *Entry = ModuleCU->getDIEEntry(GTy.getNode());
1704 assert (Entry && "Missing global type!");
1705 ModuleCU->addGlobalType(GTy.getName(), Entry->getEntry());
1706 }
Devang Patel0751a282009-06-26 01:49:18 +00001707 return;
Bill Wendling2b128d72009-05-20 23:19:06 +00001708}
1709
Devang Patel930143b2009-11-21 02:48:08 +00001710void DwarfDebug::constructSubprogramDIE(MDNode *N) {
Devang Patel80ae3492009-08-28 23:24:31 +00001711 DISubprogram SP(N);
Bill Wendling2b128d72009-05-20 23:19:06 +00001712
1713 // Check for pre-existence.
Devang Patele064ad42009-11-20 21:37:22 +00001714 if (ModuleCU->getDIE(N))
Devang Patel0751a282009-06-26 01:49:18 +00001715 return;
Bill Wendling2b128d72009-05-20 23:19:06 +00001716
1717 if (!SP.isDefinition())
1718 // This is a method declaration which will be handled while constructing
1719 // class type.
Devang Patel0751a282009-06-26 01:49:18 +00001720 return;
Bill Wendling2b128d72009-05-20 23:19:06 +00001721
Devang Patel9ccfb642009-12-09 18:24:21 +00001722 DIE *SubprogramDie = createSubprogramDIE(SP);
Bill Wendling2b128d72009-05-20 23:19:06 +00001723
1724 // Add to map.
Devang Patele064ad42009-11-20 21:37:22 +00001725 ModuleCU->insertDIE(N, SubprogramDie);
Bill Wendling2b128d72009-05-20 23:19:06 +00001726
1727 // Add to context owner.
Devang Patel1f4690c2009-12-15 19:16:48 +00001728 addToContextOwner(SubprogramDie, SP.getContext());
Devang Patel512001a2009-12-08 23:21:45 +00001729
Bill Wendling2b128d72009-05-20 23:19:06 +00001730 // Expose as global.
Devang Patel930143b2009-11-21 02:48:08 +00001731 ModuleCU->addGlobal(SP.getName(), SubprogramDie);
Devang Patel04d2f2d2009-11-24 01:14:22 +00001732
Devang Patel0751a282009-06-26 01:49:18 +00001733 return;
Bill Wendling2b128d72009-05-20 23:19:06 +00001734}
1735
Devang Patel930143b2009-11-21 02:48:08 +00001736/// beginModule - Emit all Dwarf sections that should come prior to the
Daniel Dunbarbe22ec42009-09-19 20:40:14 +00001737/// content. Create global DIEs and emit initial debug info sections.
1738/// This is inovked by the target AsmPrinter.
Devang Patel930143b2009-11-21 02:48:08 +00001739void DwarfDebug::beginModule(Module *M, MachineModuleInfo *mmi) {
Devang Patel0c044ec2009-06-25 22:36:02 +00001740 this->M = M;
1741
Bill Wendling2b128d72009-05-20 23:19:06 +00001742 if (TimePassesIsEnabled)
1743 DebugTimer->startTimer();
1744
Devang Pateld41f1192009-11-11 19:55:08 +00001745 if (!MAI->doesSupportDebugInformation())
1746 return;
1747
Devang Patel63524442009-07-30 18:56:46 +00001748 DebugInfoFinder DbgFinder;
1749 DbgFinder.processModule(*M);
Devang Patel0751a282009-06-26 01:49:18 +00001750
Bill Wendling2b128d72009-05-20 23:19:06 +00001751 // Create all the compile unit DIEs.
Devang Patel63524442009-07-30 18:56:46 +00001752 for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
1753 E = DbgFinder.compile_unit_end(); I != E; ++I)
Devang Patel930143b2009-11-21 02:48:08 +00001754 constructCompileUnit(*I);
Bill Wendling2b128d72009-05-20 23:19:06 +00001755
1756 if (CompileUnits.empty()) {
1757 if (TimePassesIsEnabled)
1758 DebugTimer->stopTimer();
1759
1760 return;
1761 }
1762
Devang Patel86353452009-06-29 20:38:13 +00001763 // If main compile unit for this module is not seen than randomly
1764 // select first compile unit.
Devang Patel40d78412009-06-29 20:45:18 +00001765 if (!ModuleCU)
1766 ModuleCU = CompileUnits[0];
Devang Patel86353452009-06-29 20:38:13 +00001767
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001768 // Create DIEs for each subprogram.
Devang Patel63524442009-07-30 18:56:46 +00001769 for (DebugInfoFinder::iterator I = DbgFinder.subprogram_begin(),
1770 E = DbgFinder.subprogram_end(); I != E; ++I)
Devang Patel930143b2009-11-21 02:48:08 +00001771 constructSubprogramDIE(*I);
Devang Patel0751a282009-06-26 01:49:18 +00001772
Devang Patel2b75ed22009-12-10 19:14:49 +00001773 // Create DIEs for each global variable.
1774 for (DebugInfoFinder::iterator I = DbgFinder.global_variable_begin(),
1775 E = DbgFinder.global_variable_end(); I != E; ++I)
1776 constructGlobalVariableDIE(*I);
1777
Bill Wendling2b128d72009-05-20 23:19:06 +00001778 MMI = mmi;
1779 shouldEmit = true;
1780 MMI->setDebugInfoAvailability(true);
1781
1782 // Prime section data.
Chris Lattner5e693ed2009-07-28 03:13:23 +00001783 SectionMap.insert(Asm->getObjFileLowering().getTextSection());
Bill Wendling2b128d72009-05-20 23:19:06 +00001784
1785 // Print out .file directives to specify files for .loc directives. These are
1786 // printed out early so that they precede any .loc directives.
Chris Lattnere9a75a62009-08-22 21:43:10 +00001787 if (MAI->hasDotLocAndDotFile()) {
Bill Wendling2b128d72009-05-20 23:19:06 +00001788 for (unsigned i = 1, e = getNumSourceIds()+1; i != e; ++i) {
1789 // Remember source id starts at 1.
1790 std::pair<unsigned, unsigned> Id = getSourceDirectoryAndFileIds(i);
Chris Lattnerf5c834f2010-01-22 22:09:00 +00001791 // FIXME: don't use sys::path for this! This should not depend on the
1792 // host.
Bill Wendling2b128d72009-05-20 23:19:06 +00001793 sys::Path FullPath(getSourceDirectoryName(Id.first));
1794 bool AppendOk =
1795 FullPath.appendComponent(getSourceFileName(Id.second));
1796 assert(AppendOk && "Could not append filename to directory!");
1797 AppendOk = false;
Chris Lattner601ef332010-01-25 18:58:59 +00001798 Asm->OutStreamer.EmitDwarfFileDirective(i, FullPath.str());
Bill Wendling2b128d72009-05-20 23:19:06 +00001799 }
1800 }
1801
1802 // Emit initial sections
Devang Patel930143b2009-11-21 02:48:08 +00001803 emitInitial();
Bill Wendling2b128d72009-05-20 23:19:06 +00001804
1805 if (TimePassesIsEnabled)
1806 DebugTimer->stopTimer();
1807}
1808
Devang Patel930143b2009-11-21 02:48:08 +00001809/// endModule - Emit all Dwarf sections that should come after the content.
Bill Wendling2b128d72009-05-20 23:19:06 +00001810///
Devang Patel930143b2009-11-21 02:48:08 +00001811void DwarfDebug::endModule() {
Devang Pateld859d862009-10-06 00:03:14 +00001812 if (!ModuleCU)
Bill Wendling2b128d72009-05-20 23:19:06 +00001813 return;
1814
1815 if (TimePassesIsEnabled)
1816 DebugTimer->startTimer();
1817
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001818 // Attach DW_AT_inline attribute with inlined subprogram DIEs.
1819 for (SmallPtrSet<DIE *, 4>::iterator AI = InlinedSubprogramDIEs.begin(),
1820 AE = InlinedSubprogramDIEs.end(); AI != AE; ++AI) {
1821 DIE *ISP = *AI;
Devang Patel930143b2009-11-21 02:48:08 +00001822 addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001823 }
1824
Devang Patel236526d2009-12-03 01:25:38 +00001825 // Insert top level DIEs.
1826 for (SmallVector<DIE *, 4>::iterator TI = TopLevelDIEsVector.begin(),
1827 TE = TopLevelDIEsVector.end(); TI != TE; ++TI)
1828 ModuleCU->getCUDie()->addChild(*TI);
1829
Devang Patel018b29b2010-01-19 06:19:05 +00001830 for (DenseMap<DIE *, MDNode *>::iterator CI = ContainingTypeMap.begin(),
Devang Pateleb57c592009-12-03 19:11:07 +00001831 CE = ContainingTypeMap.end(); CI != CE; ++CI) {
1832 DIE *SPDie = CI->first;
1833 MDNode *N = dyn_cast_or_null<MDNode>(CI->second);
1834 if (!N) continue;
1835 DIE *NDie = ModuleCU->getDIE(N);
1836 if (!NDie) continue;
1837 addDIEEntry(SPDie, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, NDie);
Devang Patel2108ee02010-01-15 00:26:31 +00001838 // FIXME - This is not the correct approach.
1839 // addDIEEntry(NDie, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, NDie);
Devang Pateleb57c592009-12-03 19:11:07 +00001840 }
1841
Bill Wendling2b128d72009-05-20 23:19:06 +00001842 // Standard sections final addresses.
Chris Lattner4b7dadb2009-08-19 05:49:37 +00001843 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getTextSection());
Bill Wendling2b128d72009-05-20 23:19:06 +00001844 EmitLabel("text_end", 0);
Chris Lattner4b7dadb2009-08-19 05:49:37 +00001845 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getDataSection());
Bill Wendling2b128d72009-05-20 23:19:06 +00001846 EmitLabel("data_end", 0);
1847
1848 // End text sections.
1849 for (unsigned i = 1, N = SectionMap.size(); i <= N; ++i) {
Chris Lattner4b7dadb2009-08-19 05:49:37 +00001850 Asm->OutStreamer.SwitchSection(SectionMap[i]);
Bill Wendling2b128d72009-05-20 23:19:06 +00001851 EmitLabel("section_end", i);
1852 }
1853
1854 // Emit common frame information.
Devang Patel930143b2009-11-21 02:48:08 +00001855 emitCommonDebugFrame();
Bill Wendling2b128d72009-05-20 23:19:06 +00001856
1857 // Emit function debug frame information
1858 for (std::vector<FunctionDebugFrameInfo>::iterator I = DebugFrames.begin(),
1859 E = DebugFrames.end(); I != E; ++I)
Devang Patel930143b2009-11-21 02:48:08 +00001860 emitFunctionDebugFrame(*I);
Bill Wendling2b128d72009-05-20 23:19:06 +00001861
1862 // Compute DIE offsets and sizes.
Devang Patel930143b2009-11-21 02:48:08 +00001863 computeSizeAndOffsets();
Bill Wendling2b128d72009-05-20 23:19:06 +00001864
1865 // Emit all the DIEs into a debug info section
Devang Patel930143b2009-11-21 02:48:08 +00001866 emitDebugInfo();
Bill Wendling2b128d72009-05-20 23:19:06 +00001867
1868 // Corresponding abbreviations into a abbrev section.
Devang Patel930143b2009-11-21 02:48:08 +00001869 emitAbbreviations();
Bill Wendling2b128d72009-05-20 23:19:06 +00001870
1871 // Emit source line correspondence into a debug line section.
Devang Patel930143b2009-11-21 02:48:08 +00001872 emitDebugLines();
Bill Wendling2b128d72009-05-20 23:19:06 +00001873
1874 // Emit info into a debug pubnames section.
Devang Patel930143b2009-11-21 02:48:08 +00001875 emitDebugPubNames();
Bill Wendling2b128d72009-05-20 23:19:06 +00001876
Devang Patel04d2f2d2009-11-24 01:14:22 +00001877 // Emit info into a debug pubtypes section.
1878 emitDebugPubTypes();
1879
Bill Wendling2b128d72009-05-20 23:19:06 +00001880 // Emit info into a debug str section.
Devang Patel930143b2009-11-21 02:48:08 +00001881 emitDebugStr();
Bill Wendling2b128d72009-05-20 23:19:06 +00001882
1883 // Emit info into a debug loc section.
Devang Patel930143b2009-11-21 02:48:08 +00001884 emitDebugLoc();
Bill Wendling2b128d72009-05-20 23:19:06 +00001885
1886 // Emit info into a debug aranges section.
1887 EmitDebugARanges();
1888
1889 // Emit info into a debug ranges section.
Devang Patel930143b2009-11-21 02:48:08 +00001890 emitDebugRanges();
Bill Wendling2b128d72009-05-20 23:19:06 +00001891
1892 // Emit info into a debug macinfo section.
Devang Patel930143b2009-11-21 02:48:08 +00001893 emitDebugMacInfo();
Bill Wendling2b128d72009-05-20 23:19:06 +00001894
1895 // Emit inline info.
Devang Patel930143b2009-11-21 02:48:08 +00001896 emitDebugInlineInfo();
Bill Wendling2b128d72009-05-20 23:19:06 +00001897
1898 if (TimePassesIsEnabled)
1899 DebugTimer->stopTimer();
1900}
1901
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001902/// findAbstractVariable - Find abstract variable, if any, associated with Var.
Jim Grosbach00e9c612009-11-22 19:20:36 +00001903DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &Var,
1904 unsigned FrameIdx,
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001905 DILocation &ScopeLoc) {
1906
1907 DbgVariable *AbsDbgVariable = AbstractVariables.lookup(Var.getNode());
1908 if (AbsDbgVariable)
1909 return AbsDbgVariable;
1910
1911 DbgScope *Scope = AbstractScopes.lookup(ScopeLoc.getScope().getNode());
1912 if (!Scope)
1913 return NULL;
1914
1915 AbsDbgVariable = new DbgVariable(Var, FrameIdx);
Devang Patel930143b2009-11-21 02:48:08 +00001916 Scope->addVariable(AbsDbgVariable);
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001917 AbstractVariables[Var.getNode()] = AbsDbgVariable;
1918 return AbsDbgVariable;
1919}
1920
Devang Patel930143b2009-11-21 02:48:08 +00001921/// collectVariableInfo - Populate DbgScope entries with variables' info.
1922void DwarfDebug::collectVariableInfo() {
Devang Pateldf45c7f2009-10-09 22:42:28 +00001923 if (!MMI) return;
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001924
Devang Patel475d32a2009-10-06 01:26:37 +00001925 MachineModuleInfo::VariableDbgInfoMapTy &VMap = MMI->getVariableDbgInfo();
1926 for (MachineModuleInfo::VariableDbgInfoMapTy::iterator VI = VMap.begin(),
1927 VE = VMap.end(); VI != VE; ++VI) {
Devang Patelac277eb2010-01-22 22:52:10 +00001928 MDNode *Var = VI->first;
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001929 if (!Var) continue;
Devang Patel20b2a772009-10-08 18:48:03 +00001930 DIVariable DV (Var);
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001931 std::pair< unsigned, MDNode *> VP = VI->second;
1932 DILocation ScopeLoc(VP.second);
1933
1934 DbgScope *Scope =
1935 ConcreteScopes.lookup(ScopeLoc.getOrigLocation().getNode());
1936 if (!Scope)
Jim Grosbach042483e2009-11-21 23:12:12 +00001937 Scope = DbgScopeMap.lookup(ScopeLoc.getScope().getNode());
Devang Patelcdb7d442009-11-10 23:20:04 +00001938 // If variable scope is not found then skip this variable.
1939 if (!Scope)
1940 continue;
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001941
1942 DbgVariable *RegVar = new DbgVariable(DV, VP.first);
Devang Patel930143b2009-11-21 02:48:08 +00001943 Scope->addVariable(RegVar);
Jim Grosbach00e9c612009-11-22 19:20:36 +00001944 if (DbgVariable *AbsDbgVariable = findAbstractVariable(DV, VP.first,
1945 ScopeLoc))
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001946 RegVar->setAbstractVariable(AbsDbgVariable);
Devang Patel475d32a2009-10-06 01:26:37 +00001947 }
1948}
1949
Devang Patel930143b2009-11-21 02:48:08 +00001950/// beginScope - Process beginning of a scope starting at Label.
1951void DwarfDebug::beginScope(const MachineInstr *MI, unsigned Label) {
Devang Patel8db360d2009-10-06 01:50:42 +00001952 InsnToDbgScopeMapTy::iterator I = DbgScopeBeginMap.find(MI);
1953 if (I == DbgScopeBeginMap.end())
1954 return;
Dan Gohman3650f4e2009-11-23 21:30:55 +00001955 ScopeVector &SD = I->second;
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001956 for (ScopeVector::iterator SDI = SD.begin(), SDE = SD.end();
Jim Grosbach042483e2009-11-21 23:12:12 +00001957 SDI != SDE; ++SDI)
Devang Patel8db360d2009-10-06 01:50:42 +00001958 (*SDI)->setStartLabelID(Label);
1959}
1960
Devang Patel930143b2009-11-21 02:48:08 +00001961/// endScope - Process end of a scope.
1962void DwarfDebug::endScope(const MachineInstr *MI) {
Devang Patel8db360d2009-10-06 01:50:42 +00001963 InsnToDbgScopeMapTy::iterator I = DbgScopeEndMap.find(MI);
Devang Patel7d838bb2009-10-06 03:15:38 +00001964 if (I == DbgScopeEndMap.end())
Devang Patel8db360d2009-10-06 01:50:42 +00001965 return;
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001966
1967 unsigned Label = MMI->NextLabelID();
1968 Asm->printLabel(Label);
Dan Gohman3a6164e2009-12-05 01:42:34 +00001969 O << '\n';
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001970
Devang Patel8db360d2009-10-06 01:50:42 +00001971 SmallVector<DbgScope *, 2> &SD = I->second;
1972 for (SmallVector<DbgScope *, 2>::iterator SDI = SD.begin(), SDE = SD.end();
Jim Grosbach042483e2009-11-21 23:12:12 +00001973 SDI != SDE; ++SDI)
Devang Patel8db360d2009-10-06 01:50:42 +00001974 (*SDI)->setEndLabelID(Label);
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001975 return;
1976}
1977
1978/// createDbgScope - Create DbgScope for the scope.
1979void DwarfDebug::createDbgScope(MDNode *Scope, MDNode *InlinedAt) {
1980
1981 if (!InlinedAt) {
1982 DbgScope *WScope = DbgScopeMap.lookup(Scope);
1983 if (WScope)
1984 return;
1985 WScope = new DbgScope(NULL, DIDescriptor(Scope), NULL);
1986 DbgScopeMap.insert(std::make_pair(Scope, WScope));
Jim Grosbach042483e2009-11-21 23:12:12 +00001987 if (DIDescriptor(Scope).isLexicalBlock())
Devang Patel4450f262009-11-11 00:18:40 +00001988 createDbgScope(DILexicalBlock(Scope).getContext().getNode(), NULL);
Devang Patelf6eeaeb2009-11-10 23:06:00 +00001989 return;
1990 }
1991
1992 DbgScope *WScope = DbgScopeMap.lookup(InlinedAt);
1993 if (WScope)
1994 return;
1995
1996 WScope = new DbgScope(NULL, DIDescriptor(Scope), InlinedAt);
1997 DbgScopeMap.insert(std::make_pair(InlinedAt, WScope));
1998 DILocation DL(InlinedAt);
1999 createDbgScope(DL.getScope().getNode(), DL.getOrigLocation().getNode());
Devang Patel8db360d2009-10-06 01:50:42 +00002000}
2001
Devang Patel930143b2009-11-21 02:48:08 +00002002/// extractScopeInformation - Scan machine instructions in this function
Devang Patel75cc16c2009-10-01 20:31:14 +00002003/// and collect DbgScopes. Return true, if atleast one scope was found.
Chris Lattner76555b52010-01-26 23:18:02 +00002004bool DwarfDebug::extractScopeInformation() {
Devang Patel75cc16c2009-10-01 20:31:14 +00002005 // If scope information was extracted using .dbg intrinsics then there is not
2006 // any need to extract these information by scanning each instruction.
2007 if (!DbgScopeMap.empty())
2008 return false;
2009
Devang Patel530a0752010-01-04 20:44:00 +00002010 DenseMap<const MachineInstr *, unsigned> MIIndexMap;
2011 unsigned MIIndex = 0;
Devang Patelf6eeaeb2009-11-10 23:06:00 +00002012 // Scan each instruction and create scopes. First build working set of scopes.
Devang Patel75cc16c2009-10-01 20:31:14 +00002013 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2014 I != E; ++I) {
2015 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2016 II != IE; ++II) {
2017 const MachineInstr *MInsn = II;
Devang Patel530a0752010-01-04 20:44:00 +00002018 MIIndexMap[MInsn] = MIIndex++;
Devang Patel75cc16c2009-10-01 20:31:14 +00002019 DebugLoc DL = MInsn->getDebugLoc();
Devang Patelf6eeaeb2009-11-10 23:06:00 +00002020 if (DL.isUnknown()) continue;
Devang Patelc0e17df2010-01-16 06:09:35 +00002021 DILocation DLT = MF->getDILocation(DL);
2022 DIScope DLTScope = DLT.getScope();
2023 if (DLTScope.isNull()) continue;
Devang Patel75cc16c2009-10-01 20:31:14 +00002024 // There is no need to create another DIE for compile unit. For all
Jim Grosbach042483e2009-11-21 23:12:12 +00002025 // other scopes, create one DbgScope now. This will be translated
Devang Patel75cc16c2009-10-01 20:31:14 +00002026 // into a scope DIE at the end.
Devang Patelc0e17df2010-01-16 06:09:35 +00002027 if (DLTScope.isCompileUnit()) continue;
2028 createDbgScope(DLTScope.getNode(), DLT.getOrigLocation().getNode());
Devang Patelf6eeaeb2009-11-10 23:06:00 +00002029 }
2030 }
2031
2032
2033 // Build scope hierarchy using working set of scopes.
2034 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2035 I != E; ++I) {
2036 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2037 II != IE; ++II) {
2038 const MachineInstr *MInsn = II;
2039 DebugLoc DL = MInsn->getDebugLoc();
2040 if (DL.isUnknown()) continue;
Devang Patelc0e17df2010-01-16 06:09:35 +00002041 DILocation DLT = MF->getDILocation(DL);
2042 DIScope DLTScope = DLT.getScope();
2043 if (DLTScope.isNull()) continue;
Devang Patelf6eeaeb2009-11-10 23:06:00 +00002044 // There is no need to create another DIE for compile unit. For all
Jim Grosbach042483e2009-11-21 23:12:12 +00002045 // other scopes, create one DbgScope now. This will be translated
Devang Patelf6eeaeb2009-11-10 23:06:00 +00002046 // into a scope DIE at the end.
Devang Patelc0e17df2010-01-16 06:09:35 +00002047 if (DLTScope.isCompileUnit()) continue;
2048 DbgScope *Scope = getUpdatedDbgScope(DLTScope.getNode(), MInsn,
2049 DLT.getOrigLocation().getNode());
Devang Patelf6eeaeb2009-11-10 23:06:00 +00002050 Scope->setLastInsn(MInsn);
Devang Patel75cc16c2009-10-01 20:31:14 +00002051 }
2052 }
2053
Devang Patel530a0752010-01-04 20:44:00 +00002054 if (!CurrentFnDbgScope)
2055 return false;
2056
2057 CurrentFnDbgScope->fixInstructionMarkers(MIIndexMap);
Devang Patel75cc16c2009-10-01 20:31:14 +00002058
2059 // Each scope has first instruction and last instruction to mark beginning
2060 // and end of a scope respectively. Create an inverse map that list scopes
2061 // starts (and ends) with an instruction. One instruction may start (or end)
Devang Patel7771b7c2010-01-20 02:05:23 +00002062 // multiple scopes. Ignore scopes that are not reachable.
2063 SmallVector<DbgScope *, 4> WorkList;
2064 WorkList.push_back(CurrentFnDbgScope);
2065 while (!WorkList.empty()) {
2066 DbgScope *S = WorkList.back(); WorkList.pop_back();
2067
2068 SmallVector<DbgScope *, 4> &Children = S->getScopes();
2069 if (!Children.empty())
2070 for (SmallVector<DbgScope *, 4>::iterator SI = Children.begin(),
2071 SE = Children.end(); SI != SE; ++SI)
2072 WorkList.push_back(*SI);
2073
Devang Patelf6eeaeb2009-11-10 23:06:00 +00002074 if (S->isAbstractScope())
2075 continue;
Devang Patel75cc16c2009-10-01 20:31:14 +00002076 const MachineInstr *MI = S->getFirstInsn();
2077 assert (MI && "DbgScope does not have first instruction!");
2078
2079 InsnToDbgScopeMapTy::iterator IDI = DbgScopeBeginMap.find(MI);
2080 if (IDI != DbgScopeBeginMap.end())
2081 IDI->second.push_back(S);
2082 else
Devang Patelf6eeaeb2009-11-10 23:06:00 +00002083 DbgScopeBeginMap[MI].push_back(S);
Devang Patel75cc16c2009-10-01 20:31:14 +00002084
2085 MI = S->getLastInsn();
2086 assert (MI && "DbgScope does not have last instruction!");
2087 IDI = DbgScopeEndMap.find(MI);
2088 if (IDI != DbgScopeEndMap.end())
2089 IDI->second.push_back(S);
2090 else
Devang Patelf6eeaeb2009-11-10 23:06:00 +00002091 DbgScopeEndMap[MI].push_back(S);
Devang Patel75cc16c2009-10-01 20:31:14 +00002092 }
2093
2094 return !DbgScopeMap.empty();
2095}
2096
Devang Patel930143b2009-11-21 02:48:08 +00002097/// beginFunction - Gather pre-function debug information. Assumes being
Bill Wendling2b128d72009-05-20 23:19:06 +00002098/// emitted immediately after the function entry point.
Chris Lattner76555b52010-01-26 23:18:02 +00002099void DwarfDebug::beginFunction(const MachineFunction *MF) {
Bill Wendling2b128d72009-05-20 23:19:06 +00002100 this->MF = MF;
2101
2102 if (!ShouldEmitDwarfDebug()) return;
2103
2104 if (TimePassesIsEnabled)
2105 DebugTimer->startTimer();
2106
Chris Lattner76555b52010-01-26 23:18:02 +00002107 if (!extractScopeInformation())
Devang Patel4598eb62009-10-06 18:37:31 +00002108 return;
Devang Patel930143b2009-11-21 02:48:08 +00002109
2110 collectVariableInfo();
Devang Patel4598eb62009-10-06 18:37:31 +00002111
Bill Wendling2b128d72009-05-20 23:19:06 +00002112 // Assumes in correct section after the entry point.
2113 EmitLabel("func_begin", ++SubprogramCount);
2114
2115 // Emit label for the implicitly defined dbg.stoppoint at the start of the
2116 // function.
Devang Pateldf45c7f2009-10-09 22:42:28 +00002117 DebugLoc FDL = MF->getDefaultDebugLoc();
2118 if (!FDL.isUnknown()) {
Devang Patelc0e17df2010-01-16 06:09:35 +00002119 DILocation DLT = MF->getDILocation(FDL);
Devang Pateldf45c7f2009-10-09 22:42:28 +00002120 unsigned LabelID = 0;
Devang Patelc0e17df2010-01-16 06:09:35 +00002121 DISubprogram SP = getDISubprogram(DLT.getScope().getNode());
Devang Pateldf45c7f2009-10-09 22:42:28 +00002122 if (!SP.isNull())
Devang Patelc0e17df2010-01-16 06:09:35 +00002123 LabelID = recordSourceLine(SP.getLineNumber(), 0,
2124 DLT.getScope().getNode());
Devang Pateldf45c7f2009-10-09 22:42:28 +00002125 else
Devang Patelc0e17df2010-01-16 06:09:35 +00002126 LabelID = recordSourceLine(DLT.getLineNumber(),
2127 DLT.getColumnNumber(),
2128 DLT.getScope().getNode());
Devang Pateldf45c7f2009-10-09 22:42:28 +00002129 Asm->printLabel(LabelID);
2130 O << '\n';
Bill Wendling2b128d72009-05-20 23:19:06 +00002131 }
Bill Wendling2b128d72009-05-20 23:19:06 +00002132 if (TimePassesIsEnabled)
2133 DebugTimer->stopTimer();
2134}
2135
Devang Patel930143b2009-11-21 02:48:08 +00002136/// endFunction - Gather and emit post-function debug information.
Bill Wendling2b128d72009-05-20 23:19:06 +00002137///
Chris Lattner76555b52010-01-26 23:18:02 +00002138void DwarfDebug::endFunction(const MachineFunction *MF) {
Bill Wendling2b128d72009-05-20 23:19:06 +00002139 if (!ShouldEmitDwarfDebug()) return;
2140
2141 if (TimePassesIsEnabled)
2142 DebugTimer->startTimer();
2143
Devang Pateldf45c7f2009-10-09 22:42:28 +00002144 if (DbgScopeMap.empty())
2145 return;
Devang Patel2904aa92009-11-12 19:02:56 +00002146
Devang Patel530a0752010-01-04 20:44:00 +00002147 if (CurrentFnDbgScope) {
2148 // Define end label for subprogram.
2149 EmitLabel("func_end", SubprogramCount);
2150
2151 // Get function line info.
2152 if (!Lines.empty()) {
2153 // Get section line info.
2154 unsigned ID = SectionMap.insert(Asm->getCurrentSection());
2155 if (SectionSourceLines.size() < ID) SectionSourceLines.resize(ID);
2156 std::vector<SrcLineInfo> &SectionLineInfos = SectionSourceLines[ID-1];
2157 // Append the function info to section info.
2158 SectionLineInfos.insert(SectionLineInfos.end(),
2159 Lines.begin(), Lines.end());
2160 }
2161
2162 // Construct abstract scopes.
2163 for (SmallVector<DbgScope *, 4>::iterator AI = AbstractScopesList.begin(),
2164 AE = AbstractScopesList.end(); AI != AE; ++AI)
2165 constructScopeDIE(*AI);
2166
2167 constructScopeDIE(CurrentFnDbgScope);
2168
2169 DebugFrames.push_back(FunctionDebugFrameInfo(SubprogramCount,
2170 MMI->getFrameMoves()));
Bill Wendling2b128d72009-05-20 23:19:06 +00002171 }
2172
Bill Wendling2b128d72009-05-20 23:19:06 +00002173 // Clear debug info
Devang Patelfe189e62010-01-19 01:26:02 +00002174 CurrentFnDbgScope = NULL;
2175 DbgScopeMap.clear();
2176 DbgScopeBeginMap.clear();
2177 DbgScopeEndMap.clear();
2178 ConcreteScopes.clear();
2179 AbstractScopesList.clear();
Bill Wendling2b128d72009-05-20 23:19:06 +00002180 Lines.clear();
Devang Patel0a2c0bc2009-12-01 18:13:48 +00002181
Bill Wendling2b128d72009-05-20 23:19:06 +00002182 if (TimePassesIsEnabled)
2183 DebugTimer->stopTimer();
2184}
2185
Devang Patel930143b2009-11-21 02:48:08 +00002186/// recordSourceLine - Records location information and associates it with a
Bill Wendling2b128d72009-05-20 23:19:06 +00002187/// label. Returns a unique label ID used to generate a label and provide
2188/// correspondence to the source line list.
Jim Grosbach042483e2009-11-21 23:12:12 +00002189unsigned DwarfDebug::recordSourceLine(unsigned Line, unsigned Col,
Devang Patel2089d162009-10-05 18:03:19 +00002190 MDNode *S) {
Devang Patel80ae3492009-08-28 23:24:31 +00002191 if (!MMI)
2192 return 0;
2193
Bill Wendling2b128d72009-05-20 23:19:06 +00002194 if (TimePassesIsEnabled)
2195 DebugTimer->startTimer();
2196
Devang Patel2d9caf92009-11-25 17:36:49 +00002197 StringRef Dir;
2198 StringRef Fn;
Devang Patel2089d162009-10-05 18:03:19 +00002199
2200 DIDescriptor Scope(S);
2201 if (Scope.isCompileUnit()) {
2202 DICompileUnit CU(S);
2203 Dir = CU.getDirectory();
2204 Fn = CU.getFilename();
2205 } else if (Scope.isSubprogram()) {
2206 DISubprogram SP(S);
2207 Dir = SP.getDirectory();
2208 Fn = SP.getFilename();
2209 } else if (Scope.isLexicalBlock()) {
2210 DILexicalBlock DB(S);
2211 Dir = DB.getDirectory();
2212 Fn = DB.getFilename();
2213 } else
2214 assert (0 && "Unexpected scope info");
2215
2216 unsigned Src = GetOrCreateSourceID(Dir, Fn);
Bill Wendling2b128d72009-05-20 23:19:06 +00002217 unsigned ID = MMI->NextLabelID();
2218 Lines.push_back(SrcLineInfo(Line, Col, Src, ID));
2219
2220 if (TimePassesIsEnabled)
2221 DebugTimer->stopTimer();
2222
2223 return ID;
2224}
2225
2226/// getOrCreateSourceID - Public version of GetOrCreateSourceID. This can be
2227/// timed. Look up the source id with the given directory and source file
2228/// names. If none currently exists, create a new id and insert it in the
2229/// SourceIds map. This can update DirectoryNames and SourceFileNames maps as
2230/// well.
2231unsigned DwarfDebug::getOrCreateSourceID(const std::string &DirName,
2232 const std::string &FileName) {
2233 if (TimePassesIsEnabled)
2234 DebugTimer->startTimer();
2235
Devang Patelb2969422009-09-29 18:40:58 +00002236 unsigned SrcId = GetOrCreateSourceID(DirName.c_str(), FileName.c_str());
Bill Wendling2b128d72009-05-20 23:19:06 +00002237
2238 if (TimePassesIsEnabled)
2239 DebugTimer->stopTimer();
2240
2241 return SrcId;
2242}
2243
Bill Wendling806535f2009-05-20 23:22:40 +00002244//===----------------------------------------------------------------------===//
2245// Emit Methods
2246//===----------------------------------------------------------------------===//
2247
Devang Patel930143b2009-11-21 02:48:08 +00002248/// computeSizeAndOffset - Compute the size and offset of a DIE.
Bill Wendling480ff322009-05-20 23:21:38 +00002249///
Jim Grosbach00e9c612009-11-22 19:20:36 +00002250unsigned
2251DwarfDebug::computeSizeAndOffset(DIE *Die, unsigned Offset, bool Last) {
Bill Wendling480ff322009-05-20 23:21:38 +00002252 // Get the children.
2253 const std::vector<DIE *> &Children = Die->getChildren();
2254
2255 // If not last sibling and has children then add sibling offset attribute.
Devang Patel930143b2009-11-21 02:48:08 +00002256 if (!Last && !Children.empty()) Die->addSiblingOffset();
Bill Wendling480ff322009-05-20 23:21:38 +00002257
2258 // Record the abbreviation.
Devang Patel930143b2009-11-21 02:48:08 +00002259 assignAbbrevNumber(Die->getAbbrev());
Bill Wendling480ff322009-05-20 23:21:38 +00002260
2261 // Get the abbreviation for this DIE.
2262 unsigned AbbrevNumber = Die->getAbbrevNumber();
2263 const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2264
2265 // Set DIE offset
2266 Die->setOffset(Offset);
2267
2268 // Start the size with the size of abbreviation code.
Chris Lattner7b26fce2009-08-22 20:48:53 +00002269 Offset += MCAsmInfo::getULEB128Size(AbbrevNumber);
Bill Wendling480ff322009-05-20 23:21:38 +00002270
2271 const SmallVector<DIEValue*, 32> &Values = Die->getValues();
2272 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
2273
2274 // Size the DIE attribute values.
2275 for (unsigned i = 0, N = Values.size(); i < N; ++i)
2276 // Size attribute value.
2277 Offset += Values[i]->SizeOf(TD, AbbrevData[i].getForm());
2278
2279 // Size the DIE children if any.
2280 if (!Children.empty()) {
2281 assert(Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes &&
2282 "Children flag not set");
2283
2284 for (unsigned j = 0, M = Children.size(); j < M; ++j)
Devang Patel930143b2009-11-21 02:48:08 +00002285 Offset = computeSizeAndOffset(Children[j], Offset, (j + 1) == M);
Bill Wendling480ff322009-05-20 23:21:38 +00002286
2287 // End of children marker.
2288 Offset += sizeof(int8_t);
2289 }
2290
2291 Die->setSize(Offset - Die->getOffset());
2292 return Offset;
2293}
2294
Devang Patel930143b2009-11-21 02:48:08 +00002295/// computeSizeAndOffsets - Compute the size and offset of all the DIEs.
Bill Wendling480ff322009-05-20 23:21:38 +00002296///
Devang Patel930143b2009-11-21 02:48:08 +00002297void DwarfDebug::computeSizeAndOffsets() {
Bill Wendling480ff322009-05-20 23:21:38 +00002298 // Compute size of compile unit header.
2299 static unsigned Offset =
2300 sizeof(int32_t) + // Length of Compilation Unit Info
2301 sizeof(int16_t) + // DWARF version number
2302 sizeof(int32_t) + // Offset Into Abbrev. Section
2303 sizeof(int8_t); // Pointer Size (in bytes)
2304
Devang Patel930143b2009-11-21 02:48:08 +00002305 computeSizeAndOffset(ModuleCU->getCUDie(), Offset, true);
Devang Patel40d78412009-06-29 20:45:18 +00002306 CompileUnitOffsets[ModuleCU] = 0;
Bill Wendling480ff322009-05-20 23:21:38 +00002307}
2308
Devang Patel930143b2009-11-21 02:48:08 +00002309/// emitInitial - Emit initial Dwarf declarations. This is necessary for cc
Bill Wendling480ff322009-05-20 23:21:38 +00002310/// tools to recognize the object file contains Dwarf information.
Devang Patel930143b2009-11-21 02:48:08 +00002311void DwarfDebug::emitInitial() {
Bill Wendling480ff322009-05-20 23:21:38 +00002312 // Check to see if we already emitted intial headers.
2313 if (didInitial) return;
2314 didInitial = true;
2315
Chris Lattner4b7dadb2009-08-19 05:49:37 +00002316 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
Daniel Dunbarc418d6b2009-09-19 20:40:05 +00002317
Bill Wendling480ff322009-05-20 23:21:38 +00002318 // Dwarf sections base addresses.
Chris Lattnere9a75a62009-08-22 21:43:10 +00002319 if (MAI->doesDwarfRequireFrameSection()) {
Chris Lattner4b7dadb2009-08-19 05:49:37 +00002320 Asm->OutStreamer.SwitchSection(TLOF.getDwarfFrameSection());
Bill Wendling480ff322009-05-20 23:21:38 +00002321 EmitLabel("section_debug_frame", 0);
2322 }
2323
Chris Lattner4b7dadb2009-08-19 05:49:37 +00002324 Asm->OutStreamer.SwitchSection(TLOF.getDwarfInfoSection());
Bill Wendling480ff322009-05-20 23:21:38 +00002325 EmitLabel("section_info", 0);
Chris Lattner4b7dadb2009-08-19 05:49:37 +00002326 Asm->OutStreamer.SwitchSection(TLOF.getDwarfAbbrevSection());
Bill Wendling480ff322009-05-20 23:21:38 +00002327 EmitLabel("section_abbrev", 0);
Chris Lattner4b7dadb2009-08-19 05:49:37 +00002328 Asm->OutStreamer.SwitchSection(TLOF.getDwarfARangesSection());
Bill Wendling480ff322009-05-20 23:21:38 +00002329 EmitLabel("section_aranges", 0);
2330
Chris Lattner4b7dadb2009-08-19 05:49:37 +00002331 if (const MCSection *LineInfoDirective = TLOF.getDwarfMacroInfoSection()) {
2332 Asm->OutStreamer.SwitchSection(LineInfoDirective);
Bill Wendling480ff322009-05-20 23:21:38 +00002333 EmitLabel("section_macinfo", 0);
2334 }
2335
Chris Lattner4b7dadb2009-08-19 05:49:37 +00002336 Asm->OutStreamer.SwitchSection(TLOF.getDwarfLineSection());
Bill Wendling480ff322009-05-20 23:21:38 +00002337 EmitLabel("section_line", 0);
Chris Lattner4b7dadb2009-08-19 05:49:37 +00002338 Asm->OutStreamer.SwitchSection(TLOF.getDwarfLocSection());
Bill Wendling480ff322009-05-20 23:21:38 +00002339 EmitLabel("section_loc", 0);
Chris Lattner4b7dadb2009-08-19 05:49:37 +00002340 Asm->OutStreamer.SwitchSection(TLOF.getDwarfPubNamesSection());
Bill Wendling480ff322009-05-20 23:21:38 +00002341 EmitLabel("section_pubnames", 0);
Devang Patel04d2f2d2009-11-24 01:14:22 +00002342 Asm->OutStreamer.SwitchSection(TLOF.getDwarfPubTypesSection());
2343 EmitLabel("section_pubtypes", 0);
Chris Lattner4b7dadb2009-08-19 05:49:37 +00002344 Asm->OutStreamer.SwitchSection(TLOF.getDwarfStrSection());
Bill Wendling480ff322009-05-20 23:21:38 +00002345 EmitLabel("section_str", 0);
Chris Lattner4b7dadb2009-08-19 05:49:37 +00002346 Asm->OutStreamer.SwitchSection(TLOF.getDwarfRangesSection());
Bill Wendling480ff322009-05-20 23:21:38 +00002347 EmitLabel("section_ranges", 0);
2348
Chris Lattner4b7dadb2009-08-19 05:49:37 +00002349 Asm->OutStreamer.SwitchSection(TLOF.getTextSection());
Bill Wendling480ff322009-05-20 23:21:38 +00002350 EmitLabel("text_begin", 0);
Chris Lattner4b7dadb2009-08-19 05:49:37 +00002351 Asm->OutStreamer.SwitchSection(TLOF.getDataSection());
Bill Wendling480ff322009-05-20 23:21:38 +00002352 EmitLabel("data_begin", 0);
2353}
2354
Devang Patel930143b2009-11-21 02:48:08 +00002355/// emitDIE - Recusively Emits a debug information entry.
Bill Wendling480ff322009-05-20 23:21:38 +00002356///
Devang Patel930143b2009-11-21 02:48:08 +00002357void DwarfDebug::emitDIE(DIE *Die) {
Bill Wendling480ff322009-05-20 23:21:38 +00002358 // Get the abbreviation for this DIE.
2359 unsigned AbbrevNumber = Die->getAbbrevNumber();
2360 const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2361
Chris Lattnerf5c834f2010-01-22 22:09:00 +00002362 Asm->O << '\n';
Bill Wendling480ff322009-05-20 23:21:38 +00002363
2364 // Emit the code (index) for the abbreviation.
Chris Lattnerfa823552010-01-22 23:18:42 +00002365 if (Asm->VerboseAsm)
2366 Asm->OutStreamer.AddComment("Abbrev [" + Twine(AbbrevNumber) + "] 0x" +
2367 Twine::utohexstr(Die->getOffset()) + ":0x" +
2368 Twine::utohexstr(Die->getSize()) + " " +
2369 dwarf::TagString(Abbrev->getTag()));
2370 EmitULEB128(AbbrevNumber);
Bill Wendling480ff322009-05-20 23:21:38 +00002371
2372 SmallVector<DIEValue*, 32> &Values = Die->getValues();
2373 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
2374
2375 // Emit the DIE attribute values.
2376 for (unsigned i = 0, N = Values.size(); i < N; ++i) {
2377 unsigned Attr = AbbrevData[i].getAttribute();
2378 unsigned Form = AbbrevData[i].getForm();
2379 assert(Form && "Too many attributes for DIE (check abbreviation)");
2380
Chris Lattner5adf9872010-01-24 18:54:17 +00002381 if (Asm->VerboseAsm)
2382 Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr));
2383
Bill Wendling480ff322009-05-20 23:21:38 +00002384 switch (Attr) {
2385 case dwarf::DW_AT_sibling:
Devang Patel930143b2009-11-21 02:48:08 +00002386 Asm->EmitInt32(Die->getSiblingOffset());
Bill Wendling480ff322009-05-20 23:21:38 +00002387 break;
2388 case dwarf::DW_AT_abstract_origin: {
2389 DIEEntry *E = cast<DIEEntry>(Values[i]);
2390 DIE *Origin = E->getEntry();
Devang Patelf6eeaeb2009-11-10 23:06:00 +00002391 unsigned Addr = Origin->getOffset();
Bill Wendling480ff322009-05-20 23:21:38 +00002392 Asm->EmitInt32(Addr);
2393 break;
2394 }
2395 default:
2396 // Emit an attribute using the defined form.
2397 Values[i]->EmitValue(this, Form);
Chris Lattner62f28402010-01-24 19:01:06 +00002398 O << "\n"; // REMOVE This once all EmitValue impls emit their own newline.
Bill Wendling480ff322009-05-20 23:21:38 +00002399 break;
2400 }
Bill Wendling480ff322009-05-20 23:21:38 +00002401 }
2402
2403 // Emit the DIE children if any.
2404 if (Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes) {
2405 const std::vector<DIE *> &Children = Die->getChildren();
2406
2407 for (unsigned j = 0, M = Children.size(); j < M; ++j)
Devang Patel930143b2009-11-21 02:48:08 +00002408 emitDIE(Children[j]);
Bill Wendling480ff322009-05-20 23:21:38 +00002409
Chris Lattner6f2d99d2010-01-22 23:47:11 +00002410 Asm->EmitInt8(0); EOL("End Of Children Mark");
Bill Wendling480ff322009-05-20 23:21:38 +00002411 }
2412}
2413
Devang Patel9ccfb642009-12-09 18:24:21 +00002414/// emitDebugInfo - Emit the debug info section.
Bill Wendling480ff322009-05-20 23:21:38 +00002415///
Devang Patel9ccfb642009-12-09 18:24:21 +00002416void DwarfDebug::emitDebugInfo() {
2417 // Start debug info section.
2418 Asm->OutStreamer.SwitchSection(
2419 Asm->getObjFileLowering().getDwarfInfoSection());
2420 DIE *Die = ModuleCU->getCUDie();
Bill Wendling480ff322009-05-20 23:21:38 +00002421
2422 // Emit the compile units header.
Devang Patel9ccfb642009-12-09 18:24:21 +00002423 EmitLabel("info_begin", ModuleCU->getID());
Bill Wendling480ff322009-05-20 23:21:38 +00002424
2425 // Emit size of content not including length itself
2426 unsigned ContentSize = Die->getSize() +
2427 sizeof(int16_t) + // DWARF version number
2428 sizeof(int32_t) + // Offset Into Abbrev. Section
2429 sizeof(int8_t) + // Pointer Size (in bytes)
2430 sizeof(int32_t); // FIXME - extra pad for gdb bug.
2431
Chris Lattner6f2d99d2010-01-22 23:47:11 +00002432 Asm->EmitInt32(ContentSize); EOL("Length of Compilation Unit Info");
2433 Asm->EmitInt16(dwarf::DWARF_VERSION); EOL("DWARF version number");
Bill Wendling480ff322009-05-20 23:21:38 +00002434 EmitSectionOffset("abbrev_begin", "section_abbrev", 0, 0, true, false);
Chris Lattner6f2d99d2010-01-22 23:47:11 +00002435 EOL("Offset Into Abbrev. Section");
2436 Asm->EmitInt8(TD->getPointerSize()); EOL("Address Size (in bytes)");
Bill Wendling480ff322009-05-20 23:21:38 +00002437
Devang Patel930143b2009-11-21 02:48:08 +00002438 emitDIE(Die);
Bill Wendling480ff322009-05-20 23:21:38 +00002439 // FIXME - extra padding for gdb bug.
Chris Lattner6f2d99d2010-01-22 23:47:11 +00002440 Asm->EmitInt8(0); EOL("Extra Pad For GDB");
2441 Asm->EmitInt8(0); EOL("Extra Pad For GDB");
2442 Asm->EmitInt8(0); EOL("Extra Pad For GDB");
2443 Asm->EmitInt8(0); EOL("Extra Pad For GDB");
Devang Patel9ccfb642009-12-09 18:24:21 +00002444 EmitLabel("info_end", ModuleCU->getID());
Chris Lattnerf5c834f2010-01-22 22:09:00 +00002445 Asm->O << '\n';
Bill Wendling480ff322009-05-20 23:21:38 +00002446}
2447
Devang Patel930143b2009-11-21 02:48:08 +00002448/// emitAbbreviations - Emit the abbreviation section.
Bill Wendling480ff322009-05-20 23:21:38 +00002449///
Devang Patel930143b2009-11-21 02:48:08 +00002450void DwarfDebug::emitAbbreviations() const {
Bill Wendling480ff322009-05-20 23:21:38 +00002451 // Check to see if it is worth the effort.
2452 if (!Abbreviations.empty()) {
2453 // Start the debug abbrev section.
Chris Lattner4b7dadb2009-08-19 05:49:37 +00002454 Asm->OutStreamer.SwitchSection(
2455 Asm->getObjFileLowering().getDwarfAbbrevSection());
Bill Wendling480ff322009-05-20 23:21:38 +00002456
2457 EmitLabel("abbrev_begin", 0);
2458
2459 // For each abbrevation.
2460 for (unsigned i = 0, N = Abbreviations.size(); i < N; ++i) {
2461 // Get abbreviation data
2462 const DIEAbbrev *Abbrev = Abbreviations[i];
2463
2464 // Emit the abbrevations code (base 1 index.)
Chris Lattnerfa823552010-01-22 23:18:42 +00002465 EmitULEB128(Abbrev->getNumber(), "Abbreviation Code");
Bill Wendling480ff322009-05-20 23:21:38 +00002466
2467 // Emit the abbreviations data.
Chris Lattnerfa823552010-01-22 23:18:42 +00002468 Abbrev->Emit(this);
Chris Lattnerf5c834f2010-01-22 22:09:00 +00002469 Asm->O << '\n';
Bill Wendling480ff322009-05-20 23:21:38 +00002470 }
2471
2472 // Mark end of abbreviations.
Chris Lattnerfa823552010-01-22 23:18:42 +00002473 EmitULEB128(0, "EOM(3)");
Bill Wendling480ff322009-05-20 23:21:38 +00002474
2475 EmitLabel("abbrev_end", 0);
Chris Lattnerf5c834f2010-01-22 22:09:00 +00002476 Asm->O << '\n';
Bill Wendling480ff322009-05-20 23:21:38 +00002477 }
2478}
2479
Devang Patel930143b2009-11-21 02:48:08 +00002480/// emitEndOfLineMatrix - Emit the last address of the section and the end of
Bill Wendling480ff322009-05-20 23:21:38 +00002481/// the line matrix.
2482///
Devang Patel930143b2009-11-21 02:48:08 +00002483void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) {
Bill Wendling480ff322009-05-20 23:21:38 +00002484 // Define last address of section.
Chris Lattner6f2d99d2010-01-22 23:47:11 +00002485 Asm->EmitInt8(0); EOL("Extended Op");
2486 Asm->EmitInt8(TD->getPointerSize() + 1); EOL("Op size");
2487 Asm->EmitInt8(dwarf::DW_LNE_set_address); EOL("DW_LNE_set_address");
2488 EmitReference("section_end", SectionEnd); EOL("Section end label");
Bill Wendling480ff322009-05-20 23:21:38 +00002489
2490 // Mark end of matrix.
Chris Lattner6f2d99d2010-01-22 23:47:11 +00002491 Asm->EmitInt8(0); EOL("DW_LNE_end_sequence");
Chris Lattnerf5c834f2010-01-22 22:09:00 +00002492 Asm->EmitInt8(1);
Chris Lattnerfa823552010-01-22 23:18:42 +00002493 Asm->EmitInt8(1);
Bill Wendling480ff322009-05-20 23:21:38 +00002494}
2495
Devang Patel930143b2009-11-21 02:48:08 +00002496/// emitDebugLines - Emit source line information.
Bill Wendling480ff322009-05-20 23:21:38 +00002497///
Devang Patel930143b2009-11-21 02:48:08 +00002498void DwarfDebug::emitDebugLines() {
Bill Wendling480ff322009-05-20 23:21:38 +00002499 // If the target is using .loc/.file, the assembler will be emitting the
2500 // .debug_line table automatically.
Chris Lattnere9a75a62009-08-22 21:43:10 +00002501 if (MAI->hasDotLocAndDotFile())
Bill Wendling480ff322009-05-20 23:21:38 +00002502 return;
2503
2504 // Minimum line delta, thus ranging from -10..(255-10).
2505 const int MinLineDelta = -(dwarf::DW_LNS_fixed_advance_pc + 1);
2506 // Maximum line delta, thus ranging from -10..(255-10).
2507 const int MaxLineDelta = 255 + MinLineDelta;
2508
2509 // Start the dwarf line section.
Chris Lattner4b7dadb2009-08-19 05:49:37 +00002510 Asm->OutStreamer.SwitchSection(
2511 Asm->getObjFileLowering().getDwarfLineSection());
Bill Wendling480ff322009-05-20 23:21:38 +00002512
2513 // Construct the section header.
2514 EmitDifference("line_end", 0, "line_begin", 0, true);
Chris Lattner6f2d99d2010-01-22 23:47:11 +00002515 EOL("Length of Source Line Info");
Bill Wendling480ff322009-05-20 23:21:38 +00002516 EmitLabel("line_begin", 0);
2517
Chris Lattner6f2d99d2010-01-22 23:47:11 +00002518 Asm->EmitInt16(dwarf::DWARF_VERSION); EOL("DWARF version number");
Bill Wendling480ff322009-05-20 23:21:38 +00002519
2520 EmitDifference("line_prolog_end", 0, "line_prolog_begin", 0, true);
Chris Lattner6f2d99d2010-01-22 23:47:11 +00002521 EOL("Prolog Length");
Bill Wendling480ff322009-05-20 23:21:38 +00002522 EmitLabel("line_prolog_begin", 0);
2523
Chris Lattner6f2d99d2010-01-22 23:47:11 +00002524 Asm->EmitInt8(1); EOL("Minimum Instruction Length");
2525 Asm->EmitInt8(1); EOL("Default is_stmt_start flag");
2526 Asm->EmitInt8(MinLineDelta); EOL("Line Base Value (Special Opcodes)");
2527 Asm->EmitInt8(MaxLineDelta); EOL("Line Range Value (Special Opcodes)");
2528 Asm->EmitInt8(-MinLineDelta); EOL("Special Opcode Base");
Bill Wendling480ff322009-05-20 23:21:38 +00002529
2530 // Line number standard opcode encodings argument count
Chris Lattner6f2d99d2010-01-22 23:47:11 +00002531 Asm->EmitInt8(0); EOL("DW_LNS_copy arg count");
2532 Asm->EmitInt8(1); EOL("DW_LNS_advance_pc arg count");
2533 Asm->EmitInt8(1); EOL("DW_LNS_advance_line arg count");
2534 Asm->EmitInt8(1); EOL("DW_LNS_set_file arg count");
2535 Asm->EmitInt8(1); EOL("DW_LNS_set_column arg count");
2536 Asm->EmitInt8(0); EOL("DW_LNS_negate_stmt arg count");
2537 Asm->EmitInt8(0); EOL("DW_LNS_set_basic_block arg count");
2538 Asm->EmitInt8(0); EOL("DW_LNS_const_add_pc arg count");
2539 Asm->EmitInt8(1); EOL("DW_LNS_fixed_advance_pc arg count");
Bill Wendling480ff322009-05-20 23:21:38 +00002540
2541 // Emit directories.
2542 for (unsigned DI = 1, DE = getNumSourceDirectories()+1; DI != DE; ++DI) {
Chris Lattnerc3f23b82010-01-23 03:11:46 +00002543 const std::string &Dir = getSourceDirectoryName(DI);
2544 if (Asm->VerboseAsm) Asm->OutStreamer.AddComment("Directory");
2545 Asm->OutStreamer.EmitBytes(StringRef(Dir.c_str(), Dir.size()+1), 0);
Bill Wendling480ff322009-05-20 23:21:38 +00002546 }
2547
Chris Lattner6f2d99d2010-01-22 23:47:11 +00002548 Asm->EmitInt8(0); EOL("End of directories");
Bill Wendling480ff322009-05-20 23:21:38 +00002549
2550 // Emit files.
2551 for (unsigned SI = 1, SE = getNumSourceIds()+1; SI != SE; ++SI) {
2552 // Remember source id starts at 1.
2553 std::pair<unsigned, unsigned> Id = getSourceDirectoryAndFileIds(SI);
Chris Lattnerc3f23b82010-01-23 03:11:46 +00002554 const std::string &FN = getSourceFileName(Id.second);
2555 if (Asm->VerboseAsm) Asm->OutStreamer.AddComment("Source");
2556 Asm->OutStreamer.EmitBytes(StringRef(FN.c_str(), FN.size()+1), 0);
2557
Chris Lattnerfa823552010-01-22 23:18:42 +00002558 EmitULEB128(Id.first, "Directory #");
2559 EmitULEB128(0, "Mod date");
2560 EmitULEB128(0, "File size");
Bill Wendling480ff322009-05-20 23:21:38 +00002561 }
2562
Chris Lattner6f2d99d2010-01-22 23:47:11 +00002563 Asm->EmitInt8(0); EOL("End of files");
Bill Wendling480ff322009-05-20 23:21:38 +00002564
2565 EmitLabel("line_prolog_end", 0);
2566
2567 // A sequence for each text section.
2568 unsigned SecSrcLinesSize = SectionSourceLines.size();
2569
2570 for (unsigned j = 0; j < SecSrcLinesSize; ++j) {
2571 // Isolate current sections line info.
2572 const std::vector<SrcLineInfo> &LineInfos = SectionSourceLines[j];
2573
Chris Lattner591105c2009-08-08 23:39:42 +00002574 /*if (Asm->isVerbose()) {
Chris Lattner4d2c0f92009-07-31 18:48:30 +00002575 const MCSection *S = SectionMap[j + 1];
Chris Lattnere9a75a62009-08-22 21:43:10 +00002576 O << '\t' << MAI->getCommentString() << " Section"
Bill Wendling480ff322009-05-20 23:21:38 +00002577 << S->getName() << '\n';
Chris Lattner591105c2009-08-08 23:39:42 +00002578 }*/
Chris Lattnerf5c834f2010-01-22 22:09:00 +00002579 Asm->O << '\n';
Bill Wendling480ff322009-05-20 23:21:38 +00002580
2581 // Dwarf assumes we start with first line of first source file.
2582 unsigned Source = 1;
2583 unsigned Line = 1;
2584
2585 // Construct rows of the address, source, line, column matrix.
2586 for (unsigned i = 0, N = LineInfos.size(); i < N; ++i) {
2587 const SrcLineInfo &LineInfo = LineInfos[i];
2588 unsigned LabelID = MMI->MappedLabel(LineInfo.getLabelID());
2589 if (!LabelID) continue;
2590
Caroline Tice183a5192009-09-11 18:25:54 +00002591 if (LineInfo.getLine() == 0) continue;
2592
Bill Wendling480ff322009-05-20 23:21:38 +00002593 if (!Asm->isVerbose())
Chris Lattnerf5c834f2010-01-22 22:09:00 +00002594 Asm->O << '\n';
Bill Wendling480ff322009-05-20 23:21:38 +00002595 else {
2596 std::pair<unsigned, unsigned> SourceID =
2597 getSourceDirectoryAndFileIds(LineInfo.getSourceID());
Chris Lattnere9a75a62009-08-22 21:43:10 +00002598 O << '\t' << MAI->getCommentString() << ' '
Dan Gohman0891d752009-12-05 02:00:34 +00002599 << getSourceDirectoryName(SourceID.first) << '/'
Bill Wendling480ff322009-05-20 23:21:38 +00002600 << getSourceFileName(SourceID.second)
Dan Gohman0891d752009-12-05 02:00:34 +00002601 << ':' << utostr_32(LineInfo.getLine()) << '\n';
Bill Wendling480ff322009-05-20 23:21:38 +00002602 }
2603
2604 // Define the line address.
Chris Lattner6f2d99d2010-01-22 23:47:11 +00002605 Asm->EmitInt8(0); EOL("Extended Op");
2606 Asm->EmitInt8(TD->getPointerSize() + 1); EOL("Op size");
2607 Asm->EmitInt8(dwarf::DW_LNE_set_address); EOL("DW_LNE_set_address");
2608 EmitReference("label", LabelID); EOL("Location label");
Bill Wendling480ff322009-05-20 23:21:38 +00002609
2610 // If change of source, then switch to the new source.
2611 if (Source != LineInfo.getSourceID()) {
2612 Source = LineInfo.getSourceID();
Chris Lattner6f2d99d2010-01-22 23:47:11 +00002613 Asm->EmitInt8(dwarf::DW_LNS_set_file); EOL("DW_LNS_set_file");
Chris Lattnerfa823552010-01-22 23:18:42 +00002614 EmitULEB128(Source, "New Source");
Bill Wendling480ff322009-05-20 23:21:38 +00002615 }
2616
2617 // If change of line.
2618 if (Line != LineInfo.getLine()) {
2619 // Determine offset.
2620 int Offset = LineInfo.getLine() - Line;
2621 int Delta = Offset - MinLineDelta;
2622
2623 // Update line.
2624 Line = LineInfo.getLine();
2625
2626 // If delta is small enough and in range...
2627 if (Delta >= 0 && Delta < (MaxLineDelta - 1)) {
2628 // ... then use fast opcode.
Chris Lattner6f2d99d2010-01-22 23:47:11 +00002629 Asm->EmitInt8(Delta - MinLineDelta); EOL("Line Delta");
Bill Wendling480ff322009-05-20 23:21:38 +00002630 } else {
2631 // ... otherwise use long hand.
2632 Asm->EmitInt8(dwarf::DW_LNS_advance_line);
Chris Lattner6f2d99d2010-01-22 23:47:11 +00002633 EOL("DW_LNS_advance_line");
Chris Lattner23031452010-01-22 22:56:55 +00002634 EmitSLEB128(Offset, "Line Offset");
Chris Lattner6f2d99d2010-01-22 23:47:11 +00002635 Asm->EmitInt8(dwarf::DW_LNS_copy); EOL("DW_LNS_copy");
Bill Wendling480ff322009-05-20 23:21:38 +00002636 }
2637 } else {
2638 // Copy the previous row (different address or source)
Chris Lattner6f2d99d2010-01-22 23:47:11 +00002639 Asm->EmitInt8(dwarf::DW_LNS_copy); EOL("DW_LNS_copy");
Bill Wendling480ff322009-05-20 23:21:38 +00002640 }
2641 }
2642
Devang Patel930143b2009-11-21 02:48:08 +00002643 emitEndOfLineMatrix(j + 1);
Bill Wendling480ff322009-05-20 23:21:38 +00002644 }
2645
2646 if (SecSrcLinesSize == 0)
2647 // Because we're emitting a debug_line section, we still need a line
2648 // table. The linker and friends expect it to exist. If there's nothing to
2649 // put into it, emit an empty table.
Devang Patel930143b2009-11-21 02:48:08 +00002650 emitEndOfLineMatrix(1);
Bill Wendling480ff322009-05-20 23:21:38 +00002651
2652 EmitLabel("line_end", 0);
Chris Lattnerf5c834f2010-01-22 22:09:00 +00002653 Asm->O << '\n';
Bill Wendling480ff322009-05-20 23:21:38 +00002654}
2655
Devang Patel930143b2009-11-21 02:48:08 +00002656/// emitCommonDebugFrame - Emit common frame info into a debug frame section.
Bill Wendling480ff322009-05-20 23:21:38 +00002657///
Devang Patel930143b2009-11-21 02:48:08 +00002658void DwarfDebug::emitCommonDebugFrame() {
Chris Lattnere9a75a62009-08-22 21:43:10 +00002659 if (!MAI->doesDwarfRequireFrameSection())
Bill Wendling480ff322009-05-20 23:21:38 +00002660 return;
2661
2662 int stackGrowth =
2663 Asm->TM.getFrameInfo()->getStackGrowthDirection() ==
2664 TargetFrameInfo::StackGrowsUp ?
2665 TD->getPointerSize() : -TD->getPointerSize();
2666
2667 // Start the dwarf frame section.
Chris Lattner4b7dadb2009-08-19 05:49:37 +00002668 Asm->OutStreamer.SwitchSection(
2669 Asm->getObjFileLowering().getDwarfFrameSection());
Bill Wendling480ff322009-05-20 23:21:38 +00002670
2671 EmitLabel("debug_frame_common", 0);
2672 EmitDifference("debug_frame_common_end", 0,
2673 "debug_frame_common_begin", 0, true);
Chris Lattner6f2d99d2010-01-22 23:47:11 +00002674 EOL("Length of Common Information Entry");
Bill Wendling480ff322009-05-20 23:21:38 +00002675
2676 EmitLabel("debug_frame_common_begin", 0);
2677 Asm->EmitInt32((int)dwarf::DW_CIE_ID);
Chris Lattner6f2d99d2010-01-22 23:47:11 +00002678 EOL("CIE Identifier Tag");
Bill Wendling480ff322009-05-20 23:21:38 +00002679 Asm->EmitInt8(dwarf::DW_CIE_VERSION);
Chris Lattner6f2d99d2010-01-22 23:47:11 +00002680 EOL("CIE Version");
Chris Lattnerc3f23b82010-01-23 03:11:46 +00002681 Asm->OutStreamer.EmitIntValue(0, 1, /*addrspace*/0); // nul terminator.
Chris Lattner6f2d99d2010-01-22 23:47:11 +00002682 EOL("CIE Augmentation");
Chris Lattnerfa823552010-01-22 23:18:42 +00002683 EmitULEB128(1, "CIE Code Alignment Factor");
Chris Lattner23031452010-01-22 22:56:55 +00002684 EmitSLEB128(stackGrowth, "CIE Data Alignment Factor");
Bill Wendling480ff322009-05-20 23:21:38 +00002685 Asm->EmitInt8(RI->getDwarfRegNum(RI->getRARegister(), false));
Chris Lattner6f2d99d2010-01-22 23:47:11 +00002686 EOL("CIE RA Column");
Bill Wendling480ff322009-05-20 23:21:38 +00002687
2688 std::vector<MachineMove> Moves;
2689 RI->getInitialFrameState(Moves);
2690
2691 EmitFrameMoves(NULL, 0, Moves, false);
2692
2693 Asm->EmitAlignment(2, 0, 0, false);
2694 EmitLabel("debug_frame_common_end", 0);
Chris Lattnerf5c834f2010-01-22 22:09:00 +00002695 Asm->O << '\n';
Bill Wendling480ff322009-05-20 23:21:38 +00002696}
2697
Devang Patel930143b2009-11-21 02:48:08 +00002698/// emitFunctionDebugFrame - Emit per function frame info into a debug frame
Bill Wendling480ff322009-05-20 23:21:38 +00002699/// section.
2700void
Devang Patel930143b2009-11-21 02:48:08 +00002701DwarfDebug::emitFunctionDebugFrame(const FunctionDebugFrameInfo&DebugFrameInfo){
Chris Lattnere9a75a62009-08-22 21:43:10 +00002702 if (!MAI->doesDwarfRequireFrameSection())
Bill Wendling480ff322009-05-20 23:21:38 +00002703 return;
2704
2705 // Start the dwarf frame section.
Chris Lattner4b7dadb2009-08-19 05:49:37 +00002706 Asm->OutStreamer.SwitchSection(
2707 Asm->getObjFileLowering().getDwarfFrameSection());
Bill Wendling480ff322009-05-20 23:21:38 +00002708
2709 EmitDifference("debug_frame_end", DebugFrameInfo.Number,
2710 "debug_frame_begin", DebugFrameInfo.Number, true);
Chris Lattner6f2d99d2010-01-22 23:47:11 +00002711 EOL("Length of Frame Information Entry");
Bill Wendling480ff322009-05-20 23:21:38 +00002712
2713 EmitLabel("debug_frame_begin", DebugFrameInfo.Number);
2714
2715 EmitSectionOffset("debug_frame_common", "section_debug_frame",
2716 0, 0, true, false);
Chris Lattner6f2d99d2010-01-22 23:47:11 +00002717 EOL("FDE CIE offset");
Bill Wendling480ff322009-05-20 23:21:38 +00002718
2719 EmitReference("func_begin", DebugFrameInfo.Number);
Chris Lattner6f2d99d2010-01-22 23:47:11 +00002720 EOL("FDE initial location");
Bill Wendling480ff322009-05-20 23:21:38 +00002721 EmitDifference("func_end", DebugFrameInfo.Number,
2722 "func_begin", DebugFrameInfo.Number);
Chris Lattner6f2d99d2010-01-22 23:47:11 +00002723 EOL("FDE address range");
Bill Wendling480ff322009-05-20 23:21:38 +00002724
2725 EmitFrameMoves("func_begin", DebugFrameInfo.Number, DebugFrameInfo.Moves,
2726 false);
2727
2728 Asm->EmitAlignment(2, 0, 0, false);
2729 EmitLabel("debug_frame_end", DebugFrameInfo.Number);
Chris Lattnerf5c834f2010-01-22 22:09:00 +00002730 Asm->O << '\n';
Bill Wendling480ff322009-05-20 23:21:38 +00002731}
2732
Devang Patel9ccfb642009-12-09 18:24:21 +00002733/// emitDebugPubNames - Emit visible names into a debug pubnames section.
2734///
2735void DwarfDebug::emitDebugPubNames() {
2736 // Start the dwarf pubnames section.
2737 Asm->OutStreamer.SwitchSection(
2738 Asm->getObjFileLowering().getDwarfPubNamesSection());
2739
2740 EmitDifference("pubnames_end", ModuleCU->getID(),
2741 "pubnames_begin", ModuleCU->getID(), true);
Chris Lattner6f2d99d2010-01-22 23:47:11 +00002742 EOL("Length of Public Names Info");
Bill Wendling480ff322009-05-20 23:21:38 +00002743
Devang Patel9ccfb642009-12-09 18:24:21 +00002744 EmitLabel("pubnames_begin", ModuleCU->getID());
Bill Wendling480ff322009-05-20 23:21:38 +00002745
Chris Lattner6f2d99d2010-01-22 23:47:11 +00002746 Asm->EmitInt16(dwarf::DWARF_VERSION); EOL("DWARF Version");
Bill Wendling480ff322009-05-20 23:21:38 +00002747
2748 EmitSectionOffset("info_begin", "section_info",
Devang Patel9ccfb642009-12-09 18:24:21 +00002749 ModuleCU->getID(), 0, true, false);
Chris Lattner6f2d99d2010-01-22 23:47:11 +00002750 EOL("Offset of Compilation Unit Info");
Bill Wendling480ff322009-05-20 23:21:38 +00002751
Devang Patel9ccfb642009-12-09 18:24:21 +00002752 EmitDifference("info_end", ModuleCU->getID(), "info_begin", ModuleCU->getID(),
Bill Wendling480ff322009-05-20 23:21:38 +00002753 true);
Chris Lattner6f2d99d2010-01-22 23:47:11 +00002754 EOL("Compilation Unit Length");
Bill Wendling480ff322009-05-20 23:21:38 +00002755
Devang Patel9ccfb642009-12-09 18:24:21 +00002756 const StringMap<DIE*> &Globals = ModuleCU->getGlobals();
Bill Wendling480ff322009-05-20 23:21:38 +00002757 for (StringMap<DIE*>::const_iterator
2758 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2759 const char *Name = GI->getKeyData();
2760 DIE * Entity = GI->second;
2761
Chris Lattner6f2d99d2010-01-22 23:47:11 +00002762 Asm->EmitInt32(Entity->getOffset()); EOL("DIE offset");
Chris Lattnerc3f23b82010-01-23 03:11:46 +00002763
2764 if (Asm->VerboseAsm)
2765 Asm->OutStreamer.AddComment("External Name");
2766 Asm->OutStreamer.EmitBytes(StringRef(Name, strlen(Name)+1), 0);
Bill Wendling480ff322009-05-20 23:21:38 +00002767 }
2768
Chris Lattner6f2d99d2010-01-22 23:47:11 +00002769 Asm->EmitInt32(0); EOL("End Mark");
Devang Patel9ccfb642009-12-09 18:24:21 +00002770 EmitLabel("pubnames_end", ModuleCU->getID());
Chris Lattnerf5c834f2010-01-22 22:09:00 +00002771 Asm->O << '\n';
Bill Wendling480ff322009-05-20 23:21:38 +00002772}
2773
Devang Patel04d2f2d2009-11-24 01:14:22 +00002774void DwarfDebug::emitDebugPubTypes() {
Devang Patelc8654eb2009-11-24 19:18:41 +00002775 // Start the dwarf pubnames section.
2776 Asm->OutStreamer.SwitchSection(
2777 Asm->getObjFileLowering().getDwarfPubTypesSection());
Devang Patel04d2f2d2009-11-24 01:14:22 +00002778 EmitDifference("pubtypes_end", ModuleCU->getID(),
2779 "pubtypes_begin", ModuleCU->getID(), true);
Chris Lattner6f2d99d2010-01-22 23:47:11 +00002780 EOL("Length of Public Types Info");
Devang Patel04d2f2d2009-11-24 01:14:22 +00002781
2782 EmitLabel("pubtypes_begin", ModuleCU->getID());
2783
Devang Patel057c6422010-02-02 03:47:27 +00002784 if (Asm->VerboseAsm) Asm->OutStreamer.AddComment("DWARF Version");
2785 Asm->EmitInt16(dwarf::DWARF_VERSION);
Devang Patel04d2f2d2009-11-24 01:14:22 +00002786
2787 EmitSectionOffset("info_begin", "section_info",
2788 ModuleCU->getID(), 0, true, false);
Chris Lattner6f2d99d2010-01-22 23:47:11 +00002789 EOL("Offset of Compilation ModuleCU Info");
Devang Patel04d2f2d2009-11-24 01:14:22 +00002790
2791 EmitDifference("info_end", ModuleCU->getID(), "info_begin", ModuleCU->getID(),
2792 true);
Chris Lattner6f2d99d2010-01-22 23:47:11 +00002793 EOL("Compilation ModuleCU Length");
Devang Patel04d2f2d2009-11-24 01:14:22 +00002794
2795 const StringMap<DIE*> &Globals = ModuleCU->getGlobalTypes();
2796 for (StringMap<DIE*>::const_iterator
2797 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2798 const char *Name = GI->getKeyData();
2799 DIE * Entity = GI->second;
2800
Devang Patel057c6422010-02-02 03:47:27 +00002801 if (Asm->VerboseAsm) Asm->OutStreamer.AddComment("DIE offset");
2802 Asm->EmitInt32(Entity->getOffset());
Chris Lattnerc3f23b82010-01-23 03:11:46 +00002803
2804 if (Asm->VerboseAsm) Asm->OutStreamer.AddComment("External Name");
Devang Patel6d404ad2010-02-02 03:37:03 +00002805 Asm->OutStreamer.EmitBytes(StringRef(Name, GI->getKeyLength()+1), 0);
Devang Patel04d2f2d2009-11-24 01:14:22 +00002806 }
2807
Chris Lattner6f2d99d2010-01-22 23:47:11 +00002808 Asm->EmitInt32(0); EOL("End Mark");
Devang Patel04d2f2d2009-11-24 01:14:22 +00002809 EmitLabel("pubtypes_end", ModuleCU->getID());
Chris Lattnerf5c834f2010-01-22 22:09:00 +00002810 Asm->O << '\n';
Devang Patel04d2f2d2009-11-24 01:14:22 +00002811}
2812
Devang Patel930143b2009-11-21 02:48:08 +00002813/// emitDebugStr - Emit visible names into a debug str section.
Bill Wendling480ff322009-05-20 23:21:38 +00002814///
Devang Patel930143b2009-11-21 02:48:08 +00002815void DwarfDebug::emitDebugStr() {
Bill Wendling480ff322009-05-20 23:21:38 +00002816 // Check to see if it is worth the effort.
2817 if (!StringPool.empty()) {
2818 // Start the dwarf str section.
Chris Lattner4b7dadb2009-08-19 05:49:37 +00002819 Asm->OutStreamer.SwitchSection(
2820 Asm->getObjFileLowering().getDwarfStrSection());
Bill Wendling480ff322009-05-20 23:21:38 +00002821
2822 // For each of strings in the string pool.
2823 for (unsigned StringID = 1, N = StringPool.size();
2824 StringID <= N; ++StringID) {
2825 // Emit a label for reference from debug information entries.
2826 EmitLabel("string", StringID);
2827
2828 // Emit the string itself.
2829 const std::string &String = StringPool[StringID];
Chris Lattnerc3f23b82010-01-23 03:11:46 +00002830 Asm->OutStreamer.EmitBytes(StringRef(String.c_str(), String.size()+1), 0);
Bill Wendling480ff322009-05-20 23:21:38 +00002831 }
2832
Chris Lattnerf5c834f2010-01-22 22:09:00 +00002833 Asm->O << '\n';
Bill Wendling480ff322009-05-20 23:21:38 +00002834 }
2835}
2836
Devang Patel930143b2009-11-21 02:48:08 +00002837/// emitDebugLoc - Emit visible names into a debug loc section.
Bill Wendling480ff322009-05-20 23:21:38 +00002838///
Devang Patel930143b2009-11-21 02:48:08 +00002839void DwarfDebug::emitDebugLoc() {
Bill Wendling480ff322009-05-20 23:21:38 +00002840 // Start the dwarf loc section.
Chris Lattner4b7dadb2009-08-19 05:49:37 +00002841 Asm->OutStreamer.SwitchSection(
2842 Asm->getObjFileLowering().getDwarfLocSection());
Bill Wendling480ff322009-05-20 23:21:38 +00002843}
2844
2845/// EmitDebugARanges - Emit visible names into a debug aranges section.
2846///
2847void DwarfDebug::EmitDebugARanges() {
2848 // Start the dwarf aranges section.
Chris Lattner4b7dadb2009-08-19 05:49:37 +00002849 Asm->OutStreamer.SwitchSection(
2850 Asm->getObjFileLowering().getDwarfARangesSection());
Bill Wendling480ff322009-05-20 23:21:38 +00002851
2852 // FIXME - Mock up
2853#if 0
2854 CompileUnit *Unit = GetBaseCompileUnit();
2855
2856 // Don't include size of length
Chris Lattner6f2d99d2010-01-22 23:47:11 +00002857 Asm->EmitInt32(0x1c); EOL("Length of Address Ranges Info");
Bill Wendling480ff322009-05-20 23:21:38 +00002858
Chris Lattner6f2d99d2010-01-22 23:47:11 +00002859 Asm->EmitInt16(dwarf::DWARF_VERSION); EOL("Dwarf Version");
Bill Wendling480ff322009-05-20 23:21:38 +00002860
2861 EmitReference("info_begin", Unit->getID());
Chris Lattner6f2d99d2010-01-22 23:47:11 +00002862 EOL("Offset of Compilation Unit Info");
Bill Wendling480ff322009-05-20 23:21:38 +00002863
Chris Lattner6f2d99d2010-01-22 23:47:11 +00002864 Asm->EmitInt8(TD->getPointerSize()); EOL("Size of Address");
Bill Wendling480ff322009-05-20 23:21:38 +00002865
Chris Lattner6f2d99d2010-01-22 23:47:11 +00002866 Asm->EmitInt8(0); EOL("Size of Segment Descriptor");
Bill Wendling480ff322009-05-20 23:21:38 +00002867
Chris Lattner6f2d99d2010-01-22 23:47:11 +00002868 Asm->EmitInt16(0); EOL("Pad (1)");
2869 Asm->EmitInt16(0); EOL("Pad (2)");
Bill Wendling480ff322009-05-20 23:21:38 +00002870
2871 // Range 1
Chris Lattner6f2d99d2010-01-22 23:47:11 +00002872 EmitReference("text_begin", 0); EOL("Address");
2873 EmitDifference("text_end", 0, "text_begin", 0, true); EOL("Length");
Bill Wendling480ff322009-05-20 23:21:38 +00002874
Chris Lattner6f2d99d2010-01-22 23:47:11 +00002875 Asm->EmitInt32(0); EOL("EOM (1)");
2876 Asm->EmitInt32(0); EOL("EOM (2)");
Bill Wendling480ff322009-05-20 23:21:38 +00002877#endif
Bill Wendling480ff322009-05-20 23:21:38 +00002878}
2879
Devang Patel930143b2009-11-21 02:48:08 +00002880/// emitDebugRanges - Emit visible names into a debug ranges section.
Bill Wendling480ff322009-05-20 23:21:38 +00002881///
Devang Patel930143b2009-11-21 02:48:08 +00002882void DwarfDebug::emitDebugRanges() {
Bill Wendling480ff322009-05-20 23:21:38 +00002883 // Start the dwarf ranges section.
Chris Lattner4b7dadb2009-08-19 05:49:37 +00002884 Asm->OutStreamer.SwitchSection(
2885 Asm->getObjFileLowering().getDwarfRangesSection());
Bill Wendling480ff322009-05-20 23:21:38 +00002886}
2887
Devang Patel930143b2009-11-21 02:48:08 +00002888/// emitDebugMacInfo - Emit visible names into a debug macinfo section.
Bill Wendling480ff322009-05-20 23:21:38 +00002889///
Devang Patel930143b2009-11-21 02:48:08 +00002890void DwarfDebug::emitDebugMacInfo() {
Daniel Dunbarc418d6b2009-09-19 20:40:05 +00002891 if (const MCSection *LineInfo =
Chris Lattner1472cf52009-08-02 07:24:22 +00002892 Asm->getObjFileLowering().getDwarfMacroInfoSection()) {
Bill Wendling480ff322009-05-20 23:21:38 +00002893 // Start the dwarf macinfo section.
Chris Lattner4b7dadb2009-08-19 05:49:37 +00002894 Asm->OutStreamer.SwitchSection(LineInfo);
Bill Wendling480ff322009-05-20 23:21:38 +00002895 }
2896}
2897
Devang Patel930143b2009-11-21 02:48:08 +00002898/// emitDebugInlineInfo - Emit inline info using following format.
Bill Wendling480ff322009-05-20 23:21:38 +00002899/// Section Header:
2900/// 1. length of section
2901/// 2. Dwarf version number
2902/// 3. address size.
2903///
2904/// Entries (one "entry" for each function that was inlined):
2905///
2906/// 1. offset into __debug_str section for MIPS linkage name, if exists;
2907/// otherwise offset into __debug_str for regular function name.
2908/// 2. offset into __debug_str section for regular function name.
2909/// 3. an unsigned LEB128 number indicating the number of distinct inlining
2910/// instances for the function.
2911///
2912/// The rest of the entry consists of a {die_offset, low_pc} pair for each
2913/// inlined instance; the die_offset points to the inlined_subroutine die in the
2914/// __debug_info section, and the low_pc is the starting address for the
2915/// inlining instance.
Devang Patel930143b2009-11-21 02:48:08 +00002916void DwarfDebug::emitDebugInlineInfo() {
Chris Lattnere9a75a62009-08-22 21:43:10 +00002917 if (!MAI->doesDwarfUsesInlineInfoSection())
Bill Wendling480ff322009-05-20 23:21:38 +00002918 return;
2919
Devang Patel40d78412009-06-29 20:45:18 +00002920 if (!ModuleCU)
Bill Wendling480ff322009-05-20 23:21:38 +00002921 return;
2922
Chris Lattner4b7dadb2009-08-19 05:49:37 +00002923 Asm->OutStreamer.SwitchSection(
2924 Asm->getObjFileLowering().getDwarfDebugInlineSection());
Chris Lattnerf5c834f2010-01-22 22:09:00 +00002925
Bill Wendling480ff322009-05-20 23:21:38 +00002926 EmitDifference("debug_inlined_end", 1,
2927 "debug_inlined_begin", 1, true);
Chris Lattner6f2d99d2010-01-22 23:47:11 +00002928 EOL("Length of Debug Inlined Information Entry");
Bill Wendling480ff322009-05-20 23:21:38 +00002929
2930 EmitLabel("debug_inlined_begin", 1);
2931
Chris Lattner6f2d99d2010-01-22 23:47:11 +00002932 Asm->EmitInt16(dwarf::DWARF_VERSION); EOL("Dwarf Version");
2933 Asm->EmitInt8(TD->getPointerSize()); EOL("Address Size (in bytes)");
Bill Wendling480ff322009-05-20 23:21:38 +00002934
Devang Patelf6eeaeb2009-11-10 23:06:00 +00002935 for (SmallVector<MDNode *, 4>::iterator I = InlinedSPNodes.begin(),
2936 E = InlinedSPNodes.end(); I != E; ++I) {
Jim Grosbach042483e2009-11-21 23:12:12 +00002937
Devang Patelf6eeaeb2009-11-10 23:06:00 +00002938 MDNode *Node = *I;
Devang Patel018b29b2010-01-19 06:19:05 +00002939 DenseMap<MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator II
Jim Grosbach00e9c612009-11-22 19:20:36 +00002940 = InlineInfo.find(Node);
Devang Patelf6eeaeb2009-11-10 23:06:00 +00002941 SmallVector<InlineInfoLabels, 4> &Labels = II->second;
Devang Patel80ae3492009-08-28 23:24:31 +00002942 DISubprogram SP(Node);
Devang Patel2d9caf92009-11-25 17:36:49 +00002943 StringRef LName = SP.getLinkageName();
2944 StringRef Name = SP.getName();
Bill Wendling480ff322009-05-20 23:21:38 +00002945
Chris Lattnerc3f23b82010-01-23 03:11:46 +00002946 if (LName.empty()) {
2947 Asm->OutStreamer.EmitBytes(Name, 0);
2948 Asm->OutStreamer.EmitIntValue(0, 1, 0); // nul terminator.
2949 } else
Devang Patelf6eeaeb2009-11-10 23:06:00 +00002950 EmitSectionOffset("string", "section_str",
Chris Lattnerc3f23b82010-01-23 03:11:46 +00002951 StringPool.idFor(getRealLinkageName(LName)), false, true);
Devang Patelf6eeaeb2009-11-10 23:06:00 +00002952
Chris Lattner6f2d99d2010-01-22 23:47:11 +00002953 EOL("MIPS linkage name");
Devang Patelf6eeaeb2009-11-10 23:06:00 +00002954 EmitSectionOffset("string", "section_str",
2955 StringPool.idFor(Name), false, true);
Chris Lattner6f2d99d2010-01-22 23:47:11 +00002956 EOL("Function name");
Chris Lattnerfa823552010-01-22 23:18:42 +00002957 EmitULEB128(Labels.size(), "Inline count");
Bill Wendling480ff322009-05-20 23:21:38 +00002958
Devang Patelf6eeaeb2009-11-10 23:06:00 +00002959 for (SmallVector<InlineInfoLabels, 4>::iterator LI = Labels.begin(),
Bill Wendling480ff322009-05-20 23:21:38 +00002960 LE = Labels.end(); LI != LE; ++LI) {
Devang Patelf6eeaeb2009-11-10 23:06:00 +00002961 DIE *SP = LI->second;
Chris Lattner6f2d99d2010-01-22 23:47:11 +00002962 Asm->EmitInt32(SP->getOffset()); EOL("DIE offset");
Bill Wendling480ff322009-05-20 23:21:38 +00002963
2964 if (TD->getPointerSize() == sizeof(int32_t))
Chris Lattnere9a75a62009-08-22 21:43:10 +00002965 O << MAI->getData32bitsDirective();
Bill Wendling480ff322009-05-20 23:21:38 +00002966 else
Chris Lattnere9a75a62009-08-22 21:43:10 +00002967 O << MAI->getData64bitsDirective();
Bill Wendling480ff322009-05-20 23:21:38 +00002968
Chris Lattner6f2d99d2010-01-22 23:47:11 +00002969 PrintLabelName("label", LI->first); EOL("low_pc");
Bill Wendling480ff322009-05-20 23:21:38 +00002970 }
2971 }
2972
2973 EmitLabel("debug_inlined_end", 1);
Chris Lattnerf5c834f2010-01-22 22:09:00 +00002974 Asm->O << '\n';
Bill Wendling480ff322009-05-20 23:21:38 +00002975}