blob: 23752c4ba8420e5e4ec5395a0d0cfd2003764b4a [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
1140 uint64_t Size = DT.getSizeInBits();
1141 uint64_t FieldSize = DT.getOriginalTypeSize();
1142
1143 if (Size != FieldSize) {
1144 // Handle bitfield.
1145 AddUInt(MemberDie, dwarf::DW_AT_byte_size, 0, DT.getOriginalTypeSize()>>3);
1146 AddUInt(MemberDie, dwarf::DW_AT_bit_size, 0, DT.getSizeInBits());
1147
1148 uint64_t Offset = DT.getOffsetInBits();
1149 uint64_t FieldOffset = Offset;
1150 uint64_t AlignMask = ~(DT.getAlignInBits() - 1);
1151 uint64_t HiMark = (Offset + FieldSize) & AlignMask;
1152 FieldOffset = (HiMark - FieldSize);
1153 Offset -= FieldOffset;
1154
1155 // Maybe we need to work from the other end.
1156 if (TD->isLittleEndian()) Offset = FieldSize - (Offset + Size);
1157 AddUInt(MemberDie, dwarf::DW_AT_bit_offset, 0, Offset);
1158 }
1159
1160 DIEBlock *Block = new DIEBlock();
1161 AddUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
1162 AddUInt(Block, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits() >> 3);
1163 AddBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, Block);
1164
1165 if (DT.isProtected())
1166 AddUInt(MemberDie, dwarf::DW_AT_accessibility, 0,
1167 dwarf::DW_ACCESS_protected);
1168 else if (DT.isPrivate())
1169 AddUInt(MemberDie, dwarf::DW_AT_accessibility, 0,
1170 dwarf::DW_ACCESS_private);
1171
1172 return MemberDie;
1173}
1174
1175/// CreateSubprogramDIE - Create new DIE using SP.
1176DIE *DwarfDebug::CreateSubprogramDIE(CompileUnit *DW_Unit,
1177 const DISubprogram &SP,
Bill Wendling6679ee42009-05-18 22:02:36 +00001178 bool IsConstructor,
1179 bool IsInlined) {
Bill Wendling0310d762009-05-15 09:23:25 +00001180 DIE *SPDie = new DIE(dwarf::DW_TAG_subprogram);
1181
Devang Patel5ccdd102009-09-29 18:40:58 +00001182 const char * Name = SP.getName();
Bill Wendling0310d762009-05-15 09:23:25 +00001183 AddString(SPDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1184
Devang Patel5ccdd102009-09-29 18:40:58 +00001185 const char *LinkageName = SP.getLinkageName();
1186 if (LinkageName) {
Devang Patel53cb17d2009-07-16 01:01:22 +00001187 // Skip special LLVM prefix that is used to inform the asm printer to not emit
1188 // usual symbol prefix before the symbol name. This happens for Objective-C
1189 // symbol names and symbol whose name is replaced using GCC's __asm__ attribute.
1190 if (LinkageName[0] == 1)
1191 LinkageName = &LinkageName[1];
Bill Wendling0310d762009-05-15 09:23:25 +00001192 AddString(SPDie, dwarf::DW_AT_MIPS_linkage_name, dwarf::DW_FORM_string,
Devang Patel1a8d2d22009-07-14 00:55:28 +00001193 LinkageName);
Devang Patel53cb17d2009-07-16 01:01:22 +00001194 }
Bill Wendling0310d762009-05-15 09:23:25 +00001195 AddSourceLine(SPDie, &SP);
1196
1197 DICompositeType SPTy = SP.getType();
1198 DIArray Args = SPTy.getTypeArray();
1199
1200 // Add prototyped tag, if C or ObjC.
1201 unsigned Lang = SP.getCompileUnit().getLanguage();
1202 if (Lang == dwarf::DW_LANG_C99 || Lang == dwarf::DW_LANG_C89 ||
1203 Lang == dwarf::DW_LANG_ObjC)
1204 AddUInt(SPDie, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
1205
1206 // Add Return Type.
1207 unsigned SPTag = SPTy.getTag();
1208 if (!IsConstructor) {
1209 if (Args.isNull() || SPTag != dwarf::DW_TAG_subroutine_type)
1210 AddType(DW_Unit, SPDie, SPTy);
1211 else
Devang Patele4b27562009-08-28 23:24:31 +00001212 AddType(DW_Unit, SPDie, DIType(Args.getElement(0).getNode()));
Bill Wendling0310d762009-05-15 09:23:25 +00001213 }
1214
1215 if (!SP.isDefinition()) {
1216 AddUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1217
1218 // Add arguments. Do not add arguments for subprogram definition. They will
1219 // be handled through RecordVariable.
1220 if (SPTag == dwarf::DW_TAG_subroutine_type)
1221 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
1222 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
Devang Patele4b27562009-08-28 23:24:31 +00001223 AddType(DW_Unit, Arg, DIType(Args.getElement(i).getNode()));
Bill Wendling0310d762009-05-15 09:23:25 +00001224 AddUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1); // ??
1225 SPDie->AddChild(Arg);
1226 }
1227 }
1228
Bill Wendling6679ee42009-05-18 22:02:36 +00001229 if (!SP.isLocalToUnit() && !IsInlined)
Bill Wendling0310d762009-05-15 09:23:25 +00001230 AddUInt(SPDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
1231
1232 // DW_TAG_inlined_subroutine may refer to this DIE.
Devang Patele4b27562009-08-28 23:24:31 +00001233 DIE *&Slot = DW_Unit->getDieMapSlotFor(SP.getNode());
Bill Wendling0310d762009-05-15 09:23:25 +00001234 Slot = SPDie;
1235 return SPDie;
1236}
1237
1238/// FindCompileUnit - Get the compile unit for the given descriptor.
1239///
1240CompileUnit &DwarfDebug::FindCompileUnit(DICompileUnit Unit) const {
1241 DenseMap<Value *, CompileUnit *>::const_iterator I =
Devang Patele4b27562009-08-28 23:24:31 +00001242 CompileUnitMap.find(Unit.getNode());
Bill Wendling0310d762009-05-15 09:23:25 +00001243 assert(I != CompileUnitMap.end() && "Missing compile unit.");
1244 return *I->second;
1245}
1246
Bill Wendling995f80a2009-05-20 23:24:48 +00001247/// CreateDbgScopeVariable - Create a new scope variable.
Bill Wendling0310d762009-05-15 09:23:25 +00001248///
Bill Wendling995f80a2009-05-20 23:24:48 +00001249DIE *DwarfDebug::CreateDbgScopeVariable(DbgVariable *DV, CompileUnit *Unit) {
Bill Wendling0310d762009-05-15 09:23:25 +00001250 // Get the descriptor.
1251 const DIVariable &VD = DV->getVariable();
Devang Patel1b845972009-11-03 18:30:27 +00001252 const char *Name = VD.getName();
1253 if (!Name)
1254 return NULL;
Bill Wendling0310d762009-05-15 09:23:25 +00001255
1256 // Translate tag to proper Dwarf tag. The result variable is dropped for
1257 // now.
1258 unsigned Tag;
1259 switch (VD.getTag()) {
1260 case dwarf::DW_TAG_return_variable:
1261 return NULL;
1262 case dwarf::DW_TAG_arg_variable:
1263 Tag = dwarf::DW_TAG_formal_parameter;
1264 break;
1265 case dwarf::DW_TAG_auto_variable: // fall thru
1266 default:
1267 Tag = dwarf::DW_TAG_variable;
1268 break;
1269 }
1270
1271 // Define variable debug information entry.
1272 DIE *VariableDie = new DIE(Tag);
Bill Wendling0310d762009-05-15 09:23:25 +00001273 AddString(VariableDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1274
1275 // Add source line info if available.
1276 AddSourceLine(VariableDie, &VD);
1277
1278 // Add variable type.
Mike Stump3e4c9bd2009-09-30 00:08:22 +00001279 // FIXME: isBlockByrefVariable should be reformulated in terms of complex addresses instead.
Caroline Ticedc8f6042009-08-31 21:19:37 +00001280 if (VD.isBlockByrefVariable())
1281 AddType(Unit, VariableDie, GetBlockByrefType(VD.getType(), Name));
1282 else
1283 AddType(Unit, VariableDie, VD.getType());
Bill Wendling0310d762009-05-15 09:23:25 +00001284
1285 // Add variable address.
Bill Wendling1180c782009-05-18 23:08:55 +00001286 if (!DV->isInlinedFnVar()) {
1287 // Variables for abstract instances of inlined functions don't get a
1288 // location.
1289 MachineLocation Location;
1290 Location.set(RI->getFrameRegister(*MF),
1291 RI->getFrameIndexOffset(*MF, DV->getFrameIndex()));
Caroline Ticedc8f6042009-08-31 21:19:37 +00001292
Mike Stump3e4c9bd2009-09-30 00:08:22 +00001293
1294 if (VD.hasComplexAddress())
1295 AddComplexAddress(DV, VariableDie, dwarf::DW_AT_location, Location);
1296 else if (VD.isBlockByrefVariable())
Mike Stumpee4b8a72009-09-24 23:11:08 +00001297 AddBlockByrefAddress(DV, VariableDie, dwarf::DW_AT_location, Location);
Caroline Ticedc8f6042009-08-31 21:19:37 +00001298 else
1299 AddAddress(VariableDie, dwarf::DW_AT_location, Location);
Bill Wendling1180c782009-05-18 23:08:55 +00001300 }
Bill Wendling0310d762009-05-15 09:23:25 +00001301
1302 return VariableDie;
1303}
1304
1305/// getOrCreateScope - Returns the scope associated with the given descriptor.
1306///
Devang Patelc90aefe2009-10-14 21:08:09 +00001307DbgScope *DwarfDebug::getDbgScope(MDNode *N, const MachineInstr *MI,
1308 MDNode *InlinedAt) {
Devang Patelbdf45cb2009-10-27 20:47:17 +00001309 ValueMap<MDNode *, DbgScope *>::iterator VI = DbgScopeMap.find(N);
1310 if (VI != DbgScopeMap.end())
1311 return VI->second;
Devang Patelaf9e8472009-10-01 20:31:14 +00001312
1313 DbgScope *Parent = NULL;
1314
Devang Patelc90aefe2009-10-14 21:08:09 +00001315 if (InlinedAt) {
1316 DILocation IL(InlinedAt);
1317 assert (!IL.isNull() && "Invalid InlindAt location!");
Devang Patelbdf45cb2009-10-27 20:47:17 +00001318 ValueMap<MDNode *, DbgScope *>::iterator DSI =
Devang Patelc90aefe2009-10-14 21:08:09 +00001319 DbgScopeMap.find(IL.getScope().getNode());
1320 assert (DSI != DbgScopeMap.end() && "Unable to find InlineAt scope!");
1321 Parent = DSI->second;
1322 } else {
1323 DIDescriptor Scope(N);
1324 if (Scope.isCompileUnit()) {
1325 return NULL;
1326 } else if (Scope.isSubprogram()) {
1327 DISubprogram SP(N);
1328 DIDescriptor ParentDesc = SP.getContext();
1329 if (!ParentDesc.isNull() && !ParentDesc.isCompileUnit())
1330 Parent = getDbgScope(ParentDesc.getNode(), MI, InlinedAt);
1331 } else if (Scope.isLexicalBlock()) {
1332 DILexicalBlock DB(N);
1333 DIDescriptor ParentDesc = DB.getContext();
1334 if (!ParentDesc.isNull())
1335 Parent = getDbgScope(ParentDesc.getNode(), MI, InlinedAt);
1336 } else
1337 assert (0 && "Unexpected scope info");
1338 }
Devang Patelaf9e8472009-10-01 20:31:14 +00001339
Devang Patelbdf45cb2009-10-27 20:47:17 +00001340 DbgScope *NScope = new DbgScope(Parent, DIDescriptor(N), InlinedAt);
1341 NScope->setFirstInsn(MI);
Devang Patelaf9e8472009-10-01 20:31:14 +00001342
1343 if (Parent)
Devang Patelbdf45cb2009-10-27 20:47:17 +00001344 Parent->AddScope(NScope);
Devang Patelaf9e8472009-10-01 20:31:14 +00001345 else
1346 // First function is top level function.
Devang Patelaf9e8472009-10-01 20:31:14 +00001347 if (!FunctionDbgScope)
Devang Patelbdf45cb2009-10-27 20:47:17 +00001348 FunctionDbgScope = NScope;
Devang Patelaf9e8472009-10-01 20:31:14 +00001349
Devang Patelbdf45cb2009-10-27 20:47:17 +00001350 DbgScopeMap.insert(std::make_pair(N, NScope));
1351 return NScope;
Devang Patelaf9e8472009-10-01 20:31:14 +00001352}
1353
1354
1355/// getOrCreateScope - Returns the scope associated with the given descriptor.
1356/// FIXME - Remove this method.
Devang Patele4b27562009-08-28 23:24:31 +00001357DbgScope *DwarfDebug::getOrCreateScope(MDNode *N) {
1358 DbgScope *&Slot = DbgScopeMap[N];
Bill Wendling0310d762009-05-15 09:23:25 +00001359 if (Slot) return Slot;
1360
1361 DbgScope *Parent = NULL;
Devang Patel5e005d82009-08-31 22:00:15 +00001362 DILexicalBlock Block(N);
Bill Wendling0310d762009-05-15 09:23:25 +00001363
Bill Wendling8fff19b2009-06-01 20:18:46 +00001364 // Don't create a new scope if we already created one for an inlined function.
Devang Patele4b27562009-08-28 23:24:31 +00001365 DenseMap<const MDNode *, DbgScope *>::iterator
1366 II = AbstractInstanceRootMap.find(N);
Bill Wendling8fff19b2009-06-01 20:18:46 +00001367 if (II != AbstractInstanceRootMap.end())
1368 return LexicalScopeStack.back();
1369
Bill Wendling0310d762009-05-15 09:23:25 +00001370 if (!Block.isNull()) {
1371 DIDescriptor ParentDesc = Block.getContext();
1372 Parent =
Devang Patele4b27562009-08-28 23:24:31 +00001373 ParentDesc.isNull() ? NULL : getOrCreateScope(ParentDesc.getNode());
Bill Wendling0310d762009-05-15 09:23:25 +00001374 }
1375
Devang Patele4b27562009-08-28 23:24:31 +00001376 Slot = new DbgScope(Parent, DIDescriptor(N));
Bill Wendling0310d762009-05-15 09:23:25 +00001377
1378 if (Parent)
1379 Parent->AddScope(Slot);
1380 else
1381 // First function is top level function.
1382 FunctionDbgScope = Slot;
1383
1384 return Slot;
1385}
1386
1387/// ConstructDbgScope - Construct the components of a scope.
1388///
1389void DwarfDebug::ConstructDbgScope(DbgScope *ParentScope,
1390 unsigned ParentStartID,
1391 unsigned ParentEndID,
1392 DIE *ParentDie, CompileUnit *Unit) {
1393 // Add variables to scope.
1394 SmallVector<DbgVariable *, 8> &Variables = ParentScope->getVariables();
1395 for (unsigned i = 0, N = Variables.size(); i < N; ++i) {
Bill Wendling995f80a2009-05-20 23:24:48 +00001396 DIE *VariableDie = CreateDbgScopeVariable(Variables[i], Unit);
Bill Wendling0310d762009-05-15 09:23:25 +00001397 if (VariableDie) ParentDie->AddChild(VariableDie);
1398 }
1399
1400 // Add concrete instances to scope.
1401 SmallVector<DbgConcreteScope *, 8> &ConcreteInsts =
1402 ParentScope->getConcreteInsts();
1403 for (unsigned i = 0, N = ConcreteInsts.size(); i < N; ++i) {
1404 DbgConcreteScope *ConcreteInst = ConcreteInsts[i];
1405 DIE *Die = ConcreteInst->getDie();
1406
1407 unsigned StartID = ConcreteInst->getStartLabelID();
1408 unsigned EndID = ConcreteInst->getEndLabelID();
1409
1410 // Add the scope bounds.
1411 if (StartID)
1412 AddLabel(Die, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
1413 DWLabel("label", StartID));
1414 else
1415 AddLabel(Die, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
1416 DWLabel("func_begin", SubprogramCount));
1417
1418 if (EndID)
1419 AddLabel(Die, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
1420 DWLabel("label", EndID));
1421 else
1422 AddLabel(Die, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
1423 DWLabel("func_end", SubprogramCount));
1424
1425 ParentDie->AddChild(Die);
1426 }
1427
1428 // Add nested scopes.
1429 SmallVector<DbgScope *, 4> &Scopes = ParentScope->getScopes();
1430 for (unsigned j = 0, M = Scopes.size(); j < M; ++j) {
1431 // Define the Scope debug information entry.
1432 DbgScope *Scope = Scopes[j];
1433
1434 unsigned StartID = MMI->MappedLabel(Scope->getStartLabelID());
1435 unsigned EndID = MMI->MappedLabel(Scope->getEndLabelID());
1436
1437 // Ignore empty scopes.
1438 if (StartID == EndID && StartID != 0) continue;
1439
1440 // Do not ignore inlined scopes even if they don't have any variables or
1441 // scopes.
1442 if (Scope->getScopes().empty() && Scope->getVariables().empty() &&
1443 Scope->getConcreteInsts().empty())
1444 continue;
1445
1446 if (StartID == ParentStartID && EndID == ParentEndID) {
1447 // Just add stuff to the parent scope.
1448 ConstructDbgScope(Scope, ParentStartID, ParentEndID, ParentDie, Unit);
1449 } else {
1450 DIE *ScopeDie = new DIE(dwarf::DW_TAG_lexical_block);
1451
1452 // Add the scope bounds.
1453 if (StartID)
1454 AddLabel(ScopeDie, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
1455 DWLabel("label", StartID));
1456 else
1457 AddLabel(ScopeDie, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
1458 DWLabel("func_begin", SubprogramCount));
1459
1460 if (EndID)
1461 AddLabel(ScopeDie, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
1462 DWLabel("label", EndID));
1463 else
1464 AddLabel(ScopeDie, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
1465 DWLabel("func_end", SubprogramCount));
1466
1467 // Add the scope's contents.
1468 ConstructDbgScope(Scope, StartID, EndID, ScopeDie, Unit);
1469 ParentDie->AddChild(ScopeDie);
1470 }
1471 }
1472}
1473
1474/// ConstructFunctionDbgScope - Construct the scope for the subprogram.
1475///
Bill Wendling17956162009-05-20 23:28:48 +00001476void DwarfDebug::ConstructFunctionDbgScope(DbgScope *RootScope,
1477 bool AbstractScope) {
Bill Wendling0310d762009-05-15 09:23:25 +00001478 // Exit if there is no root scope.
1479 if (!RootScope) return;
1480 DIDescriptor Desc = RootScope->getDesc();
1481 if (Desc.isNull())
1482 return;
1483
1484 // Get the subprogram debug information entry.
Devang Patele4b27562009-08-28 23:24:31 +00001485 DISubprogram SPD(Desc.getNode());
Bill Wendling0310d762009-05-15 09:23:25 +00001486
Bill Wendling0310d762009-05-15 09:23:25 +00001487 // Get the subprogram die.
Devang Patele4b27562009-08-28 23:24:31 +00001488 DIE *SPDie = ModuleCU->getDieMapSlotFor(SPD.getNode());
Devang Patelffd9c3d2009-10-05 23:59:00 +00001489 if (!SPDie) {
1490 ConstructSubprogram(SPD.getNode());
1491 SPDie = ModuleCU->getDieMapSlotFor(SPD.getNode());
1492 }
Bill Wendling0310d762009-05-15 09:23:25 +00001493 assert(SPDie && "Missing subprogram descriptor");
1494
Bill Wendling17956162009-05-20 23:28:48 +00001495 if (!AbstractScope) {
1496 // Add the function bounds.
1497 AddLabel(SPDie, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
1498 DWLabel("func_begin", SubprogramCount));
1499 AddLabel(SPDie, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
1500 DWLabel("func_end", SubprogramCount));
1501 MachineLocation Location(RI->getFrameRegister(*MF));
1502 AddAddress(SPDie, dwarf::DW_AT_frame_base, Location);
1503 }
Bill Wendling0310d762009-05-15 09:23:25 +00001504
Devang Patel1dbc7712009-06-29 20:45:18 +00001505 ConstructDbgScope(RootScope, 0, 0, SPDie, ModuleCU);
Devang Patelfd07cf52009-10-05 23:40:42 +00001506 // If there are global variables at this scope then add their dies.
1507 for (SmallVector<WeakVH, 4>::iterator SGI = ScopedGVs.begin(),
1508 SGE = ScopedGVs.end(); SGI != SGE; ++SGI) {
1509 MDNode *N = dyn_cast_or_null<MDNode>(*SGI);
1510 if (!N) continue;
1511 DIGlobalVariable GV(N);
1512 if (GV.getContext().getNode() == RootScope->getDesc().getNode()) {
1513 DIE *ScopedGVDie = CreateGlobalVariableDIE(ModuleCU, GV);
1514 SPDie->AddChild(ScopedGVDie);
1515 }
1516 }
Bill Wendling0310d762009-05-15 09:23:25 +00001517}
1518
Bill Wendling0310d762009-05-15 09:23:25 +00001519/// ConstructDefaultDbgScope - Construct a default scope for the subprogram.
1520///
1521void DwarfDebug::ConstructDefaultDbgScope(MachineFunction *MF) {
Devang Patel1dbc7712009-06-29 20:45:18 +00001522 StringMap<DIE*> &Globals = ModuleCU->getGlobals();
Daniel Dunbar460f6562009-07-26 09:48:23 +00001523 StringMap<DIE*>::iterator GI = Globals.find(MF->getFunction()->getName());
Devang Patel70f44262009-06-29 20:38:13 +00001524 if (GI != Globals.end()) {
1525 DIE *SPDie = GI->second;
Daniel Dunbarf612ff62009-09-19 20:40:05 +00001526
Devang Patel70f44262009-06-29 20:38:13 +00001527 // Add the function bounds.
1528 AddLabel(SPDie, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
1529 DWLabel("func_begin", SubprogramCount));
1530 AddLabel(SPDie, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
1531 DWLabel("func_end", SubprogramCount));
Daniel Dunbarf612ff62009-09-19 20:40:05 +00001532
Devang Patel70f44262009-06-29 20:38:13 +00001533 MachineLocation Location(RI->getFrameRegister(*MF));
1534 AddAddress(SPDie, dwarf::DW_AT_frame_base, Location);
Bill Wendling0310d762009-05-15 09:23:25 +00001535 }
Bill Wendling0310d762009-05-15 09:23:25 +00001536}
1537
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001538/// GetOrCreateSourceID - Look up the source id with the given directory and
1539/// source file names. If none currently exists, create a new id and insert it
1540/// in the SourceIds map. This can update DirectoryNames and SourceFileNames
1541/// maps as well.
Devang Patel5ccdd102009-09-29 18:40:58 +00001542unsigned DwarfDebug::GetOrCreateSourceID(const char *DirName,
1543 const char *FileName) {
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001544 unsigned DId;
1545 StringMap<unsigned>::iterator DI = DirectoryIdMap.find(DirName);
1546 if (DI != DirectoryIdMap.end()) {
1547 DId = DI->getValue();
1548 } else {
1549 DId = DirectoryNames.size() + 1;
1550 DirectoryIdMap[DirName] = DId;
1551 DirectoryNames.push_back(DirName);
1552 }
1553
1554 unsigned FId;
1555 StringMap<unsigned>::iterator FI = SourceFileIdMap.find(FileName);
1556 if (FI != SourceFileIdMap.end()) {
1557 FId = FI->getValue();
1558 } else {
1559 FId = SourceFileNames.size() + 1;
1560 SourceFileIdMap[FileName] = FId;
1561 SourceFileNames.push_back(FileName);
1562 }
1563
1564 DenseMap<std::pair<unsigned, unsigned>, unsigned>::iterator SI =
1565 SourceIdMap.find(std::make_pair(DId, FId));
1566 if (SI != SourceIdMap.end())
1567 return SI->second;
1568
1569 unsigned SrcId = SourceIds.size() + 1; // DW_AT_decl_file cannot be 0.
1570 SourceIdMap[std::make_pair(DId, FId)] = SrcId;
1571 SourceIds.push_back(std::make_pair(DId, FId));
1572
1573 return SrcId;
1574}
1575
Devang Patele4b27562009-08-28 23:24:31 +00001576void DwarfDebug::ConstructCompileUnit(MDNode *N) {
1577 DICompileUnit DIUnit(N);
Devang Patel5ccdd102009-09-29 18:40:58 +00001578 const char *FN = DIUnit.getFilename();
1579 const char *Dir = DIUnit.getDirectory();
1580 unsigned ID = GetOrCreateSourceID(Dir, FN);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001581
1582 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
1583 AddSectionOffset(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4,
1584 DWLabel("section_line", 0), DWLabel("section_line", 0),
1585 false);
1586 AddString(Die, dwarf::DW_AT_producer, dwarf::DW_FORM_string,
Devang Patel5ccdd102009-09-29 18:40:58 +00001587 DIUnit.getProducer());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001588 AddUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data1,
1589 DIUnit.getLanguage());
1590 AddString(Die, dwarf::DW_AT_name, dwarf::DW_FORM_string, FN);
1591
Devang Patel5ccdd102009-09-29 18:40:58 +00001592 if (Dir)
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001593 AddString(Die, dwarf::DW_AT_comp_dir, dwarf::DW_FORM_string, Dir);
1594 if (DIUnit.isOptimized())
1595 AddUInt(Die, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1);
1596
Devang Patel5ccdd102009-09-29 18:40:58 +00001597 if (const char *Flags = DIUnit.getFlags())
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001598 AddString(Die, dwarf::DW_AT_APPLE_flags, dwarf::DW_FORM_string, Flags);
1599
1600 unsigned RVer = DIUnit.getRunTimeVersion();
1601 if (RVer)
1602 AddUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers,
1603 dwarf::DW_FORM_data1, RVer);
1604
1605 CompileUnit *Unit = new CompileUnit(ID, Die);
Devang Patel1dbc7712009-06-29 20:45:18 +00001606 if (!ModuleCU && DIUnit.isMain()) {
Devang Patel70f44262009-06-29 20:38:13 +00001607 // Use first compile unit marked as isMain as the compile unit
1608 // for this module.
Devang Patel1dbc7712009-06-29 20:45:18 +00001609 ModuleCU = Unit;
Devang Patel70f44262009-06-29 20:38:13 +00001610 }
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001611
Devang Patele4b27562009-08-28 23:24:31 +00001612 CompileUnitMap[DIUnit.getNode()] = Unit;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001613 CompileUnits.push_back(Unit);
1614}
1615
Devang Patele4b27562009-08-28 23:24:31 +00001616void DwarfDebug::ConstructGlobalVariableDIE(MDNode *N) {
1617 DIGlobalVariable DI_GV(N);
Daniel Dunbarf612ff62009-09-19 20:40:05 +00001618
Devang Patel905cf5e2009-09-04 23:59:07 +00001619 // If debug information is malformed then ignore it.
1620 if (DI_GV.Verify() == false)
1621 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001622
1623 // Check for pre-existence.
Devang Patele4b27562009-08-28 23:24:31 +00001624 DIE *&Slot = ModuleCU->getDieMapSlotFor(DI_GV.getNode());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001625 if (Slot)
Devang Patel13e16b62009-06-26 01:49:18 +00001626 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001627
Devang Patel1dbc7712009-06-29 20:45:18 +00001628 DIE *VariableDie = CreateGlobalVariableDIE(ModuleCU, DI_GV);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001629
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001630 // Add to map.
1631 Slot = VariableDie;
1632
1633 // Add to context owner.
Devang Patel1dbc7712009-06-29 20:45:18 +00001634 ModuleCU->getDie()->AddChild(VariableDie);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001635
1636 // Expose as global. FIXME - need to check external flag.
Devang Patel5ccdd102009-09-29 18:40:58 +00001637 ModuleCU->AddGlobal(DI_GV.getName(), VariableDie);
Devang Patel13e16b62009-06-26 01:49:18 +00001638 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001639}
1640
Devang Patele4b27562009-08-28 23:24:31 +00001641void DwarfDebug::ConstructSubprogram(MDNode *N) {
1642 DISubprogram SP(N);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001643
1644 // Check for pre-existence.
Devang Patele4b27562009-08-28 23:24:31 +00001645 DIE *&Slot = ModuleCU->getDieMapSlotFor(N);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001646 if (Slot)
Devang Patel13e16b62009-06-26 01:49:18 +00001647 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001648
1649 if (!SP.isDefinition())
1650 // This is a method declaration which will be handled while constructing
1651 // class type.
Devang Patel13e16b62009-06-26 01:49:18 +00001652 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001653
Devang Patel1dbc7712009-06-29 20:45:18 +00001654 DIE *SubprogramDie = CreateSubprogramDIE(ModuleCU, SP);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001655
1656 // Add to map.
1657 Slot = SubprogramDie;
1658
1659 // Add to context owner.
Devang Patel1dbc7712009-06-29 20:45:18 +00001660 ModuleCU->getDie()->AddChild(SubprogramDie);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001661
1662 // Expose as global.
Devang Patel5ccdd102009-09-29 18:40:58 +00001663 ModuleCU->AddGlobal(SP.getName(), SubprogramDie);
Devang Patel13e16b62009-06-26 01:49:18 +00001664 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001665}
1666
Daniel Dunbar00564992009-09-19 20:40:14 +00001667/// BeginModule - Emit all Dwarf sections that should come prior to the
1668/// content. Create global DIEs and emit initial debug info sections.
1669/// This is inovked by the target AsmPrinter.
Devang Patel208622d2009-06-25 22:36:02 +00001670void DwarfDebug::BeginModule(Module *M, MachineModuleInfo *mmi) {
1671 this->M = M;
1672
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001673 if (TimePassesIsEnabled)
1674 DebugTimer->startTimer();
1675
Devang Patel78ab9e22009-07-30 18:56:46 +00001676 DebugInfoFinder DbgFinder;
1677 DbgFinder.processModule(*M);
Devang Patel13e16b62009-06-26 01:49:18 +00001678
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001679 // Create all the compile unit DIEs.
Devang Patel78ab9e22009-07-30 18:56:46 +00001680 for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
1681 E = DbgFinder.compile_unit_end(); I != E; ++I)
Devang Patel13e16b62009-06-26 01:49:18 +00001682 ConstructCompileUnit(*I);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001683
1684 if (CompileUnits.empty()) {
1685 if (TimePassesIsEnabled)
1686 DebugTimer->stopTimer();
1687
1688 return;
1689 }
1690
Devang Patel70f44262009-06-29 20:38:13 +00001691 // If main compile unit for this module is not seen than randomly
1692 // select first compile unit.
Devang Patel1dbc7712009-06-29 20:45:18 +00001693 if (!ModuleCU)
1694 ModuleCU = CompileUnits[0];
Devang Patel70f44262009-06-29 20:38:13 +00001695
Devang Patel13e16b62009-06-26 01:49:18 +00001696 // Create DIEs for each of the externally visible global variables.
Devang Patel78ab9e22009-07-30 18:56:46 +00001697 for (DebugInfoFinder::iterator I = DbgFinder.global_variable_begin(),
Devang Patelfd07cf52009-10-05 23:40:42 +00001698 E = DbgFinder.global_variable_end(); I != E; ++I) {
1699 DIGlobalVariable GV(*I);
1700 if (GV.getContext().getNode() != GV.getCompileUnit().getNode())
1701 ScopedGVs.push_back(*I);
1702 else
1703 ConstructGlobalVariableDIE(*I);
1704 }
Devang Patel13e16b62009-06-26 01:49:18 +00001705
1706 // Create DIEs for each of the externally visible subprograms.
Devang Patel78ab9e22009-07-30 18:56:46 +00001707 for (DebugInfoFinder::iterator I = DbgFinder.subprogram_begin(),
1708 E = DbgFinder.subprogram_end(); I != E; ++I)
Devang Patel13e16b62009-06-26 01:49:18 +00001709 ConstructSubprogram(*I);
1710
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001711 MMI = mmi;
1712 shouldEmit = true;
1713 MMI->setDebugInfoAvailability(true);
1714
1715 // Prime section data.
Chris Lattnerf0144122009-07-28 03:13:23 +00001716 SectionMap.insert(Asm->getObjFileLowering().getTextSection());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001717
1718 // Print out .file directives to specify files for .loc directives. These are
1719 // printed out early so that they precede any .loc directives.
Chris Lattner33adcfb2009-08-22 21:43:10 +00001720 if (MAI->hasDotLocAndDotFile()) {
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001721 for (unsigned i = 1, e = getNumSourceIds()+1; i != e; ++i) {
1722 // Remember source id starts at 1.
1723 std::pair<unsigned, unsigned> Id = getSourceDirectoryAndFileIds(i);
1724 sys::Path FullPath(getSourceDirectoryName(Id.first));
1725 bool AppendOk =
1726 FullPath.appendComponent(getSourceFileName(Id.second));
1727 assert(AppendOk && "Could not append filename to directory!");
1728 AppendOk = false;
Chris Lattner74382b72009-08-23 22:45:37 +00001729 Asm->EmitFile(i, FullPath.str());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001730 Asm->EOL();
1731 }
1732 }
1733
1734 // Emit initial sections
1735 EmitInitial();
1736
1737 if (TimePassesIsEnabled)
1738 DebugTimer->stopTimer();
1739}
1740
1741/// EndModule - Emit all Dwarf sections that should come after the content.
1742///
1743void DwarfDebug::EndModule() {
Devang Patel6f3dc922009-10-06 00:03:14 +00001744 if (!ModuleCU)
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001745 return;
1746
1747 if (TimePassesIsEnabled)
1748 DebugTimer->startTimer();
1749
1750 // Standard sections final addresses.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00001751 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getTextSection());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001752 EmitLabel("text_end", 0);
Chris Lattner6c2f9e12009-08-19 05:49:37 +00001753 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getDataSection());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001754 EmitLabel("data_end", 0);
1755
1756 // End text sections.
1757 for (unsigned i = 1, N = SectionMap.size(); i <= N; ++i) {
Chris Lattner6c2f9e12009-08-19 05:49:37 +00001758 Asm->OutStreamer.SwitchSection(SectionMap[i]);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001759 EmitLabel("section_end", i);
1760 }
1761
1762 // Emit common frame information.
1763 EmitCommonDebugFrame();
1764
1765 // Emit function debug frame information
1766 for (std::vector<FunctionDebugFrameInfo>::iterator I = DebugFrames.begin(),
1767 E = DebugFrames.end(); I != E; ++I)
1768 EmitFunctionDebugFrame(*I);
1769
1770 // Compute DIE offsets and sizes.
1771 SizeAndOffsets();
1772
1773 // Emit all the DIEs into a debug info section
1774 EmitDebugInfo();
1775
1776 // Corresponding abbreviations into a abbrev section.
1777 EmitAbbreviations();
1778
1779 // Emit source line correspondence into a debug line section.
1780 EmitDebugLines();
1781
1782 // Emit info into a debug pubnames section.
1783 EmitDebugPubNames();
1784
1785 // Emit info into a debug str section.
1786 EmitDebugStr();
1787
1788 // Emit info into a debug loc section.
1789 EmitDebugLoc();
1790
1791 // Emit info into a debug aranges section.
1792 EmitDebugARanges();
1793
1794 // Emit info into a debug ranges section.
1795 EmitDebugRanges();
1796
1797 // Emit info into a debug macinfo section.
1798 EmitDebugMacInfo();
1799
1800 // Emit inline info.
1801 EmitDebugInlineInfo();
1802
1803 if (TimePassesIsEnabled)
1804 DebugTimer->stopTimer();
1805}
1806
Devang Patele717faa2009-10-06 01:26:37 +00001807/// CollectVariableInfo - Populate DbgScope entries with variables' info.
Devang Patelac1ceb32009-10-09 22:42:28 +00001808void DwarfDebug::CollectVariableInfo() {
1809 if (!MMI) return;
Devang Patele717faa2009-10-06 01:26:37 +00001810 MachineModuleInfo::VariableDbgInfoMapTy &VMap = MMI->getVariableDbgInfo();
1811 for (MachineModuleInfo::VariableDbgInfoMapTy::iterator VI = VMap.begin(),
1812 VE = VMap.end(); VI != VE; ++VI) {
Devang Patelac1ceb32009-10-09 22:42:28 +00001813 MetadataBase *MB = VI->first;
1814 MDNode *Var = dyn_cast_or_null<MDNode>(MB);
Devang Pateleda31212009-10-08 18:48:03 +00001815 DIVariable DV (Var);
1816 if (DV.isNull()) continue;
Devang Patelac1ceb32009-10-09 22:42:28 +00001817 unsigned VSlot = VI->second;
Devang Patel149aa7c2009-10-16 18:18:03 +00001818 DbgScope *Scope = NULL;
Devang Patelbdf45cb2009-10-27 20:47:17 +00001819 ValueMap<MDNode *, DbgScope *>::iterator DSI =
Devang Patelc90aefe2009-10-14 21:08:09 +00001820 DbgScopeMap.find(DV.getContext().getNode());
Devang Patel149aa7c2009-10-16 18:18:03 +00001821 if (DSI != DbgScopeMap.end())
1822 Scope = DSI->second;
1823 else
1824 // There is not any instruction assocated with this scope, so get
1825 // a new scope.
1826 Scope = getDbgScope(DV.getContext().getNode(),
1827 NULL /* Not an instruction */,
1828 NULL /* Not inlined */);
1829 assert (Scope && "Unable to find variable scope!");
Devang Pateleda31212009-10-08 18:48:03 +00001830 Scope->AddVariable(new DbgVariable(DV, VSlot, false));
Devang Patele717faa2009-10-06 01:26:37 +00001831 }
1832}
1833
Devang Patel0d20ac82009-10-06 01:50:42 +00001834/// SetDbgScopeBeginLabels - Update DbgScope begin labels for the scopes that
1835/// start with this machine instruction.
1836void DwarfDebug::SetDbgScopeBeginLabels(const MachineInstr *MI, unsigned Label) {
1837 InsnToDbgScopeMapTy::iterator I = DbgScopeBeginMap.find(MI);
1838 if (I == DbgScopeBeginMap.end())
1839 return;
1840 SmallVector<DbgScope *, 2> &SD = I->second;
1841 for (SmallVector<DbgScope *, 2>::iterator SDI = SD.begin(), SDE = SD.end();
1842 SDI != SDE; ++SDI)
1843 (*SDI)->setStartLabelID(Label);
1844}
1845
1846/// SetDbgScopeEndLabels - Update DbgScope end labels for the scopes that
1847/// end with this machine instruction.
1848void DwarfDebug::SetDbgScopeEndLabels(const MachineInstr *MI, unsigned Label) {
1849 InsnToDbgScopeMapTy::iterator I = DbgScopeEndMap.find(MI);
Devang Patel8a4087d2009-10-06 03:15:38 +00001850 if (I == DbgScopeEndMap.end())
Devang Patel0d20ac82009-10-06 01:50:42 +00001851 return;
1852 SmallVector<DbgScope *, 2> &SD = I->second;
1853 for (SmallVector<DbgScope *, 2>::iterator SDI = SD.begin(), SDE = SD.end();
1854 SDI != SDE; ++SDI)
1855 (*SDI)->setEndLabelID(Label);
1856}
1857
Devang Patelaf9e8472009-10-01 20:31:14 +00001858/// ExtractScopeInformation - Scan machine instructions in this function
1859/// and collect DbgScopes. Return true, if atleast one scope was found.
1860bool DwarfDebug::ExtractScopeInformation(MachineFunction *MF) {
1861 // If scope information was extracted using .dbg intrinsics then there is not
1862 // any need to extract these information by scanning each instruction.
1863 if (!DbgScopeMap.empty())
1864 return false;
1865
1866 // Scan each instruction and create scopes.
1867 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
1868 I != E; ++I) {
1869 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
1870 II != IE; ++II) {
1871 const MachineInstr *MInsn = II;
1872 DebugLoc DL = MInsn->getDebugLoc();
1873 if (DL.isUnknown())
1874 continue;
1875 DebugLocTuple DLT = MF->getDebugLocTuple(DL);
Devang Patel1619dc32009-10-13 23:28:53 +00001876 if (!DLT.Scope)
Devang Patelaf9e8472009-10-01 20:31:14 +00001877 continue;
1878 // There is no need to create another DIE for compile unit. For all
1879 // other scopes, create one DbgScope now. This will be translated
1880 // into a scope DIE at the end.
Devang Patel1619dc32009-10-13 23:28:53 +00001881 DIDescriptor D(DLT.Scope);
Devang Patelaf9e8472009-10-01 20:31:14 +00001882 if (!D.isCompileUnit()) {
Devang Patelc90aefe2009-10-14 21:08:09 +00001883 DbgScope *Scope = getDbgScope(DLT.Scope, MInsn, DLT.InlinedAtLoc);
Devang Patelaf9e8472009-10-01 20:31:14 +00001884 Scope->setLastInsn(MInsn);
1885 }
1886 }
1887 }
1888
1889 // If a scope's last instruction is not set then use its child scope's
1890 // last instruction as this scope's last instrunction.
Devang Patelbdf45cb2009-10-27 20:47:17 +00001891 for (ValueMap<MDNode *, DbgScope *>::iterator DI = DbgScopeMap.begin(),
Devang Patelaf9e8472009-10-01 20:31:14 +00001892 DE = DbgScopeMap.end(); DI != DE; ++DI) {
Devang Patelbdf45cb2009-10-27 20:47:17 +00001893 DbgScope *S = DI->second;
1894 if (!S) continue;
Devang Patelaf9e8472009-10-01 20:31:14 +00001895 assert (DI->second->getFirstInsn() && "Invalid first instruction!");
1896 DI->second->FixInstructionMarkers();
1897 assert (DI->second->getLastInsn() && "Invalid last instruction!");
1898 }
1899
1900 // Each scope has first instruction and last instruction to mark beginning
1901 // and end of a scope respectively. Create an inverse map that list scopes
1902 // starts (and ends) with an instruction. One instruction may start (or end)
1903 // multiple scopes.
Devang Patelbdf45cb2009-10-27 20:47:17 +00001904 for (ValueMap<MDNode *, DbgScope *>::iterator DI = DbgScopeMap.begin(),
Devang Patelaf9e8472009-10-01 20:31:14 +00001905 DE = DbgScopeMap.end(); DI != DE; ++DI) {
1906 DbgScope *S = DI->second;
Devang Patelbdf45cb2009-10-27 20:47:17 +00001907 if (!S) continue;
Devang Patelaf9e8472009-10-01 20:31:14 +00001908 const MachineInstr *MI = S->getFirstInsn();
1909 assert (MI && "DbgScope does not have first instruction!");
1910
1911 InsnToDbgScopeMapTy::iterator IDI = DbgScopeBeginMap.find(MI);
1912 if (IDI != DbgScopeBeginMap.end())
1913 IDI->second.push_back(S);
1914 else
1915 DbgScopeBeginMap.insert(std::make_pair(MI,
1916 SmallVector<DbgScope *, 2>(2, S)));
1917
1918 MI = S->getLastInsn();
1919 assert (MI && "DbgScope does not have last instruction!");
1920 IDI = DbgScopeEndMap.find(MI);
1921 if (IDI != DbgScopeEndMap.end())
1922 IDI->second.push_back(S);
1923 else
1924 DbgScopeEndMap.insert(std::make_pair(MI,
1925 SmallVector<DbgScope *, 2>(2, S)));
1926 }
1927
1928 return !DbgScopeMap.empty();
1929}
1930
Devang Patel6ef75172009-10-12 23:11:24 +00001931static DISubprogram getDISubprogram(MDNode *N) {
1932
1933 DIDescriptor D(N);
1934 if (D.isNull())
1935 return DISubprogram();
1936
1937 if (D.isCompileUnit())
1938 return DISubprogram();
1939
1940 if (D.isSubprogram())
1941 return DISubprogram(N);
1942
1943 if (D.isLexicalBlock())
1944 return getDISubprogram(DILexicalBlock(N).getContext().getNode());
1945
Daniel Dunbar6e4bdfc2009-10-13 06:47:08 +00001946 llvm_unreachable("Unexpected Descriptor!");
Devang Patel6ef75172009-10-12 23:11:24 +00001947}
1948
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001949/// BeginFunction - Gather pre-function debug information. Assumes being
1950/// emitted immediately after the function entry point.
1951void DwarfDebug::BeginFunction(MachineFunction *MF) {
1952 this->MF = MF;
1953
1954 if (!ShouldEmitDwarfDebug()) return;
1955
1956 if (TimePassesIsEnabled)
1957 DebugTimer->startTimer();
1958
Devang Patel60b35bd2009-10-06 18:37:31 +00001959#ifdef ATTACH_DEBUG_INFO_TO_AN_INSN
1960 if (!ExtractScopeInformation(MF))
1961 return;
Devang Patelac1ceb32009-10-09 22:42:28 +00001962 CollectVariableInfo();
Devang Patel60b35bd2009-10-06 18:37:31 +00001963#endif
1964
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001965 // Begin accumulating function debug information.
1966 MMI->BeginFunction(MF);
1967
1968 // Assumes in correct section after the entry point.
1969 EmitLabel("func_begin", ++SubprogramCount);
1970
1971 // Emit label for the implicitly defined dbg.stoppoint at the start of the
1972 // function.
Devang Pateleda31212009-10-08 18:48:03 +00001973#ifdef ATTACH_DEBUG_INFO_TO_AN_INSN
Devang Patelac1ceb32009-10-09 22:42:28 +00001974 DebugLoc FDL = MF->getDefaultDebugLoc();
1975 if (!FDL.isUnknown()) {
1976 DebugLocTuple DLT = MF->getDebugLocTuple(FDL);
1977 unsigned LabelID = 0;
Devang Patel1619dc32009-10-13 23:28:53 +00001978 DISubprogram SP = getDISubprogram(DLT.Scope);
Devang Patelac1ceb32009-10-09 22:42:28 +00001979 if (!SP.isNull())
Devang Patel1619dc32009-10-13 23:28:53 +00001980 LabelID = RecordSourceLine(SP.getLineNumber(), 0, DLT.Scope);
Devang Patelac1ceb32009-10-09 22:42:28 +00001981 else
Devang Patel1619dc32009-10-13 23:28:53 +00001982 LabelID = RecordSourceLine(DLT.Line, DLT.Col, DLT.Scope);
Devang Patelac1ceb32009-10-09 22:42:28 +00001983 Asm->printLabel(LabelID);
1984 O << '\n';
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001985 }
Devang Patelac1ceb32009-10-09 22:42:28 +00001986#else
1987 DebugLoc FDL = MF->getDefaultDebugLoc();
1988 if (!FDL.isUnknown()) {
1989 DebugLocTuple DLT = MF->getDebugLocTuple(FDL);
Devang Patel1619dc32009-10-13 23:28:53 +00001990 unsigned LabelID = RecordSourceLine(DLT.Line, DLT.Col, DLT.Scope);
Devang Patelac1ceb32009-10-09 22:42:28 +00001991 Asm->printLabel(LabelID);
1992 O << '\n';
1993 }
1994#endif
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001995 if (TimePassesIsEnabled)
1996 DebugTimer->stopTimer();
1997}
1998
1999/// EndFunction - Gather and emit post-function debug information.
2000///
2001void DwarfDebug::EndFunction(MachineFunction *MF) {
2002 if (!ShouldEmitDwarfDebug()) return;
2003
2004 if (TimePassesIsEnabled)
2005 DebugTimer->startTimer();
2006
Devang Patelac1ceb32009-10-09 22:42:28 +00002007#ifdef ATTACH_DEBUG_INFO_TO_AN_INSN
2008 if (DbgScopeMap.empty())
2009 return;
2010#endif
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002011 // Define end label for subprogram.
2012 EmitLabel("func_end", SubprogramCount);
2013
2014 // Get function line info.
2015 if (!Lines.empty()) {
2016 // Get section line info.
Chris Lattner290c2f52009-08-03 23:20:21 +00002017 unsigned ID = SectionMap.insert(Asm->getCurrentSection());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002018 if (SectionSourceLines.size() < ID) SectionSourceLines.resize(ID);
2019 std::vector<SrcLineInfo> &SectionLineInfos = SectionSourceLines[ID-1];
2020 // Append the function info to section info.
2021 SectionLineInfos.insert(SectionLineInfos.end(),
2022 Lines.begin(), Lines.end());
2023 }
2024
2025 // Construct the DbgScope for abstract instances.
2026 for (SmallVector<DbgScope *, 32>::iterator
2027 I = AbstractInstanceRootList.begin(),
2028 E = AbstractInstanceRootList.end(); I != E; ++I)
Bill Wendling17956162009-05-20 23:28:48 +00002029 ConstructFunctionDbgScope(*I);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002030
2031 // Construct scopes for subprogram.
2032 if (FunctionDbgScope)
2033 ConstructFunctionDbgScope(FunctionDbgScope);
2034 else
2035 // FIXME: This is wrong. We are essentially getting past a problem with
2036 // debug information not being able to handle unreachable blocks that have
2037 // debug information in them. In particular, those unreachable blocks that
2038 // have "region end" info in them. That situation results in the "root
2039 // scope" not being created. If that's the case, then emit a "default"
2040 // scope, i.e., one that encompasses the whole function. This isn't
2041 // desirable. And a better way of handling this (and all of the debugging
2042 // information) needs to be explored.
2043 ConstructDefaultDbgScope(MF);
2044
2045 DebugFrames.push_back(FunctionDebugFrameInfo(SubprogramCount,
2046 MMI->getFrameMoves()));
2047
2048 // Clear debug info
2049 if (FunctionDbgScope) {
2050 delete FunctionDbgScope;
2051 DbgScopeMap.clear();
Devang Patelaf9e8472009-10-01 20:31:14 +00002052 DbgScopeBeginMap.clear();
2053 DbgScopeEndMap.clear();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002054 DbgAbstractScopeMap.clear();
2055 DbgConcreteScopeMap.clear();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002056 FunctionDbgScope = NULL;
2057 LexicalScopeStack.clear();
2058 AbstractInstanceRootList.clear();
Devang Patel9217f792009-06-12 19:24:05 +00002059 AbstractInstanceRootMap.clear();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002060 }
2061
2062 Lines.clear();
2063
2064 if (TimePassesIsEnabled)
2065 DebugTimer->stopTimer();
2066}
2067
2068/// RecordSourceLine - Records location information and associates it with a
2069/// label. Returns a unique label ID used to generate a label and provide
2070/// correspondence to the source line list.
Devang Patel3d910832009-09-30 22:51:28 +00002071unsigned DwarfDebug::RecordSourceLine(unsigned Line, unsigned Col,
Devang Patelf84548d2009-10-05 18:03:19 +00002072 MDNode *S) {
Devang Patele4b27562009-08-28 23:24:31 +00002073 if (!MMI)
2074 return 0;
2075
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002076 if (TimePassesIsEnabled)
2077 DebugTimer->startTimer();
2078
Devang Patelf84548d2009-10-05 18:03:19 +00002079 const char *Dir = NULL;
2080 const char *Fn = NULL;
2081
2082 DIDescriptor Scope(S);
2083 if (Scope.isCompileUnit()) {
2084 DICompileUnit CU(S);
2085 Dir = CU.getDirectory();
2086 Fn = CU.getFilename();
2087 } else if (Scope.isSubprogram()) {
2088 DISubprogram SP(S);
2089 Dir = SP.getDirectory();
2090 Fn = SP.getFilename();
2091 } else if (Scope.isLexicalBlock()) {
2092 DILexicalBlock DB(S);
2093 Dir = DB.getDirectory();
2094 Fn = DB.getFilename();
2095 } else
2096 assert (0 && "Unexpected scope info");
2097
2098 unsigned Src = GetOrCreateSourceID(Dir, Fn);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002099 unsigned ID = MMI->NextLabelID();
2100 Lines.push_back(SrcLineInfo(Line, Col, Src, ID));
2101
2102 if (TimePassesIsEnabled)
2103 DebugTimer->stopTimer();
2104
2105 return ID;
2106}
2107
2108/// getOrCreateSourceID - Public version of GetOrCreateSourceID. This can be
2109/// timed. Look up the source id with the given directory and source file
2110/// names. If none currently exists, create a new id and insert it in the
2111/// SourceIds map. This can update DirectoryNames and SourceFileNames maps as
2112/// well.
2113unsigned DwarfDebug::getOrCreateSourceID(const std::string &DirName,
2114 const std::string &FileName) {
2115 if (TimePassesIsEnabled)
2116 DebugTimer->startTimer();
2117
Devang Patel5ccdd102009-09-29 18:40:58 +00002118 unsigned SrcId = GetOrCreateSourceID(DirName.c_str(), FileName.c_str());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002119
2120 if (TimePassesIsEnabled)
2121 DebugTimer->stopTimer();
2122
2123 return SrcId;
2124}
2125
2126/// RecordRegionStart - Indicate the start of a region.
Devang Patele4b27562009-08-28 23:24:31 +00002127unsigned DwarfDebug::RecordRegionStart(MDNode *N) {
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002128 if (TimePassesIsEnabled)
2129 DebugTimer->startTimer();
2130
Devang Patele4b27562009-08-28 23:24:31 +00002131 DbgScope *Scope = getOrCreateScope(N);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002132 unsigned ID = MMI->NextLabelID();
2133 if (!Scope->getStartLabelID()) Scope->setStartLabelID(ID);
2134 LexicalScopeStack.push_back(Scope);
2135
2136 if (TimePassesIsEnabled)
2137 DebugTimer->stopTimer();
2138
2139 return ID;
2140}
2141
2142/// RecordRegionEnd - Indicate the end of a region.
Devang Patele4b27562009-08-28 23:24:31 +00002143unsigned DwarfDebug::RecordRegionEnd(MDNode *N) {
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002144 if (TimePassesIsEnabled)
2145 DebugTimer->startTimer();
2146
Devang Patele4b27562009-08-28 23:24:31 +00002147 DbgScope *Scope = getOrCreateScope(N);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002148 unsigned ID = MMI->NextLabelID();
2149 Scope->setEndLabelID(ID);
Devang Pateldaf9e022009-06-13 02:16:18 +00002150 // FIXME : region.end() may not be in the last basic block.
2151 // For now, do not pop last lexical scope because next basic
2152 // block may start new inlined function's body.
2153 unsigned LSSize = LexicalScopeStack.size();
2154 if (LSSize != 0 && LSSize != 1)
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002155 LexicalScopeStack.pop_back();
2156
2157 if (TimePassesIsEnabled)
2158 DebugTimer->stopTimer();
2159
2160 return ID;
2161}
2162
2163/// RecordVariable - Indicate the declaration of a local variable.
Devang Patele4b27562009-08-28 23:24:31 +00002164void DwarfDebug::RecordVariable(MDNode *N, unsigned FrameIndex) {
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002165 if (TimePassesIsEnabled)
2166 DebugTimer->startTimer();
2167
Devang Patele4b27562009-08-28 23:24:31 +00002168 DIDescriptor Desc(N);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002169 DbgScope *Scope = NULL;
2170 bool InlinedFnVar = false;
2171
Devang Patele4b27562009-08-28 23:24:31 +00002172 if (Desc.getTag() == dwarf::DW_TAG_variable)
2173 Scope = getOrCreateScope(DIGlobalVariable(N).getContext().getNode());
2174 else {
Devang Patel24f20e02009-08-22 17:12:53 +00002175 bool InlinedVar = false;
Devang Patele4b27562009-08-28 23:24:31 +00002176 MDNode *Context = DIVariable(N).getContext().getNode();
2177 DISubprogram SP(Context);
Devang Patel24f20e02009-08-22 17:12:53 +00002178 if (!SP.isNull()) {
2179 // SP is inserted into DbgAbstractScopeMap when inlined function
2180 // start was recorded by RecordInlineFnStart.
Devang Patelbdf45cb2009-10-27 20:47:17 +00002181 ValueMap<MDNode *, DbgScope *>::iterator
Devang Patele4b27562009-08-28 23:24:31 +00002182 I = DbgAbstractScopeMap.find(SP.getNode());
Devang Patel24f20e02009-08-22 17:12:53 +00002183 if (I != DbgAbstractScopeMap.end()) {
2184 InlinedVar = true;
2185 Scope = I->second;
2186 }
2187 }
Daniel Dunbarf612ff62009-09-19 20:40:05 +00002188 if (!InlinedVar)
Devang Patele4b27562009-08-28 23:24:31 +00002189 Scope = getOrCreateScope(Context);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002190 }
2191
2192 assert(Scope && "Unable to find the variable's scope");
Devang Patele4b27562009-08-28 23:24:31 +00002193 DbgVariable *DV = new DbgVariable(DIVariable(N), FrameIndex, InlinedFnVar);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002194 Scope->AddVariable(DV);
2195
2196 if (TimePassesIsEnabled)
2197 DebugTimer->stopTimer();
2198}
2199
2200//// RecordInlinedFnStart - Indicate the start of inlined subroutine.
2201unsigned DwarfDebug::RecordInlinedFnStart(DISubprogram &SP, DICompileUnit CU,
2202 unsigned Line, unsigned Col) {
2203 unsigned LabelID = MMI->NextLabelID();
2204
Chris Lattner33adcfb2009-08-22 21:43:10 +00002205 if (!MAI->doesDwarfUsesInlineInfoSection())
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002206 return LabelID;
2207
2208 if (TimePassesIsEnabled)
2209 DebugTimer->startTimer();
2210
Devang Patele4b27562009-08-28 23:24:31 +00002211 MDNode *Node = SP.getNode();
2212 DenseMap<const MDNode *, DbgScope *>::iterator
2213 II = AbstractInstanceRootMap.find(Node);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002214
2215 if (II == AbstractInstanceRootMap.end()) {
2216 // Create an abstract instance entry for this inlined function if it doesn't
2217 // already exist.
Devang Patele4b27562009-08-28 23:24:31 +00002218 DbgScope *Scope = new DbgScope(NULL, DIDescriptor(Node));
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002219
2220 // Get the compile unit context.
Devang Patele4b27562009-08-28 23:24:31 +00002221 DIE *SPDie = ModuleCU->getDieMapSlotFor(Node);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002222 if (!SPDie)
Devang Patel1dbc7712009-06-29 20:45:18 +00002223 SPDie = CreateSubprogramDIE(ModuleCU, SP, false, true);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002224
2225 // Mark as being inlined. This makes this subprogram entry an abstract
2226 // instance root.
2227 // FIXME: Our debugger doesn't care about the value of DW_AT_inline, only
2228 // that it's defined. That probably won't change in the future. However,
2229 // this could be more elegant.
2230 AddUInt(SPDie, dwarf::DW_AT_inline, 0, dwarf::DW_INL_declared_not_inlined);
2231
2232 // Keep track of the abstract scope for this function.
Devang Patele4b27562009-08-28 23:24:31 +00002233 DbgAbstractScopeMap[Node] = Scope;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002234
Devang Patele4b27562009-08-28 23:24:31 +00002235 AbstractInstanceRootMap[Node] = Scope;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002236 AbstractInstanceRootList.push_back(Scope);
2237 }
2238
2239 // Create a concrete inlined instance for this inlined function.
Devang Patele4b27562009-08-28 23:24:31 +00002240 DbgConcreteScope *ConcreteScope = new DbgConcreteScope(DIDescriptor(Node));
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002241 DIE *ScopeDie = new DIE(dwarf::DW_TAG_inlined_subroutine);
Devang Patel1dbc7712009-06-29 20:45:18 +00002242 ScopeDie->setAbstractCompileUnit(ModuleCU);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002243
Devang Patele4b27562009-08-28 23:24:31 +00002244 DIE *Origin = ModuleCU->getDieMapSlotFor(Node);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002245 AddDIEEntry(ScopeDie, dwarf::DW_AT_abstract_origin,
2246 dwarf::DW_FORM_ref4, Origin);
Devang Patel1dbc7712009-06-29 20:45:18 +00002247 AddUInt(ScopeDie, dwarf::DW_AT_call_file, 0, ModuleCU->getID());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002248 AddUInt(ScopeDie, dwarf::DW_AT_call_line, 0, Line);
2249 AddUInt(ScopeDie, dwarf::DW_AT_call_column, 0, Col);
2250
2251 ConcreteScope->setDie(ScopeDie);
2252 ConcreteScope->setStartLabelID(LabelID);
2253 MMI->RecordUsedDbgLabel(LabelID);
2254
2255 LexicalScopeStack.back()->AddConcreteInst(ConcreteScope);
2256
2257 // Keep track of the concrete scope that's inlined into this function.
Devang Patelbdf45cb2009-10-27 20:47:17 +00002258 ValueMap<MDNode *, SmallVector<DbgScope *, 8> >::iterator
Devang Patele4b27562009-08-28 23:24:31 +00002259 SI = DbgConcreteScopeMap.find(Node);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002260
2261 if (SI == DbgConcreteScopeMap.end())
Devang Patele4b27562009-08-28 23:24:31 +00002262 DbgConcreteScopeMap[Node].push_back(ConcreteScope);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002263 else
2264 SI->second.push_back(ConcreteScope);
2265
2266 // Track the start label for this inlined function.
Devang Patelbdf45cb2009-10-27 20:47:17 +00002267 ValueMap<MDNode *, SmallVector<unsigned, 4> >::iterator
Devang Patele4b27562009-08-28 23:24:31 +00002268 I = InlineInfo.find(Node);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002269
2270 if (I == InlineInfo.end())
Devang Patele4b27562009-08-28 23:24:31 +00002271 InlineInfo[Node].push_back(LabelID);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002272 else
2273 I->second.push_back(LabelID);
2274
2275 if (TimePassesIsEnabled)
2276 DebugTimer->stopTimer();
2277
2278 return LabelID;
2279}
2280
2281/// RecordInlinedFnEnd - Indicate the end of inlined subroutine.
2282unsigned DwarfDebug::RecordInlinedFnEnd(DISubprogram &SP) {
Chris Lattner33adcfb2009-08-22 21:43:10 +00002283 if (!MAI->doesDwarfUsesInlineInfoSection())
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002284 return 0;
2285
2286 if (TimePassesIsEnabled)
2287 DebugTimer->startTimer();
2288
Devang Patele4b27562009-08-28 23:24:31 +00002289 MDNode *Node = SP.getNode();
Devang Patelbdf45cb2009-10-27 20:47:17 +00002290 ValueMap<MDNode *, SmallVector<DbgScope *, 8> >::iterator
Devang Patele4b27562009-08-28 23:24:31 +00002291 I = DbgConcreteScopeMap.find(Node);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002292
2293 if (I == DbgConcreteScopeMap.end()) {
2294 // FIXME: Can this situation actually happen? And if so, should it?
2295 if (TimePassesIsEnabled)
2296 DebugTimer->stopTimer();
2297
2298 return 0;
2299 }
2300
2301 SmallVector<DbgScope *, 8> &Scopes = I->second;
Devang Patel11a407f2009-06-15 21:45:50 +00002302 if (Scopes.empty()) {
2303 // Returned ID is 0 if this is unbalanced "end of inlined
2304 // scope". This could happen if optimizer eats dbg intrinsics
2305 // or "beginning of inlined scope" is not recoginized due to
2306 // missing location info. In such cases, ignore this region.end.
2307 return 0;
2308 }
2309
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002310 DbgScope *Scope = Scopes.back(); Scopes.pop_back();
2311 unsigned ID = MMI->NextLabelID();
2312 MMI->RecordUsedDbgLabel(ID);
2313 Scope->setEndLabelID(ID);
2314
2315 if (TimePassesIsEnabled)
2316 DebugTimer->stopTimer();
2317
2318 return ID;
2319}
2320
Bill Wendling829e67b2009-05-20 23:22:40 +00002321//===----------------------------------------------------------------------===//
2322// Emit Methods
2323//===----------------------------------------------------------------------===//
2324
Bill Wendling94d04b82009-05-20 23:21:38 +00002325/// SizeAndOffsetDie - Compute the size and offset of a DIE.
2326///
2327unsigned DwarfDebug::SizeAndOffsetDie(DIE *Die, unsigned Offset, bool Last) {
2328 // Get the children.
2329 const std::vector<DIE *> &Children = Die->getChildren();
2330
2331 // If not last sibling and has children then add sibling offset attribute.
2332 if (!Last && !Children.empty()) Die->AddSiblingOffset();
2333
2334 // Record the abbreviation.
2335 AssignAbbrevNumber(Die->getAbbrev());
2336
2337 // Get the abbreviation for this DIE.
2338 unsigned AbbrevNumber = Die->getAbbrevNumber();
2339 const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2340
2341 // Set DIE offset
2342 Die->setOffset(Offset);
2343
2344 // Start the size with the size of abbreviation code.
Chris Lattneraf76e592009-08-22 20:48:53 +00002345 Offset += MCAsmInfo::getULEB128Size(AbbrevNumber);
Bill Wendling94d04b82009-05-20 23:21:38 +00002346
2347 const SmallVector<DIEValue*, 32> &Values = Die->getValues();
2348 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
2349
2350 // Size the DIE attribute values.
2351 for (unsigned i = 0, N = Values.size(); i < N; ++i)
2352 // Size attribute value.
2353 Offset += Values[i]->SizeOf(TD, AbbrevData[i].getForm());
2354
2355 // Size the DIE children if any.
2356 if (!Children.empty()) {
2357 assert(Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes &&
2358 "Children flag not set");
2359
2360 for (unsigned j = 0, M = Children.size(); j < M; ++j)
2361 Offset = SizeAndOffsetDie(Children[j], Offset, (j + 1) == M);
2362
2363 // End of children marker.
2364 Offset += sizeof(int8_t);
2365 }
2366
2367 Die->setSize(Offset - Die->getOffset());
2368 return Offset;
2369}
2370
2371/// SizeAndOffsets - Compute the size and offset of all the DIEs.
2372///
2373void DwarfDebug::SizeAndOffsets() {
2374 // Compute size of compile unit header.
2375 static unsigned Offset =
2376 sizeof(int32_t) + // Length of Compilation Unit Info
2377 sizeof(int16_t) + // DWARF version number
2378 sizeof(int32_t) + // Offset Into Abbrev. Section
2379 sizeof(int8_t); // Pointer Size (in bytes)
2380
Devang Patel1dbc7712009-06-29 20:45:18 +00002381 SizeAndOffsetDie(ModuleCU->getDie(), Offset, true);
2382 CompileUnitOffsets[ModuleCU] = 0;
Bill Wendling94d04b82009-05-20 23:21:38 +00002383}
2384
2385/// EmitInitial - Emit initial Dwarf declarations. This is necessary for cc
2386/// tools to recognize the object file contains Dwarf information.
2387void DwarfDebug::EmitInitial() {
2388 // Check to see if we already emitted intial headers.
2389 if (didInitial) return;
2390 didInitial = true;
2391
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002392 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
Daniel Dunbarf612ff62009-09-19 20:40:05 +00002393
Bill Wendling94d04b82009-05-20 23:21:38 +00002394 // Dwarf sections base addresses.
Chris Lattner33adcfb2009-08-22 21:43:10 +00002395 if (MAI->doesDwarfRequireFrameSection()) {
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002396 Asm->OutStreamer.SwitchSection(TLOF.getDwarfFrameSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002397 EmitLabel("section_debug_frame", 0);
2398 }
2399
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002400 Asm->OutStreamer.SwitchSection(TLOF.getDwarfInfoSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002401 EmitLabel("section_info", 0);
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002402 Asm->OutStreamer.SwitchSection(TLOF.getDwarfAbbrevSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002403 EmitLabel("section_abbrev", 0);
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002404 Asm->OutStreamer.SwitchSection(TLOF.getDwarfARangesSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002405 EmitLabel("section_aranges", 0);
2406
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002407 if (const MCSection *LineInfoDirective = TLOF.getDwarfMacroInfoSection()) {
2408 Asm->OutStreamer.SwitchSection(LineInfoDirective);
Bill Wendling94d04b82009-05-20 23:21:38 +00002409 EmitLabel("section_macinfo", 0);
2410 }
2411
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002412 Asm->OutStreamer.SwitchSection(TLOF.getDwarfLineSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002413 EmitLabel("section_line", 0);
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002414 Asm->OutStreamer.SwitchSection(TLOF.getDwarfLocSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002415 EmitLabel("section_loc", 0);
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002416 Asm->OutStreamer.SwitchSection(TLOF.getDwarfPubNamesSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002417 EmitLabel("section_pubnames", 0);
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002418 Asm->OutStreamer.SwitchSection(TLOF.getDwarfStrSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002419 EmitLabel("section_str", 0);
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002420 Asm->OutStreamer.SwitchSection(TLOF.getDwarfRangesSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002421 EmitLabel("section_ranges", 0);
2422
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002423 Asm->OutStreamer.SwitchSection(TLOF.getTextSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002424 EmitLabel("text_begin", 0);
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002425 Asm->OutStreamer.SwitchSection(TLOF.getDataSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002426 EmitLabel("data_begin", 0);
2427}
2428
2429/// EmitDIE - Recusively Emits a debug information entry.
2430///
2431void DwarfDebug::EmitDIE(DIE *Die) {
2432 // Get the abbreviation for this DIE.
2433 unsigned AbbrevNumber = Die->getAbbrevNumber();
2434 const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2435
2436 Asm->EOL();
2437
2438 // Emit the code (index) for the abbreviation.
2439 Asm->EmitULEB128Bytes(AbbrevNumber);
2440
2441 if (Asm->isVerbose())
2442 Asm->EOL(std::string("Abbrev [" +
2443 utostr(AbbrevNumber) +
2444 "] 0x" + utohexstr(Die->getOffset()) +
2445 ":0x" + utohexstr(Die->getSize()) + " " +
2446 dwarf::TagString(Abbrev->getTag())));
2447 else
2448 Asm->EOL();
2449
2450 SmallVector<DIEValue*, 32> &Values = Die->getValues();
2451 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
2452
2453 // Emit the DIE attribute values.
2454 for (unsigned i = 0, N = Values.size(); i < N; ++i) {
2455 unsigned Attr = AbbrevData[i].getAttribute();
2456 unsigned Form = AbbrevData[i].getForm();
2457 assert(Form && "Too many attributes for DIE (check abbreviation)");
2458
2459 switch (Attr) {
2460 case dwarf::DW_AT_sibling:
2461 Asm->EmitInt32(Die->SiblingOffset());
2462 break;
2463 case dwarf::DW_AT_abstract_origin: {
2464 DIEEntry *E = cast<DIEEntry>(Values[i]);
2465 DIE *Origin = E->getEntry();
2466 unsigned Addr =
2467 CompileUnitOffsets[Die->getAbstractCompileUnit()] +
2468 Origin->getOffset();
2469
2470 Asm->EmitInt32(Addr);
2471 break;
2472 }
2473 default:
2474 // Emit an attribute using the defined form.
2475 Values[i]->EmitValue(this, Form);
2476 break;
2477 }
2478
2479 Asm->EOL(dwarf::AttributeString(Attr));
2480 }
2481
2482 // Emit the DIE children if any.
2483 if (Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes) {
2484 const std::vector<DIE *> &Children = Die->getChildren();
2485
2486 for (unsigned j = 0, M = Children.size(); j < M; ++j)
2487 EmitDIE(Children[j]);
2488
2489 Asm->EmitInt8(0); Asm->EOL("End Of Children Mark");
2490 }
2491}
2492
2493/// EmitDebugInfo / EmitDebugInfoPerCU - Emit the debug info section.
2494///
2495void DwarfDebug::EmitDebugInfoPerCU(CompileUnit *Unit) {
2496 DIE *Die = Unit->getDie();
2497
2498 // Emit the compile units header.
2499 EmitLabel("info_begin", Unit->getID());
2500
2501 // Emit size of content not including length itself
2502 unsigned ContentSize = Die->getSize() +
2503 sizeof(int16_t) + // DWARF version number
2504 sizeof(int32_t) + // Offset Into Abbrev. Section
2505 sizeof(int8_t) + // Pointer Size (in bytes)
2506 sizeof(int32_t); // FIXME - extra pad for gdb bug.
2507
2508 Asm->EmitInt32(ContentSize); Asm->EOL("Length of Compilation Unit Info");
2509 Asm->EmitInt16(dwarf::DWARF_VERSION); Asm->EOL("DWARF version number");
2510 EmitSectionOffset("abbrev_begin", "section_abbrev", 0, 0, true, false);
2511 Asm->EOL("Offset Into Abbrev. Section");
2512 Asm->EmitInt8(TD->getPointerSize()); Asm->EOL("Address Size (in bytes)");
2513
2514 EmitDIE(Die);
2515 // FIXME - extra padding for gdb bug.
2516 Asm->EmitInt8(0); Asm->EOL("Extra Pad For GDB");
2517 Asm->EmitInt8(0); Asm->EOL("Extra Pad For GDB");
2518 Asm->EmitInt8(0); Asm->EOL("Extra Pad For GDB");
2519 Asm->EmitInt8(0); Asm->EOL("Extra Pad For GDB");
2520 EmitLabel("info_end", Unit->getID());
2521
2522 Asm->EOL();
2523}
2524
2525void DwarfDebug::EmitDebugInfo() {
2526 // Start debug info section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002527 Asm->OutStreamer.SwitchSection(
2528 Asm->getObjFileLowering().getDwarfInfoSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002529
Devang Patel1dbc7712009-06-29 20:45:18 +00002530 EmitDebugInfoPerCU(ModuleCU);
Bill Wendling94d04b82009-05-20 23:21:38 +00002531}
2532
2533/// EmitAbbreviations - Emit the abbreviation section.
2534///
2535void DwarfDebug::EmitAbbreviations() const {
2536 // Check to see if it is worth the effort.
2537 if (!Abbreviations.empty()) {
2538 // Start the debug abbrev section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002539 Asm->OutStreamer.SwitchSection(
2540 Asm->getObjFileLowering().getDwarfAbbrevSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002541
2542 EmitLabel("abbrev_begin", 0);
2543
2544 // For each abbrevation.
2545 for (unsigned i = 0, N = Abbreviations.size(); i < N; ++i) {
2546 // Get abbreviation data
2547 const DIEAbbrev *Abbrev = Abbreviations[i];
2548
2549 // Emit the abbrevations code (base 1 index.)
2550 Asm->EmitULEB128Bytes(Abbrev->getNumber());
2551 Asm->EOL("Abbreviation Code");
2552
2553 // Emit the abbreviations data.
2554 Abbrev->Emit(Asm);
2555
2556 Asm->EOL();
2557 }
2558
2559 // Mark end of abbreviations.
2560 Asm->EmitULEB128Bytes(0); Asm->EOL("EOM(3)");
2561
2562 EmitLabel("abbrev_end", 0);
2563 Asm->EOL();
2564 }
2565}
2566
2567/// EmitEndOfLineMatrix - Emit the last address of the section and the end of
2568/// the line matrix.
2569///
2570void DwarfDebug::EmitEndOfLineMatrix(unsigned SectionEnd) {
2571 // Define last address of section.
2572 Asm->EmitInt8(0); Asm->EOL("Extended Op");
2573 Asm->EmitInt8(TD->getPointerSize() + 1); Asm->EOL("Op size");
2574 Asm->EmitInt8(dwarf::DW_LNE_set_address); Asm->EOL("DW_LNE_set_address");
2575 EmitReference("section_end", SectionEnd); Asm->EOL("Section end label");
2576
2577 // Mark end of matrix.
2578 Asm->EmitInt8(0); Asm->EOL("DW_LNE_end_sequence");
2579 Asm->EmitULEB128Bytes(1); Asm->EOL();
2580 Asm->EmitInt8(1); Asm->EOL();
2581}
2582
2583/// EmitDebugLines - Emit source line information.
2584///
2585void DwarfDebug::EmitDebugLines() {
2586 // If the target is using .loc/.file, the assembler will be emitting the
2587 // .debug_line table automatically.
Chris Lattner33adcfb2009-08-22 21:43:10 +00002588 if (MAI->hasDotLocAndDotFile())
Bill Wendling94d04b82009-05-20 23:21:38 +00002589 return;
2590
2591 // Minimum line delta, thus ranging from -10..(255-10).
2592 const int MinLineDelta = -(dwarf::DW_LNS_fixed_advance_pc + 1);
2593 // Maximum line delta, thus ranging from -10..(255-10).
2594 const int MaxLineDelta = 255 + MinLineDelta;
2595
2596 // Start the dwarf line section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002597 Asm->OutStreamer.SwitchSection(
2598 Asm->getObjFileLowering().getDwarfLineSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002599
2600 // Construct the section header.
2601 EmitDifference("line_end", 0, "line_begin", 0, true);
2602 Asm->EOL("Length of Source Line Info");
2603 EmitLabel("line_begin", 0);
2604
2605 Asm->EmitInt16(dwarf::DWARF_VERSION); Asm->EOL("DWARF version number");
2606
2607 EmitDifference("line_prolog_end", 0, "line_prolog_begin", 0, true);
2608 Asm->EOL("Prolog Length");
2609 EmitLabel("line_prolog_begin", 0);
2610
2611 Asm->EmitInt8(1); Asm->EOL("Minimum Instruction Length");
2612
2613 Asm->EmitInt8(1); Asm->EOL("Default is_stmt_start flag");
2614
2615 Asm->EmitInt8(MinLineDelta); Asm->EOL("Line Base Value (Special Opcodes)");
2616
2617 Asm->EmitInt8(MaxLineDelta); Asm->EOL("Line Range Value (Special Opcodes)");
2618
2619 Asm->EmitInt8(-MinLineDelta); Asm->EOL("Special Opcode Base");
2620
2621 // Line number standard opcode encodings argument count
2622 Asm->EmitInt8(0); Asm->EOL("DW_LNS_copy arg count");
2623 Asm->EmitInt8(1); Asm->EOL("DW_LNS_advance_pc arg count");
2624 Asm->EmitInt8(1); Asm->EOL("DW_LNS_advance_line arg count");
2625 Asm->EmitInt8(1); Asm->EOL("DW_LNS_set_file arg count");
2626 Asm->EmitInt8(1); Asm->EOL("DW_LNS_set_column arg count");
2627 Asm->EmitInt8(0); Asm->EOL("DW_LNS_negate_stmt arg count");
2628 Asm->EmitInt8(0); Asm->EOL("DW_LNS_set_basic_block arg count");
2629 Asm->EmitInt8(0); Asm->EOL("DW_LNS_const_add_pc arg count");
2630 Asm->EmitInt8(1); Asm->EOL("DW_LNS_fixed_advance_pc arg count");
2631
2632 // Emit directories.
2633 for (unsigned DI = 1, DE = getNumSourceDirectories()+1; DI != DE; ++DI) {
2634 Asm->EmitString(getSourceDirectoryName(DI));
2635 Asm->EOL("Directory");
2636 }
2637
2638 Asm->EmitInt8(0); Asm->EOL("End of directories");
2639
2640 // Emit files.
2641 for (unsigned SI = 1, SE = getNumSourceIds()+1; SI != SE; ++SI) {
2642 // Remember source id starts at 1.
2643 std::pair<unsigned, unsigned> Id = getSourceDirectoryAndFileIds(SI);
2644 Asm->EmitString(getSourceFileName(Id.second));
2645 Asm->EOL("Source");
2646 Asm->EmitULEB128Bytes(Id.first);
2647 Asm->EOL("Directory #");
2648 Asm->EmitULEB128Bytes(0);
2649 Asm->EOL("Mod date");
2650 Asm->EmitULEB128Bytes(0);
2651 Asm->EOL("File size");
2652 }
2653
2654 Asm->EmitInt8(0); Asm->EOL("End of files");
2655
2656 EmitLabel("line_prolog_end", 0);
2657
2658 // A sequence for each text section.
2659 unsigned SecSrcLinesSize = SectionSourceLines.size();
2660
2661 for (unsigned j = 0; j < SecSrcLinesSize; ++j) {
2662 // Isolate current sections line info.
2663 const std::vector<SrcLineInfo> &LineInfos = SectionSourceLines[j];
2664
Chris Lattner93b6db32009-08-08 23:39:42 +00002665 /*if (Asm->isVerbose()) {
Chris Lattnera87dea42009-07-31 18:48:30 +00002666 const MCSection *S = SectionMap[j + 1];
Chris Lattner33adcfb2009-08-22 21:43:10 +00002667 O << '\t' << MAI->getCommentString() << " Section"
Bill Wendling94d04b82009-05-20 23:21:38 +00002668 << S->getName() << '\n';
Chris Lattner93b6db32009-08-08 23:39:42 +00002669 }*/
2670 Asm->EOL();
Bill Wendling94d04b82009-05-20 23:21:38 +00002671
2672 // Dwarf assumes we start with first line of first source file.
2673 unsigned Source = 1;
2674 unsigned Line = 1;
2675
2676 // Construct rows of the address, source, line, column matrix.
2677 for (unsigned i = 0, N = LineInfos.size(); i < N; ++i) {
2678 const SrcLineInfo &LineInfo = LineInfos[i];
2679 unsigned LabelID = MMI->MappedLabel(LineInfo.getLabelID());
2680 if (!LabelID) continue;
2681
Caroline Ticec6f9d622009-09-11 18:25:54 +00002682 if (LineInfo.getLine() == 0) continue;
2683
Bill Wendling94d04b82009-05-20 23:21:38 +00002684 if (!Asm->isVerbose())
2685 Asm->EOL();
2686 else {
2687 std::pair<unsigned, unsigned> SourceID =
2688 getSourceDirectoryAndFileIds(LineInfo.getSourceID());
Chris Lattner33adcfb2009-08-22 21:43:10 +00002689 O << '\t' << MAI->getCommentString() << ' '
Bill Wendling94d04b82009-05-20 23:21:38 +00002690 << getSourceDirectoryName(SourceID.first) << ' '
2691 << getSourceFileName(SourceID.second)
2692 <<" :" << utostr_32(LineInfo.getLine()) << '\n';
2693 }
2694
2695 // Define the line address.
2696 Asm->EmitInt8(0); Asm->EOL("Extended Op");
2697 Asm->EmitInt8(TD->getPointerSize() + 1); Asm->EOL("Op size");
2698 Asm->EmitInt8(dwarf::DW_LNE_set_address); Asm->EOL("DW_LNE_set_address");
2699 EmitReference("label", LabelID); Asm->EOL("Location label");
2700
2701 // If change of source, then switch to the new source.
2702 if (Source != LineInfo.getSourceID()) {
2703 Source = LineInfo.getSourceID();
2704 Asm->EmitInt8(dwarf::DW_LNS_set_file); Asm->EOL("DW_LNS_set_file");
2705 Asm->EmitULEB128Bytes(Source); Asm->EOL("New Source");
2706 }
2707
2708 // If change of line.
2709 if (Line != LineInfo.getLine()) {
2710 // Determine offset.
2711 int Offset = LineInfo.getLine() - Line;
2712 int Delta = Offset - MinLineDelta;
2713
2714 // Update line.
2715 Line = LineInfo.getLine();
2716
2717 // If delta is small enough and in range...
2718 if (Delta >= 0 && Delta < (MaxLineDelta - 1)) {
2719 // ... then use fast opcode.
2720 Asm->EmitInt8(Delta - MinLineDelta); Asm->EOL("Line Delta");
2721 } else {
2722 // ... otherwise use long hand.
2723 Asm->EmitInt8(dwarf::DW_LNS_advance_line);
2724 Asm->EOL("DW_LNS_advance_line");
2725 Asm->EmitSLEB128Bytes(Offset); Asm->EOL("Line Offset");
2726 Asm->EmitInt8(dwarf::DW_LNS_copy); Asm->EOL("DW_LNS_copy");
2727 }
2728 } else {
2729 // Copy the previous row (different address or source)
2730 Asm->EmitInt8(dwarf::DW_LNS_copy); Asm->EOL("DW_LNS_copy");
2731 }
2732 }
2733
2734 EmitEndOfLineMatrix(j + 1);
2735 }
2736
2737 if (SecSrcLinesSize == 0)
2738 // Because we're emitting a debug_line section, we still need a line
2739 // table. The linker and friends expect it to exist. If there's nothing to
2740 // put into it, emit an empty table.
2741 EmitEndOfLineMatrix(1);
2742
2743 EmitLabel("line_end", 0);
2744 Asm->EOL();
2745}
2746
2747/// EmitCommonDebugFrame - Emit common frame info into a debug frame section.
2748///
2749void DwarfDebug::EmitCommonDebugFrame() {
Chris Lattner33adcfb2009-08-22 21:43:10 +00002750 if (!MAI->doesDwarfRequireFrameSection())
Bill Wendling94d04b82009-05-20 23:21:38 +00002751 return;
2752
2753 int stackGrowth =
2754 Asm->TM.getFrameInfo()->getStackGrowthDirection() ==
2755 TargetFrameInfo::StackGrowsUp ?
2756 TD->getPointerSize() : -TD->getPointerSize();
2757
2758 // Start the dwarf frame section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002759 Asm->OutStreamer.SwitchSection(
2760 Asm->getObjFileLowering().getDwarfFrameSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002761
2762 EmitLabel("debug_frame_common", 0);
2763 EmitDifference("debug_frame_common_end", 0,
2764 "debug_frame_common_begin", 0, true);
2765 Asm->EOL("Length of Common Information Entry");
2766
2767 EmitLabel("debug_frame_common_begin", 0);
2768 Asm->EmitInt32((int)dwarf::DW_CIE_ID);
2769 Asm->EOL("CIE Identifier Tag");
2770 Asm->EmitInt8(dwarf::DW_CIE_VERSION);
2771 Asm->EOL("CIE Version");
2772 Asm->EmitString("");
2773 Asm->EOL("CIE Augmentation");
2774 Asm->EmitULEB128Bytes(1);
2775 Asm->EOL("CIE Code Alignment Factor");
2776 Asm->EmitSLEB128Bytes(stackGrowth);
2777 Asm->EOL("CIE Data Alignment Factor");
2778 Asm->EmitInt8(RI->getDwarfRegNum(RI->getRARegister(), false));
2779 Asm->EOL("CIE RA Column");
2780
2781 std::vector<MachineMove> Moves;
2782 RI->getInitialFrameState(Moves);
2783
2784 EmitFrameMoves(NULL, 0, Moves, false);
2785
2786 Asm->EmitAlignment(2, 0, 0, false);
2787 EmitLabel("debug_frame_common_end", 0);
2788
2789 Asm->EOL();
2790}
2791
2792/// EmitFunctionDebugFrame - Emit per function frame info into a debug frame
2793/// section.
2794void
2795DwarfDebug::EmitFunctionDebugFrame(const FunctionDebugFrameInfo&DebugFrameInfo){
Chris Lattner33adcfb2009-08-22 21:43:10 +00002796 if (!MAI->doesDwarfRequireFrameSection())
Bill Wendling94d04b82009-05-20 23:21:38 +00002797 return;
2798
2799 // Start the dwarf frame section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002800 Asm->OutStreamer.SwitchSection(
2801 Asm->getObjFileLowering().getDwarfFrameSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002802
2803 EmitDifference("debug_frame_end", DebugFrameInfo.Number,
2804 "debug_frame_begin", DebugFrameInfo.Number, true);
2805 Asm->EOL("Length of Frame Information Entry");
2806
2807 EmitLabel("debug_frame_begin", DebugFrameInfo.Number);
2808
2809 EmitSectionOffset("debug_frame_common", "section_debug_frame",
2810 0, 0, true, false);
2811 Asm->EOL("FDE CIE offset");
2812
2813 EmitReference("func_begin", DebugFrameInfo.Number);
2814 Asm->EOL("FDE initial location");
2815 EmitDifference("func_end", DebugFrameInfo.Number,
2816 "func_begin", DebugFrameInfo.Number);
2817 Asm->EOL("FDE address range");
2818
2819 EmitFrameMoves("func_begin", DebugFrameInfo.Number, DebugFrameInfo.Moves,
2820 false);
2821
2822 Asm->EmitAlignment(2, 0, 0, false);
2823 EmitLabel("debug_frame_end", DebugFrameInfo.Number);
2824
2825 Asm->EOL();
2826}
2827
2828void DwarfDebug::EmitDebugPubNamesPerCU(CompileUnit *Unit) {
2829 EmitDifference("pubnames_end", Unit->getID(),
2830 "pubnames_begin", Unit->getID(), true);
2831 Asm->EOL("Length of Public Names Info");
2832
2833 EmitLabel("pubnames_begin", Unit->getID());
2834
2835 Asm->EmitInt16(dwarf::DWARF_VERSION); Asm->EOL("DWARF Version");
2836
2837 EmitSectionOffset("info_begin", "section_info",
2838 Unit->getID(), 0, true, false);
2839 Asm->EOL("Offset of Compilation Unit Info");
2840
2841 EmitDifference("info_end", Unit->getID(), "info_begin", Unit->getID(),
2842 true);
2843 Asm->EOL("Compilation Unit Length");
2844
2845 StringMap<DIE*> &Globals = Unit->getGlobals();
2846 for (StringMap<DIE*>::const_iterator
2847 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2848 const char *Name = GI->getKeyData();
2849 DIE * Entity = GI->second;
2850
2851 Asm->EmitInt32(Entity->getOffset()); Asm->EOL("DIE offset");
2852 Asm->EmitString(Name, strlen(Name)); Asm->EOL("External Name");
2853 }
2854
2855 Asm->EmitInt32(0); Asm->EOL("End Mark");
2856 EmitLabel("pubnames_end", Unit->getID());
2857
2858 Asm->EOL();
2859}
2860
2861/// EmitDebugPubNames - Emit visible names into a debug pubnames section.
2862///
2863void DwarfDebug::EmitDebugPubNames() {
2864 // Start the dwarf pubnames section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002865 Asm->OutStreamer.SwitchSection(
2866 Asm->getObjFileLowering().getDwarfPubNamesSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002867
Devang Patel1dbc7712009-06-29 20:45:18 +00002868 EmitDebugPubNamesPerCU(ModuleCU);
Bill Wendling94d04b82009-05-20 23:21:38 +00002869}
2870
2871/// EmitDebugStr - Emit visible names into a debug str section.
2872///
2873void DwarfDebug::EmitDebugStr() {
2874 // Check to see if it is worth the effort.
2875 if (!StringPool.empty()) {
2876 // Start the dwarf str section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002877 Asm->OutStreamer.SwitchSection(
2878 Asm->getObjFileLowering().getDwarfStrSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002879
2880 // For each of strings in the string pool.
2881 for (unsigned StringID = 1, N = StringPool.size();
2882 StringID <= N; ++StringID) {
2883 // Emit a label for reference from debug information entries.
2884 EmitLabel("string", StringID);
2885
2886 // Emit the string itself.
2887 const std::string &String = StringPool[StringID];
2888 Asm->EmitString(String); Asm->EOL();
2889 }
2890
2891 Asm->EOL();
2892 }
2893}
2894
2895/// EmitDebugLoc - Emit visible names into a debug loc section.
2896///
2897void DwarfDebug::EmitDebugLoc() {
2898 // Start the dwarf loc section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002899 Asm->OutStreamer.SwitchSection(
2900 Asm->getObjFileLowering().getDwarfLocSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002901 Asm->EOL();
2902}
2903
2904/// EmitDebugARanges - Emit visible names into a debug aranges section.
2905///
2906void DwarfDebug::EmitDebugARanges() {
2907 // Start the dwarf aranges section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002908 Asm->OutStreamer.SwitchSection(
2909 Asm->getObjFileLowering().getDwarfARangesSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002910
2911 // FIXME - Mock up
2912#if 0
2913 CompileUnit *Unit = GetBaseCompileUnit();
2914
2915 // Don't include size of length
2916 Asm->EmitInt32(0x1c); Asm->EOL("Length of Address Ranges Info");
2917
2918 Asm->EmitInt16(dwarf::DWARF_VERSION); Asm->EOL("Dwarf Version");
2919
2920 EmitReference("info_begin", Unit->getID());
2921 Asm->EOL("Offset of Compilation Unit Info");
2922
2923 Asm->EmitInt8(TD->getPointerSize()); Asm->EOL("Size of Address");
2924
2925 Asm->EmitInt8(0); Asm->EOL("Size of Segment Descriptor");
2926
2927 Asm->EmitInt16(0); Asm->EOL("Pad (1)");
2928 Asm->EmitInt16(0); Asm->EOL("Pad (2)");
2929
2930 // Range 1
2931 EmitReference("text_begin", 0); Asm->EOL("Address");
2932 EmitDifference("text_end", 0, "text_begin", 0, true); Asm->EOL("Length");
2933
2934 Asm->EmitInt32(0); Asm->EOL("EOM (1)");
2935 Asm->EmitInt32(0); Asm->EOL("EOM (2)");
2936#endif
2937
2938 Asm->EOL();
2939}
2940
2941/// EmitDebugRanges - Emit visible names into a debug ranges section.
2942///
2943void DwarfDebug::EmitDebugRanges() {
2944 // Start the dwarf ranges section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002945 Asm->OutStreamer.SwitchSection(
2946 Asm->getObjFileLowering().getDwarfRangesSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002947 Asm->EOL();
2948}
2949
2950/// EmitDebugMacInfo - Emit visible names into a debug macinfo section.
2951///
2952void DwarfDebug::EmitDebugMacInfo() {
Daniel Dunbarf612ff62009-09-19 20:40:05 +00002953 if (const MCSection *LineInfo =
Chris Lattner18a4c162009-08-02 07:24:22 +00002954 Asm->getObjFileLowering().getDwarfMacroInfoSection()) {
Bill Wendling94d04b82009-05-20 23:21:38 +00002955 // Start the dwarf macinfo section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002956 Asm->OutStreamer.SwitchSection(LineInfo);
Bill Wendling94d04b82009-05-20 23:21:38 +00002957 Asm->EOL();
2958 }
2959}
2960
2961/// EmitDebugInlineInfo - Emit inline info using following format.
2962/// Section Header:
2963/// 1. length of section
2964/// 2. Dwarf version number
2965/// 3. address size.
2966///
2967/// Entries (one "entry" for each function that was inlined):
2968///
2969/// 1. offset into __debug_str section for MIPS linkage name, if exists;
2970/// otherwise offset into __debug_str for regular function name.
2971/// 2. offset into __debug_str section for regular function name.
2972/// 3. an unsigned LEB128 number indicating the number of distinct inlining
2973/// instances for the function.
2974///
2975/// The rest of the entry consists of a {die_offset, low_pc} pair for each
2976/// inlined instance; the die_offset points to the inlined_subroutine die in the
2977/// __debug_info section, and the low_pc is the starting address for the
2978/// inlining instance.
2979void DwarfDebug::EmitDebugInlineInfo() {
Chris Lattner33adcfb2009-08-22 21:43:10 +00002980 if (!MAI->doesDwarfUsesInlineInfoSection())
Bill Wendling94d04b82009-05-20 23:21:38 +00002981 return;
2982
Devang Patel1dbc7712009-06-29 20:45:18 +00002983 if (!ModuleCU)
Bill Wendling94d04b82009-05-20 23:21:38 +00002984 return;
2985
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002986 Asm->OutStreamer.SwitchSection(
2987 Asm->getObjFileLowering().getDwarfDebugInlineSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002988 Asm->EOL();
2989 EmitDifference("debug_inlined_end", 1,
2990 "debug_inlined_begin", 1, true);
2991 Asm->EOL("Length of Debug Inlined Information Entry");
2992
2993 EmitLabel("debug_inlined_begin", 1);
2994
2995 Asm->EmitInt16(dwarf::DWARF_VERSION); Asm->EOL("Dwarf Version");
2996 Asm->EmitInt8(TD->getPointerSize()); Asm->EOL("Address Size (in bytes)");
2997
Devang Patelbdf45cb2009-10-27 20:47:17 +00002998 for (ValueMap<MDNode *, SmallVector<unsigned, 4> >::iterator
Bill Wendling94d04b82009-05-20 23:21:38 +00002999 I = InlineInfo.begin(), E = InlineInfo.end(); I != E; ++I) {
Devang Patele4b27562009-08-28 23:24:31 +00003000 MDNode *Node = I->first;
Bill Wendling94d04b82009-05-20 23:21:38 +00003001 SmallVector<unsigned, 4> &Labels = I->second;
Devang Patele4b27562009-08-28 23:24:31 +00003002 DISubprogram SP(Node);
Devang Patel5ccdd102009-09-29 18:40:58 +00003003 const char *LName = SP.getLinkageName();
3004 const char *Name = SP.getName();
Bill Wendling94d04b82009-05-20 23:21:38 +00003005
Devang Patel5ccdd102009-09-29 18:40:58 +00003006 if (!LName)
Devang Patel53cb17d2009-07-16 01:01:22 +00003007 Asm->EmitString(Name);
3008 else {
Chris Lattner6c2f9e12009-08-19 05:49:37 +00003009 // Skip special LLVM prefix that is used to inform the asm printer to not
3010 // emit usual symbol prefix before the symbol name. This happens for
3011 // Objective-C symbol names and symbol whose name is replaced using GCC's
3012 // __asm__ attribute.
Devang Patel53cb17d2009-07-16 01:01:22 +00003013 if (LName[0] == 1)
3014 LName = &LName[1];
3015 Asm->EmitString(LName);
3016 }
Bill Wendling94d04b82009-05-20 23:21:38 +00003017 Asm->EOL("MIPS linkage name");
3018
3019 Asm->EmitString(Name); Asm->EOL("Function name");
3020
3021 Asm->EmitULEB128Bytes(Labels.size()); Asm->EOL("Inline count");
3022
3023 for (SmallVector<unsigned, 4>::iterator LI = Labels.begin(),
3024 LE = Labels.end(); LI != LE; ++LI) {
Devang Patele4b27562009-08-28 23:24:31 +00003025 DIE *SP = ModuleCU->getDieMapSlotFor(Node);
Bill Wendling94d04b82009-05-20 23:21:38 +00003026 Asm->EmitInt32(SP->getOffset()); Asm->EOL("DIE offset");
3027
3028 if (TD->getPointerSize() == sizeof(int32_t))
Chris Lattner33adcfb2009-08-22 21:43:10 +00003029 O << MAI->getData32bitsDirective();
Bill Wendling94d04b82009-05-20 23:21:38 +00003030 else
Chris Lattner33adcfb2009-08-22 21:43:10 +00003031 O << MAI->getData64bitsDirective();
Bill Wendling94d04b82009-05-20 23:21:38 +00003032
3033 PrintLabelName("label", *LI); Asm->EOL("low_pc");
3034 }
3035 }
3036
3037 EmitLabel("debug_inlined_end", 1);
3038 Asm->EOL();
3039}