blob: 674304e7b36112f82cbc8b06bb40dea93a8cb54e [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();
Devang Patelc416d3b2009-11-04 19:37:40 +00001141 uint64_t FieldSize = Size;
1142 if (DT.getTypeDerivedFrom().getTag() != dwarf::DW_TAG_array_type)
1143 FieldSize = DT.getOriginalTypeSize();
Bill Wendling0310d762009-05-15 09:23:25 +00001144
1145 if (Size != FieldSize) {
1146 // Handle bitfield.
1147 AddUInt(MemberDie, dwarf::DW_AT_byte_size, 0, DT.getOriginalTypeSize()>>3);
1148 AddUInt(MemberDie, dwarf::DW_AT_bit_size, 0, DT.getSizeInBits());
1149
1150 uint64_t Offset = DT.getOffsetInBits();
1151 uint64_t FieldOffset = Offset;
1152 uint64_t AlignMask = ~(DT.getAlignInBits() - 1);
1153 uint64_t HiMark = (Offset + FieldSize) & AlignMask;
1154 FieldOffset = (HiMark - FieldSize);
1155 Offset -= FieldOffset;
1156
1157 // Maybe we need to work from the other end.
1158 if (TD->isLittleEndian()) Offset = FieldSize - (Offset + Size);
1159 AddUInt(MemberDie, dwarf::DW_AT_bit_offset, 0, Offset);
1160 }
1161
1162 DIEBlock *Block = new DIEBlock();
1163 AddUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
1164 AddUInt(Block, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits() >> 3);
1165 AddBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, Block);
1166
1167 if (DT.isProtected())
1168 AddUInt(MemberDie, dwarf::DW_AT_accessibility, 0,
1169 dwarf::DW_ACCESS_protected);
1170 else if (DT.isPrivate())
1171 AddUInt(MemberDie, dwarf::DW_AT_accessibility, 0,
1172 dwarf::DW_ACCESS_private);
1173
1174 return MemberDie;
1175}
1176
1177/// CreateSubprogramDIE - Create new DIE using SP.
1178DIE *DwarfDebug::CreateSubprogramDIE(CompileUnit *DW_Unit,
1179 const DISubprogram &SP,
Bill Wendling6679ee42009-05-18 22:02:36 +00001180 bool IsConstructor,
1181 bool IsInlined) {
Bill Wendling0310d762009-05-15 09:23:25 +00001182 DIE *SPDie = new DIE(dwarf::DW_TAG_subprogram);
1183
Devang Patel5ccdd102009-09-29 18:40:58 +00001184 const char * Name = SP.getName();
Bill Wendling0310d762009-05-15 09:23:25 +00001185 AddString(SPDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1186
Devang Patel5ccdd102009-09-29 18:40:58 +00001187 const char *LinkageName = SP.getLinkageName();
1188 if (LinkageName) {
Devang Patel53cb17d2009-07-16 01:01:22 +00001189 // Skip special LLVM prefix that is used to inform the asm printer to not emit
1190 // usual symbol prefix before the symbol name. This happens for Objective-C
1191 // symbol names and symbol whose name is replaced using GCC's __asm__ attribute.
1192 if (LinkageName[0] == 1)
1193 LinkageName = &LinkageName[1];
Bill Wendling0310d762009-05-15 09:23:25 +00001194 AddString(SPDie, dwarf::DW_AT_MIPS_linkage_name, dwarf::DW_FORM_string,
Devang Patel1a8d2d22009-07-14 00:55:28 +00001195 LinkageName);
Devang Patel53cb17d2009-07-16 01:01:22 +00001196 }
Bill Wendling0310d762009-05-15 09:23:25 +00001197 AddSourceLine(SPDie, &SP);
1198
1199 DICompositeType SPTy = SP.getType();
1200 DIArray Args = SPTy.getTypeArray();
1201
1202 // Add prototyped tag, if C or ObjC.
1203 unsigned Lang = SP.getCompileUnit().getLanguage();
1204 if (Lang == dwarf::DW_LANG_C99 || Lang == dwarf::DW_LANG_C89 ||
1205 Lang == dwarf::DW_LANG_ObjC)
1206 AddUInt(SPDie, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
1207
1208 // Add Return Type.
1209 unsigned SPTag = SPTy.getTag();
1210 if (!IsConstructor) {
1211 if (Args.isNull() || SPTag != dwarf::DW_TAG_subroutine_type)
1212 AddType(DW_Unit, SPDie, SPTy);
1213 else
Devang Patele4b27562009-08-28 23:24:31 +00001214 AddType(DW_Unit, SPDie, DIType(Args.getElement(0).getNode()));
Bill Wendling0310d762009-05-15 09:23:25 +00001215 }
1216
1217 if (!SP.isDefinition()) {
1218 AddUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1219
1220 // Add arguments. Do not add arguments for subprogram definition. They will
1221 // be handled through RecordVariable.
1222 if (SPTag == dwarf::DW_TAG_subroutine_type)
1223 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
1224 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
Devang Patele4b27562009-08-28 23:24:31 +00001225 AddType(DW_Unit, Arg, DIType(Args.getElement(i).getNode()));
Bill Wendling0310d762009-05-15 09:23:25 +00001226 AddUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1); // ??
1227 SPDie->AddChild(Arg);
1228 }
1229 }
1230
Bill Wendling6679ee42009-05-18 22:02:36 +00001231 if (!SP.isLocalToUnit() && !IsInlined)
Bill Wendling0310d762009-05-15 09:23:25 +00001232 AddUInt(SPDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
1233
1234 // DW_TAG_inlined_subroutine may refer to this DIE.
Devang Patele4b27562009-08-28 23:24:31 +00001235 DIE *&Slot = DW_Unit->getDieMapSlotFor(SP.getNode());
Bill Wendling0310d762009-05-15 09:23:25 +00001236 Slot = SPDie;
1237 return SPDie;
1238}
1239
1240/// FindCompileUnit - Get the compile unit for the given descriptor.
1241///
1242CompileUnit &DwarfDebug::FindCompileUnit(DICompileUnit Unit) const {
1243 DenseMap<Value *, CompileUnit *>::const_iterator I =
Devang Patele4b27562009-08-28 23:24:31 +00001244 CompileUnitMap.find(Unit.getNode());
Bill Wendling0310d762009-05-15 09:23:25 +00001245 assert(I != CompileUnitMap.end() && "Missing compile unit.");
1246 return *I->second;
1247}
1248
Bill Wendling995f80a2009-05-20 23:24:48 +00001249/// CreateDbgScopeVariable - Create a new scope variable.
Bill Wendling0310d762009-05-15 09:23:25 +00001250///
Bill Wendling995f80a2009-05-20 23:24:48 +00001251DIE *DwarfDebug::CreateDbgScopeVariable(DbgVariable *DV, CompileUnit *Unit) {
Bill Wendling0310d762009-05-15 09:23:25 +00001252 // Get the descriptor.
1253 const DIVariable &VD = DV->getVariable();
Devang Patel1b845972009-11-03 18:30:27 +00001254 const char *Name = VD.getName();
1255 if (!Name)
1256 return NULL;
Bill Wendling0310d762009-05-15 09:23:25 +00001257
1258 // Translate tag to proper Dwarf tag. The result variable is dropped for
1259 // now.
1260 unsigned Tag;
1261 switch (VD.getTag()) {
1262 case dwarf::DW_TAG_return_variable:
1263 return NULL;
1264 case dwarf::DW_TAG_arg_variable:
1265 Tag = dwarf::DW_TAG_formal_parameter;
1266 break;
1267 case dwarf::DW_TAG_auto_variable: // fall thru
1268 default:
1269 Tag = dwarf::DW_TAG_variable;
1270 break;
1271 }
1272
1273 // Define variable debug information entry.
1274 DIE *VariableDie = new DIE(Tag);
Bill Wendling0310d762009-05-15 09:23:25 +00001275 AddString(VariableDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1276
1277 // Add source line info if available.
1278 AddSourceLine(VariableDie, &VD);
1279
1280 // Add variable type.
Mike Stump3e4c9bd2009-09-30 00:08:22 +00001281 // FIXME: isBlockByrefVariable should be reformulated in terms of complex addresses instead.
Caroline Ticedc8f6042009-08-31 21:19:37 +00001282 if (VD.isBlockByrefVariable())
1283 AddType(Unit, VariableDie, GetBlockByrefType(VD.getType(), Name));
1284 else
1285 AddType(Unit, VariableDie, VD.getType());
Bill Wendling0310d762009-05-15 09:23:25 +00001286
1287 // Add variable address.
Bill Wendling1180c782009-05-18 23:08:55 +00001288 if (!DV->isInlinedFnVar()) {
1289 // Variables for abstract instances of inlined functions don't get a
1290 // location.
1291 MachineLocation Location;
1292 Location.set(RI->getFrameRegister(*MF),
1293 RI->getFrameIndexOffset(*MF, DV->getFrameIndex()));
Caroline Ticedc8f6042009-08-31 21:19:37 +00001294
Mike Stump3e4c9bd2009-09-30 00:08:22 +00001295
1296 if (VD.hasComplexAddress())
1297 AddComplexAddress(DV, VariableDie, dwarf::DW_AT_location, Location);
1298 else if (VD.isBlockByrefVariable())
Mike Stumpee4b8a72009-09-24 23:11:08 +00001299 AddBlockByrefAddress(DV, VariableDie, dwarf::DW_AT_location, Location);
Caroline Ticedc8f6042009-08-31 21:19:37 +00001300 else
1301 AddAddress(VariableDie, dwarf::DW_AT_location, Location);
Bill Wendling1180c782009-05-18 23:08:55 +00001302 }
Bill Wendling0310d762009-05-15 09:23:25 +00001303
1304 return VariableDie;
1305}
1306
1307/// getOrCreateScope - Returns the scope associated with the given descriptor.
1308///
Devang Patelc90aefe2009-10-14 21:08:09 +00001309DbgScope *DwarfDebug::getDbgScope(MDNode *N, const MachineInstr *MI,
1310 MDNode *InlinedAt) {
Devang Patelbdf45cb2009-10-27 20:47:17 +00001311 ValueMap<MDNode *, DbgScope *>::iterator VI = DbgScopeMap.find(N);
1312 if (VI != DbgScopeMap.end())
1313 return VI->second;
Devang Patelaf9e8472009-10-01 20:31:14 +00001314
1315 DbgScope *Parent = NULL;
1316
Devang Patelc90aefe2009-10-14 21:08:09 +00001317 if (InlinedAt) {
1318 DILocation IL(InlinedAt);
1319 assert (!IL.isNull() && "Invalid InlindAt location!");
Devang Patelbdf45cb2009-10-27 20:47:17 +00001320 ValueMap<MDNode *, DbgScope *>::iterator DSI =
Devang Patelc90aefe2009-10-14 21:08:09 +00001321 DbgScopeMap.find(IL.getScope().getNode());
1322 assert (DSI != DbgScopeMap.end() && "Unable to find InlineAt scope!");
1323 Parent = DSI->second;
1324 } else {
1325 DIDescriptor Scope(N);
1326 if (Scope.isCompileUnit()) {
1327 return NULL;
1328 } else if (Scope.isSubprogram()) {
1329 DISubprogram SP(N);
1330 DIDescriptor ParentDesc = SP.getContext();
1331 if (!ParentDesc.isNull() && !ParentDesc.isCompileUnit())
1332 Parent = getDbgScope(ParentDesc.getNode(), MI, InlinedAt);
1333 } else if (Scope.isLexicalBlock()) {
1334 DILexicalBlock DB(N);
1335 DIDescriptor ParentDesc = DB.getContext();
1336 if (!ParentDesc.isNull())
1337 Parent = getDbgScope(ParentDesc.getNode(), MI, InlinedAt);
1338 } else
1339 assert (0 && "Unexpected scope info");
1340 }
Devang Patelaf9e8472009-10-01 20:31:14 +00001341
Devang Patelbdf45cb2009-10-27 20:47:17 +00001342 DbgScope *NScope = new DbgScope(Parent, DIDescriptor(N), InlinedAt);
1343 NScope->setFirstInsn(MI);
Devang Patelaf9e8472009-10-01 20:31:14 +00001344
1345 if (Parent)
Devang Patelbdf45cb2009-10-27 20:47:17 +00001346 Parent->AddScope(NScope);
Devang Patelaf9e8472009-10-01 20:31:14 +00001347 else
1348 // First function is top level function.
Devang Patelaf9e8472009-10-01 20:31:14 +00001349 if (!FunctionDbgScope)
Devang Patelbdf45cb2009-10-27 20:47:17 +00001350 FunctionDbgScope = NScope;
Devang Patelaf9e8472009-10-01 20:31:14 +00001351
Devang Patelbdf45cb2009-10-27 20:47:17 +00001352 DbgScopeMap.insert(std::make_pair(N, NScope));
1353 return NScope;
Devang Patelaf9e8472009-10-01 20:31:14 +00001354}
1355
1356
1357/// getOrCreateScope - Returns the scope associated with the given descriptor.
1358/// FIXME - Remove this method.
Devang Patele4b27562009-08-28 23:24:31 +00001359DbgScope *DwarfDebug::getOrCreateScope(MDNode *N) {
1360 DbgScope *&Slot = DbgScopeMap[N];
Bill Wendling0310d762009-05-15 09:23:25 +00001361 if (Slot) return Slot;
1362
1363 DbgScope *Parent = NULL;
Devang Patel5e005d82009-08-31 22:00:15 +00001364 DILexicalBlock Block(N);
Bill Wendling0310d762009-05-15 09:23:25 +00001365
Bill Wendling8fff19b2009-06-01 20:18:46 +00001366 // Don't create a new scope if we already created one for an inlined function.
Devang Patele4b27562009-08-28 23:24:31 +00001367 DenseMap<const MDNode *, DbgScope *>::iterator
1368 II = AbstractInstanceRootMap.find(N);
Bill Wendling8fff19b2009-06-01 20:18:46 +00001369 if (II != AbstractInstanceRootMap.end())
1370 return LexicalScopeStack.back();
1371
Bill Wendling0310d762009-05-15 09:23:25 +00001372 if (!Block.isNull()) {
1373 DIDescriptor ParentDesc = Block.getContext();
1374 Parent =
Devang Patele4b27562009-08-28 23:24:31 +00001375 ParentDesc.isNull() ? NULL : getOrCreateScope(ParentDesc.getNode());
Bill Wendling0310d762009-05-15 09:23:25 +00001376 }
1377
Devang Patele4b27562009-08-28 23:24:31 +00001378 Slot = new DbgScope(Parent, DIDescriptor(N));
Bill Wendling0310d762009-05-15 09:23:25 +00001379
1380 if (Parent)
1381 Parent->AddScope(Slot);
1382 else
1383 // First function is top level function.
1384 FunctionDbgScope = Slot;
1385
1386 return Slot;
1387}
1388
1389/// ConstructDbgScope - Construct the components of a scope.
1390///
1391void DwarfDebug::ConstructDbgScope(DbgScope *ParentScope,
1392 unsigned ParentStartID,
1393 unsigned ParentEndID,
1394 DIE *ParentDie, CompileUnit *Unit) {
1395 // Add variables to scope.
1396 SmallVector<DbgVariable *, 8> &Variables = ParentScope->getVariables();
1397 for (unsigned i = 0, N = Variables.size(); i < N; ++i) {
Bill Wendling995f80a2009-05-20 23:24:48 +00001398 DIE *VariableDie = CreateDbgScopeVariable(Variables[i], Unit);
Bill Wendling0310d762009-05-15 09:23:25 +00001399 if (VariableDie) ParentDie->AddChild(VariableDie);
1400 }
1401
1402 // Add concrete instances to scope.
1403 SmallVector<DbgConcreteScope *, 8> &ConcreteInsts =
1404 ParentScope->getConcreteInsts();
1405 for (unsigned i = 0, N = ConcreteInsts.size(); i < N; ++i) {
1406 DbgConcreteScope *ConcreteInst = ConcreteInsts[i];
1407 DIE *Die = ConcreteInst->getDie();
1408
1409 unsigned StartID = ConcreteInst->getStartLabelID();
1410 unsigned EndID = ConcreteInst->getEndLabelID();
1411
1412 // Add the scope bounds.
1413 if (StartID)
1414 AddLabel(Die, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
1415 DWLabel("label", StartID));
1416 else
1417 AddLabel(Die, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
1418 DWLabel("func_begin", SubprogramCount));
1419
1420 if (EndID)
1421 AddLabel(Die, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
1422 DWLabel("label", EndID));
1423 else
1424 AddLabel(Die, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
1425 DWLabel("func_end", SubprogramCount));
1426
1427 ParentDie->AddChild(Die);
1428 }
1429
1430 // Add nested scopes.
1431 SmallVector<DbgScope *, 4> &Scopes = ParentScope->getScopes();
1432 for (unsigned j = 0, M = Scopes.size(); j < M; ++j) {
1433 // Define the Scope debug information entry.
1434 DbgScope *Scope = Scopes[j];
1435
1436 unsigned StartID = MMI->MappedLabel(Scope->getStartLabelID());
1437 unsigned EndID = MMI->MappedLabel(Scope->getEndLabelID());
1438
1439 // Ignore empty scopes.
1440 if (StartID == EndID && StartID != 0) continue;
1441
1442 // Do not ignore inlined scopes even if they don't have any variables or
1443 // scopes.
1444 if (Scope->getScopes().empty() && Scope->getVariables().empty() &&
1445 Scope->getConcreteInsts().empty())
1446 continue;
1447
1448 if (StartID == ParentStartID && EndID == ParentEndID) {
1449 // Just add stuff to the parent scope.
1450 ConstructDbgScope(Scope, ParentStartID, ParentEndID, ParentDie, Unit);
1451 } else {
1452 DIE *ScopeDie = new DIE(dwarf::DW_TAG_lexical_block);
1453
1454 // Add the scope bounds.
1455 if (StartID)
1456 AddLabel(ScopeDie, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
1457 DWLabel("label", StartID));
1458 else
1459 AddLabel(ScopeDie, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
1460 DWLabel("func_begin", SubprogramCount));
1461
1462 if (EndID)
1463 AddLabel(ScopeDie, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
1464 DWLabel("label", EndID));
1465 else
1466 AddLabel(ScopeDie, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
1467 DWLabel("func_end", SubprogramCount));
1468
1469 // Add the scope's contents.
1470 ConstructDbgScope(Scope, StartID, EndID, ScopeDie, Unit);
1471 ParentDie->AddChild(ScopeDie);
1472 }
1473 }
1474}
1475
1476/// ConstructFunctionDbgScope - Construct the scope for the subprogram.
1477///
Bill Wendling17956162009-05-20 23:28:48 +00001478void DwarfDebug::ConstructFunctionDbgScope(DbgScope *RootScope,
1479 bool AbstractScope) {
Bill Wendling0310d762009-05-15 09:23:25 +00001480 // Exit if there is no root scope.
1481 if (!RootScope) return;
1482 DIDescriptor Desc = RootScope->getDesc();
1483 if (Desc.isNull())
1484 return;
1485
1486 // Get the subprogram debug information entry.
Devang Patele4b27562009-08-28 23:24:31 +00001487 DISubprogram SPD(Desc.getNode());
Bill Wendling0310d762009-05-15 09:23:25 +00001488
Bill Wendling0310d762009-05-15 09:23:25 +00001489 // Get the subprogram die.
Devang Patele4b27562009-08-28 23:24:31 +00001490 DIE *SPDie = ModuleCU->getDieMapSlotFor(SPD.getNode());
Devang Patelffd9c3d2009-10-05 23:59:00 +00001491 if (!SPDie) {
1492 ConstructSubprogram(SPD.getNode());
1493 SPDie = ModuleCU->getDieMapSlotFor(SPD.getNode());
1494 }
Bill Wendling0310d762009-05-15 09:23:25 +00001495 assert(SPDie && "Missing subprogram descriptor");
1496
Bill Wendling17956162009-05-20 23:28:48 +00001497 if (!AbstractScope) {
1498 // Add the function bounds.
1499 AddLabel(SPDie, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
1500 DWLabel("func_begin", SubprogramCount));
1501 AddLabel(SPDie, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
1502 DWLabel("func_end", SubprogramCount));
1503 MachineLocation Location(RI->getFrameRegister(*MF));
1504 AddAddress(SPDie, dwarf::DW_AT_frame_base, Location);
1505 }
Bill Wendling0310d762009-05-15 09:23:25 +00001506
Devang Patel1dbc7712009-06-29 20:45:18 +00001507 ConstructDbgScope(RootScope, 0, 0, SPDie, ModuleCU);
Devang Patelfd07cf52009-10-05 23:40:42 +00001508 // If there are global variables at this scope then add their dies.
1509 for (SmallVector<WeakVH, 4>::iterator SGI = ScopedGVs.begin(),
1510 SGE = ScopedGVs.end(); SGI != SGE; ++SGI) {
1511 MDNode *N = dyn_cast_or_null<MDNode>(*SGI);
1512 if (!N) continue;
1513 DIGlobalVariable GV(N);
1514 if (GV.getContext().getNode() == RootScope->getDesc().getNode()) {
1515 DIE *ScopedGVDie = CreateGlobalVariableDIE(ModuleCU, GV);
1516 SPDie->AddChild(ScopedGVDie);
1517 }
1518 }
Bill Wendling0310d762009-05-15 09:23:25 +00001519}
1520
Bill Wendling0310d762009-05-15 09:23:25 +00001521/// ConstructDefaultDbgScope - Construct a default scope for the subprogram.
1522///
1523void DwarfDebug::ConstructDefaultDbgScope(MachineFunction *MF) {
Devang Patel1dbc7712009-06-29 20:45:18 +00001524 StringMap<DIE*> &Globals = ModuleCU->getGlobals();
Daniel Dunbar460f6562009-07-26 09:48:23 +00001525 StringMap<DIE*>::iterator GI = Globals.find(MF->getFunction()->getName());
Devang Patel70f44262009-06-29 20:38:13 +00001526 if (GI != Globals.end()) {
1527 DIE *SPDie = GI->second;
Daniel Dunbarf612ff62009-09-19 20:40:05 +00001528
Devang Patel70f44262009-06-29 20:38:13 +00001529 // Add the function bounds.
1530 AddLabel(SPDie, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
1531 DWLabel("func_begin", SubprogramCount));
1532 AddLabel(SPDie, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
1533 DWLabel("func_end", SubprogramCount));
Daniel Dunbarf612ff62009-09-19 20:40:05 +00001534
Devang Patel70f44262009-06-29 20:38:13 +00001535 MachineLocation Location(RI->getFrameRegister(*MF));
1536 AddAddress(SPDie, dwarf::DW_AT_frame_base, Location);
Bill Wendling0310d762009-05-15 09:23:25 +00001537 }
Bill Wendling0310d762009-05-15 09:23:25 +00001538}
1539
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001540/// GetOrCreateSourceID - Look up the source id with the given directory and
1541/// source file names. If none currently exists, create a new id and insert it
1542/// in the SourceIds map. This can update DirectoryNames and SourceFileNames
1543/// maps as well.
Devang Patel5ccdd102009-09-29 18:40:58 +00001544unsigned DwarfDebug::GetOrCreateSourceID(const char *DirName,
1545 const char *FileName) {
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001546 unsigned DId;
1547 StringMap<unsigned>::iterator DI = DirectoryIdMap.find(DirName);
1548 if (DI != DirectoryIdMap.end()) {
1549 DId = DI->getValue();
1550 } else {
1551 DId = DirectoryNames.size() + 1;
1552 DirectoryIdMap[DirName] = DId;
1553 DirectoryNames.push_back(DirName);
1554 }
1555
1556 unsigned FId;
1557 StringMap<unsigned>::iterator FI = SourceFileIdMap.find(FileName);
1558 if (FI != SourceFileIdMap.end()) {
1559 FId = FI->getValue();
1560 } else {
1561 FId = SourceFileNames.size() + 1;
1562 SourceFileIdMap[FileName] = FId;
1563 SourceFileNames.push_back(FileName);
1564 }
1565
1566 DenseMap<std::pair<unsigned, unsigned>, unsigned>::iterator SI =
1567 SourceIdMap.find(std::make_pair(DId, FId));
1568 if (SI != SourceIdMap.end())
1569 return SI->second;
1570
1571 unsigned SrcId = SourceIds.size() + 1; // DW_AT_decl_file cannot be 0.
1572 SourceIdMap[std::make_pair(DId, FId)] = SrcId;
1573 SourceIds.push_back(std::make_pair(DId, FId));
1574
1575 return SrcId;
1576}
1577
Devang Patele4b27562009-08-28 23:24:31 +00001578void DwarfDebug::ConstructCompileUnit(MDNode *N) {
1579 DICompileUnit DIUnit(N);
Devang Patel5ccdd102009-09-29 18:40:58 +00001580 const char *FN = DIUnit.getFilename();
1581 const char *Dir = DIUnit.getDirectory();
1582 unsigned ID = GetOrCreateSourceID(Dir, FN);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001583
1584 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
1585 AddSectionOffset(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4,
1586 DWLabel("section_line", 0), DWLabel("section_line", 0),
1587 false);
1588 AddString(Die, dwarf::DW_AT_producer, dwarf::DW_FORM_string,
Devang Patel5ccdd102009-09-29 18:40:58 +00001589 DIUnit.getProducer());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001590 AddUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data1,
1591 DIUnit.getLanguage());
1592 AddString(Die, dwarf::DW_AT_name, dwarf::DW_FORM_string, FN);
1593
Devang Patel5ccdd102009-09-29 18:40:58 +00001594 if (Dir)
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001595 AddString(Die, dwarf::DW_AT_comp_dir, dwarf::DW_FORM_string, Dir);
1596 if (DIUnit.isOptimized())
1597 AddUInt(Die, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1);
1598
Devang Patel5ccdd102009-09-29 18:40:58 +00001599 if (const char *Flags = DIUnit.getFlags())
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001600 AddString(Die, dwarf::DW_AT_APPLE_flags, dwarf::DW_FORM_string, Flags);
1601
1602 unsigned RVer = DIUnit.getRunTimeVersion();
1603 if (RVer)
1604 AddUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers,
1605 dwarf::DW_FORM_data1, RVer);
1606
1607 CompileUnit *Unit = new CompileUnit(ID, Die);
Devang Patel1dbc7712009-06-29 20:45:18 +00001608 if (!ModuleCU && DIUnit.isMain()) {
Devang Patel70f44262009-06-29 20:38:13 +00001609 // Use first compile unit marked as isMain as the compile unit
1610 // for this module.
Devang Patel1dbc7712009-06-29 20:45:18 +00001611 ModuleCU = Unit;
Devang Patel70f44262009-06-29 20:38:13 +00001612 }
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001613
Devang Patele4b27562009-08-28 23:24:31 +00001614 CompileUnitMap[DIUnit.getNode()] = Unit;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001615 CompileUnits.push_back(Unit);
1616}
1617
Devang Patele4b27562009-08-28 23:24:31 +00001618void DwarfDebug::ConstructGlobalVariableDIE(MDNode *N) {
1619 DIGlobalVariable DI_GV(N);
Daniel Dunbarf612ff62009-09-19 20:40:05 +00001620
Devang Patel905cf5e2009-09-04 23:59:07 +00001621 // If debug information is malformed then ignore it.
1622 if (DI_GV.Verify() == false)
1623 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001624
1625 // Check for pre-existence.
Devang Patele4b27562009-08-28 23:24:31 +00001626 DIE *&Slot = ModuleCU->getDieMapSlotFor(DI_GV.getNode());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001627 if (Slot)
Devang Patel13e16b62009-06-26 01:49:18 +00001628 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001629
Devang Patel1dbc7712009-06-29 20:45:18 +00001630 DIE *VariableDie = CreateGlobalVariableDIE(ModuleCU, DI_GV);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001631
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001632 // Add to map.
1633 Slot = VariableDie;
1634
1635 // Add to context owner.
Devang Patel1dbc7712009-06-29 20:45:18 +00001636 ModuleCU->getDie()->AddChild(VariableDie);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001637
1638 // Expose as global. FIXME - need to check external flag.
Devang Patel5ccdd102009-09-29 18:40:58 +00001639 ModuleCU->AddGlobal(DI_GV.getName(), VariableDie);
Devang Patel13e16b62009-06-26 01:49:18 +00001640 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001641}
1642
Devang Patele4b27562009-08-28 23:24:31 +00001643void DwarfDebug::ConstructSubprogram(MDNode *N) {
1644 DISubprogram SP(N);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001645
1646 // Check for pre-existence.
Devang Patele4b27562009-08-28 23:24:31 +00001647 DIE *&Slot = ModuleCU->getDieMapSlotFor(N);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001648 if (Slot)
Devang Patel13e16b62009-06-26 01:49:18 +00001649 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001650
1651 if (!SP.isDefinition())
1652 // This is a method declaration which will be handled while constructing
1653 // class type.
Devang Patel13e16b62009-06-26 01:49:18 +00001654 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001655
Devang Patel1dbc7712009-06-29 20:45:18 +00001656 DIE *SubprogramDie = CreateSubprogramDIE(ModuleCU, SP);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001657
1658 // Add to map.
1659 Slot = SubprogramDie;
1660
1661 // Add to context owner.
Devang Patel1dbc7712009-06-29 20:45:18 +00001662 ModuleCU->getDie()->AddChild(SubprogramDie);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001663
1664 // Expose as global.
Devang Patel5ccdd102009-09-29 18:40:58 +00001665 ModuleCU->AddGlobal(SP.getName(), SubprogramDie);
Devang Patel13e16b62009-06-26 01:49:18 +00001666 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001667}
1668
Daniel Dunbar00564992009-09-19 20:40:14 +00001669/// BeginModule - Emit all Dwarf sections that should come prior to the
1670/// content. Create global DIEs and emit initial debug info sections.
1671/// This is inovked by the target AsmPrinter.
Devang Patel208622d2009-06-25 22:36:02 +00001672void DwarfDebug::BeginModule(Module *M, MachineModuleInfo *mmi) {
1673 this->M = M;
1674
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001675 if (TimePassesIsEnabled)
1676 DebugTimer->startTimer();
1677
Devang Patel78ab9e22009-07-30 18:56:46 +00001678 DebugInfoFinder DbgFinder;
1679 DbgFinder.processModule(*M);
Devang Patel13e16b62009-06-26 01:49:18 +00001680
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001681 // Create all the compile unit DIEs.
Devang Patel78ab9e22009-07-30 18:56:46 +00001682 for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
1683 E = DbgFinder.compile_unit_end(); I != E; ++I)
Devang Patel13e16b62009-06-26 01:49:18 +00001684 ConstructCompileUnit(*I);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001685
1686 if (CompileUnits.empty()) {
1687 if (TimePassesIsEnabled)
1688 DebugTimer->stopTimer();
1689
1690 return;
1691 }
1692
Devang Patel70f44262009-06-29 20:38:13 +00001693 // If main compile unit for this module is not seen than randomly
1694 // select first compile unit.
Devang Patel1dbc7712009-06-29 20:45:18 +00001695 if (!ModuleCU)
1696 ModuleCU = CompileUnits[0];
Devang Patel70f44262009-06-29 20:38:13 +00001697
Devang Patel13e16b62009-06-26 01:49:18 +00001698 // Create DIEs for each of the externally visible global variables.
Devang Patel78ab9e22009-07-30 18:56:46 +00001699 for (DebugInfoFinder::iterator I = DbgFinder.global_variable_begin(),
Devang Patelfd07cf52009-10-05 23:40:42 +00001700 E = DbgFinder.global_variable_end(); I != E; ++I) {
1701 DIGlobalVariable GV(*I);
1702 if (GV.getContext().getNode() != GV.getCompileUnit().getNode())
1703 ScopedGVs.push_back(*I);
1704 else
1705 ConstructGlobalVariableDIE(*I);
1706 }
Devang Patel13e16b62009-06-26 01:49:18 +00001707
1708 // Create DIEs for each of the externally visible subprograms.
Devang Patel78ab9e22009-07-30 18:56:46 +00001709 for (DebugInfoFinder::iterator I = DbgFinder.subprogram_begin(),
1710 E = DbgFinder.subprogram_end(); I != E; ++I)
Devang Patel13e16b62009-06-26 01:49:18 +00001711 ConstructSubprogram(*I);
1712
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001713 MMI = mmi;
1714 shouldEmit = true;
1715 MMI->setDebugInfoAvailability(true);
1716
1717 // Prime section data.
Chris Lattnerf0144122009-07-28 03:13:23 +00001718 SectionMap.insert(Asm->getObjFileLowering().getTextSection());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001719
1720 // Print out .file directives to specify files for .loc directives. These are
1721 // printed out early so that they precede any .loc directives.
Chris Lattner33adcfb2009-08-22 21:43:10 +00001722 if (MAI->hasDotLocAndDotFile()) {
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001723 for (unsigned i = 1, e = getNumSourceIds()+1; i != e; ++i) {
1724 // Remember source id starts at 1.
1725 std::pair<unsigned, unsigned> Id = getSourceDirectoryAndFileIds(i);
1726 sys::Path FullPath(getSourceDirectoryName(Id.first));
1727 bool AppendOk =
1728 FullPath.appendComponent(getSourceFileName(Id.second));
1729 assert(AppendOk && "Could not append filename to directory!");
1730 AppendOk = false;
Chris Lattner74382b72009-08-23 22:45:37 +00001731 Asm->EmitFile(i, FullPath.str());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001732 Asm->EOL();
1733 }
1734 }
1735
1736 // Emit initial sections
1737 EmitInitial();
1738
1739 if (TimePassesIsEnabled)
1740 DebugTimer->stopTimer();
1741}
1742
1743/// EndModule - Emit all Dwarf sections that should come after the content.
1744///
1745void DwarfDebug::EndModule() {
Devang Patel6f3dc922009-10-06 00:03:14 +00001746 if (!ModuleCU)
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001747 return;
1748
1749 if (TimePassesIsEnabled)
1750 DebugTimer->startTimer();
1751
1752 // Standard sections final addresses.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00001753 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getTextSection());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001754 EmitLabel("text_end", 0);
Chris Lattner6c2f9e12009-08-19 05:49:37 +00001755 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getDataSection());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001756 EmitLabel("data_end", 0);
1757
1758 // End text sections.
1759 for (unsigned i = 1, N = SectionMap.size(); i <= N; ++i) {
Chris Lattner6c2f9e12009-08-19 05:49:37 +00001760 Asm->OutStreamer.SwitchSection(SectionMap[i]);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001761 EmitLabel("section_end", i);
1762 }
1763
1764 // Emit common frame information.
1765 EmitCommonDebugFrame();
1766
1767 // Emit function debug frame information
1768 for (std::vector<FunctionDebugFrameInfo>::iterator I = DebugFrames.begin(),
1769 E = DebugFrames.end(); I != E; ++I)
1770 EmitFunctionDebugFrame(*I);
1771
1772 // Compute DIE offsets and sizes.
1773 SizeAndOffsets();
1774
1775 // Emit all the DIEs into a debug info section
1776 EmitDebugInfo();
1777
1778 // Corresponding abbreviations into a abbrev section.
1779 EmitAbbreviations();
1780
1781 // Emit source line correspondence into a debug line section.
1782 EmitDebugLines();
1783
1784 // Emit info into a debug pubnames section.
1785 EmitDebugPubNames();
1786
1787 // Emit info into a debug str section.
1788 EmitDebugStr();
1789
1790 // Emit info into a debug loc section.
1791 EmitDebugLoc();
1792
1793 // Emit info into a debug aranges section.
1794 EmitDebugARanges();
1795
1796 // Emit info into a debug ranges section.
1797 EmitDebugRanges();
1798
1799 // Emit info into a debug macinfo section.
1800 EmitDebugMacInfo();
1801
1802 // Emit inline info.
1803 EmitDebugInlineInfo();
1804
1805 if (TimePassesIsEnabled)
1806 DebugTimer->stopTimer();
1807}
1808
Devang Patele717faa2009-10-06 01:26:37 +00001809/// CollectVariableInfo - Populate DbgScope entries with variables' info.
Devang Patelac1ceb32009-10-09 22:42:28 +00001810void DwarfDebug::CollectVariableInfo() {
1811 if (!MMI) return;
Devang Patele717faa2009-10-06 01:26:37 +00001812 MachineModuleInfo::VariableDbgInfoMapTy &VMap = MMI->getVariableDbgInfo();
1813 for (MachineModuleInfo::VariableDbgInfoMapTy::iterator VI = VMap.begin(),
1814 VE = VMap.end(); VI != VE; ++VI) {
Devang Patelac1ceb32009-10-09 22:42:28 +00001815 MetadataBase *MB = VI->first;
1816 MDNode *Var = dyn_cast_or_null<MDNode>(MB);
Devang Pateleda31212009-10-08 18:48:03 +00001817 DIVariable DV (Var);
1818 if (DV.isNull()) continue;
Devang Patelac1ceb32009-10-09 22:42:28 +00001819 unsigned VSlot = VI->second;
Devang Patel149aa7c2009-10-16 18:18:03 +00001820 DbgScope *Scope = NULL;
Devang Patelbdf45cb2009-10-27 20:47:17 +00001821 ValueMap<MDNode *, DbgScope *>::iterator DSI =
Devang Patelc90aefe2009-10-14 21:08:09 +00001822 DbgScopeMap.find(DV.getContext().getNode());
Devang Patel149aa7c2009-10-16 18:18:03 +00001823 if (DSI != DbgScopeMap.end())
1824 Scope = DSI->second;
1825 else
1826 // There is not any instruction assocated with this scope, so get
1827 // a new scope.
1828 Scope = getDbgScope(DV.getContext().getNode(),
1829 NULL /* Not an instruction */,
1830 NULL /* Not inlined */);
1831 assert (Scope && "Unable to find variable scope!");
Devang Pateleda31212009-10-08 18:48:03 +00001832 Scope->AddVariable(new DbgVariable(DV, VSlot, false));
Devang Patele717faa2009-10-06 01:26:37 +00001833 }
1834}
1835
Devang Patel0d20ac82009-10-06 01:50:42 +00001836/// SetDbgScopeBeginLabels - Update DbgScope begin labels for the scopes that
1837/// start with this machine instruction.
1838void DwarfDebug::SetDbgScopeBeginLabels(const MachineInstr *MI, unsigned Label) {
1839 InsnToDbgScopeMapTy::iterator I = DbgScopeBeginMap.find(MI);
1840 if (I == DbgScopeBeginMap.end())
1841 return;
1842 SmallVector<DbgScope *, 2> &SD = I->second;
1843 for (SmallVector<DbgScope *, 2>::iterator SDI = SD.begin(), SDE = SD.end();
1844 SDI != SDE; ++SDI)
1845 (*SDI)->setStartLabelID(Label);
1846}
1847
1848/// SetDbgScopeEndLabels - Update DbgScope end labels for the scopes that
1849/// end with this machine instruction.
1850void DwarfDebug::SetDbgScopeEndLabels(const MachineInstr *MI, unsigned Label) {
1851 InsnToDbgScopeMapTy::iterator I = DbgScopeEndMap.find(MI);
Devang Patel8a4087d2009-10-06 03:15:38 +00001852 if (I == DbgScopeEndMap.end())
Devang Patel0d20ac82009-10-06 01:50:42 +00001853 return;
1854 SmallVector<DbgScope *, 2> &SD = I->second;
1855 for (SmallVector<DbgScope *, 2>::iterator SDI = SD.begin(), SDE = SD.end();
1856 SDI != SDE; ++SDI)
1857 (*SDI)->setEndLabelID(Label);
1858}
1859
Devang Patelaf9e8472009-10-01 20:31:14 +00001860/// ExtractScopeInformation - Scan machine instructions in this function
1861/// and collect DbgScopes. Return true, if atleast one scope was found.
1862bool DwarfDebug::ExtractScopeInformation(MachineFunction *MF) {
1863 // If scope information was extracted using .dbg intrinsics then there is not
1864 // any need to extract these information by scanning each instruction.
1865 if (!DbgScopeMap.empty())
1866 return false;
1867
1868 // Scan each instruction and create scopes.
1869 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
1870 I != E; ++I) {
1871 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
1872 II != IE; ++II) {
1873 const MachineInstr *MInsn = II;
1874 DebugLoc DL = MInsn->getDebugLoc();
1875 if (DL.isUnknown())
1876 continue;
1877 DebugLocTuple DLT = MF->getDebugLocTuple(DL);
Devang Patel1619dc32009-10-13 23:28:53 +00001878 if (!DLT.Scope)
Devang Patelaf9e8472009-10-01 20:31:14 +00001879 continue;
1880 // There is no need to create another DIE for compile unit. For all
1881 // other scopes, create one DbgScope now. This will be translated
1882 // into a scope DIE at the end.
Devang Patel1619dc32009-10-13 23:28:53 +00001883 DIDescriptor D(DLT.Scope);
Devang Patelaf9e8472009-10-01 20:31:14 +00001884 if (!D.isCompileUnit()) {
Devang Patelc90aefe2009-10-14 21:08:09 +00001885 DbgScope *Scope = getDbgScope(DLT.Scope, MInsn, DLT.InlinedAtLoc);
Devang Patelaf9e8472009-10-01 20:31:14 +00001886 Scope->setLastInsn(MInsn);
1887 }
1888 }
1889 }
1890
1891 // If a scope's last instruction is not set then use its child scope's
1892 // last instruction as this scope's last instrunction.
Devang Patelbdf45cb2009-10-27 20:47:17 +00001893 for (ValueMap<MDNode *, DbgScope *>::iterator DI = DbgScopeMap.begin(),
Devang Patelaf9e8472009-10-01 20:31:14 +00001894 DE = DbgScopeMap.end(); DI != DE; ++DI) {
Devang Patelbdf45cb2009-10-27 20:47:17 +00001895 DbgScope *S = DI->second;
1896 if (!S) continue;
Devang Patelaf9e8472009-10-01 20:31:14 +00001897 assert (DI->second->getFirstInsn() && "Invalid first instruction!");
1898 DI->second->FixInstructionMarkers();
1899 assert (DI->second->getLastInsn() && "Invalid last instruction!");
1900 }
1901
1902 // Each scope has first instruction and last instruction to mark beginning
1903 // and end of a scope respectively. Create an inverse map that list scopes
1904 // starts (and ends) with an instruction. One instruction may start (or end)
1905 // multiple scopes.
Devang Patelbdf45cb2009-10-27 20:47:17 +00001906 for (ValueMap<MDNode *, DbgScope *>::iterator DI = DbgScopeMap.begin(),
Devang Patelaf9e8472009-10-01 20:31:14 +00001907 DE = DbgScopeMap.end(); DI != DE; ++DI) {
1908 DbgScope *S = DI->second;
Devang Patelbdf45cb2009-10-27 20:47:17 +00001909 if (!S) continue;
Devang Patelaf9e8472009-10-01 20:31:14 +00001910 const MachineInstr *MI = S->getFirstInsn();
1911 assert (MI && "DbgScope does not have first instruction!");
1912
1913 InsnToDbgScopeMapTy::iterator IDI = DbgScopeBeginMap.find(MI);
1914 if (IDI != DbgScopeBeginMap.end())
1915 IDI->second.push_back(S);
1916 else
1917 DbgScopeBeginMap.insert(std::make_pair(MI,
1918 SmallVector<DbgScope *, 2>(2, S)));
1919
1920 MI = S->getLastInsn();
1921 assert (MI && "DbgScope does not have last instruction!");
1922 IDI = DbgScopeEndMap.find(MI);
1923 if (IDI != DbgScopeEndMap.end())
1924 IDI->second.push_back(S);
1925 else
1926 DbgScopeEndMap.insert(std::make_pair(MI,
1927 SmallVector<DbgScope *, 2>(2, S)));
1928 }
1929
1930 return !DbgScopeMap.empty();
1931}
1932
Devang Patel6ef75172009-10-12 23:11:24 +00001933static DISubprogram getDISubprogram(MDNode *N) {
1934
1935 DIDescriptor D(N);
1936 if (D.isNull())
1937 return DISubprogram();
1938
1939 if (D.isCompileUnit())
1940 return DISubprogram();
1941
1942 if (D.isSubprogram())
1943 return DISubprogram(N);
1944
1945 if (D.isLexicalBlock())
1946 return getDISubprogram(DILexicalBlock(N).getContext().getNode());
1947
Daniel Dunbar6e4bdfc2009-10-13 06:47:08 +00001948 llvm_unreachable("Unexpected Descriptor!");
Devang Patel6ef75172009-10-12 23:11:24 +00001949}
1950
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001951/// BeginFunction - Gather pre-function debug information. Assumes being
1952/// emitted immediately after the function entry point.
1953void DwarfDebug::BeginFunction(MachineFunction *MF) {
1954 this->MF = MF;
1955
1956 if (!ShouldEmitDwarfDebug()) return;
1957
1958 if (TimePassesIsEnabled)
1959 DebugTimer->startTimer();
1960
Devang Patel60b35bd2009-10-06 18:37:31 +00001961#ifdef ATTACH_DEBUG_INFO_TO_AN_INSN
1962 if (!ExtractScopeInformation(MF))
1963 return;
Devang Patelac1ceb32009-10-09 22:42:28 +00001964 CollectVariableInfo();
Devang Patel60b35bd2009-10-06 18:37:31 +00001965#endif
1966
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001967 // Begin accumulating function debug information.
1968 MMI->BeginFunction(MF);
1969
1970 // Assumes in correct section after the entry point.
1971 EmitLabel("func_begin", ++SubprogramCount);
1972
1973 // Emit label for the implicitly defined dbg.stoppoint at the start of the
1974 // function.
Devang Pateleda31212009-10-08 18:48:03 +00001975#ifdef ATTACH_DEBUG_INFO_TO_AN_INSN
Devang Patelac1ceb32009-10-09 22:42:28 +00001976 DebugLoc FDL = MF->getDefaultDebugLoc();
1977 if (!FDL.isUnknown()) {
1978 DebugLocTuple DLT = MF->getDebugLocTuple(FDL);
1979 unsigned LabelID = 0;
Devang Patel1619dc32009-10-13 23:28:53 +00001980 DISubprogram SP = getDISubprogram(DLT.Scope);
Devang Patelac1ceb32009-10-09 22:42:28 +00001981 if (!SP.isNull())
Devang Patel1619dc32009-10-13 23:28:53 +00001982 LabelID = RecordSourceLine(SP.getLineNumber(), 0, DLT.Scope);
Devang Patelac1ceb32009-10-09 22:42:28 +00001983 else
Devang Patel1619dc32009-10-13 23:28:53 +00001984 LabelID = RecordSourceLine(DLT.Line, DLT.Col, DLT.Scope);
Devang Patelac1ceb32009-10-09 22:42:28 +00001985 Asm->printLabel(LabelID);
1986 O << '\n';
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001987 }
Devang Patelac1ceb32009-10-09 22:42:28 +00001988#else
1989 DebugLoc FDL = MF->getDefaultDebugLoc();
1990 if (!FDL.isUnknown()) {
1991 DebugLocTuple DLT = MF->getDebugLocTuple(FDL);
Devang Patel1619dc32009-10-13 23:28:53 +00001992 unsigned LabelID = RecordSourceLine(DLT.Line, DLT.Col, DLT.Scope);
Devang Patelac1ceb32009-10-09 22:42:28 +00001993 Asm->printLabel(LabelID);
1994 O << '\n';
1995 }
1996#endif
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001997 if (TimePassesIsEnabled)
1998 DebugTimer->stopTimer();
1999}
2000
2001/// EndFunction - Gather and emit post-function debug information.
2002///
2003void DwarfDebug::EndFunction(MachineFunction *MF) {
2004 if (!ShouldEmitDwarfDebug()) return;
2005
2006 if (TimePassesIsEnabled)
2007 DebugTimer->startTimer();
2008
Devang Patelac1ceb32009-10-09 22:42:28 +00002009#ifdef ATTACH_DEBUG_INFO_TO_AN_INSN
2010 if (DbgScopeMap.empty())
2011 return;
2012#endif
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002013 // Define end label for subprogram.
2014 EmitLabel("func_end", SubprogramCount);
2015
2016 // Get function line info.
2017 if (!Lines.empty()) {
2018 // Get section line info.
Chris Lattner290c2f52009-08-03 23:20:21 +00002019 unsigned ID = SectionMap.insert(Asm->getCurrentSection());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002020 if (SectionSourceLines.size() < ID) SectionSourceLines.resize(ID);
2021 std::vector<SrcLineInfo> &SectionLineInfos = SectionSourceLines[ID-1];
2022 // Append the function info to section info.
2023 SectionLineInfos.insert(SectionLineInfos.end(),
2024 Lines.begin(), Lines.end());
2025 }
2026
2027 // Construct the DbgScope for abstract instances.
2028 for (SmallVector<DbgScope *, 32>::iterator
2029 I = AbstractInstanceRootList.begin(),
2030 E = AbstractInstanceRootList.end(); I != E; ++I)
Bill Wendling17956162009-05-20 23:28:48 +00002031 ConstructFunctionDbgScope(*I);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002032
2033 // Construct scopes for subprogram.
2034 if (FunctionDbgScope)
2035 ConstructFunctionDbgScope(FunctionDbgScope);
2036 else
2037 // FIXME: This is wrong. We are essentially getting past a problem with
2038 // debug information not being able to handle unreachable blocks that have
2039 // debug information in them. In particular, those unreachable blocks that
2040 // have "region end" info in them. That situation results in the "root
2041 // scope" not being created. If that's the case, then emit a "default"
2042 // scope, i.e., one that encompasses the whole function. This isn't
2043 // desirable. And a better way of handling this (and all of the debugging
2044 // information) needs to be explored.
2045 ConstructDefaultDbgScope(MF);
2046
2047 DebugFrames.push_back(FunctionDebugFrameInfo(SubprogramCount,
2048 MMI->getFrameMoves()));
2049
2050 // Clear debug info
2051 if (FunctionDbgScope) {
2052 delete FunctionDbgScope;
2053 DbgScopeMap.clear();
Devang Patelaf9e8472009-10-01 20:31:14 +00002054 DbgScopeBeginMap.clear();
2055 DbgScopeEndMap.clear();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002056 DbgAbstractScopeMap.clear();
2057 DbgConcreteScopeMap.clear();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002058 FunctionDbgScope = NULL;
2059 LexicalScopeStack.clear();
2060 AbstractInstanceRootList.clear();
Devang Patel9217f792009-06-12 19:24:05 +00002061 AbstractInstanceRootMap.clear();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002062 }
2063
2064 Lines.clear();
2065
2066 if (TimePassesIsEnabled)
2067 DebugTimer->stopTimer();
2068}
2069
2070/// RecordSourceLine - Records location information and associates it with a
2071/// label. Returns a unique label ID used to generate a label and provide
2072/// correspondence to the source line list.
Devang Patel3d910832009-09-30 22:51:28 +00002073unsigned DwarfDebug::RecordSourceLine(unsigned Line, unsigned Col,
Devang Patelf84548d2009-10-05 18:03:19 +00002074 MDNode *S) {
Devang Patele4b27562009-08-28 23:24:31 +00002075 if (!MMI)
2076 return 0;
2077
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002078 if (TimePassesIsEnabled)
2079 DebugTimer->startTimer();
2080
Devang Patelf84548d2009-10-05 18:03:19 +00002081 const char *Dir = NULL;
2082 const char *Fn = NULL;
2083
2084 DIDescriptor Scope(S);
2085 if (Scope.isCompileUnit()) {
2086 DICompileUnit CU(S);
2087 Dir = CU.getDirectory();
2088 Fn = CU.getFilename();
2089 } else if (Scope.isSubprogram()) {
2090 DISubprogram SP(S);
2091 Dir = SP.getDirectory();
2092 Fn = SP.getFilename();
2093 } else if (Scope.isLexicalBlock()) {
2094 DILexicalBlock DB(S);
2095 Dir = DB.getDirectory();
2096 Fn = DB.getFilename();
2097 } else
2098 assert (0 && "Unexpected scope info");
2099
2100 unsigned Src = GetOrCreateSourceID(Dir, Fn);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002101 unsigned ID = MMI->NextLabelID();
2102 Lines.push_back(SrcLineInfo(Line, Col, Src, ID));
2103
2104 if (TimePassesIsEnabled)
2105 DebugTimer->stopTimer();
2106
2107 return ID;
2108}
2109
2110/// getOrCreateSourceID - Public version of GetOrCreateSourceID. This can be
2111/// timed. Look up the source id with the given directory and source file
2112/// names. If none currently exists, create a new id and insert it in the
2113/// SourceIds map. This can update DirectoryNames and SourceFileNames maps as
2114/// well.
2115unsigned DwarfDebug::getOrCreateSourceID(const std::string &DirName,
2116 const std::string &FileName) {
2117 if (TimePassesIsEnabled)
2118 DebugTimer->startTimer();
2119
Devang Patel5ccdd102009-09-29 18:40:58 +00002120 unsigned SrcId = GetOrCreateSourceID(DirName.c_str(), FileName.c_str());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002121
2122 if (TimePassesIsEnabled)
2123 DebugTimer->stopTimer();
2124
2125 return SrcId;
2126}
2127
2128/// RecordRegionStart - Indicate the start of a region.
Devang Patele4b27562009-08-28 23:24:31 +00002129unsigned DwarfDebug::RecordRegionStart(MDNode *N) {
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002130 if (TimePassesIsEnabled)
2131 DebugTimer->startTimer();
2132
Devang Patele4b27562009-08-28 23:24:31 +00002133 DbgScope *Scope = getOrCreateScope(N);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002134 unsigned ID = MMI->NextLabelID();
2135 if (!Scope->getStartLabelID()) Scope->setStartLabelID(ID);
2136 LexicalScopeStack.push_back(Scope);
2137
2138 if (TimePassesIsEnabled)
2139 DebugTimer->stopTimer();
2140
2141 return ID;
2142}
2143
2144/// RecordRegionEnd - Indicate the end of a region.
Devang Patele4b27562009-08-28 23:24:31 +00002145unsigned DwarfDebug::RecordRegionEnd(MDNode *N) {
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002146 if (TimePassesIsEnabled)
2147 DebugTimer->startTimer();
2148
Devang Patele4b27562009-08-28 23:24:31 +00002149 DbgScope *Scope = getOrCreateScope(N);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002150 unsigned ID = MMI->NextLabelID();
2151 Scope->setEndLabelID(ID);
Devang Pateldaf9e022009-06-13 02:16:18 +00002152 // FIXME : region.end() may not be in the last basic block.
2153 // For now, do not pop last lexical scope because next basic
2154 // block may start new inlined function's body.
2155 unsigned LSSize = LexicalScopeStack.size();
2156 if (LSSize != 0 && LSSize != 1)
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002157 LexicalScopeStack.pop_back();
2158
2159 if (TimePassesIsEnabled)
2160 DebugTimer->stopTimer();
2161
2162 return ID;
2163}
2164
2165/// RecordVariable - Indicate the declaration of a local variable.
Devang Patele4b27562009-08-28 23:24:31 +00002166void DwarfDebug::RecordVariable(MDNode *N, unsigned FrameIndex) {
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002167 if (TimePassesIsEnabled)
2168 DebugTimer->startTimer();
2169
Devang Patele4b27562009-08-28 23:24:31 +00002170 DIDescriptor Desc(N);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002171 DbgScope *Scope = NULL;
2172 bool InlinedFnVar = false;
2173
Devang Patele4b27562009-08-28 23:24:31 +00002174 if (Desc.getTag() == dwarf::DW_TAG_variable)
2175 Scope = getOrCreateScope(DIGlobalVariable(N).getContext().getNode());
2176 else {
Devang Patel24f20e02009-08-22 17:12:53 +00002177 bool InlinedVar = false;
Devang Patele4b27562009-08-28 23:24:31 +00002178 MDNode *Context = DIVariable(N).getContext().getNode();
2179 DISubprogram SP(Context);
Devang Patel24f20e02009-08-22 17:12:53 +00002180 if (!SP.isNull()) {
2181 // SP is inserted into DbgAbstractScopeMap when inlined function
2182 // start was recorded by RecordInlineFnStart.
Devang Patelbdf45cb2009-10-27 20:47:17 +00002183 ValueMap<MDNode *, DbgScope *>::iterator
Devang Patele4b27562009-08-28 23:24:31 +00002184 I = DbgAbstractScopeMap.find(SP.getNode());
Devang Patel24f20e02009-08-22 17:12:53 +00002185 if (I != DbgAbstractScopeMap.end()) {
2186 InlinedVar = true;
2187 Scope = I->second;
2188 }
2189 }
Daniel Dunbarf612ff62009-09-19 20:40:05 +00002190 if (!InlinedVar)
Devang Patele4b27562009-08-28 23:24:31 +00002191 Scope = getOrCreateScope(Context);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002192 }
2193
2194 assert(Scope && "Unable to find the variable's scope");
Devang Patele4b27562009-08-28 23:24:31 +00002195 DbgVariable *DV = new DbgVariable(DIVariable(N), FrameIndex, InlinedFnVar);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002196 Scope->AddVariable(DV);
2197
2198 if (TimePassesIsEnabled)
2199 DebugTimer->stopTimer();
2200}
2201
2202//// RecordInlinedFnStart - Indicate the start of inlined subroutine.
2203unsigned DwarfDebug::RecordInlinedFnStart(DISubprogram &SP, DICompileUnit CU,
2204 unsigned Line, unsigned Col) {
2205 unsigned LabelID = MMI->NextLabelID();
2206
Chris Lattner33adcfb2009-08-22 21:43:10 +00002207 if (!MAI->doesDwarfUsesInlineInfoSection())
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002208 return LabelID;
2209
2210 if (TimePassesIsEnabled)
2211 DebugTimer->startTimer();
2212
Devang Patele4b27562009-08-28 23:24:31 +00002213 MDNode *Node = SP.getNode();
2214 DenseMap<const MDNode *, DbgScope *>::iterator
2215 II = AbstractInstanceRootMap.find(Node);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002216
2217 if (II == AbstractInstanceRootMap.end()) {
2218 // Create an abstract instance entry for this inlined function if it doesn't
2219 // already exist.
Devang Patele4b27562009-08-28 23:24:31 +00002220 DbgScope *Scope = new DbgScope(NULL, DIDescriptor(Node));
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002221
2222 // Get the compile unit context.
Devang Patele4b27562009-08-28 23:24:31 +00002223 DIE *SPDie = ModuleCU->getDieMapSlotFor(Node);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002224 if (!SPDie)
Devang Patel1dbc7712009-06-29 20:45:18 +00002225 SPDie = CreateSubprogramDIE(ModuleCU, SP, false, true);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002226
2227 // Mark as being inlined. This makes this subprogram entry an abstract
2228 // instance root.
2229 // FIXME: Our debugger doesn't care about the value of DW_AT_inline, only
2230 // that it's defined. That probably won't change in the future. However,
2231 // this could be more elegant.
2232 AddUInt(SPDie, dwarf::DW_AT_inline, 0, dwarf::DW_INL_declared_not_inlined);
2233
2234 // Keep track of the abstract scope for this function.
Devang Patele4b27562009-08-28 23:24:31 +00002235 DbgAbstractScopeMap[Node] = Scope;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002236
Devang Patele4b27562009-08-28 23:24:31 +00002237 AbstractInstanceRootMap[Node] = Scope;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002238 AbstractInstanceRootList.push_back(Scope);
2239 }
2240
2241 // Create a concrete inlined instance for this inlined function.
Devang Patele4b27562009-08-28 23:24:31 +00002242 DbgConcreteScope *ConcreteScope = new DbgConcreteScope(DIDescriptor(Node));
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002243 DIE *ScopeDie = new DIE(dwarf::DW_TAG_inlined_subroutine);
Devang Patel1dbc7712009-06-29 20:45:18 +00002244 ScopeDie->setAbstractCompileUnit(ModuleCU);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002245
Devang Patele4b27562009-08-28 23:24:31 +00002246 DIE *Origin = ModuleCU->getDieMapSlotFor(Node);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002247 AddDIEEntry(ScopeDie, dwarf::DW_AT_abstract_origin,
2248 dwarf::DW_FORM_ref4, Origin);
Devang Patel1dbc7712009-06-29 20:45:18 +00002249 AddUInt(ScopeDie, dwarf::DW_AT_call_file, 0, ModuleCU->getID());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002250 AddUInt(ScopeDie, dwarf::DW_AT_call_line, 0, Line);
2251 AddUInt(ScopeDie, dwarf::DW_AT_call_column, 0, Col);
2252
2253 ConcreteScope->setDie(ScopeDie);
2254 ConcreteScope->setStartLabelID(LabelID);
2255 MMI->RecordUsedDbgLabel(LabelID);
2256
2257 LexicalScopeStack.back()->AddConcreteInst(ConcreteScope);
2258
2259 // Keep track of the concrete scope that's inlined into this function.
Devang Patelbdf45cb2009-10-27 20:47:17 +00002260 ValueMap<MDNode *, SmallVector<DbgScope *, 8> >::iterator
Devang Patele4b27562009-08-28 23:24:31 +00002261 SI = DbgConcreteScopeMap.find(Node);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002262
2263 if (SI == DbgConcreteScopeMap.end())
Devang Patele4b27562009-08-28 23:24:31 +00002264 DbgConcreteScopeMap[Node].push_back(ConcreteScope);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002265 else
2266 SI->second.push_back(ConcreteScope);
2267
2268 // Track the start label for this inlined function.
Devang Patelbdf45cb2009-10-27 20:47:17 +00002269 ValueMap<MDNode *, SmallVector<unsigned, 4> >::iterator
Devang Patele4b27562009-08-28 23:24:31 +00002270 I = InlineInfo.find(Node);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002271
2272 if (I == InlineInfo.end())
Devang Patele4b27562009-08-28 23:24:31 +00002273 InlineInfo[Node].push_back(LabelID);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002274 else
2275 I->second.push_back(LabelID);
2276
2277 if (TimePassesIsEnabled)
2278 DebugTimer->stopTimer();
2279
2280 return LabelID;
2281}
2282
2283/// RecordInlinedFnEnd - Indicate the end of inlined subroutine.
2284unsigned DwarfDebug::RecordInlinedFnEnd(DISubprogram &SP) {
Chris Lattner33adcfb2009-08-22 21:43:10 +00002285 if (!MAI->doesDwarfUsesInlineInfoSection())
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002286 return 0;
2287
2288 if (TimePassesIsEnabled)
2289 DebugTimer->startTimer();
2290
Devang Patele4b27562009-08-28 23:24:31 +00002291 MDNode *Node = SP.getNode();
Devang Patelbdf45cb2009-10-27 20:47:17 +00002292 ValueMap<MDNode *, SmallVector<DbgScope *, 8> >::iterator
Devang Patele4b27562009-08-28 23:24:31 +00002293 I = DbgConcreteScopeMap.find(Node);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002294
2295 if (I == DbgConcreteScopeMap.end()) {
2296 // FIXME: Can this situation actually happen? And if so, should it?
2297 if (TimePassesIsEnabled)
2298 DebugTimer->stopTimer();
2299
2300 return 0;
2301 }
2302
2303 SmallVector<DbgScope *, 8> &Scopes = I->second;
Devang Patel11a407f2009-06-15 21:45:50 +00002304 if (Scopes.empty()) {
2305 // Returned ID is 0 if this is unbalanced "end of inlined
2306 // scope". This could happen if optimizer eats dbg intrinsics
2307 // or "beginning of inlined scope" is not recoginized due to
2308 // missing location info. In such cases, ignore this region.end.
2309 return 0;
2310 }
2311
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002312 DbgScope *Scope = Scopes.back(); Scopes.pop_back();
2313 unsigned ID = MMI->NextLabelID();
2314 MMI->RecordUsedDbgLabel(ID);
2315 Scope->setEndLabelID(ID);
2316
2317 if (TimePassesIsEnabled)
2318 DebugTimer->stopTimer();
2319
2320 return ID;
2321}
2322
Bill Wendling829e67b2009-05-20 23:22:40 +00002323//===----------------------------------------------------------------------===//
2324// Emit Methods
2325//===----------------------------------------------------------------------===//
2326
Bill Wendling94d04b82009-05-20 23:21:38 +00002327/// SizeAndOffsetDie - Compute the size and offset of a DIE.
2328///
2329unsigned DwarfDebug::SizeAndOffsetDie(DIE *Die, unsigned Offset, bool Last) {
2330 // Get the children.
2331 const std::vector<DIE *> &Children = Die->getChildren();
2332
2333 // If not last sibling and has children then add sibling offset attribute.
2334 if (!Last && !Children.empty()) Die->AddSiblingOffset();
2335
2336 // Record the abbreviation.
2337 AssignAbbrevNumber(Die->getAbbrev());
2338
2339 // Get the abbreviation for this DIE.
2340 unsigned AbbrevNumber = Die->getAbbrevNumber();
2341 const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2342
2343 // Set DIE offset
2344 Die->setOffset(Offset);
2345
2346 // Start the size with the size of abbreviation code.
Chris Lattneraf76e592009-08-22 20:48:53 +00002347 Offset += MCAsmInfo::getULEB128Size(AbbrevNumber);
Bill Wendling94d04b82009-05-20 23:21:38 +00002348
2349 const SmallVector<DIEValue*, 32> &Values = Die->getValues();
2350 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
2351
2352 // Size the DIE attribute values.
2353 for (unsigned i = 0, N = Values.size(); i < N; ++i)
2354 // Size attribute value.
2355 Offset += Values[i]->SizeOf(TD, AbbrevData[i].getForm());
2356
2357 // Size the DIE children if any.
2358 if (!Children.empty()) {
2359 assert(Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes &&
2360 "Children flag not set");
2361
2362 for (unsigned j = 0, M = Children.size(); j < M; ++j)
2363 Offset = SizeAndOffsetDie(Children[j], Offset, (j + 1) == M);
2364
2365 // End of children marker.
2366 Offset += sizeof(int8_t);
2367 }
2368
2369 Die->setSize(Offset - Die->getOffset());
2370 return Offset;
2371}
2372
2373/// SizeAndOffsets - Compute the size and offset of all the DIEs.
2374///
2375void DwarfDebug::SizeAndOffsets() {
2376 // Compute size of compile unit header.
2377 static unsigned Offset =
2378 sizeof(int32_t) + // Length of Compilation Unit Info
2379 sizeof(int16_t) + // DWARF version number
2380 sizeof(int32_t) + // Offset Into Abbrev. Section
2381 sizeof(int8_t); // Pointer Size (in bytes)
2382
Devang Patel1dbc7712009-06-29 20:45:18 +00002383 SizeAndOffsetDie(ModuleCU->getDie(), Offset, true);
2384 CompileUnitOffsets[ModuleCU] = 0;
Bill Wendling94d04b82009-05-20 23:21:38 +00002385}
2386
2387/// EmitInitial - Emit initial Dwarf declarations. This is necessary for cc
2388/// tools to recognize the object file contains Dwarf information.
2389void DwarfDebug::EmitInitial() {
2390 // Check to see if we already emitted intial headers.
2391 if (didInitial) return;
2392 didInitial = true;
2393
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002394 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
Daniel Dunbarf612ff62009-09-19 20:40:05 +00002395
Bill Wendling94d04b82009-05-20 23:21:38 +00002396 // Dwarf sections base addresses.
Chris Lattner33adcfb2009-08-22 21:43:10 +00002397 if (MAI->doesDwarfRequireFrameSection()) {
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002398 Asm->OutStreamer.SwitchSection(TLOF.getDwarfFrameSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002399 EmitLabel("section_debug_frame", 0);
2400 }
2401
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002402 Asm->OutStreamer.SwitchSection(TLOF.getDwarfInfoSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002403 EmitLabel("section_info", 0);
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002404 Asm->OutStreamer.SwitchSection(TLOF.getDwarfAbbrevSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002405 EmitLabel("section_abbrev", 0);
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002406 Asm->OutStreamer.SwitchSection(TLOF.getDwarfARangesSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002407 EmitLabel("section_aranges", 0);
2408
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002409 if (const MCSection *LineInfoDirective = TLOF.getDwarfMacroInfoSection()) {
2410 Asm->OutStreamer.SwitchSection(LineInfoDirective);
Bill Wendling94d04b82009-05-20 23:21:38 +00002411 EmitLabel("section_macinfo", 0);
2412 }
2413
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002414 Asm->OutStreamer.SwitchSection(TLOF.getDwarfLineSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002415 EmitLabel("section_line", 0);
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002416 Asm->OutStreamer.SwitchSection(TLOF.getDwarfLocSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002417 EmitLabel("section_loc", 0);
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002418 Asm->OutStreamer.SwitchSection(TLOF.getDwarfPubNamesSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002419 EmitLabel("section_pubnames", 0);
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002420 Asm->OutStreamer.SwitchSection(TLOF.getDwarfStrSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002421 EmitLabel("section_str", 0);
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002422 Asm->OutStreamer.SwitchSection(TLOF.getDwarfRangesSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002423 EmitLabel("section_ranges", 0);
2424
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002425 Asm->OutStreamer.SwitchSection(TLOF.getTextSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002426 EmitLabel("text_begin", 0);
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002427 Asm->OutStreamer.SwitchSection(TLOF.getDataSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002428 EmitLabel("data_begin", 0);
2429}
2430
2431/// EmitDIE - Recusively Emits a debug information entry.
2432///
2433void DwarfDebug::EmitDIE(DIE *Die) {
2434 // Get the abbreviation for this DIE.
2435 unsigned AbbrevNumber = Die->getAbbrevNumber();
2436 const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2437
2438 Asm->EOL();
2439
2440 // Emit the code (index) for the abbreviation.
2441 Asm->EmitULEB128Bytes(AbbrevNumber);
2442
2443 if (Asm->isVerbose())
2444 Asm->EOL(std::string("Abbrev [" +
2445 utostr(AbbrevNumber) +
2446 "] 0x" + utohexstr(Die->getOffset()) +
2447 ":0x" + utohexstr(Die->getSize()) + " " +
2448 dwarf::TagString(Abbrev->getTag())));
2449 else
2450 Asm->EOL();
2451
2452 SmallVector<DIEValue*, 32> &Values = Die->getValues();
2453 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
2454
2455 // Emit the DIE attribute values.
2456 for (unsigned i = 0, N = Values.size(); i < N; ++i) {
2457 unsigned Attr = AbbrevData[i].getAttribute();
2458 unsigned Form = AbbrevData[i].getForm();
2459 assert(Form && "Too many attributes for DIE (check abbreviation)");
2460
2461 switch (Attr) {
2462 case dwarf::DW_AT_sibling:
2463 Asm->EmitInt32(Die->SiblingOffset());
2464 break;
2465 case dwarf::DW_AT_abstract_origin: {
2466 DIEEntry *E = cast<DIEEntry>(Values[i]);
2467 DIE *Origin = E->getEntry();
2468 unsigned Addr =
2469 CompileUnitOffsets[Die->getAbstractCompileUnit()] +
2470 Origin->getOffset();
2471
2472 Asm->EmitInt32(Addr);
2473 break;
2474 }
2475 default:
2476 // Emit an attribute using the defined form.
2477 Values[i]->EmitValue(this, Form);
2478 break;
2479 }
2480
2481 Asm->EOL(dwarf::AttributeString(Attr));
2482 }
2483
2484 // Emit the DIE children if any.
2485 if (Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes) {
2486 const std::vector<DIE *> &Children = Die->getChildren();
2487
2488 for (unsigned j = 0, M = Children.size(); j < M; ++j)
2489 EmitDIE(Children[j]);
2490
2491 Asm->EmitInt8(0); Asm->EOL("End Of Children Mark");
2492 }
2493}
2494
2495/// EmitDebugInfo / EmitDebugInfoPerCU - Emit the debug info section.
2496///
2497void DwarfDebug::EmitDebugInfoPerCU(CompileUnit *Unit) {
2498 DIE *Die = Unit->getDie();
2499
2500 // Emit the compile units header.
2501 EmitLabel("info_begin", Unit->getID());
2502
2503 // Emit size of content not including length itself
2504 unsigned ContentSize = Die->getSize() +
2505 sizeof(int16_t) + // DWARF version number
2506 sizeof(int32_t) + // Offset Into Abbrev. Section
2507 sizeof(int8_t) + // Pointer Size (in bytes)
2508 sizeof(int32_t); // FIXME - extra pad for gdb bug.
2509
2510 Asm->EmitInt32(ContentSize); Asm->EOL("Length of Compilation Unit Info");
2511 Asm->EmitInt16(dwarf::DWARF_VERSION); Asm->EOL("DWARF version number");
2512 EmitSectionOffset("abbrev_begin", "section_abbrev", 0, 0, true, false);
2513 Asm->EOL("Offset Into Abbrev. Section");
2514 Asm->EmitInt8(TD->getPointerSize()); Asm->EOL("Address Size (in bytes)");
2515
2516 EmitDIE(Die);
2517 // FIXME - extra padding for gdb bug.
2518 Asm->EmitInt8(0); Asm->EOL("Extra Pad For GDB");
2519 Asm->EmitInt8(0); Asm->EOL("Extra Pad For GDB");
2520 Asm->EmitInt8(0); Asm->EOL("Extra Pad For GDB");
2521 Asm->EmitInt8(0); Asm->EOL("Extra Pad For GDB");
2522 EmitLabel("info_end", Unit->getID());
2523
2524 Asm->EOL();
2525}
2526
2527void DwarfDebug::EmitDebugInfo() {
2528 // Start debug info section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002529 Asm->OutStreamer.SwitchSection(
2530 Asm->getObjFileLowering().getDwarfInfoSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002531
Devang Patel1dbc7712009-06-29 20:45:18 +00002532 EmitDebugInfoPerCU(ModuleCU);
Bill Wendling94d04b82009-05-20 23:21:38 +00002533}
2534
2535/// EmitAbbreviations - Emit the abbreviation section.
2536///
2537void DwarfDebug::EmitAbbreviations() const {
2538 // Check to see if it is worth the effort.
2539 if (!Abbreviations.empty()) {
2540 // Start the debug abbrev section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002541 Asm->OutStreamer.SwitchSection(
2542 Asm->getObjFileLowering().getDwarfAbbrevSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002543
2544 EmitLabel("abbrev_begin", 0);
2545
2546 // For each abbrevation.
2547 for (unsigned i = 0, N = Abbreviations.size(); i < N; ++i) {
2548 // Get abbreviation data
2549 const DIEAbbrev *Abbrev = Abbreviations[i];
2550
2551 // Emit the abbrevations code (base 1 index.)
2552 Asm->EmitULEB128Bytes(Abbrev->getNumber());
2553 Asm->EOL("Abbreviation Code");
2554
2555 // Emit the abbreviations data.
2556 Abbrev->Emit(Asm);
2557
2558 Asm->EOL();
2559 }
2560
2561 // Mark end of abbreviations.
2562 Asm->EmitULEB128Bytes(0); Asm->EOL("EOM(3)");
2563
2564 EmitLabel("abbrev_end", 0);
2565 Asm->EOL();
2566 }
2567}
2568
2569/// EmitEndOfLineMatrix - Emit the last address of the section and the end of
2570/// the line matrix.
2571///
2572void DwarfDebug::EmitEndOfLineMatrix(unsigned SectionEnd) {
2573 // Define last address of section.
2574 Asm->EmitInt8(0); Asm->EOL("Extended Op");
2575 Asm->EmitInt8(TD->getPointerSize() + 1); Asm->EOL("Op size");
2576 Asm->EmitInt8(dwarf::DW_LNE_set_address); Asm->EOL("DW_LNE_set_address");
2577 EmitReference("section_end", SectionEnd); Asm->EOL("Section end label");
2578
2579 // Mark end of matrix.
2580 Asm->EmitInt8(0); Asm->EOL("DW_LNE_end_sequence");
2581 Asm->EmitULEB128Bytes(1); Asm->EOL();
2582 Asm->EmitInt8(1); Asm->EOL();
2583}
2584
2585/// EmitDebugLines - Emit source line information.
2586///
2587void DwarfDebug::EmitDebugLines() {
2588 // If the target is using .loc/.file, the assembler will be emitting the
2589 // .debug_line table automatically.
Chris Lattner33adcfb2009-08-22 21:43:10 +00002590 if (MAI->hasDotLocAndDotFile())
Bill Wendling94d04b82009-05-20 23:21:38 +00002591 return;
2592
2593 // Minimum line delta, thus ranging from -10..(255-10).
2594 const int MinLineDelta = -(dwarf::DW_LNS_fixed_advance_pc + 1);
2595 // Maximum line delta, thus ranging from -10..(255-10).
2596 const int MaxLineDelta = 255 + MinLineDelta;
2597
2598 // Start the dwarf line section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002599 Asm->OutStreamer.SwitchSection(
2600 Asm->getObjFileLowering().getDwarfLineSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002601
2602 // Construct the section header.
2603 EmitDifference("line_end", 0, "line_begin", 0, true);
2604 Asm->EOL("Length of Source Line Info");
2605 EmitLabel("line_begin", 0);
2606
2607 Asm->EmitInt16(dwarf::DWARF_VERSION); Asm->EOL("DWARF version number");
2608
2609 EmitDifference("line_prolog_end", 0, "line_prolog_begin", 0, true);
2610 Asm->EOL("Prolog Length");
2611 EmitLabel("line_prolog_begin", 0);
2612
2613 Asm->EmitInt8(1); Asm->EOL("Minimum Instruction Length");
2614
2615 Asm->EmitInt8(1); Asm->EOL("Default is_stmt_start flag");
2616
2617 Asm->EmitInt8(MinLineDelta); Asm->EOL("Line Base Value (Special Opcodes)");
2618
2619 Asm->EmitInt8(MaxLineDelta); Asm->EOL("Line Range Value (Special Opcodes)");
2620
2621 Asm->EmitInt8(-MinLineDelta); Asm->EOL("Special Opcode Base");
2622
2623 // Line number standard opcode encodings argument count
2624 Asm->EmitInt8(0); Asm->EOL("DW_LNS_copy arg count");
2625 Asm->EmitInt8(1); Asm->EOL("DW_LNS_advance_pc arg count");
2626 Asm->EmitInt8(1); Asm->EOL("DW_LNS_advance_line arg count");
2627 Asm->EmitInt8(1); Asm->EOL("DW_LNS_set_file arg count");
2628 Asm->EmitInt8(1); Asm->EOL("DW_LNS_set_column arg count");
2629 Asm->EmitInt8(0); Asm->EOL("DW_LNS_negate_stmt arg count");
2630 Asm->EmitInt8(0); Asm->EOL("DW_LNS_set_basic_block arg count");
2631 Asm->EmitInt8(0); Asm->EOL("DW_LNS_const_add_pc arg count");
2632 Asm->EmitInt8(1); Asm->EOL("DW_LNS_fixed_advance_pc arg count");
2633
2634 // Emit directories.
2635 for (unsigned DI = 1, DE = getNumSourceDirectories()+1; DI != DE; ++DI) {
2636 Asm->EmitString(getSourceDirectoryName(DI));
2637 Asm->EOL("Directory");
2638 }
2639
2640 Asm->EmitInt8(0); Asm->EOL("End of directories");
2641
2642 // Emit files.
2643 for (unsigned SI = 1, SE = getNumSourceIds()+1; SI != SE; ++SI) {
2644 // Remember source id starts at 1.
2645 std::pair<unsigned, unsigned> Id = getSourceDirectoryAndFileIds(SI);
2646 Asm->EmitString(getSourceFileName(Id.second));
2647 Asm->EOL("Source");
2648 Asm->EmitULEB128Bytes(Id.first);
2649 Asm->EOL("Directory #");
2650 Asm->EmitULEB128Bytes(0);
2651 Asm->EOL("Mod date");
2652 Asm->EmitULEB128Bytes(0);
2653 Asm->EOL("File size");
2654 }
2655
2656 Asm->EmitInt8(0); Asm->EOL("End of files");
2657
2658 EmitLabel("line_prolog_end", 0);
2659
2660 // A sequence for each text section.
2661 unsigned SecSrcLinesSize = SectionSourceLines.size();
2662
2663 for (unsigned j = 0; j < SecSrcLinesSize; ++j) {
2664 // Isolate current sections line info.
2665 const std::vector<SrcLineInfo> &LineInfos = SectionSourceLines[j];
2666
Chris Lattner93b6db32009-08-08 23:39:42 +00002667 /*if (Asm->isVerbose()) {
Chris Lattnera87dea42009-07-31 18:48:30 +00002668 const MCSection *S = SectionMap[j + 1];
Chris Lattner33adcfb2009-08-22 21:43:10 +00002669 O << '\t' << MAI->getCommentString() << " Section"
Bill Wendling94d04b82009-05-20 23:21:38 +00002670 << S->getName() << '\n';
Chris Lattner93b6db32009-08-08 23:39:42 +00002671 }*/
2672 Asm->EOL();
Bill Wendling94d04b82009-05-20 23:21:38 +00002673
2674 // Dwarf assumes we start with first line of first source file.
2675 unsigned Source = 1;
2676 unsigned Line = 1;
2677
2678 // Construct rows of the address, source, line, column matrix.
2679 for (unsigned i = 0, N = LineInfos.size(); i < N; ++i) {
2680 const SrcLineInfo &LineInfo = LineInfos[i];
2681 unsigned LabelID = MMI->MappedLabel(LineInfo.getLabelID());
2682 if (!LabelID) continue;
2683
Caroline Ticec6f9d622009-09-11 18:25:54 +00002684 if (LineInfo.getLine() == 0) continue;
2685
Bill Wendling94d04b82009-05-20 23:21:38 +00002686 if (!Asm->isVerbose())
2687 Asm->EOL();
2688 else {
2689 std::pair<unsigned, unsigned> SourceID =
2690 getSourceDirectoryAndFileIds(LineInfo.getSourceID());
Chris Lattner33adcfb2009-08-22 21:43:10 +00002691 O << '\t' << MAI->getCommentString() << ' '
Bill Wendling94d04b82009-05-20 23:21:38 +00002692 << getSourceDirectoryName(SourceID.first) << ' '
2693 << getSourceFileName(SourceID.second)
2694 <<" :" << utostr_32(LineInfo.getLine()) << '\n';
2695 }
2696
2697 // Define the line address.
2698 Asm->EmitInt8(0); Asm->EOL("Extended Op");
2699 Asm->EmitInt8(TD->getPointerSize() + 1); Asm->EOL("Op size");
2700 Asm->EmitInt8(dwarf::DW_LNE_set_address); Asm->EOL("DW_LNE_set_address");
2701 EmitReference("label", LabelID); Asm->EOL("Location label");
2702
2703 // If change of source, then switch to the new source.
2704 if (Source != LineInfo.getSourceID()) {
2705 Source = LineInfo.getSourceID();
2706 Asm->EmitInt8(dwarf::DW_LNS_set_file); Asm->EOL("DW_LNS_set_file");
2707 Asm->EmitULEB128Bytes(Source); Asm->EOL("New Source");
2708 }
2709
2710 // If change of line.
2711 if (Line != LineInfo.getLine()) {
2712 // Determine offset.
2713 int Offset = LineInfo.getLine() - Line;
2714 int Delta = Offset - MinLineDelta;
2715
2716 // Update line.
2717 Line = LineInfo.getLine();
2718
2719 // If delta is small enough and in range...
2720 if (Delta >= 0 && Delta < (MaxLineDelta - 1)) {
2721 // ... then use fast opcode.
2722 Asm->EmitInt8(Delta - MinLineDelta); Asm->EOL("Line Delta");
2723 } else {
2724 // ... otherwise use long hand.
2725 Asm->EmitInt8(dwarf::DW_LNS_advance_line);
2726 Asm->EOL("DW_LNS_advance_line");
2727 Asm->EmitSLEB128Bytes(Offset); Asm->EOL("Line Offset");
2728 Asm->EmitInt8(dwarf::DW_LNS_copy); Asm->EOL("DW_LNS_copy");
2729 }
2730 } else {
2731 // Copy the previous row (different address or source)
2732 Asm->EmitInt8(dwarf::DW_LNS_copy); Asm->EOL("DW_LNS_copy");
2733 }
2734 }
2735
2736 EmitEndOfLineMatrix(j + 1);
2737 }
2738
2739 if (SecSrcLinesSize == 0)
2740 // Because we're emitting a debug_line section, we still need a line
2741 // table. The linker and friends expect it to exist. If there's nothing to
2742 // put into it, emit an empty table.
2743 EmitEndOfLineMatrix(1);
2744
2745 EmitLabel("line_end", 0);
2746 Asm->EOL();
2747}
2748
2749/// EmitCommonDebugFrame - Emit common frame info into a debug frame section.
2750///
2751void DwarfDebug::EmitCommonDebugFrame() {
Chris Lattner33adcfb2009-08-22 21:43:10 +00002752 if (!MAI->doesDwarfRequireFrameSection())
Bill Wendling94d04b82009-05-20 23:21:38 +00002753 return;
2754
2755 int stackGrowth =
2756 Asm->TM.getFrameInfo()->getStackGrowthDirection() ==
2757 TargetFrameInfo::StackGrowsUp ?
2758 TD->getPointerSize() : -TD->getPointerSize();
2759
2760 // Start the dwarf frame section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002761 Asm->OutStreamer.SwitchSection(
2762 Asm->getObjFileLowering().getDwarfFrameSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002763
2764 EmitLabel("debug_frame_common", 0);
2765 EmitDifference("debug_frame_common_end", 0,
2766 "debug_frame_common_begin", 0, true);
2767 Asm->EOL("Length of Common Information Entry");
2768
2769 EmitLabel("debug_frame_common_begin", 0);
2770 Asm->EmitInt32((int)dwarf::DW_CIE_ID);
2771 Asm->EOL("CIE Identifier Tag");
2772 Asm->EmitInt8(dwarf::DW_CIE_VERSION);
2773 Asm->EOL("CIE Version");
2774 Asm->EmitString("");
2775 Asm->EOL("CIE Augmentation");
2776 Asm->EmitULEB128Bytes(1);
2777 Asm->EOL("CIE Code Alignment Factor");
2778 Asm->EmitSLEB128Bytes(stackGrowth);
2779 Asm->EOL("CIE Data Alignment Factor");
2780 Asm->EmitInt8(RI->getDwarfRegNum(RI->getRARegister(), false));
2781 Asm->EOL("CIE RA Column");
2782
2783 std::vector<MachineMove> Moves;
2784 RI->getInitialFrameState(Moves);
2785
2786 EmitFrameMoves(NULL, 0, Moves, false);
2787
2788 Asm->EmitAlignment(2, 0, 0, false);
2789 EmitLabel("debug_frame_common_end", 0);
2790
2791 Asm->EOL();
2792}
2793
2794/// EmitFunctionDebugFrame - Emit per function frame info into a debug frame
2795/// section.
2796void
2797DwarfDebug::EmitFunctionDebugFrame(const FunctionDebugFrameInfo&DebugFrameInfo){
Chris Lattner33adcfb2009-08-22 21:43:10 +00002798 if (!MAI->doesDwarfRequireFrameSection())
Bill Wendling94d04b82009-05-20 23:21:38 +00002799 return;
2800
2801 // Start the dwarf frame section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002802 Asm->OutStreamer.SwitchSection(
2803 Asm->getObjFileLowering().getDwarfFrameSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002804
2805 EmitDifference("debug_frame_end", DebugFrameInfo.Number,
2806 "debug_frame_begin", DebugFrameInfo.Number, true);
2807 Asm->EOL("Length of Frame Information Entry");
2808
2809 EmitLabel("debug_frame_begin", DebugFrameInfo.Number);
2810
2811 EmitSectionOffset("debug_frame_common", "section_debug_frame",
2812 0, 0, true, false);
2813 Asm->EOL("FDE CIE offset");
2814
2815 EmitReference("func_begin", DebugFrameInfo.Number);
2816 Asm->EOL("FDE initial location");
2817 EmitDifference("func_end", DebugFrameInfo.Number,
2818 "func_begin", DebugFrameInfo.Number);
2819 Asm->EOL("FDE address range");
2820
2821 EmitFrameMoves("func_begin", DebugFrameInfo.Number, DebugFrameInfo.Moves,
2822 false);
2823
2824 Asm->EmitAlignment(2, 0, 0, false);
2825 EmitLabel("debug_frame_end", DebugFrameInfo.Number);
2826
2827 Asm->EOL();
2828}
2829
2830void DwarfDebug::EmitDebugPubNamesPerCU(CompileUnit *Unit) {
2831 EmitDifference("pubnames_end", Unit->getID(),
2832 "pubnames_begin", Unit->getID(), true);
2833 Asm->EOL("Length of Public Names Info");
2834
2835 EmitLabel("pubnames_begin", Unit->getID());
2836
2837 Asm->EmitInt16(dwarf::DWARF_VERSION); Asm->EOL("DWARF Version");
2838
2839 EmitSectionOffset("info_begin", "section_info",
2840 Unit->getID(), 0, true, false);
2841 Asm->EOL("Offset of Compilation Unit Info");
2842
2843 EmitDifference("info_end", Unit->getID(), "info_begin", Unit->getID(),
2844 true);
2845 Asm->EOL("Compilation Unit Length");
2846
2847 StringMap<DIE*> &Globals = Unit->getGlobals();
2848 for (StringMap<DIE*>::const_iterator
2849 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2850 const char *Name = GI->getKeyData();
2851 DIE * Entity = GI->second;
2852
2853 Asm->EmitInt32(Entity->getOffset()); Asm->EOL("DIE offset");
2854 Asm->EmitString(Name, strlen(Name)); Asm->EOL("External Name");
2855 }
2856
2857 Asm->EmitInt32(0); Asm->EOL("End Mark");
2858 EmitLabel("pubnames_end", Unit->getID());
2859
2860 Asm->EOL();
2861}
2862
2863/// EmitDebugPubNames - Emit visible names into a debug pubnames section.
2864///
2865void DwarfDebug::EmitDebugPubNames() {
2866 // Start the dwarf pubnames section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002867 Asm->OutStreamer.SwitchSection(
2868 Asm->getObjFileLowering().getDwarfPubNamesSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002869
Devang Patel1dbc7712009-06-29 20:45:18 +00002870 EmitDebugPubNamesPerCU(ModuleCU);
Bill Wendling94d04b82009-05-20 23:21:38 +00002871}
2872
2873/// EmitDebugStr - Emit visible names into a debug str section.
2874///
2875void DwarfDebug::EmitDebugStr() {
2876 // Check to see if it is worth the effort.
2877 if (!StringPool.empty()) {
2878 // Start the dwarf str section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002879 Asm->OutStreamer.SwitchSection(
2880 Asm->getObjFileLowering().getDwarfStrSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002881
2882 // For each of strings in the string pool.
2883 for (unsigned StringID = 1, N = StringPool.size();
2884 StringID <= N; ++StringID) {
2885 // Emit a label for reference from debug information entries.
2886 EmitLabel("string", StringID);
2887
2888 // Emit the string itself.
2889 const std::string &String = StringPool[StringID];
2890 Asm->EmitString(String); Asm->EOL();
2891 }
2892
2893 Asm->EOL();
2894 }
2895}
2896
2897/// EmitDebugLoc - Emit visible names into a debug loc section.
2898///
2899void DwarfDebug::EmitDebugLoc() {
2900 // Start the dwarf loc section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002901 Asm->OutStreamer.SwitchSection(
2902 Asm->getObjFileLowering().getDwarfLocSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002903 Asm->EOL();
2904}
2905
2906/// EmitDebugARanges - Emit visible names into a debug aranges section.
2907///
2908void DwarfDebug::EmitDebugARanges() {
2909 // Start the dwarf aranges section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002910 Asm->OutStreamer.SwitchSection(
2911 Asm->getObjFileLowering().getDwarfARangesSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002912
2913 // FIXME - Mock up
2914#if 0
2915 CompileUnit *Unit = GetBaseCompileUnit();
2916
2917 // Don't include size of length
2918 Asm->EmitInt32(0x1c); Asm->EOL("Length of Address Ranges Info");
2919
2920 Asm->EmitInt16(dwarf::DWARF_VERSION); Asm->EOL("Dwarf Version");
2921
2922 EmitReference("info_begin", Unit->getID());
2923 Asm->EOL("Offset of Compilation Unit Info");
2924
2925 Asm->EmitInt8(TD->getPointerSize()); Asm->EOL("Size of Address");
2926
2927 Asm->EmitInt8(0); Asm->EOL("Size of Segment Descriptor");
2928
2929 Asm->EmitInt16(0); Asm->EOL("Pad (1)");
2930 Asm->EmitInt16(0); Asm->EOL("Pad (2)");
2931
2932 // Range 1
2933 EmitReference("text_begin", 0); Asm->EOL("Address");
2934 EmitDifference("text_end", 0, "text_begin", 0, true); Asm->EOL("Length");
2935
2936 Asm->EmitInt32(0); Asm->EOL("EOM (1)");
2937 Asm->EmitInt32(0); Asm->EOL("EOM (2)");
2938#endif
2939
2940 Asm->EOL();
2941}
2942
2943/// EmitDebugRanges - Emit visible names into a debug ranges section.
2944///
2945void DwarfDebug::EmitDebugRanges() {
2946 // Start the dwarf ranges section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002947 Asm->OutStreamer.SwitchSection(
2948 Asm->getObjFileLowering().getDwarfRangesSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002949 Asm->EOL();
2950}
2951
2952/// EmitDebugMacInfo - Emit visible names into a debug macinfo section.
2953///
2954void DwarfDebug::EmitDebugMacInfo() {
Daniel Dunbarf612ff62009-09-19 20:40:05 +00002955 if (const MCSection *LineInfo =
Chris Lattner18a4c162009-08-02 07:24:22 +00002956 Asm->getObjFileLowering().getDwarfMacroInfoSection()) {
Bill Wendling94d04b82009-05-20 23:21:38 +00002957 // Start the dwarf macinfo section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002958 Asm->OutStreamer.SwitchSection(LineInfo);
Bill Wendling94d04b82009-05-20 23:21:38 +00002959 Asm->EOL();
2960 }
2961}
2962
2963/// EmitDebugInlineInfo - Emit inline info using following format.
2964/// Section Header:
2965/// 1. length of section
2966/// 2. Dwarf version number
2967/// 3. address size.
2968///
2969/// Entries (one "entry" for each function that was inlined):
2970///
2971/// 1. offset into __debug_str section for MIPS linkage name, if exists;
2972/// otherwise offset into __debug_str for regular function name.
2973/// 2. offset into __debug_str section for regular function name.
2974/// 3. an unsigned LEB128 number indicating the number of distinct inlining
2975/// instances for the function.
2976///
2977/// The rest of the entry consists of a {die_offset, low_pc} pair for each
2978/// inlined instance; the die_offset points to the inlined_subroutine die in the
2979/// __debug_info section, and the low_pc is the starting address for the
2980/// inlining instance.
2981void DwarfDebug::EmitDebugInlineInfo() {
Chris Lattner33adcfb2009-08-22 21:43:10 +00002982 if (!MAI->doesDwarfUsesInlineInfoSection())
Bill Wendling94d04b82009-05-20 23:21:38 +00002983 return;
2984
Devang Patel1dbc7712009-06-29 20:45:18 +00002985 if (!ModuleCU)
Bill Wendling94d04b82009-05-20 23:21:38 +00002986 return;
2987
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002988 Asm->OutStreamer.SwitchSection(
2989 Asm->getObjFileLowering().getDwarfDebugInlineSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002990 Asm->EOL();
2991 EmitDifference("debug_inlined_end", 1,
2992 "debug_inlined_begin", 1, true);
2993 Asm->EOL("Length of Debug Inlined Information Entry");
2994
2995 EmitLabel("debug_inlined_begin", 1);
2996
2997 Asm->EmitInt16(dwarf::DWARF_VERSION); Asm->EOL("Dwarf Version");
2998 Asm->EmitInt8(TD->getPointerSize()); Asm->EOL("Address Size (in bytes)");
2999
Devang Patelbdf45cb2009-10-27 20:47:17 +00003000 for (ValueMap<MDNode *, SmallVector<unsigned, 4> >::iterator
Bill Wendling94d04b82009-05-20 23:21:38 +00003001 I = InlineInfo.begin(), E = InlineInfo.end(); I != E; ++I) {
Devang Patele4b27562009-08-28 23:24:31 +00003002 MDNode *Node = I->first;
Bill Wendling94d04b82009-05-20 23:21:38 +00003003 SmallVector<unsigned, 4> &Labels = I->second;
Devang Patele4b27562009-08-28 23:24:31 +00003004 DISubprogram SP(Node);
Devang Patel5ccdd102009-09-29 18:40:58 +00003005 const char *LName = SP.getLinkageName();
3006 const char *Name = SP.getName();
Bill Wendling94d04b82009-05-20 23:21:38 +00003007
Devang Patel5ccdd102009-09-29 18:40:58 +00003008 if (!LName)
Devang Patel53cb17d2009-07-16 01:01:22 +00003009 Asm->EmitString(Name);
3010 else {
Chris Lattner6c2f9e12009-08-19 05:49:37 +00003011 // Skip special LLVM prefix that is used to inform the asm printer to not
3012 // emit usual symbol prefix before the symbol name. This happens for
3013 // Objective-C symbol names and symbol whose name is replaced using GCC's
3014 // __asm__ attribute.
Devang Patel53cb17d2009-07-16 01:01:22 +00003015 if (LName[0] == 1)
3016 LName = &LName[1];
3017 Asm->EmitString(LName);
3018 }
Bill Wendling94d04b82009-05-20 23:21:38 +00003019 Asm->EOL("MIPS linkage name");
3020
3021 Asm->EmitString(Name); Asm->EOL("Function name");
3022
3023 Asm->EmitULEB128Bytes(Labels.size()); Asm->EOL("Inline count");
3024
3025 for (SmallVector<unsigned, 4>::iterator LI = Labels.begin(),
3026 LE = Labels.end(); LI != LE; ++LI) {
Devang Patele4b27562009-08-28 23:24:31 +00003027 DIE *SP = ModuleCU->getDieMapSlotFor(Node);
Bill Wendling94d04b82009-05-20 23:21:38 +00003028 Asm->EmitInt32(SP->getOffset()); Asm->EOL("DIE offset");
3029
3030 if (TD->getPointerSize() == sizeof(int32_t))
Chris Lattner33adcfb2009-08-22 21:43:10 +00003031 O << MAI->getData32bitsDirective();
Bill Wendling94d04b82009-05-20 23:21:38 +00003032 else
Chris Lattner33adcfb2009-08-22 21:43:10 +00003033 O << MAI->getData64bitsDirective();
Bill Wendling94d04b82009-05-20 23:21:38 +00003034
3035 PrintLabelName("label", *LI); Asm->EOL("low_pc");
3036 }
3037 }
3038
3039 EmitLabel("debug_inlined_end", 1);
3040 Asm->EOL();
3041}