blob: 1372fc21685ffe9e60de4491b962e63d466b6804 [file] [log] [blame]
Bill Wendling0310d762009-05-15 09:23:25 +00001//===-- llvm/CodeGen/DwarfDebug.cpp - Dwarf Debug Framework ---------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file contains support for writing dwarf debug info into asm files.
11//
12//===----------------------------------------------------------------------===//
Devang Patele4b27562009-08-28 23:24:31 +000013#define DEBUG_TYPE "dwarfdebug"
Bill Wendling0310d762009-05-15 09:23:25 +000014#include "DwarfDebug.h"
15#include "llvm/Module.h"
David Greeneb2c66fc2009-08-19 21:52:55 +000016#include "llvm/CodeGen/MachineFunction.h"
Bill Wendling0310d762009-05-15 09:23:25 +000017#include "llvm/CodeGen/MachineModuleInfo.h"
Chris Lattnera87dea42009-07-31 18:48:30 +000018#include "llvm/MC/MCSection.h"
Chris Lattner6c2f9e12009-08-19 05:49:37 +000019#include "llvm/MC/MCStreamer.h"
Chris Lattneraf76e592009-08-22 20:48:53 +000020#include "llvm/MC/MCAsmInfo.h"
Bill Wendling0310d762009-05-15 09:23:25 +000021#include "llvm/Target/TargetData.h"
22#include "llvm/Target/TargetFrameInfo.h"
Chris Lattnerf0144122009-07-28 03:13:23 +000023#include "llvm/Target/TargetLoweringObjectFile.h"
24#include "llvm/Target/TargetRegisterInfo.h"
Chris Lattner23132b12009-08-24 03:52:50 +000025#include "llvm/ADT/StringExtras.h"
Daniel Dunbar6e4bdfc2009-10-13 06:47:08 +000026#include "llvm/Support/Debug.h"
27#include "llvm/Support/ErrorHandling.h"
Chris Lattner334fd1f2009-09-16 00:08:41 +000028#include "llvm/Support/Mangler.h"
Chris Lattnera87dea42009-07-31 18:48:30 +000029#include "llvm/Support/Timer.h"
30#include "llvm/System/Path.h"
Bill Wendling0310d762009-05-15 09:23:25 +000031using namespace llvm;
32
33static TimerGroup &getDwarfTimerGroup() {
34 static TimerGroup DwarfTimerGroup("Dwarf Debugging");
35 return DwarfTimerGroup;
36}
37
38//===----------------------------------------------------------------------===//
39
40/// Configuration values for initial hash set sizes (log2).
41///
42static const unsigned InitDiesSetSize = 9; // log2(512)
43static const unsigned InitAbbreviationsSetSize = 9; // log2(512)
44static const unsigned InitValuesSetSize = 9; // log2(512)
45
46namespace llvm {
47
48//===----------------------------------------------------------------------===//
49/// CompileUnit - This dwarf writer support class manages information associate
50/// with a source file.
51class VISIBILITY_HIDDEN CompileUnit {
52 /// ID - File identifier for source.
53 ///
54 unsigned ID;
55
56 /// Die - Compile unit debug information entry.
57 ///
58 DIE *Die;
59
60 /// GVToDieMap - Tracks the mapping of unit level debug informaton
61 /// variables to debug information entries.
Devang Patele4b27562009-08-28 23:24:31 +000062 /// FIXME : Rename GVToDieMap -> NodeToDieMap
63 std::map<MDNode *, DIE *> GVToDieMap;
Bill Wendling0310d762009-05-15 09:23:25 +000064
65 /// GVToDIEEntryMap - Tracks the mapping of unit level debug informaton
66 /// descriptors to debug information entries using a DIEEntry proxy.
Devang Patele4b27562009-08-28 23:24:31 +000067 /// FIXME : Rename
68 std::map<MDNode *, DIEEntry *> GVToDIEEntryMap;
Bill Wendling0310d762009-05-15 09:23:25 +000069
70 /// Globals - A map of globally visible named entities for this unit.
71 ///
72 StringMap<DIE*> Globals;
73
74 /// DiesSet - Used to uniquely define dies within the compile unit.
75 ///
76 FoldingSet<DIE> DiesSet;
77public:
78 CompileUnit(unsigned I, DIE *D)
Bill Wendling39dd6962009-05-20 23:31:45 +000079 : ID(I), Die(D), DiesSet(InitDiesSetSize) {}
80 ~CompileUnit() { delete Die; }
Bill Wendling0310d762009-05-15 09:23:25 +000081
82 // Accessors.
Bill Wendling39dd6962009-05-20 23:31:45 +000083 unsigned getID() const { return ID; }
84 DIE* getDie() const { return Die; }
Bill Wendling0310d762009-05-15 09:23:25 +000085 StringMap<DIE*> &getGlobals() { return Globals; }
86
87 /// hasContent - Return true if this compile unit has something to write out.
88 ///
Bill Wendling39dd6962009-05-20 23:31:45 +000089 bool hasContent() const { return !Die->getChildren().empty(); }
Bill Wendling0310d762009-05-15 09:23:25 +000090
91 /// AddGlobal - Add a new global entity to the compile unit.
92 ///
Bill Wendling39dd6962009-05-20 23:31:45 +000093 void AddGlobal(const std::string &Name, DIE *Die) { Globals[Name] = Die; }
Bill Wendling0310d762009-05-15 09:23:25 +000094
95 /// getDieMapSlotFor - Returns the debug information entry map slot for the
96 /// specified debug variable.
Devang Patele4b27562009-08-28 23:24:31 +000097 DIE *&getDieMapSlotFor(MDNode *N) { return GVToDieMap[N]; }
Bill Wendling0310d762009-05-15 09:23:25 +000098
Chris Lattner1cda87c2009-07-14 04:50:12 +000099 /// getDIEEntrySlotFor - Returns the debug information entry proxy slot for
100 /// the specified debug variable.
Devang Patele4b27562009-08-28 23:24:31 +0000101 DIEEntry *&getDIEEntrySlotFor(MDNode *N) {
102 return GVToDIEEntryMap[N];
Bill Wendling0310d762009-05-15 09:23:25 +0000103 }
104
105 /// AddDie - Adds or interns the DIE to the compile unit.
106 ///
107 DIE *AddDie(DIE &Buffer) {
108 FoldingSetNodeID ID;
109 Buffer.Profile(ID);
110 void *Where;
111 DIE *Die = DiesSet.FindNodeOrInsertPos(ID, Where);
112
113 if (!Die) {
114 Die = new DIE(Buffer);
115 DiesSet.InsertNode(Die, Where);
116 this->Die->AddChild(Die);
117 Buffer.Detach();
118 }
119
120 return Die;
121 }
122};
123
124//===----------------------------------------------------------------------===//
125/// DbgVariable - This class is used to track local variable information.
126///
Jeffrey Yasskin36d52bf2009-11-03 06:29:36 +0000127class DbgVariable {
Bill Wendling0310d762009-05-15 09:23:25 +0000128 DIVariable Var; // Variable Descriptor.
129 unsigned FrameIndex; // Variable frame index.
Bill Wendling1180c782009-05-18 23:08:55 +0000130 bool InlinedFnVar; // Variable for an inlined function.
Bill Wendling0310d762009-05-15 09:23:25 +0000131public:
Bill Wendling1180c782009-05-18 23:08:55 +0000132 DbgVariable(DIVariable V, unsigned I, bool IFV)
133 : Var(V), FrameIndex(I), InlinedFnVar(IFV) {}
Bill Wendling0310d762009-05-15 09:23:25 +0000134
135 // Accessors.
Bill Wendling1180c782009-05-18 23:08:55 +0000136 DIVariable getVariable() const { return Var; }
Bill Wendling0310d762009-05-15 09:23:25 +0000137 unsigned getFrameIndex() const { return FrameIndex; }
Bill Wendling1180c782009-05-18 23:08:55 +0000138 bool isInlinedFnVar() const { return InlinedFnVar; }
Bill Wendling0310d762009-05-15 09:23:25 +0000139};
140
141//===----------------------------------------------------------------------===//
142/// DbgScope - This class is used to track scope information.
143///
144class DbgConcreteScope;
Jeffrey Yasskin36d52bf2009-11-03 06:29:36 +0000145class DbgScope {
Bill Wendling0310d762009-05-15 09:23:25 +0000146 DbgScope *Parent; // Parent to this scope.
147 DIDescriptor Desc; // Debug info descriptor for scope.
Devang Patelc90aefe2009-10-14 21:08:09 +0000148 // FIXME use WeakVH for Desc.
149 WeakVH InlinedAt; // If this scope represents inlined
150 // function body then this is the location
151 // where this body is inlined.
Bill Wendling0310d762009-05-15 09:23:25 +0000152 unsigned StartLabelID; // Label ID of the beginning of scope.
153 unsigned EndLabelID; // Label ID of the end of scope.
Devang Pateld38dd112009-10-01 18:25:23 +0000154 const MachineInstr *LastInsn; // Last instruction of this scope.
155 const MachineInstr *FirstInsn; // First instruction of this scope.
Bill Wendling0310d762009-05-15 09:23:25 +0000156 SmallVector<DbgScope *, 4> Scopes; // Scopes defined in scope.
157 SmallVector<DbgVariable *, 8> Variables;// Variables declared in scope.
158 SmallVector<DbgConcreteScope *, 8> ConcreteInsts;// Concrete insts of funcs.
Daniel Dunbarf612ff62009-09-19 20:40:05 +0000159
Owen Anderson04c05f72009-06-24 22:53:20 +0000160 // Private state for dump()
161 mutable unsigned IndentLevel;
Bill Wendling0310d762009-05-15 09:23:25 +0000162public:
Devang Patelc90aefe2009-10-14 21:08:09 +0000163 DbgScope(DbgScope *P, DIDescriptor D, MDNode *I = 0)
164 : Parent(P), Desc(D), InlinedAt(I), StartLabelID(0), EndLabelID(0),
165 LastInsn(0), FirstInsn(0), IndentLevel(0) {}
Bill Wendling0310d762009-05-15 09:23:25 +0000166 virtual ~DbgScope();
167
168 // Accessors.
169 DbgScope *getParent() const { return Parent; }
170 DIDescriptor getDesc() const { return Desc; }
Devang Patelc90aefe2009-10-14 21:08:09 +0000171 MDNode *getInlinedAt() const {
172 return dyn_cast_or_null<MDNode>(InlinedAt);
173 }
Bill Wendling0310d762009-05-15 09:23:25 +0000174 unsigned getStartLabelID() const { return StartLabelID; }
175 unsigned getEndLabelID() const { return EndLabelID; }
176 SmallVector<DbgScope *, 4> &getScopes() { return Scopes; }
177 SmallVector<DbgVariable *, 8> &getVariables() { return Variables; }
178 SmallVector<DbgConcreteScope*,8> &getConcreteInsts() { return ConcreteInsts; }
179 void setStartLabelID(unsigned S) { StartLabelID = S; }
180 void setEndLabelID(unsigned E) { EndLabelID = E; }
Devang Pateld38dd112009-10-01 18:25:23 +0000181 void setLastInsn(const MachineInstr *MI) { LastInsn = MI; }
182 const MachineInstr *getLastInsn() { return LastInsn; }
183 void setFirstInsn(const MachineInstr *MI) { FirstInsn = MI; }
184 const MachineInstr *getFirstInsn() { return FirstInsn; }
Bill Wendling0310d762009-05-15 09:23:25 +0000185 /// AddScope - Add a scope to the scope.
186 ///
187 void AddScope(DbgScope *S) { Scopes.push_back(S); }
188
189 /// AddVariable - Add a variable to the scope.
190 ///
191 void AddVariable(DbgVariable *V) { Variables.push_back(V); }
192
193 /// AddConcreteInst - Add a concrete instance to the scope.
194 ///
195 void AddConcreteInst(DbgConcreteScope *C) { ConcreteInsts.push_back(C); }
196
Devang Patelaf9e8472009-10-01 20:31:14 +0000197 void FixInstructionMarkers() {
198 assert (getFirstInsn() && "First instruction is missing!");
199 if (getLastInsn())
200 return;
201
202 // If a scope does not have an instruction to mark an end then use
203 // the end of last child scope.
204 SmallVector<DbgScope *, 4> &Scopes = getScopes();
205 assert (!Scopes.empty() && "Inner most scope does not have last insn!");
206 DbgScope *L = Scopes.back();
207 if (!L->getLastInsn())
208 L->FixInstructionMarkers();
209 setLastInsn(L->getLastInsn());
210 }
211
Bill Wendling0310d762009-05-15 09:23:25 +0000212#ifndef NDEBUG
213 void dump() const;
214#endif
215};
216
217#ifndef NDEBUG
218void DbgScope::dump() const {
Chris Lattnerc281de12009-08-23 00:51:00 +0000219 raw_ostream &err = errs();
220 err.indent(IndentLevel);
221 Desc.dump();
222 err << " [" << StartLabelID << ", " << EndLabelID << "]\n";
Bill Wendling0310d762009-05-15 09:23:25 +0000223
224 IndentLevel += 2;
225
226 for (unsigned i = 0, e = Scopes.size(); i != e; ++i)
227 if (Scopes[i] != this)
228 Scopes[i]->dump();
229
230 IndentLevel -= 2;
231}
232#endif
233
234//===----------------------------------------------------------------------===//
235/// DbgConcreteScope - This class is used to track a scope that holds concrete
236/// instance information.
237///
238class VISIBILITY_HIDDEN DbgConcreteScope : public DbgScope {
239 CompileUnit *Unit;
240 DIE *Die; // Debug info for this concrete scope.
241public:
242 DbgConcreteScope(DIDescriptor D) : DbgScope(NULL, D) {}
243
244 // Accessors.
245 DIE *getDie() const { return Die; }
246 void setDie(DIE *D) { Die = D; }
247};
248
249DbgScope::~DbgScope() {
250 for (unsigned i = 0, N = Scopes.size(); i < N; ++i)
251 delete Scopes[i];
252 for (unsigned j = 0, M = Variables.size(); j < M; ++j)
253 delete Variables[j];
254 for (unsigned k = 0, O = ConcreteInsts.size(); k < O; ++k)
255 delete ConcreteInsts[k];
256}
257
258} // end llvm namespace
259
Chris Lattneraf76e592009-08-22 20:48:53 +0000260DwarfDebug::DwarfDebug(raw_ostream &OS, AsmPrinter *A, const MCAsmInfo *T)
Devang Patel1dbc7712009-06-29 20:45:18 +0000261 : Dwarf(OS, A, T, "dbg"), ModuleCU(0),
Bill Wendling0310d762009-05-15 09:23:25 +0000262 AbbreviationsSet(InitAbbreviationsSetSize), Abbreviations(),
Daniel Dunbarf612ff62009-09-19 20:40:05 +0000263 ValuesSet(InitValuesSetSize), Values(), StringPool(),
Bill Wendling0310d762009-05-15 09:23:25 +0000264 SectionSourceLines(), didInitial(false), shouldEmit(false),
Devang Patel43da8fb2009-07-13 21:26:33 +0000265 FunctionDbgScope(0), DebugTimer(0) {
Bill Wendling0310d762009-05-15 09:23:25 +0000266 if (TimePassesIsEnabled)
267 DebugTimer = new Timer("Dwarf Debug Writer",
268 getDwarfTimerGroup());
269}
270DwarfDebug::~DwarfDebug() {
271 for (unsigned j = 0, M = Values.size(); j < M; ++j)
272 delete Values[j];
273
Devang Patele4b27562009-08-28 23:24:31 +0000274 for (DenseMap<const MDNode *, DbgScope *>::iterator
Bill Wendling0310d762009-05-15 09:23:25 +0000275 I = AbstractInstanceRootMap.begin(),
276 E = AbstractInstanceRootMap.end(); I != E;++I)
277 delete I->second;
278
279 delete DebugTimer;
280}
281
282/// AssignAbbrevNumber - Define a unique number for the abbreviation.
283///
284void DwarfDebug::AssignAbbrevNumber(DIEAbbrev &Abbrev) {
285 // Profile the node so that we can make it unique.
286 FoldingSetNodeID ID;
287 Abbrev.Profile(ID);
288
289 // Check the set for priors.
290 DIEAbbrev *InSet = AbbreviationsSet.GetOrInsertNode(&Abbrev);
291
292 // If it's newly added.
293 if (InSet == &Abbrev) {
294 // Add to abbreviation list.
295 Abbreviations.push_back(&Abbrev);
296
297 // Assign the vector position + 1 as its number.
298 Abbrev.setNumber(Abbreviations.size());
299 } else {
300 // Assign existing abbreviation number.
301 Abbrev.setNumber(InSet->getNumber());
302 }
303}
304
Bill Wendling995f80a2009-05-20 23:24:48 +0000305/// CreateDIEEntry - Creates a new DIEEntry to be a proxy for a debug
306/// information entry.
307DIEEntry *DwarfDebug::CreateDIEEntry(DIE *Entry) {
Bill Wendling0310d762009-05-15 09:23:25 +0000308 DIEEntry *Value;
309
310 if (Entry) {
311 FoldingSetNodeID ID;
312 DIEEntry::Profile(ID, Entry);
313 void *Where;
314 Value = static_cast<DIEEntry *>(ValuesSet.FindNodeOrInsertPos(ID, Where));
315
316 if (Value) return Value;
317
318 Value = new DIEEntry(Entry);
319 ValuesSet.InsertNode(Value, Where);
320 } else {
321 Value = new DIEEntry(Entry);
322 }
323
324 Values.push_back(Value);
325 return Value;
326}
327
328/// SetDIEEntry - Set a DIEEntry once the debug information entry is defined.
329///
330void DwarfDebug::SetDIEEntry(DIEEntry *Value, DIE *Entry) {
331 Value->setEntry(Entry);
332
333 // Add to values set if not already there. If it is, we merely have a
334 // duplicate in the values list (no harm.)
335 ValuesSet.GetOrInsertNode(Value);
336}
337
338/// AddUInt - Add an unsigned integer attribute data and value.
339///
340void DwarfDebug::AddUInt(DIE *Die, unsigned Attribute,
341 unsigned Form, uint64_t Integer) {
342 if (!Form) Form = DIEInteger::BestForm(false, Integer);
343
344 FoldingSetNodeID ID;
345 DIEInteger::Profile(ID, Integer);
346 void *Where;
347 DIEValue *Value = ValuesSet.FindNodeOrInsertPos(ID, Where);
348
349 if (!Value) {
350 Value = new DIEInteger(Integer);
351 ValuesSet.InsertNode(Value, Where);
352 Values.push_back(Value);
353 }
354
355 Die->AddValue(Attribute, Form, Value);
356}
357
358/// AddSInt - Add an signed integer attribute data and value.
359///
360void DwarfDebug::AddSInt(DIE *Die, unsigned Attribute,
361 unsigned Form, int64_t Integer) {
362 if (!Form) Form = DIEInteger::BestForm(true, Integer);
363
364 FoldingSetNodeID ID;
365 DIEInteger::Profile(ID, (uint64_t)Integer);
366 void *Where;
367 DIEValue *Value = ValuesSet.FindNodeOrInsertPos(ID, Where);
368
369 if (!Value) {
370 Value = new DIEInteger(Integer);
371 ValuesSet.InsertNode(Value, Where);
372 Values.push_back(Value);
373 }
374
375 Die->AddValue(Attribute, Form, Value);
376}
377
378/// AddString - Add a string attribute data and value.
379///
380void DwarfDebug::AddString(DIE *Die, unsigned Attribute, unsigned Form,
381 const std::string &String) {
382 FoldingSetNodeID ID;
383 DIEString::Profile(ID, String);
384 void *Where;
385 DIEValue *Value = ValuesSet.FindNodeOrInsertPos(ID, Where);
386
387 if (!Value) {
388 Value = new DIEString(String);
389 ValuesSet.InsertNode(Value, Where);
390 Values.push_back(Value);
391 }
392
393 Die->AddValue(Attribute, Form, Value);
394}
395
396/// AddLabel - Add a Dwarf label attribute data and value.
397///
398void DwarfDebug::AddLabel(DIE *Die, unsigned Attribute, unsigned Form,
399 const DWLabel &Label) {
400 FoldingSetNodeID ID;
401 DIEDwarfLabel::Profile(ID, Label);
402 void *Where;
403 DIEValue *Value = ValuesSet.FindNodeOrInsertPos(ID, Where);
404
405 if (!Value) {
406 Value = new DIEDwarfLabel(Label);
407 ValuesSet.InsertNode(Value, Where);
408 Values.push_back(Value);
409 }
410
411 Die->AddValue(Attribute, Form, Value);
412}
413
414/// AddObjectLabel - Add an non-Dwarf label attribute data and value.
415///
416void DwarfDebug::AddObjectLabel(DIE *Die, unsigned Attribute, unsigned Form,
417 const std::string &Label) {
418 FoldingSetNodeID ID;
419 DIEObjectLabel::Profile(ID, Label);
420 void *Where;
421 DIEValue *Value = ValuesSet.FindNodeOrInsertPos(ID, Where);
422
423 if (!Value) {
424 Value = new DIEObjectLabel(Label);
425 ValuesSet.InsertNode(Value, Where);
426 Values.push_back(Value);
427 }
428
429 Die->AddValue(Attribute, Form, Value);
430}
431
432/// AddSectionOffset - Add a section offset label attribute data and value.
433///
434void DwarfDebug::AddSectionOffset(DIE *Die, unsigned Attribute, unsigned Form,
435 const DWLabel &Label, const DWLabel &Section,
436 bool isEH, bool useSet) {
437 FoldingSetNodeID ID;
438 DIESectionOffset::Profile(ID, Label, Section);
439 void *Where;
440 DIEValue *Value = ValuesSet.FindNodeOrInsertPos(ID, Where);
441
442 if (!Value) {
443 Value = new DIESectionOffset(Label, Section, isEH, useSet);
444 ValuesSet.InsertNode(Value, Where);
445 Values.push_back(Value);
446 }
447
448 Die->AddValue(Attribute, Form, Value);
449}
450
451/// AddDelta - Add a label delta attribute data and value.
452///
453void DwarfDebug::AddDelta(DIE *Die, unsigned Attribute, unsigned Form,
454 const DWLabel &Hi, const DWLabel &Lo) {
455 FoldingSetNodeID ID;
456 DIEDelta::Profile(ID, Hi, Lo);
457 void *Where;
458 DIEValue *Value = ValuesSet.FindNodeOrInsertPos(ID, Where);
459
460 if (!Value) {
461 Value = new DIEDelta(Hi, Lo);
462 ValuesSet.InsertNode(Value, Where);
463 Values.push_back(Value);
464 }
465
466 Die->AddValue(Attribute, Form, Value);
467}
468
469/// AddBlock - Add block data.
470///
471void DwarfDebug::AddBlock(DIE *Die, unsigned Attribute, unsigned Form,
472 DIEBlock *Block) {
473 Block->ComputeSize(TD);
474 FoldingSetNodeID ID;
475 Block->Profile(ID);
476 void *Where;
477 DIEValue *Value = ValuesSet.FindNodeOrInsertPos(ID, Where);
478
479 if (!Value) {
480 Value = Block;
481 ValuesSet.InsertNode(Value, Where);
482 Values.push_back(Value);
483 } else {
484 // Already exists, reuse the previous one.
485 delete Block;
486 Block = cast<DIEBlock>(Value);
487 }
488
489 Die->AddValue(Attribute, Block->BestForm(), Value);
490}
491
492/// AddSourceLine - Add location information to specified debug information
493/// entry.
494void DwarfDebug::AddSourceLine(DIE *Die, const DIVariable *V) {
495 // If there is no compile unit specified, don't add a line #.
496 if (V->getCompileUnit().isNull())
497 return;
498
499 unsigned Line = V->getLineNumber();
500 unsigned FileID = FindCompileUnit(V->getCompileUnit()).getID();
501 assert(FileID && "Invalid file id");
502 AddUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
503 AddUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
504}
505
506/// AddSourceLine - Add location information to specified debug information
507/// entry.
508void DwarfDebug::AddSourceLine(DIE *Die, const DIGlobal *G) {
509 // If there is no compile unit specified, don't add a line #.
510 if (G->getCompileUnit().isNull())
511 return;
512
513 unsigned Line = G->getLineNumber();
514 unsigned FileID = FindCompileUnit(G->getCompileUnit()).getID();
515 assert(FileID && "Invalid file id");
516 AddUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
517 AddUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
518}
Devang Patel82dfc0c2009-08-31 22:47:13 +0000519
520/// AddSourceLine - Add location information to specified debug information
521/// entry.
522void DwarfDebug::AddSourceLine(DIE *Die, const DISubprogram *SP) {
523 // If there is no compile unit specified, don't add a line #.
524 if (SP->getCompileUnit().isNull())
525 return;
Caroline Ticec6f9d622009-09-11 18:25:54 +0000526 // If the line number is 0, don't add it.
527 if (SP->getLineNumber() == 0)
528 return;
529
Devang Patel82dfc0c2009-08-31 22:47:13 +0000530
531 unsigned Line = SP->getLineNumber();
532 unsigned FileID = FindCompileUnit(SP->getCompileUnit()).getID();
533 assert(FileID && "Invalid file id");
534 AddUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
535 AddUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
536}
537
538/// AddSourceLine - Add location information to specified debug information
539/// entry.
Bill Wendling0310d762009-05-15 09:23:25 +0000540void DwarfDebug::AddSourceLine(DIE *Die, const DIType *Ty) {
541 // If there is no compile unit specified, don't add a line #.
542 DICompileUnit CU = Ty->getCompileUnit();
543 if (CU.isNull())
544 return;
545
546 unsigned Line = Ty->getLineNumber();
547 unsigned FileID = FindCompileUnit(CU).getID();
548 assert(FileID && "Invalid file id");
549 AddUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
550 AddUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
551}
552
Caroline Ticedc8f6042009-08-31 21:19:37 +0000553/* Byref variables, in Blocks, are declared by the programmer as
554 "SomeType VarName;", but the compiler creates a
555 __Block_byref_x_VarName struct, and gives the variable VarName
556 either the struct, or a pointer to the struct, as its type. This
557 is necessary for various behind-the-scenes things the compiler
558 needs to do with by-reference variables in blocks.
559
560 However, as far as the original *programmer* is concerned, the
561 variable should still have type 'SomeType', as originally declared.
562
563 The following function dives into the __Block_byref_x_VarName
564 struct to find the original type of the variable. This will be
565 passed back to the code generating the type for the Debug
566 Information Entry for the variable 'VarName'. 'VarName' will then
567 have the original type 'SomeType' in its debug information.
568
569 The original type 'SomeType' will be the type of the field named
570 'VarName' inside the __Block_byref_x_VarName struct.
571
572 NOTE: In order for this to not completely fail on the debugger
573 side, the Debug Information Entry for the variable VarName needs to
574 have a DW_AT_location that tells the debugger how to unwind through
575 the pointers and __Block_byref_x_VarName struct to find the actual
576 value of the variable. The function AddBlockByrefType does this. */
577
578/// Find the type the programmer originally declared the variable to be
579/// and return that type.
580///
581DIType DwarfDebug::GetBlockByrefType(DIType Ty, std::string Name) {
582
583 DIType subType = Ty;
584 unsigned tag = Ty.getTag();
585
586 if (tag == dwarf::DW_TAG_pointer_type) {
Mike Stump3e4c9bd2009-09-30 00:08:22 +0000587 DIDerivedType DTy = DIDerivedType(Ty.getNode());
Caroline Ticedc8f6042009-08-31 21:19:37 +0000588 subType = DTy.getTypeDerivedFrom();
589 }
590
591 DICompositeType blockStruct = DICompositeType(subType.getNode());
592
593 DIArray Elements = blockStruct.getTypeArray();
594
595 if (Elements.isNull())
596 return Ty;
597
598 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
599 DIDescriptor Element = Elements.getElement(i);
600 DIDerivedType DT = DIDerivedType(Element.getNode());
Devang Patel5ccdd102009-09-29 18:40:58 +0000601 if (strcmp(Name.c_str(), DT.getName()) == 0)
Caroline Ticedc8f6042009-08-31 21:19:37 +0000602 return (DT.getTypeDerivedFrom());
603 }
604
605 return Ty;
606}
607
Mike Stump3e4c9bd2009-09-30 00:08:22 +0000608/// AddComplexAddress - Start with the address based on the location provided,
609/// and generate the DWARF information necessary to find the actual variable
610/// given the extra address information encoded in the DIVariable, starting from
611/// the starting location. Add the DWARF information to the die.
612///
613void DwarfDebug::AddComplexAddress(DbgVariable *&DV, DIE *Die,
614 unsigned Attribute,
615 const MachineLocation &Location) {
616 const DIVariable &VD = DV->getVariable();
617 DIType Ty = VD.getType();
618
619 // Decode the original location, and use that as the start of the byref
620 // variable's location.
621 unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
622 DIEBlock *Block = new DIEBlock();
623
624 if (Location.isReg()) {
625 if (Reg < 32) {
626 AddUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
627 } else {
628 Reg = Reg - dwarf::DW_OP_reg0;
629 AddUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
630 AddUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
631 }
632 } else {
633 if (Reg < 32)
634 AddUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
635 else {
636 AddUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
637 AddUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
638 }
639
640 AddUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
641 }
642
643 for (unsigned i = 0, N = VD.getNumAddrElements(); i < N; ++i) {
644 uint64_t Element = VD.getAddrElement(i);
645
646 if (Element == DIFactory::OpPlus) {
647 AddUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
648 AddUInt(Block, 0, dwarf::DW_FORM_udata, VD.getAddrElement(++i));
649 } else if (Element == DIFactory::OpDeref) {
650 AddUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
651 } else llvm_unreachable("unknown DIFactory Opcode");
652 }
653
654 // Now attach the location information to the DIE.
655 AddBlock(Die, Attribute, 0, Block);
656}
657
Caroline Ticedc8f6042009-08-31 21:19:37 +0000658/* Byref variables, in Blocks, are declared by the programmer as "SomeType
659 VarName;", but the compiler creates a __Block_byref_x_VarName struct, and
660 gives the variable VarName either the struct, or a pointer to the struct, as
661 its type. This is necessary for various behind-the-scenes things the
662 compiler needs to do with by-reference variables in Blocks.
663
664 However, as far as the original *programmer* is concerned, the variable
665 should still have type 'SomeType', as originally declared.
666
667 The function GetBlockByrefType dives into the __Block_byref_x_VarName
668 struct to find the original type of the variable, which is then assigned to
669 the variable's Debug Information Entry as its real type. So far, so good.
670 However now the debugger will expect the variable VarName to have the type
671 SomeType. So we need the location attribute for the variable to be an
Daniel Dunbarf612ff62009-09-19 20:40:05 +0000672 expression that explains to the debugger how to navigate through the
Caroline Ticedc8f6042009-08-31 21:19:37 +0000673 pointers and struct to find the actual variable of type SomeType.
674
675 The following function does just that. We start by getting
676 the "normal" location for the variable. This will be the location
677 of either the struct __Block_byref_x_VarName or the pointer to the
678 struct __Block_byref_x_VarName.
679
680 The struct will look something like:
681
682 struct __Block_byref_x_VarName {
683 ... <various fields>
684 struct __Block_byref_x_VarName *forwarding;
685 ... <various other fields>
686 SomeType VarName;
687 ... <maybe more fields>
688 };
689
690 If we are given the struct directly (as our starting point) we
691 need to tell the debugger to:
692
693 1). Add the offset of the forwarding field.
694
695 2). Follow that pointer to get the the real __Block_byref_x_VarName
696 struct to use (the real one may have been copied onto the heap).
697
698 3). Add the offset for the field VarName, to find the actual variable.
699
700 If we started with a pointer to the struct, then we need to
701 dereference that pointer first, before the other steps.
702 Translating this into DWARF ops, we will need to append the following
703 to the current location description for the variable:
704
705 DW_OP_deref -- optional, if we start with a pointer
706 DW_OP_plus_uconst <forward_fld_offset>
707 DW_OP_deref
708 DW_OP_plus_uconst <varName_fld_offset>
709
710 That is what this function does. */
711
712/// AddBlockByrefAddress - Start with the address based on the location
713/// provided, and generate the DWARF information necessary to find the
714/// actual Block variable (navigating the Block struct) based on the
715/// starting location. Add the DWARF information to the die. For
716/// more information, read large comment just above here.
717///
Daniel Dunbarf612ff62009-09-19 20:40:05 +0000718void DwarfDebug::AddBlockByrefAddress(DbgVariable *&DV, DIE *Die,
Daniel Dunbar00564992009-09-19 20:40:14 +0000719 unsigned Attribute,
720 const MachineLocation &Location) {
Caroline Ticedc8f6042009-08-31 21:19:37 +0000721 const DIVariable &VD = DV->getVariable();
722 DIType Ty = VD.getType();
723 DIType TmpTy = Ty;
724 unsigned Tag = Ty.getTag();
725 bool isPointer = false;
726
Devang Patel5ccdd102009-09-29 18:40:58 +0000727 const char *varName = VD.getName();
Caroline Ticedc8f6042009-08-31 21:19:37 +0000728
729 if (Tag == dwarf::DW_TAG_pointer_type) {
Mike Stump3e4c9bd2009-09-30 00:08:22 +0000730 DIDerivedType DTy = DIDerivedType(Ty.getNode());
Caroline Ticedc8f6042009-08-31 21:19:37 +0000731 TmpTy = DTy.getTypeDerivedFrom();
732 isPointer = true;
733 }
734
735 DICompositeType blockStruct = DICompositeType(TmpTy.getNode());
736
Daniel Dunbar00564992009-09-19 20:40:14 +0000737 // Find the __forwarding field and the variable field in the __Block_byref
738 // struct.
Daniel Dunbar00564992009-09-19 20:40:14 +0000739 DIArray Fields = blockStruct.getTypeArray();
740 DIDescriptor varField = DIDescriptor();
741 DIDescriptor forwardingField = DIDescriptor();
Caroline Ticedc8f6042009-08-31 21:19:37 +0000742
743
Daniel Dunbar00564992009-09-19 20:40:14 +0000744 for (unsigned i = 0, N = Fields.getNumElements(); i < N; ++i) {
745 DIDescriptor Element = Fields.getElement(i);
746 DIDerivedType DT = DIDerivedType(Element.getNode());
Devang Patel5ccdd102009-09-29 18:40:58 +0000747 const char *fieldName = DT.getName();
748 if (strcmp(fieldName, "__forwarding") == 0)
Daniel Dunbar00564992009-09-19 20:40:14 +0000749 forwardingField = Element;
Devang Patel5ccdd102009-09-29 18:40:58 +0000750 else if (strcmp(fieldName, varName) == 0)
Daniel Dunbar00564992009-09-19 20:40:14 +0000751 varField = Element;
752 }
Daniel Dunbarf612ff62009-09-19 20:40:05 +0000753
Mike Stump7e3720d2009-09-24 23:21:26 +0000754 assert(!varField.isNull() && "Can't find byref variable in Block struct");
755 assert(!forwardingField.isNull()
756 && "Can't find forwarding field in Block struct");
Caroline Ticedc8f6042009-08-31 21:19:37 +0000757
Daniel Dunbar00564992009-09-19 20:40:14 +0000758 // Get the offsets for the forwarding field and the variable field.
Daniel Dunbar00564992009-09-19 20:40:14 +0000759 unsigned int forwardingFieldOffset =
760 DIDerivedType(forwardingField.getNode()).getOffsetInBits() >> 3;
761 unsigned int varFieldOffset =
762 DIDerivedType(varField.getNode()).getOffsetInBits() >> 3;
Caroline Ticedc8f6042009-08-31 21:19:37 +0000763
Mike Stump7e3720d2009-09-24 23:21:26 +0000764 // Decode the original location, and use that as the start of the byref
765 // variable's location.
Daniel Dunbar00564992009-09-19 20:40:14 +0000766 unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
767 DIEBlock *Block = new DIEBlock();
Caroline Ticedc8f6042009-08-31 21:19:37 +0000768
Daniel Dunbar00564992009-09-19 20:40:14 +0000769 if (Location.isReg()) {
770 if (Reg < 32)
771 AddUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
772 else {
773 Reg = Reg - dwarf::DW_OP_reg0;
774 AddUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
775 AddUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
776 }
777 } else {
778 if (Reg < 32)
779 AddUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
780 else {
781 AddUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
782 AddUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
783 }
Caroline Ticedc8f6042009-08-31 21:19:37 +0000784
Daniel Dunbar00564992009-09-19 20:40:14 +0000785 AddUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
786 }
Caroline Ticedc8f6042009-08-31 21:19:37 +0000787
Mike Stump7e3720d2009-09-24 23:21:26 +0000788 // If we started with a pointer to the __Block_byref... struct, then
Daniel Dunbar00564992009-09-19 20:40:14 +0000789 // the first thing we need to do is dereference the pointer (DW_OP_deref).
Daniel Dunbar00564992009-09-19 20:40:14 +0000790 if (isPointer)
791 AddUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Caroline Ticedc8f6042009-08-31 21:19:37 +0000792
Daniel Dunbar00564992009-09-19 20:40:14 +0000793 // Next add the offset for the '__forwarding' field:
794 // DW_OP_plus_uconst ForwardingFieldOffset. Note there's no point in
795 // adding the offset if it's 0.
Daniel Dunbar00564992009-09-19 20:40:14 +0000796 if (forwardingFieldOffset > 0) {
797 AddUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
798 AddUInt(Block, 0, dwarf::DW_FORM_udata, forwardingFieldOffset);
799 }
Caroline Ticedc8f6042009-08-31 21:19:37 +0000800
Daniel Dunbar00564992009-09-19 20:40:14 +0000801 // Now dereference the __forwarding field to get to the real __Block_byref
802 // struct: DW_OP_deref.
Daniel Dunbar00564992009-09-19 20:40:14 +0000803 AddUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Caroline Ticedc8f6042009-08-31 21:19:37 +0000804
Daniel Dunbar00564992009-09-19 20:40:14 +0000805 // Now that we've got the real __Block_byref... struct, add the offset
806 // for the variable's field to get to the location of the actual variable:
807 // DW_OP_plus_uconst varFieldOffset. Again, don't add if it's 0.
Daniel Dunbar00564992009-09-19 20:40:14 +0000808 if (varFieldOffset > 0) {
809 AddUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
810 AddUInt(Block, 0, dwarf::DW_FORM_udata, varFieldOffset);
811 }
Caroline Ticedc8f6042009-08-31 21:19:37 +0000812
Daniel Dunbar00564992009-09-19 20:40:14 +0000813 // Now attach the location information to the DIE.
Daniel Dunbar00564992009-09-19 20:40:14 +0000814 AddBlock(Die, Attribute, 0, Block);
Caroline Ticedc8f6042009-08-31 21:19:37 +0000815}
816
Bill Wendling0310d762009-05-15 09:23:25 +0000817/// AddAddress - Add an address attribute to a die based on the location
818/// provided.
819void DwarfDebug::AddAddress(DIE *Die, unsigned Attribute,
820 const MachineLocation &Location) {
821 unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
822 DIEBlock *Block = new DIEBlock();
823
824 if (Location.isReg()) {
825 if (Reg < 32) {
826 AddUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
827 } else {
828 AddUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
829 AddUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
830 }
831 } else {
832 if (Reg < 32) {
833 AddUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
834 } else {
835 AddUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
836 AddUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
837 }
838
839 AddUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
840 }
841
842 AddBlock(Die, Attribute, 0, Block);
843}
844
845/// AddType - Add a new type attribute to the specified entity.
846void DwarfDebug::AddType(CompileUnit *DW_Unit, DIE *Entity, DIType Ty) {
847 if (Ty.isNull())
848 return;
849
850 // Check for pre-existence.
Devang Patele4b27562009-08-28 23:24:31 +0000851 DIEEntry *&Slot = DW_Unit->getDIEEntrySlotFor(Ty.getNode());
Bill Wendling0310d762009-05-15 09:23:25 +0000852
853 // If it exists then use the existing value.
854 if (Slot) {
855 Entity->AddValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, Slot);
856 return;
857 }
858
859 // Set up proxy.
Bill Wendling995f80a2009-05-20 23:24:48 +0000860 Slot = CreateDIEEntry();
Bill Wendling0310d762009-05-15 09:23:25 +0000861
862 // Construct type.
863 DIE Buffer(dwarf::DW_TAG_base_type);
Devang Patel6ceea332009-08-31 18:49:10 +0000864 if (Ty.isBasicType())
Devang Patele4b27562009-08-28 23:24:31 +0000865 ConstructTypeDIE(DW_Unit, Buffer, DIBasicType(Ty.getNode()));
Devang Patel6ceea332009-08-31 18:49:10 +0000866 else if (Ty.isCompositeType())
Devang Patele4b27562009-08-28 23:24:31 +0000867 ConstructTypeDIE(DW_Unit, Buffer, DICompositeType(Ty.getNode()));
Bill Wendling0310d762009-05-15 09:23:25 +0000868 else {
Devang Patel6ceea332009-08-31 18:49:10 +0000869 assert(Ty.isDerivedType() && "Unknown kind of DIType");
Devang Patele4b27562009-08-28 23:24:31 +0000870 ConstructTypeDIE(DW_Unit, Buffer, DIDerivedType(Ty.getNode()));
Bill Wendling0310d762009-05-15 09:23:25 +0000871 }
872
873 // Add debug information entry to entity and appropriate context.
874 DIE *Die = NULL;
875 DIDescriptor Context = Ty.getContext();
876 if (!Context.isNull())
Devang Patele4b27562009-08-28 23:24:31 +0000877 Die = DW_Unit->getDieMapSlotFor(Context.getNode());
Bill Wendling0310d762009-05-15 09:23:25 +0000878
879 if (Die) {
880 DIE *Child = new DIE(Buffer);
881 Die->AddChild(Child);
882 Buffer.Detach();
883 SetDIEEntry(Slot, Child);
884 } else {
885 Die = DW_Unit->AddDie(Buffer);
886 SetDIEEntry(Slot, Die);
887 }
888
889 Entity->AddValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, Slot);
890}
891
892/// ConstructTypeDIE - Construct basic type die from DIBasicType.
893void DwarfDebug::ConstructTypeDIE(CompileUnit *DW_Unit, DIE &Buffer,
894 DIBasicType BTy) {
895 // Get core information.
Devang Patel5ccdd102009-09-29 18:40:58 +0000896 const char *Name = BTy.getName();
Bill Wendling0310d762009-05-15 09:23:25 +0000897 Buffer.setTag(dwarf::DW_TAG_base_type);
898 AddUInt(&Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
899 BTy.getEncoding());
900
901 // Add name if not anonymous or intermediate type.
Devang Patel5ccdd102009-09-29 18:40:58 +0000902 if (Name)
Bill Wendling0310d762009-05-15 09:23:25 +0000903 AddString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
904 uint64_t Size = BTy.getSizeInBits() >> 3;
905 AddUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
906}
907
908/// ConstructTypeDIE - Construct derived type die from DIDerivedType.
909void DwarfDebug::ConstructTypeDIE(CompileUnit *DW_Unit, DIE &Buffer,
910 DIDerivedType DTy) {
911 // Get core information.
Devang Patel5ccdd102009-09-29 18:40:58 +0000912 const char *Name = DTy.getName();
Bill Wendling0310d762009-05-15 09:23:25 +0000913 uint64_t Size = DTy.getSizeInBits() >> 3;
914 unsigned Tag = DTy.getTag();
915
916 // FIXME - Workaround for templates.
917 if (Tag == dwarf::DW_TAG_inheritance) Tag = dwarf::DW_TAG_reference_type;
918
919 Buffer.setTag(Tag);
920
921 // Map to main type, void will not have a type.
922 DIType FromTy = DTy.getTypeDerivedFrom();
923 AddType(DW_Unit, &Buffer, FromTy);
924
925 // Add name if not anonymous or intermediate type.
Devang Patel808b8262009-10-16 21:27:43 +0000926 if (Name && Tag != dwarf::DW_TAG_pointer_type)
Bill Wendling0310d762009-05-15 09:23:25 +0000927 AddString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
928
929 // Add size if non-zero (derived types might be zero-sized.)
930 if (Size)
931 AddUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
932
933 // Add source line info if available and TyDesc is not a forward declaration.
934 if (!DTy.isForwardDecl())
935 AddSourceLine(&Buffer, &DTy);
936}
937
938/// ConstructTypeDIE - Construct type DIE from DICompositeType.
939void DwarfDebug::ConstructTypeDIE(CompileUnit *DW_Unit, DIE &Buffer,
940 DICompositeType CTy) {
941 // Get core information.
Devang Patel5ccdd102009-09-29 18:40:58 +0000942 const char *Name = CTy.getName();
Bill Wendling0310d762009-05-15 09:23:25 +0000943
944 uint64_t Size = CTy.getSizeInBits() >> 3;
945 unsigned Tag = CTy.getTag();
946 Buffer.setTag(Tag);
947
948 switch (Tag) {
949 case dwarf::DW_TAG_vector_type:
950 case dwarf::DW_TAG_array_type:
951 ConstructArrayTypeDIE(DW_Unit, Buffer, &CTy);
952 break;
953 case dwarf::DW_TAG_enumeration_type: {
954 DIArray Elements = CTy.getTypeArray();
955
956 // Add enumerators to enumeration type.
957 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
958 DIE *ElemDie = NULL;
Devang Patele4b27562009-08-28 23:24:31 +0000959 DIEnumerator Enum(Elements.getElement(i).getNode());
Devang Patelc5254722009-10-09 17:51:49 +0000960 if (!Enum.isNull()) {
961 ElemDie = ConstructEnumTypeDIE(DW_Unit, &Enum);
962 Buffer.AddChild(ElemDie);
963 }
Bill Wendling0310d762009-05-15 09:23:25 +0000964 }
965 }
966 break;
967 case dwarf::DW_TAG_subroutine_type: {
968 // Add return type.
969 DIArray Elements = CTy.getTypeArray();
970 DIDescriptor RTy = Elements.getElement(0);
Devang Patele4b27562009-08-28 23:24:31 +0000971 AddType(DW_Unit, &Buffer, DIType(RTy.getNode()));
Bill Wendling0310d762009-05-15 09:23:25 +0000972
973 // Add prototype flag.
974 AddUInt(&Buffer, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
975
976 // Add arguments.
977 for (unsigned i = 1, N = Elements.getNumElements(); i < N; ++i) {
978 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
979 DIDescriptor Ty = Elements.getElement(i);
Devang Patele4b27562009-08-28 23:24:31 +0000980 AddType(DW_Unit, Arg, DIType(Ty.getNode()));
Bill Wendling0310d762009-05-15 09:23:25 +0000981 Buffer.AddChild(Arg);
982 }
983 }
984 break;
985 case dwarf::DW_TAG_structure_type:
986 case dwarf::DW_TAG_union_type:
987 case dwarf::DW_TAG_class_type: {
988 // Add elements to structure type.
989 DIArray Elements = CTy.getTypeArray();
990
991 // A forward struct declared type may not have elements available.
992 if (Elements.isNull())
993 break;
994
995 // Add elements to structure type.
996 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
997 DIDescriptor Element = Elements.getElement(i);
Devang Patele4b27562009-08-28 23:24:31 +0000998 if (Element.isNull())
999 continue;
Bill Wendling0310d762009-05-15 09:23:25 +00001000 DIE *ElemDie = NULL;
1001 if (Element.getTag() == dwarf::DW_TAG_subprogram)
1002 ElemDie = CreateSubprogramDIE(DW_Unit,
Devang Patele4b27562009-08-28 23:24:31 +00001003 DISubprogram(Element.getNode()));
Bill Wendling0310d762009-05-15 09:23:25 +00001004 else
1005 ElemDie = CreateMemberDIE(DW_Unit,
Devang Patele4b27562009-08-28 23:24:31 +00001006 DIDerivedType(Element.getNode()));
Bill Wendling0310d762009-05-15 09:23:25 +00001007 Buffer.AddChild(ElemDie);
1008 }
1009
Devang Patela1ba2692009-08-27 23:51:51 +00001010 if (CTy.isAppleBlockExtension())
Bill Wendling0310d762009-05-15 09:23:25 +00001011 AddUInt(&Buffer, dwarf::DW_AT_APPLE_block, dwarf::DW_FORM_flag, 1);
1012
1013 unsigned RLang = CTy.getRunTimeLang();
1014 if (RLang)
1015 AddUInt(&Buffer, dwarf::DW_AT_APPLE_runtime_class,
1016 dwarf::DW_FORM_data1, RLang);
1017 break;
1018 }
1019 default:
1020 break;
1021 }
1022
1023 // Add name if not anonymous or intermediate type.
Devang Patel5ccdd102009-09-29 18:40:58 +00001024 if (Name)
Bill Wendling0310d762009-05-15 09:23:25 +00001025 AddString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1026
1027 if (Tag == dwarf::DW_TAG_enumeration_type ||
1028 Tag == dwarf::DW_TAG_structure_type || Tag == dwarf::DW_TAG_union_type) {
1029 // Add size if non-zero (derived types might be zero-sized.)
1030 if (Size)
1031 AddUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
1032 else {
1033 // Add zero size if it is not a forward declaration.
1034 if (CTy.isForwardDecl())
1035 AddUInt(&Buffer, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1036 else
1037 AddUInt(&Buffer, dwarf::DW_AT_byte_size, 0, 0);
1038 }
1039
1040 // Add source line info if available.
1041 if (!CTy.isForwardDecl())
1042 AddSourceLine(&Buffer, &CTy);
1043 }
1044}
1045
1046/// ConstructSubrangeDIE - Construct subrange DIE from DISubrange.
1047void DwarfDebug::ConstructSubrangeDIE(DIE &Buffer, DISubrange SR, DIE *IndexTy){
1048 int64_t L = SR.getLo();
1049 int64_t H = SR.getHi();
1050 DIE *DW_Subrange = new DIE(dwarf::DW_TAG_subrange_type);
1051
Devang Patel6325a532009-08-14 20:59:16 +00001052 AddDIEEntry(DW_Subrange, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IndexTy);
1053 if (L)
1054 AddSInt(DW_Subrange, dwarf::DW_AT_lower_bound, 0, L);
1055 if (H)
Daniel Dunbar00564992009-09-19 20:40:14 +00001056 AddSInt(DW_Subrange, dwarf::DW_AT_upper_bound, 0, H);
Bill Wendling0310d762009-05-15 09:23:25 +00001057
1058 Buffer.AddChild(DW_Subrange);
1059}
1060
1061/// ConstructArrayTypeDIE - Construct array type DIE from DICompositeType.
1062void DwarfDebug::ConstructArrayTypeDIE(CompileUnit *DW_Unit, DIE &Buffer,
1063 DICompositeType *CTy) {
1064 Buffer.setTag(dwarf::DW_TAG_array_type);
1065 if (CTy->getTag() == dwarf::DW_TAG_vector_type)
1066 AddUInt(&Buffer, dwarf::DW_AT_GNU_vector, dwarf::DW_FORM_flag, 1);
1067
1068 // Emit derived type.
1069 AddType(DW_Unit, &Buffer, CTy->getTypeDerivedFrom());
1070 DIArray Elements = CTy->getTypeArray();
1071
1072 // Construct an anonymous type for index type.
1073 DIE IdxBuffer(dwarf::DW_TAG_base_type);
1074 AddUInt(&IdxBuffer, dwarf::DW_AT_byte_size, 0, sizeof(int32_t));
1075 AddUInt(&IdxBuffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
1076 dwarf::DW_ATE_signed);
1077 DIE *IndexTy = DW_Unit->AddDie(IdxBuffer);
1078
1079 // Add subranges to array type.
1080 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1081 DIDescriptor Element = Elements.getElement(i);
1082 if (Element.getTag() == dwarf::DW_TAG_subrange_type)
Devang Patele4b27562009-08-28 23:24:31 +00001083 ConstructSubrangeDIE(Buffer, DISubrange(Element.getNode()), IndexTy);
Bill Wendling0310d762009-05-15 09:23:25 +00001084 }
1085}
1086
1087/// ConstructEnumTypeDIE - Construct enum type DIE from DIEnumerator.
1088DIE *DwarfDebug::ConstructEnumTypeDIE(CompileUnit *DW_Unit, DIEnumerator *ETy) {
1089 DIE *Enumerator = new DIE(dwarf::DW_TAG_enumerator);
Devang Patel5ccdd102009-09-29 18:40:58 +00001090 const char *Name = ETy->getName();
Bill Wendling0310d762009-05-15 09:23:25 +00001091 AddString(Enumerator, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1092 int64_t Value = ETy->getEnumValue();
1093 AddSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, Value);
1094 return Enumerator;
1095}
1096
1097/// CreateGlobalVariableDIE - Create new DIE using GV.
1098DIE *DwarfDebug::CreateGlobalVariableDIE(CompileUnit *DW_Unit,
1099 const DIGlobalVariable &GV) {
1100 DIE *GVDie = new DIE(dwarf::DW_TAG_variable);
Devang Patel5ccdd102009-09-29 18:40:58 +00001101 AddString(GVDie, dwarf::DW_AT_name, dwarf::DW_FORM_string,
1102 GV.getDisplayName());
1103
1104 const char *LinkageName = GV.getLinkageName();
1105 if (LinkageName) {
Chris Lattner6c2f9e12009-08-19 05:49:37 +00001106 // Skip special LLVM prefix that is used to inform the asm printer to not
1107 // emit usual symbol prefix before the symbol name. This happens for
1108 // Objective-C symbol names and symbol whose name is replaced using GCC's
1109 // __asm__ attribute.
Devang Patel53cb17d2009-07-16 01:01:22 +00001110 if (LinkageName[0] == 1)
1111 LinkageName = &LinkageName[1];
Bill Wendling0310d762009-05-15 09:23:25 +00001112 AddString(GVDie, dwarf::DW_AT_MIPS_linkage_name, dwarf::DW_FORM_string,
Devang Patel1a8d2d22009-07-14 00:55:28 +00001113 LinkageName);
Devang Patel53cb17d2009-07-16 01:01:22 +00001114 }
Daniel Dunbar00564992009-09-19 20:40:14 +00001115 AddType(DW_Unit, GVDie, GV.getType());
Bill Wendling0310d762009-05-15 09:23:25 +00001116 if (!GV.isLocalToUnit())
1117 AddUInt(GVDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
1118 AddSourceLine(GVDie, &GV);
Devang Patelb71a16d2009-10-05 23:22:08 +00001119
1120 // Add address.
1121 DIEBlock *Block = new DIEBlock();
1122 AddUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
1123 AddObjectLabel(Block, 0, dwarf::DW_FORM_udata,
1124 Asm->Mang->getMangledName(GV.getGlobal()));
1125 AddBlock(GVDie, dwarf::DW_AT_location, 0, Block);
1126
Bill Wendling0310d762009-05-15 09:23:25 +00001127 return GVDie;
1128}
1129
1130/// CreateMemberDIE - Create new member DIE.
1131DIE *DwarfDebug::CreateMemberDIE(CompileUnit *DW_Unit, const DIDerivedType &DT){
1132 DIE *MemberDie = new DIE(DT.getTag());
Devang Patel5ccdd102009-09-29 18:40:58 +00001133 if (const char *Name = DT.getName())
Bill Wendling0310d762009-05-15 09:23:25 +00001134 AddString(MemberDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1135
1136 AddType(DW_Unit, MemberDie, DT.getTypeDerivedFrom());
1137
1138 AddSourceLine(MemberDie, &DT);
1139
Devang Patel33db5082009-11-04 22:06:12 +00001140 DIEBlock *MemLocationDie = new DIEBlock();
1141 AddUInt(MemLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
1142
Bill Wendling0310d762009-05-15 09:23:25 +00001143 uint64_t Size = DT.getSizeInBits();
Devang Patel61ecbd12009-11-04 23:48:00 +00001144 uint64_t FieldSize = DT.getOriginalTypeSize();
Bill Wendling0310d762009-05-15 09:23:25 +00001145
1146 if (Size != FieldSize) {
1147 // Handle bitfield.
1148 AddUInt(MemberDie, dwarf::DW_AT_byte_size, 0, DT.getOriginalTypeSize()>>3);
1149 AddUInt(MemberDie, dwarf::DW_AT_bit_size, 0, DT.getSizeInBits());
1150
1151 uint64_t Offset = DT.getOffsetInBits();
1152 uint64_t FieldOffset = Offset;
1153 uint64_t AlignMask = ~(DT.getAlignInBits() - 1);
1154 uint64_t HiMark = (Offset + FieldSize) & AlignMask;
1155 FieldOffset = (HiMark - FieldSize);
1156 Offset -= FieldOffset;
1157
1158 // Maybe we need to work from the other end.
1159 if (TD->isLittleEndian()) Offset = FieldSize - (Offset + Size);
1160 AddUInt(MemberDie, dwarf::DW_AT_bit_offset, 0, Offset);
Bill Wendling0310d762009-05-15 09:23:25 +00001161
Devang Patel33db5082009-11-04 22:06:12 +00001162 // Here WD_AT_data_member_location points to the anonymous
1163 // field that includes this bit field.
1164 AddUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, FieldOffset >> 3);
1165
1166 } else
1167 // This is not a bitfield.
1168 AddUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits() >> 3);
1169
1170 AddBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, MemLocationDie);
Bill Wendling0310d762009-05-15 09:23:25 +00001171
1172 if (DT.isProtected())
1173 AddUInt(MemberDie, dwarf::DW_AT_accessibility, 0,
1174 dwarf::DW_ACCESS_protected);
1175 else if (DT.isPrivate())
1176 AddUInt(MemberDie, dwarf::DW_AT_accessibility, 0,
1177 dwarf::DW_ACCESS_private);
1178
1179 return MemberDie;
1180}
1181
1182/// CreateSubprogramDIE - Create new DIE using SP.
1183DIE *DwarfDebug::CreateSubprogramDIE(CompileUnit *DW_Unit,
1184 const DISubprogram &SP,
Bill Wendling6679ee42009-05-18 22:02:36 +00001185 bool IsConstructor,
1186 bool IsInlined) {
Bill Wendling0310d762009-05-15 09:23:25 +00001187 DIE *SPDie = new DIE(dwarf::DW_TAG_subprogram);
1188
Devang Patel5ccdd102009-09-29 18:40:58 +00001189 const char * Name = SP.getName();
Bill Wendling0310d762009-05-15 09:23:25 +00001190 AddString(SPDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1191
Devang Patel5ccdd102009-09-29 18:40:58 +00001192 const char *LinkageName = SP.getLinkageName();
1193 if (LinkageName) {
Devang Patel53cb17d2009-07-16 01:01:22 +00001194 // Skip special LLVM prefix that is used to inform the asm printer to not emit
1195 // usual symbol prefix before the symbol name. This happens for Objective-C
1196 // symbol names and symbol whose name is replaced using GCC's __asm__ attribute.
1197 if (LinkageName[0] == 1)
1198 LinkageName = &LinkageName[1];
Bill Wendling0310d762009-05-15 09:23:25 +00001199 AddString(SPDie, dwarf::DW_AT_MIPS_linkage_name, dwarf::DW_FORM_string,
Devang Patel1a8d2d22009-07-14 00:55:28 +00001200 LinkageName);
Devang Patel53cb17d2009-07-16 01:01:22 +00001201 }
Bill Wendling0310d762009-05-15 09:23:25 +00001202 AddSourceLine(SPDie, &SP);
1203
1204 DICompositeType SPTy = SP.getType();
1205 DIArray Args = SPTy.getTypeArray();
1206
1207 // Add prototyped tag, if C or ObjC.
1208 unsigned Lang = SP.getCompileUnit().getLanguage();
1209 if (Lang == dwarf::DW_LANG_C99 || Lang == dwarf::DW_LANG_C89 ||
1210 Lang == dwarf::DW_LANG_ObjC)
1211 AddUInt(SPDie, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
1212
1213 // Add Return Type.
1214 unsigned SPTag = SPTy.getTag();
1215 if (!IsConstructor) {
1216 if (Args.isNull() || SPTag != dwarf::DW_TAG_subroutine_type)
1217 AddType(DW_Unit, SPDie, SPTy);
1218 else
Devang Patele4b27562009-08-28 23:24:31 +00001219 AddType(DW_Unit, SPDie, DIType(Args.getElement(0).getNode()));
Bill Wendling0310d762009-05-15 09:23:25 +00001220 }
1221
1222 if (!SP.isDefinition()) {
1223 AddUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1224
1225 // Add arguments. Do not add arguments for subprogram definition. They will
1226 // be handled through RecordVariable.
1227 if (SPTag == dwarf::DW_TAG_subroutine_type)
1228 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
1229 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
Devang Patele4b27562009-08-28 23:24:31 +00001230 AddType(DW_Unit, Arg, DIType(Args.getElement(i).getNode()));
Bill Wendling0310d762009-05-15 09:23:25 +00001231 AddUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1); // ??
1232 SPDie->AddChild(Arg);
1233 }
1234 }
1235
Bill Wendling6679ee42009-05-18 22:02:36 +00001236 if (!SP.isLocalToUnit() && !IsInlined)
Bill Wendling0310d762009-05-15 09:23:25 +00001237 AddUInt(SPDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
1238
1239 // DW_TAG_inlined_subroutine may refer to this DIE.
Devang Patele4b27562009-08-28 23:24:31 +00001240 DIE *&Slot = DW_Unit->getDieMapSlotFor(SP.getNode());
Bill Wendling0310d762009-05-15 09:23:25 +00001241 Slot = SPDie;
1242 return SPDie;
1243}
1244
1245/// FindCompileUnit - Get the compile unit for the given descriptor.
1246///
1247CompileUnit &DwarfDebug::FindCompileUnit(DICompileUnit Unit) const {
1248 DenseMap<Value *, CompileUnit *>::const_iterator I =
Devang Patele4b27562009-08-28 23:24:31 +00001249 CompileUnitMap.find(Unit.getNode());
Bill Wendling0310d762009-05-15 09:23:25 +00001250 assert(I != CompileUnitMap.end() && "Missing compile unit.");
1251 return *I->second;
1252}
1253
Bill Wendling995f80a2009-05-20 23:24:48 +00001254/// CreateDbgScopeVariable - Create a new scope variable.
Bill Wendling0310d762009-05-15 09:23:25 +00001255///
Bill Wendling995f80a2009-05-20 23:24:48 +00001256DIE *DwarfDebug::CreateDbgScopeVariable(DbgVariable *DV, CompileUnit *Unit) {
Bill Wendling0310d762009-05-15 09:23:25 +00001257 // Get the descriptor.
1258 const DIVariable &VD = DV->getVariable();
Devang Patel1b845972009-11-03 18:30:27 +00001259 const char *Name = VD.getName();
1260 if (!Name)
1261 return NULL;
Bill Wendling0310d762009-05-15 09:23:25 +00001262
1263 // Translate tag to proper Dwarf tag. The result variable is dropped for
1264 // now.
1265 unsigned Tag;
1266 switch (VD.getTag()) {
1267 case dwarf::DW_TAG_return_variable:
1268 return NULL;
1269 case dwarf::DW_TAG_arg_variable:
1270 Tag = dwarf::DW_TAG_formal_parameter;
1271 break;
1272 case dwarf::DW_TAG_auto_variable: // fall thru
1273 default:
1274 Tag = dwarf::DW_TAG_variable;
1275 break;
1276 }
1277
1278 // Define variable debug information entry.
1279 DIE *VariableDie = new DIE(Tag);
Bill Wendling0310d762009-05-15 09:23:25 +00001280 AddString(VariableDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1281
1282 // Add source line info if available.
1283 AddSourceLine(VariableDie, &VD);
1284
1285 // Add variable type.
Mike Stump3e4c9bd2009-09-30 00:08:22 +00001286 // FIXME: isBlockByrefVariable should be reformulated in terms of complex addresses instead.
Caroline Ticedc8f6042009-08-31 21:19:37 +00001287 if (VD.isBlockByrefVariable())
1288 AddType(Unit, VariableDie, GetBlockByrefType(VD.getType(), Name));
1289 else
1290 AddType(Unit, VariableDie, VD.getType());
Bill Wendling0310d762009-05-15 09:23:25 +00001291
1292 // Add variable address.
Bill Wendling1180c782009-05-18 23:08:55 +00001293 if (!DV->isInlinedFnVar()) {
1294 // Variables for abstract instances of inlined functions don't get a
1295 // location.
1296 MachineLocation Location;
1297 Location.set(RI->getFrameRegister(*MF),
1298 RI->getFrameIndexOffset(*MF, DV->getFrameIndex()));
Caroline Ticedc8f6042009-08-31 21:19:37 +00001299
Mike Stump3e4c9bd2009-09-30 00:08:22 +00001300
1301 if (VD.hasComplexAddress())
1302 AddComplexAddress(DV, VariableDie, dwarf::DW_AT_location, Location);
1303 else if (VD.isBlockByrefVariable())
Mike Stumpee4b8a72009-09-24 23:11:08 +00001304 AddBlockByrefAddress(DV, VariableDie, dwarf::DW_AT_location, Location);
Caroline Ticedc8f6042009-08-31 21:19:37 +00001305 else
1306 AddAddress(VariableDie, dwarf::DW_AT_location, Location);
Bill Wendling1180c782009-05-18 23:08:55 +00001307 }
Bill Wendling0310d762009-05-15 09:23:25 +00001308
1309 return VariableDie;
1310}
1311
1312/// getOrCreateScope - Returns the scope associated with the given descriptor.
1313///
Devang Patelc90aefe2009-10-14 21:08:09 +00001314DbgScope *DwarfDebug::getDbgScope(MDNode *N, const MachineInstr *MI,
1315 MDNode *InlinedAt) {
Devang Patelbdf45cb2009-10-27 20:47:17 +00001316 ValueMap<MDNode *, DbgScope *>::iterator VI = DbgScopeMap.find(N);
1317 if (VI != DbgScopeMap.end())
1318 return VI->second;
Devang Patelaf9e8472009-10-01 20:31:14 +00001319
1320 DbgScope *Parent = NULL;
1321
Devang Patelc90aefe2009-10-14 21:08:09 +00001322 if (InlinedAt) {
1323 DILocation IL(InlinedAt);
1324 assert (!IL.isNull() && "Invalid InlindAt location!");
Devang Patelbdf45cb2009-10-27 20:47:17 +00001325 ValueMap<MDNode *, DbgScope *>::iterator DSI =
Devang Patelc90aefe2009-10-14 21:08:09 +00001326 DbgScopeMap.find(IL.getScope().getNode());
1327 assert (DSI != DbgScopeMap.end() && "Unable to find InlineAt scope!");
1328 Parent = DSI->second;
1329 } else {
1330 DIDescriptor Scope(N);
1331 if (Scope.isCompileUnit()) {
1332 return NULL;
1333 } else if (Scope.isSubprogram()) {
1334 DISubprogram SP(N);
1335 DIDescriptor ParentDesc = SP.getContext();
1336 if (!ParentDesc.isNull() && !ParentDesc.isCompileUnit())
1337 Parent = getDbgScope(ParentDesc.getNode(), MI, InlinedAt);
1338 } else if (Scope.isLexicalBlock()) {
1339 DILexicalBlock DB(N);
1340 DIDescriptor ParentDesc = DB.getContext();
1341 if (!ParentDesc.isNull())
1342 Parent = getDbgScope(ParentDesc.getNode(), MI, InlinedAt);
1343 } else
1344 assert (0 && "Unexpected scope info");
1345 }
Devang Patelaf9e8472009-10-01 20:31:14 +00001346
Devang Patelbdf45cb2009-10-27 20:47:17 +00001347 DbgScope *NScope = new DbgScope(Parent, DIDescriptor(N), InlinedAt);
1348 NScope->setFirstInsn(MI);
Devang Patelaf9e8472009-10-01 20:31:14 +00001349
1350 if (Parent)
Devang Patelbdf45cb2009-10-27 20:47:17 +00001351 Parent->AddScope(NScope);
Devang Patelaf9e8472009-10-01 20:31:14 +00001352 else
1353 // First function is top level function.
Devang Patelaf9e8472009-10-01 20:31:14 +00001354 if (!FunctionDbgScope)
Devang Patelbdf45cb2009-10-27 20:47:17 +00001355 FunctionDbgScope = NScope;
Devang Patelaf9e8472009-10-01 20:31:14 +00001356
Devang Patelbdf45cb2009-10-27 20:47:17 +00001357 DbgScopeMap.insert(std::make_pair(N, NScope));
1358 return NScope;
Devang Patelaf9e8472009-10-01 20:31:14 +00001359}
1360
1361
1362/// getOrCreateScope - Returns the scope associated with the given descriptor.
1363/// FIXME - Remove this method.
Devang Patele4b27562009-08-28 23:24:31 +00001364DbgScope *DwarfDebug::getOrCreateScope(MDNode *N) {
1365 DbgScope *&Slot = DbgScopeMap[N];
Bill Wendling0310d762009-05-15 09:23:25 +00001366 if (Slot) return Slot;
1367
1368 DbgScope *Parent = NULL;
Devang Patel5e005d82009-08-31 22:00:15 +00001369 DILexicalBlock Block(N);
Bill Wendling0310d762009-05-15 09:23:25 +00001370
Bill Wendling8fff19b2009-06-01 20:18:46 +00001371 // Don't create a new scope if we already created one for an inlined function.
Devang Patele4b27562009-08-28 23:24:31 +00001372 DenseMap<const MDNode *, DbgScope *>::iterator
1373 II = AbstractInstanceRootMap.find(N);
Bill Wendling8fff19b2009-06-01 20:18:46 +00001374 if (II != AbstractInstanceRootMap.end())
1375 return LexicalScopeStack.back();
1376
Bill Wendling0310d762009-05-15 09:23:25 +00001377 if (!Block.isNull()) {
1378 DIDescriptor ParentDesc = Block.getContext();
1379 Parent =
Devang Patele4b27562009-08-28 23:24:31 +00001380 ParentDesc.isNull() ? NULL : getOrCreateScope(ParentDesc.getNode());
Bill Wendling0310d762009-05-15 09:23:25 +00001381 }
1382
Devang Patele4b27562009-08-28 23:24:31 +00001383 Slot = new DbgScope(Parent, DIDescriptor(N));
Bill Wendling0310d762009-05-15 09:23:25 +00001384
1385 if (Parent)
1386 Parent->AddScope(Slot);
1387 else
1388 // First function is top level function.
1389 FunctionDbgScope = Slot;
1390
1391 return Slot;
1392}
1393
1394/// ConstructDbgScope - Construct the components of a scope.
1395///
1396void DwarfDebug::ConstructDbgScope(DbgScope *ParentScope,
1397 unsigned ParentStartID,
1398 unsigned ParentEndID,
1399 DIE *ParentDie, CompileUnit *Unit) {
1400 // Add variables to scope.
1401 SmallVector<DbgVariable *, 8> &Variables = ParentScope->getVariables();
1402 for (unsigned i = 0, N = Variables.size(); i < N; ++i) {
Bill Wendling995f80a2009-05-20 23:24:48 +00001403 DIE *VariableDie = CreateDbgScopeVariable(Variables[i], Unit);
Bill Wendling0310d762009-05-15 09:23:25 +00001404 if (VariableDie) ParentDie->AddChild(VariableDie);
1405 }
1406
1407 // Add concrete instances to scope.
1408 SmallVector<DbgConcreteScope *, 8> &ConcreteInsts =
1409 ParentScope->getConcreteInsts();
1410 for (unsigned i = 0, N = ConcreteInsts.size(); i < N; ++i) {
1411 DbgConcreteScope *ConcreteInst = ConcreteInsts[i];
1412 DIE *Die = ConcreteInst->getDie();
1413
1414 unsigned StartID = ConcreteInst->getStartLabelID();
1415 unsigned EndID = ConcreteInst->getEndLabelID();
1416
1417 // Add the scope bounds.
1418 if (StartID)
1419 AddLabel(Die, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
1420 DWLabel("label", StartID));
1421 else
1422 AddLabel(Die, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
1423 DWLabel("func_begin", SubprogramCount));
1424
1425 if (EndID)
1426 AddLabel(Die, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
1427 DWLabel("label", EndID));
1428 else
1429 AddLabel(Die, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
1430 DWLabel("func_end", SubprogramCount));
1431
1432 ParentDie->AddChild(Die);
1433 }
1434
1435 // Add nested scopes.
1436 SmallVector<DbgScope *, 4> &Scopes = ParentScope->getScopes();
1437 for (unsigned j = 0, M = Scopes.size(); j < M; ++j) {
1438 // Define the Scope debug information entry.
1439 DbgScope *Scope = Scopes[j];
1440
1441 unsigned StartID = MMI->MappedLabel(Scope->getStartLabelID());
1442 unsigned EndID = MMI->MappedLabel(Scope->getEndLabelID());
1443
1444 // Ignore empty scopes.
1445 if (StartID == EndID && StartID != 0) continue;
1446
1447 // Do not ignore inlined scopes even if they don't have any variables or
1448 // scopes.
1449 if (Scope->getScopes().empty() && Scope->getVariables().empty() &&
1450 Scope->getConcreteInsts().empty())
1451 continue;
1452
1453 if (StartID == ParentStartID && EndID == ParentEndID) {
1454 // Just add stuff to the parent scope.
1455 ConstructDbgScope(Scope, ParentStartID, ParentEndID, ParentDie, Unit);
1456 } else {
1457 DIE *ScopeDie = new DIE(dwarf::DW_TAG_lexical_block);
1458
1459 // Add the scope bounds.
1460 if (StartID)
1461 AddLabel(ScopeDie, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
1462 DWLabel("label", StartID));
1463 else
1464 AddLabel(ScopeDie, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
1465 DWLabel("func_begin", SubprogramCount));
1466
1467 if (EndID)
1468 AddLabel(ScopeDie, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
1469 DWLabel("label", EndID));
1470 else
1471 AddLabel(ScopeDie, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
1472 DWLabel("func_end", SubprogramCount));
1473
1474 // Add the scope's contents.
1475 ConstructDbgScope(Scope, StartID, EndID, ScopeDie, Unit);
1476 ParentDie->AddChild(ScopeDie);
1477 }
1478 }
1479}
1480
1481/// ConstructFunctionDbgScope - Construct the scope for the subprogram.
1482///
Bill Wendling17956162009-05-20 23:28:48 +00001483void DwarfDebug::ConstructFunctionDbgScope(DbgScope *RootScope,
1484 bool AbstractScope) {
Bill Wendling0310d762009-05-15 09:23:25 +00001485 // Exit if there is no root scope.
1486 if (!RootScope) return;
1487 DIDescriptor Desc = RootScope->getDesc();
1488 if (Desc.isNull())
1489 return;
1490
1491 // Get the subprogram debug information entry.
Devang Patele4b27562009-08-28 23:24:31 +00001492 DISubprogram SPD(Desc.getNode());
Bill Wendling0310d762009-05-15 09:23:25 +00001493
Bill Wendling0310d762009-05-15 09:23:25 +00001494 // Get the subprogram die.
Devang Patele4b27562009-08-28 23:24:31 +00001495 DIE *SPDie = ModuleCU->getDieMapSlotFor(SPD.getNode());
Devang Patelffd9c3d2009-10-05 23:59:00 +00001496 if (!SPDie) {
1497 ConstructSubprogram(SPD.getNode());
1498 SPDie = ModuleCU->getDieMapSlotFor(SPD.getNode());
1499 }
Bill Wendling0310d762009-05-15 09:23:25 +00001500 assert(SPDie && "Missing subprogram descriptor");
1501
Bill Wendling17956162009-05-20 23:28:48 +00001502 if (!AbstractScope) {
1503 // Add the function bounds.
1504 AddLabel(SPDie, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
1505 DWLabel("func_begin", SubprogramCount));
1506 AddLabel(SPDie, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
1507 DWLabel("func_end", SubprogramCount));
1508 MachineLocation Location(RI->getFrameRegister(*MF));
1509 AddAddress(SPDie, dwarf::DW_AT_frame_base, Location);
1510 }
Bill Wendling0310d762009-05-15 09:23:25 +00001511
Devang Patel1dbc7712009-06-29 20:45:18 +00001512 ConstructDbgScope(RootScope, 0, 0, SPDie, ModuleCU);
Devang Patelfd07cf52009-10-05 23:40:42 +00001513 // If there are global variables at this scope then add their dies.
1514 for (SmallVector<WeakVH, 4>::iterator SGI = ScopedGVs.begin(),
1515 SGE = ScopedGVs.end(); SGI != SGE; ++SGI) {
1516 MDNode *N = dyn_cast_or_null<MDNode>(*SGI);
1517 if (!N) continue;
1518 DIGlobalVariable GV(N);
1519 if (GV.getContext().getNode() == RootScope->getDesc().getNode()) {
1520 DIE *ScopedGVDie = CreateGlobalVariableDIE(ModuleCU, GV);
1521 SPDie->AddChild(ScopedGVDie);
1522 }
1523 }
Bill Wendling0310d762009-05-15 09:23:25 +00001524}
1525
Bill Wendling0310d762009-05-15 09:23:25 +00001526/// ConstructDefaultDbgScope - Construct a default scope for the subprogram.
1527///
1528void DwarfDebug::ConstructDefaultDbgScope(MachineFunction *MF) {
Devang Patel1dbc7712009-06-29 20:45:18 +00001529 StringMap<DIE*> &Globals = ModuleCU->getGlobals();
Daniel Dunbar460f6562009-07-26 09:48:23 +00001530 StringMap<DIE*>::iterator GI = Globals.find(MF->getFunction()->getName());
Devang Patel70f44262009-06-29 20:38:13 +00001531 if (GI != Globals.end()) {
1532 DIE *SPDie = GI->second;
Daniel Dunbarf612ff62009-09-19 20:40:05 +00001533
Devang Patel70f44262009-06-29 20:38:13 +00001534 // Add the function bounds.
1535 AddLabel(SPDie, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
1536 DWLabel("func_begin", SubprogramCount));
1537 AddLabel(SPDie, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
1538 DWLabel("func_end", SubprogramCount));
Daniel Dunbarf612ff62009-09-19 20:40:05 +00001539
Devang Patel70f44262009-06-29 20:38:13 +00001540 MachineLocation Location(RI->getFrameRegister(*MF));
1541 AddAddress(SPDie, dwarf::DW_AT_frame_base, Location);
Bill Wendling0310d762009-05-15 09:23:25 +00001542 }
Bill Wendling0310d762009-05-15 09:23:25 +00001543}
1544
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001545/// GetOrCreateSourceID - Look up the source id with the given directory and
1546/// source file names. If none currently exists, create a new id and insert it
1547/// in the SourceIds map. This can update DirectoryNames and SourceFileNames
1548/// maps as well.
Devang Patel5ccdd102009-09-29 18:40:58 +00001549unsigned DwarfDebug::GetOrCreateSourceID(const char *DirName,
1550 const char *FileName) {
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001551 unsigned DId;
1552 StringMap<unsigned>::iterator DI = DirectoryIdMap.find(DirName);
1553 if (DI != DirectoryIdMap.end()) {
1554 DId = DI->getValue();
1555 } else {
1556 DId = DirectoryNames.size() + 1;
1557 DirectoryIdMap[DirName] = DId;
1558 DirectoryNames.push_back(DirName);
1559 }
1560
1561 unsigned FId;
1562 StringMap<unsigned>::iterator FI = SourceFileIdMap.find(FileName);
1563 if (FI != SourceFileIdMap.end()) {
1564 FId = FI->getValue();
1565 } else {
1566 FId = SourceFileNames.size() + 1;
1567 SourceFileIdMap[FileName] = FId;
1568 SourceFileNames.push_back(FileName);
1569 }
1570
1571 DenseMap<std::pair<unsigned, unsigned>, unsigned>::iterator SI =
1572 SourceIdMap.find(std::make_pair(DId, FId));
1573 if (SI != SourceIdMap.end())
1574 return SI->second;
1575
1576 unsigned SrcId = SourceIds.size() + 1; // DW_AT_decl_file cannot be 0.
1577 SourceIdMap[std::make_pair(DId, FId)] = SrcId;
1578 SourceIds.push_back(std::make_pair(DId, FId));
1579
1580 return SrcId;
1581}
1582
Devang Patele4b27562009-08-28 23:24:31 +00001583void DwarfDebug::ConstructCompileUnit(MDNode *N) {
1584 DICompileUnit DIUnit(N);
Devang Patel5ccdd102009-09-29 18:40:58 +00001585 const char *FN = DIUnit.getFilename();
1586 const char *Dir = DIUnit.getDirectory();
1587 unsigned ID = GetOrCreateSourceID(Dir, FN);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001588
1589 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
1590 AddSectionOffset(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4,
1591 DWLabel("section_line", 0), DWLabel("section_line", 0),
1592 false);
1593 AddString(Die, dwarf::DW_AT_producer, dwarf::DW_FORM_string,
Devang Patel5ccdd102009-09-29 18:40:58 +00001594 DIUnit.getProducer());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001595 AddUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data1,
1596 DIUnit.getLanguage());
1597 AddString(Die, dwarf::DW_AT_name, dwarf::DW_FORM_string, FN);
1598
Devang Patel5ccdd102009-09-29 18:40:58 +00001599 if (Dir)
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001600 AddString(Die, dwarf::DW_AT_comp_dir, dwarf::DW_FORM_string, Dir);
1601 if (DIUnit.isOptimized())
1602 AddUInt(Die, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1);
1603
Devang Patel5ccdd102009-09-29 18:40:58 +00001604 if (const char *Flags = DIUnit.getFlags())
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001605 AddString(Die, dwarf::DW_AT_APPLE_flags, dwarf::DW_FORM_string, Flags);
1606
1607 unsigned RVer = DIUnit.getRunTimeVersion();
1608 if (RVer)
1609 AddUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers,
1610 dwarf::DW_FORM_data1, RVer);
1611
1612 CompileUnit *Unit = new CompileUnit(ID, Die);
Devang Patel1dbc7712009-06-29 20:45:18 +00001613 if (!ModuleCU && DIUnit.isMain()) {
Devang Patel70f44262009-06-29 20:38:13 +00001614 // Use first compile unit marked as isMain as the compile unit
1615 // for this module.
Devang Patel1dbc7712009-06-29 20:45:18 +00001616 ModuleCU = Unit;
Devang Patel70f44262009-06-29 20:38:13 +00001617 }
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001618
Devang Patele4b27562009-08-28 23:24:31 +00001619 CompileUnitMap[DIUnit.getNode()] = Unit;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001620 CompileUnits.push_back(Unit);
1621}
1622
Devang Patele4b27562009-08-28 23:24:31 +00001623void DwarfDebug::ConstructGlobalVariableDIE(MDNode *N) {
1624 DIGlobalVariable DI_GV(N);
Daniel Dunbarf612ff62009-09-19 20:40:05 +00001625
Devang Patel905cf5e2009-09-04 23:59:07 +00001626 // If debug information is malformed then ignore it.
1627 if (DI_GV.Verify() == false)
1628 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001629
1630 // Check for pre-existence.
Devang Patele4b27562009-08-28 23:24:31 +00001631 DIE *&Slot = ModuleCU->getDieMapSlotFor(DI_GV.getNode());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001632 if (Slot)
Devang Patel13e16b62009-06-26 01:49:18 +00001633 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001634
Devang Patel1dbc7712009-06-29 20:45:18 +00001635 DIE *VariableDie = CreateGlobalVariableDIE(ModuleCU, DI_GV);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001636
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001637 // Add to map.
1638 Slot = VariableDie;
1639
1640 // Add to context owner.
Devang Patel1dbc7712009-06-29 20:45:18 +00001641 ModuleCU->getDie()->AddChild(VariableDie);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001642
1643 // Expose as global. FIXME - need to check external flag.
Devang Patel5ccdd102009-09-29 18:40:58 +00001644 ModuleCU->AddGlobal(DI_GV.getName(), VariableDie);
Devang Patel13e16b62009-06-26 01:49:18 +00001645 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001646}
1647
Devang Patele4b27562009-08-28 23:24:31 +00001648void DwarfDebug::ConstructSubprogram(MDNode *N) {
1649 DISubprogram SP(N);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001650
1651 // Check for pre-existence.
Devang Patele4b27562009-08-28 23:24:31 +00001652 DIE *&Slot = ModuleCU->getDieMapSlotFor(N);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001653 if (Slot)
Devang Patel13e16b62009-06-26 01:49:18 +00001654 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001655
1656 if (!SP.isDefinition())
1657 // This is a method declaration which will be handled while constructing
1658 // class type.
Devang Patel13e16b62009-06-26 01:49:18 +00001659 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001660
Devang Patel1dbc7712009-06-29 20:45:18 +00001661 DIE *SubprogramDie = CreateSubprogramDIE(ModuleCU, SP);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001662
1663 // Add to map.
1664 Slot = SubprogramDie;
1665
1666 // Add to context owner.
Devang Patel1dbc7712009-06-29 20:45:18 +00001667 ModuleCU->getDie()->AddChild(SubprogramDie);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001668
1669 // Expose as global.
Devang Patel5ccdd102009-09-29 18:40:58 +00001670 ModuleCU->AddGlobal(SP.getName(), SubprogramDie);
Devang Patel13e16b62009-06-26 01:49:18 +00001671 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001672}
1673
Daniel Dunbar00564992009-09-19 20:40:14 +00001674/// BeginModule - Emit all Dwarf sections that should come prior to the
1675/// content. Create global DIEs and emit initial debug info sections.
1676/// This is inovked by the target AsmPrinter.
Devang Patel208622d2009-06-25 22:36:02 +00001677void DwarfDebug::BeginModule(Module *M, MachineModuleInfo *mmi) {
1678 this->M = M;
1679
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001680 if (TimePassesIsEnabled)
1681 DebugTimer->startTimer();
1682
Devang Patel78ab9e22009-07-30 18:56:46 +00001683 DebugInfoFinder DbgFinder;
1684 DbgFinder.processModule(*M);
Devang Patel13e16b62009-06-26 01:49:18 +00001685
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001686 // Create all the compile unit DIEs.
Devang Patel78ab9e22009-07-30 18:56:46 +00001687 for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
1688 E = DbgFinder.compile_unit_end(); I != E; ++I)
Devang Patel13e16b62009-06-26 01:49:18 +00001689 ConstructCompileUnit(*I);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001690
1691 if (CompileUnits.empty()) {
1692 if (TimePassesIsEnabled)
1693 DebugTimer->stopTimer();
1694
1695 return;
1696 }
1697
Devang Patel70f44262009-06-29 20:38:13 +00001698 // If main compile unit for this module is not seen than randomly
1699 // select first compile unit.
Devang Patel1dbc7712009-06-29 20:45:18 +00001700 if (!ModuleCU)
1701 ModuleCU = CompileUnits[0];
Devang Patel70f44262009-06-29 20:38:13 +00001702
Devang Patel13e16b62009-06-26 01:49:18 +00001703 // Create DIEs for each of the externally visible global variables.
Devang Patel78ab9e22009-07-30 18:56:46 +00001704 for (DebugInfoFinder::iterator I = DbgFinder.global_variable_begin(),
Devang Patelfd07cf52009-10-05 23:40:42 +00001705 E = DbgFinder.global_variable_end(); I != E; ++I) {
1706 DIGlobalVariable GV(*I);
1707 if (GV.getContext().getNode() != GV.getCompileUnit().getNode())
1708 ScopedGVs.push_back(*I);
1709 else
1710 ConstructGlobalVariableDIE(*I);
1711 }
Devang Patel13e16b62009-06-26 01:49:18 +00001712
1713 // Create DIEs for each of the externally visible subprograms.
Devang Patel78ab9e22009-07-30 18:56:46 +00001714 for (DebugInfoFinder::iterator I = DbgFinder.subprogram_begin(),
1715 E = DbgFinder.subprogram_end(); I != E; ++I)
Devang Patel13e16b62009-06-26 01:49:18 +00001716 ConstructSubprogram(*I);
1717
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001718 MMI = mmi;
1719 shouldEmit = true;
1720 MMI->setDebugInfoAvailability(true);
1721
1722 // Prime section data.
Chris Lattnerf0144122009-07-28 03:13:23 +00001723 SectionMap.insert(Asm->getObjFileLowering().getTextSection());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001724
1725 // Print out .file directives to specify files for .loc directives. These are
1726 // printed out early so that they precede any .loc directives.
Chris Lattner33adcfb2009-08-22 21:43:10 +00001727 if (MAI->hasDotLocAndDotFile()) {
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001728 for (unsigned i = 1, e = getNumSourceIds()+1; i != e; ++i) {
1729 // Remember source id starts at 1.
1730 std::pair<unsigned, unsigned> Id = getSourceDirectoryAndFileIds(i);
1731 sys::Path FullPath(getSourceDirectoryName(Id.first));
1732 bool AppendOk =
1733 FullPath.appendComponent(getSourceFileName(Id.second));
1734 assert(AppendOk && "Could not append filename to directory!");
1735 AppendOk = false;
Chris Lattner74382b72009-08-23 22:45:37 +00001736 Asm->EmitFile(i, FullPath.str());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001737 Asm->EOL();
1738 }
1739 }
1740
1741 // Emit initial sections
1742 EmitInitial();
1743
1744 if (TimePassesIsEnabled)
1745 DebugTimer->stopTimer();
1746}
1747
1748/// EndModule - Emit all Dwarf sections that should come after the content.
1749///
1750void DwarfDebug::EndModule() {
Devang Patel6f3dc922009-10-06 00:03:14 +00001751 if (!ModuleCU)
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001752 return;
1753
1754 if (TimePassesIsEnabled)
1755 DebugTimer->startTimer();
1756
1757 // Standard sections final addresses.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00001758 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getTextSection());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001759 EmitLabel("text_end", 0);
Chris Lattner6c2f9e12009-08-19 05:49:37 +00001760 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getDataSection());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001761 EmitLabel("data_end", 0);
1762
1763 // End text sections.
1764 for (unsigned i = 1, N = SectionMap.size(); i <= N; ++i) {
Chris Lattner6c2f9e12009-08-19 05:49:37 +00001765 Asm->OutStreamer.SwitchSection(SectionMap[i]);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001766 EmitLabel("section_end", i);
1767 }
1768
1769 // Emit common frame information.
1770 EmitCommonDebugFrame();
1771
1772 // Emit function debug frame information
1773 for (std::vector<FunctionDebugFrameInfo>::iterator I = DebugFrames.begin(),
1774 E = DebugFrames.end(); I != E; ++I)
1775 EmitFunctionDebugFrame(*I);
1776
1777 // Compute DIE offsets and sizes.
1778 SizeAndOffsets();
1779
1780 // Emit all the DIEs into a debug info section
1781 EmitDebugInfo();
1782
1783 // Corresponding abbreviations into a abbrev section.
1784 EmitAbbreviations();
1785
1786 // Emit source line correspondence into a debug line section.
1787 EmitDebugLines();
1788
1789 // Emit info into a debug pubnames section.
1790 EmitDebugPubNames();
1791
1792 // Emit info into a debug str section.
1793 EmitDebugStr();
1794
1795 // Emit info into a debug loc section.
1796 EmitDebugLoc();
1797
1798 // Emit info into a debug aranges section.
1799 EmitDebugARanges();
1800
1801 // Emit info into a debug ranges section.
1802 EmitDebugRanges();
1803
1804 // Emit info into a debug macinfo section.
1805 EmitDebugMacInfo();
1806
1807 // Emit inline info.
1808 EmitDebugInlineInfo();
1809
1810 if (TimePassesIsEnabled)
1811 DebugTimer->stopTimer();
1812}
1813
Devang Patele717faa2009-10-06 01:26:37 +00001814/// CollectVariableInfo - Populate DbgScope entries with variables' info.
Devang Patelac1ceb32009-10-09 22:42:28 +00001815void DwarfDebug::CollectVariableInfo() {
1816 if (!MMI) return;
Devang Patele717faa2009-10-06 01:26:37 +00001817 MachineModuleInfo::VariableDbgInfoMapTy &VMap = MMI->getVariableDbgInfo();
1818 for (MachineModuleInfo::VariableDbgInfoMapTy::iterator VI = VMap.begin(),
1819 VE = VMap.end(); VI != VE; ++VI) {
Devang Patelac1ceb32009-10-09 22:42:28 +00001820 MetadataBase *MB = VI->first;
1821 MDNode *Var = dyn_cast_or_null<MDNode>(MB);
Devang Pateleda31212009-10-08 18:48:03 +00001822 DIVariable DV (Var);
1823 if (DV.isNull()) continue;
Devang Patelac1ceb32009-10-09 22:42:28 +00001824 unsigned VSlot = VI->second;
Devang Patel149aa7c2009-10-16 18:18:03 +00001825 DbgScope *Scope = NULL;
Devang Patelbdf45cb2009-10-27 20:47:17 +00001826 ValueMap<MDNode *, DbgScope *>::iterator DSI =
Devang Patelc90aefe2009-10-14 21:08:09 +00001827 DbgScopeMap.find(DV.getContext().getNode());
Devang Patel149aa7c2009-10-16 18:18:03 +00001828 if (DSI != DbgScopeMap.end())
1829 Scope = DSI->second;
1830 else
1831 // There is not any instruction assocated with this scope, so get
1832 // a new scope.
1833 Scope = getDbgScope(DV.getContext().getNode(),
1834 NULL /* Not an instruction */,
1835 NULL /* Not inlined */);
1836 assert (Scope && "Unable to find variable scope!");
Devang Pateleda31212009-10-08 18:48:03 +00001837 Scope->AddVariable(new DbgVariable(DV, VSlot, false));
Devang Patele717faa2009-10-06 01:26:37 +00001838 }
1839}
1840
Devang Patel0d20ac82009-10-06 01:50:42 +00001841/// SetDbgScopeBeginLabels - Update DbgScope begin labels for the scopes that
1842/// start with this machine instruction.
1843void DwarfDebug::SetDbgScopeBeginLabels(const MachineInstr *MI, unsigned Label) {
1844 InsnToDbgScopeMapTy::iterator I = DbgScopeBeginMap.find(MI);
1845 if (I == DbgScopeBeginMap.end())
1846 return;
1847 SmallVector<DbgScope *, 2> &SD = I->second;
1848 for (SmallVector<DbgScope *, 2>::iterator SDI = SD.begin(), SDE = SD.end();
1849 SDI != SDE; ++SDI)
1850 (*SDI)->setStartLabelID(Label);
1851}
1852
1853/// SetDbgScopeEndLabels - Update DbgScope end labels for the scopes that
1854/// end with this machine instruction.
1855void DwarfDebug::SetDbgScopeEndLabels(const MachineInstr *MI, unsigned Label) {
1856 InsnToDbgScopeMapTy::iterator I = DbgScopeEndMap.find(MI);
Devang Patel8a4087d2009-10-06 03:15:38 +00001857 if (I == DbgScopeEndMap.end())
Devang Patel0d20ac82009-10-06 01:50:42 +00001858 return;
1859 SmallVector<DbgScope *, 2> &SD = I->second;
1860 for (SmallVector<DbgScope *, 2>::iterator SDI = SD.begin(), SDE = SD.end();
1861 SDI != SDE; ++SDI)
1862 (*SDI)->setEndLabelID(Label);
1863}
1864
Devang Patelaf9e8472009-10-01 20:31:14 +00001865/// ExtractScopeInformation - Scan machine instructions in this function
1866/// and collect DbgScopes. Return true, if atleast one scope was found.
1867bool DwarfDebug::ExtractScopeInformation(MachineFunction *MF) {
1868 // If scope information was extracted using .dbg intrinsics then there is not
1869 // any need to extract these information by scanning each instruction.
1870 if (!DbgScopeMap.empty())
1871 return false;
1872
1873 // Scan each instruction and create scopes.
1874 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
1875 I != E; ++I) {
1876 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
1877 II != IE; ++II) {
1878 const MachineInstr *MInsn = II;
1879 DebugLoc DL = MInsn->getDebugLoc();
1880 if (DL.isUnknown())
1881 continue;
1882 DebugLocTuple DLT = MF->getDebugLocTuple(DL);
Devang Patel1619dc32009-10-13 23:28:53 +00001883 if (!DLT.Scope)
Devang Patelaf9e8472009-10-01 20:31:14 +00001884 continue;
1885 // There is no need to create another DIE for compile unit. For all
1886 // other scopes, create one DbgScope now. This will be translated
1887 // into a scope DIE at the end.
Devang Patel1619dc32009-10-13 23:28:53 +00001888 DIDescriptor D(DLT.Scope);
Devang Patelaf9e8472009-10-01 20:31:14 +00001889 if (!D.isCompileUnit()) {
Devang Patelc90aefe2009-10-14 21:08:09 +00001890 DbgScope *Scope = getDbgScope(DLT.Scope, MInsn, DLT.InlinedAtLoc);
Devang Patelaf9e8472009-10-01 20:31:14 +00001891 Scope->setLastInsn(MInsn);
1892 }
1893 }
1894 }
1895
1896 // If a scope's last instruction is not set then use its child scope's
1897 // last instruction as this scope's last instrunction.
Devang Patelbdf45cb2009-10-27 20:47:17 +00001898 for (ValueMap<MDNode *, DbgScope *>::iterator DI = DbgScopeMap.begin(),
Devang Patelaf9e8472009-10-01 20:31:14 +00001899 DE = DbgScopeMap.end(); DI != DE; ++DI) {
Devang Patelbdf45cb2009-10-27 20:47:17 +00001900 DbgScope *S = DI->second;
1901 if (!S) continue;
Devang Patelaf9e8472009-10-01 20:31:14 +00001902 assert (DI->second->getFirstInsn() && "Invalid first instruction!");
1903 DI->second->FixInstructionMarkers();
1904 assert (DI->second->getLastInsn() && "Invalid last instruction!");
1905 }
1906
1907 // Each scope has first instruction and last instruction to mark beginning
1908 // and end of a scope respectively. Create an inverse map that list scopes
1909 // starts (and ends) with an instruction. One instruction may start (or end)
1910 // multiple scopes.
Devang Patelbdf45cb2009-10-27 20:47:17 +00001911 for (ValueMap<MDNode *, DbgScope *>::iterator DI = DbgScopeMap.begin(),
Devang Patelaf9e8472009-10-01 20:31:14 +00001912 DE = DbgScopeMap.end(); DI != DE; ++DI) {
1913 DbgScope *S = DI->second;
Devang Patelbdf45cb2009-10-27 20:47:17 +00001914 if (!S) continue;
Devang Patelaf9e8472009-10-01 20:31:14 +00001915 const MachineInstr *MI = S->getFirstInsn();
1916 assert (MI && "DbgScope does not have first instruction!");
1917
1918 InsnToDbgScopeMapTy::iterator IDI = DbgScopeBeginMap.find(MI);
1919 if (IDI != DbgScopeBeginMap.end())
1920 IDI->second.push_back(S);
1921 else
1922 DbgScopeBeginMap.insert(std::make_pair(MI,
1923 SmallVector<DbgScope *, 2>(2, S)));
1924
1925 MI = S->getLastInsn();
1926 assert (MI && "DbgScope does not have last instruction!");
1927 IDI = DbgScopeEndMap.find(MI);
1928 if (IDI != DbgScopeEndMap.end())
1929 IDI->second.push_back(S);
1930 else
1931 DbgScopeEndMap.insert(std::make_pair(MI,
1932 SmallVector<DbgScope *, 2>(2, S)));
1933 }
1934
1935 return !DbgScopeMap.empty();
1936}
1937
Devang Patel6ef75172009-10-12 23:11:24 +00001938static DISubprogram getDISubprogram(MDNode *N) {
1939
1940 DIDescriptor D(N);
1941 if (D.isNull())
1942 return DISubprogram();
1943
1944 if (D.isCompileUnit())
1945 return DISubprogram();
1946
1947 if (D.isSubprogram())
1948 return DISubprogram(N);
1949
1950 if (D.isLexicalBlock())
1951 return getDISubprogram(DILexicalBlock(N).getContext().getNode());
1952
Daniel Dunbar6e4bdfc2009-10-13 06:47:08 +00001953 llvm_unreachable("Unexpected Descriptor!");
Devang Patel6ef75172009-10-12 23:11:24 +00001954}
1955
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001956/// BeginFunction - Gather pre-function debug information. Assumes being
1957/// emitted immediately after the function entry point.
1958void DwarfDebug::BeginFunction(MachineFunction *MF) {
1959 this->MF = MF;
1960
1961 if (!ShouldEmitDwarfDebug()) return;
1962
1963 if (TimePassesIsEnabled)
1964 DebugTimer->startTimer();
1965
Devang Patel60b35bd2009-10-06 18:37:31 +00001966#ifdef ATTACH_DEBUG_INFO_TO_AN_INSN
1967 if (!ExtractScopeInformation(MF))
1968 return;
Devang Patelac1ceb32009-10-09 22:42:28 +00001969 CollectVariableInfo();
Devang Patel60b35bd2009-10-06 18:37:31 +00001970#endif
1971
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001972 // Begin accumulating function debug information.
1973 MMI->BeginFunction(MF);
1974
1975 // Assumes in correct section after the entry point.
1976 EmitLabel("func_begin", ++SubprogramCount);
1977
1978 // Emit label for the implicitly defined dbg.stoppoint at the start of the
1979 // function.
Devang Pateleda31212009-10-08 18:48:03 +00001980#ifdef ATTACH_DEBUG_INFO_TO_AN_INSN
Devang Patelac1ceb32009-10-09 22:42:28 +00001981 DebugLoc FDL = MF->getDefaultDebugLoc();
1982 if (!FDL.isUnknown()) {
1983 DebugLocTuple DLT = MF->getDebugLocTuple(FDL);
1984 unsigned LabelID = 0;
Devang Patel1619dc32009-10-13 23:28:53 +00001985 DISubprogram SP = getDISubprogram(DLT.Scope);
Devang Patelac1ceb32009-10-09 22:42:28 +00001986 if (!SP.isNull())
Devang Patel1619dc32009-10-13 23:28:53 +00001987 LabelID = RecordSourceLine(SP.getLineNumber(), 0, DLT.Scope);
Devang Patelac1ceb32009-10-09 22:42:28 +00001988 else
Devang Patel1619dc32009-10-13 23:28:53 +00001989 LabelID = RecordSourceLine(DLT.Line, DLT.Col, DLT.Scope);
Devang Patelac1ceb32009-10-09 22:42:28 +00001990 Asm->printLabel(LabelID);
1991 O << '\n';
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001992 }
Devang Patelac1ceb32009-10-09 22:42:28 +00001993#else
1994 DebugLoc FDL = MF->getDefaultDebugLoc();
1995 if (!FDL.isUnknown()) {
1996 DebugLocTuple DLT = MF->getDebugLocTuple(FDL);
Devang Patel1619dc32009-10-13 23:28:53 +00001997 unsigned LabelID = RecordSourceLine(DLT.Line, DLT.Col, DLT.Scope);
Devang Patelac1ceb32009-10-09 22:42:28 +00001998 Asm->printLabel(LabelID);
1999 O << '\n';
2000 }
2001#endif
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002002 if (TimePassesIsEnabled)
2003 DebugTimer->stopTimer();
2004}
2005
2006/// EndFunction - Gather and emit post-function debug information.
2007///
2008void DwarfDebug::EndFunction(MachineFunction *MF) {
2009 if (!ShouldEmitDwarfDebug()) return;
2010
2011 if (TimePassesIsEnabled)
2012 DebugTimer->startTimer();
2013
Devang Patelac1ceb32009-10-09 22:42:28 +00002014#ifdef ATTACH_DEBUG_INFO_TO_AN_INSN
2015 if (DbgScopeMap.empty())
2016 return;
2017#endif
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002018 // Define end label for subprogram.
2019 EmitLabel("func_end", SubprogramCount);
2020
2021 // Get function line info.
2022 if (!Lines.empty()) {
2023 // Get section line info.
Chris Lattner290c2f52009-08-03 23:20:21 +00002024 unsigned ID = SectionMap.insert(Asm->getCurrentSection());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002025 if (SectionSourceLines.size() < ID) SectionSourceLines.resize(ID);
2026 std::vector<SrcLineInfo> &SectionLineInfos = SectionSourceLines[ID-1];
2027 // Append the function info to section info.
2028 SectionLineInfos.insert(SectionLineInfos.end(),
2029 Lines.begin(), Lines.end());
2030 }
2031
2032 // Construct the DbgScope for abstract instances.
2033 for (SmallVector<DbgScope *, 32>::iterator
2034 I = AbstractInstanceRootList.begin(),
2035 E = AbstractInstanceRootList.end(); I != E; ++I)
Bill Wendling17956162009-05-20 23:28:48 +00002036 ConstructFunctionDbgScope(*I);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002037
2038 // Construct scopes for subprogram.
2039 if (FunctionDbgScope)
2040 ConstructFunctionDbgScope(FunctionDbgScope);
2041 else
2042 // FIXME: This is wrong. We are essentially getting past a problem with
2043 // debug information not being able to handle unreachable blocks that have
2044 // debug information in them. In particular, those unreachable blocks that
2045 // have "region end" info in them. That situation results in the "root
2046 // scope" not being created. If that's the case, then emit a "default"
2047 // scope, i.e., one that encompasses the whole function. This isn't
2048 // desirable. And a better way of handling this (and all of the debugging
2049 // information) needs to be explored.
2050 ConstructDefaultDbgScope(MF);
2051
2052 DebugFrames.push_back(FunctionDebugFrameInfo(SubprogramCount,
2053 MMI->getFrameMoves()));
2054
2055 // Clear debug info
2056 if (FunctionDbgScope) {
2057 delete FunctionDbgScope;
2058 DbgScopeMap.clear();
Devang Patelaf9e8472009-10-01 20:31:14 +00002059 DbgScopeBeginMap.clear();
2060 DbgScopeEndMap.clear();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002061 DbgAbstractScopeMap.clear();
2062 DbgConcreteScopeMap.clear();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002063 FunctionDbgScope = NULL;
2064 LexicalScopeStack.clear();
2065 AbstractInstanceRootList.clear();
Devang Patel9217f792009-06-12 19:24:05 +00002066 AbstractInstanceRootMap.clear();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002067 }
2068
2069 Lines.clear();
2070
2071 if (TimePassesIsEnabled)
2072 DebugTimer->stopTimer();
2073}
2074
2075/// RecordSourceLine - Records location information and associates it with a
2076/// label. Returns a unique label ID used to generate a label and provide
2077/// correspondence to the source line list.
Devang Patel3d910832009-09-30 22:51:28 +00002078unsigned DwarfDebug::RecordSourceLine(unsigned Line, unsigned Col,
Devang Patelf84548d2009-10-05 18:03:19 +00002079 MDNode *S) {
Devang Patele4b27562009-08-28 23:24:31 +00002080 if (!MMI)
2081 return 0;
2082
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002083 if (TimePassesIsEnabled)
2084 DebugTimer->startTimer();
2085
Devang Patelf84548d2009-10-05 18:03:19 +00002086 const char *Dir = NULL;
2087 const char *Fn = NULL;
2088
2089 DIDescriptor Scope(S);
2090 if (Scope.isCompileUnit()) {
2091 DICompileUnit CU(S);
2092 Dir = CU.getDirectory();
2093 Fn = CU.getFilename();
2094 } else if (Scope.isSubprogram()) {
2095 DISubprogram SP(S);
2096 Dir = SP.getDirectory();
2097 Fn = SP.getFilename();
2098 } else if (Scope.isLexicalBlock()) {
2099 DILexicalBlock DB(S);
2100 Dir = DB.getDirectory();
2101 Fn = DB.getFilename();
2102 } else
2103 assert (0 && "Unexpected scope info");
2104
2105 unsigned Src = GetOrCreateSourceID(Dir, Fn);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002106 unsigned ID = MMI->NextLabelID();
2107 Lines.push_back(SrcLineInfo(Line, Col, Src, ID));
2108
2109 if (TimePassesIsEnabled)
2110 DebugTimer->stopTimer();
2111
2112 return ID;
2113}
2114
2115/// getOrCreateSourceID - Public version of GetOrCreateSourceID. This can be
2116/// timed. Look up the source id with the given directory and source file
2117/// names. If none currently exists, create a new id and insert it in the
2118/// SourceIds map. This can update DirectoryNames and SourceFileNames maps as
2119/// well.
2120unsigned DwarfDebug::getOrCreateSourceID(const std::string &DirName,
2121 const std::string &FileName) {
2122 if (TimePassesIsEnabled)
2123 DebugTimer->startTimer();
2124
Devang Patel5ccdd102009-09-29 18:40:58 +00002125 unsigned SrcId = GetOrCreateSourceID(DirName.c_str(), FileName.c_str());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002126
2127 if (TimePassesIsEnabled)
2128 DebugTimer->stopTimer();
2129
2130 return SrcId;
2131}
2132
2133/// RecordRegionStart - Indicate the start of a region.
Devang Patele4b27562009-08-28 23:24:31 +00002134unsigned DwarfDebug::RecordRegionStart(MDNode *N) {
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002135 if (TimePassesIsEnabled)
2136 DebugTimer->startTimer();
2137
Devang Patele4b27562009-08-28 23:24:31 +00002138 DbgScope *Scope = getOrCreateScope(N);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002139 unsigned ID = MMI->NextLabelID();
2140 if (!Scope->getStartLabelID()) Scope->setStartLabelID(ID);
2141 LexicalScopeStack.push_back(Scope);
2142
2143 if (TimePassesIsEnabled)
2144 DebugTimer->stopTimer();
2145
2146 return ID;
2147}
2148
2149/// RecordRegionEnd - Indicate the end of a region.
Devang Patele4b27562009-08-28 23:24:31 +00002150unsigned DwarfDebug::RecordRegionEnd(MDNode *N) {
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002151 if (TimePassesIsEnabled)
2152 DebugTimer->startTimer();
2153
Devang Patele4b27562009-08-28 23:24:31 +00002154 DbgScope *Scope = getOrCreateScope(N);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002155 unsigned ID = MMI->NextLabelID();
2156 Scope->setEndLabelID(ID);
Devang Pateldaf9e022009-06-13 02:16:18 +00002157 // FIXME : region.end() may not be in the last basic block.
2158 // For now, do not pop last lexical scope because next basic
2159 // block may start new inlined function's body.
2160 unsigned LSSize = LexicalScopeStack.size();
2161 if (LSSize != 0 && LSSize != 1)
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002162 LexicalScopeStack.pop_back();
2163
2164 if (TimePassesIsEnabled)
2165 DebugTimer->stopTimer();
2166
2167 return ID;
2168}
2169
2170/// RecordVariable - Indicate the declaration of a local variable.
Devang Patele4b27562009-08-28 23:24:31 +00002171void DwarfDebug::RecordVariable(MDNode *N, unsigned FrameIndex) {
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002172 if (TimePassesIsEnabled)
2173 DebugTimer->startTimer();
2174
Devang Patele4b27562009-08-28 23:24:31 +00002175 DIDescriptor Desc(N);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002176 DbgScope *Scope = NULL;
2177 bool InlinedFnVar = false;
2178
Devang Patele4b27562009-08-28 23:24:31 +00002179 if (Desc.getTag() == dwarf::DW_TAG_variable)
2180 Scope = getOrCreateScope(DIGlobalVariable(N).getContext().getNode());
2181 else {
Devang Patel24f20e02009-08-22 17:12:53 +00002182 bool InlinedVar = false;
Devang Patele4b27562009-08-28 23:24:31 +00002183 MDNode *Context = DIVariable(N).getContext().getNode();
2184 DISubprogram SP(Context);
Devang Patel24f20e02009-08-22 17:12:53 +00002185 if (!SP.isNull()) {
2186 // SP is inserted into DbgAbstractScopeMap when inlined function
2187 // start was recorded by RecordInlineFnStart.
Devang Patelbdf45cb2009-10-27 20:47:17 +00002188 ValueMap<MDNode *, DbgScope *>::iterator
Devang Patele4b27562009-08-28 23:24:31 +00002189 I = DbgAbstractScopeMap.find(SP.getNode());
Devang Patel24f20e02009-08-22 17:12:53 +00002190 if (I != DbgAbstractScopeMap.end()) {
2191 InlinedVar = true;
2192 Scope = I->second;
2193 }
2194 }
Daniel Dunbarf612ff62009-09-19 20:40:05 +00002195 if (!InlinedVar)
Devang Patele4b27562009-08-28 23:24:31 +00002196 Scope = getOrCreateScope(Context);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002197 }
2198
2199 assert(Scope && "Unable to find the variable's scope");
Devang Patele4b27562009-08-28 23:24:31 +00002200 DbgVariable *DV = new DbgVariable(DIVariable(N), FrameIndex, InlinedFnVar);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002201 Scope->AddVariable(DV);
2202
2203 if (TimePassesIsEnabled)
2204 DebugTimer->stopTimer();
2205}
2206
2207//// RecordInlinedFnStart - Indicate the start of inlined subroutine.
2208unsigned DwarfDebug::RecordInlinedFnStart(DISubprogram &SP, DICompileUnit CU,
2209 unsigned Line, unsigned Col) {
2210 unsigned LabelID = MMI->NextLabelID();
2211
Chris Lattner33adcfb2009-08-22 21:43:10 +00002212 if (!MAI->doesDwarfUsesInlineInfoSection())
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002213 return LabelID;
2214
2215 if (TimePassesIsEnabled)
2216 DebugTimer->startTimer();
2217
Devang Patele4b27562009-08-28 23:24:31 +00002218 MDNode *Node = SP.getNode();
2219 DenseMap<const MDNode *, DbgScope *>::iterator
2220 II = AbstractInstanceRootMap.find(Node);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002221
2222 if (II == AbstractInstanceRootMap.end()) {
2223 // Create an abstract instance entry for this inlined function if it doesn't
2224 // already exist.
Devang Patele4b27562009-08-28 23:24:31 +00002225 DbgScope *Scope = new DbgScope(NULL, DIDescriptor(Node));
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002226
2227 // Get the compile unit context.
Devang Patele4b27562009-08-28 23:24:31 +00002228 DIE *SPDie = ModuleCU->getDieMapSlotFor(Node);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002229 if (!SPDie)
Devang Patel1dbc7712009-06-29 20:45:18 +00002230 SPDie = CreateSubprogramDIE(ModuleCU, SP, false, true);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002231
2232 // Mark as being inlined. This makes this subprogram entry an abstract
2233 // instance root.
2234 // FIXME: Our debugger doesn't care about the value of DW_AT_inline, only
2235 // that it's defined. That probably won't change in the future. However,
2236 // this could be more elegant.
2237 AddUInt(SPDie, dwarf::DW_AT_inline, 0, dwarf::DW_INL_declared_not_inlined);
2238
2239 // Keep track of the abstract scope for this function.
Devang Patele4b27562009-08-28 23:24:31 +00002240 DbgAbstractScopeMap[Node] = Scope;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002241
Devang Patele4b27562009-08-28 23:24:31 +00002242 AbstractInstanceRootMap[Node] = Scope;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002243 AbstractInstanceRootList.push_back(Scope);
2244 }
2245
2246 // Create a concrete inlined instance for this inlined function.
Devang Patele4b27562009-08-28 23:24:31 +00002247 DbgConcreteScope *ConcreteScope = new DbgConcreteScope(DIDescriptor(Node));
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002248 DIE *ScopeDie = new DIE(dwarf::DW_TAG_inlined_subroutine);
Devang Patel1dbc7712009-06-29 20:45:18 +00002249 ScopeDie->setAbstractCompileUnit(ModuleCU);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002250
Devang Patele4b27562009-08-28 23:24:31 +00002251 DIE *Origin = ModuleCU->getDieMapSlotFor(Node);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002252 AddDIEEntry(ScopeDie, dwarf::DW_AT_abstract_origin,
2253 dwarf::DW_FORM_ref4, Origin);
Devang Patel1dbc7712009-06-29 20:45:18 +00002254 AddUInt(ScopeDie, dwarf::DW_AT_call_file, 0, ModuleCU->getID());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002255 AddUInt(ScopeDie, dwarf::DW_AT_call_line, 0, Line);
2256 AddUInt(ScopeDie, dwarf::DW_AT_call_column, 0, Col);
2257
2258 ConcreteScope->setDie(ScopeDie);
2259 ConcreteScope->setStartLabelID(LabelID);
2260 MMI->RecordUsedDbgLabel(LabelID);
2261
2262 LexicalScopeStack.back()->AddConcreteInst(ConcreteScope);
2263
2264 // Keep track of the concrete scope that's inlined into this function.
Devang Patelbdf45cb2009-10-27 20:47:17 +00002265 ValueMap<MDNode *, SmallVector<DbgScope *, 8> >::iterator
Devang Patele4b27562009-08-28 23:24:31 +00002266 SI = DbgConcreteScopeMap.find(Node);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002267
2268 if (SI == DbgConcreteScopeMap.end())
Devang Patele4b27562009-08-28 23:24:31 +00002269 DbgConcreteScopeMap[Node].push_back(ConcreteScope);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002270 else
2271 SI->second.push_back(ConcreteScope);
2272
2273 // Track the start label for this inlined function.
Devang Patelbdf45cb2009-10-27 20:47:17 +00002274 ValueMap<MDNode *, SmallVector<unsigned, 4> >::iterator
Devang Patele4b27562009-08-28 23:24:31 +00002275 I = InlineInfo.find(Node);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002276
2277 if (I == InlineInfo.end())
Devang Patele4b27562009-08-28 23:24:31 +00002278 InlineInfo[Node].push_back(LabelID);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002279 else
2280 I->second.push_back(LabelID);
2281
2282 if (TimePassesIsEnabled)
2283 DebugTimer->stopTimer();
2284
2285 return LabelID;
2286}
2287
2288/// RecordInlinedFnEnd - Indicate the end of inlined subroutine.
2289unsigned DwarfDebug::RecordInlinedFnEnd(DISubprogram &SP) {
Chris Lattner33adcfb2009-08-22 21:43:10 +00002290 if (!MAI->doesDwarfUsesInlineInfoSection())
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002291 return 0;
2292
2293 if (TimePassesIsEnabled)
2294 DebugTimer->startTimer();
2295
Devang Patele4b27562009-08-28 23:24:31 +00002296 MDNode *Node = SP.getNode();
Devang Patelbdf45cb2009-10-27 20:47:17 +00002297 ValueMap<MDNode *, SmallVector<DbgScope *, 8> >::iterator
Devang Patele4b27562009-08-28 23:24:31 +00002298 I = DbgConcreteScopeMap.find(Node);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002299
2300 if (I == DbgConcreteScopeMap.end()) {
2301 // FIXME: Can this situation actually happen? And if so, should it?
2302 if (TimePassesIsEnabled)
2303 DebugTimer->stopTimer();
2304
2305 return 0;
2306 }
2307
2308 SmallVector<DbgScope *, 8> &Scopes = I->second;
Devang Patel11a407f2009-06-15 21:45:50 +00002309 if (Scopes.empty()) {
2310 // Returned ID is 0 if this is unbalanced "end of inlined
2311 // scope". This could happen if optimizer eats dbg intrinsics
2312 // or "beginning of inlined scope" is not recoginized due to
2313 // missing location info. In such cases, ignore this region.end.
2314 return 0;
2315 }
2316
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002317 DbgScope *Scope = Scopes.back(); Scopes.pop_back();
2318 unsigned ID = MMI->NextLabelID();
2319 MMI->RecordUsedDbgLabel(ID);
2320 Scope->setEndLabelID(ID);
2321
2322 if (TimePassesIsEnabled)
2323 DebugTimer->stopTimer();
2324
2325 return ID;
2326}
2327
Bill Wendling829e67b2009-05-20 23:22:40 +00002328//===----------------------------------------------------------------------===//
2329// Emit Methods
2330//===----------------------------------------------------------------------===//
2331
Bill Wendling94d04b82009-05-20 23:21:38 +00002332/// SizeAndOffsetDie - Compute the size and offset of a DIE.
2333///
2334unsigned DwarfDebug::SizeAndOffsetDie(DIE *Die, unsigned Offset, bool Last) {
2335 // Get the children.
2336 const std::vector<DIE *> &Children = Die->getChildren();
2337
2338 // If not last sibling and has children then add sibling offset attribute.
2339 if (!Last && !Children.empty()) Die->AddSiblingOffset();
2340
2341 // Record the abbreviation.
2342 AssignAbbrevNumber(Die->getAbbrev());
2343
2344 // Get the abbreviation for this DIE.
2345 unsigned AbbrevNumber = Die->getAbbrevNumber();
2346 const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2347
2348 // Set DIE offset
2349 Die->setOffset(Offset);
2350
2351 // Start the size with the size of abbreviation code.
Chris Lattneraf76e592009-08-22 20:48:53 +00002352 Offset += MCAsmInfo::getULEB128Size(AbbrevNumber);
Bill Wendling94d04b82009-05-20 23:21:38 +00002353
2354 const SmallVector<DIEValue*, 32> &Values = Die->getValues();
2355 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
2356
2357 // Size the DIE attribute values.
2358 for (unsigned i = 0, N = Values.size(); i < N; ++i)
2359 // Size attribute value.
2360 Offset += Values[i]->SizeOf(TD, AbbrevData[i].getForm());
2361
2362 // Size the DIE children if any.
2363 if (!Children.empty()) {
2364 assert(Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes &&
2365 "Children flag not set");
2366
2367 for (unsigned j = 0, M = Children.size(); j < M; ++j)
2368 Offset = SizeAndOffsetDie(Children[j], Offset, (j + 1) == M);
2369
2370 // End of children marker.
2371 Offset += sizeof(int8_t);
2372 }
2373
2374 Die->setSize(Offset - Die->getOffset());
2375 return Offset;
2376}
2377
2378/// SizeAndOffsets - Compute the size and offset of all the DIEs.
2379///
2380void DwarfDebug::SizeAndOffsets() {
2381 // Compute size of compile unit header.
2382 static unsigned Offset =
2383 sizeof(int32_t) + // Length of Compilation Unit Info
2384 sizeof(int16_t) + // DWARF version number
2385 sizeof(int32_t) + // Offset Into Abbrev. Section
2386 sizeof(int8_t); // Pointer Size (in bytes)
2387
Devang Patel1dbc7712009-06-29 20:45:18 +00002388 SizeAndOffsetDie(ModuleCU->getDie(), Offset, true);
2389 CompileUnitOffsets[ModuleCU] = 0;
Bill Wendling94d04b82009-05-20 23:21:38 +00002390}
2391
2392/// EmitInitial - Emit initial Dwarf declarations. This is necessary for cc
2393/// tools to recognize the object file contains Dwarf information.
2394void DwarfDebug::EmitInitial() {
2395 // Check to see if we already emitted intial headers.
2396 if (didInitial) return;
2397 didInitial = true;
2398
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002399 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
Daniel Dunbarf612ff62009-09-19 20:40:05 +00002400
Bill Wendling94d04b82009-05-20 23:21:38 +00002401 // Dwarf sections base addresses.
Chris Lattner33adcfb2009-08-22 21:43:10 +00002402 if (MAI->doesDwarfRequireFrameSection()) {
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002403 Asm->OutStreamer.SwitchSection(TLOF.getDwarfFrameSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002404 EmitLabel("section_debug_frame", 0);
2405 }
2406
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002407 Asm->OutStreamer.SwitchSection(TLOF.getDwarfInfoSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002408 EmitLabel("section_info", 0);
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002409 Asm->OutStreamer.SwitchSection(TLOF.getDwarfAbbrevSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002410 EmitLabel("section_abbrev", 0);
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002411 Asm->OutStreamer.SwitchSection(TLOF.getDwarfARangesSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002412 EmitLabel("section_aranges", 0);
2413
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002414 if (const MCSection *LineInfoDirective = TLOF.getDwarfMacroInfoSection()) {
2415 Asm->OutStreamer.SwitchSection(LineInfoDirective);
Bill Wendling94d04b82009-05-20 23:21:38 +00002416 EmitLabel("section_macinfo", 0);
2417 }
2418
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002419 Asm->OutStreamer.SwitchSection(TLOF.getDwarfLineSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002420 EmitLabel("section_line", 0);
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002421 Asm->OutStreamer.SwitchSection(TLOF.getDwarfLocSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002422 EmitLabel("section_loc", 0);
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002423 Asm->OutStreamer.SwitchSection(TLOF.getDwarfPubNamesSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002424 EmitLabel("section_pubnames", 0);
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002425 Asm->OutStreamer.SwitchSection(TLOF.getDwarfStrSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002426 EmitLabel("section_str", 0);
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002427 Asm->OutStreamer.SwitchSection(TLOF.getDwarfRangesSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002428 EmitLabel("section_ranges", 0);
2429
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002430 Asm->OutStreamer.SwitchSection(TLOF.getTextSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002431 EmitLabel("text_begin", 0);
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002432 Asm->OutStreamer.SwitchSection(TLOF.getDataSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002433 EmitLabel("data_begin", 0);
2434}
2435
2436/// EmitDIE - Recusively Emits a debug information entry.
2437///
2438void DwarfDebug::EmitDIE(DIE *Die) {
2439 // Get the abbreviation for this DIE.
2440 unsigned AbbrevNumber = Die->getAbbrevNumber();
2441 const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2442
2443 Asm->EOL();
2444
2445 // Emit the code (index) for the abbreviation.
2446 Asm->EmitULEB128Bytes(AbbrevNumber);
2447
2448 if (Asm->isVerbose())
2449 Asm->EOL(std::string("Abbrev [" +
2450 utostr(AbbrevNumber) +
2451 "] 0x" + utohexstr(Die->getOffset()) +
2452 ":0x" + utohexstr(Die->getSize()) + " " +
2453 dwarf::TagString(Abbrev->getTag())));
2454 else
2455 Asm->EOL();
2456
2457 SmallVector<DIEValue*, 32> &Values = Die->getValues();
2458 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
2459
2460 // Emit the DIE attribute values.
2461 for (unsigned i = 0, N = Values.size(); i < N; ++i) {
2462 unsigned Attr = AbbrevData[i].getAttribute();
2463 unsigned Form = AbbrevData[i].getForm();
2464 assert(Form && "Too many attributes for DIE (check abbreviation)");
2465
2466 switch (Attr) {
2467 case dwarf::DW_AT_sibling:
2468 Asm->EmitInt32(Die->SiblingOffset());
2469 break;
2470 case dwarf::DW_AT_abstract_origin: {
2471 DIEEntry *E = cast<DIEEntry>(Values[i]);
2472 DIE *Origin = E->getEntry();
2473 unsigned Addr =
2474 CompileUnitOffsets[Die->getAbstractCompileUnit()] +
2475 Origin->getOffset();
2476
2477 Asm->EmitInt32(Addr);
2478 break;
2479 }
2480 default:
2481 // Emit an attribute using the defined form.
2482 Values[i]->EmitValue(this, Form);
2483 break;
2484 }
2485
2486 Asm->EOL(dwarf::AttributeString(Attr));
2487 }
2488
2489 // Emit the DIE children if any.
2490 if (Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes) {
2491 const std::vector<DIE *> &Children = Die->getChildren();
2492
2493 for (unsigned j = 0, M = Children.size(); j < M; ++j)
2494 EmitDIE(Children[j]);
2495
2496 Asm->EmitInt8(0); Asm->EOL("End Of Children Mark");
2497 }
2498}
2499
2500/// EmitDebugInfo / EmitDebugInfoPerCU - Emit the debug info section.
2501///
2502void DwarfDebug::EmitDebugInfoPerCU(CompileUnit *Unit) {
2503 DIE *Die = Unit->getDie();
2504
2505 // Emit the compile units header.
2506 EmitLabel("info_begin", Unit->getID());
2507
2508 // Emit size of content not including length itself
2509 unsigned ContentSize = Die->getSize() +
2510 sizeof(int16_t) + // DWARF version number
2511 sizeof(int32_t) + // Offset Into Abbrev. Section
2512 sizeof(int8_t) + // Pointer Size (in bytes)
2513 sizeof(int32_t); // FIXME - extra pad for gdb bug.
2514
2515 Asm->EmitInt32(ContentSize); Asm->EOL("Length of Compilation Unit Info");
2516 Asm->EmitInt16(dwarf::DWARF_VERSION); Asm->EOL("DWARF version number");
2517 EmitSectionOffset("abbrev_begin", "section_abbrev", 0, 0, true, false);
2518 Asm->EOL("Offset Into Abbrev. Section");
2519 Asm->EmitInt8(TD->getPointerSize()); Asm->EOL("Address Size (in bytes)");
2520
2521 EmitDIE(Die);
2522 // FIXME - extra padding for gdb bug.
2523 Asm->EmitInt8(0); Asm->EOL("Extra Pad For GDB");
2524 Asm->EmitInt8(0); Asm->EOL("Extra Pad For GDB");
2525 Asm->EmitInt8(0); Asm->EOL("Extra Pad For GDB");
2526 Asm->EmitInt8(0); Asm->EOL("Extra Pad For GDB");
2527 EmitLabel("info_end", Unit->getID());
2528
2529 Asm->EOL();
2530}
2531
2532void DwarfDebug::EmitDebugInfo() {
2533 // Start debug info section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002534 Asm->OutStreamer.SwitchSection(
2535 Asm->getObjFileLowering().getDwarfInfoSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002536
Devang Patel1dbc7712009-06-29 20:45:18 +00002537 EmitDebugInfoPerCU(ModuleCU);
Bill Wendling94d04b82009-05-20 23:21:38 +00002538}
2539
2540/// EmitAbbreviations - Emit the abbreviation section.
2541///
2542void DwarfDebug::EmitAbbreviations() const {
2543 // Check to see if it is worth the effort.
2544 if (!Abbreviations.empty()) {
2545 // Start the debug abbrev section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002546 Asm->OutStreamer.SwitchSection(
2547 Asm->getObjFileLowering().getDwarfAbbrevSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002548
2549 EmitLabel("abbrev_begin", 0);
2550
2551 // For each abbrevation.
2552 for (unsigned i = 0, N = Abbreviations.size(); i < N; ++i) {
2553 // Get abbreviation data
2554 const DIEAbbrev *Abbrev = Abbreviations[i];
2555
2556 // Emit the abbrevations code (base 1 index.)
2557 Asm->EmitULEB128Bytes(Abbrev->getNumber());
2558 Asm->EOL("Abbreviation Code");
2559
2560 // Emit the abbreviations data.
2561 Abbrev->Emit(Asm);
2562
2563 Asm->EOL();
2564 }
2565
2566 // Mark end of abbreviations.
2567 Asm->EmitULEB128Bytes(0); Asm->EOL("EOM(3)");
2568
2569 EmitLabel("abbrev_end", 0);
2570 Asm->EOL();
2571 }
2572}
2573
2574/// EmitEndOfLineMatrix - Emit the last address of the section and the end of
2575/// the line matrix.
2576///
2577void DwarfDebug::EmitEndOfLineMatrix(unsigned SectionEnd) {
2578 // Define last address of section.
2579 Asm->EmitInt8(0); Asm->EOL("Extended Op");
2580 Asm->EmitInt8(TD->getPointerSize() + 1); Asm->EOL("Op size");
2581 Asm->EmitInt8(dwarf::DW_LNE_set_address); Asm->EOL("DW_LNE_set_address");
2582 EmitReference("section_end", SectionEnd); Asm->EOL("Section end label");
2583
2584 // Mark end of matrix.
2585 Asm->EmitInt8(0); Asm->EOL("DW_LNE_end_sequence");
2586 Asm->EmitULEB128Bytes(1); Asm->EOL();
2587 Asm->EmitInt8(1); Asm->EOL();
2588}
2589
2590/// EmitDebugLines - Emit source line information.
2591///
2592void DwarfDebug::EmitDebugLines() {
2593 // If the target is using .loc/.file, the assembler will be emitting the
2594 // .debug_line table automatically.
Chris Lattner33adcfb2009-08-22 21:43:10 +00002595 if (MAI->hasDotLocAndDotFile())
Bill Wendling94d04b82009-05-20 23:21:38 +00002596 return;
2597
2598 // Minimum line delta, thus ranging from -10..(255-10).
2599 const int MinLineDelta = -(dwarf::DW_LNS_fixed_advance_pc + 1);
2600 // Maximum line delta, thus ranging from -10..(255-10).
2601 const int MaxLineDelta = 255 + MinLineDelta;
2602
2603 // Start the dwarf line section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002604 Asm->OutStreamer.SwitchSection(
2605 Asm->getObjFileLowering().getDwarfLineSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002606
2607 // Construct the section header.
2608 EmitDifference("line_end", 0, "line_begin", 0, true);
2609 Asm->EOL("Length of Source Line Info");
2610 EmitLabel("line_begin", 0);
2611
2612 Asm->EmitInt16(dwarf::DWARF_VERSION); Asm->EOL("DWARF version number");
2613
2614 EmitDifference("line_prolog_end", 0, "line_prolog_begin", 0, true);
2615 Asm->EOL("Prolog Length");
2616 EmitLabel("line_prolog_begin", 0);
2617
2618 Asm->EmitInt8(1); Asm->EOL("Minimum Instruction Length");
2619
2620 Asm->EmitInt8(1); Asm->EOL("Default is_stmt_start flag");
2621
2622 Asm->EmitInt8(MinLineDelta); Asm->EOL("Line Base Value (Special Opcodes)");
2623
2624 Asm->EmitInt8(MaxLineDelta); Asm->EOL("Line Range Value (Special Opcodes)");
2625
2626 Asm->EmitInt8(-MinLineDelta); Asm->EOL("Special Opcode Base");
2627
2628 // Line number standard opcode encodings argument count
2629 Asm->EmitInt8(0); Asm->EOL("DW_LNS_copy arg count");
2630 Asm->EmitInt8(1); Asm->EOL("DW_LNS_advance_pc arg count");
2631 Asm->EmitInt8(1); Asm->EOL("DW_LNS_advance_line arg count");
2632 Asm->EmitInt8(1); Asm->EOL("DW_LNS_set_file arg count");
2633 Asm->EmitInt8(1); Asm->EOL("DW_LNS_set_column arg count");
2634 Asm->EmitInt8(0); Asm->EOL("DW_LNS_negate_stmt arg count");
2635 Asm->EmitInt8(0); Asm->EOL("DW_LNS_set_basic_block arg count");
2636 Asm->EmitInt8(0); Asm->EOL("DW_LNS_const_add_pc arg count");
2637 Asm->EmitInt8(1); Asm->EOL("DW_LNS_fixed_advance_pc arg count");
2638
2639 // Emit directories.
2640 for (unsigned DI = 1, DE = getNumSourceDirectories()+1; DI != DE; ++DI) {
2641 Asm->EmitString(getSourceDirectoryName(DI));
2642 Asm->EOL("Directory");
2643 }
2644
2645 Asm->EmitInt8(0); Asm->EOL("End of directories");
2646
2647 // Emit files.
2648 for (unsigned SI = 1, SE = getNumSourceIds()+1; SI != SE; ++SI) {
2649 // Remember source id starts at 1.
2650 std::pair<unsigned, unsigned> Id = getSourceDirectoryAndFileIds(SI);
2651 Asm->EmitString(getSourceFileName(Id.second));
2652 Asm->EOL("Source");
2653 Asm->EmitULEB128Bytes(Id.first);
2654 Asm->EOL("Directory #");
2655 Asm->EmitULEB128Bytes(0);
2656 Asm->EOL("Mod date");
2657 Asm->EmitULEB128Bytes(0);
2658 Asm->EOL("File size");
2659 }
2660
2661 Asm->EmitInt8(0); Asm->EOL("End of files");
2662
2663 EmitLabel("line_prolog_end", 0);
2664
2665 // A sequence for each text section.
2666 unsigned SecSrcLinesSize = SectionSourceLines.size();
2667
2668 for (unsigned j = 0; j < SecSrcLinesSize; ++j) {
2669 // Isolate current sections line info.
2670 const std::vector<SrcLineInfo> &LineInfos = SectionSourceLines[j];
2671
Chris Lattner93b6db32009-08-08 23:39:42 +00002672 /*if (Asm->isVerbose()) {
Chris Lattnera87dea42009-07-31 18:48:30 +00002673 const MCSection *S = SectionMap[j + 1];
Chris Lattner33adcfb2009-08-22 21:43:10 +00002674 O << '\t' << MAI->getCommentString() << " Section"
Bill Wendling94d04b82009-05-20 23:21:38 +00002675 << S->getName() << '\n';
Chris Lattner93b6db32009-08-08 23:39:42 +00002676 }*/
2677 Asm->EOL();
Bill Wendling94d04b82009-05-20 23:21:38 +00002678
2679 // Dwarf assumes we start with first line of first source file.
2680 unsigned Source = 1;
2681 unsigned Line = 1;
2682
2683 // Construct rows of the address, source, line, column matrix.
2684 for (unsigned i = 0, N = LineInfos.size(); i < N; ++i) {
2685 const SrcLineInfo &LineInfo = LineInfos[i];
2686 unsigned LabelID = MMI->MappedLabel(LineInfo.getLabelID());
2687 if (!LabelID) continue;
2688
Caroline Ticec6f9d622009-09-11 18:25:54 +00002689 if (LineInfo.getLine() == 0) continue;
2690
Bill Wendling94d04b82009-05-20 23:21:38 +00002691 if (!Asm->isVerbose())
2692 Asm->EOL();
2693 else {
2694 std::pair<unsigned, unsigned> SourceID =
2695 getSourceDirectoryAndFileIds(LineInfo.getSourceID());
Chris Lattner33adcfb2009-08-22 21:43:10 +00002696 O << '\t' << MAI->getCommentString() << ' '
Bill Wendling94d04b82009-05-20 23:21:38 +00002697 << getSourceDirectoryName(SourceID.first) << ' '
2698 << getSourceFileName(SourceID.second)
2699 <<" :" << utostr_32(LineInfo.getLine()) << '\n';
2700 }
2701
2702 // Define the line address.
2703 Asm->EmitInt8(0); Asm->EOL("Extended Op");
2704 Asm->EmitInt8(TD->getPointerSize() + 1); Asm->EOL("Op size");
2705 Asm->EmitInt8(dwarf::DW_LNE_set_address); Asm->EOL("DW_LNE_set_address");
2706 EmitReference("label", LabelID); Asm->EOL("Location label");
2707
2708 // If change of source, then switch to the new source.
2709 if (Source != LineInfo.getSourceID()) {
2710 Source = LineInfo.getSourceID();
2711 Asm->EmitInt8(dwarf::DW_LNS_set_file); Asm->EOL("DW_LNS_set_file");
2712 Asm->EmitULEB128Bytes(Source); Asm->EOL("New Source");
2713 }
2714
2715 // If change of line.
2716 if (Line != LineInfo.getLine()) {
2717 // Determine offset.
2718 int Offset = LineInfo.getLine() - Line;
2719 int Delta = Offset - MinLineDelta;
2720
2721 // Update line.
2722 Line = LineInfo.getLine();
2723
2724 // If delta is small enough and in range...
2725 if (Delta >= 0 && Delta < (MaxLineDelta - 1)) {
2726 // ... then use fast opcode.
2727 Asm->EmitInt8(Delta - MinLineDelta); Asm->EOL("Line Delta");
2728 } else {
2729 // ... otherwise use long hand.
2730 Asm->EmitInt8(dwarf::DW_LNS_advance_line);
2731 Asm->EOL("DW_LNS_advance_line");
2732 Asm->EmitSLEB128Bytes(Offset); Asm->EOL("Line Offset");
2733 Asm->EmitInt8(dwarf::DW_LNS_copy); Asm->EOL("DW_LNS_copy");
2734 }
2735 } else {
2736 // Copy the previous row (different address or source)
2737 Asm->EmitInt8(dwarf::DW_LNS_copy); Asm->EOL("DW_LNS_copy");
2738 }
2739 }
2740
2741 EmitEndOfLineMatrix(j + 1);
2742 }
2743
2744 if (SecSrcLinesSize == 0)
2745 // Because we're emitting a debug_line section, we still need a line
2746 // table. The linker and friends expect it to exist. If there's nothing to
2747 // put into it, emit an empty table.
2748 EmitEndOfLineMatrix(1);
2749
2750 EmitLabel("line_end", 0);
2751 Asm->EOL();
2752}
2753
2754/// EmitCommonDebugFrame - Emit common frame info into a debug frame section.
2755///
2756void DwarfDebug::EmitCommonDebugFrame() {
Chris Lattner33adcfb2009-08-22 21:43:10 +00002757 if (!MAI->doesDwarfRequireFrameSection())
Bill Wendling94d04b82009-05-20 23:21:38 +00002758 return;
2759
2760 int stackGrowth =
2761 Asm->TM.getFrameInfo()->getStackGrowthDirection() ==
2762 TargetFrameInfo::StackGrowsUp ?
2763 TD->getPointerSize() : -TD->getPointerSize();
2764
2765 // Start the dwarf frame section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002766 Asm->OutStreamer.SwitchSection(
2767 Asm->getObjFileLowering().getDwarfFrameSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002768
2769 EmitLabel("debug_frame_common", 0);
2770 EmitDifference("debug_frame_common_end", 0,
2771 "debug_frame_common_begin", 0, true);
2772 Asm->EOL("Length of Common Information Entry");
2773
2774 EmitLabel("debug_frame_common_begin", 0);
2775 Asm->EmitInt32((int)dwarf::DW_CIE_ID);
2776 Asm->EOL("CIE Identifier Tag");
2777 Asm->EmitInt8(dwarf::DW_CIE_VERSION);
2778 Asm->EOL("CIE Version");
2779 Asm->EmitString("");
2780 Asm->EOL("CIE Augmentation");
2781 Asm->EmitULEB128Bytes(1);
2782 Asm->EOL("CIE Code Alignment Factor");
2783 Asm->EmitSLEB128Bytes(stackGrowth);
2784 Asm->EOL("CIE Data Alignment Factor");
2785 Asm->EmitInt8(RI->getDwarfRegNum(RI->getRARegister(), false));
2786 Asm->EOL("CIE RA Column");
2787
2788 std::vector<MachineMove> Moves;
2789 RI->getInitialFrameState(Moves);
2790
2791 EmitFrameMoves(NULL, 0, Moves, false);
2792
2793 Asm->EmitAlignment(2, 0, 0, false);
2794 EmitLabel("debug_frame_common_end", 0);
2795
2796 Asm->EOL();
2797}
2798
2799/// EmitFunctionDebugFrame - Emit per function frame info into a debug frame
2800/// section.
2801void
2802DwarfDebug::EmitFunctionDebugFrame(const FunctionDebugFrameInfo&DebugFrameInfo){
Chris Lattner33adcfb2009-08-22 21:43:10 +00002803 if (!MAI->doesDwarfRequireFrameSection())
Bill Wendling94d04b82009-05-20 23:21:38 +00002804 return;
2805
2806 // Start the dwarf frame section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002807 Asm->OutStreamer.SwitchSection(
2808 Asm->getObjFileLowering().getDwarfFrameSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002809
2810 EmitDifference("debug_frame_end", DebugFrameInfo.Number,
2811 "debug_frame_begin", DebugFrameInfo.Number, true);
2812 Asm->EOL("Length of Frame Information Entry");
2813
2814 EmitLabel("debug_frame_begin", DebugFrameInfo.Number);
2815
2816 EmitSectionOffset("debug_frame_common", "section_debug_frame",
2817 0, 0, true, false);
2818 Asm->EOL("FDE CIE offset");
2819
2820 EmitReference("func_begin", DebugFrameInfo.Number);
2821 Asm->EOL("FDE initial location");
2822 EmitDifference("func_end", DebugFrameInfo.Number,
2823 "func_begin", DebugFrameInfo.Number);
2824 Asm->EOL("FDE address range");
2825
2826 EmitFrameMoves("func_begin", DebugFrameInfo.Number, DebugFrameInfo.Moves,
2827 false);
2828
2829 Asm->EmitAlignment(2, 0, 0, false);
2830 EmitLabel("debug_frame_end", DebugFrameInfo.Number);
2831
2832 Asm->EOL();
2833}
2834
2835void DwarfDebug::EmitDebugPubNamesPerCU(CompileUnit *Unit) {
2836 EmitDifference("pubnames_end", Unit->getID(),
2837 "pubnames_begin", Unit->getID(), true);
2838 Asm->EOL("Length of Public Names Info");
2839
2840 EmitLabel("pubnames_begin", Unit->getID());
2841
2842 Asm->EmitInt16(dwarf::DWARF_VERSION); Asm->EOL("DWARF Version");
2843
2844 EmitSectionOffset("info_begin", "section_info",
2845 Unit->getID(), 0, true, false);
2846 Asm->EOL("Offset of Compilation Unit Info");
2847
2848 EmitDifference("info_end", Unit->getID(), "info_begin", Unit->getID(),
2849 true);
2850 Asm->EOL("Compilation Unit Length");
2851
2852 StringMap<DIE*> &Globals = Unit->getGlobals();
2853 for (StringMap<DIE*>::const_iterator
2854 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2855 const char *Name = GI->getKeyData();
2856 DIE * Entity = GI->second;
2857
2858 Asm->EmitInt32(Entity->getOffset()); Asm->EOL("DIE offset");
2859 Asm->EmitString(Name, strlen(Name)); Asm->EOL("External Name");
2860 }
2861
2862 Asm->EmitInt32(0); Asm->EOL("End Mark");
2863 EmitLabel("pubnames_end", Unit->getID());
2864
2865 Asm->EOL();
2866}
2867
2868/// EmitDebugPubNames - Emit visible names into a debug pubnames section.
2869///
2870void DwarfDebug::EmitDebugPubNames() {
2871 // Start the dwarf pubnames section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002872 Asm->OutStreamer.SwitchSection(
2873 Asm->getObjFileLowering().getDwarfPubNamesSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002874
Devang Patel1dbc7712009-06-29 20:45:18 +00002875 EmitDebugPubNamesPerCU(ModuleCU);
Bill Wendling94d04b82009-05-20 23:21:38 +00002876}
2877
2878/// EmitDebugStr - Emit visible names into a debug str section.
2879///
2880void DwarfDebug::EmitDebugStr() {
2881 // Check to see if it is worth the effort.
2882 if (!StringPool.empty()) {
2883 // Start the dwarf str section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002884 Asm->OutStreamer.SwitchSection(
2885 Asm->getObjFileLowering().getDwarfStrSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002886
2887 // For each of strings in the string pool.
2888 for (unsigned StringID = 1, N = StringPool.size();
2889 StringID <= N; ++StringID) {
2890 // Emit a label for reference from debug information entries.
2891 EmitLabel("string", StringID);
2892
2893 // Emit the string itself.
2894 const std::string &String = StringPool[StringID];
2895 Asm->EmitString(String); Asm->EOL();
2896 }
2897
2898 Asm->EOL();
2899 }
2900}
2901
2902/// EmitDebugLoc - Emit visible names into a debug loc section.
2903///
2904void DwarfDebug::EmitDebugLoc() {
2905 // Start the dwarf loc section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002906 Asm->OutStreamer.SwitchSection(
2907 Asm->getObjFileLowering().getDwarfLocSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002908 Asm->EOL();
2909}
2910
2911/// EmitDebugARanges - Emit visible names into a debug aranges section.
2912///
2913void DwarfDebug::EmitDebugARanges() {
2914 // Start the dwarf aranges section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002915 Asm->OutStreamer.SwitchSection(
2916 Asm->getObjFileLowering().getDwarfARangesSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002917
2918 // FIXME - Mock up
2919#if 0
2920 CompileUnit *Unit = GetBaseCompileUnit();
2921
2922 // Don't include size of length
2923 Asm->EmitInt32(0x1c); Asm->EOL("Length of Address Ranges Info");
2924
2925 Asm->EmitInt16(dwarf::DWARF_VERSION); Asm->EOL("Dwarf Version");
2926
2927 EmitReference("info_begin", Unit->getID());
2928 Asm->EOL("Offset of Compilation Unit Info");
2929
2930 Asm->EmitInt8(TD->getPointerSize()); Asm->EOL("Size of Address");
2931
2932 Asm->EmitInt8(0); Asm->EOL("Size of Segment Descriptor");
2933
2934 Asm->EmitInt16(0); Asm->EOL("Pad (1)");
2935 Asm->EmitInt16(0); Asm->EOL("Pad (2)");
2936
2937 // Range 1
2938 EmitReference("text_begin", 0); Asm->EOL("Address");
2939 EmitDifference("text_end", 0, "text_begin", 0, true); Asm->EOL("Length");
2940
2941 Asm->EmitInt32(0); Asm->EOL("EOM (1)");
2942 Asm->EmitInt32(0); Asm->EOL("EOM (2)");
2943#endif
2944
2945 Asm->EOL();
2946}
2947
2948/// EmitDebugRanges - Emit visible names into a debug ranges section.
2949///
2950void DwarfDebug::EmitDebugRanges() {
2951 // Start the dwarf ranges section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002952 Asm->OutStreamer.SwitchSection(
2953 Asm->getObjFileLowering().getDwarfRangesSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002954 Asm->EOL();
2955}
2956
2957/// EmitDebugMacInfo - Emit visible names into a debug macinfo section.
2958///
2959void DwarfDebug::EmitDebugMacInfo() {
Daniel Dunbarf612ff62009-09-19 20:40:05 +00002960 if (const MCSection *LineInfo =
Chris Lattner18a4c162009-08-02 07:24:22 +00002961 Asm->getObjFileLowering().getDwarfMacroInfoSection()) {
Bill Wendling94d04b82009-05-20 23:21:38 +00002962 // Start the dwarf macinfo section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002963 Asm->OutStreamer.SwitchSection(LineInfo);
Bill Wendling94d04b82009-05-20 23:21:38 +00002964 Asm->EOL();
2965 }
2966}
2967
2968/// EmitDebugInlineInfo - Emit inline info using following format.
2969/// Section Header:
2970/// 1. length of section
2971/// 2. Dwarf version number
2972/// 3. address size.
2973///
2974/// Entries (one "entry" for each function that was inlined):
2975///
2976/// 1. offset into __debug_str section for MIPS linkage name, if exists;
2977/// otherwise offset into __debug_str for regular function name.
2978/// 2. offset into __debug_str section for regular function name.
2979/// 3. an unsigned LEB128 number indicating the number of distinct inlining
2980/// instances for the function.
2981///
2982/// The rest of the entry consists of a {die_offset, low_pc} pair for each
2983/// inlined instance; the die_offset points to the inlined_subroutine die in the
2984/// __debug_info section, and the low_pc is the starting address for the
2985/// inlining instance.
2986void DwarfDebug::EmitDebugInlineInfo() {
Chris Lattner33adcfb2009-08-22 21:43:10 +00002987 if (!MAI->doesDwarfUsesInlineInfoSection())
Bill Wendling94d04b82009-05-20 23:21:38 +00002988 return;
2989
Devang Patel1dbc7712009-06-29 20:45:18 +00002990 if (!ModuleCU)
Bill Wendling94d04b82009-05-20 23:21:38 +00002991 return;
2992
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002993 Asm->OutStreamer.SwitchSection(
2994 Asm->getObjFileLowering().getDwarfDebugInlineSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002995 Asm->EOL();
2996 EmitDifference("debug_inlined_end", 1,
2997 "debug_inlined_begin", 1, true);
2998 Asm->EOL("Length of Debug Inlined Information Entry");
2999
3000 EmitLabel("debug_inlined_begin", 1);
3001
3002 Asm->EmitInt16(dwarf::DWARF_VERSION); Asm->EOL("Dwarf Version");
3003 Asm->EmitInt8(TD->getPointerSize()); Asm->EOL("Address Size (in bytes)");
3004
Devang Patelbdf45cb2009-10-27 20:47:17 +00003005 for (ValueMap<MDNode *, SmallVector<unsigned, 4> >::iterator
Bill Wendling94d04b82009-05-20 23:21:38 +00003006 I = InlineInfo.begin(), E = InlineInfo.end(); I != E; ++I) {
Devang Patele4b27562009-08-28 23:24:31 +00003007 MDNode *Node = I->first;
Bill Wendling94d04b82009-05-20 23:21:38 +00003008 SmallVector<unsigned, 4> &Labels = I->second;
Devang Patele4b27562009-08-28 23:24:31 +00003009 DISubprogram SP(Node);
Devang Patel5ccdd102009-09-29 18:40:58 +00003010 const char *LName = SP.getLinkageName();
3011 const char *Name = SP.getName();
Bill Wendling94d04b82009-05-20 23:21:38 +00003012
Devang Patel5ccdd102009-09-29 18:40:58 +00003013 if (!LName)
Devang Patel53cb17d2009-07-16 01:01:22 +00003014 Asm->EmitString(Name);
3015 else {
Chris Lattner6c2f9e12009-08-19 05:49:37 +00003016 // Skip special LLVM prefix that is used to inform the asm printer to not
3017 // emit usual symbol prefix before the symbol name. This happens for
3018 // Objective-C symbol names and symbol whose name is replaced using GCC's
3019 // __asm__ attribute.
Devang Patel53cb17d2009-07-16 01:01:22 +00003020 if (LName[0] == 1)
3021 LName = &LName[1];
3022 Asm->EmitString(LName);
3023 }
Bill Wendling94d04b82009-05-20 23:21:38 +00003024 Asm->EOL("MIPS linkage name");
3025
3026 Asm->EmitString(Name); Asm->EOL("Function name");
3027
3028 Asm->EmitULEB128Bytes(Labels.size()); Asm->EOL("Inline count");
3029
3030 for (SmallVector<unsigned, 4>::iterator LI = Labels.begin(),
3031 LE = Labels.end(); LI != LE; ++LI) {
Devang Patele4b27562009-08-28 23:24:31 +00003032 DIE *SP = ModuleCU->getDieMapSlotFor(Node);
Bill Wendling94d04b82009-05-20 23:21:38 +00003033 Asm->EmitInt32(SP->getOffset()); Asm->EOL("DIE offset");
3034
3035 if (TD->getPointerSize() == sizeof(int32_t))
Chris Lattner33adcfb2009-08-22 21:43:10 +00003036 O << MAI->getData32bitsDirective();
Bill Wendling94d04b82009-05-20 23:21:38 +00003037 else
Chris Lattner33adcfb2009-08-22 21:43:10 +00003038 O << MAI->getData64bitsDirective();
Bill Wendling94d04b82009-05-20 23:21:38 +00003039
3040 PrintLabelName("label", *LI); Asm->EOL("low_pc");
3041 }
3042 }
3043
3044 EmitLabel("debug_inlined_end", 1);
3045 Asm->EOL();
3046}