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