blob: 308fc7ad761004cd35c6477cf71e31fd6f6645e8 [file] [log] [blame]
Bill Wendling0310d762009-05-15 09:23:25 +00001//===-- llvm/CodeGen/DwarfDebug.cpp - Dwarf Debug Framework ---------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file contains support for writing dwarf debug info into asm files.
11//
12//===----------------------------------------------------------------------===//
Devang Patele4b27562009-08-28 23:24:31 +000013#define DEBUG_TYPE "dwarfdebug"
Bill Wendling0310d762009-05-15 09:23:25 +000014#include "DwarfDebug.h"
15#include "llvm/Module.h"
David Greeneb2c66fc2009-08-19 21:52:55 +000016#include "llvm/CodeGen/MachineFunction.h"
Bill Wendling0310d762009-05-15 09:23:25 +000017#include "llvm/CodeGen/MachineModuleInfo.h"
Chris Lattnera87dea42009-07-31 18:48:30 +000018#include "llvm/MC/MCSection.h"
Chris Lattner6c2f9e12009-08-19 05:49:37 +000019#include "llvm/MC/MCStreamer.h"
Chris Lattneraf76e592009-08-22 20:48:53 +000020#include "llvm/MC/MCAsmInfo.h"
Chris Lattner45111d12010-01-16 21:57:06 +000021#include "llvm/Target/Mangler.h"
Bill Wendling0310d762009-05-15 09:23:25 +000022#include "llvm/Target/TargetData.h"
23#include "llvm/Target/TargetFrameInfo.h"
Chris Lattnerf0144122009-07-28 03:13:23 +000024#include "llvm/Target/TargetLoweringObjectFile.h"
25#include "llvm/Target/TargetRegisterInfo.h"
Chris Lattner23132b12009-08-24 03:52:50 +000026#include "llvm/ADT/StringExtras.h"
Daniel Dunbar6e4bdfc2009-10-13 06:47:08 +000027#include "llvm/Support/Debug.h"
28#include "llvm/Support/ErrorHandling.h"
Devang Patel3139fcf2010-01-26 21:39:14 +000029#include "llvm/Support/ValueHandle.h"
Chris Lattner0ad9c912010-01-22 22:09:00 +000030#include "llvm/Support/FormattedStream.h"
Chris Lattnera87dea42009-07-31 18:48:30 +000031#include "llvm/Support/Timer.h"
32#include "llvm/System/Path.h"
Bill Wendling0310d762009-05-15 09:23:25 +000033using namespace llvm;
34
Bill Wendling0310d762009-05-15 09:23:25 +000035//===----------------------------------------------------------------------===//
36
37/// Configuration values for initial hash set sizes (log2).
38///
Bill Wendling0310d762009-05-15 09:23:25 +000039static const unsigned InitAbbreviationsSetSize = 9; // log2(512)
Bill Wendling0310d762009-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 Lewycky5f9843f2009-11-17 08:11:44 +000046class CompileUnit {
Bill Wendling0310d762009-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 Patel2c4ceb12009-11-21 02:48:08 +000053 DIE *CUDie;
Bill Wendling0310d762009-05-15 09:23:25 +000054
Devang Patel6f01d9c2009-11-21 00:31:03 +000055 /// IndexTyDie - An anonymous type for index type.
56 DIE *IndexTyDie;
57
Bill Wendling0310d762009-05-15 09:23:25 +000058 /// GVToDieMap - Tracks the mapping of unit level debug informaton
59 /// variables to debug information entries.
Devang Patele4b27562009-08-28 23:24:31 +000060 /// FIXME : Rename GVToDieMap -> NodeToDieMap
Devang Patel622b0262010-01-19 06:19:05 +000061 DenseMap<MDNode *, DIE *> GVToDieMap;
Bill Wendling0310d762009-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 Patele4b27562009-08-28 23:24:31 +000065 /// FIXME : Rename
Devang Patel622b0262010-01-19 06:19:05 +000066 DenseMap<MDNode *, DIEEntry *> GVToDIEEntryMap;
Bill Wendling0310d762009-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 Patel193f7202009-11-24 01:14:22 +000072 /// GlobalTypes - A map of globally visible types for this unit.
73 ///
74 StringMap<DIE*> GlobalTypes;
75
Bill Wendling0310d762009-05-15 09:23:25 +000076public:
77 CompileUnit(unsigned I, DIE *D)
Devang Patel2c4ceb12009-11-21 02:48:08 +000078 : ID(I), CUDie(D), IndexTyDie(0) {}
79 ~CompileUnit() { delete CUDie; delete IndexTyDie; }
Bill Wendling0310d762009-05-15 09:23:25 +000080
81 // Accessors.
Devang Patel193f7202009-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 Wendling0310d762009-05-15 09:23:25 +000086
87 /// hasContent - Return true if this compile unit has something to write out.
88 ///
Devang Patel2c4ceb12009-11-21 02:48:08 +000089 bool hasContent() const { return !CUDie->getChildren().empty(); }
Bill Wendling0310d762009-05-15 09:23:25 +000090
Devang Patel2c4ceb12009-11-21 02:48:08 +000091 /// addGlobal - Add a new global entity to the compile unit.
Bill Wendling0310d762009-05-15 09:23:25 +000092 ///
Devang Patel2c4ceb12009-11-21 02:48:08 +000093 void addGlobal(const std::string &Name, DIE *Die) { Globals[Name] = Die; }
Bill Wendling0310d762009-05-15 09:23:25 +000094
Devang Patel193f7202009-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 Patel017d1212009-11-20 21:37:22 +0000101 /// getDIE - Returns the debug information entry map slot for the
Bill Wendling0310d762009-05-15 09:23:25 +0000102 /// specified debug variable.
Devang Patel017d1212009-11-20 21:37:22 +0000103 DIE *getDIE(MDNode *N) { return GVToDieMap.lookup(N); }
Jim Grosbach31ef40e2009-11-21 23:12:12 +0000104
Devang Patel017d1212009-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 Wendling0310d762009-05-15 09:23:25 +0000109
Devang Patel017d1212009-11-20 21:37:22 +0000110 /// getDIEEntry - Returns the debug information entry for the speciefied
111 /// debug variable.
Devang Patel6404e4e2009-12-15 19:16:48 +0000112 DIEEntry *getDIEEntry(MDNode *N) {
Devang Patel622b0262010-01-19 06:19:05 +0000113 DenseMap<MDNode *, DIEEntry *>::iterator I = GVToDIEEntryMap.find(N);
Devang Patel6404e4e2009-12-15 19:16:48 +0000114 if (I == GVToDIEEntryMap.end())
115 return NULL;
116 return I->second;
117 }
Devang Patel017d1212009-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 Wendling0310d762009-05-15 09:23:25 +0000122 }
123
Devang Patel2c4ceb12009-11-21 02:48:08 +0000124 /// addDie - Adds or interns the DIE to the compile unit.
Bill Wendling0310d762009-05-15 09:23:25 +0000125 ///
Devang Patel2c4ceb12009-11-21 02:48:08 +0000126 void addDie(DIE *Buffer) {
127 this->CUDie->addChild(Buffer);
Bill Wendling0310d762009-05-15 09:23:25 +0000128 }
Devang Patel6f01d9c2009-11-21 00:31:03 +0000129
130 // getIndexTyDie - Get an anonymous type for index type.
131 DIE *getIndexTyDie() {
132 return IndexTyDie;
133 }
134
Jim Grosbach7ab38df2009-11-22 19:20:36 +0000135 // setIndexTyDie - Set D as anonymous type for index which can be reused
136 // later.
Devang Patel6f01d9c2009-11-21 00:31:03 +0000137 void setIndexTyDie(DIE *D) {
138 IndexTyDie = D;
139 }
140
Bill Wendling0310d762009-05-15 09:23:25 +0000141};
142
143//===----------------------------------------------------------------------===//
144/// DbgVariable - This class is used to track local variable information.
145///
Devang Patelf76a3d62009-11-16 21:53:40 +0000146class DbgVariable {
Bill Wendling0310d762009-05-15 09:23:25 +0000147 DIVariable Var; // Variable Descriptor.
148 unsigned FrameIndex; // Variable frame index.
Devang Patel53bb5c92009-11-10 23:06:00 +0000149 DbgVariable *AbstractVar; // Abstract variable for this variable.
150 DIE *TheDIE;
Bill Wendling0310d762009-05-15 09:23:25 +0000151public:
Devang Patel53bb5c92009-11-10 23:06:00 +0000152 DbgVariable(DIVariable V, unsigned I)
153 : Var(V), FrameIndex(I), AbstractVar(0), TheDIE(0) {}
Bill Wendling0310d762009-05-15 09:23:25 +0000154
155 // Accessors.
Devang Patel53bb5c92009-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 Wendling0310d762009-05-15 09:23:25 +0000162};
163
164//===----------------------------------------------------------------------===//
165/// DbgScope - This class is used to track scope information.
166///
Devang Patelf76a3d62009-11-16 21:53:40 +0000167class DbgScope {
Bill Wendling0310d762009-05-15 09:23:25 +0000168 DbgScope *Parent; // Parent to this scope.
Jim Grosbach31ef40e2009-11-21 23:12:12 +0000169 DIDescriptor Desc; // Debug info descriptor for scope.
Devang Patel3139fcf2010-01-26 21:39:14 +0000170 // Location at which this scope is inlined.
171 AssertingVH<MDNode> InlinedAtLocation;
Devang Patel53bb5c92009-11-10 23:06:00 +0000172 bool AbstractScope; // Abstract Scope
Bill Wendling0310d762009-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 Pateld38dd112009-10-01 18:25:23 +0000175 const MachineInstr *LastInsn; // Last instruction of this scope.
176 const MachineInstr *FirstInsn; // First instruction of this scope.
Bill Wendling0310d762009-05-15 09:23:25 +0000177 SmallVector<DbgScope *, 4> Scopes; // Scopes defined in scope.
178 SmallVector<DbgVariable *, 8> Variables;// Variables declared in scope.
Daniel Dunbarf612ff62009-09-19 20:40:05 +0000179
Owen Anderson04c05f72009-06-24 22:53:20 +0000180 // Private state for dump()
181 mutable unsigned IndentLevel;
Bill Wendling0310d762009-05-15 09:23:25 +0000182public:
Devang Patelc90aefe2009-10-14 21:08:09 +0000183 DbgScope(DbgScope *P, DIDescriptor D, MDNode *I = 0)
Devang Patel53bb5c92009-11-10 23:06:00 +0000184 : Parent(P), Desc(D), InlinedAtLocation(I), AbstractScope(false),
Jim Grosbach31ef40e2009-11-21 23:12:12 +0000185 StartLabelID(0), EndLabelID(0),
Devang Patelc90aefe2009-10-14 21:08:09 +0000186 LastInsn(0), FirstInsn(0), IndentLevel(0) {}
Bill Wendling0310d762009-05-15 09:23:25 +0000187 virtual ~DbgScope();
188
189 // Accessors.
190 DbgScope *getParent() const { return Parent; }
Devang Patel53bb5c92009-11-10 23:06:00 +0000191 void setParent(DbgScope *P) { Parent = P; }
Bill Wendling0310d762009-05-15 09:23:25 +0000192 DIDescriptor getDesc() const { return Desc; }
Jim Grosbach31ef40e2009-11-21 23:12:12 +0000193 MDNode *getInlinedAt() const {
Devang Patel3139fcf2010-01-26 21:39:14 +0000194 return InlinedAtLocation;
Devang Patelc90aefe2009-10-14 21:08:09 +0000195 }
Devang Patel53bb5c92009-11-10 23:06:00 +0000196 MDNode *getScopeNode() const { return Desc.getNode(); }
Bill Wendling0310d762009-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 Wendling0310d762009-05-15 09:23:25 +0000201 void setStartLabelID(unsigned S) { StartLabelID = S; }
202 void setEndLabelID(unsigned E) { EndLabelID = E; }
Devang Pateld38dd112009-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 Patel53bb5c92009-11-10 23:06:00 +0000206 void setAbstractScope() { AbstractScope = true; }
207 bool isAbstractScope() const { return AbstractScope; }
Devang Pateld38dd112009-10-01 18:25:23 +0000208 const MachineInstr *getFirstInsn() { return FirstInsn; }
Devang Patel53bb5c92009-11-10 23:06:00 +0000209
Devang Patel2c4ceb12009-11-21 02:48:08 +0000210 /// addScope - Add a scope to the scope.
Bill Wendling0310d762009-05-15 09:23:25 +0000211 ///
Devang Patel2c4ceb12009-11-21 02:48:08 +0000212 void addScope(DbgScope *S) { Scopes.push_back(S); }
Bill Wendling0310d762009-05-15 09:23:25 +0000213
Devang Patel2c4ceb12009-11-21 02:48:08 +0000214 /// addVariable - Add a variable to the scope.
Bill Wendling0310d762009-05-15 09:23:25 +0000215 ///
Devang Patel2c4ceb12009-11-21 02:48:08 +0000216 void addVariable(DbgVariable *V) { Variables.push_back(V); }
Bill Wendling0310d762009-05-15 09:23:25 +0000217
Devang Patel344130e2010-01-04 20:44:00 +0000218 void fixInstructionMarkers(DenseMap<const MachineInstr *,
219 unsigned> &MIIndexMap) {
Devang Patelaf9e8472009-10-01 20:31:14 +0000220 assert (getFirstInsn() && "First instruction is missing!");
Devang Patel344130e2010-01-04 20:44:00 +0000221
222 // Use the end of last child scope as end of this scope.
Devang Patelaf9e8472009-10-01 20:31:14 +0000223 SmallVector<DbgScope *, 4> &Scopes = getScopes();
Devang Patelee890ed2010-01-05 16:59:17 +0000224 const MachineInstr *LastInsn = getFirstInsn();
Devang Patel344130e2010-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 Patelaf9e8472009-10-01 20:31:14 +0000242 }
243
Bill Wendling0310d762009-05-15 09:23:25 +0000244#ifndef NDEBUG
245 void dump() const;
246#endif
247};
248
249#ifndef NDEBUG
250void DbgScope::dump() const {
David Greenef83adbc2009-12-24 00:31:35 +0000251 raw_ostream &err = dbgs();
Chris Lattnerc281de12009-08-23 00:51:00 +0000252 err.indent(IndentLevel);
Devang Patel53bb5c92009-11-10 23:06:00 +0000253 MDNode *N = Desc.getNode();
254 N->dump();
Chris Lattnerc281de12009-08-23 00:51:00 +0000255 err << " [" << StartLabelID << ", " << EndLabelID << "]\n";
Devang Patel53bb5c92009-11-10 23:06:00 +0000256 if (AbstractScope)
257 err << "Abstract Scope\n";
Bill Wendling0310d762009-05-15 09:23:25 +0000258
259 IndentLevel += 2;
Devang Patel53bb5c92009-11-10 23:06:00 +0000260 if (!Scopes.empty())
261 err << "Children ...\n";
Bill Wendling0310d762009-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 Wendling0310d762009-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 Wendling0310d762009-05-15 09:23:25 +0000275}
276
277} // end llvm namespace
278
Chris Lattneraf76e592009-08-22 20:48:53 +0000279DwarfDebug::DwarfDebug(raw_ostream &OS, AsmPrinter *A, const MCAsmInfo *T)
Chris Lattner066c9ac2010-01-22 22:23:57 +0000280 : DwarfPrinter(OS, A, T, "dbg"), ModuleCU(0),
Bill Wendling0310d762009-05-15 09:23:25 +0000281 AbbreviationsSet(InitAbbreviationsSetSize), Abbreviations(),
Devang Patel2c4ceb12009-11-21 02:48:08 +0000282 DIEValues(), StringPool(),
Bill Wendling0310d762009-05-15 09:23:25 +0000283 SectionSourceLines(), didInitial(false), shouldEmit(false),
Devang Patel53bb5c92009-11-10 23:06:00 +0000284 CurrentFnDbgScope(0), DebugTimer(0) {
Bill Wendling0310d762009-05-15 09:23:25 +0000285 if (TimePassesIsEnabled)
Chris Lattner0b86a6f2009-12-28 07:41:18 +0000286 DebugTimer = new Timer("Dwarf Debug Writer");
Bill Wendling0310d762009-05-15 09:23:25 +0000287}
288DwarfDebug::~DwarfDebug() {
Devang Patel2c4ceb12009-11-21 02:48:08 +0000289 for (unsigned j = 0, M = DIEValues.size(); j < M; ++j)
290 delete DIEValues[j];
Bill Wendling0310d762009-05-15 09:23:25 +0000291
Bill Wendling0310d762009-05-15 09:23:25 +0000292 delete DebugTimer;
293}
294
Devang Patel2c4ceb12009-11-21 02:48:08 +0000295/// assignAbbrevNumber - Define a unique number for the abbreviation.
Bill Wendling0310d762009-05-15 09:23:25 +0000296///
Devang Patel2c4ceb12009-11-21 02:48:08 +0000297void DwarfDebug::assignAbbrevNumber(DIEAbbrev &Abbrev) {
Bill Wendling0310d762009-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 Patel2c4ceb12009-11-21 02:48:08 +0000318/// createDIEEntry - Creates a new DIEEntry to be a proxy for a debug
Bill Wendling995f80a2009-05-20 23:24:48 +0000319/// information entry.
Devang Patel2c4ceb12009-11-21 02:48:08 +0000320DIEEntry *DwarfDebug::createDIEEntry(DIE *Entry) {
Devang Patel6f01d9c2009-11-21 00:31:03 +0000321 DIEEntry *Value = new DIEEntry(Entry);
Devang Patel2c4ceb12009-11-21 02:48:08 +0000322 DIEValues.push_back(Value);
Bill Wendling0310d762009-05-15 09:23:25 +0000323 return Value;
324}
325
Devang Patel2c4ceb12009-11-21 02:48:08 +0000326/// addUInt - Add an unsigned integer attribute data and value.
Bill Wendling0310d762009-05-15 09:23:25 +0000327///
Devang Patel2c4ceb12009-11-21 02:48:08 +0000328void DwarfDebug::addUInt(DIE *Die, unsigned Attribute,
Bill Wendling0310d762009-05-15 09:23:25 +0000329 unsigned Form, uint64_t Integer) {
330 if (!Form) Form = DIEInteger::BestForm(false, Integer);
Devang Patel6f01d9c2009-11-21 00:31:03 +0000331 DIEValue *Value = new DIEInteger(Integer);
Devang Patel2c4ceb12009-11-21 02:48:08 +0000332 DIEValues.push_back(Value);
333 Die->addValue(Attribute, Form, Value);
Bill Wendling0310d762009-05-15 09:23:25 +0000334}
335
Devang Patel2c4ceb12009-11-21 02:48:08 +0000336/// addSInt - Add an signed integer attribute data and value.
Bill Wendling0310d762009-05-15 09:23:25 +0000337///
Devang Patel2c4ceb12009-11-21 02:48:08 +0000338void DwarfDebug::addSInt(DIE *Die, unsigned Attribute,
Bill Wendling0310d762009-05-15 09:23:25 +0000339 unsigned Form, int64_t Integer) {
340 if (!Form) Form = DIEInteger::BestForm(true, Integer);
Devang Patel6f01d9c2009-11-21 00:31:03 +0000341 DIEValue *Value = new DIEInteger(Integer);
Devang Patel2c4ceb12009-11-21 02:48:08 +0000342 DIEValues.push_back(Value);
343 Die->addValue(Attribute, Form, Value);
Bill Wendling0310d762009-05-15 09:23:25 +0000344}
345
Devang Patel69f57b12009-12-02 15:25:16 +0000346/// addString - Add a string attribute data and value. DIEString only
347/// keeps string reference.
Devang Patel2c4ceb12009-11-21 02:48:08 +0000348void DwarfDebug::addString(DIE *Die, unsigned Attribute, unsigned Form,
Chris Lattner4cf202b2010-01-23 03:11:46 +0000349 StringRef String) {
Devang Patel6f01d9c2009-11-21 00:31:03 +0000350 DIEValue *Value = new DIEString(String);
Devang Patel2c4ceb12009-11-21 02:48:08 +0000351 DIEValues.push_back(Value);
352 Die->addValue(Attribute, Form, Value);
Bill Wendling0310d762009-05-15 09:23:25 +0000353}
354
Devang Patel2c4ceb12009-11-21 02:48:08 +0000355/// addLabel - Add a Dwarf label attribute data and value.
Bill Wendling0310d762009-05-15 09:23:25 +0000356///
Devang Patel2c4ceb12009-11-21 02:48:08 +0000357void DwarfDebug::addLabel(DIE *Die, unsigned Attribute, unsigned Form,
Bill Wendling0310d762009-05-15 09:23:25 +0000358 const DWLabel &Label) {
Devang Patel6f01d9c2009-11-21 00:31:03 +0000359 DIEValue *Value = new DIEDwarfLabel(Label);
Devang Patel2c4ceb12009-11-21 02:48:08 +0000360 DIEValues.push_back(Value);
361 Die->addValue(Attribute, Form, Value);
Bill Wendling0310d762009-05-15 09:23:25 +0000362}
363
Devang Patel2c4ceb12009-11-21 02:48:08 +0000364/// addObjectLabel - Add an non-Dwarf label attribute data and value.
Bill Wendling0310d762009-05-15 09:23:25 +0000365///
Devang Patel2c4ceb12009-11-21 02:48:08 +0000366void DwarfDebug::addObjectLabel(DIE *Die, unsigned Attribute, unsigned Form,
Chris Lattner858431d2010-01-16 18:50:28 +0000367 const MCSymbol *Sym) {
368 DIEValue *Value = new DIEObjectLabel(Sym);
Devang Patel2c4ceb12009-11-21 02:48:08 +0000369 DIEValues.push_back(Value);
370 Die->addValue(Attribute, Form, Value);
Bill Wendling0310d762009-05-15 09:23:25 +0000371}
372
Devang Patel2c4ceb12009-11-21 02:48:08 +0000373/// addSectionOffset - Add a section offset label attribute data and value.
Bill Wendling0310d762009-05-15 09:23:25 +0000374///
Devang Patel2c4ceb12009-11-21 02:48:08 +0000375void DwarfDebug::addSectionOffset(DIE *Die, unsigned Attribute, unsigned Form,
Bill Wendling0310d762009-05-15 09:23:25 +0000376 const DWLabel &Label, const DWLabel &Section,
377 bool isEH, bool useSet) {
Devang Patel6f01d9c2009-11-21 00:31:03 +0000378 DIEValue *Value = new DIESectionOffset(Label, Section, isEH, useSet);
Devang Patel2c4ceb12009-11-21 02:48:08 +0000379 DIEValues.push_back(Value);
380 Die->addValue(Attribute, Form, Value);
Bill Wendling0310d762009-05-15 09:23:25 +0000381}
382
Devang Patel2c4ceb12009-11-21 02:48:08 +0000383/// addDelta - Add a label delta attribute data and value.
Bill Wendling0310d762009-05-15 09:23:25 +0000384///
Devang Patel2c4ceb12009-11-21 02:48:08 +0000385void DwarfDebug::addDelta(DIE *Die, unsigned Attribute, unsigned Form,
Bill Wendling0310d762009-05-15 09:23:25 +0000386 const DWLabel &Hi, const DWLabel &Lo) {
Devang Patel6f01d9c2009-11-21 00:31:03 +0000387 DIEValue *Value = new DIEDelta(Hi, Lo);
Devang Patel2c4ceb12009-11-21 02:48:08 +0000388 DIEValues.push_back(Value);
389 Die->addValue(Attribute, Form, Value);
Bill Wendling0310d762009-05-15 09:23:25 +0000390}
391
Devang Patel2c4ceb12009-11-21 02:48:08 +0000392/// addBlock - Add block data.
Bill Wendling0310d762009-05-15 09:23:25 +0000393///
Devang Patel2c4ceb12009-11-21 02:48:08 +0000394void DwarfDebug::addBlock(DIE *Die, unsigned Attribute, unsigned Form,
Bill Wendling0310d762009-05-15 09:23:25 +0000395 DIEBlock *Block) {
396 Block->ComputeSize(TD);
Devang Patel2c4ceb12009-11-21 02:48:08 +0000397 DIEValues.push_back(Block);
398 Die->addValue(Attribute, Block->BestForm(), Block);
Bill Wendling0310d762009-05-15 09:23:25 +0000399}
400
Devang Patel2c4ceb12009-11-21 02:48:08 +0000401/// addSourceLine - Add location information to specified debug information
Bill Wendling0310d762009-05-15 09:23:25 +0000402/// entry.
Devang Patel2c4ceb12009-11-21 02:48:08 +0000403void DwarfDebug::addSourceLine(DIE *Die, const DIVariable *V) {
Bill Wendling0310d762009-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 Pateld037d7a2009-12-11 21:37:07 +0000409 unsigned FileID = findCompileUnit(V->getCompileUnit())->getID();
Bill Wendling0310d762009-05-15 09:23:25 +0000410 assert(FileID && "Invalid file id");
Devang Patel2c4ceb12009-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 Wendling0310d762009-05-15 09:23:25 +0000413}
414
Devang Patel2c4ceb12009-11-21 02:48:08 +0000415/// addSourceLine - Add location information to specified debug information
Bill Wendling0310d762009-05-15 09:23:25 +0000416/// entry.
Devang Patel2c4ceb12009-11-21 02:48:08 +0000417void DwarfDebug::addSourceLine(DIE *Die, const DIGlobal *G) {
Bill Wendling0310d762009-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 Pateld037d7a2009-12-11 21:37:07 +0000423 unsigned FileID = findCompileUnit(G->getCompileUnit())->getID();
Bill Wendling0310d762009-05-15 09:23:25 +0000424 assert(FileID && "Invalid file id");
Devang Patel2c4ceb12009-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 Wendling0310d762009-05-15 09:23:25 +0000427}
Devang Patel82dfc0c2009-08-31 22:47:13 +0000428
Devang Patel2c4ceb12009-11-21 02:48:08 +0000429/// addSourceLine - Add location information to specified debug information
Devang Patel82dfc0c2009-08-31 22:47:13 +0000430/// entry.
Devang Patel2c4ceb12009-11-21 02:48:08 +0000431void DwarfDebug::addSourceLine(DIE *Die, const DISubprogram *SP) {
Devang Patel82dfc0c2009-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 Ticec6f9d622009-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 Patel82dfc0c2009-08-31 22:47:13 +0000439
440 unsigned Line = SP->getLineNumber();
Devang Pateld037d7a2009-12-11 21:37:07 +0000441 unsigned FileID = findCompileUnit(SP->getCompileUnit())->getID();
Devang Patel82dfc0c2009-08-31 22:47:13 +0000442 assert(FileID && "Invalid file id");
Devang Patel2c4ceb12009-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 Patel82dfc0c2009-08-31 22:47:13 +0000445}
446
Devang Patel2c4ceb12009-11-21 02:48:08 +0000447/// addSourceLine - Add location information to specified debug information
Devang Patel82dfc0c2009-08-31 22:47:13 +0000448/// entry.
Devang Patel2c4ceb12009-11-21 02:48:08 +0000449void DwarfDebug::addSourceLine(DIE *Die, const DIType *Ty) {
Bill Wendling0310d762009-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 Pateld037d7a2009-12-11 21:37:07 +0000456 unsigned FileID = findCompileUnit(CU)->getID();
Bill Wendling0310d762009-05-15 09:23:25 +0000457 assert(FileID && "Invalid file id");
Devang Patel2c4ceb12009-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 Wendling0310d762009-05-15 09:23:25 +0000460}
461
Devang Patel6404e4e2009-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 Ticedc8f6042009-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 Patel2c4ceb12009-11-21 02:48:08 +0000502 value of the variable. The function addBlockByrefType does this. */
Caroline Ticedc8f6042009-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 Patel2c4ceb12009-11-21 02:48:08 +0000507DIType DwarfDebug::getBlockByrefType(DIType Ty, std::string Name) {
Caroline Ticedc8f6042009-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 Stump3e4c9bd2009-09-30 00:08:22 +0000513 DIDerivedType DTy = DIDerivedType(Ty.getNode());
Caroline Ticedc8f6042009-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 Patel65dbc902009-11-25 17:36:49 +0000527 if (Name == DT.getName())
Caroline Ticedc8f6042009-08-31 21:19:37 +0000528 return (DT.getTypeDerivedFrom());
529 }
530
531 return Ty;
532}
533
Devang Patel2c4ceb12009-11-21 02:48:08 +0000534/// addComplexAddress - Start with the address based on the location provided,
Mike Stump3e4c9bd2009-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 Patel2c4ceb12009-11-21 02:48:08 +0000539void DwarfDebug::addComplexAddress(DbgVariable *&DV, DIE *Die,
Mike Stump3e4c9bd2009-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 Patel2c4ceb12009-11-21 02:48:08 +0000552 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
Mike Stump3e4c9bd2009-09-30 00:08:22 +0000553 } else {
554 Reg = Reg - dwarf::DW_OP_reg0;
Devang Patel2c4ceb12009-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 Stump3e4c9bd2009-09-30 00:08:22 +0000557 }
558 } else {
559 if (Reg < 32)
Devang Patel2c4ceb12009-11-21 02:48:08 +0000560 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
Mike Stump3e4c9bd2009-09-30 00:08:22 +0000561 else {
Devang Patel2c4ceb12009-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 Stump3e4c9bd2009-09-30 00:08:22 +0000564 }
565
Devang Patel2c4ceb12009-11-21 02:48:08 +0000566 addUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
Mike Stump3e4c9bd2009-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 Patel2c4ceb12009-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 Stump3e4c9bd2009-09-30 00:08:22 +0000575 } else if (Element == DIFactory::OpDeref) {
Devang Patel2c4ceb12009-11-21 02:48:08 +0000576 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Mike Stump3e4c9bd2009-09-30 00:08:22 +0000577 } else llvm_unreachable("unknown DIFactory Opcode");
578 }
579
580 // Now attach the location information to the DIE.
Devang Patel2c4ceb12009-11-21 02:48:08 +0000581 addBlock(Die, Attribute, 0, Block);
Mike Stump3e4c9bd2009-09-30 00:08:22 +0000582}
583
Caroline Ticedc8f6042009-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 Patel2c4ceb12009-11-21 02:48:08 +0000593 The function getBlockByrefType dives into the __Block_byref_x_VarName
Caroline Ticedc8f6042009-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 Dunbarf612ff62009-09-19 20:40:05 +0000598 expression that explains to the debugger how to navigate through the
Caroline Ticedc8f6042009-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 Patel2c4ceb12009-11-21 02:48:08 +0000638/// addBlockByrefAddress - Start with the address based on the location
Caroline Ticedc8f6042009-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 Patel2c4ceb12009-11-21 02:48:08 +0000644void DwarfDebug::addBlockByrefAddress(DbgVariable *&DV, DIE *Die,
Daniel Dunbar00564992009-09-19 20:40:14 +0000645 unsigned Attribute,
646 const MachineLocation &Location) {
Caroline Ticedc8f6042009-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 Patel65dbc902009-11-25 17:36:49 +0000653 StringRef varName = VD.getName();
Caroline Ticedc8f6042009-08-31 21:19:37 +0000654
655 if (Tag == dwarf::DW_TAG_pointer_type) {
Mike Stump3e4c9bd2009-09-30 00:08:22 +0000656 DIDerivedType DTy = DIDerivedType(Ty.getNode());
Caroline Ticedc8f6042009-08-31 21:19:37 +0000657 TmpTy = DTy.getTypeDerivedFrom();
658 isPointer = true;
659 }
660
661 DICompositeType blockStruct = DICompositeType(TmpTy.getNode());
662
Daniel Dunbar00564992009-09-19 20:40:14 +0000663 // Find the __forwarding field and the variable field in the __Block_byref
664 // struct.
Daniel Dunbar00564992009-09-19 20:40:14 +0000665 DIArray Fields = blockStruct.getTypeArray();
666 DIDescriptor varField = DIDescriptor();
667 DIDescriptor forwardingField = DIDescriptor();
Caroline Ticedc8f6042009-08-31 21:19:37 +0000668
669
Daniel Dunbar00564992009-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 Patel65dbc902009-11-25 17:36:49 +0000673 StringRef fieldName = DT.getName();
674 if (fieldName == "__forwarding")
Daniel Dunbar00564992009-09-19 20:40:14 +0000675 forwardingField = Element;
Devang Patel65dbc902009-11-25 17:36:49 +0000676 else if (fieldName == varName)
Daniel Dunbar00564992009-09-19 20:40:14 +0000677 varField = Element;
678 }
Daniel Dunbarf612ff62009-09-19 20:40:05 +0000679
Mike Stump7e3720d2009-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 Ticedc8f6042009-08-31 21:19:37 +0000683
Daniel Dunbar00564992009-09-19 20:40:14 +0000684 // Get the offsets for the forwarding field and the variable field.
Daniel Dunbar00564992009-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 Ticedc8f6042009-08-31 21:19:37 +0000689
Mike Stump7e3720d2009-09-24 23:21:26 +0000690 // Decode the original location, and use that as the start of the byref
691 // variable's location.
Daniel Dunbar00564992009-09-19 20:40:14 +0000692 unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
693 DIEBlock *Block = new DIEBlock();
Caroline Ticedc8f6042009-08-31 21:19:37 +0000694
Daniel Dunbar00564992009-09-19 20:40:14 +0000695 if (Location.isReg()) {
696 if (Reg < 32)
Devang Patel2c4ceb12009-11-21 02:48:08 +0000697 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
Daniel Dunbar00564992009-09-19 20:40:14 +0000698 else {
699 Reg = Reg - dwarf::DW_OP_reg0;
Devang Patel2c4ceb12009-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 Dunbar00564992009-09-19 20:40:14 +0000702 }
703 } else {
704 if (Reg < 32)
Devang Patel2c4ceb12009-11-21 02:48:08 +0000705 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
Daniel Dunbar00564992009-09-19 20:40:14 +0000706 else {
Devang Patel2c4ceb12009-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 Dunbar00564992009-09-19 20:40:14 +0000709 }
Caroline Ticedc8f6042009-08-31 21:19:37 +0000710
Devang Patel2c4ceb12009-11-21 02:48:08 +0000711 addUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
Daniel Dunbar00564992009-09-19 20:40:14 +0000712 }
Caroline Ticedc8f6042009-08-31 21:19:37 +0000713
Mike Stump7e3720d2009-09-24 23:21:26 +0000714 // If we started with a pointer to the __Block_byref... struct, then
Daniel Dunbar00564992009-09-19 20:40:14 +0000715 // the first thing we need to do is dereference the pointer (DW_OP_deref).
Daniel Dunbar00564992009-09-19 20:40:14 +0000716 if (isPointer)
Devang Patel2c4ceb12009-11-21 02:48:08 +0000717 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Caroline Ticedc8f6042009-08-31 21:19:37 +0000718
Daniel Dunbar00564992009-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 Dunbar00564992009-09-19 20:40:14 +0000722 if (forwardingFieldOffset > 0) {
Devang Patel2c4ceb12009-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 Dunbar00564992009-09-19 20:40:14 +0000725 }
Caroline Ticedc8f6042009-08-31 21:19:37 +0000726
Daniel Dunbar00564992009-09-19 20:40:14 +0000727 // Now dereference the __forwarding field to get to the real __Block_byref
728 // struct: DW_OP_deref.
Devang Patel2c4ceb12009-11-21 02:48:08 +0000729 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Caroline Ticedc8f6042009-08-31 21:19:37 +0000730
Daniel Dunbar00564992009-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 Dunbar00564992009-09-19 20:40:14 +0000734 if (varFieldOffset > 0) {
Devang Patel2c4ceb12009-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 Dunbar00564992009-09-19 20:40:14 +0000737 }
Caroline Ticedc8f6042009-08-31 21:19:37 +0000738
Daniel Dunbar00564992009-09-19 20:40:14 +0000739 // Now attach the location information to the DIE.
Devang Patel2c4ceb12009-11-21 02:48:08 +0000740 addBlock(Die, Attribute, 0, Block);
Caroline Ticedc8f6042009-08-31 21:19:37 +0000741}
742
Devang Patel2c4ceb12009-11-21 02:48:08 +0000743/// addAddress - Add an address attribute to a die based on the location
Bill Wendling0310d762009-05-15 09:23:25 +0000744/// provided.
Devang Patel2c4ceb12009-11-21 02:48:08 +0000745void DwarfDebug::addAddress(DIE *Die, unsigned Attribute,
Bill Wendling0310d762009-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 Patel2c4ceb12009-11-21 02:48:08 +0000752 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
Bill Wendling0310d762009-05-15 09:23:25 +0000753 } else {
Devang Patel2c4ceb12009-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 Wendling0310d762009-05-15 09:23:25 +0000756 }
757 } else {
758 if (Reg < 32) {
Devang Patel2c4ceb12009-11-21 02:48:08 +0000759 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
Bill Wendling0310d762009-05-15 09:23:25 +0000760 } else {
Devang Patel2c4ceb12009-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 Wendling0310d762009-05-15 09:23:25 +0000763 }
764
Devang Patel2c4ceb12009-11-21 02:48:08 +0000765 addUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
Bill Wendling0310d762009-05-15 09:23:25 +0000766 }
767
Devang Patel2c4ceb12009-11-21 02:48:08 +0000768 addBlock(Die, Attribute, 0, Block);
Bill Wendling0310d762009-05-15 09:23:25 +0000769}
770
Devang Patelc366f832009-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 Patel6404e4e2009-12-15 19:16:48 +0000778 } else if (Context.isNameSpace()) {
779 DIE *ContextDIE = getOrCreateNameSpace(DINameSpace(Context.getNode()));
780 ContextDIE->addChild(Die);
Devang Patelc366f832009-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 Patel16ced732009-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 Patelc366f832009-12-10 19:14:49 +0000806 addToContextOwner(TyDIE, Ty.getContext());
Devang Patel16ced732009-12-10 18:05:33 +0000807 return TyDIE;
808}
809
Devang Patel2c4ceb12009-11-21 02:48:08 +0000810/// addType - Add a new type attribute to the specified entity.
Devang Patel8a241142009-12-09 18:24:21 +0000811void DwarfDebug::addType(DIE *Entity, DIType Ty) {
Bill Wendling0310d762009-05-15 09:23:25 +0000812 if (Ty.isNull())
813 return;
814
815 // Check for pre-existence.
Devang Patel8a241142009-12-09 18:24:21 +0000816 DIEEntry *Entry = ModuleCU->getDIEEntry(Ty.getNode());
Bill Wendling0310d762009-05-15 09:23:25 +0000817 // If it exists then use the existing value.
Devang Patel2c4ceb12009-11-21 02:48:08 +0000818 if (Entry) {
819 Entity->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, Entry);
Bill Wendling0310d762009-05-15 09:23:25 +0000820 return;
821 }
822
823 // Set up proxy.
Devang Patel2c4ceb12009-11-21 02:48:08 +0000824 Entry = createDIEEntry();
Devang Patel8a241142009-12-09 18:24:21 +0000825 ModuleCU->insertDIEEntry(Ty.getNode(), Entry);
Bill Wendling0310d762009-05-15 09:23:25 +0000826
827 // Construct type.
Devang Patel16ced732009-12-10 18:05:33 +0000828 DIE *Buffer = getOrCreateTypeDIE(Ty);
Bill Wendling0310d762009-05-15 09:23:25 +0000829
Devang Patel2c4ceb12009-11-21 02:48:08 +0000830 Entry->setEntry(Buffer);
831 Entity->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, Entry);
Bill Wendling0310d762009-05-15 09:23:25 +0000832}
833
Devang Patel2c4ceb12009-11-21 02:48:08 +0000834/// constructTypeDIE - Construct basic type die from DIBasicType.
Devang Patel8a241142009-12-09 18:24:21 +0000835void DwarfDebug::constructTypeDIE(DIE &Buffer, DIBasicType BTy) {
Bill Wendling0310d762009-05-15 09:23:25 +0000836 // Get core information.
Devang Patel65dbc902009-11-25 17:36:49 +0000837 StringRef Name = BTy.getName();
Bill Wendling0310d762009-05-15 09:23:25 +0000838 Buffer.setTag(dwarf::DW_TAG_base_type);
Devang Patel2c4ceb12009-11-21 02:48:08 +0000839 addUInt(&Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
Bill Wendling0310d762009-05-15 09:23:25 +0000840 BTy.getEncoding());
841
842 // Add name if not anonymous or intermediate type.
Devang Patel65dbc902009-11-25 17:36:49 +0000843 if (!Name.empty())
Devang Patel2c4ceb12009-11-21 02:48:08 +0000844 addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
Bill Wendling0310d762009-05-15 09:23:25 +0000845 uint64_t Size = BTy.getSizeInBits() >> 3;
Devang Patel2c4ceb12009-11-21 02:48:08 +0000846 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
Bill Wendling0310d762009-05-15 09:23:25 +0000847}
848
Devang Patel2c4ceb12009-11-21 02:48:08 +0000849/// constructTypeDIE - Construct derived type die from DIDerivedType.
Devang Patel8a241142009-12-09 18:24:21 +0000850void DwarfDebug::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) {
Bill Wendling0310d762009-05-15 09:23:25 +0000851 // Get core information.
Devang Patel65dbc902009-11-25 17:36:49 +0000852 StringRef Name = DTy.getName();
Bill Wendling0310d762009-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 Patel8a241142009-12-09 18:24:21 +0000863 addType(&Buffer, FromTy);
Bill Wendling0310d762009-05-15 09:23:25 +0000864
865 // Add name if not anonymous or intermediate type.
Devang Pateldeea5642009-11-30 23:56:56 +0000866 if (!Name.empty())
Devang Patel2c4ceb12009-11-21 02:48:08 +0000867 addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
Bill Wendling0310d762009-05-15 09:23:25 +0000868
869 // Add size if non-zero (derived types might be zero-sized.)
870 if (Size)
Devang Patel2c4ceb12009-11-21 02:48:08 +0000871 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
Bill Wendling0310d762009-05-15 09:23:25 +0000872
873 // Add source line info if available and TyDesc is not a forward declaration.
Devang Patel05f6fa82009-11-23 18:43:37 +0000874 if (!DTy.isForwardDecl())
Devang Patel2c4ceb12009-11-21 02:48:08 +0000875 addSourceLine(&Buffer, &DTy);
Bill Wendling0310d762009-05-15 09:23:25 +0000876}
877
Devang Patel2c4ceb12009-11-21 02:48:08 +0000878/// constructTypeDIE - Construct type DIE from DICompositeType.
Devang Patel8a241142009-12-09 18:24:21 +0000879void DwarfDebug::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
Bill Wendling0310d762009-05-15 09:23:25 +0000880 // Get core information.
Devang Patel65dbc902009-11-25 17:36:49 +0000881 StringRef Name = CTy.getName();
Bill Wendling0310d762009-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 Patel8a241142009-12-09 18:24:21 +0000890 constructArrayTypeDIE(Buffer, &CTy);
Bill Wendling0310d762009-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 Patele4b27562009-08-28 23:24:31 +0000898 DIEnumerator Enum(Elements.getElement(i).getNode());
Devang Patelc5254722009-10-09 17:51:49 +0000899 if (!Enum.isNull()) {
Devang Patel8a241142009-12-09 18:24:21 +0000900 ElemDie = constructEnumTypeDIE(&Enum);
Devang Patel2c4ceb12009-11-21 02:48:08 +0000901 Buffer.addChild(ElemDie);
Devang Patelc5254722009-10-09 17:51:49 +0000902 }
Bill Wendling0310d762009-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 Patel8a241142009-12-09 18:24:21 +0000910 addType(&Buffer, DIType(RTy.getNode()));
Bill Wendling0310d762009-05-15 09:23:25 +0000911
912 // Add prototype flag.
Devang Patel2c4ceb12009-11-21 02:48:08 +0000913 addUInt(&Buffer, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
Bill Wendling0310d762009-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 Patel8a241142009-12-09 18:24:21 +0000919 addType(Arg, DIType(Ty.getNode()));
Devang Patel2c4ceb12009-11-21 02:48:08 +0000920 Buffer.addChild(Arg);
Bill Wendling0310d762009-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 Patele4b27562009-08-28 23:24:31 +0000937 if (Element.isNull())
938 continue;
Bill Wendling0310d762009-05-15 09:23:25 +0000939 DIE *ElemDie = NULL;
940 if (Element.getTag() == dwarf::DW_TAG_subprogram)
Devang Patelffe966c2009-12-14 16:18:45 +0000941 ElemDie = createSubprogramDIE(DISubprogram(Element.getNode()));
Devang Patel1ee0cb92010-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 Patel8a241142009-12-09 18:24:21 +0000952 ElemDie = createMemberDIE(DIDerivedType(Element.getNode()));
Devang Patel2c4ceb12009-11-21 02:48:08 +0000953 Buffer.addChild(ElemDie);
Bill Wendling0310d762009-05-15 09:23:25 +0000954 }
955
Devang Patela1ba2692009-08-27 23:51:51 +0000956 if (CTy.isAppleBlockExtension())
Devang Patel2c4ceb12009-11-21 02:48:08 +0000957 addUInt(&Buffer, dwarf::DW_AT_APPLE_block, dwarf::DW_FORM_flag, 1);
Bill Wendling0310d762009-05-15 09:23:25 +0000958
959 unsigned RLang = CTy.getRunTimeLang();
960 if (RLang)
Devang Patel2c4ceb12009-11-21 02:48:08 +0000961 addUInt(&Buffer, dwarf::DW_AT_APPLE_runtime_class,
Bill Wendling0310d762009-05-15 09:23:25 +0000962 dwarf::DW_FORM_data1, RLang);
Devang Patelb5544992010-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 Wendling0310d762009-05-15 09:23:25 +0000968 break;
969 }
970 default:
971 break;
972 }
973
974 // Add name if not anonymous or intermediate type.
Devang Patel65dbc902009-11-25 17:36:49 +0000975 if (!Name.empty())
Devang Patel2c4ceb12009-11-21 02:48:08 +0000976 addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
Bill Wendling0310d762009-05-15 09:23:25 +0000977
Devang Patel8cbb6122010-01-29 18:34:58 +0000978 if (Tag == dwarf::DW_TAG_enumeration_type || Tag == dwarf::DW_TAG_class_type ||
Bill Wendling0310d762009-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 Patel2c4ceb12009-11-21 02:48:08 +0000982 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
Bill Wendling0310d762009-05-15 09:23:25 +0000983 else {
984 // Add zero size if it is not a forward declaration.
985 if (CTy.isForwardDecl())
Devang Patel2c4ceb12009-11-21 02:48:08 +0000986 addUInt(&Buffer, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
Bill Wendling0310d762009-05-15 09:23:25 +0000987 else
Devang Patel2c4ceb12009-11-21 02:48:08 +0000988 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, 0);
Bill Wendling0310d762009-05-15 09:23:25 +0000989 }
990
991 // Add source line info if available.
992 if (!CTy.isForwardDecl())
Devang Patel2c4ceb12009-11-21 02:48:08 +0000993 addSourceLine(&Buffer, &CTy);
Bill Wendling0310d762009-05-15 09:23:25 +0000994 }
995}
996
Devang Patel2c4ceb12009-11-21 02:48:08 +0000997/// constructSubrangeDIE - Construct subrange DIE from DISubrange.
998void DwarfDebug::constructSubrangeDIE(DIE &Buffer, DISubrange SR, DIE *IndexTy){
Bill Wendling0310d762009-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 Patel2c4ceb12009-11-21 02:48:08 +00001003 addDIEEntry(DW_Subrange, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IndexTy);
Devang Patel6325a532009-08-14 20:59:16 +00001004 if (L)
Devang Patel2c4ceb12009-11-21 02:48:08 +00001005 addSInt(DW_Subrange, dwarf::DW_AT_lower_bound, 0, L);
Devang Pateld55224c2009-12-04 23:10:24 +00001006 addSInt(DW_Subrange, dwarf::DW_AT_upper_bound, 0, H);
Bill Wendling0310d762009-05-15 09:23:25 +00001007
Devang Patel2c4ceb12009-11-21 02:48:08 +00001008 Buffer.addChild(DW_Subrange);
Bill Wendling0310d762009-05-15 09:23:25 +00001009}
1010
Devang Patel2c4ceb12009-11-21 02:48:08 +00001011/// constructArrayTypeDIE - Construct array type DIE from DICompositeType.
Devang Patel8a241142009-12-09 18:24:21 +00001012void DwarfDebug::constructArrayTypeDIE(DIE &Buffer,
Bill Wendling0310d762009-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 Patel2c4ceb12009-11-21 02:48:08 +00001016 addUInt(&Buffer, dwarf::DW_AT_GNU_vector, dwarf::DW_FORM_flag, 1);
Bill Wendling0310d762009-05-15 09:23:25 +00001017
1018 // Emit derived type.
Devang Patel8a241142009-12-09 18:24:21 +00001019 addType(&Buffer, CTy->getTypeDerivedFrom());
Bill Wendling0310d762009-05-15 09:23:25 +00001020 DIArray Elements = CTy->getTypeArray();
1021
Devang Patel6f01d9c2009-11-21 00:31:03 +00001022 // Get an anonymous type for index type.
Devang Patel8a241142009-12-09 18:24:21 +00001023 DIE *IdxTy = ModuleCU->getIndexTyDie();
Devang Patel6f01d9c2009-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 Patel2c4ceb12009-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 Patel6f01d9c2009-11-21 00:31:03 +00001029 dwarf::DW_ATE_signed);
Devang Patel8a241142009-12-09 18:24:21 +00001030 ModuleCU->addDie(IdxTy);
1031 ModuleCU->setIndexTyDie(IdxTy);
Devang Patel6f01d9c2009-11-21 00:31:03 +00001032 }
Bill Wendling0310d762009-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 Patel2c4ceb12009-11-21 02:48:08 +00001038 constructSubrangeDIE(Buffer, DISubrange(Element.getNode()), IdxTy);
Bill Wendling0310d762009-05-15 09:23:25 +00001039 }
1040}
1041
Devang Patel2c4ceb12009-11-21 02:48:08 +00001042/// constructEnumTypeDIE - Construct enum type DIE from DIEnumerator.
Devang Patel8a241142009-12-09 18:24:21 +00001043DIE *DwarfDebug::constructEnumTypeDIE(DIEnumerator *ETy) {
Bill Wendling0310d762009-05-15 09:23:25 +00001044 DIE *Enumerator = new DIE(dwarf::DW_TAG_enumerator);
Devang Patel65dbc902009-11-25 17:36:49 +00001045 StringRef Name = ETy->getName();
Devang Patel2c4ceb12009-11-21 02:48:08 +00001046 addString(Enumerator, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
Bill Wendling0310d762009-05-15 09:23:25 +00001047 int64_t Value = ETy->getEnumValue();
Devang Patel2c4ceb12009-11-21 02:48:08 +00001048 addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, Value);
Bill Wendling0310d762009-05-15 09:23:25 +00001049 return Enumerator;
1050}
1051
Devang Patel351ca332010-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 Patel2c4ceb12009-11-21 02:48:08 +00001062/// createGlobalVariableDIE - Create new DIE using GV.
Devang Patel8a241142009-12-09 18:24:21 +00001063DIE *DwarfDebug::createGlobalVariableDIE(const DIGlobalVariable &GV) {
Jim Grosbach7ab38df2009-11-22 19:20:36 +00001064 // If the global variable was optmized out then no need to create debug info
1065 // entry.
Devang Patel84c73e92009-11-06 17:58:12 +00001066 if (!GV.getGlobal()) return NULL;
Devang Patel65dbc902009-11-25 17:36:49 +00001067 if (GV.getDisplayName().empty()) return NULL;
Devang Patel465c3be2009-11-06 01:30:04 +00001068
Bill Wendling0310d762009-05-15 09:23:25 +00001069 DIE *GVDie = new DIE(dwarf::DW_TAG_variable);
Jim Grosbach31ef40e2009-11-21 23:12:12 +00001070 addString(GVDie, dwarf::DW_AT_name, dwarf::DW_FORM_string,
Devang Patel5ccdd102009-09-29 18:40:58 +00001071 GV.getDisplayName());
1072
Devang Patel65dbc902009-11-25 17:36:49 +00001073 StringRef LinkageName = GV.getLinkageName();
Devang Patel351ca332010-01-05 01:46:14 +00001074 if (!LinkageName.empty())
Devang Patel2c4ceb12009-11-21 02:48:08 +00001075 addString(GVDie, dwarf::DW_AT_MIPS_linkage_name, dwarf::DW_FORM_string,
Devang Patel351ca332010-01-05 01:46:14 +00001076 getRealLinkageName(LinkageName));
1077
Devang Patel8a241142009-12-09 18:24:21 +00001078 addType(GVDie, GV.getType());
Bill Wendling0310d762009-05-15 09:23:25 +00001079 if (!GV.isLocalToUnit())
Devang Patel2c4ceb12009-11-21 02:48:08 +00001080 addUInt(GVDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
1081 addSourceLine(GVDie, &GV);
Devang Patelb71a16d2009-10-05 23:22:08 +00001082
Bill Wendling0310d762009-05-15 09:23:25 +00001083 return GVDie;
1084}
1085
Devang Patel2c4ceb12009-11-21 02:48:08 +00001086/// createMemberDIE - Create new member DIE.
Devang Patel8a241142009-12-09 18:24:21 +00001087DIE *DwarfDebug::createMemberDIE(const DIDerivedType &DT) {
Bill Wendling0310d762009-05-15 09:23:25 +00001088 DIE *MemberDie = new DIE(DT.getTag());
Devang Patel65dbc902009-11-25 17:36:49 +00001089 StringRef Name = DT.getName();
1090 if (!Name.empty())
Devang Patel2c4ceb12009-11-21 02:48:08 +00001091 addString(MemberDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
Devang Patel65dbc902009-11-25 17:36:49 +00001092
Devang Patel8a241142009-12-09 18:24:21 +00001093 addType(MemberDie, DT.getTypeDerivedFrom());
Bill Wendling0310d762009-05-15 09:23:25 +00001094
Devang Patel2c4ceb12009-11-21 02:48:08 +00001095 addSourceLine(MemberDie, &DT);
Bill Wendling0310d762009-05-15 09:23:25 +00001096
Devang Patel33db5082009-11-04 22:06:12 +00001097 DIEBlock *MemLocationDie = new DIEBlock();
Devang Patel2c4ceb12009-11-21 02:48:08 +00001098 addUInt(MemLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
Devang Patel33db5082009-11-04 22:06:12 +00001099
Bill Wendling0310d762009-05-15 09:23:25 +00001100 uint64_t Size = DT.getSizeInBits();
Devang Patel61ecbd12009-11-04 23:48:00 +00001101 uint64_t FieldSize = DT.getOriginalTypeSize();
Bill Wendling0310d762009-05-15 09:23:25 +00001102
1103 if (Size != FieldSize) {
1104 // Handle bitfield.
Devang Patel2c4ceb12009-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 Wendling0310d762009-05-15 09:23:25 +00001107
1108 uint64_t Offset = DT.getOffsetInBits();
Bill Wendling0310d762009-05-15 09:23:25 +00001109 uint64_t AlignMask = ~(DT.getAlignInBits() - 1);
1110 uint64_t HiMark = (Offset + FieldSize) & AlignMask;
Benjamin Kramer3d594fd2010-01-07 17:50:57 +00001111 uint64_t FieldOffset = (HiMark - FieldSize);
Bill Wendling0310d762009-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 Patel2c4ceb12009-11-21 02:48:08 +00001116 addUInt(MemberDie, dwarf::DW_AT_bit_offset, 0, Offset);
Bill Wendling0310d762009-05-15 09:23:25 +00001117
Devang Patel33db5082009-11-04 22:06:12 +00001118 // Here WD_AT_data_member_location points to the anonymous
1119 // field that includes this bit field.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001120 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, FieldOffset >> 3);
Devang Patel33db5082009-11-04 22:06:12 +00001121
1122 } else
1123 // This is not a bitfield.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001124 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits() >> 3);
Devang Patel33db5082009-11-04 22:06:12 +00001125
Devang Patel2c4ceb12009-11-21 02:48:08 +00001126 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, MemLocationDie);
Bill Wendling0310d762009-05-15 09:23:25 +00001127
1128 if (DT.isProtected())
Devang Patel5d11eb02009-12-03 19:11:07 +00001129 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
Bill Wendling0310d762009-05-15 09:23:25 +00001130 dwarf::DW_ACCESS_protected);
1131 else if (DT.isPrivate())
Devang Patel5d11eb02009-12-03 19:11:07 +00001132 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
Bill Wendling0310d762009-05-15 09:23:25 +00001133 dwarf::DW_ACCESS_private);
Devang Patel5d11eb02009-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 Wendling0310d762009-05-15 09:23:25 +00001140 return MemberDie;
1141}
1142
Devang Patelffe966c2009-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 Patel65dbc902009-11-25 17:36:49 +00001150 addString(SPDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, SP.getName());
Bill Wendling0310d762009-05-15 09:23:25 +00001151
Devang Patel65dbc902009-11-25 17:36:49 +00001152 StringRef LinkageName = SP.getLinkageName();
Devang Patel351ca332010-01-05 01:46:14 +00001153 if (!LinkageName.empty())
Devang Patel2c4ceb12009-11-21 02:48:08 +00001154 addString(SPDie, dwarf::DW_AT_MIPS_linkage_name, dwarf::DW_FORM_string,
Devang Patel351ca332010-01-05 01:46:14 +00001155 getRealLinkageName(LinkageName));
1156
Devang Patel2c4ceb12009-11-21 02:48:08 +00001157 addSourceLine(SPDie, &SP);
Bill Wendling0310d762009-05-15 09:23:25 +00001158
Bill Wendling0310d762009-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 Patel2c4ceb12009-11-21 02:48:08 +00001163 addUInt(SPDie, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
Bill Wendling0310d762009-05-15 09:23:25 +00001164
1165 // Add Return Type.
Devang Patel1d5cc1d2009-12-03 01:25:38 +00001166 DICompositeType SPTy = SP.getType();
1167 DIArray Args = SPTy.getTypeArray();
Bill Wendling0310d762009-05-15 09:23:25 +00001168 unsigned SPTag = SPTy.getTag();
Devang Patel5d11eb02009-12-03 19:11:07 +00001169
Devang Patel1d5cc1d2009-12-03 01:25:38 +00001170 if (Args.isNull() || SPTag != dwarf::DW_TAG_subroutine_type)
Devang Patel8a241142009-12-09 18:24:21 +00001171 addType(SPDie, SPTy);
Devang Patel1d5cc1d2009-12-03 01:25:38 +00001172 else
Devang Patel8a241142009-12-09 18:24:21 +00001173 addType(SPDie, DIType(Args.getElement(0).getNode()));
Devang Patel1d5cc1d2009-12-03 01:25:38 +00001174
Devang Patel5d11eb02009-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 Patel622b0262010-01-19 06:19:05 +00001182 ContainingTypeMap.insert(std::make_pair(SPDie,
1183 SP.getContainingType().getNode()));
Devang Patel5d11eb02009-12-03 19:11:07 +00001184 }
1185
Devang Patelffe966c2009-12-14 16:18:45 +00001186 if (MakeDecl || !SP.isDefinition()) {
Devang Patel2c4ceb12009-11-21 02:48:08 +00001187 addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
Bill Wendling0310d762009-05-15 09:23:25 +00001188
1189 // Add arguments. Do not add arguments for subprogram definition. They will
Devang Patel1d5cc1d2009-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 Wendling0310d762009-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 Patel8a241142009-12-09 18:24:21 +00001198 addType(Arg, DIType(Args.getElement(i).getNode()));
Devang Patel2c4ceb12009-11-21 02:48:08 +00001199 addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1); // ??
1200 SPDie->addChild(Arg);
Bill Wendling0310d762009-05-15 09:23:25 +00001201 }
1202 }
1203
Bill Wendling0310d762009-05-15 09:23:25 +00001204 // DW_TAG_inlined_subroutine may refer to this DIE.
Devang Patel8a241142009-12-09 18:24:21 +00001205 ModuleCU->insertDIE(SP.getNode(), SPDie);
Bill Wendling0310d762009-05-15 09:23:25 +00001206 return SPDie;
1207}
1208
Devang Patel2c4ceb12009-11-21 02:48:08 +00001209/// findCompileUnit - Get the compile unit for the given descriptor.
Bill Wendling0310d762009-05-15 09:23:25 +00001210///
Devang Pateld037d7a2009-12-11 21:37:07 +00001211CompileUnit *DwarfDebug::findCompileUnit(DICompileUnit Unit) {
Bill Wendling0310d762009-05-15 09:23:25 +00001212 DenseMap<Value *, CompileUnit *>::const_iterator I =
Devang Patele4b27562009-08-28 23:24:31 +00001213 CompileUnitMap.find(Unit.getNode());
Devang Pateld037d7a2009-12-11 21:37:07 +00001214 if (I == CompileUnitMap.end())
1215 return constructCompileUnit(Unit.getNode());
1216 return I->second;
Bill Wendling0310d762009-05-15 09:23:25 +00001217}
1218
Devang Patel53bb5c92009-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 Patelaf9e8472009-10-01 20:31:14 +00001237
1238 DbgScope *Parent = NULL;
Devang Patel53bb5c92009-11-10 23:06:00 +00001239 if (GetConcreteScope) {
Devang Patelc90aefe2009-10-14 21:08:09 +00001240 DILocation IL(InlinedAt);
Jim Grosbach31ef40e2009-11-21 23:12:12 +00001241 Parent = getUpdatedDbgScope(IL.getScope().getNode(), MI,
Devang Patel53bb5c92009-11-10 23:06:00 +00001242 IL.getOrigLocation().getNode());
1243 assert (Parent && "Unable to find Parent scope!");
1244 NScope->setParent(Parent);
Devang Patel2c4ceb12009-11-21 02:48:08 +00001245 Parent->addScope(NScope);
Devang Patel53bb5c92009-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 Patel2c4ceb12009-11-21 02:48:08 +00001251 Parent->addScope(NScope);
Devang Patel53bb5c92009-11-10 23:06:00 +00001252 }
Devang Patelc90aefe2009-10-14 21:08:09 +00001253 }
Devang Patelaf9e8472009-10-01 20:31:14 +00001254
Devang Patelbdf45cb2009-10-27 20:47:17 +00001255 NScope->setFirstInsn(MI);
Devang Patelaf9e8472009-10-01 20:31:14 +00001256
Devang Patel53bb5c92009-11-10 23:06:00 +00001257 if (!Parent && !InlinedAt) {
Devang Patel39ae3ff2009-11-11 00:31:36 +00001258 StringRef SPName = DISubprogram(N).getLinkageName();
1259 if (SPName == MF->getFunction()->getName())
1260 CurrentFnDbgScope = NScope;
Devang Patel53bb5c92009-11-10 23:06:00 +00001261 }
Devang Patelaf9e8472009-10-01 20:31:14 +00001262
Devang Patel53bb5c92009-11-10 23:06:00 +00001263 if (GetConcreteScope) {
1264 ConcreteScopes[InlinedAt] = NScope;
1265 getOrCreateAbstractScope(N);
1266 }
1267
Devang Patelbdf45cb2009-10-27 20:47:17 +00001268 return NScope;
Devang Patelaf9e8472009-10-01 20:31:14 +00001269}
1270
Devang Patel53bb5c92009-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 Grosbach31ef40e2009-11-21 23:12:12 +00001277
Devang Patel53bb5c92009-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 Patel2c4ceb12009-11-21 02:48:08 +00001291 Parent->addScope(AScope);
Devang Patel53bb5c92009-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 Patelaf9e8472009-10-01 20:31:14 +00001298
Jim Grosbach31ef40e2009-11-21 23:12:12 +00001299/// updateSubprogramScopeDIE - Find DIE for the given subprogram and
Devang Patel2c4ceb12009-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 Patel53bb5c92009-11-10 23:06:00 +00001304
Devang Patel017d1212009-11-20 21:37:22 +00001305 DIE *SPDie = ModuleCU->getDIE(SPNode);
Devang Patel53bb5c92009-11-10 23:06:00 +00001306 assert (SPDie && "Unable to find subprogram DIE!");
Devang Patelffe966c2009-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 Patelffe966c2009-12-14 16:18:45 +00001325 ModuleCU->addDie(SPDie);
1326 }
1327
Devang Patel2c4ceb12009-11-21 02:48:08 +00001328 addLabel(SPDie, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
Devang Patel53bb5c92009-11-10 23:06:00 +00001329 DWLabel("func_begin", SubprogramCount));
Devang Patel2c4ceb12009-11-21 02:48:08 +00001330 addLabel(SPDie, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
Devang Patel53bb5c92009-11-10 23:06:00 +00001331 DWLabel("func_end", SubprogramCount));
1332 MachineLocation Location(RI->getFrameRegister(*MF));
Devang Patel2c4ceb12009-11-21 02:48:08 +00001333 addAddress(SPDie, dwarf::DW_AT_frame_base, Location);
Jim Grosbach31ef40e2009-11-21 23:12:12 +00001334
Devang Patel53bb5c92009-11-10 23:06:00 +00001335 if (!DISubprogram(SPNode).isLocalToUnit())
Devang Patel2c4ceb12009-11-21 02:48:08 +00001336 addUInt(SPDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
Devang Patel53bb5c92009-11-10 23:06:00 +00001337
Devang Patel53bb5c92009-11-10 23:06:00 +00001338 return SPDie;
1339}
1340
Jim Grosbach31ef40e2009-11-21 23:12:12 +00001341/// constructLexicalScope - Construct new DW_TAG_lexical_block
Devang Patel2c4ceb12009-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 Patel53bb5c92009-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 Patel2c4ceb12009-11-21 02:48:08 +00001355 addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
Jim Grosbach31ef40e2009-11-21 23:12:12 +00001356 StartID ?
1357 DWLabel("label", StartID)
Devang Patel53bb5c92009-11-10 23:06:00 +00001358 : DWLabel("func_begin", SubprogramCount));
Devang Patel2c4ceb12009-11-21 02:48:08 +00001359 addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
Jim Grosbach31ef40e2009-11-21 23:12:12 +00001360 EndID ?
1361 DWLabel("label", EndID)
Devang Patel53bb5c92009-11-10 23:06:00 +00001362 : DWLabel("func_end", SubprogramCount));
1363
1364
1365
1366 return ScopeDIE;
1367}
1368
Devang Patel2c4ceb12009-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 Patel53bb5c92009-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 Patel017d1212009-11-20 21:37:22 +00001387 DIE *OriginDIE = ModuleCU->getDIE(InlinedSP.getNode());
Devang Patel53bb5c92009-11-10 23:06:00 +00001388 assert (OriginDIE && "Unable to find Origin DIE!");
Devang Patel2c4ceb12009-11-21 02:48:08 +00001389 addDIEEntry(ScopeDIE, dwarf::DW_AT_abstract_origin,
Devang Patel53bb5c92009-11-10 23:06:00 +00001390 dwarf::DW_FORM_ref4, OriginDIE);
1391
Devang Patel2c4ceb12009-11-21 02:48:08 +00001392 addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
Devang Patel53bb5c92009-11-10 23:06:00 +00001393 DWLabel("label", StartID));
Devang Patel2c4ceb12009-11-21 02:48:08 +00001394 addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
Devang Patel53bb5c92009-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 Patel622b0262010-01-19 06:19:05 +00001400 DenseMap<MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator
Devang Patel53bb5c92009-11-10 23:06:00 +00001401 I = InlineInfo.find(InlinedSP.getNode());
1402
1403 if (I == InlineInfo.end()) {
Jim Grosbach7ab38df2009-11-22 19:20:36 +00001404 InlineInfo[InlinedSP.getNode()].push_back(std::make_pair(StartID,
1405 ScopeDIE));
Devang Patel53bb5c92009-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 Patel351ca332010-01-05 01:46:14 +00001411 StringPool.insert(getRealLinkageName(InlinedSP.getLinkageName()));
1412
Devang Patel53bb5c92009-11-10 23:06:00 +00001413 DILocation DL(Scope->getInlinedAt());
Devang Patel2c4ceb12009-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 Patel53bb5c92009-11-10 23:06:00 +00001416
1417 return ScopeDIE;
1418}
1419
Devang Patel2c4ceb12009-11-21 02:48:08 +00001420
1421/// constructVariableDIE - Construct a DIE for the given DbgVariable.
Devang Patel8a241142009-12-09 18:24:21 +00001422DIE *DwarfDebug::constructVariableDIE(DbgVariable *DV, DbgScope *Scope) {
Devang Patel53bb5c92009-11-10 23:06:00 +00001423 // Get the descriptor.
1424 const DIVariable &VD = DV->getVariable();
Devang Patel65dbc902009-11-25 17:36:49 +00001425 StringRef Name = VD.getName();
1426 if (Name.empty())
Devang Patel3fb6bd62009-11-13 02:25:26 +00001427 return NULL;
Devang Patel53bb5c92009-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 Grosbach31ef40e2009-11-21 23:12:12 +00001451
Devang Patel53bb5c92009-11-10 23:06:00 +00001452 if (AbsDIE) {
1453 DIScope DS(Scope->getScopeNode());
1454 DISubprogram InlinedSP = getDISubprogram(DS.getNode());
Devang Patel017d1212009-11-20 21:37:22 +00001455 DIE *OriginSPDIE = ModuleCU->getDIE(InlinedSP.getNode());
Daniel Dunbarc0326792009-11-11 03:09:50 +00001456 (void) OriginSPDIE;
Devang Patel53bb5c92009-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 Patel2c4ceb12009-11-21 02:48:08 +00001460 addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin,
Devang Patel53bb5c92009-11-10 23:06:00 +00001461 dwarf::DW_FORM_ref4, AbsDIE);
1462 }
1463 else {
Devang Patel2c4ceb12009-11-21 02:48:08 +00001464 addString(VariableDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1465 addSourceLine(VariableDie, &VD);
Devang Patel53bb5c92009-11-10 23:06:00 +00001466
1467 // Add variable type.
Jim Grosbach31ef40e2009-11-21 23:12:12 +00001468 // FIXME: isBlockByrefVariable should be reformulated in terms of complex
Devang Patel53bb5c92009-11-10 23:06:00 +00001469 // addresses instead.
1470 if (VD.isBlockByrefVariable())
Devang Patel8a241142009-12-09 18:24:21 +00001471 addType(VariableDie, getBlockByrefType(VD.getType(), Name));
Devang Patel53bb5c92009-11-10 23:06:00 +00001472 else
Devang Patel8a241142009-12-09 18:24:21 +00001473 addType(VariableDie, VD.getType());
Devang Patel53bb5c92009-11-10 23:06:00 +00001474 }
1475
1476 // Add variable address.
1477 if (!Scope->isAbstractScope()) {
1478 MachineLocation Location;
Jim Grosbacha2f20b22009-11-22 20:14:00 +00001479 unsigned FrameReg;
1480 int Offset = RI->getFrameIndexReference(*MF, DV->getFrameIndex(), FrameReg);
1481 Location.set(FrameReg, Offset);
Jim Grosbach31ef40e2009-11-21 23:12:12 +00001482
Devang Patel53bb5c92009-11-10 23:06:00 +00001483 if (VD.hasComplexAddress())
Devang Patel2c4ceb12009-11-21 02:48:08 +00001484 addComplexAddress(DV, VariableDie, dwarf::DW_AT_location, Location);
Devang Patel53bb5c92009-11-10 23:06:00 +00001485 else if (VD.isBlockByrefVariable())
Devang Patel2c4ceb12009-11-21 02:48:08 +00001486 addBlockByrefAddress(DV, VariableDie, dwarf::DW_AT_location, Location);
Devang Patel53bb5c92009-11-10 23:06:00 +00001487 else
Devang Patel2c4ceb12009-11-21 02:48:08 +00001488 addAddress(VariableDie, dwarf::DW_AT_location, Location);
Devang Patel53bb5c92009-11-10 23:06:00 +00001489 }
1490 DV->setDIE(VariableDie);
1491 return VariableDie;
1492
1493}
Devang Patel2c4ceb12009-11-21 02:48:08 +00001494
Devang Patel193f7202009-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 Patel65dbc902009-11-25 17:36:49 +00001510 if (!CATy.isNull() && !CATy.getName().empty()) {
Devang Patel193f7202009-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 Patel2c4ceb12009-11-21 02:48:08 +00001517/// constructScopeDIE - Construct a DIE for this scope.
1518DIE *DwarfDebug::constructScopeDIE(DbgScope *Scope) {
Devang Patel53bb5c92009-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 Patel2c4ceb12009-11-21 02:48:08 +00001527 ScopeDIE = constructInlinedScopeDIE(Scope);
Devang Patel53bb5c92009-11-10 23:06:00 +00001528 else if (DS.isSubprogram()) {
1529 if (Scope->isAbstractScope())
Devang Patel017d1212009-11-20 21:37:22 +00001530 ScopeDIE = ModuleCU->getDIE(DS.getNode());
Devang Patel53bb5c92009-11-10 23:06:00 +00001531 else
Devang Patel2c4ceb12009-11-21 02:48:08 +00001532 ScopeDIE = updateSubprogramScopeDIE(DS.getNode());
Devang Patel53bb5c92009-11-10 23:06:00 +00001533 }
1534 else {
Devang Patel2c4ceb12009-11-21 02:48:08 +00001535 ScopeDIE = constructLexicalScopeDIE(Scope);
Devang Patel53bb5c92009-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 Patel8a241142009-12-09 18:24:21 +00001542 DIE *VariableDIE = constructVariableDIE(Variables[i], Scope);
Jim Grosbach31ef40e2009-11-21 23:12:12 +00001543 if (VariableDIE)
Devang Patel2c4ceb12009-11-21 02:48:08 +00001544 ScopeDIE->addChild(VariableDIE);
Devang Patel53bb5c92009-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 Patel2c4ceb12009-11-21 02:48:08 +00001551 DIE *NestedDIE = constructScopeDIE(Scopes[j]);
Jim Grosbach31ef40e2009-11-21 23:12:12 +00001552 if (NestedDIE)
Devang Patel2c4ceb12009-11-21 02:48:08 +00001553 ScopeDIE->addChild(NestedDIE);
Devang Patel53bb5c92009-11-10 23:06:00 +00001554 }
Devang Patel193f7202009-11-24 01:14:22 +00001555
1556 if (DS.isSubprogram())
1557 addPubTypes(DISubprogram(DS.getNode()));
1558
1559 return ScopeDIE;
Devang Patel53bb5c92009-11-10 23:06:00 +00001560}
1561
Bill Wendlingf0fb9872009-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 Patel65dbc902009-11-25 17:36:49 +00001566unsigned DwarfDebug::GetOrCreateSourceID(StringRef DirName, StringRef FileName) {
Bill Wendlingf0fb9872009-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 Patel6404e4e2009-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 Pateld037d7a2009-12-11 21:37:07 +00001613CompileUnit *DwarfDebug::constructCompileUnit(MDNode *N) {
Devang Patele4b27562009-08-28 23:24:31 +00001614 DICompileUnit DIUnit(N);
Devang Patel65dbc902009-11-25 17:36:49 +00001615 StringRef FN = DIUnit.getFilename();
1616 StringRef Dir = DIUnit.getDirectory();
Devang Patel5ccdd102009-09-29 18:40:58 +00001617 unsigned ID = GetOrCreateSourceID(Dir, FN);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001618
1619 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
Devang Patel2c4ceb12009-11-21 02:48:08 +00001620 addSectionOffset(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4,
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001621 DWLabel("section_line", 0), DWLabel("section_line", 0),
1622 false);
Devang Patel2c4ceb12009-11-21 02:48:08 +00001623 addString(Die, dwarf::DW_AT_producer, dwarf::DW_FORM_string,
Devang Patel5ccdd102009-09-29 18:40:58 +00001624 DIUnit.getProducer());
Devang Patel2c4ceb12009-11-21 02:48:08 +00001625 addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data1,
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001626 DIUnit.getLanguage());
Devang Patel2c4ceb12009-11-21 02:48:08 +00001627 addString(Die, dwarf::DW_AT_name, dwarf::DW_FORM_string, FN);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001628
Devang Patel65dbc902009-11-25 17:36:49 +00001629 if (!Dir.empty())
Devang Patel2c4ceb12009-11-21 02:48:08 +00001630 addString(Die, dwarf::DW_AT_comp_dir, dwarf::DW_FORM_string, Dir);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001631 if (DIUnit.isOptimized())
Devang Patel2c4ceb12009-11-21 02:48:08 +00001632 addUInt(Die, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001633
Devang Patel65dbc902009-11-25 17:36:49 +00001634 StringRef Flags = DIUnit.getFlags();
1635 if (!Flags.empty())
Devang Patel2c4ceb12009-11-21 02:48:08 +00001636 addString(Die, dwarf::DW_AT_APPLE_flags, dwarf::DW_FORM_string, Flags);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001637
1638 unsigned RVer = DIUnit.getRunTimeVersion();
1639 if (RVer)
Devang Patel2c4ceb12009-11-21 02:48:08 +00001640 addUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers,
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001641 dwarf::DW_FORM_data1, RVer);
1642
1643 CompileUnit *Unit = new CompileUnit(ID, Die);
Devang Patel1dbc7712009-06-29 20:45:18 +00001644 if (!ModuleCU && DIUnit.isMain()) {
Devang Patel70f44262009-06-29 20:38:13 +00001645 // Use first compile unit marked as isMain as the compile unit
1646 // for this module.
Devang Patel1dbc7712009-06-29 20:45:18 +00001647 ModuleCU = Unit;
Devang Patel70f44262009-06-29 20:38:13 +00001648 }
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001649
Devang Patele4b27562009-08-28 23:24:31 +00001650 CompileUnitMap[DIUnit.getNode()] = Unit;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001651 CompileUnits.push_back(Unit);
Devang Pateld037d7a2009-12-11 21:37:07 +00001652 return Unit;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001653}
1654
Devang Patel2c4ceb12009-11-21 02:48:08 +00001655void DwarfDebug::constructGlobalVariableDIE(MDNode *N) {
Devang Patele4b27562009-08-28 23:24:31 +00001656 DIGlobalVariable DI_GV(N);
Daniel Dunbarf612ff62009-09-19 20:40:05 +00001657
Devang Patel905cf5e2009-09-04 23:59:07 +00001658 // If debug information is malformed then ignore it.
1659 if (DI_GV.Verify() == false)
1660 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001661
1662 // Check for pre-existence.
Devang Patel017d1212009-11-20 21:37:22 +00001663 if (ModuleCU->getDIE(DI_GV.getNode()))
Devang Patel13e16b62009-06-26 01:49:18 +00001664 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001665
Devang Patel8a241142009-12-09 18:24:21 +00001666 DIE *VariableDie = createGlobalVariableDIE(DI_GV);
Devang Pateledb45632009-12-10 23:25:41 +00001667 if (!VariableDie)
1668 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001669
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001670 // Add to map.
Devang Patel017d1212009-11-20 21:37:22 +00001671 ModuleCU->insertDIE(N, VariableDie);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001672
1673 // Add to context owner.
Devang Patelc9b16cc2010-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 Patel6404e4e2009-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 Lattner858431d2010-01-16 18:50:28 +00001686 Asm->GetGlobalValueSymbol(DI_GV.getGlobal()));
Devang Patel6404e4e2009-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 Lattner858431d2010-01-16 18:50:28 +00001693 Asm->GetGlobalValueSymbol(DI_GV.getGlobal()));
Devang Patel6404e4e2009-12-15 19:16:48 +00001694 addBlock(VariableDie, dwarf::DW_AT_location, 0, Block);
1695 }
Devang Patelc9b16cc2010-01-15 01:12:22 +00001696 addToContextOwner(VariableDie, GVContext);
Devang Patelc366f832009-12-10 19:14:49 +00001697
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001698 // Expose as global. FIXME - need to check external flag.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001699 ModuleCU->addGlobal(DI_GV.getName(), VariableDie);
Devang Patel193f7202009-11-24 01:14:22 +00001700
1701 DIType GTy = DI_GV.getType();
Devang Patel65dbc902009-11-25 17:36:49 +00001702 if (GTy.isCompositeType() && !GTy.getName().empty()) {
Devang Patel193f7202009-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 Patel13e16b62009-06-26 01:49:18 +00001707 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001708}
1709
Devang Patel2c4ceb12009-11-21 02:48:08 +00001710void DwarfDebug::constructSubprogramDIE(MDNode *N) {
Devang Patele4b27562009-08-28 23:24:31 +00001711 DISubprogram SP(N);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001712
1713 // Check for pre-existence.
Devang Patel017d1212009-11-20 21:37:22 +00001714 if (ModuleCU->getDIE(N))
Devang Patel13e16b62009-06-26 01:49:18 +00001715 return;
Bill Wendlingf0fb9872009-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 Patel13e16b62009-06-26 01:49:18 +00001720 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001721
Devang Patel8a241142009-12-09 18:24:21 +00001722 DIE *SubprogramDie = createSubprogramDIE(SP);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001723
1724 // Add to map.
Devang Patel017d1212009-11-20 21:37:22 +00001725 ModuleCU->insertDIE(N, SubprogramDie);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001726
1727 // Add to context owner.
Devang Patel6404e4e2009-12-15 19:16:48 +00001728 addToContextOwner(SubprogramDie, SP.getContext());
Devang Patel0000fad2009-12-08 23:21:45 +00001729
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001730 // Expose as global.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001731 ModuleCU->addGlobal(SP.getName(), SubprogramDie);
Devang Patel193f7202009-11-24 01:14:22 +00001732
Devang Patel13e16b62009-06-26 01:49:18 +00001733 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001734}
1735
Devang Patel2c4ceb12009-11-21 02:48:08 +00001736/// beginModule - Emit all Dwarf sections that should come prior to the
Daniel Dunbar00564992009-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 Patel2c4ceb12009-11-21 02:48:08 +00001739void DwarfDebug::beginModule(Module *M, MachineModuleInfo *mmi) {
Devang Patel208622d2009-06-25 22:36:02 +00001740 this->M = M;
1741
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001742 if (TimePassesIsEnabled)
1743 DebugTimer->startTimer();
1744
Devang Patel3380cc52009-11-11 19:55:08 +00001745 if (!MAI->doesSupportDebugInformation())
1746 return;
1747
Devang Patel78ab9e22009-07-30 18:56:46 +00001748 DebugInfoFinder DbgFinder;
1749 DbgFinder.processModule(*M);
Devang Patel13e16b62009-06-26 01:49:18 +00001750
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001751 // Create all the compile unit DIEs.
Devang Patel78ab9e22009-07-30 18:56:46 +00001752 for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
1753 E = DbgFinder.compile_unit_end(); I != E; ++I)
Devang Patel2c4ceb12009-11-21 02:48:08 +00001754 constructCompileUnit(*I);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001755
1756 if (CompileUnits.empty()) {
1757 if (TimePassesIsEnabled)
1758 DebugTimer->stopTimer();
1759
1760 return;
1761 }
1762
Devang Patel70f44262009-06-29 20:38:13 +00001763 // If main compile unit for this module is not seen than randomly
1764 // select first compile unit.
Devang Patel1dbc7712009-06-29 20:45:18 +00001765 if (!ModuleCU)
1766 ModuleCU = CompileUnits[0];
Devang Patel70f44262009-06-29 20:38:13 +00001767
Devang Patel53bb5c92009-11-10 23:06:00 +00001768 // Create DIEs for each subprogram.
Devang Patel78ab9e22009-07-30 18:56:46 +00001769 for (DebugInfoFinder::iterator I = DbgFinder.subprogram_begin(),
1770 E = DbgFinder.subprogram_end(); I != E; ++I)
Devang Patel2c4ceb12009-11-21 02:48:08 +00001771 constructSubprogramDIE(*I);
Devang Patel13e16b62009-06-26 01:49:18 +00001772
Devang Patelc366f832009-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 Wendlingf0fb9872009-05-20 23:19:06 +00001778 MMI = mmi;
1779 shouldEmit = true;
1780 MMI->setDebugInfoAvailability(true);
1781
1782 // Prime section data.
Chris Lattnerf0144122009-07-28 03:13:23 +00001783 SectionMap.insert(Asm->getObjFileLowering().getTextSection());
Bill Wendlingf0fb9872009-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 Lattner33adcfb2009-08-22 21:43:10 +00001787 if (MAI->hasDotLocAndDotFile()) {
Bill Wendlingf0fb9872009-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 Lattner0ad9c912010-01-22 22:09:00 +00001791 // FIXME: don't use sys::path for this! This should not depend on the
1792 // host.
Bill Wendlingf0fb9872009-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 Lattnera6594fc2010-01-25 18:58:59 +00001798 Asm->OutStreamer.EmitDwarfFileDirective(i, FullPath.str());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001799 }
1800 }
1801
1802 // Emit initial sections
Devang Patel2c4ceb12009-11-21 02:48:08 +00001803 emitInitial();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001804
1805 if (TimePassesIsEnabled)
1806 DebugTimer->stopTimer();
1807}
1808
Devang Patel2c4ceb12009-11-21 02:48:08 +00001809/// endModule - Emit all Dwarf sections that should come after the content.
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001810///
Devang Patel2c4ceb12009-11-21 02:48:08 +00001811void DwarfDebug::endModule() {
Devang Patel6f3dc922009-10-06 00:03:14 +00001812 if (!ModuleCU)
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001813 return;
1814
1815 if (TimePassesIsEnabled)
1816 DebugTimer->startTimer();
1817
Devang Patel53bb5c92009-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 Patel2c4ceb12009-11-21 02:48:08 +00001822 addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
Devang Patel53bb5c92009-11-10 23:06:00 +00001823 }
1824
Devang Patel1d5cc1d2009-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 Patel622b0262010-01-19 06:19:05 +00001830 for (DenseMap<DIE *, MDNode *>::iterator CI = ContainingTypeMap.begin(),
Devang Patel5d11eb02009-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 Patelf8b72ca2010-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 Patel5d11eb02009-12-03 19:11:07 +00001840 }
1841
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001842 // Standard sections final addresses.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00001843 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getTextSection());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001844 EmitLabel("text_end", 0);
Chris Lattner6c2f9e12009-08-19 05:49:37 +00001845 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getDataSection());
Bill Wendlingf0fb9872009-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 Lattner6c2f9e12009-08-19 05:49:37 +00001850 Asm->OutStreamer.SwitchSection(SectionMap[i]);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001851 EmitLabel("section_end", i);
1852 }
1853
1854 // Emit common frame information.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001855 emitCommonDebugFrame();
Bill Wendlingf0fb9872009-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 Patel2c4ceb12009-11-21 02:48:08 +00001860 emitFunctionDebugFrame(*I);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001861
1862 // Compute DIE offsets and sizes.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001863 computeSizeAndOffsets();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001864
1865 // Emit all the DIEs into a debug info section
Devang Patel2c4ceb12009-11-21 02:48:08 +00001866 emitDebugInfo();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001867
1868 // Corresponding abbreviations into a abbrev section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001869 emitAbbreviations();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001870
1871 // Emit source line correspondence into a debug line section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001872 emitDebugLines();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001873
1874 // Emit info into a debug pubnames section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001875 emitDebugPubNames();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001876
Devang Patel193f7202009-11-24 01:14:22 +00001877 // Emit info into a debug pubtypes section.
1878 emitDebugPubTypes();
1879
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001880 // Emit info into a debug str section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001881 emitDebugStr();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001882
1883 // Emit info into a debug loc section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001884 emitDebugLoc();
Bill Wendlingf0fb9872009-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 Patel2c4ceb12009-11-21 02:48:08 +00001890 emitDebugRanges();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001891
1892 // Emit info into a debug macinfo section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001893 emitDebugMacInfo();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001894
1895 // Emit inline info.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001896 emitDebugInlineInfo();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001897
1898 if (TimePassesIsEnabled)
1899 DebugTimer->stopTimer();
1900}
1901
Devang Patel53bb5c92009-11-10 23:06:00 +00001902/// findAbstractVariable - Find abstract variable, if any, associated with Var.
Jim Grosbach7ab38df2009-11-22 19:20:36 +00001903DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &Var,
1904 unsigned FrameIdx,
Devang Patel53bb5c92009-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 Patel2c4ceb12009-11-21 02:48:08 +00001916 Scope->addVariable(AbsDbgVariable);
Devang Patel53bb5c92009-11-10 23:06:00 +00001917 AbstractVariables[Var.getNode()] = AbsDbgVariable;
1918 return AbsDbgVariable;
1919}
1920
Devang Patel2c4ceb12009-11-21 02:48:08 +00001921/// collectVariableInfo - Populate DbgScope entries with variables' info.
1922void DwarfDebug::collectVariableInfo() {
Devang Patelac1ceb32009-10-09 22:42:28 +00001923 if (!MMI) return;
Devang Patel53bb5c92009-11-10 23:06:00 +00001924
Devang Patele717faa2009-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 Patelbc5201f2010-01-22 22:52:10 +00001928 MDNode *Var = VI->first;
Devang Patel53bb5c92009-11-10 23:06:00 +00001929 if (!Var) continue;
Devang Pateleda31212009-10-08 18:48:03 +00001930 DIVariable DV (Var);
Devang Patel53bb5c92009-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 Grosbach31ef40e2009-11-21 23:12:12 +00001937 Scope = DbgScopeMap.lookup(ScopeLoc.getScope().getNode());
Devang Patelfb0ee432009-11-10 23:20:04 +00001938 // If variable scope is not found then skip this variable.
1939 if (!Scope)
1940 continue;
Devang Patel53bb5c92009-11-10 23:06:00 +00001941
1942 DbgVariable *RegVar = new DbgVariable(DV, VP.first);
Devang Patel2c4ceb12009-11-21 02:48:08 +00001943 Scope->addVariable(RegVar);
Jim Grosbach7ab38df2009-11-22 19:20:36 +00001944 if (DbgVariable *AbsDbgVariable = findAbstractVariable(DV, VP.first,
1945 ScopeLoc))
Devang Patel53bb5c92009-11-10 23:06:00 +00001946 RegVar->setAbstractVariable(AbsDbgVariable);
Devang Patele717faa2009-10-06 01:26:37 +00001947 }
1948}
1949
Devang Patel2c4ceb12009-11-21 02:48:08 +00001950/// beginScope - Process beginning of a scope starting at Label.
1951void DwarfDebug::beginScope(const MachineInstr *MI, unsigned Label) {
Devang Patel0d20ac82009-10-06 01:50:42 +00001952 InsnToDbgScopeMapTy::iterator I = DbgScopeBeginMap.find(MI);
1953 if (I == DbgScopeBeginMap.end())
1954 return;
Dan Gohman277207e2009-11-23 21:30:55 +00001955 ScopeVector &SD = I->second;
Devang Patel53bb5c92009-11-10 23:06:00 +00001956 for (ScopeVector::iterator SDI = SD.begin(), SDE = SD.end();
Jim Grosbach31ef40e2009-11-21 23:12:12 +00001957 SDI != SDE; ++SDI)
Devang Patel0d20ac82009-10-06 01:50:42 +00001958 (*SDI)->setStartLabelID(Label);
1959}
1960
Devang Patel2c4ceb12009-11-21 02:48:08 +00001961/// endScope - Process end of a scope.
1962void DwarfDebug::endScope(const MachineInstr *MI) {
Devang Patel0d20ac82009-10-06 01:50:42 +00001963 InsnToDbgScopeMapTy::iterator I = DbgScopeEndMap.find(MI);
Devang Patel8a4087d2009-10-06 03:15:38 +00001964 if (I == DbgScopeEndMap.end())
Devang Patel0d20ac82009-10-06 01:50:42 +00001965 return;
Devang Patel53bb5c92009-11-10 23:06:00 +00001966
1967 unsigned Label = MMI->NextLabelID();
1968 Asm->printLabel(Label);
Dan Gohmaneecb9912009-12-05 01:42:34 +00001969 O << '\n';
Devang Patel53bb5c92009-11-10 23:06:00 +00001970
Devang Patel0d20ac82009-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 Grosbach31ef40e2009-11-21 23:12:12 +00001973 SDI != SDE; ++SDI)
Devang Patel0d20ac82009-10-06 01:50:42 +00001974 (*SDI)->setEndLabelID(Label);
Devang Patel53bb5c92009-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 Grosbach31ef40e2009-11-21 23:12:12 +00001987 if (DIDescriptor(Scope).isLexicalBlock())
Devang Patel2f105c62009-11-11 00:18:40 +00001988 createDbgScope(DILexicalBlock(Scope).getContext().getNode(), NULL);
Devang Patel53bb5c92009-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 Patel0d20ac82009-10-06 01:50:42 +00002000}
2001
Devang Patel2c4ceb12009-11-21 02:48:08 +00002002/// extractScopeInformation - Scan machine instructions in this function
Devang Patelaf9e8472009-10-01 20:31:14 +00002003/// and collect DbgScopes. Return true, if atleast one scope was found.
Chris Lattnereec791a2010-01-26 23:18:02 +00002004bool DwarfDebug::extractScopeInformation() {
Devang Patelaf9e8472009-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 Patel344130e2010-01-04 20:44:00 +00002010 DenseMap<const MachineInstr *, unsigned> MIIndexMap;
2011 unsigned MIIndex = 0;
Devang Patel53bb5c92009-11-10 23:06:00 +00002012 // Scan each instruction and create scopes. First build working set of scopes.
Devang Patelaf9e8472009-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 Patel344130e2010-01-04 20:44:00 +00002018 MIIndexMap[MInsn] = MIIndex++;
Devang Patelaf9e8472009-10-01 20:31:14 +00002019 DebugLoc DL = MInsn->getDebugLoc();
Devang Patel53bb5c92009-11-10 23:06:00 +00002020 if (DL.isUnknown()) continue;
Devang Patel6b61f582010-01-16 06:09:35 +00002021 DILocation DLT = MF->getDILocation(DL);
2022 DIScope DLTScope = DLT.getScope();
2023 if (DLTScope.isNull()) continue;
Devang Patelaf9e8472009-10-01 20:31:14 +00002024 // There is no need to create another DIE for compile unit. For all
Jim Grosbach31ef40e2009-11-21 23:12:12 +00002025 // other scopes, create one DbgScope now. This will be translated
Devang Patelaf9e8472009-10-01 20:31:14 +00002026 // into a scope DIE at the end.
Devang Patel6b61f582010-01-16 06:09:35 +00002027 if (DLTScope.isCompileUnit()) continue;
2028 createDbgScope(DLTScope.getNode(), DLT.getOrigLocation().getNode());
Devang Patel53bb5c92009-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 Patel6b61f582010-01-16 06:09:35 +00002041 DILocation DLT = MF->getDILocation(DL);
2042 DIScope DLTScope = DLT.getScope();
2043 if (DLTScope.isNull()) continue;
Devang Patel53bb5c92009-11-10 23:06:00 +00002044 // There is no need to create another DIE for compile unit. For all
Jim Grosbach31ef40e2009-11-21 23:12:12 +00002045 // other scopes, create one DbgScope now. This will be translated
Devang Patel53bb5c92009-11-10 23:06:00 +00002046 // into a scope DIE at the end.
Devang Patel6b61f582010-01-16 06:09:35 +00002047 if (DLTScope.isCompileUnit()) continue;
2048 DbgScope *Scope = getUpdatedDbgScope(DLTScope.getNode(), MInsn,
2049 DLT.getOrigLocation().getNode());
Devang Patel53bb5c92009-11-10 23:06:00 +00002050 Scope->setLastInsn(MInsn);
Devang Patelaf9e8472009-10-01 20:31:14 +00002051 }
2052 }
2053
Devang Patel344130e2010-01-04 20:44:00 +00002054 if (!CurrentFnDbgScope)
2055 return false;
2056
2057 CurrentFnDbgScope->fixInstructionMarkers(MIIndexMap);
Devang Patelaf9e8472009-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 Patel42aafd72010-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 Patel53bb5c92009-11-10 23:06:00 +00002074 if (S->isAbstractScope())
2075 continue;
Devang Patelaf9e8472009-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 Patel53bb5c92009-11-10 23:06:00 +00002083 DbgScopeBeginMap[MI].push_back(S);
Devang Patelaf9e8472009-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 Patel53bb5c92009-11-10 23:06:00 +00002091 DbgScopeEndMap[MI].push_back(S);
Devang Patelaf9e8472009-10-01 20:31:14 +00002092 }
2093
2094 return !DbgScopeMap.empty();
2095}
2096
Devang Patel2c4ceb12009-11-21 02:48:08 +00002097/// beginFunction - Gather pre-function debug information. Assumes being
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002098/// emitted immediately after the function entry point.
Chris Lattnereec791a2010-01-26 23:18:02 +00002099void DwarfDebug::beginFunction(const MachineFunction *MF) {
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002100 this->MF = MF;
2101
2102 if (!ShouldEmitDwarfDebug()) return;
2103
2104 if (TimePassesIsEnabled)
2105 DebugTimer->startTimer();
2106
Chris Lattnereec791a2010-01-26 23:18:02 +00002107 if (!extractScopeInformation())
Devang Patel60b35bd2009-10-06 18:37:31 +00002108 return;
Devang Patel2c4ceb12009-11-21 02:48:08 +00002109
2110 collectVariableInfo();
Devang Patel60b35bd2009-10-06 18:37:31 +00002111
Bill Wendlingf0fb9872009-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 Patelac1ceb32009-10-09 22:42:28 +00002117 DebugLoc FDL = MF->getDefaultDebugLoc();
2118 if (!FDL.isUnknown()) {
Devang Patel6b61f582010-01-16 06:09:35 +00002119 DILocation DLT = MF->getDILocation(FDL);
Devang Patelac1ceb32009-10-09 22:42:28 +00002120 unsigned LabelID = 0;
Devang Patel6b61f582010-01-16 06:09:35 +00002121 DISubprogram SP = getDISubprogram(DLT.getScope().getNode());
Devang Patelac1ceb32009-10-09 22:42:28 +00002122 if (!SP.isNull())
Devang Patel6b61f582010-01-16 06:09:35 +00002123 LabelID = recordSourceLine(SP.getLineNumber(), 0,
2124 DLT.getScope().getNode());
Devang Patelac1ceb32009-10-09 22:42:28 +00002125 else
Devang Patel6b61f582010-01-16 06:09:35 +00002126 LabelID = recordSourceLine(DLT.getLineNumber(),
2127 DLT.getColumnNumber(),
2128 DLT.getScope().getNode());
Devang Patelac1ceb32009-10-09 22:42:28 +00002129 Asm->printLabel(LabelID);
2130 O << '\n';
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002131 }
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002132 if (TimePassesIsEnabled)
2133 DebugTimer->stopTimer();
2134}
2135
Devang Patel2c4ceb12009-11-21 02:48:08 +00002136/// endFunction - Gather and emit post-function debug information.
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002137///
Chris Lattnereec791a2010-01-26 23:18:02 +00002138void DwarfDebug::endFunction(const MachineFunction *MF) {
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002139 if (!ShouldEmitDwarfDebug()) return;
2140
2141 if (TimePassesIsEnabled)
2142 DebugTimer->startTimer();
2143
Devang Patelac1ceb32009-10-09 22:42:28 +00002144 if (DbgScopeMap.empty())
2145 return;
Devang Patel70d75ca2009-11-12 19:02:56 +00002146
Devang Patel344130e2010-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 Wendlingf0fb9872009-05-20 23:19:06 +00002171 }
2172
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002173 // Clear debug info
Devang Patelf54b8522010-01-19 01:26:02 +00002174 CurrentFnDbgScope = NULL;
2175 DbgScopeMap.clear();
2176 DbgScopeBeginMap.clear();
2177 DbgScopeEndMap.clear();
2178 ConcreteScopes.clear();
2179 AbstractScopesList.clear();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002180 Lines.clear();
Devang Patelc09ddc12009-12-01 18:13:48 +00002181
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002182 if (TimePassesIsEnabled)
2183 DebugTimer->stopTimer();
2184}
2185
Devang Patel2c4ceb12009-11-21 02:48:08 +00002186/// recordSourceLine - Records location information and associates it with a
Bill Wendlingf0fb9872009-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 Grosbach31ef40e2009-11-21 23:12:12 +00002189unsigned DwarfDebug::recordSourceLine(unsigned Line, unsigned Col,
Devang Patelf84548d2009-10-05 18:03:19 +00002190 MDNode *S) {
Devang Patele4b27562009-08-28 23:24:31 +00002191 if (!MMI)
2192 return 0;
2193
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002194 if (TimePassesIsEnabled)
2195 DebugTimer->startTimer();
2196
Devang Patel65dbc902009-11-25 17:36:49 +00002197 StringRef Dir;
2198 StringRef Fn;
Devang Patelf84548d2009-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 Wendlingf0fb9872009-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 Patel5ccdd102009-09-29 18:40:58 +00002236 unsigned SrcId = GetOrCreateSourceID(DirName.c_str(), FileName.c_str());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002237
2238 if (TimePassesIsEnabled)
2239 DebugTimer->stopTimer();
2240
2241 return SrcId;
2242}
2243
Bill Wendling829e67b2009-05-20 23:22:40 +00002244//===----------------------------------------------------------------------===//
2245// Emit Methods
2246//===----------------------------------------------------------------------===//
2247
Devang Patel2c4ceb12009-11-21 02:48:08 +00002248/// computeSizeAndOffset - Compute the size and offset of a DIE.
Bill Wendling94d04b82009-05-20 23:21:38 +00002249///
Jim Grosbach7ab38df2009-11-22 19:20:36 +00002250unsigned
2251DwarfDebug::computeSizeAndOffset(DIE *Die, unsigned Offset, bool Last) {
Bill Wendling94d04b82009-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 Patel2c4ceb12009-11-21 02:48:08 +00002256 if (!Last && !Children.empty()) Die->addSiblingOffset();
Bill Wendling94d04b82009-05-20 23:21:38 +00002257
2258 // Record the abbreviation.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002259 assignAbbrevNumber(Die->getAbbrev());
Bill Wendling94d04b82009-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 Lattneraf76e592009-08-22 20:48:53 +00002269 Offset += MCAsmInfo::getULEB128Size(AbbrevNumber);
Bill Wendling94d04b82009-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 Patel2c4ceb12009-11-21 02:48:08 +00002285 Offset = computeSizeAndOffset(Children[j], Offset, (j + 1) == M);
Bill Wendling94d04b82009-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 Patel2c4ceb12009-11-21 02:48:08 +00002295/// computeSizeAndOffsets - Compute the size and offset of all the DIEs.
Bill Wendling94d04b82009-05-20 23:21:38 +00002296///
Devang Patel2c4ceb12009-11-21 02:48:08 +00002297void DwarfDebug::computeSizeAndOffsets() {
Bill Wendling94d04b82009-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 Patel2c4ceb12009-11-21 02:48:08 +00002305 computeSizeAndOffset(ModuleCU->getCUDie(), Offset, true);
Devang Patel1dbc7712009-06-29 20:45:18 +00002306 CompileUnitOffsets[ModuleCU] = 0;
Bill Wendling94d04b82009-05-20 23:21:38 +00002307}
2308
Devang Patel2c4ceb12009-11-21 02:48:08 +00002309/// emitInitial - Emit initial Dwarf declarations. This is necessary for cc
Bill Wendling94d04b82009-05-20 23:21:38 +00002310/// tools to recognize the object file contains Dwarf information.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002311void DwarfDebug::emitInitial() {
Bill Wendling94d04b82009-05-20 23:21:38 +00002312 // Check to see if we already emitted intial headers.
2313 if (didInitial) return;
2314 didInitial = true;
2315
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002316 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
Daniel Dunbarf612ff62009-09-19 20:40:05 +00002317
Bill Wendling94d04b82009-05-20 23:21:38 +00002318 // Dwarf sections base addresses.
Chris Lattner33adcfb2009-08-22 21:43:10 +00002319 if (MAI->doesDwarfRequireFrameSection()) {
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002320 Asm->OutStreamer.SwitchSection(TLOF.getDwarfFrameSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002321 EmitLabel("section_debug_frame", 0);
2322 }
2323
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002324 Asm->OutStreamer.SwitchSection(TLOF.getDwarfInfoSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002325 EmitLabel("section_info", 0);
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002326 Asm->OutStreamer.SwitchSection(TLOF.getDwarfAbbrevSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002327 EmitLabel("section_abbrev", 0);
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002328 Asm->OutStreamer.SwitchSection(TLOF.getDwarfARangesSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002329 EmitLabel("section_aranges", 0);
2330
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002331 if (const MCSection *LineInfoDirective = TLOF.getDwarfMacroInfoSection()) {
2332 Asm->OutStreamer.SwitchSection(LineInfoDirective);
Bill Wendling94d04b82009-05-20 23:21:38 +00002333 EmitLabel("section_macinfo", 0);
2334 }
2335
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002336 Asm->OutStreamer.SwitchSection(TLOF.getDwarfLineSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002337 EmitLabel("section_line", 0);
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002338 Asm->OutStreamer.SwitchSection(TLOF.getDwarfLocSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002339 EmitLabel("section_loc", 0);
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002340 Asm->OutStreamer.SwitchSection(TLOF.getDwarfPubNamesSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002341 EmitLabel("section_pubnames", 0);
Devang Patel193f7202009-11-24 01:14:22 +00002342 Asm->OutStreamer.SwitchSection(TLOF.getDwarfPubTypesSection());
2343 EmitLabel("section_pubtypes", 0);
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002344 Asm->OutStreamer.SwitchSection(TLOF.getDwarfStrSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002345 EmitLabel("section_str", 0);
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002346 Asm->OutStreamer.SwitchSection(TLOF.getDwarfRangesSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002347 EmitLabel("section_ranges", 0);
2348
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002349 Asm->OutStreamer.SwitchSection(TLOF.getTextSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002350 EmitLabel("text_begin", 0);
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002351 Asm->OutStreamer.SwitchSection(TLOF.getDataSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002352 EmitLabel("data_begin", 0);
2353}
2354
Devang Patel2c4ceb12009-11-21 02:48:08 +00002355/// emitDIE - Recusively Emits a debug information entry.
Bill Wendling94d04b82009-05-20 23:21:38 +00002356///
Devang Patel2c4ceb12009-11-21 02:48:08 +00002357void DwarfDebug::emitDIE(DIE *Die) {
Bill Wendling94d04b82009-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 Lattner0ad9c912010-01-22 22:09:00 +00002362 Asm->O << '\n';
Bill Wendling94d04b82009-05-20 23:21:38 +00002363
2364 // Emit the code (index) for the abbreviation.
Chris Lattner894d75a2010-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 Wendling94d04b82009-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 Lattnera8013622010-01-24 18:54:17 +00002381 if (Asm->VerboseAsm)
2382 Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr));
2383
Bill Wendling94d04b82009-05-20 23:21:38 +00002384 switch (Attr) {
2385 case dwarf::DW_AT_sibling:
Devang Patel2c4ceb12009-11-21 02:48:08 +00002386 Asm->EmitInt32(Die->getSiblingOffset());
Bill Wendling94d04b82009-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 Patel53bb5c92009-11-10 23:06:00 +00002391 unsigned Addr = Origin->getOffset();
Bill Wendling94d04b82009-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 Lattner3586e5e2010-01-24 19:01:06 +00002398 O << "\n"; // REMOVE This once all EmitValue impls emit their own newline.
Bill Wendling94d04b82009-05-20 23:21:38 +00002399 break;
2400 }
Bill Wendling94d04b82009-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 Patel2c4ceb12009-11-21 02:48:08 +00002408 emitDIE(Children[j]);
Bill Wendling94d04b82009-05-20 23:21:38 +00002409
Chris Lattnerfaca5492010-01-22 23:47:11 +00002410 Asm->EmitInt8(0); EOL("End Of Children Mark");
Bill Wendling94d04b82009-05-20 23:21:38 +00002411 }
2412}
2413
Devang Patel8a241142009-12-09 18:24:21 +00002414/// emitDebugInfo - Emit the debug info section.
Bill Wendling94d04b82009-05-20 23:21:38 +00002415///
Devang Patel8a241142009-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 Wendling94d04b82009-05-20 23:21:38 +00002421
2422 // Emit the compile units header.
Devang Patel8a241142009-12-09 18:24:21 +00002423 EmitLabel("info_begin", ModuleCU->getID());
Bill Wendling94d04b82009-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 Lattnerfaca5492010-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 Wendling94d04b82009-05-20 23:21:38 +00002434 EmitSectionOffset("abbrev_begin", "section_abbrev", 0, 0, true, false);
Chris Lattnerfaca5492010-01-22 23:47:11 +00002435 EOL("Offset Into Abbrev. Section");
2436 Asm->EmitInt8(TD->getPointerSize()); EOL("Address Size (in bytes)");
Bill Wendling94d04b82009-05-20 23:21:38 +00002437
Devang Patel2c4ceb12009-11-21 02:48:08 +00002438 emitDIE(Die);
Bill Wendling94d04b82009-05-20 23:21:38 +00002439 // FIXME - extra padding for gdb bug.
Chris Lattnerfaca5492010-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 Patel8a241142009-12-09 18:24:21 +00002444 EmitLabel("info_end", ModuleCU->getID());
Chris Lattner0ad9c912010-01-22 22:09:00 +00002445 Asm->O << '\n';
Bill Wendling94d04b82009-05-20 23:21:38 +00002446}
2447
Devang Patel2c4ceb12009-11-21 02:48:08 +00002448/// emitAbbreviations - Emit the abbreviation section.
Bill Wendling94d04b82009-05-20 23:21:38 +00002449///
Devang Patel2c4ceb12009-11-21 02:48:08 +00002450void DwarfDebug::emitAbbreviations() const {
Bill Wendling94d04b82009-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 Lattner6c2f9e12009-08-19 05:49:37 +00002454 Asm->OutStreamer.SwitchSection(
2455 Asm->getObjFileLowering().getDwarfAbbrevSection());
Bill Wendling94d04b82009-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 Lattner894d75a2010-01-22 23:18:42 +00002465 EmitULEB128(Abbrev->getNumber(), "Abbreviation Code");
Bill Wendling94d04b82009-05-20 23:21:38 +00002466
2467 // Emit the abbreviations data.
Chris Lattner894d75a2010-01-22 23:18:42 +00002468 Abbrev->Emit(this);
Chris Lattner0ad9c912010-01-22 22:09:00 +00002469 Asm->O << '\n';
Bill Wendling94d04b82009-05-20 23:21:38 +00002470 }
2471
2472 // Mark end of abbreviations.
Chris Lattner894d75a2010-01-22 23:18:42 +00002473 EmitULEB128(0, "EOM(3)");
Bill Wendling94d04b82009-05-20 23:21:38 +00002474
2475 EmitLabel("abbrev_end", 0);
Chris Lattner0ad9c912010-01-22 22:09:00 +00002476 Asm->O << '\n';
Bill Wendling94d04b82009-05-20 23:21:38 +00002477 }
2478}
2479
Devang Patel2c4ceb12009-11-21 02:48:08 +00002480/// emitEndOfLineMatrix - Emit the last address of the section and the end of
Bill Wendling94d04b82009-05-20 23:21:38 +00002481/// the line matrix.
2482///
Devang Patel2c4ceb12009-11-21 02:48:08 +00002483void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) {
Bill Wendling94d04b82009-05-20 23:21:38 +00002484 // Define last address of section.
Chris Lattnerfaca5492010-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 Wendling94d04b82009-05-20 23:21:38 +00002489
2490 // Mark end of matrix.
Chris Lattnerfaca5492010-01-22 23:47:11 +00002491 Asm->EmitInt8(0); EOL("DW_LNE_end_sequence");
Chris Lattner0ad9c912010-01-22 22:09:00 +00002492 Asm->EmitInt8(1);
Chris Lattner894d75a2010-01-22 23:18:42 +00002493 Asm->EmitInt8(1);
Bill Wendling94d04b82009-05-20 23:21:38 +00002494}
2495
Devang Patel2c4ceb12009-11-21 02:48:08 +00002496/// emitDebugLines - Emit source line information.
Bill Wendling94d04b82009-05-20 23:21:38 +00002497///
Devang Patel2c4ceb12009-11-21 02:48:08 +00002498void DwarfDebug::emitDebugLines() {
Bill Wendling94d04b82009-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 Lattner33adcfb2009-08-22 21:43:10 +00002501 if (MAI->hasDotLocAndDotFile())
Bill Wendling94d04b82009-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 Lattner6c2f9e12009-08-19 05:49:37 +00002510 Asm->OutStreamer.SwitchSection(
2511 Asm->getObjFileLowering().getDwarfLineSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002512
2513 // Construct the section header.
2514 EmitDifference("line_end", 0, "line_begin", 0, true);
Chris Lattnerfaca5492010-01-22 23:47:11 +00002515 EOL("Length of Source Line Info");
Bill Wendling94d04b82009-05-20 23:21:38 +00002516 EmitLabel("line_begin", 0);
2517
Chris Lattnerfaca5492010-01-22 23:47:11 +00002518 Asm->EmitInt16(dwarf::DWARF_VERSION); EOL("DWARF version number");
Bill Wendling94d04b82009-05-20 23:21:38 +00002519
2520 EmitDifference("line_prolog_end", 0, "line_prolog_begin", 0, true);
Chris Lattnerfaca5492010-01-22 23:47:11 +00002521 EOL("Prolog Length");
Bill Wendling94d04b82009-05-20 23:21:38 +00002522 EmitLabel("line_prolog_begin", 0);
2523
Chris Lattnerfaca5492010-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 Wendling94d04b82009-05-20 23:21:38 +00002529
2530 // Line number standard opcode encodings argument count
Chris Lattnerfaca5492010-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 Wendling94d04b82009-05-20 23:21:38 +00002540
2541 // Emit directories.
2542 for (unsigned DI = 1, DE = getNumSourceDirectories()+1; DI != DE; ++DI) {
Chris Lattner4cf202b2010-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 Wendling94d04b82009-05-20 23:21:38 +00002546 }
2547
Chris Lattnerfaca5492010-01-22 23:47:11 +00002548 Asm->EmitInt8(0); EOL("End of directories");
Bill Wendling94d04b82009-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 Lattner4cf202b2010-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 Lattner894d75a2010-01-22 23:18:42 +00002558 EmitULEB128(Id.first, "Directory #");
2559 EmitULEB128(0, "Mod date");
2560 EmitULEB128(0, "File size");
Bill Wendling94d04b82009-05-20 23:21:38 +00002561 }
2562
Chris Lattnerfaca5492010-01-22 23:47:11 +00002563 Asm->EmitInt8(0); EOL("End of files");
Bill Wendling94d04b82009-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 Lattner93b6db32009-08-08 23:39:42 +00002574 /*if (Asm->isVerbose()) {
Chris Lattnera87dea42009-07-31 18:48:30 +00002575 const MCSection *S = SectionMap[j + 1];
Chris Lattner33adcfb2009-08-22 21:43:10 +00002576 O << '\t' << MAI->getCommentString() << " Section"
Bill Wendling94d04b82009-05-20 23:21:38 +00002577 << S->getName() << '\n';
Chris Lattner93b6db32009-08-08 23:39:42 +00002578 }*/
Chris Lattner0ad9c912010-01-22 22:09:00 +00002579 Asm->O << '\n';
Bill Wendling94d04b82009-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 Ticec6f9d622009-09-11 18:25:54 +00002591 if (LineInfo.getLine() == 0) continue;
2592
Bill Wendling94d04b82009-05-20 23:21:38 +00002593 if (!Asm->isVerbose())
Chris Lattner0ad9c912010-01-22 22:09:00 +00002594 Asm->O << '\n';
Bill Wendling94d04b82009-05-20 23:21:38 +00002595 else {
2596 std::pair<unsigned, unsigned> SourceID =
2597 getSourceDirectoryAndFileIds(LineInfo.getSourceID());
Chris Lattner33adcfb2009-08-22 21:43:10 +00002598 O << '\t' << MAI->getCommentString() << ' '
Dan Gohmanb3b98212009-12-05 02:00:34 +00002599 << getSourceDirectoryName(SourceID.first) << '/'
Bill Wendling94d04b82009-05-20 23:21:38 +00002600 << getSourceFileName(SourceID.second)
Dan Gohmanb3b98212009-12-05 02:00:34 +00002601 << ':' << utostr_32(LineInfo.getLine()) << '\n';
Bill Wendling94d04b82009-05-20 23:21:38 +00002602 }
2603
2604 // Define the line address.
Chris Lattnerfaca5492010-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 Wendling94d04b82009-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 Lattnerfaca5492010-01-22 23:47:11 +00002613 Asm->EmitInt8(dwarf::DW_LNS_set_file); EOL("DW_LNS_set_file");
Chris Lattner894d75a2010-01-22 23:18:42 +00002614 EmitULEB128(Source, "New Source");
Bill Wendling94d04b82009-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 Lattnerfaca5492010-01-22 23:47:11 +00002629 Asm->EmitInt8(Delta - MinLineDelta); EOL("Line Delta");
Bill Wendling94d04b82009-05-20 23:21:38 +00002630 } else {
2631 // ... otherwise use long hand.
2632 Asm->EmitInt8(dwarf::DW_LNS_advance_line);
Chris Lattnerfaca5492010-01-22 23:47:11 +00002633 EOL("DW_LNS_advance_line");
Chris Lattnerbb9078a2010-01-22 22:56:55 +00002634 EmitSLEB128(Offset, "Line Offset");
Chris Lattnerfaca5492010-01-22 23:47:11 +00002635 Asm->EmitInt8(dwarf::DW_LNS_copy); EOL("DW_LNS_copy");
Bill Wendling94d04b82009-05-20 23:21:38 +00002636 }
2637 } else {
2638 // Copy the previous row (different address or source)
Chris Lattnerfaca5492010-01-22 23:47:11 +00002639 Asm->EmitInt8(dwarf::DW_LNS_copy); EOL("DW_LNS_copy");
Bill Wendling94d04b82009-05-20 23:21:38 +00002640 }
2641 }
2642
Devang Patel2c4ceb12009-11-21 02:48:08 +00002643 emitEndOfLineMatrix(j + 1);
Bill Wendling94d04b82009-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 Patel2c4ceb12009-11-21 02:48:08 +00002650 emitEndOfLineMatrix(1);
Bill Wendling94d04b82009-05-20 23:21:38 +00002651
2652 EmitLabel("line_end", 0);
Chris Lattner0ad9c912010-01-22 22:09:00 +00002653 Asm->O << '\n';
Bill Wendling94d04b82009-05-20 23:21:38 +00002654}
2655
Devang Patel2c4ceb12009-11-21 02:48:08 +00002656/// emitCommonDebugFrame - Emit common frame info into a debug frame section.
Bill Wendling94d04b82009-05-20 23:21:38 +00002657///
Devang Patel2c4ceb12009-11-21 02:48:08 +00002658void DwarfDebug::emitCommonDebugFrame() {
Chris Lattner33adcfb2009-08-22 21:43:10 +00002659 if (!MAI->doesDwarfRequireFrameSection())
Bill Wendling94d04b82009-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 Lattner6c2f9e12009-08-19 05:49:37 +00002668 Asm->OutStreamer.SwitchSection(
2669 Asm->getObjFileLowering().getDwarfFrameSection());
Bill Wendling94d04b82009-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 Lattnerfaca5492010-01-22 23:47:11 +00002674 EOL("Length of Common Information Entry");
Bill Wendling94d04b82009-05-20 23:21:38 +00002675
2676 EmitLabel("debug_frame_common_begin", 0);
2677 Asm->EmitInt32((int)dwarf::DW_CIE_ID);
Chris Lattnerfaca5492010-01-22 23:47:11 +00002678 EOL("CIE Identifier Tag");
Bill Wendling94d04b82009-05-20 23:21:38 +00002679 Asm->EmitInt8(dwarf::DW_CIE_VERSION);
Chris Lattnerfaca5492010-01-22 23:47:11 +00002680 EOL("CIE Version");
Chris Lattner4cf202b2010-01-23 03:11:46 +00002681 Asm->OutStreamer.EmitIntValue(0, 1, /*addrspace*/0); // nul terminator.
Chris Lattnerfaca5492010-01-22 23:47:11 +00002682 EOL("CIE Augmentation");
Chris Lattner894d75a2010-01-22 23:18:42 +00002683 EmitULEB128(1, "CIE Code Alignment Factor");
Chris Lattnerbb9078a2010-01-22 22:56:55 +00002684 EmitSLEB128(stackGrowth, "CIE Data Alignment Factor");
Bill Wendling94d04b82009-05-20 23:21:38 +00002685 Asm->EmitInt8(RI->getDwarfRegNum(RI->getRARegister(), false));
Chris Lattnerfaca5492010-01-22 23:47:11 +00002686 EOL("CIE RA Column");
Bill Wendling94d04b82009-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 Lattner0ad9c912010-01-22 22:09:00 +00002695 Asm->O << '\n';
Bill Wendling94d04b82009-05-20 23:21:38 +00002696}
2697
Devang Patel2c4ceb12009-11-21 02:48:08 +00002698/// emitFunctionDebugFrame - Emit per function frame info into a debug frame
Bill Wendling94d04b82009-05-20 23:21:38 +00002699/// section.
2700void
Devang Patel2c4ceb12009-11-21 02:48:08 +00002701DwarfDebug::emitFunctionDebugFrame(const FunctionDebugFrameInfo&DebugFrameInfo){
Chris Lattner33adcfb2009-08-22 21:43:10 +00002702 if (!MAI->doesDwarfRequireFrameSection())
Bill Wendling94d04b82009-05-20 23:21:38 +00002703 return;
2704
2705 // Start the dwarf frame section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002706 Asm->OutStreamer.SwitchSection(
2707 Asm->getObjFileLowering().getDwarfFrameSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002708
2709 EmitDifference("debug_frame_end", DebugFrameInfo.Number,
2710 "debug_frame_begin", DebugFrameInfo.Number, true);
Chris Lattnerfaca5492010-01-22 23:47:11 +00002711 EOL("Length of Frame Information Entry");
Bill Wendling94d04b82009-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 Lattnerfaca5492010-01-22 23:47:11 +00002717 EOL("FDE CIE offset");
Bill Wendling94d04b82009-05-20 23:21:38 +00002718
2719 EmitReference("func_begin", DebugFrameInfo.Number);
Chris Lattnerfaca5492010-01-22 23:47:11 +00002720 EOL("FDE initial location");
Bill Wendling94d04b82009-05-20 23:21:38 +00002721 EmitDifference("func_end", DebugFrameInfo.Number,
2722 "func_begin", DebugFrameInfo.Number);
Chris Lattnerfaca5492010-01-22 23:47:11 +00002723 EOL("FDE address range");
Bill Wendling94d04b82009-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 Lattner0ad9c912010-01-22 22:09:00 +00002730 Asm->O << '\n';
Bill Wendling94d04b82009-05-20 23:21:38 +00002731}
2732
Devang Patel8a241142009-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 Lattnerfaca5492010-01-22 23:47:11 +00002742 EOL("Length of Public Names Info");
Bill Wendling94d04b82009-05-20 23:21:38 +00002743
Devang Patel8a241142009-12-09 18:24:21 +00002744 EmitLabel("pubnames_begin", ModuleCU->getID());
Bill Wendling94d04b82009-05-20 23:21:38 +00002745
Chris Lattnerfaca5492010-01-22 23:47:11 +00002746 Asm->EmitInt16(dwarf::DWARF_VERSION); EOL("DWARF Version");
Bill Wendling94d04b82009-05-20 23:21:38 +00002747
2748 EmitSectionOffset("info_begin", "section_info",
Devang Patel8a241142009-12-09 18:24:21 +00002749 ModuleCU->getID(), 0, true, false);
Chris Lattnerfaca5492010-01-22 23:47:11 +00002750 EOL("Offset of Compilation Unit Info");
Bill Wendling94d04b82009-05-20 23:21:38 +00002751
Devang Patel8a241142009-12-09 18:24:21 +00002752 EmitDifference("info_end", ModuleCU->getID(), "info_begin", ModuleCU->getID(),
Bill Wendling94d04b82009-05-20 23:21:38 +00002753 true);
Chris Lattnerfaca5492010-01-22 23:47:11 +00002754 EOL("Compilation Unit Length");
Bill Wendling94d04b82009-05-20 23:21:38 +00002755
Devang Patel8a241142009-12-09 18:24:21 +00002756 const StringMap<DIE*> &Globals = ModuleCU->getGlobals();
Bill Wendling94d04b82009-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 Lattnerfaca5492010-01-22 23:47:11 +00002762 Asm->EmitInt32(Entity->getOffset()); EOL("DIE offset");
Chris Lattner4cf202b2010-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 Wendling94d04b82009-05-20 23:21:38 +00002767 }
2768
Chris Lattnerfaca5492010-01-22 23:47:11 +00002769 Asm->EmitInt32(0); EOL("End Mark");
Devang Patel8a241142009-12-09 18:24:21 +00002770 EmitLabel("pubnames_end", ModuleCU->getID());
Chris Lattner0ad9c912010-01-22 22:09:00 +00002771 Asm->O << '\n';
Bill Wendling94d04b82009-05-20 23:21:38 +00002772}
2773
Devang Patel193f7202009-11-24 01:14:22 +00002774void DwarfDebug::emitDebugPubTypes() {
Devang Patelf3a03762009-11-24 19:18:41 +00002775 // Start the dwarf pubnames section.
2776 Asm->OutStreamer.SwitchSection(
2777 Asm->getObjFileLowering().getDwarfPubTypesSection());
Devang Patel193f7202009-11-24 01:14:22 +00002778 EmitDifference("pubtypes_end", ModuleCU->getID(),
2779 "pubtypes_begin", ModuleCU->getID(), true);
Chris Lattnerfaca5492010-01-22 23:47:11 +00002780 EOL("Length of Public Types Info");
Devang Patel193f7202009-11-24 01:14:22 +00002781
2782 EmitLabel("pubtypes_begin", ModuleCU->getID());
2783
Chris Lattnerfaca5492010-01-22 23:47:11 +00002784 Asm->EmitInt16(dwarf::DWARF_VERSION); EOL("DWARF Version");
Devang Patel193f7202009-11-24 01:14:22 +00002785
2786 EmitSectionOffset("info_begin", "section_info",
2787 ModuleCU->getID(), 0, true, false);
Chris Lattnerfaca5492010-01-22 23:47:11 +00002788 EOL("Offset of Compilation ModuleCU Info");
Devang Patel193f7202009-11-24 01:14:22 +00002789
2790 EmitDifference("info_end", ModuleCU->getID(), "info_begin", ModuleCU->getID(),
2791 true);
Chris Lattnerfaca5492010-01-22 23:47:11 +00002792 EOL("Compilation ModuleCU Length");
Devang Patel193f7202009-11-24 01:14:22 +00002793
2794 const StringMap<DIE*> &Globals = ModuleCU->getGlobalTypes();
2795 for (StringMap<DIE*>::const_iterator
2796 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2797 const char *Name = GI->getKeyData();
2798 DIE * Entity = GI->second;
2799
Chris Lattnerfaca5492010-01-22 23:47:11 +00002800 Asm->EmitInt32(Entity->getOffset()); EOL("DIE offset");
Chris Lattner4cf202b2010-01-23 03:11:46 +00002801
2802 if (Asm->VerboseAsm) Asm->OutStreamer.AddComment("External Name");
Devang Patel31acb892010-02-02 03:37:03 +00002803 Asm->OutStreamer.EmitBytes(StringRef(Name, GI->getKeyLength()+1), 0);
Devang Patel193f7202009-11-24 01:14:22 +00002804 }
2805
Chris Lattnerfaca5492010-01-22 23:47:11 +00002806 Asm->EmitInt32(0); EOL("End Mark");
Devang Patel193f7202009-11-24 01:14:22 +00002807 EmitLabel("pubtypes_end", ModuleCU->getID());
Chris Lattner0ad9c912010-01-22 22:09:00 +00002808 Asm->O << '\n';
Devang Patel193f7202009-11-24 01:14:22 +00002809}
2810
Devang Patel2c4ceb12009-11-21 02:48:08 +00002811/// emitDebugStr - Emit visible names into a debug str section.
Bill Wendling94d04b82009-05-20 23:21:38 +00002812///
Devang Patel2c4ceb12009-11-21 02:48:08 +00002813void DwarfDebug::emitDebugStr() {
Bill Wendling94d04b82009-05-20 23:21:38 +00002814 // Check to see if it is worth the effort.
2815 if (!StringPool.empty()) {
2816 // Start the dwarf str section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002817 Asm->OutStreamer.SwitchSection(
2818 Asm->getObjFileLowering().getDwarfStrSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002819
2820 // For each of strings in the string pool.
2821 for (unsigned StringID = 1, N = StringPool.size();
2822 StringID <= N; ++StringID) {
2823 // Emit a label for reference from debug information entries.
2824 EmitLabel("string", StringID);
2825
2826 // Emit the string itself.
2827 const std::string &String = StringPool[StringID];
Chris Lattner4cf202b2010-01-23 03:11:46 +00002828 Asm->OutStreamer.EmitBytes(StringRef(String.c_str(), String.size()+1), 0);
Bill Wendling94d04b82009-05-20 23:21:38 +00002829 }
2830
Chris Lattner0ad9c912010-01-22 22:09:00 +00002831 Asm->O << '\n';
Bill Wendling94d04b82009-05-20 23:21:38 +00002832 }
2833}
2834
Devang Patel2c4ceb12009-11-21 02:48:08 +00002835/// emitDebugLoc - Emit visible names into a debug loc section.
Bill Wendling94d04b82009-05-20 23:21:38 +00002836///
Devang Patel2c4ceb12009-11-21 02:48:08 +00002837void DwarfDebug::emitDebugLoc() {
Bill Wendling94d04b82009-05-20 23:21:38 +00002838 // Start the dwarf loc section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002839 Asm->OutStreamer.SwitchSection(
2840 Asm->getObjFileLowering().getDwarfLocSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002841}
2842
2843/// EmitDebugARanges - Emit visible names into a debug aranges section.
2844///
2845void DwarfDebug::EmitDebugARanges() {
2846 // Start the dwarf aranges section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002847 Asm->OutStreamer.SwitchSection(
2848 Asm->getObjFileLowering().getDwarfARangesSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002849
2850 // FIXME - Mock up
2851#if 0
2852 CompileUnit *Unit = GetBaseCompileUnit();
2853
2854 // Don't include size of length
Chris Lattnerfaca5492010-01-22 23:47:11 +00002855 Asm->EmitInt32(0x1c); EOL("Length of Address Ranges Info");
Bill Wendling94d04b82009-05-20 23:21:38 +00002856
Chris Lattnerfaca5492010-01-22 23:47:11 +00002857 Asm->EmitInt16(dwarf::DWARF_VERSION); EOL("Dwarf Version");
Bill Wendling94d04b82009-05-20 23:21:38 +00002858
2859 EmitReference("info_begin", Unit->getID());
Chris Lattnerfaca5492010-01-22 23:47:11 +00002860 EOL("Offset of Compilation Unit Info");
Bill Wendling94d04b82009-05-20 23:21:38 +00002861
Chris Lattnerfaca5492010-01-22 23:47:11 +00002862 Asm->EmitInt8(TD->getPointerSize()); EOL("Size of Address");
Bill Wendling94d04b82009-05-20 23:21:38 +00002863
Chris Lattnerfaca5492010-01-22 23:47:11 +00002864 Asm->EmitInt8(0); EOL("Size of Segment Descriptor");
Bill Wendling94d04b82009-05-20 23:21:38 +00002865
Chris Lattnerfaca5492010-01-22 23:47:11 +00002866 Asm->EmitInt16(0); EOL("Pad (1)");
2867 Asm->EmitInt16(0); EOL("Pad (2)");
Bill Wendling94d04b82009-05-20 23:21:38 +00002868
2869 // Range 1
Chris Lattnerfaca5492010-01-22 23:47:11 +00002870 EmitReference("text_begin", 0); EOL("Address");
2871 EmitDifference("text_end", 0, "text_begin", 0, true); EOL("Length");
Bill Wendling94d04b82009-05-20 23:21:38 +00002872
Chris Lattnerfaca5492010-01-22 23:47:11 +00002873 Asm->EmitInt32(0); EOL("EOM (1)");
2874 Asm->EmitInt32(0); EOL("EOM (2)");
Bill Wendling94d04b82009-05-20 23:21:38 +00002875#endif
Bill Wendling94d04b82009-05-20 23:21:38 +00002876}
2877
Devang Patel2c4ceb12009-11-21 02:48:08 +00002878/// emitDebugRanges - Emit visible names into a debug ranges section.
Bill Wendling94d04b82009-05-20 23:21:38 +00002879///
Devang Patel2c4ceb12009-11-21 02:48:08 +00002880void DwarfDebug::emitDebugRanges() {
Bill Wendling94d04b82009-05-20 23:21:38 +00002881 // Start the dwarf ranges section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002882 Asm->OutStreamer.SwitchSection(
2883 Asm->getObjFileLowering().getDwarfRangesSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002884}
2885
Devang Patel2c4ceb12009-11-21 02:48:08 +00002886/// emitDebugMacInfo - Emit visible names into a debug macinfo section.
Bill Wendling94d04b82009-05-20 23:21:38 +00002887///
Devang Patel2c4ceb12009-11-21 02:48:08 +00002888void DwarfDebug::emitDebugMacInfo() {
Daniel Dunbarf612ff62009-09-19 20:40:05 +00002889 if (const MCSection *LineInfo =
Chris Lattner18a4c162009-08-02 07:24:22 +00002890 Asm->getObjFileLowering().getDwarfMacroInfoSection()) {
Bill Wendling94d04b82009-05-20 23:21:38 +00002891 // Start the dwarf macinfo section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002892 Asm->OutStreamer.SwitchSection(LineInfo);
Bill Wendling94d04b82009-05-20 23:21:38 +00002893 }
2894}
2895
Devang Patel2c4ceb12009-11-21 02:48:08 +00002896/// emitDebugInlineInfo - Emit inline info using following format.
Bill Wendling94d04b82009-05-20 23:21:38 +00002897/// Section Header:
2898/// 1. length of section
2899/// 2. Dwarf version number
2900/// 3. address size.
2901///
2902/// Entries (one "entry" for each function that was inlined):
2903///
2904/// 1. offset into __debug_str section for MIPS linkage name, if exists;
2905/// otherwise offset into __debug_str for regular function name.
2906/// 2. offset into __debug_str section for regular function name.
2907/// 3. an unsigned LEB128 number indicating the number of distinct inlining
2908/// instances for the function.
2909///
2910/// The rest of the entry consists of a {die_offset, low_pc} pair for each
2911/// inlined instance; the die_offset points to the inlined_subroutine die in the
2912/// __debug_info section, and the low_pc is the starting address for the
2913/// inlining instance.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002914void DwarfDebug::emitDebugInlineInfo() {
Chris Lattner33adcfb2009-08-22 21:43:10 +00002915 if (!MAI->doesDwarfUsesInlineInfoSection())
Bill Wendling94d04b82009-05-20 23:21:38 +00002916 return;
2917
Devang Patel1dbc7712009-06-29 20:45:18 +00002918 if (!ModuleCU)
Bill Wendling94d04b82009-05-20 23:21:38 +00002919 return;
2920
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002921 Asm->OutStreamer.SwitchSection(
2922 Asm->getObjFileLowering().getDwarfDebugInlineSection());
Chris Lattner0ad9c912010-01-22 22:09:00 +00002923
Bill Wendling94d04b82009-05-20 23:21:38 +00002924 EmitDifference("debug_inlined_end", 1,
2925 "debug_inlined_begin", 1, true);
Chris Lattnerfaca5492010-01-22 23:47:11 +00002926 EOL("Length of Debug Inlined Information Entry");
Bill Wendling94d04b82009-05-20 23:21:38 +00002927
2928 EmitLabel("debug_inlined_begin", 1);
2929
Chris Lattnerfaca5492010-01-22 23:47:11 +00002930 Asm->EmitInt16(dwarf::DWARF_VERSION); EOL("Dwarf Version");
2931 Asm->EmitInt8(TD->getPointerSize()); EOL("Address Size (in bytes)");
Bill Wendling94d04b82009-05-20 23:21:38 +00002932
Devang Patel53bb5c92009-11-10 23:06:00 +00002933 for (SmallVector<MDNode *, 4>::iterator I = InlinedSPNodes.begin(),
2934 E = InlinedSPNodes.end(); I != E; ++I) {
Jim Grosbach31ef40e2009-11-21 23:12:12 +00002935
Devang Patel53bb5c92009-11-10 23:06:00 +00002936 MDNode *Node = *I;
Devang Patel622b0262010-01-19 06:19:05 +00002937 DenseMap<MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator II
Jim Grosbach7ab38df2009-11-22 19:20:36 +00002938 = InlineInfo.find(Node);
Devang Patel53bb5c92009-11-10 23:06:00 +00002939 SmallVector<InlineInfoLabels, 4> &Labels = II->second;
Devang Patele4b27562009-08-28 23:24:31 +00002940 DISubprogram SP(Node);
Devang Patel65dbc902009-11-25 17:36:49 +00002941 StringRef LName = SP.getLinkageName();
2942 StringRef Name = SP.getName();
Bill Wendling94d04b82009-05-20 23:21:38 +00002943
Chris Lattner4cf202b2010-01-23 03:11:46 +00002944 if (LName.empty()) {
2945 Asm->OutStreamer.EmitBytes(Name, 0);
2946 Asm->OutStreamer.EmitIntValue(0, 1, 0); // nul terminator.
2947 } else
Devang Patel53bb5c92009-11-10 23:06:00 +00002948 EmitSectionOffset("string", "section_str",
Chris Lattner4cf202b2010-01-23 03:11:46 +00002949 StringPool.idFor(getRealLinkageName(LName)), false, true);
Devang Patel53bb5c92009-11-10 23:06:00 +00002950
Chris Lattnerfaca5492010-01-22 23:47:11 +00002951 EOL("MIPS linkage name");
Devang Patel53bb5c92009-11-10 23:06:00 +00002952 EmitSectionOffset("string", "section_str",
2953 StringPool.idFor(Name), false, true);
Chris Lattnerfaca5492010-01-22 23:47:11 +00002954 EOL("Function name");
Chris Lattner894d75a2010-01-22 23:18:42 +00002955 EmitULEB128(Labels.size(), "Inline count");
Bill Wendling94d04b82009-05-20 23:21:38 +00002956
Devang Patel53bb5c92009-11-10 23:06:00 +00002957 for (SmallVector<InlineInfoLabels, 4>::iterator LI = Labels.begin(),
Bill Wendling94d04b82009-05-20 23:21:38 +00002958 LE = Labels.end(); LI != LE; ++LI) {
Devang Patel53bb5c92009-11-10 23:06:00 +00002959 DIE *SP = LI->second;
Chris Lattnerfaca5492010-01-22 23:47:11 +00002960 Asm->EmitInt32(SP->getOffset()); EOL("DIE offset");
Bill Wendling94d04b82009-05-20 23:21:38 +00002961
2962 if (TD->getPointerSize() == sizeof(int32_t))
Chris Lattner33adcfb2009-08-22 21:43:10 +00002963 O << MAI->getData32bitsDirective();
Bill Wendling94d04b82009-05-20 23:21:38 +00002964 else
Chris Lattner33adcfb2009-08-22 21:43:10 +00002965 O << MAI->getData64bitsDirective();
Bill Wendling94d04b82009-05-20 23:21:38 +00002966
Chris Lattnerfaca5492010-01-22 23:47:11 +00002967 PrintLabelName("label", LI->first); EOL("low_pc");
Bill Wendling94d04b82009-05-20 23:21:38 +00002968 }
2969 }
2970
2971 EmitLabel("debug_inlined_end", 1);
Chris Lattner0ad9c912010-01-22 22:09:00 +00002972 Asm->O << '\n';
Bill Wendling94d04b82009-05-20 23:21:38 +00002973}