blob: 21c7dcb227c586cd0998f12f2781d44f4bdc76d5 [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"
Bill Wendling0310d762009-05-15 09:23:25 +000021#include "llvm/Target/TargetData.h"
22#include "llvm/Target/TargetFrameInfo.h"
Chris Lattnerf0144122009-07-28 03:13:23 +000023#include "llvm/Target/TargetLoweringObjectFile.h"
24#include "llvm/Target/TargetRegisterInfo.h"
Chris Lattner23132b12009-08-24 03:52:50 +000025#include "llvm/ADT/StringExtras.h"
Daniel Dunbar6e4bdfc2009-10-13 06:47:08 +000026#include "llvm/Support/Debug.h"
27#include "llvm/Support/ErrorHandling.h"
Chris Lattner334fd1f2009-09-16 00:08:41 +000028#include "llvm/Support/Mangler.h"
Chris Lattnera87dea42009-07-31 18:48:30 +000029#include "llvm/Support/Timer.h"
30#include "llvm/System/Path.h"
Bill Wendling0310d762009-05-15 09:23:25 +000031using namespace llvm;
32
33static TimerGroup &getDwarfTimerGroup() {
34 static TimerGroup DwarfTimerGroup("Dwarf Debugging");
35 return DwarfTimerGroup;
36}
37
38//===----------------------------------------------------------------------===//
39
40/// Configuration values for initial hash set sizes (log2).
41///
Bill Wendling0310d762009-05-15 09:23:25 +000042static const unsigned InitAbbreviationsSetSize = 9; // log2(512)
Bill Wendling0310d762009-05-15 09:23:25 +000043
44namespace llvm {
45
46//===----------------------------------------------------------------------===//
47/// CompileUnit - This dwarf writer support class manages information associate
48/// with a source file.
Nick Lewycky5f9843f2009-11-17 08:11:44 +000049class CompileUnit {
Bill Wendling0310d762009-05-15 09:23:25 +000050 /// ID - File identifier for source.
51 ///
52 unsigned ID;
53
54 /// Die - Compile unit debug information entry.
55 ///
Devang Patel2c4ceb12009-11-21 02:48:08 +000056 DIE *CUDie;
Bill Wendling0310d762009-05-15 09:23:25 +000057
Devang Patel6f01d9c2009-11-21 00:31:03 +000058 /// IndexTyDie - An anonymous type for index type.
59 DIE *IndexTyDie;
60
Bill Wendling0310d762009-05-15 09:23:25 +000061 /// GVToDieMap - Tracks the mapping of unit level debug informaton
62 /// variables to debug information entries.
Devang Patele4b27562009-08-28 23:24:31 +000063 /// FIXME : Rename GVToDieMap -> NodeToDieMap
Devang Patel017d1212009-11-20 21:37:22 +000064 ValueMap<MDNode *, DIE *> GVToDieMap;
Bill Wendling0310d762009-05-15 09:23:25 +000065
66 /// GVToDIEEntryMap - Tracks the mapping of unit level debug informaton
67 /// descriptors to debug information entries using a DIEEntry proxy.
Devang Patele4b27562009-08-28 23:24:31 +000068 /// FIXME : Rename
Devang Patel017d1212009-11-20 21:37:22 +000069 ValueMap<MDNode *, DIEEntry *> GVToDIEEntryMap;
Bill Wendling0310d762009-05-15 09:23:25 +000070
71 /// Globals - A map of globally visible named entities for this unit.
72 ///
73 StringMap<DIE*> Globals;
74
Devang Patel193f7202009-11-24 01:14:22 +000075 /// GlobalTypes - A map of globally visible types for this unit.
76 ///
77 StringMap<DIE*> GlobalTypes;
78
Bill Wendling0310d762009-05-15 09:23:25 +000079public:
80 CompileUnit(unsigned I, DIE *D)
Devang Patel2c4ceb12009-11-21 02:48:08 +000081 : ID(I), CUDie(D), IndexTyDie(0) {}
82 ~CompileUnit() { delete CUDie; delete IndexTyDie; }
Bill Wendling0310d762009-05-15 09:23:25 +000083
84 // Accessors.
Devang Patel193f7202009-11-24 01:14:22 +000085 unsigned getID() const { return ID; }
86 DIE* getCUDie() const { return CUDie; }
87 const StringMap<DIE*> &getGlobals() const { return Globals; }
88 const StringMap<DIE*> &getGlobalTypes() const { return GlobalTypes; }
Bill Wendling0310d762009-05-15 09:23:25 +000089
90 /// hasContent - Return true if this compile unit has something to write out.
91 ///
Devang Patel2c4ceb12009-11-21 02:48:08 +000092 bool hasContent() const { return !CUDie->getChildren().empty(); }
Bill Wendling0310d762009-05-15 09:23:25 +000093
Devang Patel2c4ceb12009-11-21 02:48:08 +000094 /// addGlobal - Add a new global entity to the compile unit.
Bill Wendling0310d762009-05-15 09:23:25 +000095 ///
Devang Patel2c4ceb12009-11-21 02:48:08 +000096 void addGlobal(const std::string &Name, DIE *Die) { Globals[Name] = Die; }
Bill Wendling0310d762009-05-15 09:23:25 +000097
Devang Patel193f7202009-11-24 01:14:22 +000098 /// addGlobalType - Add a new global type to the compile unit.
99 ///
100 void addGlobalType(const std::string &Name, DIE *Die) {
101 GlobalTypes[Name] = Die;
102 }
103
Devang Patel017d1212009-11-20 21:37:22 +0000104 /// getDIE - Returns the debug information entry map slot for the
Bill Wendling0310d762009-05-15 09:23:25 +0000105 /// specified debug variable.
Devang Patel017d1212009-11-20 21:37:22 +0000106 DIE *getDIE(MDNode *N) { return GVToDieMap.lookup(N); }
Jim Grosbach31ef40e2009-11-21 23:12:12 +0000107
Devang Patel017d1212009-11-20 21:37:22 +0000108 /// insertDIE - Insert DIE into the map.
109 void insertDIE(MDNode *N, DIE *D) {
110 GVToDieMap.insert(std::make_pair(N, D));
111 }
Bill Wendling0310d762009-05-15 09:23:25 +0000112
Devang Patel017d1212009-11-20 21:37:22 +0000113 /// getDIEEntry - Returns the debug information entry for the speciefied
114 /// debug variable.
115 DIEEntry *getDIEEntry(MDNode *N) { return GVToDIEEntryMap.lookup(N); }
116
117 /// insertDIEEntry - Insert debug information entry into the map.
118 void insertDIEEntry(MDNode *N, DIEEntry *E) {
119 GVToDIEEntryMap.insert(std::make_pair(N, E));
Bill Wendling0310d762009-05-15 09:23:25 +0000120 }
121
Devang Patel2c4ceb12009-11-21 02:48:08 +0000122 /// addDie - Adds or interns the DIE to the compile unit.
Bill Wendling0310d762009-05-15 09:23:25 +0000123 ///
Devang Patel2c4ceb12009-11-21 02:48:08 +0000124 void addDie(DIE *Buffer) {
125 this->CUDie->addChild(Buffer);
Bill Wendling0310d762009-05-15 09:23:25 +0000126 }
Devang Patel6f01d9c2009-11-21 00:31:03 +0000127
128 // getIndexTyDie - Get an anonymous type for index type.
129 DIE *getIndexTyDie() {
130 return IndexTyDie;
131 }
132
Jim Grosbach7ab38df2009-11-22 19:20:36 +0000133 // setIndexTyDie - Set D as anonymous type for index which can be reused
134 // later.
Devang Patel6f01d9c2009-11-21 00:31:03 +0000135 void setIndexTyDie(DIE *D) {
136 IndexTyDie = D;
137 }
138
Bill Wendling0310d762009-05-15 09:23:25 +0000139};
140
141//===----------------------------------------------------------------------===//
142/// DbgVariable - This class is used to track local variable information.
143///
Devang Patelf76a3d62009-11-16 21:53:40 +0000144class DbgVariable {
Bill Wendling0310d762009-05-15 09:23:25 +0000145 DIVariable Var; // Variable Descriptor.
146 unsigned FrameIndex; // Variable frame index.
Devang Patel53bb5c92009-11-10 23:06:00 +0000147 DbgVariable *AbstractVar; // Abstract variable for this variable.
148 DIE *TheDIE;
Bill Wendling0310d762009-05-15 09:23:25 +0000149public:
Devang Patel53bb5c92009-11-10 23:06:00 +0000150 DbgVariable(DIVariable V, unsigned I)
151 : Var(V), FrameIndex(I), AbstractVar(0), TheDIE(0) {}
Bill Wendling0310d762009-05-15 09:23:25 +0000152
153 // Accessors.
Devang Patel53bb5c92009-11-10 23:06:00 +0000154 DIVariable getVariable() const { return Var; }
155 unsigned getFrameIndex() const { return FrameIndex; }
156 void setAbstractVariable(DbgVariable *V) { AbstractVar = V; }
157 DbgVariable *getAbstractVariable() const { return AbstractVar; }
158 void setDIE(DIE *D) { TheDIE = D; }
159 DIE *getDIE() const { return TheDIE; }
Bill Wendling0310d762009-05-15 09:23:25 +0000160};
161
162//===----------------------------------------------------------------------===//
163/// DbgScope - This class is used to track scope information.
164///
Devang Patelf76a3d62009-11-16 21:53:40 +0000165class DbgScope {
Bill Wendling0310d762009-05-15 09:23:25 +0000166 DbgScope *Parent; // Parent to this scope.
Jim Grosbach31ef40e2009-11-21 23:12:12 +0000167 DIDescriptor Desc; // Debug info descriptor for scope.
Devang Patel53bb5c92009-11-10 23:06:00 +0000168 WeakVH InlinedAtLocation; // Location at which scope is inlined.
169 bool AbstractScope; // Abstract Scope
Bill Wendling0310d762009-05-15 09:23:25 +0000170 unsigned StartLabelID; // Label ID of the beginning of scope.
171 unsigned EndLabelID; // Label ID of the end of scope.
Devang Pateld38dd112009-10-01 18:25:23 +0000172 const MachineInstr *LastInsn; // Last instruction of this scope.
173 const MachineInstr *FirstInsn; // First instruction of this scope.
Bill Wendling0310d762009-05-15 09:23:25 +0000174 SmallVector<DbgScope *, 4> Scopes; // Scopes defined in scope.
175 SmallVector<DbgVariable *, 8> Variables;// Variables declared in scope.
Daniel Dunbarf612ff62009-09-19 20:40:05 +0000176
Owen Anderson04c05f72009-06-24 22:53:20 +0000177 // Private state for dump()
178 mutable unsigned IndentLevel;
Bill Wendling0310d762009-05-15 09:23:25 +0000179public:
Devang Patelc90aefe2009-10-14 21:08:09 +0000180 DbgScope(DbgScope *P, DIDescriptor D, MDNode *I = 0)
Devang Patel53bb5c92009-11-10 23:06:00 +0000181 : Parent(P), Desc(D), InlinedAtLocation(I), AbstractScope(false),
Jim Grosbach31ef40e2009-11-21 23:12:12 +0000182 StartLabelID(0), EndLabelID(0),
Devang Patelc90aefe2009-10-14 21:08:09 +0000183 LastInsn(0), FirstInsn(0), IndentLevel(0) {}
Bill Wendling0310d762009-05-15 09:23:25 +0000184 virtual ~DbgScope();
185
186 // Accessors.
187 DbgScope *getParent() const { return Parent; }
Devang Patel53bb5c92009-11-10 23:06:00 +0000188 void setParent(DbgScope *P) { Parent = P; }
Bill Wendling0310d762009-05-15 09:23:25 +0000189 DIDescriptor getDesc() const { return Desc; }
Jim Grosbach31ef40e2009-11-21 23:12:12 +0000190 MDNode *getInlinedAt() const {
Devang Patel53bb5c92009-11-10 23:06:00 +0000191 return dyn_cast_or_null<MDNode>(InlinedAtLocation);
Devang Patelc90aefe2009-10-14 21:08:09 +0000192 }
Devang Patel53bb5c92009-11-10 23:06:00 +0000193 MDNode *getScopeNode() const { return Desc.getNode(); }
Bill Wendling0310d762009-05-15 09:23:25 +0000194 unsigned getStartLabelID() const { return StartLabelID; }
195 unsigned getEndLabelID() const { return EndLabelID; }
196 SmallVector<DbgScope *, 4> &getScopes() { return Scopes; }
197 SmallVector<DbgVariable *, 8> &getVariables() { return Variables; }
Bill Wendling0310d762009-05-15 09:23:25 +0000198 void setStartLabelID(unsigned S) { StartLabelID = S; }
199 void setEndLabelID(unsigned E) { EndLabelID = E; }
Devang Pateld38dd112009-10-01 18:25:23 +0000200 void setLastInsn(const MachineInstr *MI) { LastInsn = MI; }
201 const MachineInstr *getLastInsn() { return LastInsn; }
202 void setFirstInsn(const MachineInstr *MI) { FirstInsn = MI; }
Devang Patel53bb5c92009-11-10 23:06:00 +0000203 void setAbstractScope() { AbstractScope = true; }
204 bool isAbstractScope() const { return AbstractScope; }
Devang Pateld38dd112009-10-01 18:25:23 +0000205 const MachineInstr *getFirstInsn() { return FirstInsn; }
Devang Patel53bb5c92009-11-10 23:06:00 +0000206
Devang Patel2c4ceb12009-11-21 02:48:08 +0000207 /// addScope - Add a scope to the scope.
Bill Wendling0310d762009-05-15 09:23:25 +0000208 ///
Devang Patel2c4ceb12009-11-21 02:48:08 +0000209 void addScope(DbgScope *S) { Scopes.push_back(S); }
Bill Wendling0310d762009-05-15 09:23:25 +0000210
Devang Patel2c4ceb12009-11-21 02:48:08 +0000211 /// addVariable - Add a variable to the scope.
Bill Wendling0310d762009-05-15 09:23:25 +0000212 ///
Devang Patel2c4ceb12009-11-21 02:48:08 +0000213 void addVariable(DbgVariable *V) { Variables.push_back(V); }
Bill Wendling0310d762009-05-15 09:23:25 +0000214
Devang Patel2c4ceb12009-11-21 02:48:08 +0000215 void fixInstructionMarkers() {
Devang Patelaf9e8472009-10-01 20:31:14 +0000216 assert (getFirstInsn() && "First instruction is missing!");
217 if (getLastInsn())
218 return;
Jim Grosbach31ef40e2009-11-21 23:12:12 +0000219
Devang Patelaf9e8472009-10-01 20:31:14 +0000220 // If a scope does not have an instruction to mark an end then use
221 // the end of last child scope.
222 SmallVector<DbgScope *, 4> &Scopes = getScopes();
223 assert (!Scopes.empty() && "Inner most scope does not have last insn!");
224 DbgScope *L = Scopes.back();
225 if (!L->getLastInsn())
Devang Patel2c4ceb12009-11-21 02:48:08 +0000226 L->fixInstructionMarkers();
Devang Patelaf9e8472009-10-01 20:31:14 +0000227 setLastInsn(L->getLastInsn());
228 }
229
Bill Wendling0310d762009-05-15 09:23:25 +0000230#ifndef NDEBUG
231 void dump() const;
232#endif
233};
234
235#ifndef NDEBUG
236void DbgScope::dump() const {
Chris Lattnerc281de12009-08-23 00:51:00 +0000237 raw_ostream &err = errs();
238 err.indent(IndentLevel);
Devang Patel53bb5c92009-11-10 23:06:00 +0000239 MDNode *N = Desc.getNode();
240 N->dump();
Chris Lattnerc281de12009-08-23 00:51:00 +0000241 err << " [" << StartLabelID << ", " << EndLabelID << "]\n";
Devang Patel53bb5c92009-11-10 23:06:00 +0000242 if (AbstractScope)
243 err << "Abstract Scope\n";
Bill Wendling0310d762009-05-15 09:23:25 +0000244
245 IndentLevel += 2;
Devang Patel53bb5c92009-11-10 23:06:00 +0000246 if (!Scopes.empty())
247 err << "Children ...\n";
Bill Wendling0310d762009-05-15 09:23:25 +0000248 for (unsigned i = 0, e = Scopes.size(); i != e; ++i)
249 if (Scopes[i] != this)
250 Scopes[i]->dump();
251
252 IndentLevel -= 2;
253}
254#endif
255
Bill Wendling0310d762009-05-15 09:23:25 +0000256DbgScope::~DbgScope() {
257 for (unsigned i = 0, N = Scopes.size(); i < N; ++i)
258 delete Scopes[i];
259 for (unsigned j = 0, M = Variables.size(); j < M; ++j)
260 delete Variables[j];
Bill Wendling0310d762009-05-15 09:23:25 +0000261}
262
263} // end llvm namespace
264
Chris Lattneraf76e592009-08-22 20:48:53 +0000265DwarfDebug::DwarfDebug(raw_ostream &OS, AsmPrinter *A, const MCAsmInfo *T)
Devang Patel1dbc7712009-06-29 20:45:18 +0000266 : Dwarf(OS, A, T, "dbg"), ModuleCU(0),
Bill Wendling0310d762009-05-15 09:23:25 +0000267 AbbreviationsSet(InitAbbreviationsSetSize), Abbreviations(),
Devang Patel2c4ceb12009-11-21 02:48:08 +0000268 DIEValues(), StringPool(),
Bill Wendling0310d762009-05-15 09:23:25 +0000269 SectionSourceLines(), didInitial(false), shouldEmit(false),
Devang Patel53bb5c92009-11-10 23:06:00 +0000270 CurrentFnDbgScope(0), DebugTimer(0) {
Bill Wendling0310d762009-05-15 09:23:25 +0000271 if (TimePassesIsEnabled)
272 DebugTimer = new Timer("Dwarf Debug Writer",
273 getDwarfTimerGroup());
274}
275DwarfDebug::~DwarfDebug() {
Devang Patel2c4ceb12009-11-21 02:48:08 +0000276 for (unsigned j = 0, M = DIEValues.size(); j < M; ++j)
277 delete DIEValues[j];
Bill Wendling0310d762009-05-15 09:23:25 +0000278
Bill Wendling0310d762009-05-15 09:23:25 +0000279 delete DebugTimer;
280}
281
Devang Patel2c4ceb12009-11-21 02:48:08 +0000282/// assignAbbrevNumber - Define a unique number for the abbreviation.
Bill Wendling0310d762009-05-15 09:23:25 +0000283///
Devang Patel2c4ceb12009-11-21 02:48:08 +0000284void DwarfDebug::assignAbbrevNumber(DIEAbbrev &Abbrev) {
Bill Wendling0310d762009-05-15 09:23:25 +0000285 // Profile the node so that we can make it unique.
286 FoldingSetNodeID ID;
287 Abbrev.Profile(ID);
288
289 // Check the set for priors.
290 DIEAbbrev *InSet = AbbreviationsSet.GetOrInsertNode(&Abbrev);
291
292 // If it's newly added.
293 if (InSet == &Abbrev) {
294 // Add to abbreviation list.
295 Abbreviations.push_back(&Abbrev);
296
297 // Assign the vector position + 1 as its number.
298 Abbrev.setNumber(Abbreviations.size());
299 } else {
300 // Assign existing abbreviation number.
301 Abbrev.setNumber(InSet->getNumber());
302 }
303}
304
Devang Patel2c4ceb12009-11-21 02:48:08 +0000305/// createDIEEntry - Creates a new DIEEntry to be a proxy for a debug
Bill Wendling995f80a2009-05-20 23:24:48 +0000306/// information entry.
Devang Patel2c4ceb12009-11-21 02:48:08 +0000307DIEEntry *DwarfDebug::createDIEEntry(DIE *Entry) {
Devang Patel6f01d9c2009-11-21 00:31:03 +0000308 DIEEntry *Value = new DIEEntry(Entry);
Devang Patel2c4ceb12009-11-21 02:48:08 +0000309 DIEValues.push_back(Value);
Bill Wendling0310d762009-05-15 09:23:25 +0000310 return Value;
311}
312
Devang Patel2c4ceb12009-11-21 02:48:08 +0000313/// addUInt - Add an unsigned integer attribute data and value.
Bill Wendling0310d762009-05-15 09:23:25 +0000314///
Devang Patel2c4ceb12009-11-21 02:48:08 +0000315void DwarfDebug::addUInt(DIE *Die, unsigned Attribute,
Bill Wendling0310d762009-05-15 09:23:25 +0000316 unsigned Form, uint64_t Integer) {
317 if (!Form) Form = DIEInteger::BestForm(false, Integer);
Devang Patel6f01d9c2009-11-21 00:31:03 +0000318 DIEValue *Value = new DIEInteger(Integer);
Devang Patel2c4ceb12009-11-21 02:48:08 +0000319 DIEValues.push_back(Value);
320 Die->addValue(Attribute, Form, Value);
Bill Wendling0310d762009-05-15 09:23:25 +0000321}
322
Devang Patel2c4ceb12009-11-21 02:48:08 +0000323/// addSInt - Add an signed integer attribute data and value.
Bill Wendling0310d762009-05-15 09:23:25 +0000324///
Devang Patel2c4ceb12009-11-21 02:48:08 +0000325void DwarfDebug::addSInt(DIE *Die, unsigned Attribute,
Bill Wendling0310d762009-05-15 09:23:25 +0000326 unsigned Form, int64_t Integer) {
327 if (!Form) Form = DIEInteger::BestForm(true, Integer);
Devang Patel6f01d9c2009-11-21 00:31:03 +0000328 DIEValue *Value = new DIEInteger(Integer);
Devang Patel2c4ceb12009-11-21 02:48:08 +0000329 DIEValues.push_back(Value);
330 Die->addValue(Attribute, Form, Value);
Bill Wendling0310d762009-05-15 09:23:25 +0000331}
332
Devang Patel69f57b12009-12-02 15:25:16 +0000333/// addString - Add a string attribute data and value. DIEString only
334/// keeps string reference.
Devang Patel2c4ceb12009-11-21 02:48:08 +0000335void DwarfDebug::addString(DIE *Die, unsigned Attribute, unsigned Form,
Devang Patele9a05972009-11-24 19:42:17 +0000336 const StringRef String) {
Devang Patel6f01d9c2009-11-21 00:31:03 +0000337 DIEValue *Value = new DIEString(String);
Devang Patel2c4ceb12009-11-21 02:48:08 +0000338 DIEValues.push_back(Value);
339 Die->addValue(Attribute, Form, Value);
Bill Wendling0310d762009-05-15 09:23:25 +0000340}
341
Devang Patel2c4ceb12009-11-21 02:48:08 +0000342/// addLabel - Add a Dwarf label attribute data and value.
Bill Wendling0310d762009-05-15 09:23:25 +0000343///
Devang Patel2c4ceb12009-11-21 02:48:08 +0000344void DwarfDebug::addLabel(DIE *Die, unsigned Attribute, unsigned Form,
Bill Wendling0310d762009-05-15 09:23:25 +0000345 const DWLabel &Label) {
Devang Patel6f01d9c2009-11-21 00:31:03 +0000346 DIEValue *Value = new DIEDwarfLabel(Label);
Devang Patel2c4ceb12009-11-21 02:48:08 +0000347 DIEValues.push_back(Value);
348 Die->addValue(Attribute, Form, Value);
Bill Wendling0310d762009-05-15 09:23:25 +0000349}
350
Devang Patel2c4ceb12009-11-21 02:48:08 +0000351/// addObjectLabel - Add an non-Dwarf label attribute data and value.
Bill Wendling0310d762009-05-15 09:23:25 +0000352///
Devang Patel2c4ceb12009-11-21 02:48:08 +0000353void DwarfDebug::addObjectLabel(DIE *Die, unsigned Attribute, unsigned Form,
Bill Wendling0310d762009-05-15 09:23:25 +0000354 const std::string &Label) {
Devang Patel6f01d9c2009-11-21 00:31:03 +0000355 DIEValue *Value = new DIEObjectLabel(Label);
Devang Patel2c4ceb12009-11-21 02:48:08 +0000356 DIEValues.push_back(Value);
357 Die->addValue(Attribute, Form, Value);
Bill Wendling0310d762009-05-15 09:23:25 +0000358}
359
Devang Patel2c4ceb12009-11-21 02:48:08 +0000360/// addSectionOffset - Add a section offset label attribute data and value.
Bill Wendling0310d762009-05-15 09:23:25 +0000361///
Devang Patel2c4ceb12009-11-21 02:48:08 +0000362void DwarfDebug::addSectionOffset(DIE *Die, unsigned Attribute, unsigned Form,
Bill Wendling0310d762009-05-15 09:23:25 +0000363 const DWLabel &Label, const DWLabel &Section,
364 bool isEH, bool useSet) {
Devang Patel6f01d9c2009-11-21 00:31:03 +0000365 DIEValue *Value = new DIESectionOffset(Label, Section, isEH, useSet);
Devang Patel2c4ceb12009-11-21 02:48:08 +0000366 DIEValues.push_back(Value);
367 Die->addValue(Attribute, Form, Value);
Bill Wendling0310d762009-05-15 09:23:25 +0000368}
369
Devang Patel2c4ceb12009-11-21 02:48:08 +0000370/// addDelta - Add a label delta attribute data and value.
Bill Wendling0310d762009-05-15 09:23:25 +0000371///
Devang Patel2c4ceb12009-11-21 02:48:08 +0000372void DwarfDebug::addDelta(DIE *Die, unsigned Attribute, unsigned Form,
Bill Wendling0310d762009-05-15 09:23:25 +0000373 const DWLabel &Hi, const DWLabel &Lo) {
Devang Patel6f01d9c2009-11-21 00:31:03 +0000374 DIEValue *Value = new DIEDelta(Hi, Lo);
Devang Patel2c4ceb12009-11-21 02:48:08 +0000375 DIEValues.push_back(Value);
376 Die->addValue(Attribute, Form, Value);
Bill Wendling0310d762009-05-15 09:23:25 +0000377}
378
Devang Patel2c4ceb12009-11-21 02:48:08 +0000379/// addBlock - Add block data.
Bill Wendling0310d762009-05-15 09:23:25 +0000380///
Devang Patel2c4ceb12009-11-21 02:48:08 +0000381void DwarfDebug::addBlock(DIE *Die, unsigned Attribute, unsigned Form,
Bill Wendling0310d762009-05-15 09:23:25 +0000382 DIEBlock *Block) {
383 Block->ComputeSize(TD);
Devang Patel2c4ceb12009-11-21 02:48:08 +0000384 DIEValues.push_back(Block);
385 Die->addValue(Attribute, Block->BestForm(), Block);
Bill Wendling0310d762009-05-15 09:23:25 +0000386}
387
Devang Patel2c4ceb12009-11-21 02:48:08 +0000388/// addSourceLine - Add location information to specified debug information
Bill Wendling0310d762009-05-15 09:23:25 +0000389/// entry.
Devang Patel2c4ceb12009-11-21 02:48:08 +0000390void DwarfDebug::addSourceLine(DIE *Die, const DIVariable *V) {
Bill Wendling0310d762009-05-15 09:23:25 +0000391 // If there is no compile unit specified, don't add a line #.
392 if (V->getCompileUnit().isNull())
393 return;
394
395 unsigned Line = V->getLineNumber();
Devang Patel2c4ceb12009-11-21 02:48:08 +0000396 unsigned FileID = findCompileUnit(V->getCompileUnit()).getID();
Bill Wendling0310d762009-05-15 09:23:25 +0000397 assert(FileID && "Invalid file id");
Devang Patel2c4ceb12009-11-21 02:48:08 +0000398 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
399 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
Bill Wendling0310d762009-05-15 09:23:25 +0000400}
401
Devang Patel2c4ceb12009-11-21 02:48:08 +0000402/// addSourceLine - Add location information to specified debug information
Bill Wendling0310d762009-05-15 09:23:25 +0000403/// entry.
Devang Patel2c4ceb12009-11-21 02:48:08 +0000404void DwarfDebug::addSourceLine(DIE *Die, const DIGlobal *G) {
Bill Wendling0310d762009-05-15 09:23:25 +0000405 // If there is no compile unit specified, don't add a line #.
406 if (G->getCompileUnit().isNull())
407 return;
408
409 unsigned Line = G->getLineNumber();
Devang Patel2c4ceb12009-11-21 02:48:08 +0000410 unsigned FileID = findCompileUnit(G->getCompileUnit()).getID();
Bill Wendling0310d762009-05-15 09:23:25 +0000411 assert(FileID && "Invalid file id");
Devang Patel2c4ceb12009-11-21 02:48:08 +0000412 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
413 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
Bill Wendling0310d762009-05-15 09:23:25 +0000414}
Devang Patel82dfc0c2009-08-31 22:47:13 +0000415
Devang Patel2c4ceb12009-11-21 02:48:08 +0000416/// addSourceLine - Add location information to specified debug information
Devang Patel82dfc0c2009-08-31 22:47:13 +0000417/// entry.
Devang Patel2c4ceb12009-11-21 02:48:08 +0000418void DwarfDebug::addSourceLine(DIE *Die, const DISubprogram *SP) {
Devang Patel82dfc0c2009-08-31 22:47:13 +0000419 // If there is no compile unit specified, don't add a line #.
420 if (SP->getCompileUnit().isNull())
421 return;
Caroline Ticec6f9d622009-09-11 18:25:54 +0000422 // If the line number is 0, don't add it.
423 if (SP->getLineNumber() == 0)
424 return;
425
Devang Patel82dfc0c2009-08-31 22:47:13 +0000426
427 unsigned Line = SP->getLineNumber();
Devang Patel2c4ceb12009-11-21 02:48:08 +0000428 unsigned FileID = findCompileUnit(SP->getCompileUnit()).getID();
Devang Patel82dfc0c2009-08-31 22:47:13 +0000429 assert(FileID && "Invalid file id");
Devang Patel2c4ceb12009-11-21 02:48:08 +0000430 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
431 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
Devang Patel82dfc0c2009-08-31 22:47:13 +0000432}
433
Devang Patel2c4ceb12009-11-21 02:48:08 +0000434/// addSourceLine - Add location information to specified debug information
Devang Patel82dfc0c2009-08-31 22:47:13 +0000435/// entry.
Devang Patel2c4ceb12009-11-21 02:48:08 +0000436void DwarfDebug::addSourceLine(DIE *Die, const DIType *Ty) {
Bill Wendling0310d762009-05-15 09:23:25 +0000437 // If there is no compile unit specified, don't add a line #.
438 DICompileUnit CU = Ty->getCompileUnit();
439 if (CU.isNull())
440 return;
441
442 unsigned Line = Ty->getLineNumber();
Devang Patel2c4ceb12009-11-21 02:48:08 +0000443 unsigned FileID = findCompileUnit(CU).getID();
Bill Wendling0310d762009-05-15 09:23:25 +0000444 assert(FileID && "Invalid file id");
Devang Patel2c4ceb12009-11-21 02:48:08 +0000445 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
446 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
Bill Wendling0310d762009-05-15 09:23:25 +0000447}
448
Caroline Ticedc8f6042009-08-31 21:19:37 +0000449/* Byref variables, in Blocks, are declared by the programmer as
450 "SomeType VarName;", but the compiler creates a
451 __Block_byref_x_VarName struct, and gives the variable VarName
452 either the struct, or a pointer to the struct, as its type. This
453 is necessary for various behind-the-scenes things the compiler
454 needs to do with by-reference variables in blocks.
455
456 However, as far as the original *programmer* is concerned, the
457 variable should still have type 'SomeType', as originally declared.
458
459 The following function dives into the __Block_byref_x_VarName
460 struct to find the original type of the variable. This will be
461 passed back to the code generating the type for the Debug
462 Information Entry for the variable 'VarName'. 'VarName' will then
463 have the original type 'SomeType' in its debug information.
464
465 The original type 'SomeType' will be the type of the field named
466 'VarName' inside the __Block_byref_x_VarName struct.
467
468 NOTE: In order for this to not completely fail on the debugger
469 side, the Debug Information Entry for the variable VarName needs to
470 have a DW_AT_location that tells the debugger how to unwind through
471 the pointers and __Block_byref_x_VarName struct to find the actual
Devang Patel2c4ceb12009-11-21 02:48:08 +0000472 value of the variable. The function addBlockByrefType does this. */
Caroline Ticedc8f6042009-08-31 21:19:37 +0000473
474/// Find the type the programmer originally declared the variable to be
475/// and return that type.
476///
Devang Patel2c4ceb12009-11-21 02:48:08 +0000477DIType DwarfDebug::getBlockByrefType(DIType Ty, std::string Name) {
Caroline Ticedc8f6042009-08-31 21:19:37 +0000478
479 DIType subType = Ty;
480 unsigned tag = Ty.getTag();
481
482 if (tag == dwarf::DW_TAG_pointer_type) {
Mike Stump3e4c9bd2009-09-30 00:08:22 +0000483 DIDerivedType DTy = DIDerivedType(Ty.getNode());
Caroline Ticedc8f6042009-08-31 21:19:37 +0000484 subType = DTy.getTypeDerivedFrom();
485 }
486
487 DICompositeType blockStruct = DICompositeType(subType.getNode());
488
489 DIArray Elements = blockStruct.getTypeArray();
490
491 if (Elements.isNull())
492 return Ty;
493
494 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
495 DIDescriptor Element = Elements.getElement(i);
496 DIDerivedType DT = DIDerivedType(Element.getNode());
Devang Patel65dbc902009-11-25 17:36:49 +0000497 if (Name == DT.getName())
Caroline Ticedc8f6042009-08-31 21:19:37 +0000498 return (DT.getTypeDerivedFrom());
499 }
500
501 return Ty;
502}
503
Devang Patel2c4ceb12009-11-21 02:48:08 +0000504/// addComplexAddress - Start with the address based on the location provided,
Mike Stump3e4c9bd2009-09-30 00:08:22 +0000505/// and generate the DWARF information necessary to find the actual variable
506/// given the extra address information encoded in the DIVariable, starting from
507/// the starting location. Add the DWARF information to the die.
508///
Devang Patel2c4ceb12009-11-21 02:48:08 +0000509void DwarfDebug::addComplexAddress(DbgVariable *&DV, DIE *Die,
Mike Stump3e4c9bd2009-09-30 00:08:22 +0000510 unsigned Attribute,
511 const MachineLocation &Location) {
512 const DIVariable &VD = DV->getVariable();
513 DIType Ty = VD.getType();
514
515 // Decode the original location, and use that as the start of the byref
516 // variable's location.
517 unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
518 DIEBlock *Block = new DIEBlock();
519
520 if (Location.isReg()) {
521 if (Reg < 32) {
Devang Patel2c4ceb12009-11-21 02:48:08 +0000522 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
Mike Stump3e4c9bd2009-09-30 00:08:22 +0000523 } else {
524 Reg = Reg - dwarf::DW_OP_reg0;
Devang Patel2c4ceb12009-11-21 02:48:08 +0000525 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
526 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
Mike Stump3e4c9bd2009-09-30 00:08:22 +0000527 }
528 } else {
529 if (Reg < 32)
Devang Patel2c4ceb12009-11-21 02:48:08 +0000530 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
Mike Stump3e4c9bd2009-09-30 00:08:22 +0000531 else {
Devang Patel2c4ceb12009-11-21 02:48:08 +0000532 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
533 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
Mike Stump3e4c9bd2009-09-30 00:08:22 +0000534 }
535
Devang Patel2c4ceb12009-11-21 02:48:08 +0000536 addUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
Mike Stump3e4c9bd2009-09-30 00:08:22 +0000537 }
538
539 for (unsigned i = 0, N = VD.getNumAddrElements(); i < N; ++i) {
540 uint64_t Element = VD.getAddrElement(i);
541
542 if (Element == DIFactory::OpPlus) {
Devang Patel2c4ceb12009-11-21 02:48:08 +0000543 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
544 addUInt(Block, 0, dwarf::DW_FORM_udata, VD.getAddrElement(++i));
Mike Stump3e4c9bd2009-09-30 00:08:22 +0000545 } else if (Element == DIFactory::OpDeref) {
Devang Patel2c4ceb12009-11-21 02:48:08 +0000546 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Mike Stump3e4c9bd2009-09-30 00:08:22 +0000547 } else llvm_unreachable("unknown DIFactory Opcode");
548 }
549
550 // Now attach the location information to the DIE.
Devang Patel2c4ceb12009-11-21 02:48:08 +0000551 addBlock(Die, Attribute, 0, Block);
Mike Stump3e4c9bd2009-09-30 00:08:22 +0000552}
553
Caroline Ticedc8f6042009-08-31 21:19:37 +0000554/* Byref variables, in Blocks, are declared by the programmer as "SomeType
555 VarName;", but the compiler creates a __Block_byref_x_VarName struct, and
556 gives the variable VarName either the struct, or a pointer to the struct, as
557 its type. This is necessary for various behind-the-scenes things the
558 compiler needs to do with by-reference variables in Blocks.
559
560 However, as far as the original *programmer* is concerned, the variable
561 should still have type 'SomeType', as originally declared.
562
Devang Patel2c4ceb12009-11-21 02:48:08 +0000563 The function getBlockByrefType dives into the __Block_byref_x_VarName
Caroline Ticedc8f6042009-08-31 21:19:37 +0000564 struct to find the original type of the variable, which is then assigned to
565 the variable's Debug Information Entry as its real type. So far, so good.
566 However now the debugger will expect the variable VarName to have the type
567 SomeType. So we need the location attribute for the variable to be an
Daniel Dunbarf612ff62009-09-19 20:40:05 +0000568 expression that explains to the debugger how to navigate through the
Caroline Ticedc8f6042009-08-31 21:19:37 +0000569 pointers and struct to find the actual variable of type SomeType.
570
571 The following function does just that. We start by getting
572 the "normal" location for the variable. This will be the location
573 of either the struct __Block_byref_x_VarName or the pointer to the
574 struct __Block_byref_x_VarName.
575
576 The struct will look something like:
577
578 struct __Block_byref_x_VarName {
579 ... <various fields>
580 struct __Block_byref_x_VarName *forwarding;
581 ... <various other fields>
582 SomeType VarName;
583 ... <maybe more fields>
584 };
585
586 If we are given the struct directly (as our starting point) we
587 need to tell the debugger to:
588
589 1). Add the offset of the forwarding field.
590
591 2). Follow that pointer to get the the real __Block_byref_x_VarName
592 struct to use (the real one may have been copied onto the heap).
593
594 3). Add the offset for the field VarName, to find the actual variable.
595
596 If we started with a pointer to the struct, then we need to
597 dereference that pointer first, before the other steps.
598 Translating this into DWARF ops, we will need to append the following
599 to the current location description for the variable:
600
601 DW_OP_deref -- optional, if we start with a pointer
602 DW_OP_plus_uconst <forward_fld_offset>
603 DW_OP_deref
604 DW_OP_plus_uconst <varName_fld_offset>
605
606 That is what this function does. */
607
Devang Patel2c4ceb12009-11-21 02:48:08 +0000608/// addBlockByrefAddress - Start with the address based on the location
Caroline Ticedc8f6042009-08-31 21:19:37 +0000609/// provided, and generate the DWARF information necessary to find the
610/// actual Block variable (navigating the Block struct) based on the
611/// starting location. Add the DWARF information to the die. For
612/// more information, read large comment just above here.
613///
Devang Patel2c4ceb12009-11-21 02:48:08 +0000614void DwarfDebug::addBlockByrefAddress(DbgVariable *&DV, DIE *Die,
Daniel Dunbar00564992009-09-19 20:40:14 +0000615 unsigned Attribute,
616 const MachineLocation &Location) {
Caroline Ticedc8f6042009-08-31 21:19:37 +0000617 const DIVariable &VD = DV->getVariable();
618 DIType Ty = VD.getType();
619 DIType TmpTy = Ty;
620 unsigned Tag = Ty.getTag();
621 bool isPointer = false;
622
Devang Patel65dbc902009-11-25 17:36:49 +0000623 StringRef varName = VD.getName();
Caroline Ticedc8f6042009-08-31 21:19:37 +0000624
625 if (Tag == dwarf::DW_TAG_pointer_type) {
Mike Stump3e4c9bd2009-09-30 00:08:22 +0000626 DIDerivedType DTy = DIDerivedType(Ty.getNode());
Caroline Ticedc8f6042009-08-31 21:19:37 +0000627 TmpTy = DTy.getTypeDerivedFrom();
628 isPointer = true;
629 }
630
631 DICompositeType blockStruct = DICompositeType(TmpTy.getNode());
632
Daniel Dunbar00564992009-09-19 20:40:14 +0000633 // Find the __forwarding field and the variable field in the __Block_byref
634 // struct.
Daniel Dunbar00564992009-09-19 20:40:14 +0000635 DIArray Fields = blockStruct.getTypeArray();
636 DIDescriptor varField = DIDescriptor();
637 DIDescriptor forwardingField = DIDescriptor();
Caroline Ticedc8f6042009-08-31 21:19:37 +0000638
639
Daniel Dunbar00564992009-09-19 20:40:14 +0000640 for (unsigned i = 0, N = Fields.getNumElements(); i < N; ++i) {
641 DIDescriptor Element = Fields.getElement(i);
642 DIDerivedType DT = DIDerivedType(Element.getNode());
Devang Patel65dbc902009-11-25 17:36:49 +0000643 StringRef fieldName = DT.getName();
644 if (fieldName == "__forwarding")
Daniel Dunbar00564992009-09-19 20:40:14 +0000645 forwardingField = Element;
Devang Patel65dbc902009-11-25 17:36:49 +0000646 else if (fieldName == varName)
Daniel Dunbar00564992009-09-19 20:40:14 +0000647 varField = Element;
648 }
Daniel Dunbarf612ff62009-09-19 20:40:05 +0000649
Mike Stump7e3720d2009-09-24 23:21:26 +0000650 assert(!varField.isNull() && "Can't find byref variable in Block struct");
651 assert(!forwardingField.isNull()
652 && "Can't find forwarding field in Block struct");
Caroline Ticedc8f6042009-08-31 21:19:37 +0000653
Daniel Dunbar00564992009-09-19 20:40:14 +0000654 // Get the offsets for the forwarding field and the variable field.
Daniel Dunbar00564992009-09-19 20:40:14 +0000655 unsigned int forwardingFieldOffset =
656 DIDerivedType(forwardingField.getNode()).getOffsetInBits() >> 3;
657 unsigned int varFieldOffset =
658 DIDerivedType(varField.getNode()).getOffsetInBits() >> 3;
Caroline Ticedc8f6042009-08-31 21:19:37 +0000659
Mike Stump7e3720d2009-09-24 23:21:26 +0000660 // Decode the original location, and use that as the start of the byref
661 // variable's location.
Daniel Dunbar00564992009-09-19 20:40:14 +0000662 unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
663 DIEBlock *Block = new DIEBlock();
Caroline Ticedc8f6042009-08-31 21:19:37 +0000664
Daniel Dunbar00564992009-09-19 20:40:14 +0000665 if (Location.isReg()) {
666 if (Reg < 32)
Devang Patel2c4ceb12009-11-21 02:48:08 +0000667 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
Daniel Dunbar00564992009-09-19 20:40:14 +0000668 else {
669 Reg = Reg - dwarf::DW_OP_reg0;
Devang Patel2c4ceb12009-11-21 02:48:08 +0000670 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
671 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
Daniel Dunbar00564992009-09-19 20:40:14 +0000672 }
673 } else {
674 if (Reg < 32)
Devang Patel2c4ceb12009-11-21 02:48:08 +0000675 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
Daniel Dunbar00564992009-09-19 20:40:14 +0000676 else {
Devang Patel2c4ceb12009-11-21 02:48:08 +0000677 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
678 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
Daniel Dunbar00564992009-09-19 20:40:14 +0000679 }
Caroline Ticedc8f6042009-08-31 21:19:37 +0000680
Devang Patel2c4ceb12009-11-21 02:48:08 +0000681 addUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
Daniel Dunbar00564992009-09-19 20:40:14 +0000682 }
Caroline Ticedc8f6042009-08-31 21:19:37 +0000683
Mike Stump7e3720d2009-09-24 23:21:26 +0000684 // If we started with a pointer to the __Block_byref... struct, then
Daniel Dunbar00564992009-09-19 20:40:14 +0000685 // the first thing we need to do is dereference the pointer (DW_OP_deref).
Daniel Dunbar00564992009-09-19 20:40:14 +0000686 if (isPointer)
Devang Patel2c4ceb12009-11-21 02:48:08 +0000687 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Caroline Ticedc8f6042009-08-31 21:19:37 +0000688
Daniel Dunbar00564992009-09-19 20:40:14 +0000689 // Next add the offset for the '__forwarding' field:
690 // DW_OP_plus_uconst ForwardingFieldOffset. Note there's no point in
691 // adding the offset if it's 0.
Daniel Dunbar00564992009-09-19 20:40:14 +0000692 if (forwardingFieldOffset > 0) {
Devang Patel2c4ceb12009-11-21 02:48:08 +0000693 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
694 addUInt(Block, 0, dwarf::DW_FORM_udata, forwardingFieldOffset);
Daniel Dunbar00564992009-09-19 20:40:14 +0000695 }
Caroline Ticedc8f6042009-08-31 21:19:37 +0000696
Daniel Dunbar00564992009-09-19 20:40:14 +0000697 // Now dereference the __forwarding field to get to the real __Block_byref
698 // struct: DW_OP_deref.
Devang Patel2c4ceb12009-11-21 02:48:08 +0000699 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Caroline Ticedc8f6042009-08-31 21:19:37 +0000700
Daniel Dunbar00564992009-09-19 20:40:14 +0000701 // Now that we've got the real __Block_byref... struct, add the offset
702 // for the variable's field to get to the location of the actual variable:
703 // DW_OP_plus_uconst varFieldOffset. Again, don't add if it's 0.
Daniel Dunbar00564992009-09-19 20:40:14 +0000704 if (varFieldOffset > 0) {
Devang Patel2c4ceb12009-11-21 02:48:08 +0000705 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
706 addUInt(Block, 0, dwarf::DW_FORM_udata, varFieldOffset);
Daniel Dunbar00564992009-09-19 20:40:14 +0000707 }
Caroline Ticedc8f6042009-08-31 21:19:37 +0000708
Daniel Dunbar00564992009-09-19 20:40:14 +0000709 // Now attach the location information to the DIE.
Devang Patel2c4ceb12009-11-21 02:48:08 +0000710 addBlock(Die, Attribute, 0, Block);
Caroline Ticedc8f6042009-08-31 21:19:37 +0000711}
712
Devang Patel2c4ceb12009-11-21 02:48:08 +0000713/// addAddress - Add an address attribute to a die based on the location
Bill Wendling0310d762009-05-15 09:23:25 +0000714/// provided.
Devang Patel2c4ceb12009-11-21 02:48:08 +0000715void DwarfDebug::addAddress(DIE *Die, unsigned Attribute,
Bill Wendling0310d762009-05-15 09:23:25 +0000716 const MachineLocation &Location) {
717 unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
718 DIEBlock *Block = new DIEBlock();
719
720 if (Location.isReg()) {
721 if (Reg < 32) {
Devang Patel2c4ceb12009-11-21 02:48:08 +0000722 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
Bill Wendling0310d762009-05-15 09:23:25 +0000723 } else {
Devang Patel2c4ceb12009-11-21 02:48:08 +0000724 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
725 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
Bill Wendling0310d762009-05-15 09:23:25 +0000726 }
727 } else {
728 if (Reg < 32) {
Devang Patel2c4ceb12009-11-21 02:48:08 +0000729 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
Bill Wendling0310d762009-05-15 09:23:25 +0000730 } else {
Devang Patel2c4ceb12009-11-21 02:48:08 +0000731 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
732 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
Bill Wendling0310d762009-05-15 09:23:25 +0000733 }
734
Devang Patel2c4ceb12009-11-21 02:48:08 +0000735 addUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
Bill Wendling0310d762009-05-15 09:23:25 +0000736 }
737
Devang Patel2c4ceb12009-11-21 02:48:08 +0000738 addBlock(Die, Attribute, 0, Block);
Bill Wendling0310d762009-05-15 09:23:25 +0000739}
740
Devang Patel16ced732009-12-10 18:05:33 +0000741/// getOrCreateTypeDIE - Find existing DIE or create new DIE for the
742/// given DIType.
743DIE *DwarfDebug::getOrCreateTypeDIE(DIType Ty) {
744 DIE *TyDIE = ModuleCU->getDIE(Ty.getNode());
745 if (TyDIE)
746 return TyDIE;
747
748 // Create new type.
749 TyDIE = new DIE(dwarf::DW_TAG_base_type);
750 ModuleCU->insertDIE(Ty.getNode(), TyDIE);
751 if (Ty.isBasicType())
752 constructTypeDIE(*TyDIE, DIBasicType(Ty.getNode()));
753 else if (Ty.isCompositeType())
754 constructTypeDIE(*TyDIE, DICompositeType(Ty.getNode()));
755 else {
756 assert(Ty.isDerivedType() && "Unknown kind of DIType");
757 constructTypeDIE(*TyDIE, DIDerivedType(Ty.getNode()));
758 }
759
760 DIDescriptor Context = Ty.getContext();
761 if (Context.isNull())
762 // Add this type into the module cu.
763 ModuleCU->addDie(TyDIE);
764 else if (Context.isType()) {
765 DIE *ContextDIE = getOrCreateTypeDIE(DIType(Context.getNode()));
766 ContextDIE->addChild(TyDIE);
767 } else if (DIE *ContextDIE = ModuleCU->getDIE(Context.getNode()))
768 ContextDIE->addChild(TyDIE);
769 else
770 ModuleCU->addDie(TyDIE);
771
772 return TyDIE;
773}
774
Devang Patel2c4ceb12009-11-21 02:48:08 +0000775/// addType - Add a new type attribute to the specified entity.
Devang Patel8a241142009-12-09 18:24:21 +0000776void DwarfDebug::addType(DIE *Entity, DIType Ty) {
Bill Wendling0310d762009-05-15 09:23:25 +0000777 if (Ty.isNull())
778 return;
779
780 // Check for pre-existence.
Devang Patel8a241142009-12-09 18:24:21 +0000781 DIEEntry *Entry = ModuleCU->getDIEEntry(Ty.getNode());
Bill Wendling0310d762009-05-15 09:23:25 +0000782
783 // If it exists then use the existing value.
Devang Patel2c4ceb12009-11-21 02:48:08 +0000784 if (Entry) {
785 Entity->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, Entry);
Bill Wendling0310d762009-05-15 09:23:25 +0000786 return;
787 }
788
789 // Set up proxy.
Devang Patel2c4ceb12009-11-21 02:48:08 +0000790 Entry = createDIEEntry();
Devang Patel8a241142009-12-09 18:24:21 +0000791 ModuleCU->insertDIEEntry(Ty.getNode(), Entry);
Bill Wendling0310d762009-05-15 09:23:25 +0000792
793 // Construct type.
Devang Patel16ced732009-12-10 18:05:33 +0000794 DIE *Buffer = getOrCreateTypeDIE(Ty);
Bill Wendling0310d762009-05-15 09:23:25 +0000795
Devang Patel2c4ceb12009-11-21 02:48:08 +0000796 Entry->setEntry(Buffer);
797 Entity->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, Entry);
Bill Wendling0310d762009-05-15 09:23:25 +0000798}
799
Devang Patel2c4ceb12009-11-21 02:48:08 +0000800/// constructTypeDIE - Construct basic type die from DIBasicType.
Devang Patel8a241142009-12-09 18:24:21 +0000801void DwarfDebug::constructTypeDIE(DIE &Buffer, DIBasicType BTy) {
Bill Wendling0310d762009-05-15 09:23:25 +0000802 // Get core information.
Devang Patel65dbc902009-11-25 17:36:49 +0000803 StringRef Name = BTy.getName();
Bill Wendling0310d762009-05-15 09:23:25 +0000804 Buffer.setTag(dwarf::DW_TAG_base_type);
Devang Patel2c4ceb12009-11-21 02:48:08 +0000805 addUInt(&Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
Bill Wendling0310d762009-05-15 09:23:25 +0000806 BTy.getEncoding());
807
808 // Add name if not anonymous or intermediate type.
Devang Patel65dbc902009-11-25 17:36:49 +0000809 if (!Name.empty())
Devang Patel2c4ceb12009-11-21 02:48:08 +0000810 addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
Bill Wendling0310d762009-05-15 09:23:25 +0000811 uint64_t Size = BTy.getSizeInBits() >> 3;
Devang Patel2c4ceb12009-11-21 02:48:08 +0000812 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
Bill Wendling0310d762009-05-15 09:23:25 +0000813}
814
Devang Patel2c4ceb12009-11-21 02:48:08 +0000815/// constructTypeDIE - Construct derived type die from DIDerivedType.
Devang Patel8a241142009-12-09 18:24:21 +0000816void DwarfDebug::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) {
Bill Wendling0310d762009-05-15 09:23:25 +0000817 // Get core information.
Devang Patel65dbc902009-11-25 17:36:49 +0000818 StringRef Name = DTy.getName();
Bill Wendling0310d762009-05-15 09:23:25 +0000819 uint64_t Size = DTy.getSizeInBits() >> 3;
820 unsigned Tag = DTy.getTag();
821
822 // FIXME - Workaround for templates.
823 if (Tag == dwarf::DW_TAG_inheritance) Tag = dwarf::DW_TAG_reference_type;
824
825 Buffer.setTag(Tag);
826
827 // Map to main type, void will not have a type.
828 DIType FromTy = DTy.getTypeDerivedFrom();
Devang Patel8a241142009-12-09 18:24:21 +0000829 addType(&Buffer, FromTy);
Bill Wendling0310d762009-05-15 09:23:25 +0000830
831 // Add name if not anonymous or intermediate type.
Devang Pateldeea5642009-11-30 23:56:56 +0000832 if (!Name.empty())
Devang Patel2c4ceb12009-11-21 02:48:08 +0000833 addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
Bill Wendling0310d762009-05-15 09:23:25 +0000834
835 // Add size if non-zero (derived types might be zero-sized.)
836 if (Size)
Devang Patel2c4ceb12009-11-21 02:48:08 +0000837 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
Bill Wendling0310d762009-05-15 09:23:25 +0000838
839 // Add source line info if available and TyDesc is not a forward declaration.
Devang Patel05f6fa82009-11-23 18:43:37 +0000840 if (!DTy.isForwardDecl())
Devang Patel2c4ceb12009-11-21 02:48:08 +0000841 addSourceLine(&Buffer, &DTy);
Bill Wendling0310d762009-05-15 09:23:25 +0000842}
843
Devang Patel2c4ceb12009-11-21 02:48:08 +0000844/// constructTypeDIE - Construct type DIE from DICompositeType.
Devang Patel8a241142009-12-09 18:24:21 +0000845void DwarfDebug::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
Bill Wendling0310d762009-05-15 09:23:25 +0000846 // Get core information.
Devang Patel65dbc902009-11-25 17:36:49 +0000847 StringRef Name = CTy.getName();
Bill Wendling0310d762009-05-15 09:23:25 +0000848
849 uint64_t Size = CTy.getSizeInBits() >> 3;
850 unsigned Tag = CTy.getTag();
851 Buffer.setTag(Tag);
852
853 switch (Tag) {
854 case dwarf::DW_TAG_vector_type:
855 case dwarf::DW_TAG_array_type:
Devang Patel8a241142009-12-09 18:24:21 +0000856 constructArrayTypeDIE(Buffer, &CTy);
Bill Wendling0310d762009-05-15 09:23:25 +0000857 break;
858 case dwarf::DW_TAG_enumeration_type: {
859 DIArray Elements = CTy.getTypeArray();
860
861 // Add enumerators to enumeration type.
862 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
863 DIE *ElemDie = NULL;
Devang Patele4b27562009-08-28 23:24:31 +0000864 DIEnumerator Enum(Elements.getElement(i).getNode());
Devang Patelc5254722009-10-09 17:51:49 +0000865 if (!Enum.isNull()) {
Devang Patel8a241142009-12-09 18:24:21 +0000866 ElemDie = constructEnumTypeDIE(&Enum);
Devang Patel2c4ceb12009-11-21 02:48:08 +0000867 Buffer.addChild(ElemDie);
Devang Patelc5254722009-10-09 17:51:49 +0000868 }
Bill Wendling0310d762009-05-15 09:23:25 +0000869 }
870 }
871 break;
872 case dwarf::DW_TAG_subroutine_type: {
873 // Add return type.
874 DIArray Elements = CTy.getTypeArray();
875 DIDescriptor RTy = Elements.getElement(0);
Devang Patel8a241142009-12-09 18:24:21 +0000876 addType(&Buffer, DIType(RTy.getNode()));
Bill Wendling0310d762009-05-15 09:23:25 +0000877
878 // Add prototype flag.
Devang Patel2c4ceb12009-11-21 02:48:08 +0000879 addUInt(&Buffer, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
Bill Wendling0310d762009-05-15 09:23:25 +0000880
881 // Add arguments.
882 for (unsigned i = 1, N = Elements.getNumElements(); i < N; ++i) {
883 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
884 DIDescriptor Ty = Elements.getElement(i);
Devang Patel8a241142009-12-09 18:24:21 +0000885 addType(Arg, DIType(Ty.getNode()));
Devang Patel2c4ceb12009-11-21 02:48:08 +0000886 Buffer.addChild(Arg);
Bill Wendling0310d762009-05-15 09:23:25 +0000887 }
888 }
889 break;
890 case dwarf::DW_TAG_structure_type:
891 case dwarf::DW_TAG_union_type:
892 case dwarf::DW_TAG_class_type: {
893 // Add elements to structure type.
894 DIArray Elements = CTy.getTypeArray();
895
896 // A forward struct declared type may not have elements available.
897 if (Elements.isNull())
898 break;
899
900 // Add elements to structure type.
901 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
902 DIDescriptor Element = Elements.getElement(i);
Devang Patele4b27562009-08-28 23:24:31 +0000903 if (Element.isNull())
904 continue;
Bill Wendling0310d762009-05-15 09:23:25 +0000905 DIE *ElemDie = NULL;
906 if (Element.getTag() == dwarf::DW_TAG_subprogram)
Devang Patel8a241142009-12-09 18:24:21 +0000907 ElemDie = createMemberSubprogramDIE(DISubprogram(Element.getNode()));
Bill Wendling0310d762009-05-15 09:23:25 +0000908 else
Devang Patel8a241142009-12-09 18:24:21 +0000909 ElemDie = createMemberDIE(DIDerivedType(Element.getNode()));
Devang Patel2c4ceb12009-11-21 02:48:08 +0000910 Buffer.addChild(ElemDie);
Bill Wendling0310d762009-05-15 09:23:25 +0000911 }
912
Devang Patela1ba2692009-08-27 23:51:51 +0000913 if (CTy.isAppleBlockExtension())
Devang Patel2c4ceb12009-11-21 02:48:08 +0000914 addUInt(&Buffer, dwarf::DW_AT_APPLE_block, dwarf::DW_FORM_flag, 1);
Bill Wendling0310d762009-05-15 09:23:25 +0000915
916 unsigned RLang = CTy.getRunTimeLang();
917 if (RLang)
Devang Patel2c4ceb12009-11-21 02:48:08 +0000918 addUInt(&Buffer, dwarf::DW_AT_APPLE_runtime_class,
Bill Wendling0310d762009-05-15 09:23:25 +0000919 dwarf::DW_FORM_data1, RLang);
920 break;
921 }
922 default:
923 break;
924 }
925
926 // Add name if not anonymous or intermediate type.
Devang Patel65dbc902009-11-25 17:36:49 +0000927 if (!Name.empty())
Devang Patel2c4ceb12009-11-21 02:48:08 +0000928 addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
Bill Wendling0310d762009-05-15 09:23:25 +0000929
930 if (Tag == dwarf::DW_TAG_enumeration_type ||
931 Tag == dwarf::DW_TAG_structure_type || Tag == dwarf::DW_TAG_union_type) {
932 // Add size if non-zero (derived types might be zero-sized.)
933 if (Size)
Devang Patel2c4ceb12009-11-21 02:48:08 +0000934 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
Bill Wendling0310d762009-05-15 09:23:25 +0000935 else {
936 // Add zero size if it is not a forward declaration.
937 if (CTy.isForwardDecl())
Devang Patel2c4ceb12009-11-21 02:48:08 +0000938 addUInt(&Buffer, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
Bill Wendling0310d762009-05-15 09:23:25 +0000939 else
Devang Patel2c4ceb12009-11-21 02:48:08 +0000940 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, 0);
Bill Wendling0310d762009-05-15 09:23:25 +0000941 }
942
943 // Add source line info if available.
944 if (!CTy.isForwardDecl())
Devang Patel2c4ceb12009-11-21 02:48:08 +0000945 addSourceLine(&Buffer, &CTy);
Bill Wendling0310d762009-05-15 09:23:25 +0000946 }
947}
948
Devang Patel2c4ceb12009-11-21 02:48:08 +0000949/// constructSubrangeDIE - Construct subrange DIE from DISubrange.
950void DwarfDebug::constructSubrangeDIE(DIE &Buffer, DISubrange SR, DIE *IndexTy){
Bill Wendling0310d762009-05-15 09:23:25 +0000951 int64_t L = SR.getLo();
952 int64_t H = SR.getHi();
953 DIE *DW_Subrange = new DIE(dwarf::DW_TAG_subrange_type);
954
Devang Patel2c4ceb12009-11-21 02:48:08 +0000955 addDIEEntry(DW_Subrange, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IndexTy);
Devang Patel6325a532009-08-14 20:59:16 +0000956 if (L)
Devang Patel2c4ceb12009-11-21 02:48:08 +0000957 addSInt(DW_Subrange, dwarf::DW_AT_lower_bound, 0, L);
Devang Pateld55224c2009-12-04 23:10:24 +0000958 addSInt(DW_Subrange, dwarf::DW_AT_upper_bound, 0, H);
Bill Wendling0310d762009-05-15 09:23:25 +0000959
Devang Patel2c4ceb12009-11-21 02:48:08 +0000960 Buffer.addChild(DW_Subrange);
Bill Wendling0310d762009-05-15 09:23:25 +0000961}
962
Devang Patel2c4ceb12009-11-21 02:48:08 +0000963/// constructArrayTypeDIE - Construct array type DIE from DICompositeType.
Devang Patel8a241142009-12-09 18:24:21 +0000964void DwarfDebug::constructArrayTypeDIE(DIE &Buffer,
Bill Wendling0310d762009-05-15 09:23:25 +0000965 DICompositeType *CTy) {
966 Buffer.setTag(dwarf::DW_TAG_array_type);
967 if (CTy->getTag() == dwarf::DW_TAG_vector_type)
Devang Patel2c4ceb12009-11-21 02:48:08 +0000968 addUInt(&Buffer, dwarf::DW_AT_GNU_vector, dwarf::DW_FORM_flag, 1);
Bill Wendling0310d762009-05-15 09:23:25 +0000969
970 // Emit derived type.
Devang Patel8a241142009-12-09 18:24:21 +0000971 addType(&Buffer, CTy->getTypeDerivedFrom());
Bill Wendling0310d762009-05-15 09:23:25 +0000972 DIArray Elements = CTy->getTypeArray();
973
Devang Patel6f01d9c2009-11-21 00:31:03 +0000974 // Get an anonymous type for index type.
Devang Patel8a241142009-12-09 18:24:21 +0000975 DIE *IdxTy = ModuleCU->getIndexTyDie();
Devang Patel6f01d9c2009-11-21 00:31:03 +0000976 if (!IdxTy) {
977 // Construct an anonymous type for index type.
978 IdxTy = new DIE(dwarf::DW_TAG_base_type);
Devang Patel2c4ceb12009-11-21 02:48:08 +0000979 addUInt(IdxTy, dwarf::DW_AT_byte_size, 0, sizeof(int32_t));
980 addUInt(IdxTy, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
Devang Patel6f01d9c2009-11-21 00:31:03 +0000981 dwarf::DW_ATE_signed);
Devang Patel8a241142009-12-09 18:24:21 +0000982 ModuleCU->addDie(IdxTy);
983 ModuleCU->setIndexTyDie(IdxTy);
Devang Patel6f01d9c2009-11-21 00:31:03 +0000984 }
Bill Wendling0310d762009-05-15 09:23:25 +0000985
986 // Add subranges to array type.
987 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
988 DIDescriptor Element = Elements.getElement(i);
989 if (Element.getTag() == dwarf::DW_TAG_subrange_type)
Devang Patel2c4ceb12009-11-21 02:48:08 +0000990 constructSubrangeDIE(Buffer, DISubrange(Element.getNode()), IdxTy);
Bill Wendling0310d762009-05-15 09:23:25 +0000991 }
992}
993
Devang Patel2c4ceb12009-11-21 02:48:08 +0000994/// constructEnumTypeDIE - Construct enum type DIE from DIEnumerator.
Devang Patel8a241142009-12-09 18:24:21 +0000995DIE *DwarfDebug::constructEnumTypeDIE(DIEnumerator *ETy) {
Bill Wendling0310d762009-05-15 09:23:25 +0000996 DIE *Enumerator = new DIE(dwarf::DW_TAG_enumerator);
Devang Patel65dbc902009-11-25 17:36:49 +0000997 StringRef Name = ETy->getName();
Devang Patel2c4ceb12009-11-21 02:48:08 +0000998 addString(Enumerator, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
Bill Wendling0310d762009-05-15 09:23:25 +0000999 int64_t Value = ETy->getEnumValue();
Devang Patel2c4ceb12009-11-21 02:48:08 +00001000 addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, Value);
Bill Wendling0310d762009-05-15 09:23:25 +00001001 return Enumerator;
1002}
1003
Devang Patel2c4ceb12009-11-21 02:48:08 +00001004/// createGlobalVariableDIE - Create new DIE using GV.
Devang Patel8a241142009-12-09 18:24:21 +00001005DIE *DwarfDebug::createGlobalVariableDIE(const DIGlobalVariable &GV) {
Jim Grosbach7ab38df2009-11-22 19:20:36 +00001006 // If the global variable was optmized out then no need to create debug info
1007 // entry.
Devang Patel84c73e92009-11-06 17:58:12 +00001008 if (!GV.getGlobal()) return NULL;
Devang Patel65dbc902009-11-25 17:36:49 +00001009 if (GV.getDisplayName().empty()) return NULL;
Devang Patel465c3be2009-11-06 01:30:04 +00001010
Bill Wendling0310d762009-05-15 09:23:25 +00001011 DIE *GVDie = new DIE(dwarf::DW_TAG_variable);
Jim Grosbach31ef40e2009-11-21 23:12:12 +00001012 addString(GVDie, dwarf::DW_AT_name, dwarf::DW_FORM_string,
Devang Patel5ccdd102009-09-29 18:40:58 +00001013 GV.getDisplayName());
1014
Devang Patel65dbc902009-11-25 17:36:49 +00001015 StringRef LinkageName = GV.getLinkageName();
1016 if (!LinkageName.empty()) {
Chris Lattner6c2f9e12009-08-19 05:49:37 +00001017 // Skip special LLVM prefix that is used to inform the asm printer to not
1018 // emit usual symbol prefix before the symbol name. This happens for
1019 // Objective-C symbol names and symbol whose name is replaced using GCC's
1020 // __asm__ attribute.
Devang Patel53cb17d2009-07-16 01:01:22 +00001021 if (LinkageName[0] == 1)
Benjamin Kramer1c3451f2009-11-25 18:26:09 +00001022 LinkageName = LinkageName.substr(1);
Devang Patel2c4ceb12009-11-21 02:48:08 +00001023 addString(GVDie, dwarf::DW_AT_MIPS_linkage_name, dwarf::DW_FORM_string,
Devang Patel1a8d2d22009-07-14 00:55:28 +00001024 LinkageName);
Devang Patel53cb17d2009-07-16 01:01:22 +00001025 }
Devang Patel8a241142009-12-09 18:24:21 +00001026 addType(GVDie, GV.getType());
Bill Wendling0310d762009-05-15 09:23:25 +00001027 if (!GV.isLocalToUnit())
Devang Patel2c4ceb12009-11-21 02:48:08 +00001028 addUInt(GVDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
1029 addSourceLine(GVDie, &GV);
Devang Patelb71a16d2009-10-05 23:22:08 +00001030
1031 // Add address.
1032 DIEBlock *Block = new DIEBlock();
Devang Patel2c4ceb12009-11-21 02:48:08 +00001033 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
1034 addObjectLabel(Block, 0, dwarf::DW_FORM_udata,
Devang Patelb71a16d2009-10-05 23:22:08 +00001035 Asm->Mang->getMangledName(GV.getGlobal()));
Devang Patel2c4ceb12009-11-21 02:48:08 +00001036 addBlock(GVDie, dwarf::DW_AT_location, 0, Block);
Devang Patelb71a16d2009-10-05 23:22:08 +00001037
Bill Wendling0310d762009-05-15 09:23:25 +00001038 return GVDie;
1039}
1040
Devang Patel2c4ceb12009-11-21 02:48:08 +00001041/// createMemberDIE - Create new member DIE.
Devang Patel8a241142009-12-09 18:24:21 +00001042DIE *DwarfDebug::createMemberDIE(const DIDerivedType &DT) {
Bill Wendling0310d762009-05-15 09:23:25 +00001043 DIE *MemberDie = new DIE(DT.getTag());
Devang Patel65dbc902009-11-25 17:36:49 +00001044 StringRef Name = DT.getName();
1045 if (!Name.empty())
Devang Patel2c4ceb12009-11-21 02:48:08 +00001046 addString(MemberDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
Devang Patel65dbc902009-11-25 17:36:49 +00001047
Devang Patel8a241142009-12-09 18:24:21 +00001048 addType(MemberDie, DT.getTypeDerivedFrom());
Bill Wendling0310d762009-05-15 09:23:25 +00001049
Devang Patel2c4ceb12009-11-21 02:48:08 +00001050 addSourceLine(MemberDie, &DT);
Bill Wendling0310d762009-05-15 09:23:25 +00001051
Devang Patel33db5082009-11-04 22:06:12 +00001052 DIEBlock *MemLocationDie = new DIEBlock();
Devang Patel2c4ceb12009-11-21 02:48:08 +00001053 addUInt(MemLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
Devang Patel33db5082009-11-04 22:06:12 +00001054
Bill Wendling0310d762009-05-15 09:23:25 +00001055 uint64_t Size = DT.getSizeInBits();
Devang Patel61ecbd12009-11-04 23:48:00 +00001056 uint64_t FieldSize = DT.getOriginalTypeSize();
Bill Wendling0310d762009-05-15 09:23:25 +00001057
1058 if (Size != FieldSize) {
1059 // Handle bitfield.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001060 addUInt(MemberDie, dwarf::DW_AT_byte_size, 0, DT.getOriginalTypeSize()>>3);
1061 addUInt(MemberDie, dwarf::DW_AT_bit_size, 0, DT.getSizeInBits());
Bill Wendling0310d762009-05-15 09:23:25 +00001062
1063 uint64_t Offset = DT.getOffsetInBits();
1064 uint64_t FieldOffset = Offset;
1065 uint64_t AlignMask = ~(DT.getAlignInBits() - 1);
1066 uint64_t HiMark = (Offset + FieldSize) & AlignMask;
1067 FieldOffset = (HiMark - FieldSize);
1068 Offset -= FieldOffset;
1069
1070 // Maybe we need to work from the other end.
1071 if (TD->isLittleEndian()) Offset = FieldSize - (Offset + Size);
Devang Patel2c4ceb12009-11-21 02:48:08 +00001072 addUInt(MemberDie, dwarf::DW_AT_bit_offset, 0, Offset);
Bill Wendling0310d762009-05-15 09:23:25 +00001073
Devang Patel33db5082009-11-04 22:06:12 +00001074 // Here WD_AT_data_member_location points to the anonymous
1075 // field that includes this bit field.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001076 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, FieldOffset >> 3);
Devang Patel33db5082009-11-04 22:06:12 +00001077
1078 } else
1079 // This is not a bitfield.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001080 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits() >> 3);
Devang Patel33db5082009-11-04 22:06:12 +00001081
Devang Patel2c4ceb12009-11-21 02:48:08 +00001082 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, MemLocationDie);
Bill Wendling0310d762009-05-15 09:23:25 +00001083
1084 if (DT.isProtected())
Devang Patel5d11eb02009-12-03 19:11:07 +00001085 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
Bill Wendling0310d762009-05-15 09:23:25 +00001086 dwarf::DW_ACCESS_protected);
1087 else if (DT.isPrivate())
Devang Patel5d11eb02009-12-03 19:11:07 +00001088 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
Bill Wendling0310d762009-05-15 09:23:25 +00001089 dwarf::DW_ACCESS_private);
Devang Patel5d11eb02009-12-03 19:11:07 +00001090 else if (DT.getTag() == dwarf::DW_TAG_inheritance)
1091 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1092 dwarf::DW_ACCESS_public);
1093 if (DT.isVirtual())
1094 addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_flag,
1095 dwarf::DW_VIRTUALITY_virtual);
Bill Wendling0310d762009-05-15 09:23:25 +00001096 return MemberDie;
1097}
1098
Devang Patel1d5cc1d2009-12-03 01:25:38 +00001099/// createRawSubprogramDIE - Create new partially incomplete DIE. This is
1100/// a helper routine used by createMemberSubprogramDIE and
1101/// createSubprogramDIE.
Devang Patel8a241142009-12-09 18:24:21 +00001102DIE *DwarfDebug::createRawSubprogramDIE(const DISubprogram &SP) {
Devang Patel1d5cc1d2009-12-03 01:25:38 +00001103 DIE *SPDie = new DIE(dwarf::DW_TAG_subprogram);
Devang Patel65dbc902009-11-25 17:36:49 +00001104 addString(SPDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, SP.getName());
Bill Wendling0310d762009-05-15 09:23:25 +00001105
Devang Patel65dbc902009-11-25 17:36:49 +00001106 StringRef LinkageName = SP.getLinkageName();
1107 if (!LinkageName.empty()) {
Jim Grosbach7ab38df2009-11-22 19:20:36 +00001108 // Skip special LLVM prefix that is used to inform the asm printer to not
1109 // emit usual symbol prefix before the symbol name. This happens for
1110 // Objective-C symbol names and symbol whose name is replaced using GCC's
1111 // __asm__ attribute.
Devang Patel53cb17d2009-07-16 01:01:22 +00001112 if (LinkageName[0] == 1)
Benjamin Kramer1c3451f2009-11-25 18:26:09 +00001113 LinkageName = LinkageName.substr(1);
Devang Patel2c4ceb12009-11-21 02:48:08 +00001114 addString(SPDie, dwarf::DW_AT_MIPS_linkage_name, dwarf::DW_FORM_string,
Devang Patel1a8d2d22009-07-14 00:55:28 +00001115 LinkageName);
Devang Patel53cb17d2009-07-16 01:01:22 +00001116 }
Devang Patel2c4ceb12009-11-21 02:48:08 +00001117 addSourceLine(SPDie, &SP);
Bill Wendling0310d762009-05-15 09:23:25 +00001118
Bill Wendling0310d762009-05-15 09:23:25 +00001119 // Add prototyped tag, if C or ObjC.
1120 unsigned Lang = SP.getCompileUnit().getLanguage();
1121 if (Lang == dwarf::DW_LANG_C99 || Lang == dwarf::DW_LANG_C89 ||
1122 Lang == dwarf::DW_LANG_ObjC)
Devang Patel2c4ceb12009-11-21 02:48:08 +00001123 addUInt(SPDie, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
Bill Wendling0310d762009-05-15 09:23:25 +00001124
1125 // Add Return Type.
Devang Patel1d5cc1d2009-12-03 01:25:38 +00001126 DICompositeType SPTy = SP.getType();
1127 DIArray Args = SPTy.getTypeArray();
Bill Wendling0310d762009-05-15 09:23:25 +00001128 unsigned SPTag = SPTy.getTag();
Devang Patel5d11eb02009-12-03 19:11:07 +00001129
Devang Patel1d5cc1d2009-12-03 01:25:38 +00001130 if (Args.isNull() || SPTag != dwarf::DW_TAG_subroutine_type)
Devang Patel8a241142009-12-09 18:24:21 +00001131 addType(SPDie, SPTy);
Devang Patel1d5cc1d2009-12-03 01:25:38 +00001132 else
Devang Patel8a241142009-12-09 18:24:21 +00001133 addType(SPDie, DIType(Args.getElement(0).getNode()));
Devang Patel1d5cc1d2009-12-03 01:25:38 +00001134
Devang Patel5d11eb02009-12-03 19:11:07 +00001135 unsigned VK = SP.getVirtuality();
1136 if (VK) {
1137 addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_flag, VK);
1138 DIEBlock *Block = new DIEBlock();
1139 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1140 addUInt(Block, 0, dwarf::DW_FORM_data1, SP.getVirtualIndex());
1141 addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, 0, Block);
1142 ContainingTypeMap.insert(std::make_pair(SPDie, WeakVH(SP.getContainingType().getNode())));
1143 }
1144
Devang Patel1d5cc1d2009-12-03 01:25:38 +00001145 return SPDie;
1146}
1147
1148/// createMemberSubprogramDIE - Create new member DIE using SP. This routine
1149/// always returns a die with DW_AT_declaration attribute.
Devang Patel8a241142009-12-09 18:24:21 +00001150DIE *DwarfDebug::createMemberSubprogramDIE(const DISubprogram &SP) {
Devang Patel1d5cc1d2009-12-03 01:25:38 +00001151 DIE *SPDie = ModuleCU->getDIE(SP.getNode());
1152 if (!SPDie)
Devang Patel8a241142009-12-09 18:24:21 +00001153 SPDie = createSubprogramDIE(SP);
Devang Patel1d5cc1d2009-12-03 01:25:38 +00001154
1155 // If SPDie has DW_AT_declaration then reuse it.
1156 if (!SP.isDefinition())
1157 return SPDie;
1158
1159 // Otherwise create new DIE for the declaration. First push definition
1160 // DIE at the top level.
1161 if (TopLevelDIEs.insert(SPDie))
1162 TopLevelDIEsVector.push_back(SPDie);
1163
Devang Patel8a241142009-12-09 18:24:21 +00001164 SPDie = createRawSubprogramDIE(SP);
Devang Patel1d5cc1d2009-12-03 01:25:38 +00001165
1166 // Add arguments.
1167 DICompositeType SPTy = SP.getType();
1168 DIArray Args = SPTy.getTypeArray();
1169 unsigned SPTag = SPTy.getTag();
1170 if (SPTag == dwarf::DW_TAG_subroutine_type)
1171 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
1172 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
Devang Patel8a241142009-12-09 18:24:21 +00001173 addType(Arg, DIType(Args.getElement(i).getNode()));
Devang Patel1d5cc1d2009-12-03 01:25:38 +00001174 addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1); // ??
1175 SPDie->addChild(Arg);
1176 }
1177
1178 addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1179 return SPDie;
1180}
1181
1182/// createSubprogramDIE - Create new DIE using SP.
Devang Patel8a241142009-12-09 18:24:21 +00001183DIE *DwarfDebug::createSubprogramDIE(const DISubprogram &SP) {
Devang Patel1d5cc1d2009-12-03 01:25:38 +00001184 DIE *SPDie = ModuleCU->getDIE(SP.getNode());
1185 if (SPDie)
1186 return SPDie;
1187
Devang Patel8a241142009-12-09 18:24:21 +00001188 SPDie = createRawSubprogramDIE(SP);
Bill Wendling0310d762009-05-15 09:23:25 +00001189
1190 if (!SP.isDefinition()) {
Devang Patel2c4ceb12009-11-21 02:48:08 +00001191 addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
Bill Wendling0310d762009-05-15 09:23:25 +00001192
1193 // Add arguments. Do not add arguments for subprogram definition. They will
Devang Patel1d5cc1d2009-12-03 01:25:38 +00001194 // be handled while processing variables.
1195 DICompositeType SPTy = SP.getType();
1196 DIArray Args = SPTy.getTypeArray();
1197 unsigned SPTag = SPTy.getTag();
1198
Bill Wendling0310d762009-05-15 09:23:25 +00001199 if (SPTag == dwarf::DW_TAG_subroutine_type)
1200 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
1201 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
Devang Patel8a241142009-12-09 18:24:21 +00001202 addType(Arg, DIType(Args.getElement(i).getNode()));
Devang Patel2c4ceb12009-11-21 02:48:08 +00001203 addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1); // ??
1204 SPDie->addChild(Arg);
Bill Wendling0310d762009-05-15 09:23:25 +00001205 }
1206 }
1207
Bill Wendling0310d762009-05-15 09:23:25 +00001208 // DW_TAG_inlined_subroutine may refer to this DIE.
Devang Patel8a241142009-12-09 18:24:21 +00001209 ModuleCU->insertDIE(SP.getNode(), SPDie);
Bill Wendling0310d762009-05-15 09:23:25 +00001210 return SPDie;
1211}
1212
Devang Patel2c4ceb12009-11-21 02:48:08 +00001213/// findCompileUnit - Get the compile unit for the given descriptor.
Bill Wendling0310d762009-05-15 09:23:25 +00001214///
Devang Patel2c4ceb12009-11-21 02:48:08 +00001215CompileUnit &DwarfDebug::findCompileUnit(DICompileUnit Unit) const {
Bill Wendling0310d762009-05-15 09:23:25 +00001216 DenseMap<Value *, CompileUnit *>::const_iterator I =
Devang Patele4b27562009-08-28 23:24:31 +00001217 CompileUnitMap.find(Unit.getNode());
Bill Wendling0310d762009-05-15 09:23:25 +00001218 assert(I != CompileUnitMap.end() && "Missing compile unit.");
1219 return *I->second;
1220}
1221
Devang Patel53bb5c92009-11-10 23:06:00 +00001222/// getUpdatedDbgScope - Find or create DbgScope assicated with the instruction.
1223/// Initialize scope and update scope hierarchy.
1224DbgScope *DwarfDebug::getUpdatedDbgScope(MDNode *N, const MachineInstr *MI,
1225 MDNode *InlinedAt) {
1226 assert (N && "Invalid Scope encoding!");
1227 assert (MI && "Missing machine instruction!");
1228 bool GetConcreteScope = (MI && InlinedAt);
1229
1230 DbgScope *NScope = NULL;
1231
1232 if (InlinedAt)
1233 NScope = DbgScopeMap.lookup(InlinedAt);
1234 else
1235 NScope = DbgScopeMap.lookup(N);
1236 assert (NScope && "Unable to find working scope!");
1237
1238 if (NScope->getFirstInsn())
1239 return NScope;
Devang Patelaf9e8472009-10-01 20:31:14 +00001240
1241 DbgScope *Parent = NULL;
Devang Patel53bb5c92009-11-10 23:06:00 +00001242 if (GetConcreteScope) {
Devang Patelc90aefe2009-10-14 21:08:09 +00001243 DILocation IL(InlinedAt);
Jim Grosbach31ef40e2009-11-21 23:12:12 +00001244 Parent = getUpdatedDbgScope(IL.getScope().getNode(), MI,
Devang Patel53bb5c92009-11-10 23:06:00 +00001245 IL.getOrigLocation().getNode());
1246 assert (Parent && "Unable to find Parent scope!");
1247 NScope->setParent(Parent);
Devang Patel2c4ceb12009-11-21 02:48:08 +00001248 Parent->addScope(NScope);
Devang Patel53bb5c92009-11-10 23:06:00 +00001249 } else if (DIDescriptor(N).isLexicalBlock()) {
1250 DILexicalBlock DB(N);
1251 if (!DB.getContext().isNull()) {
1252 Parent = getUpdatedDbgScope(DB.getContext().getNode(), MI, InlinedAt);
1253 NScope->setParent(Parent);
Devang Patel2c4ceb12009-11-21 02:48:08 +00001254 Parent->addScope(NScope);
Devang Patel53bb5c92009-11-10 23:06:00 +00001255 }
Devang Patelc90aefe2009-10-14 21:08:09 +00001256 }
Devang Patelaf9e8472009-10-01 20:31:14 +00001257
Devang Patelbdf45cb2009-10-27 20:47:17 +00001258 NScope->setFirstInsn(MI);
Devang Patelaf9e8472009-10-01 20:31:14 +00001259
Devang Patel53bb5c92009-11-10 23:06:00 +00001260 if (!Parent && !InlinedAt) {
Devang Patel39ae3ff2009-11-11 00:31:36 +00001261 StringRef SPName = DISubprogram(N).getLinkageName();
1262 if (SPName == MF->getFunction()->getName())
1263 CurrentFnDbgScope = NScope;
Devang Patel53bb5c92009-11-10 23:06:00 +00001264 }
Devang Patelaf9e8472009-10-01 20:31:14 +00001265
Devang Patel53bb5c92009-11-10 23:06:00 +00001266 if (GetConcreteScope) {
1267 ConcreteScopes[InlinedAt] = NScope;
1268 getOrCreateAbstractScope(N);
1269 }
1270
Devang Patelbdf45cb2009-10-27 20:47:17 +00001271 return NScope;
Devang Patelaf9e8472009-10-01 20:31:14 +00001272}
1273
Devang Patel53bb5c92009-11-10 23:06:00 +00001274DbgScope *DwarfDebug::getOrCreateAbstractScope(MDNode *N) {
1275 assert (N && "Invalid Scope encoding!");
1276
1277 DbgScope *AScope = AbstractScopes.lookup(N);
1278 if (AScope)
1279 return AScope;
Jim Grosbach31ef40e2009-11-21 23:12:12 +00001280
Devang Patel53bb5c92009-11-10 23:06:00 +00001281 DbgScope *Parent = NULL;
1282
1283 DIDescriptor Scope(N);
1284 if (Scope.isLexicalBlock()) {
1285 DILexicalBlock DB(N);
1286 DIDescriptor ParentDesc = DB.getContext();
1287 if (!ParentDesc.isNull())
1288 Parent = getOrCreateAbstractScope(ParentDesc.getNode());
1289 }
1290
1291 AScope = new DbgScope(Parent, DIDescriptor(N), NULL);
1292
1293 if (Parent)
Devang Patel2c4ceb12009-11-21 02:48:08 +00001294 Parent->addScope(AScope);
Devang Patel53bb5c92009-11-10 23:06:00 +00001295 AScope->setAbstractScope();
1296 AbstractScopes[N] = AScope;
1297 if (DIDescriptor(N).isSubprogram())
1298 AbstractScopesList.push_back(AScope);
1299 return AScope;
1300}
Devang Patelaf9e8472009-10-01 20:31:14 +00001301
Jim Grosbach31ef40e2009-11-21 23:12:12 +00001302/// updateSubprogramScopeDIE - Find DIE for the given subprogram and
Devang Patel2c4ceb12009-11-21 02:48:08 +00001303/// attach appropriate DW_AT_low_pc and DW_AT_high_pc attributes.
1304/// If there are global variables in this scope then create and insert
1305/// DIEs for these variables.
1306DIE *DwarfDebug::updateSubprogramScopeDIE(MDNode *SPNode) {
Devang Patel53bb5c92009-11-10 23:06:00 +00001307
Devang Patel017d1212009-11-20 21:37:22 +00001308 DIE *SPDie = ModuleCU->getDIE(SPNode);
Devang Patel53bb5c92009-11-10 23:06:00 +00001309 assert (SPDie && "Unable to find subprogram DIE!");
Devang Patel2c4ceb12009-11-21 02:48:08 +00001310 addLabel(SPDie, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
Devang Patel53bb5c92009-11-10 23:06:00 +00001311 DWLabel("func_begin", SubprogramCount));
Devang Patel2c4ceb12009-11-21 02:48:08 +00001312 addLabel(SPDie, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
Devang Patel53bb5c92009-11-10 23:06:00 +00001313 DWLabel("func_end", SubprogramCount));
1314 MachineLocation Location(RI->getFrameRegister(*MF));
Devang Patel2c4ceb12009-11-21 02:48:08 +00001315 addAddress(SPDie, dwarf::DW_AT_frame_base, Location);
Jim Grosbach31ef40e2009-11-21 23:12:12 +00001316
Devang Patel53bb5c92009-11-10 23:06:00 +00001317 if (!DISubprogram(SPNode).isLocalToUnit())
Devang Patel2c4ceb12009-11-21 02:48:08 +00001318 addUInt(SPDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
Devang Patel53bb5c92009-11-10 23:06:00 +00001319
1320 // If there are global variables at this scope then add their dies.
Jim Grosbach31ef40e2009-11-21 23:12:12 +00001321 for (SmallVector<WeakVH, 4>::iterator SGI = ScopedGVs.begin(),
Devang Patel53bb5c92009-11-10 23:06:00 +00001322 SGE = ScopedGVs.end(); SGI != SGE; ++SGI) {
1323 MDNode *N = dyn_cast_or_null<MDNode>(*SGI);
1324 if (!N) continue;
1325 DIGlobalVariable GV(N);
1326 if (GV.getContext().getNode() == SPNode) {
Devang Patel8a241142009-12-09 18:24:21 +00001327 DIE *ScopedGVDie = createGlobalVariableDIE(GV);
Devang Patelfb0ee432009-11-10 23:20:04 +00001328 if (ScopedGVDie)
Devang Patel2c4ceb12009-11-21 02:48:08 +00001329 SPDie->addChild(ScopedGVDie);
Devang Patel53bb5c92009-11-10 23:06:00 +00001330 }
1331 }
Devang Patel193f7202009-11-24 01:14:22 +00001332
Devang Patel53bb5c92009-11-10 23:06:00 +00001333 return SPDie;
1334}
1335
Jim Grosbach31ef40e2009-11-21 23:12:12 +00001336/// constructLexicalScope - Construct new DW_TAG_lexical_block
Devang Patel2c4ceb12009-11-21 02:48:08 +00001337/// for this scope and attach DW_AT_low_pc/DW_AT_high_pc labels.
1338DIE *DwarfDebug::constructLexicalScopeDIE(DbgScope *Scope) {
Devang Patel53bb5c92009-11-10 23:06:00 +00001339 unsigned StartID = MMI->MappedLabel(Scope->getStartLabelID());
1340 unsigned EndID = MMI->MappedLabel(Scope->getEndLabelID());
1341
1342 // Ignore empty scopes.
1343 if (StartID == EndID && StartID != 0)
1344 return NULL;
1345
1346 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_lexical_block);
1347 if (Scope->isAbstractScope())
1348 return ScopeDIE;
1349
Devang Patel2c4ceb12009-11-21 02:48:08 +00001350 addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
Jim Grosbach31ef40e2009-11-21 23:12:12 +00001351 StartID ?
1352 DWLabel("label", StartID)
Devang Patel53bb5c92009-11-10 23:06:00 +00001353 : DWLabel("func_begin", SubprogramCount));
Devang Patel2c4ceb12009-11-21 02:48:08 +00001354 addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
Jim Grosbach31ef40e2009-11-21 23:12:12 +00001355 EndID ?
1356 DWLabel("label", EndID)
Devang Patel53bb5c92009-11-10 23:06:00 +00001357 : DWLabel("func_end", SubprogramCount));
1358
1359
1360
1361 return ScopeDIE;
1362}
1363
Devang Patel2c4ceb12009-11-21 02:48:08 +00001364/// constructInlinedScopeDIE - This scope represents inlined body of
1365/// a function. Construct DIE to represent this concrete inlined copy
1366/// of the function.
1367DIE *DwarfDebug::constructInlinedScopeDIE(DbgScope *Scope) {
Devang Patel53bb5c92009-11-10 23:06:00 +00001368 unsigned StartID = MMI->MappedLabel(Scope->getStartLabelID());
1369 unsigned EndID = MMI->MappedLabel(Scope->getEndLabelID());
1370 assert (StartID && "Invalid starting label for an inlined scope!");
1371 assert (EndID && "Invalid end label for an inlined scope!");
1372 // Ignore empty scopes.
1373 if (StartID == EndID && StartID != 0)
1374 return NULL;
1375
1376 DIScope DS(Scope->getScopeNode());
1377 if (DS.isNull())
1378 return NULL;
1379 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_inlined_subroutine);
1380
1381 DISubprogram InlinedSP = getDISubprogram(DS.getNode());
Devang Patel017d1212009-11-20 21:37:22 +00001382 DIE *OriginDIE = ModuleCU->getDIE(InlinedSP.getNode());
Devang Patel53bb5c92009-11-10 23:06:00 +00001383 assert (OriginDIE && "Unable to find Origin DIE!");
Devang Patel2c4ceb12009-11-21 02:48:08 +00001384 addDIEEntry(ScopeDIE, dwarf::DW_AT_abstract_origin,
Devang Patel53bb5c92009-11-10 23:06:00 +00001385 dwarf::DW_FORM_ref4, OriginDIE);
1386
Devang Patel2c4ceb12009-11-21 02:48:08 +00001387 addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
Devang Patel53bb5c92009-11-10 23:06:00 +00001388 DWLabel("label", StartID));
Devang Patel2c4ceb12009-11-21 02:48:08 +00001389 addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
Devang Patel53bb5c92009-11-10 23:06:00 +00001390 DWLabel("label", EndID));
1391
1392 InlinedSubprogramDIEs.insert(OriginDIE);
1393
1394 // Track the start label for this inlined function.
1395 ValueMap<MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator
1396 I = InlineInfo.find(InlinedSP.getNode());
1397
1398 if (I == InlineInfo.end()) {
Jim Grosbach7ab38df2009-11-22 19:20:36 +00001399 InlineInfo[InlinedSP.getNode()].push_back(std::make_pair(StartID,
1400 ScopeDIE));
Devang Patel53bb5c92009-11-10 23:06:00 +00001401 InlinedSPNodes.push_back(InlinedSP.getNode());
1402 } else
1403 I->second.push_back(std::make_pair(StartID, ScopeDIE));
1404
1405 StringPool.insert(InlinedSP.getName());
1406 StringPool.insert(InlinedSP.getLinkageName());
1407 DILocation DL(Scope->getInlinedAt());
Devang Patel2c4ceb12009-11-21 02:48:08 +00001408 addUInt(ScopeDIE, dwarf::DW_AT_call_file, 0, ModuleCU->getID());
1409 addUInt(ScopeDIE, dwarf::DW_AT_call_line, 0, DL.getLineNumber());
Devang Patel53bb5c92009-11-10 23:06:00 +00001410
1411 return ScopeDIE;
1412}
1413
Devang Patel2c4ceb12009-11-21 02:48:08 +00001414
1415/// constructVariableDIE - Construct a DIE for the given DbgVariable.
Devang Patel8a241142009-12-09 18:24:21 +00001416DIE *DwarfDebug::constructVariableDIE(DbgVariable *DV, DbgScope *Scope) {
Devang Patel53bb5c92009-11-10 23:06:00 +00001417 // Get the descriptor.
1418 const DIVariable &VD = DV->getVariable();
Devang Patel65dbc902009-11-25 17:36:49 +00001419 StringRef Name = VD.getName();
1420 if (Name.empty())
Devang Patel3fb6bd62009-11-13 02:25:26 +00001421 return NULL;
Devang Patel53bb5c92009-11-10 23:06:00 +00001422
1423 // Translate tag to proper Dwarf tag. The result variable is dropped for
1424 // now.
1425 unsigned Tag;
1426 switch (VD.getTag()) {
1427 case dwarf::DW_TAG_return_variable:
1428 return NULL;
1429 case dwarf::DW_TAG_arg_variable:
1430 Tag = dwarf::DW_TAG_formal_parameter;
1431 break;
1432 case dwarf::DW_TAG_auto_variable: // fall thru
1433 default:
1434 Tag = dwarf::DW_TAG_variable;
1435 break;
1436 }
1437
1438 // Define variable debug information entry.
1439 DIE *VariableDie = new DIE(Tag);
1440
1441
1442 DIE *AbsDIE = NULL;
1443 if (DbgVariable *AV = DV->getAbstractVariable())
1444 AbsDIE = AV->getDIE();
Jim Grosbach31ef40e2009-11-21 23:12:12 +00001445
Devang Patel53bb5c92009-11-10 23:06:00 +00001446 if (AbsDIE) {
1447 DIScope DS(Scope->getScopeNode());
1448 DISubprogram InlinedSP = getDISubprogram(DS.getNode());
Devang Patel017d1212009-11-20 21:37:22 +00001449 DIE *OriginSPDIE = ModuleCU->getDIE(InlinedSP.getNode());
Daniel Dunbarc0326792009-11-11 03:09:50 +00001450 (void) OriginSPDIE;
Devang Patel53bb5c92009-11-10 23:06:00 +00001451 assert (OriginSPDIE && "Unable to find Origin DIE for the SP!");
1452 DIE *AbsDIE = DV->getAbstractVariable()->getDIE();
1453 assert (AbsDIE && "Unable to find Origin DIE for the Variable!");
Devang Patel2c4ceb12009-11-21 02:48:08 +00001454 addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin,
Devang Patel53bb5c92009-11-10 23:06:00 +00001455 dwarf::DW_FORM_ref4, AbsDIE);
1456 }
1457 else {
Devang Patel2c4ceb12009-11-21 02:48:08 +00001458 addString(VariableDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1459 addSourceLine(VariableDie, &VD);
Devang Patel53bb5c92009-11-10 23:06:00 +00001460
1461 // Add variable type.
Jim Grosbach31ef40e2009-11-21 23:12:12 +00001462 // FIXME: isBlockByrefVariable should be reformulated in terms of complex
Devang Patel53bb5c92009-11-10 23:06:00 +00001463 // addresses instead.
1464 if (VD.isBlockByrefVariable())
Devang Patel8a241142009-12-09 18:24:21 +00001465 addType(VariableDie, getBlockByrefType(VD.getType(), Name));
Devang Patel53bb5c92009-11-10 23:06:00 +00001466 else
Devang Patel8a241142009-12-09 18:24:21 +00001467 addType(VariableDie, VD.getType());
Devang Patel53bb5c92009-11-10 23:06:00 +00001468 }
1469
1470 // Add variable address.
1471 if (!Scope->isAbstractScope()) {
1472 MachineLocation Location;
Jim Grosbacha2f20b22009-11-22 20:14:00 +00001473 unsigned FrameReg;
1474 int Offset = RI->getFrameIndexReference(*MF, DV->getFrameIndex(), FrameReg);
1475 Location.set(FrameReg, Offset);
Jim Grosbach31ef40e2009-11-21 23:12:12 +00001476
Devang Patel53bb5c92009-11-10 23:06:00 +00001477 if (VD.hasComplexAddress())
Devang Patel2c4ceb12009-11-21 02:48:08 +00001478 addComplexAddress(DV, VariableDie, dwarf::DW_AT_location, Location);
Devang Patel53bb5c92009-11-10 23:06:00 +00001479 else if (VD.isBlockByrefVariable())
Devang Patel2c4ceb12009-11-21 02:48:08 +00001480 addBlockByrefAddress(DV, VariableDie, dwarf::DW_AT_location, Location);
Devang Patel53bb5c92009-11-10 23:06:00 +00001481 else
Devang Patel2c4ceb12009-11-21 02:48:08 +00001482 addAddress(VariableDie, dwarf::DW_AT_location, Location);
Devang Patel53bb5c92009-11-10 23:06:00 +00001483 }
1484 DV->setDIE(VariableDie);
1485 return VariableDie;
1486
1487}
Devang Patel2c4ceb12009-11-21 02:48:08 +00001488
Devang Patel193f7202009-11-24 01:14:22 +00001489void DwarfDebug::addPubTypes(DISubprogram SP) {
1490 DICompositeType SPTy = SP.getType();
1491 unsigned SPTag = SPTy.getTag();
1492 if (SPTag != dwarf::DW_TAG_subroutine_type)
1493 return;
1494
1495 DIArray Args = SPTy.getTypeArray();
1496 if (Args.isNull())
1497 return;
1498
1499 for (unsigned i = 0, e = Args.getNumElements(); i != e; ++i) {
1500 DIType ATy(Args.getElement(i).getNode());
1501 if (ATy.isNull())
1502 continue;
1503 DICompositeType CATy = getDICompositeType(ATy);
Devang Patel65dbc902009-11-25 17:36:49 +00001504 if (!CATy.isNull() && !CATy.getName().empty()) {
Devang Patel193f7202009-11-24 01:14:22 +00001505 if (DIEEntry *Entry = ModuleCU->getDIEEntry(CATy.getNode()))
1506 ModuleCU->addGlobalType(CATy.getName(), Entry->getEntry());
1507 }
1508 }
1509}
1510
Devang Patel2c4ceb12009-11-21 02:48:08 +00001511/// constructScopeDIE - Construct a DIE for this scope.
1512DIE *DwarfDebug::constructScopeDIE(DbgScope *Scope) {
Devang Patel53bb5c92009-11-10 23:06:00 +00001513 if (!Scope)
1514 return NULL;
1515 DIScope DS(Scope->getScopeNode());
1516 if (DS.isNull())
1517 return NULL;
1518
1519 DIE *ScopeDIE = NULL;
1520 if (Scope->getInlinedAt())
Devang Patel2c4ceb12009-11-21 02:48:08 +00001521 ScopeDIE = constructInlinedScopeDIE(Scope);
Devang Patel53bb5c92009-11-10 23:06:00 +00001522 else if (DS.isSubprogram()) {
1523 if (Scope->isAbstractScope())
Devang Patel017d1212009-11-20 21:37:22 +00001524 ScopeDIE = ModuleCU->getDIE(DS.getNode());
Devang Patel53bb5c92009-11-10 23:06:00 +00001525 else
Devang Patel2c4ceb12009-11-21 02:48:08 +00001526 ScopeDIE = updateSubprogramScopeDIE(DS.getNode());
Devang Patel53bb5c92009-11-10 23:06:00 +00001527 }
1528 else {
Devang Patel2c4ceb12009-11-21 02:48:08 +00001529 ScopeDIE = constructLexicalScopeDIE(Scope);
Devang Patel53bb5c92009-11-10 23:06:00 +00001530 if (!ScopeDIE) return NULL;
1531 }
1532
1533 // Add variables to scope.
1534 SmallVector<DbgVariable *, 8> &Variables = Scope->getVariables();
1535 for (unsigned i = 0, N = Variables.size(); i < N; ++i) {
Devang Patel8a241142009-12-09 18:24:21 +00001536 DIE *VariableDIE = constructVariableDIE(Variables[i], Scope);
Jim Grosbach31ef40e2009-11-21 23:12:12 +00001537 if (VariableDIE)
Devang Patel2c4ceb12009-11-21 02:48:08 +00001538 ScopeDIE->addChild(VariableDIE);
Devang Patel53bb5c92009-11-10 23:06:00 +00001539 }
1540
1541 // Add nested scopes.
1542 SmallVector<DbgScope *, 4> &Scopes = Scope->getScopes();
1543 for (unsigned j = 0, M = Scopes.size(); j < M; ++j) {
1544 // Define the Scope debug information entry.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001545 DIE *NestedDIE = constructScopeDIE(Scopes[j]);
Jim Grosbach31ef40e2009-11-21 23:12:12 +00001546 if (NestedDIE)
Devang Patel2c4ceb12009-11-21 02:48:08 +00001547 ScopeDIE->addChild(NestedDIE);
Devang Patel53bb5c92009-11-10 23:06:00 +00001548 }
Devang Patel193f7202009-11-24 01:14:22 +00001549
1550 if (DS.isSubprogram())
1551 addPubTypes(DISubprogram(DS.getNode()));
1552
1553 return ScopeDIE;
Devang Patel53bb5c92009-11-10 23:06:00 +00001554}
1555
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001556/// GetOrCreateSourceID - Look up the source id with the given directory and
1557/// source file names. If none currently exists, create a new id and insert it
1558/// in the SourceIds map. This can update DirectoryNames and SourceFileNames
1559/// maps as well.
Devang Patel65dbc902009-11-25 17:36:49 +00001560unsigned DwarfDebug::GetOrCreateSourceID(StringRef DirName, StringRef FileName) {
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001561 unsigned DId;
1562 StringMap<unsigned>::iterator DI = DirectoryIdMap.find(DirName);
1563 if (DI != DirectoryIdMap.end()) {
1564 DId = DI->getValue();
1565 } else {
1566 DId = DirectoryNames.size() + 1;
1567 DirectoryIdMap[DirName] = DId;
1568 DirectoryNames.push_back(DirName);
1569 }
1570
1571 unsigned FId;
1572 StringMap<unsigned>::iterator FI = SourceFileIdMap.find(FileName);
1573 if (FI != SourceFileIdMap.end()) {
1574 FId = FI->getValue();
1575 } else {
1576 FId = SourceFileNames.size() + 1;
1577 SourceFileIdMap[FileName] = FId;
1578 SourceFileNames.push_back(FileName);
1579 }
1580
1581 DenseMap<std::pair<unsigned, unsigned>, unsigned>::iterator SI =
1582 SourceIdMap.find(std::make_pair(DId, FId));
1583 if (SI != SourceIdMap.end())
1584 return SI->second;
1585
1586 unsigned SrcId = SourceIds.size() + 1; // DW_AT_decl_file cannot be 0.
1587 SourceIdMap[std::make_pair(DId, FId)] = SrcId;
1588 SourceIds.push_back(std::make_pair(DId, FId));
1589
1590 return SrcId;
1591}
1592
Devang Patel2c4ceb12009-11-21 02:48:08 +00001593void DwarfDebug::constructCompileUnit(MDNode *N) {
Devang Patele4b27562009-08-28 23:24:31 +00001594 DICompileUnit DIUnit(N);
Devang Patel65dbc902009-11-25 17:36:49 +00001595 StringRef FN = DIUnit.getFilename();
1596 StringRef Dir = DIUnit.getDirectory();
Devang Patel5ccdd102009-09-29 18:40:58 +00001597 unsigned ID = GetOrCreateSourceID(Dir, FN);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001598
1599 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
Devang Patel2c4ceb12009-11-21 02:48:08 +00001600 addSectionOffset(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4,
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001601 DWLabel("section_line", 0), DWLabel("section_line", 0),
1602 false);
Devang Patel2c4ceb12009-11-21 02:48:08 +00001603 addString(Die, dwarf::DW_AT_producer, dwarf::DW_FORM_string,
Devang Patel5ccdd102009-09-29 18:40:58 +00001604 DIUnit.getProducer());
Devang Patel2c4ceb12009-11-21 02:48:08 +00001605 addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data1,
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001606 DIUnit.getLanguage());
Devang Patel2c4ceb12009-11-21 02:48:08 +00001607 addString(Die, dwarf::DW_AT_name, dwarf::DW_FORM_string, FN);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001608
Devang Patel65dbc902009-11-25 17:36:49 +00001609 if (!Dir.empty())
Devang Patel2c4ceb12009-11-21 02:48:08 +00001610 addString(Die, dwarf::DW_AT_comp_dir, dwarf::DW_FORM_string, Dir);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001611 if (DIUnit.isOptimized())
Devang Patel2c4ceb12009-11-21 02:48:08 +00001612 addUInt(Die, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001613
Devang Patel65dbc902009-11-25 17:36:49 +00001614 StringRef Flags = DIUnit.getFlags();
1615 if (!Flags.empty())
Devang Patel2c4ceb12009-11-21 02:48:08 +00001616 addString(Die, dwarf::DW_AT_APPLE_flags, dwarf::DW_FORM_string, Flags);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001617
1618 unsigned RVer = DIUnit.getRunTimeVersion();
1619 if (RVer)
Devang Patel2c4ceb12009-11-21 02:48:08 +00001620 addUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers,
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001621 dwarf::DW_FORM_data1, RVer);
1622
1623 CompileUnit *Unit = new CompileUnit(ID, Die);
Devang Patel1dbc7712009-06-29 20:45:18 +00001624 if (!ModuleCU && DIUnit.isMain()) {
Devang Patel70f44262009-06-29 20:38:13 +00001625 // Use first compile unit marked as isMain as the compile unit
1626 // for this module.
Devang Patel1dbc7712009-06-29 20:45:18 +00001627 ModuleCU = Unit;
Devang Patel70f44262009-06-29 20:38:13 +00001628 }
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001629
Devang Patele4b27562009-08-28 23:24:31 +00001630 CompileUnitMap[DIUnit.getNode()] = Unit;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001631 CompileUnits.push_back(Unit);
1632}
1633
Devang Patel2c4ceb12009-11-21 02:48:08 +00001634void DwarfDebug::constructGlobalVariableDIE(MDNode *N) {
Devang Patele4b27562009-08-28 23:24:31 +00001635 DIGlobalVariable DI_GV(N);
Daniel Dunbarf612ff62009-09-19 20:40:05 +00001636
Devang Patel905cf5e2009-09-04 23:59:07 +00001637 // If debug information is malformed then ignore it.
1638 if (DI_GV.Verify() == false)
1639 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001640
1641 // Check for pre-existence.
Devang Patel017d1212009-11-20 21:37:22 +00001642 if (ModuleCU->getDIE(DI_GV.getNode()))
Devang Patel13e16b62009-06-26 01:49:18 +00001643 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001644
Devang Patel8a241142009-12-09 18:24:21 +00001645 DIE *VariableDie = createGlobalVariableDIE(DI_GV);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001646
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001647 // Add to map.
Devang Patel017d1212009-11-20 21:37:22 +00001648 ModuleCU->insertDIE(N, VariableDie);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001649
1650 // Add to context owner.
Devang Patel1d5cc1d2009-12-03 01:25:38 +00001651 if (TopLevelDIEs.insert(VariableDie))
1652 TopLevelDIEsVector.push_back(VariableDie);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001653
1654 // Expose as global. FIXME - need to check external flag.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001655 ModuleCU->addGlobal(DI_GV.getName(), VariableDie);
Devang Patel193f7202009-11-24 01:14:22 +00001656
1657 DIType GTy = DI_GV.getType();
Devang Patel65dbc902009-11-25 17:36:49 +00001658 if (GTy.isCompositeType() && !GTy.getName().empty()) {
Devang Patel193f7202009-11-24 01:14:22 +00001659 DIEEntry *Entry = ModuleCU->getDIEEntry(GTy.getNode());
1660 assert (Entry && "Missing global type!");
1661 ModuleCU->addGlobalType(GTy.getName(), Entry->getEntry());
1662 }
Devang Patel13e16b62009-06-26 01:49:18 +00001663 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001664}
1665
Devang Patel2c4ceb12009-11-21 02:48:08 +00001666void DwarfDebug::constructSubprogramDIE(MDNode *N) {
Devang Patele4b27562009-08-28 23:24:31 +00001667 DISubprogram SP(N);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001668
1669 // Check for pre-existence.
Devang Patel017d1212009-11-20 21:37:22 +00001670 if (ModuleCU->getDIE(N))
Devang Patel13e16b62009-06-26 01:49:18 +00001671 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001672
1673 if (!SP.isDefinition())
1674 // This is a method declaration which will be handled while constructing
1675 // class type.
Devang Patel13e16b62009-06-26 01:49:18 +00001676 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001677
Devang Patel8a241142009-12-09 18:24:21 +00001678 DIE *SubprogramDie = createSubprogramDIE(SP);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001679
1680 // Add to map.
Devang Patel017d1212009-11-20 21:37:22 +00001681 ModuleCU->insertDIE(N, SubprogramDie);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001682
1683 // Add to context owner.
Devang Patel0000fad2009-12-08 23:21:45 +00001684 if (SP.getContext().getNode() == SP.getCompileUnit().getNode())
Devang Patel1d5cc1d2009-12-03 01:25:38 +00001685 if (TopLevelDIEs.insert(SubprogramDie))
1686 TopLevelDIEsVector.push_back(SubprogramDie);
Devang Patel0000fad2009-12-08 23:21:45 +00001687
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001688 // Expose as global.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001689 ModuleCU->addGlobal(SP.getName(), SubprogramDie);
Devang Patel193f7202009-11-24 01:14:22 +00001690
Devang Patel13e16b62009-06-26 01:49:18 +00001691 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001692}
1693
Devang Patel2c4ceb12009-11-21 02:48:08 +00001694/// beginModule - Emit all Dwarf sections that should come prior to the
Daniel Dunbar00564992009-09-19 20:40:14 +00001695/// content. Create global DIEs and emit initial debug info sections.
1696/// This is inovked by the target AsmPrinter.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001697void DwarfDebug::beginModule(Module *M, MachineModuleInfo *mmi) {
Devang Patel208622d2009-06-25 22:36:02 +00001698 this->M = M;
1699
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001700 if (TimePassesIsEnabled)
1701 DebugTimer->startTimer();
1702
Devang Patel3380cc52009-11-11 19:55:08 +00001703 if (!MAI->doesSupportDebugInformation())
1704 return;
1705
Devang Patel78ab9e22009-07-30 18:56:46 +00001706 DebugInfoFinder DbgFinder;
1707 DbgFinder.processModule(*M);
Devang Patel13e16b62009-06-26 01:49:18 +00001708
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001709 // Create all the compile unit DIEs.
Devang Patel78ab9e22009-07-30 18:56:46 +00001710 for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
1711 E = DbgFinder.compile_unit_end(); I != E; ++I)
Devang Patel2c4ceb12009-11-21 02:48:08 +00001712 constructCompileUnit(*I);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001713
1714 if (CompileUnits.empty()) {
1715 if (TimePassesIsEnabled)
1716 DebugTimer->stopTimer();
1717
1718 return;
1719 }
1720
Devang Patel70f44262009-06-29 20:38:13 +00001721 // If main compile unit for this module is not seen than randomly
1722 // select first compile unit.
Devang Patel1dbc7712009-06-29 20:45:18 +00001723 if (!ModuleCU)
1724 ModuleCU = CompileUnits[0];
Devang Patel70f44262009-06-29 20:38:13 +00001725
Devang Patel13e16b62009-06-26 01:49:18 +00001726 // Create DIEs for each of the externally visible global variables.
Devang Patel78ab9e22009-07-30 18:56:46 +00001727 for (DebugInfoFinder::iterator I = DbgFinder.global_variable_begin(),
Devang Patelfd07cf52009-10-05 23:40:42 +00001728 E = DbgFinder.global_variable_end(); I != E; ++I) {
1729 DIGlobalVariable GV(*I);
Devang Patel0000fad2009-12-08 23:21:45 +00001730 if (GV.getContext().getNode() != GV.getCompileUnit().getNode())
Devang Patel4063f6b2009-12-07 21:41:32 +00001731 ScopedGVs.push_back(*I);
Devang Patel0000fad2009-12-08 23:21:45 +00001732 else
1733 constructGlobalVariableDIE(*I);
Devang Patelfd07cf52009-10-05 23:40:42 +00001734 }
Devang Patel13e16b62009-06-26 01:49:18 +00001735
Devang Patel53bb5c92009-11-10 23:06:00 +00001736 // Create DIEs for each subprogram.
Devang Patel78ab9e22009-07-30 18:56:46 +00001737 for (DebugInfoFinder::iterator I = DbgFinder.subprogram_begin(),
1738 E = DbgFinder.subprogram_end(); I != E; ++I)
Devang Patel2c4ceb12009-11-21 02:48:08 +00001739 constructSubprogramDIE(*I);
Devang Patel13e16b62009-06-26 01:49:18 +00001740
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001741 MMI = mmi;
1742 shouldEmit = true;
1743 MMI->setDebugInfoAvailability(true);
1744
1745 // Prime section data.
Chris Lattnerf0144122009-07-28 03:13:23 +00001746 SectionMap.insert(Asm->getObjFileLowering().getTextSection());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001747
1748 // Print out .file directives to specify files for .loc directives. These are
1749 // printed out early so that they precede any .loc directives.
Chris Lattner33adcfb2009-08-22 21:43:10 +00001750 if (MAI->hasDotLocAndDotFile()) {
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001751 for (unsigned i = 1, e = getNumSourceIds()+1; i != e; ++i) {
1752 // Remember source id starts at 1.
1753 std::pair<unsigned, unsigned> Id = getSourceDirectoryAndFileIds(i);
1754 sys::Path FullPath(getSourceDirectoryName(Id.first));
1755 bool AppendOk =
1756 FullPath.appendComponent(getSourceFileName(Id.second));
1757 assert(AppendOk && "Could not append filename to directory!");
1758 AppendOk = false;
Chris Lattner74382b72009-08-23 22:45:37 +00001759 Asm->EmitFile(i, FullPath.str());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001760 Asm->EOL();
1761 }
1762 }
1763
1764 // Emit initial sections
Devang Patel2c4ceb12009-11-21 02:48:08 +00001765 emitInitial();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001766
1767 if (TimePassesIsEnabled)
1768 DebugTimer->stopTimer();
1769}
1770
Devang Patel2c4ceb12009-11-21 02:48:08 +00001771/// endModule - Emit all Dwarf sections that should come after the content.
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001772///
Devang Patel2c4ceb12009-11-21 02:48:08 +00001773void DwarfDebug::endModule() {
Devang Patel6f3dc922009-10-06 00:03:14 +00001774 if (!ModuleCU)
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001775 return;
1776
1777 if (TimePassesIsEnabled)
1778 DebugTimer->startTimer();
1779
Devang Patel53bb5c92009-11-10 23:06:00 +00001780 // Attach DW_AT_inline attribute with inlined subprogram DIEs.
1781 for (SmallPtrSet<DIE *, 4>::iterator AI = InlinedSubprogramDIEs.begin(),
1782 AE = InlinedSubprogramDIEs.end(); AI != AE; ++AI) {
1783 DIE *ISP = *AI;
Devang Patel2c4ceb12009-11-21 02:48:08 +00001784 addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
Devang Patel53bb5c92009-11-10 23:06:00 +00001785 }
1786
Devang Patel1d5cc1d2009-12-03 01:25:38 +00001787 // Insert top level DIEs.
1788 for (SmallVector<DIE *, 4>::iterator TI = TopLevelDIEsVector.begin(),
1789 TE = TopLevelDIEsVector.end(); TI != TE; ++TI)
1790 ModuleCU->getCUDie()->addChild(*TI);
1791
Devang Patel5d11eb02009-12-03 19:11:07 +00001792 for (DenseMap<DIE *, WeakVH>::iterator CI = ContainingTypeMap.begin(),
1793 CE = ContainingTypeMap.end(); CI != CE; ++CI) {
1794 DIE *SPDie = CI->first;
1795 MDNode *N = dyn_cast_or_null<MDNode>(CI->second);
1796 if (!N) continue;
1797 DIE *NDie = ModuleCU->getDIE(N);
1798 if (!NDie) continue;
1799 addDIEEntry(SPDie, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, NDie);
1800 addDIEEntry(NDie, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, NDie);
1801 }
1802
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001803 // Standard sections final addresses.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00001804 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getTextSection());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001805 EmitLabel("text_end", 0);
Chris Lattner6c2f9e12009-08-19 05:49:37 +00001806 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getDataSection());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001807 EmitLabel("data_end", 0);
1808
1809 // End text sections.
1810 for (unsigned i = 1, N = SectionMap.size(); i <= N; ++i) {
Chris Lattner6c2f9e12009-08-19 05:49:37 +00001811 Asm->OutStreamer.SwitchSection(SectionMap[i]);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001812 EmitLabel("section_end", i);
1813 }
1814
1815 // Emit common frame information.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001816 emitCommonDebugFrame();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001817
1818 // Emit function debug frame information
1819 for (std::vector<FunctionDebugFrameInfo>::iterator I = DebugFrames.begin(),
1820 E = DebugFrames.end(); I != E; ++I)
Devang Patel2c4ceb12009-11-21 02:48:08 +00001821 emitFunctionDebugFrame(*I);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001822
1823 // Compute DIE offsets and sizes.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001824 computeSizeAndOffsets();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001825
1826 // Emit all the DIEs into a debug info section
Devang Patel2c4ceb12009-11-21 02:48:08 +00001827 emitDebugInfo();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001828
1829 // Corresponding abbreviations into a abbrev section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001830 emitAbbreviations();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001831
1832 // Emit source line correspondence into a debug line section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001833 emitDebugLines();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001834
1835 // Emit info into a debug pubnames section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001836 emitDebugPubNames();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001837
Devang Patel193f7202009-11-24 01:14:22 +00001838 // Emit info into a debug pubtypes section.
1839 emitDebugPubTypes();
1840
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001841 // Emit info into a debug str section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001842 emitDebugStr();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001843
1844 // Emit info into a debug loc section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001845 emitDebugLoc();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001846
1847 // Emit info into a debug aranges section.
1848 EmitDebugARanges();
1849
1850 // Emit info into a debug ranges section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001851 emitDebugRanges();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001852
1853 // Emit info into a debug macinfo section.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001854 emitDebugMacInfo();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001855
1856 // Emit inline info.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001857 emitDebugInlineInfo();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001858
1859 if (TimePassesIsEnabled)
1860 DebugTimer->stopTimer();
1861}
1862
Devang Patel53bb5c92009-11-10 23:06:00 +00001863/// findAbstractVariable - Find abstract variable, if any, associated with Var.
Jim Grosbach7ab38df2009-11-22 19:20:36 +00001864DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &Var,
1865 unsigned FrameIdx,
Devang Patel53bb5c92009-11-10 23:06:00 +00001866 DILocation &ScopeLoc) {
1867
1868 DbgVariable *AbsDbgVariable = AbstractVariables.lookup(Var.getNode());
1869 if (AbsDbgVariable)
1870 return AbsDbgVariable;
1871
1872 DbgScope *Scope = AbstractScopes.lookup(ScopeLoc.getScope().getNode());
1873 if (!Scope)
1874 return NULL;
1875
1876 AbsDbgVariable = new DbgVariable(Var, FrameIdx);
Devang Patel2c4ceb12009-11-21 02:48:08 +00001877 Scope->addVariable(AbsDbgVariable);
Devang Patel53bb5c92009-11-10 23:06:00 +00001878 AbstractVariables[Var.getNode()] = AbsDbgVariable;
1879 return AbsDbgVariable;
1880}
1881
Devang Patel2c4ceb12009-11-21 02:48:08 +00001882/// collectVariableInfo - Populate DbgScope entries with variables' info.
1883void DwarfDebug::collectVariableInfo() {
Devang Patelac1ceb32009-10-09 22:42:28 +00001884 if (!MMI) return;
Devang Patel53bb5c92009-11-10 23:06:00 +00001885
Devang Patele717faa2009-10-06 01:26:37 +00001886 MachineModuleInfo::VariableDbgInfoMapTy &VMap = MMI->getVariableDbgInfo();
1887 for (MachineModuleInfo::VariableDbgInfoMapTy::iterator VI = VMap.begin(),
1888 VE = VMap.end(); VI != VE; ++VI) {
Devang Patelac1ceb32009-10-09 22:42:28 +00001889 MetadataBase *MB = VI->first;
1890 MDNode *Var = dyn_cast_or_null<MDNode>(MB);
Devang Patel53bb5c92009-11-10 23:06:00 +00001891 if (!Var) continue;
Devang Pateleda31212009-10-08 18:48:03 +00001892 DIVariable DV (Var);
Devang Patel53bb5c92009-11-10 23:06:00 +00001893 std::pair< unsigned, MDNode *> VP = VI->second;
1894 DILocation ScopeLoc(VP.second);
1895
1896 DbgScope *Scope =
1897 ConcreteScopes.lookup(ScopeLoc.getOrigLocation().getNode());
1898 if (!Scope)
Jim Grosbach31ef40e2009-11-21 23:12:12 +00001899 Scope = DbgScopeMap.lookup(ScopeLoc.getScope().getNode());
Devang Patelfb0ee432009-11-10 23:20:04 +00001900 // If variable scope is not found then skip this variable.
1901 if (!Scope)
1902 continue;
Devang Patel53bb5c92009-11-10 23:06:00 +00001903
1904 DbgVariable *RegVar = new DbgVariable(DV, VP.first);
Devang Patel2c4ceb12009-11-21 02:48:08 +00001905 Scope->addVariable(RegVar);
Jim Grosbach7ab38df2009-11-22 19:20:36 +00001906 if (DbgVariable *AbsDbgVariable = findAbstractVariable(DV, VP.first,
1907 ScopeLoc))
Devang Patel53bb5c92009-11-10 23:06:00 +00001908 RegVar->setAbstractVariable(AbsDbgVariable);
Devang Patele717faa2009-10-06 01:26:37 +00001909 }
1910}
1911
Devang Patel2c4ceb12009-11-21 02:48:08 +00001912/// beginScope - Process beginning of a scope starting at Label.
1913void DwarfDebug::beginScope(const MachineInstr *MI, unsigned Label) {
Devang Patel0d20ac82009-10-06 01:50:42 +00001914 InsnToDbgScopeMapTy::iterator I = DbgScopeBeginMap.find(MI);
1915 if (I == DbgScopeBeginMap.end())
1916 return;
Dan Gohman277207e2009-11-23 21:30:55 +00001917 ScopeVector &SD = I->second;
Devang Patel53bb5c92009-11-10 23:06:00 +00001918 for (ScopeVector::iterator SDI = SD.begin(), SDE = SD.end();
Jim Grosbach31ef40e2009-11-21 23:12:12 +00001919 SDI != SDE; ++SDI)
Devang Patel0d20ac82009-10-06 01:50:42 +00001920 (*SDI)->setStartLabelID(Label);
1921}
1922
Devang Patel2c4ceb12009-11-21 02:48:08 +00001923/// endScope - Process end of a scope.
1924void DwarfDebug::endScope(const MachineInstr *MI) {
Devang Patel0d20ac82009-10-06 01:50:42 +00001925 InsnToDbgScopeMapTy::iterator I = DbgScopeEndMap.find(MI);
Devang Patel8a4087d2009-10-06 03:15:38 +00001926 if (I == DbgScopeEndMap.end())
Devang Patel0d20ac82009-10-06 01:50:42 +00001927 return;
Devang Patel53bb5c92009-11-10 23:06:00 +00001928
1929 unsigned Label = MMI->NextLabelID();
1930 Asm->printLabel(Label);
Dan Gohmaneecb9912009-12-05 01:42:34 +00001931 O << '\n';
Devang Patel53bb5c92009-11-10 23:06:00 +00001932
Devang Patel0d20ac82009-10-06 01:50:42 +00001933 SmallVector<DbgScope *, 2> &SD = I->second;
1934 for (SmallVector<DbgScope *, 2>::iterator SDI = SD.begin(), SDE = SD.end();
Jim Grosbach31ef40e2009-11-21 23:12:12 +00001935 SDI != SDE; ++SDI)
Devang Patel0d20ac82009-10-06 01:50:42 +00001936 (*SDI)->setEndLabelID(Label);
Devang Patel53bb5c92009-11-10 23:06:00 +00001937 return;
1938}
1939
1940/// createDbgScope - Create DbgScope for the scope.
1941void DwarfDebug::createDbgScope(MDNode *Scope, MDNode *InlinedAt) {
1942
1943 if (!InlinedAt) {
1944 DbgScope *WScope = DbgScopeMap.lookup(Scope);
1945 if (WScope)
1946 return;
1947 WScope = new DbgScope(NULL, DIDescriptor(Scope), NULL);
1948 DbgScopeMap.insert(std::make_pair(Scope, WScope));
Jim Grosbach31ef40e2009-11-21 23:12:12 +00001949 if (DIDescriptor(Scope).isLexicalBlock())
Devang Patel2f105c62009-11-11 00:18:40 +00001950 createDbgScope(DILexicalBlock(Scope).getContext().getNode(), NULL);
Devang Patel53bb5c92009-11-10 23:06:00 +00001951 return;
1952 }
1953
1954 DbgScope *WScope = DbgScopeMap.lookup(InlinedAt);
1955 if (WScope)
1956 return;
1957
1958 WScope = new DbgScope(NULL, DIDescriptor(Scope), InlinedAt);
1959 DbgScopeMap.insert(std::make_pair(InlinedAt, WScope));
1960 DILocation DL(InlinedAt);
1961 createDbgScope(DL.getScope().getNode(), DL.getOrigLocation().getNode());
Devang Patel0d20ac82009-10-06 01:50:42 +00001962}
1963
Devang Patel2c4ceb12009-11-21 02:48:08 +00001964/// extractScopeInformation - Scan machine instructions in this function
Devang Patelaf9e8472009-10-01 20:31:14 +00001965/// and collect DbgScopes. Return true, if atleast one scope was found.
Devang Patel2c4ceb12009-11-21 02:48:08 +00001966bool DwarfDebug::extractScopeInformation(MachineFunction *MF) {
Devang Patelaf9e8472009-10-01 20:31:14 +00001967 // If scope information was extracted using .dbg intrinsics then there is not
1968 // any need to extract these information by scanning each instruction.
1969 if (!DbgScopeMap.empty())
1970 return false;
1971
Devang Patel53bb5c92009-11-10 23:06:00 +00001972 // Scan each instruction and create scopes. First build working set of scopes.
Devang Patelaf9e8472009-10-01 20:31:14 +00001973 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
1974 I != E; ++I) {
1975 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
1976 II != IE; ++II) {
1977 const MachineInstr *MInsn = II;
1978 DebugLoc DL = MInsn->getDebugLoc();
Devang Patel53bb5c92009-11-10 23:06:00 +00001979 if (DL.isUnknown()) continue;
Devang Patelaf9e8472009-10-01 20:31:14 +00001980 DebugLocTuple DLT = MF->getDebugLocTuple(DL);
Devang Patel53bb5c92009-11-10 23:06:00 +00001981 if (!DLT.Scope) continue;
Devang Patelaf9e8472009-10-01 20:31:14 +00001982 // There is no need to create another DIE for compile unit. For all
Jim Grosbach31ef40e2009-11-21 23:12:12 +00001983 // other scopes, create one DbgScope now. This will be translated
Devang Patelaf9e8472009-10-01 20:31:14 +00001984 // into a scope DIE at the end.
Devang Patel53bb5c92009-11-10 23:06:00 +00001985 if (DIDescriptor(DLT.Scope).isCompileUnit()) continue;
1986 createDbgScope(DLT.Scope, DLT.InlinedAtLoc);
1987 }
1988 }
1989
1990
1991 // Build scope hierarchy using working set of scopes.
1992 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
1993 I != E; ++I) {
1994 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
1995 II != IE; ++II) {
1996 const MachineInstr *MInsn = II;
1997 DebugLoc DL = MInsn->getDebugLoc();
1998 if (DL.isUnknown()) continue;
1999 DebugLocTuple DLT = MF->getDebugLocTuple(DL);
2000 if (!DLT.Scope) continue;
2001 // There is no need to create another DIE for compile unit. For all
Jim Grosbach31ef40e2009-11-21 23:12:12 +00002002 // other scopes, create one DbgScope now. This will be translated
Devang Patel53bb5c92009-11-10 23:06:00 +00002003 // into a scope DIE at the end.
2004 if (DIDescriptor(DLT.Scope).isCompileUnit()) continue;
2005 DbgScope *Scope = getUpdatedDbgScope(DLT.Scope, MInsn, DLT.InlinedAtLoc);
2006 Scope->setLastInsn(MInsn);
Devang Patelaf9e8472009-10-01 20:31:14 +00002007 }
2008 }
2009
2010 // If a scope's last instruction is not set then use its child scope's
2011 // last instruction as this scope's last instrunction.
Devang Patelbdf45cb2009-10-27 20:47:17 +00002012 for (ValueMap<MDNode *, DbgScope *>::iterator DI = DbgScopeMap.begin(),
Devang Patelaf9e8472009-10-01 20:31:14 +00002013 DE = DbgScopeMap.end(); DI != DE; ++DI) {
Devang Patel53bb5c92009-11-10 23:06:00 +00002014 if (DI->second->isAbstractScope())
2015 continue;
Devang Patelaf9e8472009-10-01 20:31:14 +00002016 assert (DI->second->getFirstInsn() && "Invalid first instruction!");
Devang Patel2c4ceb12009-11-21 02:48:08 +00002017 DI->second->fixInstructionMarkers();
Devang Patelaf9e8472009-10-01 20:31:14 +00002018 assert (DI->second->getLastInsn() && "Invalid last instruction!");
2019 }
2020
2021 // Each scope has first instruction and last instruction to mark beginning
2022 // and end of a scope respectively. Create an inverse map that list scopes
2023 // starts (and ends) with an instruction. One instruction may start (or end)
2024 // multiple scopes.
Devang Patelbdf45cb2009-10-27 20:47:17 +00002025 for (ValueMap<MDNode *, DbgScope *>::iterator DI = DbgScopeMap.begin(),
Devang Patelaf9e8472009-10-01 20:31:14 +00002026 DE = DbgScopeMap.end(); DI != DE; ++DI) {
2027 DbgScope *S = DI->second;
Devang Patel53bb5c92009-11-10 23:06:00 +00002028 if (S->isAbstractScope())
2029 continue;
Devang Patelaf9e8472009-10-01 20:31:14 +00002030 const MachineInstr *MI = S->getFirstInsn();
2031 assert (MI && "DbgScope does not have first instruction!");
2032
2033 InsnToDbgScopeMapTy::iterator IDI = DbgScopeBeginMap.find(MI);
2034 if (IDI != DbgScopeBeginMap.end())
2035 IDI->second.push_back(S);
2036 else
Devang Patel53bb5c92009-11-10 23:06:00 +00002037 DbgScopeBeginMap[MI].push_back(S);
Devang Patelaf9e8472009-10-01 20:31:14 +00002038
2039 MI = S->getLastInsn();
2040 assert (MI && "DbgScope does not have last instruction!");
2041 IDI = DbgScopeEndMap.find(MI);
2042 if (IDI != DbgScopeEndMap.end())
2043 IDI->second.push_back(S);
2044 else
Devang Patel53bb5c92009-11-10 23:06:00 +00002045 DbgScopeEndMap[MI].push_back(S);
Devang Patelaf9e8472009-10-01 20:31:14 +00002046 }
2047
2048 return !DbgScopeMap.empty();
2049}
2050
Devang Patel2c4ceb12009-11-21 02:48:08 +00002051/// beginFunction - Gather pre-function debug information. Assumes being
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002052/// emitted immediately after the function entry point.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002053void DwarfDebug::beginFunction(MachineFunction *MF) {
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002054 this->MF = MF;
2055
2056 if (!ShouldEmitDwarfDebug()) return;
2057
2058 if (TimePassesIsEnabled)
2059 DebugTimer->startTimer();
2060
Devang Patel2c4ceb12009-11-21 02:48:08 +00002061 if (!extractScopeInformation(MF))
Devang Patel60b35bd2009-10-06 18:37:31 +00002062 return;
Devang Patel2c4ceb12009-11-21 02:48:08 +00002063
2064 collectVariableInfo();
Devang Patel60b35bd2009-10-06 18:37:31 +00002065
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002066 // Begin accumulating function debug information.
2067 MMI->BeginFunction(MF);
2068
2069 // Assumes in correct section after the entry point.
2070 EmitLabel("func_begin", ++SubprogramCount);
2071
2072 // Emit label for the implicitly defined dbg.stoppoint at the start of the
2073 // function.
Devang Patelac1ceb32009-10-09 22:42:28 +00002074 DebugLoc FDL = MF->getDefaultDebugLoc();
2075 if (!FDL.isUnknown()) {
2076 DebugLocTuple DLT = MF->getDebugLocTuple(FDL);
2077 unsigned LabelID = 0;
Devang Patel1619dc32009-10-13 23:28:53 +00002078 DISubprogram SP = getDISubprogram(DLT.Scope);
Devang Patelac1ceb32009-10-09 22:42:28 +00002079 if (!SP.isNull())
Devang Patel2c4ceb12009-11-21 02:48:08 +00002080 LabelID = recordSourceLine(SP.getLineNumber(), 0, DLT.Scope);
Devang Patelac1ceb32009-10-09 22:42:28 +00002081 else
Devang Patel2c4ceb12009-11-21 02:48:08 +00002082 LabelID = recordSourceLine(DLT.Line, DLT.Col, DLT.Scope);
Devang Patelac1ceb32009-10-09 22:42:28 +00002083 Asm->printLabel(LabelID);
2084 O << '\n';
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002085 }
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002086 if (TimePassesIsEnabled)
2087 DebugTimer->stopTimer();
2088}
2089
Devang Patel2c4ceb12009-11-21 02:48:08 +00002090/// endFunction - Gather and emit post-function debug information.
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002091///
Devang Patel2c4ceb12009-11-21 02:48:08 +00002092void DwarfDebug::endFunction(MachineFunction *MF) {
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002093 if (!ShouldEmitDwarfDebug()) return;
2094
2095 if (TimePassesIsEnabled)
2096 DebugTimer->startTimer();
2097
Devang Patelac1ceb32009-10-09 22:42:28 +00002098 if (DbgScopeMap.empty())
2099 return;
Devang Patel70d75ca2009-11-12 19:02:56 +00002100
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002101 // Define end label for subprogram.
2102 EmitLabel("func_end", SubprogramCount);
2103
2104 // Get function line info.
2105 if (!Lines.empty()) {
2106 // Get section line info.
Chris Lattner290c2f52009-08-03 23:20:21 +00002107 unsigned ID = SectionMap.insert(Asm->getCurrentSection());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002108 if (SectionSourceLines.size() < ID) SectionSourceLines.resize(ID);
2109 std::vector<SrcLineInfo> &SectionLineInfos = SectionSourceLines[ID-1];
2110 // Append the function info to section info.
2111 SectionLineInfos.insert(SectionLineInfos.end(),
2112 Lines.begin(), Lines.end());
2113 }
2114
Devang Patel53bb5c92009-11-10 23:06:00 +00002115 // Construct abstract scopes.
2116 for (SmallVector<DbgScope *, 4>::iterator AI = AbstractScopesList.begin(),
Jim Grosbach31ef40e2009-11-21 23:12:12 +00002117 AE = AbstractScopesList.end(); AI != AE; ++AI)
Devang Patel2c4ceb12009-11-21 02:48:08 +00002118 constructScopeDIE(*AI);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002119
Devang Patel2c4ceb12009-11-21 02:48:08 +00002120 constructScopeDIE(CurrentFnDbgScope);
Devang Patel70d75ca2009-11-12 19:02:56 +00002121
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002122 DebugFrames.push_back(FunctionDebugFrameInfo(SubprogramCount,
2123 MMI->getFrameMoves()));
2124
2125 // Clear debug info
Devang Patelc09ddc12009-12-01 18:13:48 +00002126 CurrentFnDbgScope = NULL;
2127 DbgScopeMap.clear();
2128 DbgScopeBeginMap.clear();
2129 DbgScopeEndMap.clear();
2130 ConcreteScopes.clear();
2131 AbstractScopesList.clear();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002132
2133 Lines.clear();
Devang Patelc09ddc12009-12-01 18:13:48 +00002134
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002135 if (TimePassesIsEnabled)
2136 DebugTimer->stopTimer();
2137}
2138
Devang Patel2c4ceb12009-11-21 02:48:08 +00002139/// recordSourceLine - Records location information and associates it with a
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002140/// label. Returns a unique label ID used to generate a label and provide
2141/// correspondence to the source line list.
Jim Grosbach31ef40e2009-11-21 23:12:12 +00002142unsigned DwarfDebug::recordSourceLine(unsigned Line, unsigned Col,
Devang Patelf84548d2009-10-05 18:03:19 +00002143 MDNode *S) {
Devang Patele4b27562009-08-28 23:24:31 +00002144 if (!MMI)
2145 return 0;
2146
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002147 if (TimePassesIsEnabled)
2148 DebugTimer->startTimer();
2149
Devang Patel65dbc902009-11-25 17:36:49 +00002150 StringRef Dir;
2151 StringRef Fn;
Devang Patelf84548d2009-10-05 18:03:19 +00002152
2153 DIDescriptor Scope(S);
2154 if (Scope.isCompileUnit()) {
2155 DICompileUnit CU(S);
2156 Dir = CU.getDirectory();
2157 Fn = CU.getFilename();
2158 } else if (Scope.isSubprogram()) {
2159 DISubprogram SP(S);
2160 Dir = SP.getDirectory();
2161 Fn = SP.getFilename();
2162 } else if (Scope.isLexicalBlock()) {
2163 DILexicalBlock DB(S);
2164 Dir = DB.getDirectory();
2165 Fn = DB.getFilename();
2166 } else
2167 assert (0 && "Unexpected scope info");
2168
2169 unsigned Src = GetOrCreateSourceID(Dir, Fn);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002170 unsigned ID = MMI->NextLabelID();
2171 Lines.push_back(SrcLineInfo(Line, Col, Src, ID));
2172
2173 if (TimePassesIsEnabled)
2174 DebugTimer->stopTimer();
2175
2176 return ID;
2177}
2178
2179/// getOrCreateSourceID - Public version of GetOrCreateSourceID. This can be
2180/// timed. Look up the source id with the given directory and source file
2181/// names. If none currently exists, create a new id and insert it in the
2182/// SourceIds map. This can update DirectoryNames and SourceFileNames maps as
2183/// well.
2184unsigned DwarfDebug::getOrCreateSourceID(const std::string &DirName,
2185 const std::string &FileName) {
2186 if (TimePassesIsEnabled)
2187 DebugTimer->startTimer();
2188
Devang Patel5ccdd102009-09-29 18:40:58 +00002189 unsigned SrcId = GetOrCreateSourceID(DirName.c_str(), FileName.c_str());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002190
2191 if (TimePassesIsEnabled)
2192 DebugTimer->stopTimer();
2193
2194 return SrcId;
2195}
2196
Bill Wendling829e67b2009-05-20 23:22:40 +00002197//===----------------------------------------------------------------------===//
2198// Emit Methods
2199//===----------------------------------------------------------------------===//
2200
Devang Patel2c4ceb12009-11-21 02:48:08 +00002201/// computeSizeAndOffset - Compute the size and offset of a DIE.
Bill Wendling94d04b82009-05-20 23:21:38 +00002202///
Jim Grosbach7ab38df2009-11-22 19:20:36 +00002203unsigned
2204DwarfDebug::computeSizeAndOffset(DIE *Die, unsigned Offset, bool Last) {
Bill Wendling94d04b82009-05-20 23:21:38 +00002205 // Get the children.
2206 const std::vector<DIE *> &Children = Die->getChildren();
2207
2208 // If not last sibling and has children then add sibling offset attribute.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002209 if (!Last && !Children.empty()) Die->addSiblingOffset();
Bill Wendling94d04b82009-05-20 23:21:38 +00002210
2211 // Record the abbreviation.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002212 assignAbbrevNumber(Die->getAbbrev());
Bill Wendling94d04b82009-05-20 23:21:38 +00002213
2214 // Get the abbreviation for this DIE.
2215 unsigned AbbrevNumber = Die->getAbbrevNumber();
2216 const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2217
2218 // Set DIE offset
2219 Die->setOffset(Offset);
2220
2221 // Start the size with the size of abbreviation code.
Chris Lattneraf76e592009-08-22 20:48:53 +00002222 Offset += MCAsmInfo::getULEB128Size(AbbrevNumber);
Bill Wendling94d04b82009-05-20 23:21:38 +00002223
2224 const SmallVector<DIEValue*, 32> &Values = Die->getValues();
2225 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
2226
2227 // Size the DIE attribute values.
2228 for (unsigned i = 0, N = Values.size(); i < N; ++i)
2229 // Size attribute value.
2230 Offset += Values[i]->SizeOf(TD, AbbrevData[i].getForm());
2231
2232 // Size the DIE children if any.
2233 if (!Children.empty()) {
2234 assert(Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes &&
2235 "Children flag not set");
2236
2237 for (unsigned j = 0, M = Children.size(); j < M; ++j)
Devang Patel2c4ceb12009-11-21 02:48:08 +00002238 Offset = computeSizeAndOffset(Children[j], Offset, (j + 1) == M);
Bill Wendling94d04b82009-05-20 23:21:38 +00002239
2240 // End of children marker.
2241 Offset += sizeof(int8_t);
2242 }
2243
2244 Die->setSize(Offset - Die->getOffset());
2245 return Offset;
2246}
2247
Devang Patel2c4ceb12009-11-21 02:48:08 +00002248/// computeSizeAndOffsets - Compute the size and offset of all the DIEs.
Bill Wendling94d04b82009-05-20 23:21:38 +00002249///
Devang Patel2c4ceb12009-11-21 02:48:08 +00002250void DwarfDebug::computeSizeAndOffsets() {
Bill Wendling94d04b82009-05-20 23:21:38 +00002251 // Compute size of compile unit header.
2252 static unsigned Offset =
2253 sizeof(int32_t) + // Length of Compilation Unit Info
2254 sizeof(int16_t) + // DWARF version number
2255 sizeof(int32_t) + // Offset Into Abbrev. Section
2256 sizeof(int8_t); // Pointer Size (in bytes)
2257
Devang Patel2c4ceb12009-11-21 02:48:08 +00002258 computeSizeAndOffset(ModuleCU->getCUDie(), Offset, true);
Devang Patel1dbc7712009-06-29 20:45:18 +00002259 CompileUnitOffsets[ModuleCU] = 0;
Bill Wendling94d04b82009-05-20 23:21:38 +00002260}
2261
Devang Patel2c4ceb12009-11-21 02:48:08 +00002262/// emitInitial - Emit initial Dwarf declarations. This is necessary for cc
Bill Wendling94d04b82009-05-20 23:21:38 +00002263/// tools to recognize the object file contains Dwarf information.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002264void DwarfDebug::emitInitial() {
Bill Wendling94d04b82009-05-20 23:21:38 +00002265 // Check to see if we already emitted intial headers.
2266 if (didInitial) return;
2267 didInitial = true;
2268
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002269 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
Daniel Dunbarf612ff62009-09-19 20:40:05 +00002270
Bill Wendling94d04b82009-05-20 23:21:38 +00002271 // Dwarf sections base addresses.
Chris Lattner33adcfb2009-08-22 21:43:10 +00002272 if (MAI->doesDwarfRequireFrameSection()) {
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002273 Asm->OutStreamer.SwitchSection(TLOF.getDwarfFrameSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002274 EmitLabel("section_debug_frame", 0);
2275 }
2276
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002277 Asm->OutStreamer.SwitchSection(TLOF.getDwarfInfoSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002278 EmitLabel("section_info", 0);
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002279 Asm->OutStreamer.SwitchSection(TLOF.getDwarfAbbrevSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002280 EmitLabel("section_abbrev", 0);
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002281 Asm->OutStreamer.SwitchSection(TLOF.getDwarfARangesSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002282 EmitLabel("section_aranges", 0);
2283
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002284 if (const MCSection *LineInfoDirective = TLOF.getDwarfMacroInfoSection()) {
2285 Asm->OutStreamer.SwitchSection(LineInfoDirective);
Bill Wendling94d04b82009-05-20 23:21:38 +00002286 EmitLabel("section_macinfo", 0);
2287 }
2288
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002289 Asm->OutStreamer.SwitchSection(TLOF.getDwarfLineSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002290 EmitLabel("section_line", 0);
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002291 Asm->OutStreamer.SwitchSection(TLOF.getDwarfLocSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002292 EmitLabel("section_loc", 0);
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002293 Asm->OutStreamer.SwitchSection(TLOF.getDwarfPubNamesSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002294 EmitLabel("section_pubnames", 0);
Devang Patel193f7202009-11-24 01:14:22 +00002295 Asm->OutStreamer.SwitchSection(TLOF.getDwarfPubTypesSection());
2296 EmitLabel("section_pubtypes", 0);
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002297 Asm->OutStreamer.SwitchSection(TLOF.getDwarfStrSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002298 EmitLabel("section_str", 0);
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002299 Asm->OutStreamer.SwitchSection(TLOF.getDwarfRangesSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002300 EmitLabel("section_ranges", 0);
2301
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002302 Asm->OutStreamer.SwitchSection(TLOF.getTextSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002303 EmitLabel("text_begin", 0);
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002304 Asm->OutStreamer.SwitchSection(TLOF.getDataSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002305 EmitLabel("data_begin", 0);
2306}
2307
Devang Patel2c4ceb12009-11-21 02:48:08 +00002308/// emitDIE - Recusively Emits a debug information entry.
Bill Wendling94d04b82009-05-20 23:21:38 +00002309///
Devang Patel2c4ceb12009-11-21 02:48:08 +00002310void DwarfDebug::emitDIE(DIE *Die) {
Bill Wendling94d04b82009-05-20 23:21:38 +00002311 // Get the abbreviation for this DIE.
2312 unsigned AbbrevNumber = Die->getAbbrevNumber();
2313 const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2314
2315 Asm->EOL();
2316
2317 // Emit the code (index) for the abbreviation.
2318 Asm->EmitULEB128Bytes(AbbrevNumber);
2319
2320 if (Asm->isVerbose())
2321 Asm->EOL(std::string("Abbrev [" +
2322 utostr(AbbrevNumber) +
2323 "] 0x" + utohexstr(Die->getOffset()) +
2324 ":0x" + utohexstr(Die->getSize()) + " " +
2325 dwarf::TagString(Abbrev->getTag())));
2326 else
2327 Asm->EOL();
2328
2329 SmallVector<DIEValue*, 32> &Values = Die->getValues();
2330 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
2331
2332 // Emit the DIE attribute values.
2333 for (unsigned i = 0, N = Values.size(); i < N; ++i) {
2334 unsigned Attr = AbbrevData[i].getAttribute();
2335 unsigned Form = AbbrevData[i].getForm();
2336 assert(Form && "Too many attributes for DIE (check abbreviation)");
2337
2338 switch (Attr) {
2339 case dwarf::DW_AT_sibling:
Devang Patel2c4ceb12009-11-21 02:48:08 +00002340 Asm->EmitInt32(Die->getSiblingOffset());
Bill Wendling94d04b82009-05-20 23:21:38 +00002341 break;
2342 case dwarf::DW_AT_abstract_origin: {
2343 DIEEntry *E = cast<DIEEntry>(Values[i]);
2344 DIE *Origin = E->getEntry();
Devang Patel53bb5c92009-11-10 23:06:00 +00002345 unsigned Addr = Origin->getOffset();
Bill Wendling94d04b82009-05-20 23:21:38 +00002346 Asm->EmitInt32(Addr);
2347 break;
2348 }
2349 default:
2350 // Emit an attribute using the defined form.
2351 Values[i]->EmitValue(this, Form);
2352 break;
2353 }
2354
2355 Asm->EOL(dwarf::AttributeString(Attr));
2356 }
2357
2358 // Emit the DIE children if any.
2359 if (Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes) {
2360 const std::vector<DIE *> &Children = Die->getChildren();
2361
2362 for (unsigned j = 0, M = Children.size(); j < M; ++j)
Devang Patel2c4ceb12009-11-21 02:48:08 +00002363 emitDIE(Children[j]);
Bill Wendling94d04b82009-05-20 23:21:38 +00002364
2365 Asm->EmitInt8(0); Asm->EOL("End Of Children Mark");
2366 }
2367}
2368
Devang Patel8a241142009-12-09 18:24:21 +00002369/// emitDebugInfo - Emit the debug info section.
Bill Wendling94d04b82009-05-20 23:21:38 +00002370///
Devang Patel8a241142009-12-09 18:24:21 +00002371void DwarfDebug::emitDebugInfo() {
2372 // Start debug info section.
2373 Asm->OutStreamer.SwitchSection(
2374 Asm->getObjFileLowering().getDwarfInfoSection());
2375 DIE *Die = ModuleCU->getCUDie();
Bill Wendling94d04b82009-05-20 23:21:38 +00002376
2377 // Emit the compile units header.
Devang Patel8a241142009-12-09 18:24:21 +00002378 EmitLabel("info_begin", ModuleCU->getID());
Bill Wendling94d04b82009-05-20 23:21:38 +00002379
2380 // Emit size of content not including length itself
2381 unsigned ContentSize = Die->getSize() +
2382 sizeof(int16_t) + // DWARF version number
2383 sizeof(int32_t) + // Offset Into Abbrev. Section
2384 sizeof(int8_t) + // Pointer Size (in bytes)
2385 sizeof(int32_t); // FIXME - extra pad for gdb bug.
2386
2387 Asm->EmitInt32(ContentSize); Asm->EOL("Length of Compilation Unit Info");
2388 Asm->EmitInt16(dwarf::DWARF_VERSION); Asm->EOL("DWARF version number");
2389 EmitSectionOffset("abbrev_begin", "section_abbrev", 0, 0, true, false);
2390 Asm->EOL("Offset Into Abbrev. Section");
2391 Asm->EmitInt8(TD->getPointerSize()); Asm->EOL("Address Size (in bytes)");
2392
Devang Patel2c4ceb12009-11-21 02:48:08 +00002393 emitDIE(Die);
Bill Wendling94d04b82009-05-20 23:21:38 +00002394 // FIXME - extra padding for gdb bug.
2395 Asm->EmitInt8(0); Asm->EOL("Extra Pad For GDB");
2396 Asm->EmitInt8(0); Asm->EOL("Extra Pad For GDB");
2397 Asm->EmitInt8(0); Asm->EOL("Extra Pad For GDB");
2398 Asm->EmitInt8(0); Asm->EOL("Extra Pad For GDB");
Devang Patel8a241142009-12-09 18:24:21 +00002399 EmitLabel("info_end", ModuleCU->getID());
Bill Wendling94d04b82009-05-20 23:21:38 +00002400
2401 Asm->EOL();
Bill Wendling94d04b82009-05-20 23:21:38 +00002402
Bill Wendling94d04b82009-05-20 23:21:38 +00002403}
2404
Devang Patel2c4ceb12009-11-21 02:48:08 +00002405/// emitAbbreviations - Emit the abbreviation section.
Bill Wendling94d04b82009-05-20 23:21:38 +00002406///
Devang Patel2c4ceb12009-11-21 02:48:08 +00002407void DwarfDebug::emitAbbreviations() const {
Bill Wendling94d04b82009-05-20 23:21:38 +00002408 // Check to see if it is worth the effort.
2409 if (!Abbreviations.empty()) {
2410 // Start the debug abbrev section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002411 Asm->OutStreamer.SwitchSection(
2412 Asm->getObjFileLowering().getDwarfAbbrevSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002413
2414 EmitLabel("abbrev_begin", 0);
2415
2416 // For each abbrevation.
2417 for (unsigned i = 0, N = Abbreviations.size(); i < N; ++i) {
2418 // Get abbreviation data
2419 const DIEAbbrev *Abbrev = Abbreviations[i];
2420
2421 // Emit the abbrevations code (base 1 index.)
2422 Asm->EmitULEB128Bytes(Abbrev->getNumber());
2423 Asm->EOL("Abbreviation Code");
2424
2425 // Emit the abbreviations data.
2426 Abbrev->Emit(Asm);
2427
2428 Asm->EOL();
2429 }
2430
2431 // Mark end of abbreviations.
2432 Asm->EmitULEB128Bytes(0); Asm->EOL("EOM(3)");
2433
2434 EmitLabel("abbrev_end", 0);
2435 Asm->EOL();
2436 }
2437}
2438
Devang Patel2c4ceb12009-11-21 02:48:08 +00002439/// emitEndOfLineMatrix - Emit the last address of the section and the end of
Bill Wendling94d04b82009-05-20 23:21:38 +00002440/// the line matrix.
2441///
Devang Patel2c4ceb12009-11-21 02:48:08 +00002442void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) {
Bill Wendling94d04b82009-05-20 23:21:38 +00002443 // Define last address of section.
2444 Asm->EmitInt8(0); Asm->EOL("Extended Op");
2445 Asm->EmitInt8(TD->getPointerSize() + 1); Asm->EOL("Op size");
2446 Asm->EmitInt8(dwarf::DW_LNE_set_address); Asm->EOL("DW_LNE_set_address");
2447 EmitReference("section_end", SectionEnd); Asm->EOL("Section end label");
2448
2449 // Mark end of matrix.
2450 Asm->EmitInt8(0); Asm->EOL("DW_LNE_end_sequence");
2451 Asm->EmitULEB128Bytes(1); Asm->EOL();
2452 Asm->EmitInt8(1); Asm->EOL();
2453}
2454
Devang Patel2c4ceb12009-11-21 02:48:08 +00002455/// emitDebugLines - Emit source line information.
Bill Wendling94d04b82009-05-20 23:21:38 +00002456///
Devang Patel2c4ceb12009-11-21 02:48:08 +00002457void DwarfDebug::emitDebugLines() {
Bill Wendling94d04b82009-05-20 23:21:38 +00002458 // If the target is using .loc/.file, the assembler will be emitting the
2459 // .debug_line table automatically.
Chris Lattner33adcfb2009-08-22 21:43:10 +00002460 if (MAI->hasDotLocAndDotFile())
Bill Wendling94d04b82009-05-20 23:21:38 +00002461 return;
2462
2463 // Minimum line delta, thus ranging from -10..(255-10).
2464 const int MinLineDelta = -(dwarf::DW_LNS_fixed_advance_pc + 1);
2465 // Maximum line delta, thus ranging from -10..(255-10).
2466 const int MaxLineDelta = 255 + MinLineDelta;
2467
2468 // Start the dwarf line section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002469 Asm->OutStreamer.SwitchSection(
2470 Asm->getObjFileLowering().getDwarfLineSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002471
2472 // Construct the section header.
2473 EmitDifference("line_end", 0, "line_begin", 0, true);
2474 Asm->EOL("Length of Source Line Info");
2475 EmitLabel("line_begin", 0);
2476
2477 Asm->EmitInt16(dwarf::DWARF_VERSION); Asm->EOL("DWARF version number");
2478
2479 EmitDifference("line_prolog_end", 0, "line_prolog_begin", 0, true);
2480 Asm->EOL("Prolog Length");
2481 EmitLabel("line_prolog_begin", 0);
2482
2483 Asm->EmitInt8(1); Asm->EOL("Minimum Instruction Length");
2484
2485 Asm->EmitInt8(1); Asm->EOL("Default is_stmt_start flag");
2486
2487 Asm->EmitInt8(MinLineDelta); Asm->EOL("Line Base Value (Special Opcodes)");
2488
2489 Asm->EmitInt8(MaxLineDelta); Asm->EOL("Line Range Value (Special Opcodes)");
2490
2491 Asm->EmitInt8(-MinLineDelta); Asm->EOL("Special Opcode Base");
2492
2493 // Line number standard opcode encodings argument count
2494 Asm->EmitInt8(0); Asm->EOL("DW_LNS_copy arg count");
2495 Asm->EmitInt8(1); Asm->EOL("DW_LNS_advance_pc arg count");
2496 Asm->EmitInt8(1); Asm->EOL("DW_LNS_advance_line arg count");
2497 Asm->EmitInt8(1); Asm->EOL("DW_LNS_set_file arg count");
2498 Asm->EmitInt8(1); Asm->EOL("DW_LNS_set_column arg count");
2499 Asm->EmitInt8(0); Asm->EOL("DW_LNS_negate_stmt arg count");
2500 Asm->EmitInt8(0); Asm->EOL("DW_LNS_set_basic_block arg count");
2501 Asm->EmitInt8(0); Asm->EOL("DW_LNS_const_add_pc arg count");
2502 Asm->EmitInt8(1); Asm->EOL("DW_LNS_fixed_advance_pc arg count");
2503
2504 // Emit directories.
2505 for (unsigned DI = 1, DE = getNumSourceDirectories()+1; DI != DE; ++DI) {
2506 Asm->EmitString(getSourceDirectoryName(DI));
2507 Asm->EOL("Directory");
2508 }
2509
2510 Asm->EmitInt8(0); Asm->EOL("End of directories");
2511
2512 // Emit files.
2513 for (unsigned SI = 1, SE = getNumSourceIds()+1; SI != SE; ++SI) {
2514 // Remember source id starts at 1.
2515 std::pair<unsigned, unsigned> Id = getSourceDirectoryAndFileIds(SI);
2516 Asm->EmitString(getSourceFileName(Id.second));
2517 Asm->EOL("Source");
2518 Asm->EmitULEB128Bytes(Id.first);
2519 Asm->EOL("Directory #");
2520 Asm->EmitULEB128Bytes(0);
2521 Asm->EOL("Mod date");
2522 Asm->EmitULEB128Bytes(0);
2523 Asm->EOL("File size");
2524 }
2525
2526 Asm->EmitInt8(0); Asm->EOL("End of files");
2527
2528 EmitLabel("line_prolog_end", 0);
2529
2530 // A sequence for each text section.
2531 unsigned SecSrcLinesSize = SectionSourceLines.size();
2532
2533 for (unsigned j = 0; j < SecSrcLinesSize; ++j) {
2534 // Isolate current sections line info.
2535 const std::vector<SrcLineInfo> &LineInfos = SectionSourceLines[j];
2536
Chris Lattner93b6db32009-08-08 23:39:42 +00002537 /*if (Asm->isVerbose()) {
Chris Lattnera87dea42009-07-31 18:48:30 +00002538 const MCSection *S = SectionMap[j + 1];
Chris Lattner33adcfb2009-08-22 21:43:10 +00002539 O << '\t' << MAI->getCommentString() << " Section"
Bill Wendling94d04b82009-05-20 23:21:38 +00002540 << S->getName() << '\n';
Chris Lattner93b6db32009-08-08 23:39:42 +00002541 }*/
2542 Asm->EOL();
Bill Wendling94d04b82009-05-20 23:21:38 +00002543
2544 // Dwarf assumes we start with first line of first source file.
2545 unsigned Source = 1;
2546 unsigned Line = 1;
2547
2548 // Construct rows of the address, source, line, column matrix.
2549 for (unsigned i = 0, N = LineInfos.size(); i < N; ++i) {
2550 const SrcLineInfo &LineInfo = LineInfos[i];
2551 unsigned LabelID = MMI->MappedLabel(LineInfo.getLabelID());
2552 if (!LabelID) continue;
2553
Caroline Ticec6f9d622009-09-11 18:25:54 +00002554 if (LineInfo.getLine() == 0) continue;
2555
Bill Wendling94d04b82009-05-20 23:21:38 +00002556 if (!Asm->isVerbose())
2557 Asm->EOL();
2558 else {
2559 std::pair<unsigned, unsigned> SourceID =
2560 getSourceDirectoryAndFileIds(LineInfo.getSourceID());
Chris Lattner33adcfb2009-08-22 21:43:10 +00002561 O << '\t' << MAI->getCommentString() << ' '
Dan Gohmanb3b98212009-12-05 02:00:34 +00002562 << getSourceDirectoryName(SourceID.first) << '/'
Bill Wendling94d04b82009-05-20 23:21:38 +00002563 << getSourceFileName(SourceID.second)
Dan Gohmanb3b98212009-12-05 02:00:34 +00002564 << ':' << utostr_32(LineInfo.getLine()) << '\n';
Bill Wendling94d04b82009-05-20 23:21:38 +00002565 }
2566
2567 // Define the line address.
2568 Asm->EmitInt8(0); Asm->EOL("Extended Op");
2569 Asm->EmitInt8(TD->getPointerSize() + 1); Asm->EOL("Op size");
2570 Asm->EmitInt8(dwarf::DW_LNE_set_address); Asm->EOL("DW_LNE_set_address");
2571 EmitReference("label", LabelID); Asm->EOL("Location label");
2572
2573 // If change of source, then switch to the new source.
2574 if (Source != LineInfo.getSourceID()) {
2575 Source = LineInfo.getSourceID();
2576 Asm->EmitInt8(dwarf::DW_LNS_set_file); Asm->EOL("DW_LNS_set_file");
2577 Asm->EmitULEB128Bytes(Source); Asm->EOL("New Source");
2578 }
2579
2580 // If change of line.
2581 if (Line != LineInfo.getLine()) {
2582 // Determine offset.
2583 int Offset = LineInfo.getLine() - Line;
2584 int Delta = Offset - MinLineDelta;
2585
2586 // Update line.
2587 Line = LineInfo.getLine();
2588
2589 // If delta is small enough and in range...
2590 if (Delta >= 0 && Delta < (MaxLineDelta - 1)) {
2591 // ... then use fast opcode.
2592 Asm->EmitInt8(Delta - MinLineDelta); Asm->EOL("Line Delta");
2593 } else {
2594 // ... otherwise use long hand.
2595 Asm->EmitInt8(dwarf::DW_LNS_advance_line);
2596 Asm->EOL("DW_LNS_advance_line");
2597 Asm->EmitSLEB128Bytes(Offset); Asm->EOL("Line Offset");
2598 Asm->EmitInt8(dwarf::DW_LNS_copy); Asm->EOL("DW_LNS_copy");
2599 }
2600 } else {
2601 // Copy the previous row (different address or source)
2602 Asm->EmitInt8(dwarf::DW_LNS_copy); Asm->EOL("DW_LNS_copy");
2603 }
2604 }
2605
Devang Patel2c4ceb12009-11-21 02:48:08 +00002606 emitEndOfLineMatrix(j + 1);
Bill Wendling94d04b82009-05-20 23:21:38 +00002607 }
2608
2609 if (SecSrcLinesSize == 0)
2610 // Because we're emitting a debug_line section, we still need a line
2611 // table. The linker and friends expect it to exist. If there's nothing to
2612 // put into it, emit an empty table.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002613 emitEndOfLineMatrix(1);
Bill Wendling94d04b82009-05-20 23:21:38 +00002614
2615 EmitLabel("line_end", 0);
2616 Asm->EOL();
2617}
2618
Devang Patel2c4ceb12009-11-21 02:48:08 +00002619/// emitCommonDebugFrame - Emit common frame info into a debug frame section.
Bill Wendling94d04b82009-05-20 23:21:38 +00002620///
Devang Patel2c4ceb12009-11-21 02:48:08 +00002621void DwarfDebug::emitCommonDebugFrame() {
Chris Lattner33adcfb2009-08-22 21:43:10 +00002622 if (!MAI->doesDwarfRequireFrameSection())
Bill Wendling94d04b82009-05-20 23:21:38 +00002623 return;
2624
2625 int stackGrowth =
2626 Asm->TM.getFrameInfo()->getStackGrowthDirection() ==
2627 TargetFrameInfo::StackGrowsUp ?
2628 TD->getPointerSize() : -TD->getPointerSize();
2629
2630 // Start the dwarf frame section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002631 Asm->OutStreamer.SwitchSection(
2632 Asm->getObjFileLowering().getDwarfFrameSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002633
2634 EmitLabel("debug_frame_common", 0);
2635 EmitDifference("debug_frame_common_end", 0,
2636 "debug_frame_common_begin", 0, true);
2637 Asm->EOL("Length of Common Information Entry");
2638
2639 EmitLabel("debug_frame_common_begin", 0);
2640 Asm->EmitInt32((int)dwarf::DW_CIE_ID);
2641 Asm->EOL("CIE Identifier Tag");
2642 Asm->EmitInt8(dwarf::DW_CIE_VERSION);
2643 Asm->EOL("CIE Version");
2644 Asm->EmitString("");
2645 Asm->EOL("CIE Augmentation");
2646 Asm->EmitULEB128Bytes(1);
2647 Asm->EOL("CIE Code Alignment Factor");
2648 Asm->EmitSLEB128Bytes(stackGrowth);
2649 Asm->EOL("CIE Data Alignment Factor");
2650 Asm->EmitInt8(RI->getDwarfRegNum(RI->getRARegister(), false));
2651 Asm->EOL("CIE RA Column");
2652
2653 std::vector<MachineMove> Moves;
2654 RI->getInitialFrameState(Moves);
2655
2656 EmitFrameMoves(NULL, 0, Moves, false);
2657
2658 Asm->EmitAlignment(2, 0, 0, false);
2659 EmitLabel("debug_frame_common_end", 0);
2660
2661 Asm->EOL();
2662}
2663
Devang Patel2c4ceb12009-11-21 02:48:08 +00002664/// emitFunctionDebugFrame - Emit per function frame info into a debug frame
Bill Wendling94d04b82009-05-20 23:21:38 +00002665/// section.
2666void
Devang Patel2c4ceb12009-11-21 02:48:08 +00002667DwarfDebug::emitFunctionDebugFrame(const FunctionDebugFrameInfo&DebugFrameInfo){
Chris Lattner33adcfb2009-08-22 21:43:10 +00002668 if (!MAI->doesDwarfRequireFrameSection())
Bill Wendling94d04b82009-05-20 23:21:38 +00002669 return;
2670
2671 // Start the dwarf frame section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002672 Asm->OutStreamer.SwitchSection(
2673 Asm->getObjFileLowering().getDwarfFrameSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002674
2675 EmitDifference("debug_frame_end", DebugFrameInfo.Number,
2676 "debug_frame_begin", DebugFrameInfo.Number, true);
2677 Asm->EOL("Length of Frame Information Entry");
2678
2679 EmitLabel("debug_frame_begin", DebugFrameInfo.Number);
2680
2681 EmitSectionOffset("debug_frame_common", "section_debug_frame",
2682 0, 0, true, false);
2683 Asm->EOL("FDE CIE offset");
2684
2685 EmitReference("func_begin", DebugFrameInfo.Number);
2686 Asm->EOL("FDE initial location");
2687 EmitDifference("func_end", DebugFrameInfo.Number,
2688 "func_begin", DebugFrameInfo.Number);
2689 Asm->EOL("FDE address range");
2690
2691 EmitFrameMoves("func_begin", DebugFrameInfo.Number, DebugFrameInfo.Moves,
2692 false);
2693
2694 Asm->EmitAlignment(2, 0, 0, false);
2695 EmitLabel("debug_frame_end", DebugFrameInfo.Number);
2696
2697 Asm->EOL();
2698}
2699
Devang Patel8a241142009-12-09 18:24:21 +00002700/// emitDebugPubNames - Emit visible names into a debug pubnames section.
2701///
2702void DwarfDebug::emitDebugPubNames() {
2703 // Start the dwarf pubnames section.
2704 Asm->OutStreamer.SwitchSection(
2705 Asm->getObjFileLowering().getDwarfPubNamesSection());
2706
2707 EmitDifference("pubnames_end", ModuleCU->getID(),
2708 "pubnames_begin", ModuleCU->getID(), true);
Bill Wendling94d04b82009-05-20 23:21:38 +00002709 Asm->EOL("Length of Public Names Info");
2710
Devang Patel8a241142009-12-09 18:24:21 +00002711 EmitLabel("pubnames_begin", ModuleCU->getID());
Bill Wendling94d04b82009-05-20 23:21:38 +00002712
2713 Asm->EmitInt16(dwarf::DWARF_VERSION); Asm->EOL("DWARF Version");
2714
2715 EmitSectionOffset("info_begin", "section_info",
Devang Patel8a241142009-12-09 18:24:21 +00002716 ModuleCU->getID(), 0, true, false);
Bill Wendling94d04b82009-05-20 23:21:38 +00002717 Asm->EOL("Offset of Compilation Unit Info");
2718
Devang Patel8a241142009-12-09 18:24:21 +00002719 EmitDifference("info_end", ModuleCU->getID(), "info_begin", ModuleCU->getID(),
Bill Wendling94d04b82009-05-20 23:21:38 +00002720 true);
2721 Asm->EOL("Compilation Unit Length");
2722
Devang Patel8a241142009-12-09 18:24:21 +00002723 const StringMap<DIE*> &Globals = ModuleCU->getGlobals();
Bill Wendling94d04b82009-05-20 23:21:38 +00002724 for (StringMap<DIE*>::const_iterator
2725 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2726 const char *Name = GI->getKeyData();
2727 DIE * Entity = GI->second;
2728
2729 Asm->EmitInt32(Entity->getOffset()); Asm->EOL("DIE offset");
2730 Asm->EmitString(Name, strlen(Name)); Asm->EOL("External Name");
2731 }
2732
2733 Asm->EmitInt32(0); Asm->EOL("End Mark");
Devang Patel8a241142009-12-09 18:24:21 +00002734 EmitLabel("pubnames_end", ModuleCU->getID());
Bill Wendling94d04b82009-05-20 23:21:38 +00002735
2736 Asm->EOL();
2737}
2738
Devang Patel193f7202009-11-24 01:14:22 +00002739void DwarfDebug::emitDebugPubTypes() {
Devang Patelf3a03762009-11-24 19:18:41 +00002740 // Start the dwarf pubnames section.
2741 Asm->OutStreamer.SwitchSection(
2742 Asm->getObjFileLowering().getDwarfPubTypesSection());
Devang Patel193f7202009-11-24 01:14:22 +00002743 EmitDifference("pubtypes_end", ModuleCU->getID(),
2744 "pubtypes_begin", ModuleCU->getID(), true);
2745 Asm->EOL("Length of Public Types Info");
2746
2747 EmitLabel("pubtypes_begin", ModuleCU->getID());
2748
2749 Asm->EmitInt16(dwarf::DWARF_VERSION); Asm->EOL("DWARF Version");
2750
2751 EmitSectionOffset("info_begin", "section_info",
2752 ModuleCU->getID(), 0, true, false);
2753 Asm->EOL("Offset of Compilation ModuleCU Info");
2754
2755 EmitDifference("info_end", ModuleCU->getID(), "info_begin", ModuleCU->getID(),
2756 true);
2757 Asm->EOL("Compilation ModuleCU Length");
2758
2759 const StringMap<DIE*> &Globals = ModuleCU->getGlobalTypes();
2760 for (StringMap<DIE*>::const_iterator
2761 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2762 const char *Name = GI->getKeyData();
2763 DIE * Entity = GI->second;
2764
2765 Asm->EmitInt32(Entity->getOffset()); Asm->EOL("DIE offset");
2766 Asm->EmitString(Name, strlen(Name)); Asm->EOL("External Name");
2767 }
2768
2769 Asm->EmitInt32(0); Asm->EOL("End Mark");
2770 EmitLabel("pubtypes_end", ModuleCU->getID());
2771
2772 Asm->EOL();
2773}
2774
Devang Patel2c4ceb12009-11-21 02:48:08 +00002775/// emitDebugStr - Emit visible names into a debug str section.
Bill Wendling94d04b82009-05-20 23:21:38 +00002776///
Devang Patel2c4ceb12009-11-21 02:48:08 +00002777void DwarfDebug::emitDebugStr() {
Bill Wendling94d04b82009-05-20 23:21:38 +00002778 // Check to see if it is worth the effort.
2779 if (!StringPool.empty()) {
2780 // Start the dwarf str section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002781 Asm->OutStreamer.SwitchSection(
2782 Asm->getObjFileLowering().getDwarfStrSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002783
2784 // For each of strings in the string pool.
2785 for (unsigned StringID = 1, N = StringPool.size();
2786 StringID <= N; ++StringID) {
2787 // Emit a label for reference from debug information entries.
2788 EmitLabel("string", StringID);
2789
2790 // Emit the string itself.
2791 const std::string &String = StringPool[StringID];
2792 Asm->EmitString(String); Asm->EOL();
2793 }
2794
2795 Asm->EOL();
2796 }
2797}
2798
Devang Patel2c4ceb12009-11-21 02:48:08 +00002799/// emitDebugLoc - Emit visible names into a debug loc section.
Bill Wendling94d04b82009-05-20 23:21:38 +00002800///
Devang Patel2c4ceb12009-11-21 02:48:08 +00002801void DwarfDebug::emitDebugLoc() {
Bill Wendling94d04b82009-05-20 23:21:38 +00002802 // Start the dwarf loc section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002803 Asm->OutStreamer.SwitchSection(
2804 Asm->getObjFileLowering().getDwarfLocSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002805 Asm->EOL();
2806}
2807
2808/// EmitDebugARanges - Emit visible names into a debug aranges section.
2809///
2810void DwarfDebug::EmitDebugARanges() {
2811 // Start the dwarf aranges section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002812 Asm->OutStreamer.SwitchSection(
2813 Asm->getObjFileLowering().getDwarfARangesSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002814
2815 // FIXME - Mock up
2816#if 0
2817 CompileUnit *Unit = GetBaseCompileUnit();
2818
2819 // Don't include size of length
2820 Asm->EmitInt32(0x1c); Asm->EOL("Length of Address Ranges Info");
2821
2822 Asm->EmitInt16(dwarf::DWARF_VERSION); Asm->EOL("Dwarf Version");
2823
2824 EmitReference("info_begin", Unit->getID());
2825 Asm->EOL("Offset of Compilation Unit Info");
2826
2827 Asm->EmitInt8(TD->getPointerSize()); Asm->EOL("Size of Address");
2828
2829 Asm->EmitInt8(0); Asm->EOL("Size of Segment Descriptor");
2830
2831 Asm->EmitInt16(0); Asm->EOL("Pad (1)");
2832 Asm->EmitInt16(0); Asm->EOL("Pad (2)");
2833
2834 // Range 1
2835 EmitReference("text_begin", 0); Asm->EOL("Address");
2836 EmitDifference("text_end", 0, "text_begin", 0, true); Asm->EOL("Length");
2837
2838 Asm->EmitInt32(0); Asm->EOL("EOM (1)");
2839 Asm->EmitInt32(0); Asm->EOL("EOM (2)");
2840#endif
2841
2842 Asm->EOL();
2843}
2844
Devang Patel2c4ceb12009-11-21 02:48:08 +00002845/// emitDebugRanges - Emit visible names into a debug ranges section.
Bill Wendling94d04b82009-05-20 23:21:38 +00002846///
Devang Patel2c4ceb12009-11-21 02:48:08 +00002847void DwarfDebug::emitDebugRanges() {
Bill Wendling94d04b82009-05-20 23:21:38 +00002848 // Start the dwarf ranges section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002849 Asm->OutStreamer.SwitchSection(
2850 Asm->getObjFileLowering().getDwarfRangesSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002851 Asm->EOL();
2852}
2853
Devang Patel2c4ceb12009-11-21 02:48:08 +00002854/// emitDebugMacInfo - Emit visible names into a debug macinfo section.
Bill Wendling94d04b82009-05-20 23:21:38 +00002855///
Devang Patel2c4ceb12009-11-21 02:48:08 +00002856void DwarfDebug::emitDebugMacInfo() {
Daniel Dunbarf612ff62009-09-19 20:40:05 +00002857 if (const MCSection *LineInfo =
Chris Lattner18a4c162009-08-02 07:24:22 +00002858 Asm->getObjFileLowering().getDwarfMacroInfoSection()) {
Bill Wendling94d04b82009-05-20 23:21:38 +00002859 // Start the dwarf macinfo section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002860 Asm->OutStreamer.SwitchSection(LineInfo);
Bill Wendling94d04b82009-05-20 23:21:38 +00002861 Asm->EOL();
2862 }
2863}
2864
Devang Patel2c4ceb12009-11-21 02:48:08 +00002865/// emitDebugInlineInfo - Emit inline info using following format.
Bill Wendling94d04b82009-05-20 23:21:38 +00002866/// Section Header:
2867/// 1. length of section
2868/// 2. Dwarf version number
2869/// 3. address size.
2870///
2871/// Entries (one "entry" for each function that was inlined):
2872///
2873/// 1. offset into __debug_str section for MIPS linkage name, if exists;
2874/// otherwise offset into __debug_str for regular function name.
2875/// 2. offset into __debug_str section for regular function name.
2876/// 3. an unsigned LEB128 number indicating the number of distinct inlining
2877/// instances for the function.
2878///
2879/// The rest of the entry consists of a {die_offset, low_pc} pair for each
2880/// inlined instance; the die_offset points to the inlined_subroutine die in the
2881/// __debug_info section, and the low_pc is the starting address for the
2882/// inlining instance.
Devang Patel2c4ceb12009-11-21 02:48:08 +00002883void DwarfDebug::emitDebugInlineInfo() {
Chris Lattner33adcfb2009-08-22 21:43:10 +00002884 if (!MAI->doesDwarfUsesInlineInfoSection())
Bill Wendling94d04b82009-05-20 23:21:38 +00002885 return;
2886
Devang Patel1dbc7712009-06-29 20:45:18 +00002887 if (!ModuleCU)
Bill Wendling94d04b82009-05-20 23:21:38 +00002888 return;
2889
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002890 Asm->OutStreamer.SwitchSection(
2891 Asm->getObjFileLowering().getDwarfDebugInlineSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002892 Asm->EOL();
2893 EmitDifference("debug_inlined_end", 1,
2894 "debug_inlined_begin", 1, true);
2895 Asm->EOL("Length of Debug Inlined Information Entry");
2896
2897 EmitLabel("debug_inlined_begin", 1);
2898
2899 Asm->EmitInt16(dwarf::DWARF_VERSION); Asm->EOL("Dwarf Version");
2900 Asm->EmitInt8(TD->getPointerSize()); Asm->EOL("Address Size (in bytes)");
2901
Devang Patel53bb5c92009-11-10 23:06:00 +00002902 for (SmallVector<MDNode *, 4>::iterator I = InlinedSPNodes.begin(),
2903 E = InlinedSPNodes.end(); I != E; ++I) {
Jim Grosbach31ef40e2009-11-21 23:12:12 +00002904
Devang Patel53bb5c92009-11-10 23:06:00 +00002905// for (ValueMap<MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator
2906 // I = InlineInfo.begin(), E = InlineInfo.end(); I != E; ++I) {
2907 MDNode *Node = *I;
Jim Grosbach7ab38df2009-11-22 19:20:36 +00002908 ValueMap<MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator II
2909 = InlineInfo.find(Node);
Devang Patel53bb5c92009-11-10 23:06:00 +00002910 SmallVector<InlineInfoLabels, 4> &Labels = II->second;
Devang Patele4b27562009-08-28 23:24:31 +00002911 DISubprogram SP(Node);
Devang Patel65dbc902009-11-25 17:36:49 +00002912 StringRef LName = SP.getLinkageName();
2913 StringRef Name = SP.getName();
Bill Wendling94d04b82009-05-20 23:21:38 +00002914
Devang Patel65dbc902009-11-25 17:36:49 +00002915 if (LName.empty())
Devang Patel53cb17d2009-07-16 01:01:22 +00002916 Asm->EmitString(Name);
2917 else {
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002918 // Skip special LLVM prefix that is used to inform the asm printer to not
2919 // emit usual symbol prefix before the symbol name. This happens for
2920 // Objective-C symbol names and symbol whose name is replaced using GCC's
2921 // __asm__ attribute.
Devang Patel53cb17d2009-07-16 01:01:22 +00002922 if (LName[0] == 1)
Benjamin Kramer1c3451f2009-11-25 18:26:09 +00002923 LName = LName.substr(1);
Devang Patel53bb5c92009-11-10 23:06:00 +00002924// Asm->EmitString(LName);
2925 EmitSectionOffset("string", "section_str",
2926 StringPool.idFor(LName), false, true);
2927
Devang Patel53cb17d2009-07-16 01:01:22 +00002928 }
Bill Wendling94d04b82009-05-20 23:21:38 +00002929 Asm->EOL("MIPS linkage name");
Jim Grosbach31ef40e2009-11-21 23:12:12 +00002930// Asm->EmitString(Name);
Devang Patel53bb5c92009-11-10 23:06:00 +00002931 EmitSectionOffset("string", "section_str",
2932 StringPool.idFor(Name), false, true);
2933 Asm->EOL("Function name");
Bill Wendling94d04b82009-05-20 23:21:38 +00002934 Asm->EmitULEB128Bytes(Labels.size()); Asm->EOL("Inline count");
2935
Devang Patel53bb5c92009-11-10 23:06:00 +00002936 for (SmallVector<InlineInfoLabels, 4>::iterator LI = Labels.begin(),
Bill Wendling94d04b82009-05-20 23:21:38 +00002937 LE = Labels.end(); LI != LE; ++LI) {
Devang Patel53bb5c92009-11-10 23:06:00 +00002938 DIE *SP = LI->second;
Bill Wendling94d04b82009-05-20 23:21:38 +00002939 Asm->EmitInt32(SP->getOffset()); Asm->EOL("DIE offset");
2940
2941 if (TD->getPointerSize() == sizeof(int32_t))
Chris Lattner33adcfb2009-08-22 21:43:10 +00002942 O << MAI->getData32bitsDirective();
Bill Wendling94d04b82009-05-20 23:21:38 +00002943 else
Chris Lattner33adcfb2009-08-22 21:43:10 +00002944 O << MAI->getData64bitsDirective();
Bill Wendling94d04b82009-05-20 23:21:38 +00002945
Devang Patel53bb5c92009-11-10 23:06:00 +00002946 PrintLabelName("label", LI->first); Asm->EOL("low_pc");
Bill Wendling94d04b82009-05-20 23:21:38 +00002947 }
2948 }
2949
2950 EmitLabel("debug_inlined_end", 1);
2951 Asm->EOL();
2952}