blob: 811bf65d9d02ea1c556ebd6c428aaf63548b06ba [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"
Chris Lattner334fd1f2009-09-16 00:08:41 +000026#include "llvm/Support/Mangler.h"
Chris Lattnera87dea42009-07-31 18:48:30 +000027#include "llvm/Support/Timer.h"
Devang Patele4b27562009-08-28 23:24:31 +000028#include "llvm/Support/Debug.h"
Chris Lattnera87dea42009-07-31 18:48:30 +000029#include "llvm/System/Path.h"
Bill Wendling0310d762009-05-15 09:23:25 +000030using namespace llvm;
31
32static TimerGroup &getDwarfTimerGroup() {
33 static TimerGroup DwarfTimerGroup("Dwarf Debugging");
34 return DwarfTimerGroup;
35}
36
37//===----------------------------------------------------------------------===//
38
39/// Configuration values for initial hash set sizes (log2).
40///
41static const unsigned InitDiesSetSize = 9; // log2(512)
42static const unsigned InitAbbreviationsSetSize = 9; // log2(512)
43static const unsigned InitValuesSetSize = 9; // log2(512)
44
45namespace llvm {
46
47//===----------------------------------------------------------------------===//
48/// CompileUnit - This dwarf writer support class manages information associate
49/// with a source file.
50class VISIBILITY_HIDDEN CompileUnit {
51 /// ID - File identifier for source.
52 ///
53 unsigned ID;
54
55 /// Die - Compile unit debug information entry.
56 ///
57 DIE *Die;
58
59 /// GVToDieMap - Tracks the mapping of unit level debug informaton
60 /// variables to debug information entries.
Devang Patele4b27562009-08-28 23:24:31 +000061 /// FIXME : Rename GVToDieMap -> NodeToDieMap
62 std::map<MDNode *, DIE *> GVToDieMap;
Bill Wendling0310d762009-05-15 09:23:25 +000063
64 /// GVToDIEEntryMap - Tracks the mapping of unit level debug informaton
65 /// descriptors to debug information entries using a DIEEntry proxy.
Devang Patele4b27562009-08-28 23:24:31 +000066 /// FIXME : Rename
67 std::map<MDNode *, DIEEntry *> GVToDIEEntryMap;
Bill Wendling0310d762009-05-15 09:23:25 +000068
69 /// Globals - A map of globally visible named entities for this unit.
70 ///
71 StringMap<DIE*> Globals;
72
73 /// DiesSet - Used to uniquely define dies within the compile unit.
74 ///
75 FoldingSet<DIE> DiesSet;
76public:
77 CompileUnit(unsigned I, DIE *D)
Bill Wendling39dd6962009-05-20 23:31:45 +000078 : ID(I), Die(D), DiesSet(InitDiesSetSize) {}
79 ~CompileUnit() { delete Die; }
Bill Wendling0310d762009-05-15 09:23:25 +000080
81 // Accessors.
Bill Wendling39dd6962009-05-20 23:31:45 +000082 unsigned getID() const { return ID; }
83 DIE* getDie() const { return Die; }
Bill Wendling0310d762009-05-15 09:23:25 +000084 StringMap<DIE*> &getGlobals() { return Globals; }
85
86 /// hasContent - Return true if this compile unit has something to write out.
87 ///
Bill Wendling39dd6962009-05-20 23:31:45 +000088 bool hasContent() const { return !Die->getChildren().empty(); }
Bill Wendling0310d762009-05-15 09:23:25 +000089
90 /// AddGlobal - Add a new global entity to the compile unit.
91 ///
Bill Wendling39dd6962009-05-20 23:31:45 +000092 void AddGlobal(const std::string &Name, DIE *Die) { Globals[Name] = Die; }
Bill Wendling0310d762009-05-15 09:23:25 +000093
94 /// getDieMapSlotFor - Returns the debug information entry map slot for the
95 /// specified debug variable.
Devang Patele4b27562009-08-28 23:24:31 +000096 DIE *&getDieMapSlotFor(MDNode *N) { return GVToDieMap[N]; }
Bill Wendling0310d762009-05-15 09:23:25 +000097
Chris Lattner1cda87c2009-07-14 04:50:12 +000098 /// getDIEEntrySlotFor - Returns the debug information entry proxy slot for
99 /// the specified debug variable.
Devang Patele4b27562009-08-28 23:24:31 +0000100 DIEEntry *&getDIEEntrySlotFor(MDNode *N) {
101 return GVToDIEEntryMap[N];
Bill Wendling0310d762009-05-15 09:23:25 +0000102 }
103
104 /// AddDie - Adds or interns the DIE to the compile unit.
105 ///
106 DIE *AddDie(DIE &Buffer) {
107 FoldingSetNodeID ID;
108 Buffer.Profile(ID);
109 void *Where;
110 DIE *Die = DiesSet.FindNodeOrInsertPos(ID, Where);
111
112 if (!Die) {
113 Die = new DIE(Buffer);
114 DiesSet.InsertNode(Die, Where);
115 this->Die->AddChild(Die);
116 Buffer.Detach();
117 }
118
119 return Die;
120 }
121};
122
123//===----------------------------------------------------------------------===//
124/// DbgVariable - This class is used to track local variable information.
125///
126class VISIBILITY_HIDDEN DbgVariable {
127 DIVariable Var; // Variable Descriptor.
128 unsigned FrameIndex; // Variable frame index.
Bill Wendling1180c782009-05-18 23:08:55 +0000129 bool InlinedFnVar; // Variable for an inlined function.
Bill Wendling0310d762009-05-15 09:23:25 +0000130public:
Bill Wendling1180c782009-05-18 23:08:55 +0000131 DbgVariable(DIVariable V, unsigned I, bool IFV)
132 : Var(V), FrameIndex(I), InlinedFnVar(IFV) {}
Bill Wendling0310d762009-05-15 09:23:25 +0000133
134 // Accessors.
Bill Wendling1180c782009-05-18 23:08:55 +0000135 DIVariable getVariable() const { return Var; }
Bill Wendling0310d762009-05-15 09:23:25 +0000136 unsigned getFrameIndex() const { return FrameIndex; }
Bill Wendling1180c782009-05-18 23:08:55 +0000137 bool isInlinedFnVar() const { return InlinedFnVar; }
Bill Wendling0310d762009-05-15 09:23:25 +0000138};
139
140//===----------------------------------------------------------------------===//
141/// DbgScope - This class is used to track scope information.
142///
143class DbgConcreteScope;
144class VISIBILITY_HIDDEN DbgScope {
145 DbgScope *Parent; // Parent to this scope.
146 DIDescriptor Desc; // Debug info descriptor for scope.
147 // Either subprogram or block.
148 unsigned StartLabelID; // Label ID of the beginning of scope.
149 unsigned EndLabelID; // Label ID of the end of scope.
Devang Pateld38dd112009-10-01 18:25:23 +0000150 const MachineInstr *LastInsn; // Last instruction of this scope.
151 const MachineInstr *FirstInsn; // First instruction of this scope.
Bill Wendling0310d762009-05-15 09:23:25 +0000152 SmallVector<DbgScope *, 4> Scopes; // Scopes defined in scope.
153 SmallVector<DbgVariable *, 8> Variables;// Variables declared in scope.
154 SmallVector<DbgConcreteScope *, 8> ConcreteInsts;// Concrete insts of funcs.
Daniel Dunbarf612ff62009-09-19 20:40:05 +0000155
Owen Anderson04c05f72009-06-24 22:53:20 +0000156 // Private state for dump()
157 mutable unsigned IndentLevel;
Bill Wendling0310d762009-05-15 09:23:25 +0000158public:
159 DbgScope(DbgScope *P, DIDescriptor D)
Devang Pateld38dd112009-10-01 18:25:23 +0000160 : Parent(P), Desc(D), StartLabelID(0), EndLabelID(0), LastInsn(0),
161 FirstInsn(0), IndentLevel(0) {}
Bill Wendling0310d762009-05-15 09:23:25 +0000162 virtual ~DbgScope();
163
164 // Accessors.
165 DbgScope *getParent() const { return Parent; }
166 DIDescriptor getDesc() const { return Desc; }
167 unsigned getStartLabelID() const { return StartLabelID; }
168 unsigned getEndLabelID() const { return EndLabelID; }
169 SmallVector<DbgScope *, 4> &getScopes() { return Scopes; }
170 SmallVector<DbgVariable *, 8> &getVariables() { return Variables; }
171 SmallVector<DbgConcreteScope*,8> &getConcreteInsts() { return ConcreteInsts; }
172 void setStartLabelID(unsigned S) { StartLabelID = S; }
173 void setEndLabelID(unsigned E) { EndLabelID = E; }
Devang Pateld38dd112009-10-01 18:25:23 +0000174 void setLastInsn(const MachineInstr *MI) { LastInsn = MI; }
175 const MachineInstr *getLastInsn() { return LastInsn; }
176 void setFirstInsn(const MachineInstr *MI) { FirstInsn = MI; }
177 const MachineInstr *getFirstInsn() { return FirstInsn; }
Bill Wendling0310d762009-05-15 09:23:25 +0000178 /// AddScope - Add a scope to the scope.
179 ///
180 void AddScope(DbgScope *S) { Scopes.push_back(S); }
181
182 /// AddVariable - Add a variable to the scope.
183 ///
184 void AddVariable(DbgVariable *V) { Variables.push_back(V); }
185
186 /// AddConcreteInst - Add a concrete instance to the scope.
187 ///
188 void AddConcreteInst(DbgConcreteScope *C) { ConcreteInsts.push_back(C); }
189
Devang Patelaf9e8472009-10-01 20:31:14 +0000190 void FixInstructionMarkers() {
191 assert (getFirstInsn() && "First instruction is missing!");
192 if (getLastInsn())
193 return;
194
195 // If a scope does not have an instruction to mark an end then use
196 // the end of last child scope.
197 SmallVector<DbgScope *, 4> &Scopes = getScopes();
198 assert (!Scopes.empty() && "Inner most scope does not have last insn!");
199 DbgScope *L = Scopes.back();
200 if (!L->getLastInsn())
201 L->FixInstructionMarkers();
202 setLastInsn(L->getLastInsn());
203 }
204
Bill Wendling0310d762009-05-15 09:23:25 +0000205#ifndef NDEBUG
206 void dump() const;
207#endif
208};
209
210#ifndef NDEBUG
211void DbgScope::dump() const {
Chris Lattnerc281de12009-08-23 00:51:00 +0000212 raw_ostream &err = errs();
213 err.indent(IndentLevel);
214 Desc.dump();
215 err << " [" << StartLabelID << ", " << EndLabelID << "]\n";
Bill Wendling0310d762009-05-15 09:23:25 +0000216
217 IndentLevel += 2;
218
219 for (unsigned i = 0, e = Scopes.size(); i != e; ++i)
220 if (Scopes[i] != this)
221 Scopes[i]->dump();
222
223 IndentLevel -= 2;
224}
225#endif
226
227//===----------------------------------------------------------------------===//
228/// DbgConcreteScope - This class is used to track a scope that holds concrete
229/// instance information.
230///
231class VISIBILITY_HIDDEN DbgConcreteScope : public DbgScope {
232 CompileUnit *Unit;
233 DIE *Die; // Debug info for this concrete scope.
234public:
235 DbgConcreteScope(DIDescriptor D) : DbgScope(NULL, D) {}
236
237 // Accessors.
238 DIE *getDie() const { return Die; }
239 void setDie(DIE *D) { Die = D; }
240};
241
242DbgScope::~DbgScope() {
243 for (unsigned i = 0, N = Scopes.size(); i < N; ++i)
244 delete Scopes[i];
245 for (unsigned j = 0, M = Variables.size(); j < M; ++j)
246 delete Variables[j];
247 for (unsigned k = 0, O = ConcreteInsts.size(); k < O; ++k)
248 delete ConcreteInsts[k];
249}
250
251} // end llvm namespace
252
Chris Lattneraf76e592009-08-22 20:48:53 +0000253DwarfDebug::DwarfDebug(raw_ostream &OS, AsmPrinter *A, const MCAsmInfo *T)
Devang Patel1dbc7712009-06-29 20:45:18 +0000254 : Dwarf(OS, A, T, "dbg"), ModuleCU(0),
Bill Wendling0310d762009-05-15 09:23:25 +0000255 AbbreviationsSet(InitAbbreviationsSetSize), Abbreviations(),
Daniel Dunbarf612ff62009-09-19 20:40:05 +0000256 ValuesSet(InitValuesSetSize), Values(), StringPool(),
Bill Wendling0310d762009-05-15 09:23:25 +0000257 SectionSourceLines(), didInitial(false), shouldEmit(false),
Devang Patel43da8fb2009-07-13 21:26:33 +0000258 FunctionDbgScope(0), DebugTimer(0) {
Bill Wendling0310d762009-05-15 09:23:25 +0000259 if (TimePassesIsEnabled)
260 DebugTimer = new Timer("Dwarf Debug Writer",
261 getDwarfTimerGroup());
262}
263DwarfDebug::~DwarfDebug() {
264 for (unsigned j = 0, M = Values.size(); j < M; ++j)
265 delete Values[j];
266
Devang Patele4b27562009-08-28 23:24:31 +0000267 for (DenseMap<const MDNode *, DbgScope *>::iterator
Bill Wendling0310d762009-05-15 09:23:25 +0000268 I = AbstractInstanceRootMap.begin(),
269 E = AbstractInstanceRootMap.end(); I != E;++I)
270 delete I->second;
271
272 delete DebugTimer;
273}
274
275/// AssignAbbrevNumber - Define a unique number for the abbreviation.
276///
277void DwarfDebug::AssignAbbrevNumber(DIEAbbrev &Abbrev) {
278 // Profile the node so that we can make it unique.
279 FoldingSetNodeID ID;
280 Abbrev.Profile(ID);
281
282 // Check the set for priors.
283 DIEAbbrev *InSet = AbbreviationsSet.GetOrInsertNode(&Abbrev);
284
285 // If it's newly added.
286 if (InSet == &Abbrev) {
287 // Add to abbreviation list.
288 Abbreviations.push_back(&Abbrev);
289
290 // Assign the vector position + 1 as its number.
291 Abbrev.setNumber(Abbreviations.size());
292 } else {
293 // Assign existing abbreviation number.
294 Abbrev.setNumber(InSet->getNumber());
295 }
296}
297
Bill Wendling995f80a2009-05-20 23:24:48 +0000298/// CreateDIEEntry - Creates a new DIEEntry to be a proxy for a debug
299/// information entry.
300DIEEntry *DwarfDebug::CreateDIEEntry(DIE *Entry) {
Bill Wendling0310d762009-05-15 09:23:25 +0000301 DIEEntry *Value;
302
303 if (Entry) {
304 FoldingSetNodeID ID;
305 DIEEntry::Profile(ID, Entry);
306 void *Where;
307 Value = static_cast<DIEEntry *>(ValuesSet.FindNodeOrInsertPos(ID, Where));
308
309 if (Value) return Value;
310
311 Value = new DIEEntry(Entry);
312 ValuesSet.InsertNode(Value, Where);
313 } else {
314 Value = new DIEEntry(Entry);
315 }
316
317 Values.push_back(Value);
318 return Value;
319}
320
321/// SetDIEEntry - Set a DIEEntry once the debug information entry is defined.
322///
323void DwarfDebug::SetDIEEntry(DIEEntry *Value, DIE *Entry) {
324 Value->setEntry(Entry);
325
326 // Add to values set if not already there. If it is, we merely have a
327 // duplicate in the values list (no harm.)
328 ValuesSet.GetOrInsertNode(Value);
329}
330
331/// AddUInt - Add an unsigned integer attribute data and value.
332///
333void DwarfDebug::AddUInt(DIE *Die, unsigned Attribute,
334 unsigned Form, uint64_t Integer) {
335 if (!Form) Form = DIEInteger::BestForm(false, Integer);
336
337 FoldingSetNodeID ID;
338 DIEInteger::Profile(ID, Integer);
339 void *Where;
340 DIEValue *Value = ValuesSet.FindNodeOrInsertPos(ID, Where);
341
342 if (!Value) {
343 Value = new DIEInteger(Integer);
344 ValuesSet.InsertNode(Value, Where);
345 Values.push_back(Value);
346 }
347
348 Die->AddValue(Attribute, Form, Value);
349}
350
351/// AddSInt - Add an signed integer attribute data and value.
352///
353void DwarfDebug::AddSInt(DIE *Die, unsigned Attribute,
354 unsigned Form, int64_t Integer) {
355 if (!Form) Form = DIEInteger::BestForm(true, Integer);
356
357 FoldingSetNodeID ID;
358 DIEInteger::Profile(ID, (uint64_t)Integer);
359 void *Where;
360 DIEValue *Value = ValuesSet.FindNodeOrInsertPos(ID, Where);
361
362 if (!Value) {
363 Value = new DIEInteger(Integer);
364 ValuesSet.InsertNode(Value, Where);
365 Values.push_back(Value);
366 }
367
368 Die->AddValue(Attribute, Form, Value);
369}
370
371/// AddString - Add a string attribute data and value.
372///
373void DwarfDebug::AddString(DIE *Die, unsigned Attribute, unsigned Form,
374 const std::string &String) {
375 FoldingSetNodeID ID;
376 DIEString::Profile(ID, String);
377 void *Where;
378 DIEValue *Value = ValuesSet.FindNodeOrInsertPos(ID, Where);
379
380 if (!Value) {
381 Value = new DIEString(String);
382 ValuesSet.InsertNode(Value, Where);
383 Values.push_back(Value);
384 }
385
386 Die->AddValue(Attribute, Form, Value);
387}
388
389/// AddLabel - Add a Dwarf label attribute data and value.
390///
391void DwarfDebug::AddLabel(DIE *Die, unsigned Attribute, unsigned Form,
392 const DWLabel &Label) {
393 FoldingSetNodeID ID;
394 DIEDwarfLabel::Profile(ID, Label);
395 void *Where;
396 DIEValue *Value = ValuesSet.FindNodeOrInsertPos(ID, Where);
397
398 if (!Value) {
399 Value = new DIEDwarfLabel(Label);
400 ValuesSet.InsertNode(Value, Where);
401 Values.push_back(Value);
402 }
403
404 Die->AddValue(Attribute, Form, Value);
405}
406
407/// AddObjectLabel - Add an non-Dwarf label attribute data and value.
408///
409void DwarfDebug::AddObjectLabel(DIE *Die, unsigned Attribute, unsigned Form,
410 const std::string &Label) {
411 FoldingSetNodeID ID;
412 DIEObjectLabel::Profile(ID, Label);
413 void *Where;
414 DIEValue *Value = ValuesSet.FindNodeOrInsertPos(ID, Where);
415
416 if (!Value) {
417 Value = new DIEObjectLabel(Label);
418 ValuesSet.InsertNode(Value, Where);
419 Values.push_back(Value);
420 }
421
422 Die->AddValue(Attribute, Form, Value);
423}
424
425/// AddSectionOffset - Add a section offset label attribute data and value.
426///
427void DwarfDebug::AddSectionOffset(DIE *Die, unsigned Attribute, unsigned Form,
428 const DWLabel &Label, const DWLabel &Section,
429 bool isEH, bool useSet) {
430 FoldingSetNodeID ID;
431 DIESectionOffset::Profile(ID, Label, Section);
432 void *Where;
433 DIEValue *Value = ValuesSet.FindNodeOrInsertPos(ID, Where);
434
435 if (!Value) {
436 Value = new DIESectionOffset(Label, Section, isEH, useSet);
437 ValuesSet.InsertNode(Value, Where);
438 Values.push_back(Value);
439 }
440
441 Die->AddValue(Attribute, Form, Value);
442}
443
444/// AddDelta - Add a label delta attribute data and value.
445///
446void DwarfDebug::AddDelta(DIE *Die, unsigned Attribute, unsigned Form,
447 const DWLabel &Hi, const DWLabel &Lo) {
448 FoldingSetNodeID ID;
449 DIEDelta::Profile(ID, Hi, Lo);
450 void *Where;
451 DIEValue *Value = ValuesSet.FindNodeOrInsertPos(ID, Where);
452
453 if (!Value) {
454 Value = new DIEDelta(Hi, Lo);
455 ValuesSet.InsertNode(Value, Where);
456 Values.push_back(Value);
457 }
458
459 Die->AddValue(Attribute, Form, Value);
460}
461
462/// AddBlock - Add block data.
463///
464void DwarfDebug::AddBlock(DIE *Die, unsigned Attribute, unsigned Form,
465 DIEBlock *Block) {
466 Block->ComputeSize(TD);
467 FoldingSetNodeID ID;
468 Block->Profile(ID);
469 void *Where;
470 DIEValue *Value = ValuesSet.FindNodeOrInsertPos(ID, Where);
471
472 if (!Value) {
473 Value = Block;
474 ValuesSet.InsertNode(Value, Where);
475 Values.push_back(Value);
476 } else {
477 // Already exists, reuse the previous one.
478 delete Block;
479 Block = cast<DIEBlock>(Value);
480 }
481
482 Die->AddValue(Attribute, Block->BestForm(), Value);
483}
484
485/// AddSourceLine - Add location information to specified debug information
486/// entry.
487void DwarfDebug::AddSourceLine(DIE *Die, const DIVariable *V) {
488 // If there is no compile unit specified, don't add a line #.
489 if (V->getCompileUnit().isNull())
490 return;
491
492 unsigned Line = V->getLineNumber();
493 unsigned FileID = FindCompileUnit(V->getCompileUnit()).getID();
494 assert(FileID && "Invalid file id");
495 AddUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
496 AddUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
497}
498
499/// AddSourceLine - Add location information to specified debug information
500/// entry.
501void DwarfDebug::AddSourceLine(DIE *Die, const DIGlobal *G) {
502 // If there is no compile unit specified, don't add a line #.
503 if (G->getCompileUnit().isNull())
504 return;
505
506 unsigned Line = G->getLineNumber();
507 unsigned FileID = FindCompileUnit(G->getCompileUnit()).getID();
508 assert(FileID && "Invalid file id");
509 AddUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
510 AddUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
511}
Devang Patel82dfc0c2009-08-31 22:47:13 +0000512
513/// AddSourceLine - Add location information to specified debug information
514/// entry.
515void DwarfDebug::AddSourceLine(DIE *Die, const DISubprogram *SP) {
516 // If there is no compile unit specified, don't add a line #.
517 if (SP->getCompileUnit().isNull())
518 return;
Caroline Ticec6f9d622009-09-11 18:25:54 +0000519 // If the line number is 0, don't add it.
520 if (SP->getLineNumber() == 0)
521 return;
522
Devang Patel82dfc0c2009-08-31 22:47:13 +0000523
524 unsigned Line = SP->getLineNumber();
525 unsigned FileID = FindCompileUnit(SP->getCompileUnit()).getID();
526 assert(FileID && "Invalid file id");
527 AddUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
528 AddUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
529}
530
531/// AddSourceLine - Add location information to specified debug information
532/// entry.
Bill Wendling0310d762009-05-15 09:23:25 +0000533void DwarfDebug::AddSourceLine(DIE *Die, const DIType *Ty) {
534 // If there is no compile unit specified, don't add a line #.
535 DICompileUnit CU = Ty->getCompileUnit();
536 if (CU.isNull())
537 return;
538
539 unsigned Line = Ty->getLineNumber();
540 unsigned FileID = FindCompileUnit(CU).getID();
541 assert(FileID && "Invalid file id");
542 AddUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
543 AddUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
544}
545
Caroline Ticedc8f6042009-08-31 21:19:37 +0000546/* Byref variables, in Blocks, are declared by the programmer as
547 "SomeType VarName;", but the compiler creates a
548 __Block_byref_x_VarName struct, and gives the variable VarName
549 either the struct, or a pointer to the struct, as its type. This
550 is necessary for various behind-the-scenes things the compiler
551 needs to do with by-reference variables in blocks.
552
553 However, as far as the original *programmer* is concerned, the
554 variable should still have type 'SomeType', as originally declared.
555
556 The following function dives into the __Block_byref_x_VarName
557 struct to find the original type of the variable. This will be
558 passed back to the code generating the type for the Debug
559 Information Entry for the variable 'VarName'. 'VarName' will then
560 have the original type 'SomeType' in its debug information.
561
562 The original type 'SomeType' will be the type of the field named
563 'VarName' inside the __Block_byref_x_VarName struct.
564
565 NOTE: In order for this to not completely fail on the debugger
566 side, the Debug Information Entry for the variable VarName needs to
567 have a DW_AT_location that tells the debugger how to unwind through
568 the pointers and __Block_byref_x_VarName struct to find the actual
569 value of the variable. The function AddBlockByrefType does this. */
570
571/// Find the type the programmer originally declared the variable to be
572/// and return that type.
573///
574DIType DwarfDebug::GetBlockByrefType(DIType Ty, std::string Name) {
575
576 DIType subType = Ty;
577 unsigned tag = Ty.getTag();
578
579 if (tag == dwarf::DW_TAG_pointer_type) {
Mike Stump3e4c9bd2009-09-30 00:08:22 +0000580 DIDerivedType DTy = DIDerivedType(Ty.getNode());
Caroline Ticedc8f6042009-08-31 21:19:37 +0000581 subType = DTy.getTypeDerivedFrom();
582 }
583
584 DICompositeType blockStruct = DICompositeType(subType.getNode());
585
586 DIArray Elements = blockStruct.getTypeArray();
587
588 if (Elements.isNull())
589 return Ty;
590
591 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
592 DIDescriptor Element = Elements.getElement(i);
593 DIDerivedType DT = DIDerivedType(Element.getNode());
Devang Patel5ccdd102009-09-29 18:40:58 +0000594 if (strcmp(Name.c_str(), DT.getName()) == 0)
Caroline Ticedc8f6042009-08-31 21:19:37 +0000595 return (DT.getTypeDerivedFrom());
596 }
597
598 return Ty;
599}
600
Mike Stump3e4c9bd2009-09-30 00:08:22 +0000601/// AddComplexAddress - Start with the address based on the location provided,
602/// and generate the DWARF information necessary to find the actual variable
603/// given the extra address information encoded in the DIVariable, starting from
604/// the starting location. Add the DWARF information to the die.
605///
606void DwarfDebug::AddComplexAddress(DbgVariable *&DV, DIE *Die,
607 unsigned Attribute,
608 const MachineLocation &Location) {
609 const DIVariable &VD = DV->getVariable();
610 DIType Ty = VD.getType();
611
612 // Decode the original location, and use that as the start of the byref
613 // variable's location.
614 unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
615 DIEBlock *Block = new DIEBlock();
616
617 if (Location.isReg()) {
618 if (Reg < 32) {
619 AddUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
620 } else {
621 Reg = Reg - dwarf::DW_OP_reg0;
622 AddUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
623 AddUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
624 }
625 } else {
626 if (Reg < 32)
627 AddUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
628 else {
629 AddUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
630 AddUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
631 }
632
633 AddUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
634 }
635
636 for (unsigned i = 0, N = VD.getNumAddrElements(); i < N; ++i) {
637 uint64_t Element = VD.getAddrElement(i);
638
639 if (Element == DIFactory::OpPlus) {
640 AddUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
641 AddUInt(Block, 0, dwarf::DW_FORM_udata, VD.getAddrElement(++i));
642 } else if (Element == DIFactory::OpDeref) {
643 AddUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
644 } else llvm_unreachable("unknown DIFactory Opcode");
645 }
646
647 // Now attach the location information to the DIE.
648 AddBlock(Die, Attribute, 0, Block);
649}
650
Caroline Ticedc8f6042009-08-31 21:19:37 +0000651/* Byref variables, in Blocks, are declared by the programmer as "SomeType
652 VarName;", but the compiler creates a __Block_byref_x_VarName struct, and
653 gives the variable VarName either the struct, or a pointer to the struct, as
654 its type. This is necessary for various behind-the-scenes things the
655 compiler needs to do with by-reference variables in Blocks.
656
657 However, as far as the original *programmer* is concerned, the variable
658 should still have type 'SomeType', as originally declared.
659
660 The function GetBlockByrefType dives into the __Block_byref_x_VarName
661 struct to find the original type of the variable, which is then assigned to
662 the variable's Debug Information Entry as its real type. So far, so good.
663 However now the debugger will expect the variable VarName to have the type
664 SomeType. So we need the location attribute for the variable to be an
Daniel Dunbarf612ff62009-09-19 20:40:05 +0000665 expression that explains to the debugger how to navigate through the
Caroline Ticedc8f6042009-08-31 21:19:37 +0000666 pointers and struct to find the actual variable of type SomeType.
667
668 The following function does just that. We start by getting
669 the "normal" location for the variable. This will be the location
670 of either the struct __Block_byref_x_VarName or the pointer to the
671 struct __Block_byref_x_VarName.
672
673 The struct will look something like:
674
675 struct __Block_byref_x_VarName {
676 ... <various fields>
677 struct __Block_byref_x_VarName *forwarding;
678 ... <various other fields>
679 SomeType VarName;
680 ... <maybe more fields>
681 };
682
683 If we are given the struct directly (as our starting point) we
684 need to tell the debugger to:
685
686 1). Add the offset of the forwarding field.
687
688 2). Follow that pointer to get the the real __Block_byref_x_VarName
689 struct to use (the real one may have been copied onto the heap).
690
691 3). Add the offset for the field VarName, to find the actual variable.
692
693 If we started with a pointer to the struct, then we need to
694 dereference that pointer first, before the other steps.
695 Translating this into DWARF ops, we will need to append the following
696 to the current location description for the variable:
697
698 DW_OP_deref -- optional, if we start with a pointer
699 DW_OP_plus_uconst <forward_fld_offset>
700 DW_OP_deref
701 DW_OP_plus_uconst <varName_fld_offset>
702
703 That is what this function does. */
704
705/// AddBlockByrefAddress - Start with the address based on the location
706/// provided, and generate the DWARF information necessary to find the
707/// actual Block variable (navigating the Block struct) based on the
708/// starting location. Add the DWARF information to the die. For
709/// more information, read large comment just above here.
710///
Daniel Dunbarf612ff62009-09-19 20:40:05 +0000711void DwarfDebug::AddBlockByrefAddress(DbgVariable *&DV, DIE *Die,
Daniel Dunbar00564992009-09-19 20:40:14 +0000712 unsigned Attribute,
713 const MachineLocation &Location) {
Caroline Ticedc8f6042009-08-31 21:19:37 +0000714 const DIVariable &VD = DV->getVariable();
715 DIType Ty = VD.getType();
716 DIType TmpTy = Ty;
717 unsigned Tag = Ty.getTag();
718 bool isPointer = false;
719
Devang Patel5ccdd102009-09-29 18:40:58 +0000720 const char *varName = VD.getName();
Caroline Ticedc8f6042009-08-31 21:19:37 +0000721
722 if (Tag == dwarf::DW_TAG_pointer_type) {
Mike Stump3e4c9bd2009-09-30 00:08:22 +0000723 DIDerivedType DTy = DIDerivedType(Ty.getNode());
Caroline Ticedc8f6042009-08-31 21:19:37 +0000724 TmpTy = DTy.getTypeDerivedFrom();
725 isPointer = true;
726 }
727
728 DICompositeType blockStruct = DICompositeType(TmpTy.getNode());
729
Daniel Dunbar00564992009-09-19 20:40:14 +0000730 // Find the __forwarding field and the variable field in the __Block_byref
731 // struct.
Daniel Dunbar00564992009-09-19 20:40:14 +0000732 DIArray Fields = blockStruct.getTypeArray();
733 DIDescriptor varField = DIDescriptor();
734 DIDescriptor forwardingField = DIDescriptor();
Caroline Ticedc8f6042009-08-31 21:19:37 +0000735
736
Daniel Dunbar00564992009-09-19 20:40:14 +0000737 for (unsigned i = 0, N = Fields.getNumElements(); i < N; ++i) {
738 DIDescriptor Element = Fields.getElement(i);
739 DIDerivedType DT = DIDerivedType(Element.getNode());
Devang Patel5ccdd102009-09-29 18:40:58 +0000740 const char *fieldName = DT.getName();
741 if (strcmp(fieldName, "__forwarding") == 0)
Daniel Dunbar00564992009-09-19 20:40:14 +0000742 forwardingField = Element;
Devang Patel5ccdd102009-09-29 18:40:58 +0000743 else if (strcmp(fieldName, varName) == 0)
Daniel Dunbar00564992009-09-19 20:40:14 +0000744 varField = Element;
745 }
Daniel Dunbarf612ff62009-09-19 20:40:05 +0000746
Mike Stump7e3720d2009-09-24 23:21:26 +0000747 assert(!varField.isNull() && "Can't find byref variable in Block struct");
748 assert(!forwardingField.isNull()
749 && "Can't find forwarding field in Block struct");
Caroline Ticedc8f6042009-08-31 21:19:37 +0000750
Daniel Dunbar00564992009-09-19 20:40:14 +0000751 // Get the offsets for the forwarding field and the variable field.
Daniel Dunbar00564992009-09-19 20:40:14 +0000752 unsigned int forwardingFieldOffset =
753 DIDerivedType(forwardingField.getNode()).getOffsetInBits() >> 3;
754 unsigned int varFieldOffset =
755 DIDerivedType(varField.getNode()).getOffsetInBits() >> 3;
Caroline Ticedc8f6042009-08-31 21:19:37 +0000756
Mike Stump7e3720d2009-09-24 23:21:26 +0000757 // Decode the original location, and use that as the start of the byref
758 // variable's location.
Daniel Dunbar00564992009-09-19 20:40:14 +0000759 unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
760 DIEBlock *Block = new DIEBlock();
Caroline Ticedc8f6042009-08-31 21:19:37 +0000761
Daniel Dunbar00564992009-09-19 20:40:14 +0000762 if (Location.isReg()) {
763 if (Reg < 32)
764 AddUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
765 else {
766 Reg = Reg - dwarf::DW_OP_reg0;
767 AddUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
768 AddUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
769 }
770 } else {
771 if (Reg < 32)
772 AddUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
773 else {
774 AddUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
775 AddUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
776 }
Caroline Ticedc8f6042009-08-31 21:19:37 +0000777
Daniel Dunbar00564992009-09-19 20:40:14 +0000778 AddUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
779 }
Caroline Ticedc8f6042009-08-31 21:19:37 +0000780
Mike Stump7e3720d2009-09-24 23:21:26 +0000781 // If we started with a pointer to the __Block_byref... struct, then
Daniel Dunbar00564992009-09-19 20:40:14 +0000782 // the first thing we need to do is dereference the pointer (DW_OP_deref).
Daniel Dunbar00564992009-09-19 20:40:14 +0000783 if (isPointer)
784 AddUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Caroline Ticedc8f6042009-08-31 21:19:37 +0000785
Daniel Dunbar00564992009-09-19 20:40:14 +0000786 // Next add the offset for the '__forwarding' field:
787 // DW_OP_plus_uconst ForwardingFieldOffset. Note there's no point in
788 // adding the offset if it's 0.
Daniel Dunbar00564992009-09-19 20:40:14 +0000789 if (forwardingFieldOffset > 0) {
790 AddUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
791 AddUInt(Block, 0, dwarf::DW_FORM_udata, forwardingFieldOffset);
792 }
Caroline Ticedc8f6042009-08-31 21:19:37 +0000793
Daniel Dunbar00564992009-09-19 20:40:14 +0000794 // Now dereference the __forwarding field to get to the real __Block_byref
795 // struct: DW_OP_deref.
Daniel Dunbar00564992009-09-19 20:40:14 +0000796 AddUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Caroline Ticedc8f6042009-08-31 21:19:37 +0000797
Daniel Dunbar00564992009-09-19 20:40:14 +0000798 // Now that we've got the real __Block_byref... struct, add the offset
799 // for the variable's field to get to the location of the actual variable:
800 // DW_OP_plus_uconst varFieldOffset. Again, don't add if it's 0.
Daniel Dunbar00564992009-09-19 20:40:14 +0000801 if (varFieldOffset > 0) {
802 AddUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
803 AddUInt(Block, 0, dwarf::DW_FORM_udata, varFieldOffset);
804 }
Caroline Ticedc8f6042009-08-31 21:19:37 +0000805
Daniel Dunbar00564992009-09-19 20:40:14 +0000806 // Now attach the location information to the DIE.
Daniel Dunbar00564992009-09-19 20:40:14 +0000807 AddBlock(Die, Attribute, 0, Block);
Caroline Ticedc8f6042009-08-31 21:19:37 +0000808}
809
Bill Wendling0310d762009-05-15 09:23:25 +0000810/// AddAddress - Add an address attribute to a die based on the location
811/// provided.
812void DwarfDebug::AddAddress(DIE *Die, unsigned Attribute,
813 const MachineLocation &Location) {
814 unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
815 DIEBlock *Block = new DIEBlock();
816
817 if (Location.isReg()) {
818 if (Reg < 32) {
819 AddUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
820 } else {
821 AddUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
822 AddUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
823 }
824 } else {
825 if (Reg < 32) {
826 AddUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
827 } else {
828 AddUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
829 AddUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
830 }
831
832 AddUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
833 }
834
835 AddBlock(Die, Attribute, 0, Block);
836}
837
838/// AddType - Add a new type attribute to the specified entity.
839void DwarfDebug::AddType(CompileUnit *DW_Unit, DIE *Entity, DIType Ty) {
840 if (Ty.isNull())
841 return;
842
843 // Check for pre-existence.
Devang Patele4b27562009-08-28 23:24:31 +0000844 DIEEntry *&Slot = DW_Unit->getDIEEntrySlotFor(Ty.getNode());
Bill Wendling0310d762009-05-15 09:23:25 +0000845
846 // If it exists then use the existing value.
847 if (Slot) {
848 Entity->AddValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, Slot);
849 return;
850 }
851
852 // Set up proxy.
Bill Wendling995f80a2009-05-20 23:24:48 +0000853 Slot = CreateDIEEntry();
Bill Wendling0310d762009-05-15 09:23:25 +0000854
855 // Construct type.
856 DIE Buffer(dwarf::DW_TAG_base_type);
Devang Patel6ceea332009-08-31 18:49:10 +0000857 if (Ty.isBasicType())
Devang Patele4b27562009-08-28 23:24:31 +0000858 ConstructTypeDIE(DW_Unit, Buffer, DIBasicType(Ty.getNode()));
Devang Patel6ceea332009-08-31 18:49:10 +0000859 else if (Ty.isCompositeType())
Devang Patele4b27562009-08-28 23:24:31 +0000860 ConstructTypeDIE(DW_Unit, Buffer, DICompositeType(Ty.getNode()));
Bill Wendling0310d762009-05-15 09:23:25 +0000861 else {
Devang Patel6ceea332009-08-31 18:49:10 +0000862 assert(Ty.isDerivedType() && "Unknown kind of DIType");
Devang Patele4b27562009-08-28 23:24:31 +0000863 ConstructTypeDIE(DW_Unit, Buffer, DIDerivedType(Ty.getNode()));
Bill Wendling0310d762009-05-15 09:23:25 +0000864 }
865
866 // Add debug information entry to entity and appropriate context.
867 DIE *Die = NULL;
868 DIDescriptor Context = Ty.getContext();
869 if (!Context.isNull())
Devang Patele4b27562009-08-28 23:24:31 +0000870 Die = DW_Unit->getDieMapSlotFor(Context.getNode());
Bill Wendling0310d762009-05-15 09:23:25 +0000871
872 if (Die) {
873 DIE *Child = new DIE(Buffer);
874 Die->AddChild(Child);
875 Buffer.Detach();
876 SetDIEEntry(Slot, Child);
877 } else {
878 Die = DW_Unit->AddDie(Buffer);
879 SetDIEEntry(Slot, Die);
880 }
881
882 Entity->AddValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, Slot);
883}
884
885/// ConstructTypeDIE - Construct basic type die from DIBasicType.
886void DwarfDebug::ConstructTypeDIE(CompileUnit *DW_Unit, DIE &Buffer,
887 DIBasicType BTy) {
888 // Get core information.
Devang Patel5ccdd102009-09-29 18:40:58 +0000889 const char *Name = BTy.getName();
Bill Wendling0310d762009-05-15 09:23:25 +0000890 Buffer.setTag(dwarf::DW_TAG_base_type);
891 AddUInt(&Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
892 BTy.getEncoding());
893
894 // Add name if not anonymous or intermediate type.
Devang Patel5ccdd102009-09-29 18:40:58 +0000895 if (Name)
Bill Wendling0310d762009-05-15 09:23:25 +0000896 AddString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
897 uint64_t Size = BTy.getSizeInBits() >> 3;
898 AddUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
899}
900
901/// ConstructTypeDIE - Construct derived type die from DIDerivedType.
902void DwarfDebug::ConstructTypeDIE(CompileUnit *DW_Unit, DIE &Buffer,
903 DIDerivedType DTy) {
904 // Get core information.
Devang Patel5ccdd102009-09-29 18:40:58 +0000905 const char *Name = DTy.getName();
Bill Wendling0310d762009-05-15 09:23:25 +0000906 uint64_t Size = DTy.getSizeInBits() >> 3;
907 unsigned Tag = DTy.getTag();
908
909 // FIXME - Workaround for templates.
910 if (Tag == dwarf::DW_TAG_inheritance) Tag = dwarf::DW_TAG_reference_type;
911
912 Buffer.setTag(Tag);
913
914 // Map to main type, void will not have a type.
915 DIType FromTy = DTy.getTypeDerivedFrom();
916 AddType(DW_Unit, &Buffer, FromTy);
917
918 // Add name if not anonymous or intermediate type.
Devang Patel5ccdd102009-09-29 18:40:58 +0000919 if (Name)
Bill Wendling0310d762009-05-15 09:23:25 +0000920 AddString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
921
922 // Add size if non-zero (derived types might be zero-sized.)
923 if (Size)
924 AddUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
925
926 // Add source line info if available and TyDesc is not a forward declaration.
927 if (!DTy.isForwardDecl())
928 AddSourceLine(&Buffer, &DTy);
929}
930
931/// ConstructTypeDIE - Construct type DIE from DICompositeType.
932void DwarfDebug::ConstructTypeDIE(CompileUnit *DW_Unit, DIE &Buffer,
933 DICompositeType CTy) {
934 // Get core information.
Devang Patel5ccdd102009-09-29 18:40:58 +0000935 const char *Name = CTy.getName();
Bill Wendling0310d762009-05-15 09:23:25 +0000936
937 uint64_t Size = CTy.getSizeInBits() >> 3;
938 unsigned Tag = CTy.getTag();
939 Buffer.setTag(Tag);
940
941 switch (Tag) {
942 case dwarf::DW_TAG_vector_type:
943 case dwarf::DW_TAG_array_type:
944 ConstructArrayTypeDIE(DW_Unit, Buffer, &CTy);
945 break;
946 case dwarf::DW_TAG_enumeration_type: {
947 DIArray Elements = CTy.getTypeArray();
948
949 // Add enumerators to enumeration type.
950 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
951 DIE *ElemDie = NULL;
Devang Patele4b27562009-08-28 23:24:31 +0000952 DIEnumerator Enum(Elements.getElement(i).getNode());
Devang Patelc5254722009-10-09 17:51:49 +0000953 if (!Enum.isNull()) {
954 ElemDie = ConstructEnumTypeDIE(DW_Unit, &Enum);
955 Buffer.AddChild(ElemDie);
956 }
Bill Wendling0310d762009-05-15 09:23:25 +0000957 }
958 }
959 break;
960 case dwarf::DW_TAG_subroutine_type: {
961 // Add return type.
962 DIArray Elements = CTy.getTypeArray();
963 DIDescriptor RTy = Elements.getElement(0);
Devang Patele4b27562009-08-28 23:24:31 +0000964 AddType(DW_Unit, &Buffer, DIType(RTy.getNode()));
Bill Wendling0310d762009-05-15 09:23:25 +0000965
966 // Add prototype flag.
967 AddUInt(&Buffer, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
968
969 // Add arguments.
970 for (unsigned i = 1, N = Elements.getNumElements(); i < N; ++i) {
971 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
972 DIDescriptor Ty = Elements.getElement(i);
Devang Patele4b27562009-08-28 23:24:31 +0000973 AddType(DW_Unit, Arg, DIType(Ty.getNode()));
Bill Wendling0310d762009-05-15 09:23:25 +0000974 Buffer.AddChild(Arg);
975 }
976 }
977 break;
978 case dwarf::DW_TAG_structure_type:
979 case dwarf::DW_TAG_union_type:
980 case dwarf::DW_TAG_class_type: {
981 // Add elements to structure type.
982 DIArray Elements = CTy.getTypeArray();
983
984 // A forward struct declared type may not have elements available.
985 if (Elements.isNull())
986 break;
987
988 // Add elements to structure type.
989 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
990 DIDescriptor Element = Elements.getElement(i);
Devang Patele4b27562009-08-28 23:24:31 +0000991 if (Element.isNull())
992 continue;
Bill Wendling0310d762009-05-15 09:23:25 +0000993 DIE *ElemDie = NULL;
994 if (Element.getTag() == dwarf::DW_TAG_subprogram)
995 ElemDie = CreateSubprogramDIE(DW_Unit,
Devang Patele4b27562009-08-28 23:24:31 +0000996 DISubprogram(Element.getNode()));
Bill Wendling0310d762009-05-15 09:23:25 +0000997 else
998 ElemDie = CreateMemberDIE(DW_Unit,
Devang Patele4b27562009-08-28 23:24:31 +0000999 DIDerivedType(Element.getNode()));
Bill Wendling0310d762009-05-15 09:23:25 +00001000 Buffer.AddChild(ElemDie);
1001 }
1002
Devang Patela1ba2692009-08-27 23:51:51 +00001003 if (CTy.isAppleBlockExtension())
Bill Wendling0310d762009-05-15 09:23:25 +00001004 AddUInt(&Buffer, dwarf::DW_AT_APPLE_block, dwarf::DW_FORM_flag, 1);
1005
1006 unsigned RLang = CTy.getRunTimeLang();
1007 if (RLang)
1008 AddUInt(&Buffer, dwarf::DW_AT_APPLE_runtime_class,
1009 dwarf::DW_FORM_data1, RLang);
1010 break;
1011 }
1012 default:
1013 break;
1014 }
1015
1016 // Add name if not anonymous or intermediate type.
Devang Patel5ccdd102009-09-29 18:40:58 +00001017 if (Name)
Bill Wendling0310d762009-05-15 09:23:25 +00001018 AddString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1019
1020 if (Tag == dwarf::DW_TAG_enumeration_type ||
1021 Tag == dwarf::DW_TAG_structure_type || Tag == dwarf::DW_TAG_union_type) {
1022 // Add size if non-zero (derived types might be zero-sized.)
1023 if (Size)
1024 AddUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
1025 else {
1026 // Add zero size if it is not a forward declaration.
1027 if (CTy.isForwardDecl())
1028 AddUInt(&Buffer, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1029 else
1030 AddUInt(&Buffer, dwarf::DW_AT_byte_size, 0, 0);
1031 }
1032
1033 // Add source line info if available.
1034 if (!CTy.isForwardDecl())
1035 AddSourceLine(&Buffer, &CTy);
1036 }
1037}
1038
1039/// ConstructSubrangeDIE - Construct subrange DIE from DISubrange.
1040void DwarfDebug::ConstructSubrangeDIE(DIE &Buffer, DISubrange SR, DIE *IndexTy){
1041 int64_t L = SR.getLo();
1042 int64_t H = SR.getHi();
1043 DIE *DW_Subrange = new DIE(dwarf::DW_TAG_subrange_type);
1044
Devang Patel6325a532009-08-14 20:59:16 +00001045 AddDIEEntry(DW_Subrange, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IndexTy);
1046 if (L)
1047 AddSInt(DW_Subrange, dwarf::DW_AT_lower_bound, 0, L);
1048 if (H)
Daniel Dunbar00564992009-09-19 20:40:14 +00001049 AddSInt(DW_Subrange, dwarf::DW_AT_upper_bound, 0, H);
Bill Wendling0310d762009-05-15 09:23:25 +00001050
1051 Buffer.AddChild(DW_Subrange);
1052}
1053
1054/// ConstructArrayTypeDIE - Construct array type DIE from DICompositeType.
1055void DwarfDebug::ConstructArrayTypeDIE(CompileUnit *DW_Unit, DIE &Buffer,
1056 DICompositeType *CTy) {
1057 Buffer.setTag(dwarf::DW_TAG_array_type);
1058 if (CTy->getTag() == dwarf::DW_TAG_vector_type)
1059 AddUInt(&Buffer, dwarf::DW_AT_GNU_vector, dwarf::DW_FORM_flag, 1);
1060
1061 // Emit derived type.
1062 AddType(DW_Unit, &Buffer, CTy->getTypeDerivedFrom());
1063 DIArray Elements = CTy->getTypeArray();
1064
1065 // Construct an anonymous type for index type.
1066 DIE IdxBuffer(dwarf::DW_TAG_base_type);
1067 AddUInt(&IdxBuffer, dwarf::DW_AT_byte_size, 0, sizeof(int32_t));
1068 AddUInt(&IdxBuffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
1069 dwarf::DW_ATE_signed);
1070 DIE *IndexTy = DW_Unit->AddDie(IdxBuffer);
1071
1072 // Add subranges to array type.
1073 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1074 DIDescriptor Element = Elements.getElement(i);
1075 if (Element.getTag() == dwarf::DW_TAG_subrange_type)
Devang Patele4b27562009-08-28 23:24:31 +00001076 ConstructSubrangeDIE(Buffer, DISubrange(Element.getNode()), IndexTy);
Bill Wendling0310d762009-05-15 09:23:25 +00001077 }
1078}
1079
1080/// ConstructEnumTypeDIE - Construct enum type DIE from DIEnumerator.
1081DIE *DwarfDebug::ConstructEnumTypeDIE(CompileUnit *DW_Unit, DIEnumerator *ETy) {
1082 DIE *Enumerator = new DIE(dwarf::DW_TAG_enumerator);
Devang Patel5ccdd102009-09-29 18:40:58 +00001083 const char *Name = ETy->getName();
Bill Wendling0310d762009-05-15 09:23:25 +00001084 AddString(Enumerator, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1085 int64_t Value = ETy->getEnumValue();
1086 AddSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, Value);
1087 return Enumerator;
1088}
1089
1090/// CreateGlobalVariableDIE - Create new DIE using GV.
1091DIE *DwarfDebug::CreateGlobalVariableDIE(CompileUnit *DW_Unit,
1092 const DIGlobalVariable &GV) {
1093 DIE *GVDie = new DIE(dwarf::DW_TAG_variable);
Devang Patel5ccdd102009-09-29 18:40:58 +00001094 AddString(GVDie, dwarf::DW_AT_name, dwarf::DW_FORM_string,
1095 GV.getDisplayName());
1096
1097 const char *LinkageName = GV.getLinkageName();
1098 if (LinkageName) {
Chris Lattner6c2f9e12009-08-19 05:49:37 +00001099 // Skip special LLVM prefix that is used to inform the asm printer to not
1100 // emit usual symbol prefix before the symbol name. This happens for
1101 // Objective-C symbol names and symbol whose name is replaced using GCC's
1102 // __asm__ attribute.
Devang Patel53cb17d2009-07-16 01:01:22 +00001103 if (LinkageName[0] == 1)
1104 LinkageName = &LinkageName[1];
Bill Wendling0310d762009-05-15 09:23:25 +00001105 AddString(GVDie, dwarf::DW_AT_MIPS_linkage_name, dwarf::DW_FORM_string,
Devang Patel1a8d2d22009-07-14 00:55:28 +00001106 LinkageName);
Devang Patel53cb17d2009-07-16 01:01:22 +00001107 }
Daniel Dunbar00564992009-09-19 20:40:14 +00001108 AddType(DW_Unit, GVDie, GV.getType());
Bill Wendling0310d762009-05-15 09:23:25 +00001109 if (!GV.isLocalToUnit())
1110 AddUInt(GVDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
1111 AddSourceLine(GVDie, &GV);
Devang Patelb71a16d2009-10-05 23:22:08 +00001112
1113 // Add address.
1114 DIEBlock *Block = new DIEBlock();
1115 AddUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
1116 AddObjectLabel(Block, 0, dwarf::DW_FORM_udata,
1117 Asm->Mang->getMangledName(GV.getGlobal()));
1118 AddBlock(GVDie, dwarf::DW_AT_location, 0, Block);
1119
Bill Wendling0310d762009-05-15 09:23:25 +00001120 return GVDie;
1121}
1122
1123/// CreateMemberDIE - Create new member DIE.
1124DIE *DwarfDebug::CreateMemberDIE(CompileUnit *DW_Unit, const DIDerivedType &DT){
1125 DIE *MemberDie = new DIE(DT.getTag());
Devang Patel5ccdd102009-09-29 18:40:58 +00001126 if (const char *Name = DT.getName())
Bill Wendling0310d762009-05-15 09:23:25 +00001127 AddString(MemberDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1128
1129 AddType(DW_Unit, MemberDie, DT.getTypeDerivedFrom());
1130
1131 AddSourceLine(MemberDie, &DT);
1132
1133 uint64_t Size = DT.getSizeInBits();
1134 uint64_t FieldSize = DT.getOriginalTypeSize();
1135
1136 if (Size != FieldSize) {
1137 // Handle bitfield.
1138 AddUInt(MemberDie, dwarf::DW_AT_byte_size, 0, DT.getOriginalTypeSize()>>3);
1139 AddUInt(MemberDie, dwarf::DW_AT_bit_size, 0, DT.getSizeInBits());
1140
1141 uint64_t Offset = DT.getOffsetInBits();
1142 uint64_t FieldOffset = Offset;
1143 uint64_t AlignMask = ~(DT.getAlignInBits() - 1);
1144 uint64_t HiMark = (Offset + FieldSize) & AlignMask;
1145 FieldOffset = (HiMark - FieldSize);
1146 Offset -= FieldOffset;
1147
1148 // Maybe we need to work from the other end.
1149 if (TD->isLittleEndian()) Offset = FieldSize - (Offset + Size);
1150 AddUInt(MemberDie, dwarf::DW_AT_bit_offset, 0, Offset);
1151 }
1152
1153 DIEBlock *Block = new DIEBlock();
1154 AddUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
1155 AddUInt(Block, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits() >> 3);
1156 AddBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, Block);
1157
1158 if (DT.isProtected())
1159 AddUInt(MemberDie, dwarf::DW_AT_accessibility, 0,
1160 dwarf::DW_ACCESS_protected);
1161 else if (DT.isPrivate())
1162 AddUInt(MemberDie, dwarf::DW_AT_accessibility, 0,
1163 dwarf::DW_ACCESS_private);
1164
1165 return MemberDie;
1166}
1167
1168/// CreateSubprogramDIE - Create new DIE using SP.
1169DIE *DwarfDebug::CreateSubprogramDIE(CompileUnit *DW_Unit,
1170 const DISubprogram &SP,
Bill Wendling6679ee42009-05-18 22:02:36 +00001171 bool IsConstructor,
1172 bool IsInlined) {
Bill Wendling0310d762009-05-15 09:23:25 +00001173 DIE *SPDie = new DIE(dwarf::DW_TAG_subprogram);
1174
Devang Patel5ccdd102009-09-29 18:40:58 +00001175 const char * Name = SP.getName();
Bill Wendling0310d762009-05-15 09:23:25 +00001176 AddString(SPDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1177
Devang Patel5ccdd102009-09-29 18:40:58 +00001178 const char *LinkageName = SP.getLinkageName();
1179 if (LinkageName) {
Devang Patel53cb17d2009-07-16 01:01:22 +00001180 // Skip special LLVM prefix that is used to inform the asm printer to not emit
1181 // usual symbol prefix before the symbol name. This happens for Objective-C
1182 // symbol names and symbol whose name is replaced using GCC's __asm__ attribute.
1183 if (LinkageName[0] == 1)
1184 LinkageName = &LinkageName[1];
Bill Wendling0310d762009-05-15 09:23:25 +00001185 AddString(SPDie, dwarf::DW_AT_MIPS_linkage_name, dwarf::DW_FORM_string,
Devang Patel1a8d2d22009-07-14 00:55:28 +00001186 LinkageName);
Devang Patel53cb17d2009-07-16 01:01:22 +00001187 }
Bill Wendling0310d762009-05-15 09:23:25 +00001188 AddSourceLine(SPDie, &SP);
1189
1190 DICompositeType SPTy = SP.getType();
1191 DIArray Args = SPTy.getTypeArray();
1192
1193 // Add prototyped tag, if C or ObjC.
1194 unsigned Lang = SP.getCompileUnit().getLanguage();
1195 if (Lang == dwarf::DW_LANG_C99 || Lang == dwarf::DW_LANG_C89 ||
1196 Lang == dwarf::DW_LANG_ObjC)
1197 AddUInt(SPDie, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
1198
1199 // Add Return Type.
1200 unsigned SPTag = SPTy.getTag();
1201 if (!IsConstructor) {
1202 if (Args.isNull() || SPTag != dwarf::DW_TAG_subroutine_type)
1203 AddType(DW_Unit, SPDie, SPTy);
1204 else
Devang Patele4b27562009-08-28 23:24:31 +00001205 AddType(DW_Unit, SPDie, DIType(Args.getElement(0).getNode()));
Bill Wendling0310d762009-05-15 09:23:25 +00001206 }
1207
1208 if (!SP.isDefinition()) {
1209 AddUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1210
1211 // Add arguments. Do not add arguments for subprogram definition. They will
1212 // be handled through RecordVariable.
1213 if (SPTag == dwarf::DW_TAG_subroutine_type)
1214 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
1215 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
Devang Patele4b27562009-08-28 23:24:31 +00001216 AddType(DW_Unit, Arg, DIType(Args.getElement(i).getNode()));
Bill Wendling0310d762009-05-15 09:23:25 +00001217 AddUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1); // ??
1218 SPDie->AddChild(Arg);
1219 }
1220 }
1221
Bill Wendling6679ee42009-05-18 22:02:36 +00001222 if (!SP.isLocalToUnit() && !IsInlined)
Bill Wendling0310d762009-05-15 09:23:25 +00001223 AddUInt(SPDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
1224
1225 // DW_TAG_inlined_subroutine may refer to this DIE.
Devang Patele4b27562009-08-28 23:24:31 +00001226 DIE *&Slot = DW_Unit->getDieMapSlotFor(SP.getNode());
Bill Wendling0310d762009-05-15 09:23:25 +00001227 Slot = SPDie;
1228 return SPDie;
1229}
1230
1231/// FindCompileUnit - Get the compile unit for the given descriptor.
1232///
1233CompileUnit &DwarfDebug::FindCompileUnit(DICompileUnit Unit) const {
1234 DenseMap<Value *, CompileUnit *>::const_iterator I =
Devang Patele4b27562009-08-28 23:24:31 +00001235 CompileUnitMap.find(Unit.getNode());
Bill Wendling0310d762009-05-15 09:23:25 +00001236 assert(I != CompileUnitMap.end() && "Missing compile unit.");
1237 return *I->second;
1238}
1239
Bill Wendling995f80a2009-05-20 23:24:48 +00001240/// CreateDbgScopeVariable - Create a new scope variable.
Bill Wendling0310d762009-05-15 09:23:25 +00001241///
Bill Wendling995f80a2009-05-20 23:24:48 +00001242DIE *DwarfDebug::CreateDbgScopeVariable(DbgVariable *DV, CompileUnit *Unit) {
Bill Wendling0310d762009-05-15 09:23:25 +00001243 // Get the descriptor.
1244 const DIVariable &VD = DV->getVariable();
1245
1246 // Translate tag to proper Dwarf tag. The result variable is dropped for
1247 // now.
1248 unsigned Tag;
1249 switch (VD.getTag()) {
1250 case dwarf::DW_TAG_return_variable:
1251 return NULL;
1252 case dwarf::DW_TAG_arg_variable:
1253 Tag = dwarf::DW_TAG_formal_parameter;
1254 break;
1255 case dwarf::DW_TAG_auto_variable: // fall thru
1256 default:
1257 Tag = dwarf::DW_TAG_variable;
1258 break;
1259 }
1260
1261 // Define variable debug information entry.
1262 DIE *VariableDie = new DIE(Tag);
Devang Patel5ccdd102009-09-29 18:40:58 +00001263 const char *Name = VD.getName();
Bill Wendling0310d762009-05-15 09:23:25 +00001264 AddString(VariableDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1265
1266 // Add source line info if available.
1267 AddSourceLine(VariableDie, &VD);
1268
1269 // Add variable type.
Mike Stump3e4c9bd2009-09-30 00:08:22 +00001270 // FIXME: isBlockByrefVariable should be reformulated in terms of complex addresses instead.
Caroline Ticedc8f6042009-08-31 21:19:37 +00001271 if (VD.isBlockByrefVariable())
1272 AddType(Unit, VariableDie, GetBlockByrefType(VD.getType(), Name));
1273 else
1274 AddType(Unit, VariableDie, VD.getType());
Bill Wendling0310d762009-05-15 09:23:25 +00001275
1276 // Add variable address.
Bill Wendling1180c782009-05-18 23:08:55 +00001277 if (!DV->isInlinedFnVar()) {
1278 // Variables for abstract instances of inlined functions don't get a
1279 // location.
1280 MachineLocation Location;
1281 Location.set(RI->getFrameRegister(*MF),
1282 RI->getFrameIndexOffset(*MF, DV->getFrameIndex()));
Caroline Ticedc8f6042009-08-31 21:19:37 +00001283
Mike Stump3e4c9bd2009-09-30 00:08:22 +00001284
1285 if (VD.hasComplexAddress())
1286 AddComplexAddress(DV, VariableDie, dwarf::DW_AT_location, Location);
1287 else if (VD.isBlockByrefVariable())
Mike Stumpee4b8a72009-09-24 23:11:08 +00001288 AddBlockByrefAddress(DV, VariableDie, dwarf::DW_AT_location, Location);
Caroline Ticedc8f6042009-08-31 21:19:37 +00001289 else
1290 AddAddress(VariableDie, dwarf::DW_AT_location, Location);
Bill Wendling1180c782009-05-18 23:08:55 +00001291 }
Bill Wendling0310d762009-05-15 09:23:25 +00001292
1293 return VariableDie;
1294}
1295
1296/// getOrCreateScope - Returns the scope associated with the given descriptor.
1297///
Devang Patelaf9e8472009-10-01 20:31:14 +00001298DbgScope *DwarfDebug::getDbgScope(MDNode *N, const MachineInstr *MI) {
1299 DbgScope *&Slot = DbgScopeMap[N];
1300 if (Slot) return Slot;
1301
1302 DbgScope *Parent = NULL;
1303
1304 DIDescriptor Scope(N);
1305 if (Scope.isCompileUnit()) {
1306 return NULL;
1307 } else if (Scope.isSubprogram()) {
1308 DISubprogram SP(N);
1309 DIDescriptor ParentDesc = SP.getContext();
1310 if (!ParentDesc.isNull() && !ParentDesc.isCompileUnit())
1311 Parent = getDbgScope(ParentDesc.getNode(), MI);
1312 } else if (Scope.isLexicalBlock()) {
1313 DILexicalBlock DB(N);
1314 DIDescriptor ParentDesc = DB.getContext();
1315 if (!ParentDesc.isNull())
1316 Parent = getDbgScope(ParentDesc.getNode(), MI);
1317 } else
1318 assert (0 && "Unexpected scope info");
1319
1320 Slot = new DbgScope(Parent, DIDescriptor(N));
1321 Slot->setFirstInsn(MI);
1322
1323 if (Parent)
1324 Parent->AddScope(Slot);
1325 else
1326 // First function is top level function.
Devang Patelaf9e8472009-10-01 20:31:14 +00001327 if (!FunctionDbgScope)
1328 FunctionDbgScope = Slot;
1329
1330 return Slot;
1331}
1332
1333
1334/// getOrCreateScope - Returns the scope associated with the given descriptor.
1335/// FIXME - Remove this method.
Devang Patele4b27562009-08-28 23:24:31 +00001336DbgScope *DwarfDebug::getOrCreateScope(MDNode *N) {
1337 DbgScope *&Slot = DbgScopeMap[N];
Bill Wendling0310d762009-05-15 09:23:25 +00001338 if (Slot) return Slot;
1339
1340 DbgScope *Parent = NULL;
Devang Patel5e005d82009-08-31 22:00:15 +00001341 DILexicalBlock Block(N);
Bill Wendling0310d762009-05-15 09:23:25 +00001342
Bill Wendling8fff19b2009-06-01 20:18:46 +00001343 // Don't create a new scope if we already created one for an inlined function.
Devang Patele4b27562009-08-28 23:24:31 +00001344 DenseMap<const MDNode *, DbgScope *>::iterator
1345 II = AbstractInstanceRootMap.find(N);
Bill Wendling8fff19b2009-06-01 20:18:46 +00001346 if (II != AbstractInstanceRootMap.end())
1347 return LexicalScopeStack.back();
1348
Bill Wendling0310d762009-05-15 09:23:25 +00001349 if (!Block.isNull()) {
1350 DIDescriptor ParentDesc = Block.getContext();
1351 Parent =
Devang Patele4b27562009-08-28 23:24:31 +00001352 ParentDesc.isNull() ? NULL : getOrCreateScope(ParentDesc.getNode());
Bill Wendling0310d762009-05-15 09:23:25 +00001353 }
1354
Devang Patele4b27562009-08-28 23:24:31 +00001355 Slot = new DbgScope(Parent, DIDescriptor(N));
Bill Wendling0310d762009-05-15 09:23:25 +00001356
1357 if (Parent)
1358 Parent->AddScope(Slot);
1359 else
1360 // First function is top level function.
1361 FunctionDbgScope = Slot;
1362
1363 return Slot;
1364}
1365
1366/// ConstructDbgScope - Construct the components of a scope.
1367///
1368void DwarfDebug::ConstructDbgScope(DbgScope *ParentScope,
1369 unsigned ParentStartID,
1370 unsigned ParentEndID,
1371 DIE *ParentDie, CompileUnit *Unit) {
1372 // Add variables to scope.
1373 SmallVector<DbgVariable *, 8> &Variables = ParentScope->getVariables();
1374 for (unsigned i = 0, N = Variables.size(); i < N; ++i) {
Bill Wendling995f80a2009-05-20 23:24:48 +00001375 DIE *VariableDie = CreateDbgScopeVariable(Variables[i], Unit);
Bill Wendling0310d762009-05-15 09:23:25 +00001376 if (VariableDie) ParentDie->AddChild(VariableDie);
1377 }
1378
1379 // Add concrete instances to scope.
1380 SmallVector<DbgConcreteScope *, 8> &ConcreteInsts =
1381 ParentScope->getConcreteInsts();
1382 for (unsigned i = 0, N = ConcreteInsts.size(); i < N; ++i) {
1383 DbgConcreteScope *ConcreteInst = ConcreteInsts[i];
1384 DIE *Die = ConcreteInst->getDie();
1385
1386 unsigned StartID = ConcreteInst->getStartLabelID();
1387 unsigned EndID = ConcreteInst->getEndLabelID();
1388
1389 // Add the scope bounds.
1390 if (StartID)
1391 AddLabel(Die, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
1392 DWLabel("label", StartID));
1393 else
1394 AddLabel(Die, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
1395 DWLabel("func_begin", SubprogramCount));
1396
1397 if (EndID)
1398 AddLabel(Die, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
1399 DWLabel("label", EndID));
1400 else
1401 AddLabel(Die, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
1402 DWLabel("func_end", SubprogramCount));
1403
1404 ParentDie->AddChild(Die);
1405 }
1406
1407 // Add nested scopes.
1408 SmallVector<DbgScope *, 4> &Scopes = ParentScope->getScopes();
1409 for (unsigned j = 0, M = Scopes.size(); j < M; ++j) {
1410 // Define the Scope debug information entry.
1411 DbgScope *Scope = Scopes[j];
1412
1413 unsigned StartID = MMI->MappedLabel(Scope->getStartLabelID());
1414 unsigned EndID = MMI->MappedLabel(Scope->getEndLabelID());
1415
1416 // Ignore empty scopes.
1417 if (StartID == EndID && StartID != 0) continue;
1418
1419 // Do not ignore inlined scopes even if they don't have any variables or
1420 // scopes.
1421 if (Scope->getScopes().empty() && Scope->getVariables().empty() &&
1422 Scope->getConcreteInsts().empty())
1423 continue;
1424
1425 if (StartID == ParentStartID && EndID == ParentEndID) {
1426 // Just add stuff to the parent scope.
1427 ConstructDbgScope(Scope, ParentStartID, ParentEndID, ParentDie, Unit);
1428 } else {
1429 DIE *ScopeDie = new DIE(dwarf::DW_TAG_lexical_block);
1430
1431 // Add the scope bounds.
1432 if (StartID)
1433 AddLabel(ScopeDie, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
1434 DWLabel("label", StartID));
1435 else
1436 AddLabel(ScopeDie, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
1437 DWLabel("func_begin", SubprogramCount));
1438
1439 if (EndID)
1440 AddLabel(ScopeDie, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
1441 DWLabel("label", EndID));
1442 else
1443 AddLabel(ScopeDie, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
1444 DWLabel("func_end", SubprogramCount));
1445
1446 // Add the scope's contents.
1447 ConstructDbgScope(Scope, StartID, EndID, ScopeDie, Unit);
1448 ParentDie->AddChild(ScopeDie);
1449 }
1450 }
1451}
1452
1453/// ConstructFunctionDbgScope - Construct the scope for the subprogram.
1454///
Bill Wendling17956162009-05-20 23:28:48 +00001455void DwarfDebug::ConstructFunctionDbgScope(DbgScope *RootScope,
1456 bool AbstractScope) {
Bill Wendling0310d762009-05-15 09:23:25 +00001457 // Exit if there is no root scope.
1458 if (!RootScope) return;
1459 DIDescriptor Desc = RootScope->getDesc();
1460 if (Desc.isNull())
1461 return;
1462
1463 // Get the subprogram debug information entry.
Devang Patele4b27562009-08-28 23:24:31 +00001464 DISubprogram SPD(Desc.getNode());
Bill Wendling0310d762009-05-15 09:23:25 +00001465
Bill Wendling0310d762009-05-15 09:23:25 +00001466 // Get the subprogram die.
Devang Patele4b27562009-08-28 23:24:31 +00001467 DIE *SPDie = ModuleCU->getDieMapSlotFor(SPD.getNode());
Devang Patelffd9c3d2009-10-05 23:59:00 +00001468 if (!SPDie) {
1469 ConstructSubprogram(SPD.getNode());
1470 SPDie = ModuleCU->getDieMapSlotFor(SPD.getNode());
1471 }
Bill Wendling0310d762009-05-15 09:23:25 +00001472 assert(SPDie && "Missing subprogram descriptor");
1473
Bill Wendling17956162009-05-20 23:28:48 +00001474 if (!AbstractScope) {
1475 // Add the function bounds.
1476 AddLabel(SPDie, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
1477 DWLabel("func_begin", SubprogramCount));
1478 AddLabel(SPDie, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
1479 DWLabel("func_end", SubprogramCount));
1480 MachineLocation Location(RI->getFrameRegister(*MF));
1481 AddAddress(SPDie, dwarf::DW_AT_frame_base, Location);
1482 }
Bill Wendling0310d762009-05-15 09:23:25 +00001483
Devang Patel1dbc7712009-06-29 20:45:18 +00001484 ConstructDbgScope(RootScope, 0, 0, SPDie, ModuleCU);
Devang Patelfd07cf52009-10-05 23:40:42 +00001485 // If there are global variables at this scope then add their dies.
1486 for (SmallVector<WeakVH, 4>::iterator SGI = ScopedGVs.begin(),
1487 SGE = ScopedGVs.end(); SGI != SGE; ++SGI) {
1488 MDNode *N = dyn_cast_or_null<MDNode>(*SGI);
1489 if (!N) continue;
1490 DIGlobalVariable GV(N);
1491 if (GV.getContext().getNode() == RootScope->getDesc().getNode()) {
1492 DIE *ScopedGVDie = CreateGlobalVariableDIE(ModuleCU, GV);
1493 SPDie->AddChild(ScopedGVDie);
1494 }
1495 }
Bill Wendling0310d762009-05-15 09:23:25 +00001496}
1497
Bill Wendling0310d762009-05-15 09:23:25 +00001498/// ConstructDefaultDbgScope - Construct a default scope for the subprogram.
1499///
1500void DwarfDebug::ConstructDefaultDbgScope(MachineFunction *MF) {
Devang Patel1dbc7712009-06-29 20:45:18 +00001501 StringMap<DIE*> &Globals = ModuleCU->getGlobals();
Daniel Dunbar460f6562009-07-26 09:48:23 +00001502 StringMap<DIE*>::iterator GI = Globals.find(MF->getFunction()->getName());
Devang Patel70f44262009-06-29 20:38:13 +00001503 if (GI != Globals.end()) {
1504 DIE *SPDie = GI->second;
Daniel Dunbarf612ff62009-09-19 20:40:05 +00001505
Devang Patel70f44262009-06-29 20:38:13 +00001506 // Add the function bounds.
1507 AddLabel(SPDie, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
1508 DWLabel("func_begin", SubprogramCount));
1509 AddLabel(SPDie, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
1510 DWLabel("func_end", SubprogramCount));
Daniel Dunbarf612ff62009-09-19 20:40:05 +00001511
Devang Patel70f44262009-06-29 20:38:13 +00001512 MachineLocation Location(RI->getFrameRegister(*MF));
1513 AddAddress(SPDie, dwarf::DW_AT_frame_base, Location);
Bill Wendling0310d762009-05-15 09:23:25 +00001514 }
Bill Wendling0310d762009-05-15 09:23:25 +00001515}
1516
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001517/// GetOrCreateSourceID - Look up the source id with the given directory and
1518/// source file names. If none currently exists, create a new id and insert it
1519/// in the SourceIds map. This can update DirectoryNames and SourceFileNames
1520/// maps as well.
Devang Patel5ccdd102009-09-29 18:40:58 +00001521unsigned DwarfDebug::GetOrCreateSourceID(const char *DirName,
1522 const char *FileName) {
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001523 unsigned DId;
1524 StringMap<unsigned>::iterator DI = DirectoryIdMap.find(DirName);
1525 if (DI != DirectoryIdMap.end()) {
1526 DId = DI->getValue();
1527 } else {
1528 DId = DirectoryNames.size() + 1;
1529 DirectoryIdMap[DirName] = DId;
1530 DirectoryNames.push_back(DirName);
1531 }
1532
1533 unsigned FId;
1534 StringMap<unsigned>::iterator FI = SourceFileIdMap.find(FileName);
1535 if (FI != SourceFileIdMap.end()) {
1536 FId = FI->getValue();
1537 } else {
1538 FId = SourceFileNames.size() + 1;
1539 SourceFileIdMap[FileName] = FId;
1540 SourceFileNames.push_back(FileName);
1541 }
1542
1543 DenseMap<std::pair<unsigned, unsigned>, unsigned>::iterator SI =
1544 SourceIdMap.find(std::make_pair(DId, FId));
1545 if (SI != SourceIdMap.end())
1546 return SI->second;
1547
1548 unsigned SrcId = SourceIds.size() + 1; // DW_AT_decl_file cannot be 0.
1549 SourceIdMap[std::make_pair(DId, FId)] = SrcId;
1550 SourceIds.push_back(std::make_pair(DId, FId));
1551
1552 return SrcId;
1553}
1554
Devang Patele4b27562009-08-28 23:24:31 +00001555void DwarfDebug::ConstructCompileUnit(MDNode *N) {
1556 DICompileUnit DIUnit(N);
Devang Patel5ccdd102009-09-29 18:40:58 +00001557 const char *FN = DIUnit.getFilename();
1558 const char *Dir = DIUnit.getDirectory();
1559 unsigned ID = GetOrCreateSourceID(Dir, FN);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001560
1561 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
1562 AddSectionOffset(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4,
1563 DWLabel("section_line", 0), DWLabel("section_line", 0),
1564 false);
1565 AddString(Die, dwarf::DW_AT_producer, dwarf::DW_FORM_string,
Devang Patel5ccdd102009-09-29 18:40:58 +00001566 DIUnit.getProducer());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001567 AddUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data1,
1568 DIUnit.getLanguage());
1569 AddString(Die, dwarf::DW_AT_name, dwarf::DW_FORM_string, FN);
1570
Devang Patel5ccdd102009-09-29 18:40:58 +00001571 if (Dir)
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001572 AddString(Die, dwarf::DW_AT_comp_dir, dwarf::DW_FORM_string, Dir);
1573 if (DIUnit.isOptimized())
1574 AddUInt(Die, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1);
1575
Devang Patel5ccdd102009-09-29 18:40:58 +00001576 if (const char *Flags = DIUnit.getFlags())
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001577 AddString(Die, dwarf::DW_AT_APPLE_flags, dwarf::DW_FORM_string, Flags);
1578
1579 unsigned RVer = DIUnit.getRunTimeVersion();
1580 if (RVer)
1581 AddUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers,
1582 dwarf::DW_FORM_data1, RVer);
1583
1584 CompileUnit *Unit = new CompileUnit(ID, Die);
Devang Patel1dbc7712009-06-29 20:45:18 +00001585 if (!ModuleCU && DIUnit.isMain()) {
Devang Patel70f44262009-06-29 20:38:13 +00001586 // Use first compile unit marked as isMain as the compile unit
1587 // for this module.
Devang Patel1dbc7712009-06-29 20:45:18 +00001588 ModuleCU = Unit;
Devang Patel70f44262009-06-29 20:38:13 +00001589 }
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001590
Devang Patele4b27562009-08-28 23:24:31 +00001591 CompileUnitMap[DIUnit.getNode()] = Unit;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001592 CompileUnits.push_back(Unit);
1593}
1594
Devang Patele4b27562009-08-28 23:24:31 +00001595void DwarfDebug::ConstructGlobalVariableDIE(MDNode *N) {
1596 DIGlobalVariable DI_GV(N);
Daniel Dunbarf612ff62009-09-19 20:40:05 +00001597
Devang Patel905cf5e2009-09-04 23:59:07 +00001598 // If debug information is malformed then ignore it.
1599 if (DI_GV.Verify() == false)
1600 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001601
1602 // Check for pre-existence.
Devang Patele4b27562009-08-28 23:24:31 +00001603 DIE *&Slot = ModuleCU->getDieMapSlotFor(DI_GV.getNode());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001604 if (Slot)
Devang Patel13e16b62009-06-26 01:49:18 +00001605 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001606
Devang Patel1dbc7712009-06-29 20:45:18 +00001607 DIE *VariableDie = CreateGlobalVariableDIE(ModuleCU, DI_GV);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001608
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001609 // Add to map.
1610 Slot = VariableDie;
1611
1612 // Add to context owner.
Devang Patel1dbc7712009-06-29 20:45:18 +00001613 ModuleCU->getDie()->AddChild(VariableDie);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001614
1615 // Expose as global. FIXME - need to check external flag.
Devang Patel5ccdd102009-09-29 18:40:58 +00001616 ModuleCU->AddGlobal(DI_GV.getName(), VariableDie);
Devang Patel13e16b62009-06-26 01:49:18 +00001617 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001618}
1619
Devang Patele4b27562009-08-28 23:24:31 +00001620void DwarfDebug::ConstructSubprogram(MDNode *N) {
1621 DISubprogram SP(N);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001622
1623 // Check for pre-existence.
Devang Patele4b27562009-08-28 23:24:31 +00001624 DIE *&Slot = ModuleCU->getDieMapSlotFor(N);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001625 if (Slot)
Devang Patel13e16b62009-06-26 01:49:18 +00001626 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001627
1628 if (!SP.isDefinition())
1629 // This is a method declaration which will be handled while constructing
1630 // class type.
Devang Patel13e16b62009-06-26 01:49:18 +00001631 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001632
Devang Patel1dbc7712009-06-29 20:45:18 +00001633 DIE *SubprogramDie = CreateSubprogramDIE(ModuleCU, SP);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001634
1635 // Add to map.
1636 Slot = SubprogramDie;
1637
1638 // Add to context owner.
Devang Patel1dbc7712009-06-29 20:45:18 +00001639 ModuleCU->getDie()->AddChild(SubprogramDie);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001640
1641 // Expose as global.
Devang Patel5ccdd102009-09-29 18:40:58 +00001642 ModuleCU->AddGlobal(SP.getName(), SubprogramDie);
Devang Patel13e16b62009-06-26 01:49:18 +00001643 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001644}
1645
Daniel Dunbar00564992009-09-19 20:40:14 +00001646/// BeginModule - Emit all Dwarf sections that should come prior to the
1647/// content. Create global DIEs and emit initial debug info sections.
1648/// This is inovked by the target AsmPrinter.
Devang Patel208622d2009-06-25 22:36:02 +00001649void DwarfDebug::BeginModule(Module *M, MachineModuleInfo *mmi) {
1650 this->M = M;
1651
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001652 if (TimePassesIsEnabled)
1653 DebugTimer->startTimer();
1654
Devang Patel78ab9e22009-07-30 18:56:46 +00001655 DebugInfoFinder DbgFinder;
1656 DbgFinder.processModule(*M);
Devang Patel13e16b62009-06-26 01:49:18 +00001657
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001658 // Create all the compile unit DIEs.
Devang Patel78ab9e22009-07-30 18:56:46 +00001659 for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
1660 E = DbgFinder.compile_unit_end(); I != E; ++I)
Devang Patel13e16b62009-06-26 01:49:18 +00001661 ConstructCompileUnit(*I);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001662
1663 if (CompileUnits.empty()) {
1664 if (TimePassesIsEnabled)
1665 DebugTimer->stopTimer();
1666
1667 return;
1668 }
1669
Devang Patel70f44262009-06-29 20:38:13 +00001670 // If main compile unit for this module is not seen than randomly
1671 // select first compile unit.
Devang Patel1dbc7712009-06-29 20:45:18 +00001672 if (!ModuleCU)
1673 ModuleCU = CompileUnits[0];
Devang Patel70f44262009-06-29 20:38:13 +00001674
Devang Patel13e16b62009-06-26 01:49:18 +00001675 // Create DIEs for each of the externally visible global variables.
Devang Patel78ab9e22009-07-30 18:56:46 +00001676 for (DebugInfoFinder::iterator I = DbgFinder.global_variable_begin(),
Devang Patelfd07cf52009-10-05 23:40:42 +00001677 E = DbgFinder.global_variable_end(); I != E; ++I) {
1678 DIGlobalVariable GV(*I);
1679 if (GV.getContext().getNode() != GV.getCompileUnit().getNode())
1680 ScopedGVs.push_back(*I);
1681 else
1682 ConstructGlobalVariableDIE(*I);
1683 }
Devang Patel13e16b62009-06-26 01:49:18 +00001684
1685 // Create DIEs for each of the externally visible subprograms.
Devang Patel78ab9e22009-07-30 18:56:46 +00001686 for (DebugInfoFinder::iterator I = DbgFinder.subprogram_begin(),
1687 E = DbgFinder.subprogram_end(); I != E; ++I)
Devang Patel13e16b62009-06-26 01:49:18 +00001688 ConstructSubprogram(*I);
1689
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001690 MMI = mmi;
1691 shouldEmit = true;
1692 MMI->setDebugInfoAvailability(true);
1693
1694 // Prime section data.
Chris Lattnerf0144122009-07-28 03:13:23 +00001695 SectionMap.insert(Asm->getObjFileLowering().getTextSection());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001696
1697 // Print out .file directives to specify files for .loc directives. These are
1698 // printed out early so that they precede any .loc directives.
Chris Lattner33adcfb2009-08-22 21:43:10 +00001699 if (MAI->hasDotLocAndDotFile()) {
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001700 for (unsigned i = 1, e = getNumSourceIds()+1; i != e; ++i) {
1701 // Remember source id starts at 1.
1702 std::pair<unsigned, unsigned> Id = getSourceDirectoryAndFileIds(i);
1703 sys::Path FullPath(getSourceDirectoryName(Id.first));
1704 bool AppendOk =
1705 FullPath.appendComponent(getSourceFileName(Id.second));
1706 assert(AppendOk && "Could not append filename to directory!");
1707 AppendOk = false;
Chris Lattner74382b72009-08-23 22:45:37 +00001708 Asm->EmitFile(i, FullPath.str());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001709 Asm->EOL();
1710 }
1711 }
1712
1713 // Emit initial sections
1714 EmitInitial();
1715
1716 if (TimePassesIsEnabled)
1717 DebugTimer->stopTimer();
1718}
1719
1720/// EndModule - Emit all Dwarf sections that should come after the content.
1721///
1722void DwarfDebug::EndModule() {
Devang Patel6f3dc922009-10-06 00:03:14 +00001723 if (!ModuleCU)
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001724 return;
1725
1726 if (TimePassesIsEnabled)
1727 DebugTimer->startTimer();
1728
1729 // Standard sections final addresses.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00001730 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getTextSection());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001731 EmitLabel("text_end", 0);
Chris Lattner6c2f9e12009-08-19 05:49:37 +00001732 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getDataSection());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001733 EmitLabel("data_end", 0);
1734
1735 // End text sections.
1736 for (unsigned i = 1, N = SectionMap.size(); i <= N; ++i) {
Chris Lattner6c2f9e12009-08-19 05:49:37 +00001737 Asm->OutStreamer.SwitchSection(SectionMap[i]);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001738 EmitLabel("section_end", i);
1739 }
1740
1741 // Emit common frame information.
1742 EmitCommonDebugFrame();
1743
1744 // Emit function debug frame information
1745 for (std::vector<FunctionDebugFrameInfo>::iterator I = DebugFrames.begin(),
1746 E = DebugFrames.end(); I != E; ++I)
1747 EmitFunctionDebugFrame(*I);
1748
1749 // Compute DIE offsets and sizes.
1750 SizeAndOffsets();
1751
1752 // Emit all the DIEs into a debug info section
1753 EmitDebugInfo();
1754
1755 // Corresponding abbreviations into a abbrev section.
1756 EmitAbbreviations();
1757
1758 // Emit source line correspondence into a debug line section.
1759 EmitDebugLines();
1760
1761 // Emit info into a debug pubnames section.
1762 EmitDebugPubNames();
1763
1764 // Emit info into a debug str section.
1765 EmitDebugStr();
1766
1767 // Emit info into a debug loc section.
1768 EmitDebugLoc();
1769
1770 // Emit info into a debug aranges section.
1771 EmitDebugARanges();
1772
1773 // Emit info into a debug ranges section.
1774 EmitDebugRanges();
1775
1776 // Emit info into a debug macinfo section.
1777 EmitDebugMacInfo();
1778
1779 // Emit inline info.
1780 EmitDebugInlineInfo();
1781
1782 if (TimePassesIsEnabled)
1783 DebugTimer->stopTimer();
1784}
1785
Devang Patele717faa2009-10-06 01:26:37 +00001786/// CollectVariableInfo - Populate DbgScope entries with variables' info.
Devang Patelac1ceb32009-10-09 22:42:28 +00001787void DwarfDebug::CollectVariableInfo() {
1788 if (!MMI) return;
Devang Patele717faa2009-10-06 01:26:37 +00001789 MachineModuleInfo::VariableDbgInfoMapTy &VMap = MMI->getVariableDbgInfo();
1790 for (MachineModuleInfo::VariableDbgInfoMapTy::iterator VI = VMap.begin(),
1791 VE = VMap.end(); VI != VE; ++VI) {
Devang Patelac1ceb32009-10-09 22:42:28 +00001792 MetadataBase *MB = VI->first;
1793 MDNode *Var = dyn_cast_or_null<MDNode>(MB);
Devang Pateleda31212009-10-08 18:48:03 +00001794 DIVariable DV (Var);
1795 if (DV.isNull()) continue;
Devang Patelac1ceb32009-10-09 22:42:28 +00001796 unsigned VSlot = VI->second;
1797 DbgScope *Scope = getDbgScope(DV.getContext().getNode(), NULL);
Devang Pateleda31212009-10-08 18:48:03 +00001798 Scope->AddVariable(new DbgVariable(DV, VSlot, false));
Devang Patele717faa2009-10-06 01:26:37 +00001799 }
1800}
1801
Devang Patel0d20ac82009-10-06 01:50:42 +00001802/// SetDbgScopeBeginLabels - Update DbgScope begin labels for the scopes that
1803/// start with this machine instruction.
1804void DwarfDebug::SetDbgScopeBeginLabels(const MachineInstr *MI, unsigned Label) {
1805 InsnToDbgScopeMapTy::iterator I = DbgScopeBeginMap.find(MI);
1806 if (I == DbgScopeBeginMap.end())
1807 return;
1808 SmallVector<DbgScope *, 2> &SD = I->second;
1809 for (SmallVector<DbgScope *, 2>::iterator SDI = SD.begin(), SDE = SD.end();
1810 SDI != SDE; ++SDI)
1811 (*SDI)->setStartLabelID(Label);
1812}
1813
1814/// SetDbgScopeEndLabels - Update DbgScope end labels for the scopes that
1815/// end with this machine instruction.
1816void DwarfDebug::SetDbgScopeEndLabels(const MachineInstr *MI, unsigned Label) {
1817 InsnToDbgScopeMapTy::iterator I = DbgScopeEndMap.find(MI);
Devang Patel8a4087d2009-10-06 03:15:38 +00001818 if (I == DbgScopeEndMap.end())
Devang Patel0d20ac82009-10-06 01:50:42 +00001819 return;
1820 SmallVector<DbgScope *, 2> &SD = I->second;
1821 for (SmallVector<DbgScope *, 2>::iterator SDI = SD.begin(), SDE = SD.end();
1822 SDI != SDE; ++SDI)
1823 (*SDI)->setEndLabelID(Label);
1824}
1825
Devang Patelaf9e8472009-10-01 20:31:14 +00001826/// ExtractScopeInformation - Scan machine instructions in this function
1827/// and collect DbgScopes. Return true, if atleast one scope was found.
1828bool DwarfDebug::ExtractScopeInformation(MachineFunction *MF) {
1829 // If scope information was extracted using .dbg intrinsics then there is not
1830 // any need to extract these information by scanning each instruction.
1831 if (!DbgScopeMap.empty())
1832 return false;
1833
1834 // Scan each instruction and create scopes.
1835 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
1836 I != E; ++I) {
1837 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
1838 II != IE; ++II) {
1839 const MachineInstr *MInsn = II;
1840 DebugLoc DL = MInsn->getDebugLoc();
1841 if (DL.isUnknown())
1842 continue;
1843 DebugLocTuple DLT = MF->getDebugLocTuple(DL);
1844 if (!DLT.CompileUnit)
1845 continue;
1846 // There is no need to create another DIE for compile unit. For all
1847 // other scopes, create one DbgScope now. This will be translated
1848 // into a scope DIE at the end.
1849 DIDescriptor D(DLT.CompileUnit);
1850 if (!D.isCompileUnit()) {
1851 DbgScope *Scope = getDbgScope(DLT.CompileUnit, MInsn);
1852 Scope->setLastInsn(MInsn);
1853 }
1854 }
1855 }
1856
1857 // If a scope's last instruction is not set then use its child scope's
1858 // last instruction as this scope's last instrunction.
1859 for (DenseMap<MDNode *, DbgScope *>::iterator DI = DbgScopeMap.begin(),
1860 DE = DbgScopeMap.end(); DI != DE; ++DI) {
1861 assert (DI->second->getFirstInsn() && "Invalid first instruction!");
1862 DI->second->FixInstructionMarkers();
1863 assert (DI->second->getLastInsn() && "Invalid last instruction!");
1864 }
1865
1866 // Each scope has first instruction and last instruction to mark beginning
1867 // and end of a scope respectively. Create an inverse map that list scopes
1868 // starts (and ends) with an instruction. One instruction may start (or end)
1869 // multiple scopes.
1870 for (DenseMap<MDNode *, DbgScope *>::iterator DI = DbgScopeMap.begin(),
1871 DE = DbgScopeMap.end(); DI != DE; ++DI) {
1872 DbgScope *S = DI->second;
1873 assert (S && "DbgScope is missing!");
1874 const MachineInstr *MI = S->getFirstInsn();
1875 assert (MI && "DbgScope does not have first instruction!");
1876
1877 InsnToDbgScopeMapTy::iterator IDI = DbgScopeBeginMap.find(MI);
1878 if (IDI != DbgScopeBeginMap.end())
1879 IDI->second.push_back(S);
1880 else
1881 DbgScopeBeginMap.insert(std::make_pair(MI,
1882 SmallVector<DbgScope *, 2>(2, S)));
1883
1884 MI = S->getLastInsn();
1885 assert (MI && "DbgScope does not have last instruction!");
1886 IDI = DbgScopeEndMap.find(MI);
1887 if (IDI != DbgScopeEndMap.end())
1888 IDI->second.push_back(S);
1889 else
1890 DbgScopeEndMap.insert(std::make_pair(MI,
1891 SmallVector<DbgScope *, 2>(2, S)));
1892 }
1893
1894 return !DbgScopeMap.empty();
1895}
1896
Devang Patel6ef75172009-10-12 23:11:24 +00001897static DISubprogram getDISubprogram(MDNode *N) {
1898
1899 DIDescriptor D(N);
1900 if (D.isNull())
1901 return DISubprogram();
1902
1903 if (D.isCompileUnit())
1904 return DISubprogram();
1905
1906 if (D.isSubprogram())
1907 return DISubprogram(N);
1908
1909 if (D.isLexicalBlock())
1910 return getDISubprogram(DILexicalBlock(N).getContext().getNode());
1911
1912 assert (0 && "Unexpected Descriptor!");
1913}
1914
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001915/// BeginFunction - Gather pre-function debug information. Assumes being
1916/// emitted immediately after the function entry point.
1917void DwarfDebug::BeginFunction(MachineFunction *MF) {
1918 this->MF = MF;
1919
1920 if (!ShouldEmitDwarfDebug()) return;
1921
1922 if (TimePassesIsEnabled)
1923 DebugTimer->startTimer();
1924
Devang Patel60b35bd2009-10-06 18:37:31 +00001925#ifdef ATTACH_DEBUG_INFO_TO_AN_INSN
1926 if (!ExtractScopeInformation(MF))
1927 return;
Devang Patelac1ceb32009-10-09 22:42:28 +00001928 CollectVariableInfo();
Devang Patel60b35bd2009-10-06 18:37:31 +00001929#endif
1930
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001931 // Begin accumulating function debug information.
1932 MMI->BeginFunction(MF);
1933
1934 // Assumes in correct section after the entry point.
1935 EmitLabel("func_begin", ++SubprogramCount);
1936
1937 // Emit label for the implicitly defined dbg.stoppoint at the start of the
1938 // function.
Devang Pateleda31212009-10-08 18:48:03 +00001939#ifdef ATTACH_DEBUG_INFO_TO_AN_INSN
Devang Patelac1ceb32009-10-09 22:42:28 +00001940 DebugLoc FDL = MF->getDefaultDebugLoc();
1941 if (!FDL.isUnknown()) {
1942 DebugLocTuple DLT = MF->getDebugLocTuple(FDL);
1943 unsigned LabelID = 0;
Devang Patel6ef75172009-10-12 23:11:24 +00001944 DISubprogram SP = getDISubprogram(DLT.CompileUnit);
Devang Patelac1ceb32009-10-09 22:42:28 +00001945 if (!SP.isNull())
1946 LabelID = RecordSourceLine(SP.getLineNumber(), 0, DLT.CompileUnit);
1947 else
1948 LabelID = RecordSourceLine(DLT.Line, DLT.Col, DLT.CompileUnit);
1949 Asm->printLabel(LabelID);
1950 O << '\n';
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001951 }
Devang Patelac1ceb32009-10-09 22:42:28 +00001952#else
1953 DebugLoc FDL = MF->getDefaultDebugLoc();
1954 if (!FDL.isUnknown()) {
1955 DebugLocTuple DLT = MF->getDebugLocTuple(FDL);
1956 unsigned LabelID = RecordSourceLine(DLT.Line, DLT.Col, DLT.CompileUnit);
1957 Asm->printLabel(LabelID);
1958 O << '\n';
1959 }
1960#endif
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001961 if (TimePassesIsEnabled)
1962 DebugTimer->stopTimer();
1963}
1964
1965/// EndFunction - Gather and emit post-function debug information.
1966///
1967void DwarfDebug::EndFunction(MachineFunction *MF) {
1968 if (!ShouldEmitDwarfDebug()) return;
1969
1970 if (TimePassesIsEnabled)
1971 DebugTimer->startTimer();
1972
Devang Patelac1ceb32009-10-09 22:42:28 +00001973#ifdef ATTACH_DEBUG_INFO_TO_AN_INSN
1974 if (DbgScopeMap.empty())
1975 return;
1976#endif
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001977 // Define end label for subprogram.
1978 EmitLabel("func_end", SubprogramCount);
1979
1980 // Get function line info.
1981 if (!Lines.empty()) {
1982 // Get section line info.
Chris Lattner290c2f52009-08-03 23:20:21 +00001983 unsigned ID = SectionMap.insert(Asm->getCurrentSection());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001984 if (SectionSourceLines.size() < ID) SectionSourceLines.resize(ID);
1985 std::vector<SrcLineInfo> &SectionLineInfos = SectionSourceLines[ID-1];
1986 // Append the function info to section info.
1987 SectionLineInfos.insert(SectionLineInfos.end(),
1988 Lines.begin(), Lines.end());
1989 }
1990
1991 // Construct the DbgScope for abstract instances.
1992 for (SmallVector<DbgScope *, 32>::iterator
1993 I = AbstractInstanceRootList.begin(),
1994 E = AbstractInstanceRootList.end(); I != E; ++I)
Bill Wendling17956162009-05-20 23:28:48 +00001995 ConstructFunctionDbgScope(*I);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001996
1997 // Construct scopes for subprogram.
1998 if (FunctionDbgScope)
1999 ConstructFunctionDbgScope(FunctionDbgScope);
2000 else
2001 // FIXME: This is wrong. We are essentially getting past a problem with
2002 // debug information not being able to handle unreachable blocks that have
2003 // debug information in them. In particular, those unreachable blocks that
2004 // have "region end" info in them. That situation results in the "root
2005 // scope" not being created. If that's the case, then emit a "default"
2006 // scope, i.e., one that encompasses the whole function. This isn't
2007 // desirable. And a better way of handling this (and all of the debugging
2008 // information) needs to be explored.
2009 ConstructDefaultDbgScope(MF);
2010
2011 DebugFrames.push_back(FunctionDebugFrameInfo(SubprogramCount,
2012 MMI->getFrameMoves()));
2013
2014 // Clear debug info
2015 if (FunctionDbgScope) {
2016 delete FunctionDbgScope;
2017 DbgScopeMap.clear();
Devang Patelaf9e8472009-10-01 20:31:14 +00002018 DbgScopeBeginMap.clear();
2019 DbgScopeEndMap.clear();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002020 DbgAbstractScopeMap.clear();
2021 DbgConcreteScopeMap.clear();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002022 FunctionDbgScope = NULL;
2023 LexicalScopeStack.clear();
2024 AbstractInstanceRootList.clear();
Devang Patel9217f792009-06-12 19:24:05 +00002025 AbstractInstanceRootMap.clear();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002026 }
2027
2028 Lines.clear();
2029
2030 if (TimePassesIsEnabled)
2031 DebugTimer->stopTimer();
2032}
2033
2034/// RecordSourceLine - Records location information and associates it with a
2035/// label. Returns a unique label ID used to generate a label and provide
2036/// correspondence to the source line list.
Devang Patel3d910832009-09-30 22:51:28 +00002037unsigned DwarfDebug::RecordSourceLine(unsigned Line, unsigned Col,
Devang Patelf84548d2009-10-05 18:03:19 +00002038 MDNode *S) {
Devang Patele4b27562009-08-28 23:24:31 +00002039 if (!MMI)
2040 return 0;
2041
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002042 if (TimePassesIsEnabled)
2043 DebugTimer->startTimer();
2044
Devang Patelf84548d2009-10-05 18:03:19 +00002045 const char *Dir = NULL;
2046 const char *Fn = NULL;
2047
2048 DIDescriptor Scope(S);
2049 if (Scope.isCompileUnit()) {
2050 DICompileUnit CU(S);
2051 Dir = CU.getDirectory();
2052 Fn = CU.getFilename();
2053 } else if (Scope.isSubprogram()) {
2054 DISubprogram SP(S);
2055 Dir = SP.getDirectory();
2056 Fn = SP.getFilename();
2057 } else if (Scope.isLexicalBlock()) {
2058 DILexicalBlock DB(S);
2059 Dir = DB.getDirectory();
2060 Fn = DB.getFilename();
2061 } else
2062 assert (0 && "Unexpected scope info");
2063
2064 unsigned Src = GetOrCreateSourceID(Dir, Fn);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002065 unsigned ID = MMI->NextLabelID();
2066 Lines.push_back(SrcLineInfo(Line, Col, Src, ID));
2067
2068 if (TimePassesIsEnabled)
2069 DebugTimer->stopTimer();
2070
2071 return ID;
2072}
2073
2074/// getOrCreateSourceID - Public version of GetOrCreateSourceID. This can be
2075/// timed. Look up the source id with the given directory and source file
2076/// names. If none currently exists, create a new id and insert it in the
2077/// SourceIds map. This can update DirectoryNames and SourceFileNames maps as
2078/// well.
2079unsigned DwarfDebug::getOrCreateSourceID(const std::string &DirName,
2080 const std::string &FileName) {
2081 if (TimePassesIsEnabled)
2082 DebugTimer->startTimer();
2083
Devang Patel5ccdd102009-09-29 18:40:58 +00002084 unsigned SrcId = GetOrCreateSourceID(DirName.c_str(), FileName.c_str());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002085
2086 if (TimePassesIsEnabled)
2087 DebugTimer->stopTimer();
2088
2089 return SrcId;
2090}
2091
2092/// RecordRegionStart - Indicate the start of a region.
Devang Patele4b27562009-08-28 23:24:31 +00002093unsigned DwarfDebug::RecordRegionStart(MDNode *N) {
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002094 if (TimePassesIsEnabled)
2095 DebugTimer->startTimer();
2096
Devang Patele4b27562009-08-28 23:24:31 +00002097 DbgScope *Scope = getOrCreateScope(N);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002098 unsigned ID = MMI->NextLabelID();
2099 if (!Scope->getStartLabelID()) Scope->setStartLabelID(ID);
2100 LexicalScopeStack.push_back(Scope);
2101
2102 if (TimePassesIsEnabled)
2103 DebugTimer->stopTimer();
2104
2105 return ID;
2106}
2107
2108/// RecordRegionEnd - Indicate the end of a region.
Devang Patele4b27562009-08-28 23:24:31 +00002109unsigned DwarfDebug::RecordRegionEnd(MDNode *N) {
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002110 if (TimePassesIsEnabled)
2111 DebugTimer->startTimer();
2112
Devang Patele4b27562009-08-28 23:24:31 +00002113 DbgScope *Scope = getOrCreateScope(N);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002114 unsigned ID = MMI->NextLabelID();
2115 Scope->setEndLabelID(ID);
Devang Pateldaf9e022009-06-13 02:16:18 +00002116 // FIXME : region.end() may not be in the last basic block.
2117 // For now, do not pop last lexical scope because next basic
2118 // block may start new inlined function's body.
2119 unsigned LSSize = LexicalScopeStack.size();
2120 if (LSSize != 0 && LSSize != 1)
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002121 LexicalScopeStack.pop_back();
2122
2123 if (TimePassesIsEnabled)
2124 DebugTimer->stopTimer();
2125
2126 return ID;
2127}
2128
2129/// RecordVariable - Indicate the declaration of a local variable.
Devang Patele4b27562009-08-28 23:24:31 +00002130void DwarfDebug::RecordVariable(MDNode *N, unsigned FrameIndex) {
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002131 if (TimePassesIsEnabled)
2132 DebugTimer->startTimer();
2133
Devang Patele4b27562009-08-28 23:24:31 +00002134 DIDescriptor Desc(N);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002135 DbgScope *Scope = NULL;
2136 bool InlinedFnVar = false;
2137
Devang Patele4b27562009-08-28 23:24:31 +00002138 if (Desc.getTag() == dwarf::DW_TAG_variable)
2139 Scope = getOrCreateScope(DIGlobalVariable(N).getContext().getNode());
2140 else {
Devang Patel24f20e02009-08-22 17:12:53 +00002141 bool InlinedVar = false;
Devang Patele4b27562009-08-28 23:24:31 +00002142 MDNode *Context = DIVariable(N).getContext().getNode();
2143 DISubprogram SP(Context);
Devang Patel24f20e02009-08-22 17:12:53 +00002144 if (!SP.isNull()) {
2145 // SP is inserted into DbgAbstractScopeMap when inlined function
2146 // start was recorded by RecordInlineFnStart.
Devang Patele4b27562009-08-28 23:24:31 +00002147 DenseMap<MDNode *, DbgScope *>::iterator
2148 I = DbgAbstractScopeMap.find(SP.getNode());
Devang Patel24f20e02009-08-22 17:12:53 +00002149 if (I != DbgAbstractScopeMap.end()) {
2150 InlinedVar = true;
2151 Scope = I->second;
2152 }
2153 }
Daniel Dunbarf612ff62009-09-19 20:40:05 +00002154 if (!InlinedVar)
Devang Patele4b27562009-08-28 23:24:31 +00002155 Scope = getOrCreateScope(Context);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002156 }
2157
2158 assert(Scope && "Unable to find the variable's scope");
Devang Patele4b27562009-08-28 23:24:31 +00002159 DbgVariable *DV = new DbgVariable(DIVariable(N), FrameIndex, InlinedFnVar);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002160 Scope->AddVariable(DV);
2161
2162 if (TimePassesIsEnabled)
2163 DebugTimer->stopTimer();
2164}
2165
2166//// RecordInlinedFnStart - Indicate the start of inlined subroutine.
2167unsigned DwarfDebug::RecordInlinedFnStart(DISubprogram &SP, DICompileUnit CU,
2168 unsigned Line, unsigned Col) {
2169 unsigned LabelID = MMI->NextLabelID();
2170
Chris Lattner33adcfb2009-08-22 21:43:10 +00002171 if (!MAI->doesDwarfUsesInlineInfoSection())
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002172 return LabelID;
2173
2174 if (TimePassesIsEnabled)
2175 DebugTimer->startTimer();
2176
Devang Patele4b27562009-08-28 23:24:31 +00002177 MDNode *Node = SP.getNode();
2178 DenseMap<const MDNode *, DbgScope *>::iterator
2179 II = AbstractInstanceRootMap.find(Node);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002180
2181 if (II == AbstractInstanceRootMap.end()) {
2182 // Create an abstract instance entry for this inlined function if it doesn't
2183 // already exist.
Devang Patele4b27562009-08-28 23:24:31 +00002184 DbgScope *Scope = new DbgScope(NULL, DIDescriptor(Node));
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002185
2186 // Get the compile unit context.
Devang Patele4b27562009-08-28 23:24:31 +00002187 DIE *SPDie = ModuleCU->getDieMapSlotFor(Node);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002188 if (!SPDie)
Devang Patel1dbc7712009-06-29 20:45:18 +00002189 SPDie = CreateSubprogramDIE(ModuleCU, SP, false, true);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002190
2191 // Mark as being inlined. This makes this subprogram entry an abstract
2192 // instance root.
2193 // FIXME: Our debugger doesn't care about the value of DW_AT_inline, only
2194 // that it's defined. That probably won't change in the future. However,
2195 // this could be more elegant.
2196 AddUInt(SPDie, dwarf::DW_AT_inline, 0, dwarf::DW_INL_declared_not_inlined);
2197
2198 // Keep track of the abstract scope for this function.
Devang Patele4b27562009-08-28 23:24:31 +00002199 DbgAbstractScopeMap[Node] = Scope;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002200
Devang Patele4b27562009-08-28 23:24:31 +00002201 AbstractInstanceRootMap[Node] = Scope;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002202 AbstractInstanceRootList.push_back(Scope);
2203 }
2204
2205 // Create a concrete inlined instance for this inlined function.
Devang Patele4b27562009-08-28 23:24:31 +00002206 DbgConcreteScope *ConcreteScope = new DbgConcreteScope(DIDescriptor(Node));
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002207 DIE *ScopeDie = new DIE(dwarf::DW_TAG_inlined_subroutine);
Devang Patel1dbc7712009-06-29 20:45:18 +00002208 ScopeDie->setAbstractCompileUnit(ModuleCU);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002209
Devang Patele4b27562009-08-28 23:24:31 +00002210 DIE *Origin = ModuleCU->getDieMapSlotFor(Node);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002211 AddDIEEntry(ScopeDie, dwarf::DW_AT_abstract_origin,
2212 dwarf::DW_FORM_ref4, Origin);
Devang Patel1dbc7712009-06-29 20:45:18 +00002213 AddUInt(ScopeDie, dwarf::DW_AT_call_file, 0, ModuleCU->getID());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002214 AddUInt(ScopeDie, dwarf::DW_AT_call_line, 0, Line);
2215 AddUInt(ScopeDie, dwarf::DW_AT_call_column, 0, Col);
2216
2217 ConcreteScope->setDie(ScopeDie);
2218 ConcreteScope->setStartLabelID(LabelID);
2219 MMI->RecordUsedDbgLabel(LabelID);
2220
2221 LexicalScopeStack.back()->AddConcreteInst(ConcreteScope);
2222
2223 // Keep track of the concrete scope that's inlined into this function.
Devang Patele4b27562009-08-28 23:24:31 +00002224 DenseMap<MDNode *, SmallVector<DbgScope *, 8> >::iterator
2225 SI = DbgConcreteScopeMap.find(Node);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002226
2227 if (SI == DbgConcreteScopeMap.end())
Devang Patele4b27562009-08-28 23:24:31 +00002228 DbgConcreteScopeMap[Node].push_back(ConcreteScope);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002229 else
2230 SI->second.push_back(ConcreteScope);
2231
2232 // Track the start label for this inlined function.
Devang Patele4b27562009-08-28 23:24:31 +00002233 DenseMap<MDNode *, SmallVector<unsigned, 4> >::iterator
2234 I = InlineInfo.find(Node);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002235
2236 if (I == InlineInfo.end())
Devang Patele4b27562009-08-28 23:24:31 +00002237 InlineInfo[Node].push_back(LabelID);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002238 else
2239 I->second.push_back(LabelID);
2240
2241 if (TimePassesIsEnabled)
2242 DebugTimer->stopTimer();
2243
2244 return LabelID;
2245}
2246
2247/// RecordInlinedFnEnd - Indicate the end of inlined subroutine.
2248unsigned DwarfDebug::RecordInlinedFnEnd(DISubprogram &SP) {
Chris Lattner33adcfb2009-08-22 21:43:10 +00002249 if (!MAI->doesDwarfUsesInlineInfoSection())
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002250 return 0;
2251
2252 if (TimePassesIsEnabled)
2253 DebugTimer->startTimer();
2254
Devang Patele4b27562009-08-28 23:24:31 +00002255 MDNode *Node = SP.getNode();
2256 DenseMap<MDNode *, SmallVector<DbgScope *, 8> >::iterator
2257 I = DbgConcreteScopeMap.find(Node);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002258
2259 if (I == DbgConcreteScopeMap.end()) {
2260 // FIXME: Can this situation actually happen? And if so, should it?
2261 if (TimePassesIsEnabled)
2262 DebugTimer->stopTimer();
2263
2264 return 0;
2265 }
2266
2267 SmallVector<DbgScope *, 8> &Scopes = I->second;
Devang Patel11a407f2009-06-15 21:45:50 +00002268 if (Scopes.empty()) {
2269 // Returned ID is 0 if this is unbalanced "end of inlined
2270 // scope". This could happen if optimizer eats dbg intrinsics
2271 // or "beginning of inlined scope" is not recoginized due to
2272 // missing location info. In such cases, ignore this region.end.
2273 return 0;
2274 }
2275
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002276 DbgScope *Scope = Scopes.back(); Scopes.pop_back();
2277 unsigned ID = MMI->NextLabelID();
2278 MMI->RecordUsedDbgLabel(ID);
2279 Scope->setEndLabelID(ID);
2280
2281 if (TimePassesIsEnabled)
2282 DebugTimer->stopTimer();
2283
2284 return ID;
2285}
2286
Bill Wendling829e67b2009-05-20 23:22:40 +00002287//===----------------------------------------------------------------------===//
2288// Emit Methods
2289//===----------------------------------------------------------------------===//
2290
Bill Wendling94d04b82009-05-20 23:21:38 +00002291/// SizeAndOffsetDie - Compute the size and offset of a DIE.
2292///
2293unsigned DwarfDebug::SizeAndOffsetDie(DIE *Die, unsigned Offset, bool Last) {
2294 // Get the children.
2295 const std::vector<DIE *> &Children = Die->getChildren();
2296
2297 // If not last sibling and has children then add sibling offset attribute.
2298 if (!Last && !Children.empty()) Die->AddSiblingOffset();
2299
2300 // Record the abbreviation.
2301 AssignAbbrevNumber(Die->getAbbrev());
2302
2303 // Get the abbreviation for this DIE.
2304 unsigned AbbrevNumber = Die->getAbbrevNumber();
2305 const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2306
2307 // Set DIE offset
2308 Die->setOffset(Offset);
2309
2310 // Start the size with the size of abbreviation code.
Chris Lattneraf76e592009-08-22 20:48:53 +00002311 Offset += MCAsmInfo::getULEB128Size(AbbrevNumber);
Bill Wendling94d04b82009-05-20 23:21:38 +00002312
2313 const SmallVector<DIEValue*, 32> &Values = Die->getValues();
2314 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
2315
2316 // Size the DIE attribute values.
2317 for (unsigned i = 0, N = Values.size(); i < N; ++i)
2318 // Size attribute value.
2319 Offset += Values[i]->SizeOf(TD, AbbrevData[i].getForm());
2320
2321 // Size the DIE children if any.
2322 if (!Children.empty()) {
2323 assert(Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes &&
2324 "Children flag not set");
2325
2326 for (unsigned j = 0, M = Children.size(); j < M; ++j)
2327 Offset = SizeAndOffsetDie(Children[j], Offset, (j + 1) == M);
2328
2329 // End of children marker.
2330 Offset += sizeof(int8_t);
2331 }
2332
2333 Die->setSize(Offset - Die->getOffset());
2334 return Offset;
2335}
2336
2337/// SizeAndOffsets - Compute the size and offset of all the DIEs.
2338///
2339void DwarfDebug::SizeAndOffsets() {
2340 // Compute size of compile unit header.
2341 static unsigned Offset =
2342 sizeof(int32_t) + // Length of Compilation Unit Info
2343 sizeof(int16_t) + // DWARF version number
2344 sizeof(int32_t) + // Offset Into Abbrev. Section
2345 sizeof(int8_t); // Pointer Size (in bytes)
2346
Devang Patel1dbc7712009-06-29 20:45:18 +00002347 SizeAndOffsetDie(ModuleCU->getDie(), Offset, true);
2348 CompileUnitOffsets[ModuleCU] = 0;
Bill Wendling94d04b82009-05-20 23:21:38 +00002349}
2350
2351/// EmitInitial - Emit initial Dwarf declarations. This is necessary for cc
2352/// tools to recognize the object file contains Dwarf information.
2353void DwarfDebug::EmitInitial() {
2354 // Check to see if we already emitted intial headers.
2355 if (didInitial) return;
2356 didInitial = true;
2357
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002358 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
Daniel Dunbarf612ff62009-09-19 20:40:05 +00002359
Bill Wendling94d04b82009-05-20 23:21:38 +00002360 // Dwarf sections base addresses.
Chris Lattner33adcfb2009-08-22 21:43:10 +00002361 if (MAI->doesDwarfRequireFrameSection()) {
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002362 Asm->OutStreamer.SwitchSection(TLOF.getDwarfFrameSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002363 EmitLabel("section_debug_frame", 0);
2364 }
2365
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002366 Asm->OutStreamer.SwitchSection(TLOF.getDwarfInfoSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002367 EmitLabel("section_info", 0);
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002368 Asm->OutStreamer.SwitchSection(TLOF.getDwarfAbbrevSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002369 EmitLabel("section_abbrev", 0);
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002370 Asm->OutStreamer.SwitchSection(TLOF.getDwarfARangesSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002371 EmitLabel("section_aranges", 0);
2372
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002373 if (const MCSection *LineInfoDirective = TLOF.getDwarfMacroInfoSection()) {
2374 Asm->OutStreamer.SwitchSection(LineInfoDirective);
Bill Wendling94d04b82009-05-20 23:21:38 +00002375 EmitLabel("section_macinfo", 0);
2376 }
2377
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002378 Asm->OutStreamer.SwitchSection(TLOF.getDwarfLineSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002379 EmitLabel("section_line", 0);
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002380 Asm->OutStreamer.SwitchSection(TLOF.getDwarfLocSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002381 EmitLabel("section_loc", 0);
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002382 Asm->OutStreamer.SwitchSection(TLOF.getDwarfPubNamesSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002383 EmitLabel("section_pubnames", 0);
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002384 Asm->OutStreamer.SwitchSection(TLOF.getDwarfStrSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002385 EmitLabel("section_str", 0);
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002386 Asm->OutStreamer.SwitchSection(TLOF.getDwarfRangesSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002387 EmitLabel("section_ranges", 0);
2388
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002389 Asm->OutStreamer.SwitchSection(TLOF.getTextSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002390 EmitLabel("text_begin", 0);
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002391 Asm->OutStreamer.SwitchSection(TLOF.getDataSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002392 EmitLabel("data_begin", 0);
2393}
2394
2395/// EmitDIE - Recusively Emits a debug information entry.
2396///
2397void DwarfDebug::EmitDIE(DIE *Die) {
2398 // Get the abbreviation for this DIE.
2399 unsigned AbbrevNumber = Die->getAbbrevNumber();
2400 const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2401
2402 Asm->EOL();
2403
2404 // Emit the code (index) for the abbreviation.
2405 Asm->EmitULEB128Bytes(AbbrevNumber);
2406
2407 if (Asm->isVerbose())
2408 Asm->EOL(std::string("Abbrev [" +
2409 utostr(AbbrevNumber) +
2410 "] 0x" + utohexstr(Die->getOffset()) +
2411 ":0x" + utohexstr(Die->getSize()) + " " +
2412 dwarf::TagString(Abbrev->getTag())));
2413 else
2414 Asm->EOL();
2415
2416 SmallVector<DIEValue*, 32> &Values = Die->getValues();
2417 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
2418
2419 // Emit the DIE attribute values.
2420 for (unsigned i = 0, N = Values.size(); i < N; ++i) {
2421 unsigned Attr = AbbrevData[i].getAttribute();
2422 unsigned Form = AbbrevData[i].getForm();
2423 assert(Form && "Too many attributes for DIE (check abbreviation)");
2424
2425 switch (Attr) {
2426 case dwarf::DW_AT_sibling:
2427 Asm->EmitInt32(Die->SiblingOffset());
2428 break;
2429 case dwarf::DW_AT_abstract_origin: {
2430 DIEEntry *E = cast<DIEEntry>(Values[i]);
2431 DIE *Origin = E->getEntry();
2432 unsigned Addr =
2433 CompileUnitOffsets[Die->getAbstractCompileUnit()] +
2434 Origin->getOffset();
2435
2436 Asm->EmitInt32(Addr);
2437 break;
2438 }
2439 default:
2440 // Emit an attribute using the defined form.
2441 Values[i]->EmitValue(this, Form);
2442 break;
2443 }
2444
2445 Asm->EOL(dwarf::AttributeString(Attr));
2446 }
2447
2448 // Emit the DIE children if any.
2449 if (Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes) {
2450 const std::vector<DIE *> &Children = Die->getChildren();
2451
2452 for (unsigned j = 0, M = Children.size(); j < M; ++j)
2453 EmitDIE(Children[j]);
2454
2455 Asm->EmitInt8(0); Asm->EOL("End Of Children Mark");
2456 }
2457}
2458
2459/// EmitDebugInfo / EmitDebugInfoPerCU - Emit the debug info section.
2460///
2461void DwarfDebug::EmitDebugInfoPerCU(CompileUnit *Unit) {
2462 DIE *Die = Unit->getDie();
2463
2464 // Emit the compile units header.
2465 EmitLabel("info_begin", Unit->getID());
2466
2467 // Emit size of content not including length itself
2468 unsigned ContentSize = Die->getSize() +
2469 sizeof(int16_t) + // DWARF version number
2470 sizeof(int32_t) + // Offset Into Abbrev. Section
2471 sizeof(int8_t) + // Pointer Size (in bytes)
2472 sizeof(int32_t); // FIXME - extra pad for gdb bug.
2473
2474 Asm->EmitInt32(ContentSize); Asm->EOL("Length of Compilation Unit Info");
2475 Asm->EmitInt16(dwarf::DWARF_VERSION); Asm->EOL("DWARF version number");
2476 EmitSectionOffset("abbrev_begin", "section_abbrev", 0, 0, true, false);
2477 Asm->EOL("Offset Into Abbrev. Section");
2478 Asm->EmitInt8(TD->getPointerSize()); Asm->EOL("Address Size (in bytes)");
2479
2480 EmitDIE(Die);
2481 // FIXME - extra padding for gdb bug.
2482 Asm->EmitInt8(0); Asm->EOL("Extra Pad For GDB");
2483 Asm->EmitInt8(0); Asm->EOL("Extra Pad For GDB");
2484 Asm->EmitInt8(0); Asm->EOL("Extra Pad For GDB");
2485 Asm->EmitInt8(0); Asm->EOL("Extra Pad For GDB");
2486 EmitLabel("info_end", Unit->getID());
2487
2488 Asm->EOL();
2489}
2490
2491void DwarfDebug::EmitDebugInfo() {
2492 // Start debug info section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002493 Asm->OutStreamer.SwitchSection(
2494 Asm->getObjFileLowering().getDwarfInfoSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002495
Devang Patel1dbc7712009-06-29 20:45:18 +00002496 EmitDebugInfoPerCU(ModuleCU);
Bill Wendling94d04b82009-05-20 23:21:38 +00002497}
2498
2499/// EmitAbbreviations - Emit the abbreviation section.
2500///
2501void DwarfDebug::EmitAbbreviations() const {
2502 // Check to see if it is worth the effort.
2503 if (!Abbreviations.empty()) {
2504 // Start the debug abbrev section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002505 Asm->OutStreamer.SwitchSection(
2506 Asm->getObjFileLowering().getDwarfAbbrevSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002507
2508 EmitLabel("abbrev_begin", 0);
2509
2510 // For each abbrevation.
2511 for (unsigned i = 0, N = Abbreviations.size(); i < N; ++i) {
2512 // Get abbreviation data
2513 const DIEAbbrev *Abbrev = Abbreviations[i];
2514
2515 // Emit the abbrevations code (base 1 index.)
2516 Asm->EmitULEB128Bytes(Abbrev->getNumber());
2517 Asm->EOL("Abbreviation Code");
2518
2519 // Emit the abbreviations data.
2520 Abbrev->Emit(Asm);
2521
2522 Asm->EOL();
2523 }
2524
2525 // Mark end of abbreviations.
2526 Asm->EmitULEB128Bytes(0); Asm->EOL("EOM(3)");
2527
2528 EmitLabel("abbrev_end", 0);
2529 Asm->EOL();
2530 }
2531}
2532
2533/// EmitEndOfLineMatrix - Emit the last address of the section and the end of
2534/// the line matrix.
2535///
2536void DwarfDebug::EmitEndOfLineMatrix(unsigned SectionEnd) {
2537 // Define last address of section.
2538 Asm->EmitInt8(0); Asm->EOL("Extended Op");
2539 Asm->EmitInt8(TD->getPointerSize() + 1); Asm->EOL("Op size");
2540 Asm->EmitInt8(dwarf::DW_LNE_set_address); Asm->EOL("DW_LNE_set_address");
2541 EmitReference("section_end", SectionEnd); Asm->EOL("Section end label");
2542
2543 // Mark end of matrix.
2544 Asm->EmitInt8(0); Asm->EOL("DW_LNE_end_sequence");
2545 Asm->EmitULEB128Bytes(1); Asm->EOL();
2546 Asm->EmitInt8(1); Asm->EOL();
2547}
2548
2549/// EmitDebugLines - Emit source line information.
2550///
2551void DwarfDebug::EmitDebugLines() {
2552 // If the target is using .loc/.file, the assembler will be emitting the
2553 // .debug_line table automatically.
Chris Lattner33adcfb2009-08-22 21:43:10 +00002554 if (MAI->hasDotLocAndDotFile())
Bill Wendling94d04b82009-05-20 23:21:38 +00002555 return;
2556
2557 // Minimum line delta, thus ranging from -10..(255-10).
2558 const int MinLineDelta = -(dwarf::DW_LNS_fixed_advance_pc + 1);
2559 // Maximum line delta, thus ranging from -10..(255-10).
2560 const int MaxLineDelta = 255 + MinLineDelta;
2561
2562 // Start the dwarf line section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002563 Asm->OutStreamer.SwitchSection(
2564 Asm->getObjFileLowering().getDwarfLineSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002565
2566 // Construct the section header.
2567 EmitDifference("line_end", 0, "line_begin", 0, true);
2568 Asm->EOL("Length of Source Line Info");
2569 EmitLabel("line_begin", 0);
2570
2571 Asm->EmitInt16(dwarf::DWARF_VERSION); Asm->EOL("DWARF version number");
2572
2573 EmitDifference("line_prolog_end", 0, "line_prolog_begin", 0, true);
2574 Asm->EOL("Prolog Length");
2575 EmitLabel("line_prolog_begin", 0);
2576
2577 Asm->EmitInt8(1); Asm->EOL("Minimum Instruction Length");
2578
2579 Asm->EmitInt8(1); Asm->EOL("Default is_stmt_start flag");
2580
2581 Asm->EmitInt8(MinLineDelta); Asm->EOL("Line Base Value (Special Opcodes)");
2582
2583 Asm->EmitInt8(MaxLineDelta); Asm->EOL("Line Range Value (Special Opcodes)");
2584
2585 Asm->EmitInt8(-MinLineDelta); Asm->EOL("Special Opcode Base");
2586
2587 // Line number standard opcode encodings argument count
2588 Asm->EmitInt8(0); Asm->EOL("DW_LNS_copy arg count");
2589 Asm->EmitInt8(1); Asm->EOL("DW_LNS_advance_pc arg count");
2590 Asm->EmitInt8(1); Asm->EOL("DW_LNS_advance_line arg count");
2591 Asm->EmitInt8(1); Asm->EOL("DW_LNS_set_file arg count");
2592 Asm->EmitInt8(1); Asm->EOL("DW_LNS_set_column arg count");
2593 Asm->EmitInt8(0); Asm->EOL("DW_LNS_negate_stmt arg count");
2594 Asm->EmitInt8(0); Asm->EOL("DW_LNS_set_basic_block arg count");
2595 Asm->EmitInt8(0); Asm->EOL("DW_LNS_const_add_pc arg count");
2596 Asm->EmitInt8(1); Asm->EOL("DW_LNS_fixed_advance_pc arg count");
2597
2598 // Emit directories.
2599 for (unsigned DI = 1, DE = getNumSourceDirectories()+1; DI != DE; ++DI) {
2600 Asm->EmitString(getSourceDirectoryName(DI));
2601 Asm->EOL("Directory");
2602 }
2603
2604 Asm->EmitInt8(0); Asm->EOL("End of directories");
2605
2606 // Emit files.
2607 for (unsigned SI = 1, SE = getNumSourceIds()+1; SI != SE; ++SI) {
2608 // Remember source id starts at 1.
2609 std::pair<unsigned, unsigned> Id = getSourceDirectoryAndFileIds(SI);
2610 Asm->EmitString(getSourceFileName(Id.second));
2611 Asm->EOL("Source");
2612 Asm->EmitULEB128Bytes(Id.first);
2613 Asm->EOL("Directory #");
2614 Asm->EmitULEB128Bytes(0);
2615 Asm->EOL("Mod date");
2616 Asm->EmitULEB128Bytes(0);
2617 Asm->EOL("File size");
2618 }
2619
2620 Asm->EmitInt8(0); Asm->EOL("End of files");
2621
2622 EmitLabel("line_prolog_end", 0);
2623
2624 // A sequence for each text section.
2625 unsigned SecSrcLinesSize = SectionSourceLines.size();
2626
2627 for (unsigned j = 0; j < SecSrcLinesSize; ++j) {
2628 // Isolate current sections line info.
2629 const std::vector<SrcLineInfo> &LineInfos = SectionSourceLines[j];
2630
Chris Lattner93b6db32009-08-08 23:39:42 +00002631 /*if (Asm->isVerbose()) {
Chris Lattnera87dea42009-07-31 18:48:30 +00002632 const MCSection *S = SectionMap[j + 1];
Chris Lattner33adcfb2009-08-22 21:43:10 +00002633 O << '\t' << MAI->getCommentString() << " Section"
Bill Wendling94d04b82009-05-20 23:21:38 +00002634 << S->getName() << '\n';
Chris Lattner93b6db32009-08-08 23:39:42 +00002635 }*/
2636 Asm->EOL();
Bill Wendling94d04b82009-05-20 23:21:38 +00002637
2638 // Dwarf assumes we start with first line of first source file.
2639 unsigned Source = 1;
2640 unsigned Line = 1;
2641
2642 // Construct rows of the address, source, line, column matrix.
2643 for (unsigned i = 0, N = LineInfos.size(); i < N; ++i) {
2644 const SrcLineInfo &LineInfo = LineInfos[i];
2645 unsigned LabelID = MMI->MappedLabel(LineInfo.getLabelID());
2646 if (!LabelID) continue;
2647
Caroline Ticec6f9d622009-09-11 18:25:54 +00002648 if (LineInfo.getLine() == 0) continue;
2649
Bill Wendling94d04b82009-05-20 23:21:38 +00002650 if (!Asm->isVerbose())
2651 Asm->EOL();
2652 else {
2653 std::pair<unsigned, unsigned> SourceID =
2654 getSourceDirectoryAndFileIds(LineInfo.getSourceID());
Chris Lattner33adcfb2009-08-22 21:43:10 +00002655 O << '\t' << MAI->getCommentString() << ' '
Bill Wendling94d04b82009-05-20 23:21:38 +00002656 << getSourceDirectoryName(SourceID.first) << ' '
2657 << getSourceFileName(SourceID.second)
2658 <<" :" << utostr_32(LineInfo.getLine()) << '\n';
2659 }
2660
2661 // Define the line address.
2662 Asm->EmitInt8(0); Asm->EOL("Extended Op");
2663 Asm->EmitInt8(TD->getPointerSize() + 1); Asm->EOL("Op size");
2664 Asm->EmitInt8(dwarf::DW_LNE_set_address); Asm->EOL("DW_LNE_set_address");
2665 EmitReference("label", LabelID); Asm->EOL("Location label");
2666
2667 // If change of source, then switch to the new source.
2668 if (Source != LineInfo.getSourceID()) {
2669 Source = LineInfo.getSourceID();
2670 Asm->EmitInt8(dwarf::DW_LNS_set_file); Asm->EOL("DW_LNS_set_file");
2671 Asm->EmitULEB128Bytes(Source); Asm->EOL("New Source");
2672 }
2673
2674 // If change of line.
2675 if (Line != LineInfo.getLine()) {
2676 // Determine offset.
2677 int Offset = LineInfo.getLine() - Line;
2678 int Delta = Offset - MinLineDelta;
2679
2680 // Update line.
2681 Line = LineInfo.getLine();
2682
2683 // If delta is small enough and in range...
2684 if (Delta >= 0 && Delta < (MaxLineDelta - 1)) {
2685 // ... then use fast opcode.
2686 Asm->EmitInt8(Delta - MinLineDelta); Asm->EOL("Line Delta");
2687 } else {
2688 // ... otherwise use long hand.
2689 Asm->EmitInt8(dwarf::DW_LNS_advance_line);
2690 Asm->EOL("DW_LNS_advance_line");
2691 Asm->EmitSLEB128Bytes(Offset); Asm->EOL("Line Offset");
2692 Asm->EmitInt8(dwarf::DW_LNS_copy); Asm->EOL("DW_LNS_copy");
2693 }
2694 } else {
2695 // Copy the previous row (different address or source)
2696 Asm->EmitInt8(dwarf::DW_LNS_copy); Asm->EOL("DW_LNS_copy");
2697 }
2698 }
2699
2700 EmitEndOfLineMatrix(j + 1);
2701 }
2702
2703 if (SecSrcLinesSize == 0)
2704 // Because we're emitting a debug_line section, we still need a line
2705 // table. The linker and friends expect it to exist. If there's nothing to
2706 // put into it, emit an empty table.
2707 EmitEndOfLineMatrix(1);
2708
2709 EmitLabel("line_end", 0);
2710 Asm->EOL();
2711}
2712
2713/// EmitCommonDebugFrame - Emit common frame info into a debug frame section.
2714///
2715void DwarfDebug::EmitCommonDebugFrame() {
Chris Lattner33adcfb2009-08-22 21:43:10 +00002716 if (!MAI->doesDwarfRequireFrameSection())
Bill Wendling94d04b82009-05-20 23:21:38 +00002717 return;
2718
2719 int stackGrowth =
2720 Asm->TM.getFrameInfo()->getStackGrowthDirection() ==
2721 TargetFrameInfo::StackGrowsUp ?
2722 TD->getPointerSize() : -TD->getPointerSize();
2723
2724 // Start the dwarf frame section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002725 Asm->OutStreamer.SwitchSection(
2726 Asm->getObjFileLowering().getDwarfFrameSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002727
2728 EmitLabel("debug_frame_common", 0);
2729 EmitDifference("debug_frame_common_end", 0,
2730 "debug_frame_common_begin", 0, true);
2731 Asm->EOL("Length of Common Information Entry");
2732
2733 EmitLabel("debug_frame_common_begin", 0);
2734 Asm->EmitInt32((int)dwarf::DW_CIE_ID);
2735 Asm->EOL("CIE Identifier Tag");
2736 Asm->EmitInt8(dwarf::DW_CIE_VERSION);
2737 Asm->EOL("CIE Version");
2738 Asm->EmitString("");
2739 Asm->EOL("CIE Augmentation");
2740 Asm->EmitULEB128Bytes(1);
2741 Asm->EOL("CIE Code Alignment Factor");
2742 Asm->EmitSLEB128Bytes(stackGrowth);
2743 Asm->EOL("CIE Data Alignment Factor");
2744 Asm->EmitInt8(RI->getDwarfRegNum(RI->getRARegister(), false));
2745 Asm->EOL("CIE RA Column");
2746
2747 std::vector<MachineMove> Moves;
2748 RI->getInitialFrameState(Moves);
2749
2750 EmitFrameMoves(NULL, 0, Moves, false);
2751
2752 Asm->EmitAlignment(2, 0, 0, false);
2753 EmitLabel("debug_frame_common_end", 0);
2754
2755 Asm->EOL();
2756}
2757
2758/// EmitFunctionDebugFrame - Emit per function frame info into a debug frame
2759/// section.
2760void
2761DwarfDebug::EmitFunctionDebugFrame(const FunctionDebugFrameInfo&DebugFrameInfo){
Chris Lattner33adcfb2009-08-22 21:43:10 +00002762 if (!MAI->doesDwarfRequireFrameSection())
Bill Wendling94d04b82009-05-20 23:21:38 +00002763 return;
2764
2765 // Start the dwarf frame section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002766 Asm->OutStreamer.SwitchSection(
2767 Asm->getObjFileLowering().getDwarfFrameSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002768
2769 EmitDifference("debug_frame_end", DebugFrameInfo.Number,
2770 "debug_frame_begin", DebugFrameInfo.Number, true);
2771 Asm->EOL("Length of Frame Information Entry");
2772
2773 EmitLabel("debug_frame_begin", DebugFrameInfo.Number);
2774
2775 EmitSectionOffset("debug_frame_common", "section_debug_frame",
2776 0, 0, true, false);
2777 Asm->EOL("FDE CIE offset");
2778
2779 EmitReference("func_begin", DebugFrameInfo.Number);
2780 Asm->EOL("FDE initial location");
2781 EmitDifference("func_end", DebugFrameInfo.Number,
2782 "func_begin", DebugFrameInfo.Number);
2783 Asm->EOL("FDE address range");
2784
2785 EmitFrameMoves("func_begin", DebugFrameInfo.Number, DebugFrameInfo.Moves,
2786 false);
2787
2788 Asm->EmitAlignment(2, 0, 0, false);
2789 EmitLabel("debug_frame_end", DebugFrameInfo.Number);
2790
2791 Asm->EOL();
2792}
2793
2794void DwarfDebug::EmitDebugPubNamesPerCU(CompileUnit *Unit) {
2795 EmitDifference("pubnames_end", Unit->getID(),
2796 "pubnames_begin", Unit->getID(), true);
2797 Asm->EOL("Length of Public Names Info");
2798
2799 EmitLabel("pubnames_begin", Unit->getID());
2800
2801 Asm->EmitInt16(dwarf::DWARF_VERSION); Asm->EOL("DWARF Version");
2802
2803 EmitSectionOffset("info_begin", "section_info",
2804 Unit->getID(), 0, true, false);
2805 Asm->EOL("Offset of Compilation Unit Info");
2806
2807 EmitDifference("info_end", Unit->getID(), "info_begin", Unit->getID(),
2808 true);
2809 Asm->EOL("Compilation Unit Length");
2810
2811 StringMap<DIE*> &Globals = Unit->getGlobals();
2812 for (StringMap<DIE*>::const_iterator
2813 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2814 const char *Name = GI->getKeyData();
2815 DIE * Entity = GI->second;
2816
2817 Asm->EmitInt32(Entity->getOffset()); Asm->EOL("DIE offset");
2818 Asm->EmitString(Name, strlen(Name)); Asm->EOL("External Name");
2819 }
2820
2821 Asm->EmitInt32(0); Asm->EOL("End Mark");
2822 EmitLabel("pubnames_end", Unit->getID());
2823
2824 Asm->EOL();
2825}
2826
2827/// EmitDebugPubNames - Emit visible names into a debug pubnames section.
2828///
2829void DwarfDebug::EmitDebugPubNames() {
2830 // Start the dwarf pubnames section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002831 Asm->OutStreamer.SwitchSection(
2832 Asm->getObjFileLowering().getDwarfPubNamesSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002833
Devang Patel1dbc7712009-06-29 20:45:18 +00002834 EmitDebugPubNamesPerCU(ModuleCU);
Bill Wendling94d04b82009-05-20 23:21:38 +00002835}
2836
2837/// EmitDebugStr - Emit visible names into a debug str section.
2838///
2839void DwarfDebug::EmitDebugStr() {
2840 // Check to see if it is worth the effort.
2841 if (!StringPool.empty()) {
2842 // Start the dwarf str section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002843 Asm->OutStreamer.SwitchSection(
2844 Asm->getObjFileLowering().getDwarfStrSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002845
2846 // For each of strings in the string pool.
2847 for (unsigned StringID = 1, N = StringPool.size();
2848 StringID <= N; ++StringID) {
2849 // Emit a label for reference from debug information entries.
2850 EmitLabel("string", StringID);
2851
2852 // Emit the string itself.
2853 const std::string &String = StringPool[StringID];
2854 Asm->EmitString(String); Asm->EOL();
2855 }
2856
2857 Asm->EOL();
2858 }
2859}
2860
2861/// EmitDebugLoc - Emit visible names into a debug loc section.
2862///
2863void DwarfDebug::EmitDebugLoc() {
2864 // Start the dwarf loc section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002865 Asm->OutStreamer.SwitchSection(
2866 Asm->getObjFileLowering().getDwarfLocSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002867 Asm->EOL();
2868}
2869
2870/// EmitDebugARanges - Emit visible names into a debug aranges section.
2871///
2872void DwarfDebug::EmitDebugARanges() {
2873 // Start the dwarf aranges section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002874 Asm->OutStreamer.SwitchSection(
2875 Asm->getObjFileLowering().getDwarfARangesSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002876
2877 // FIXME - Mock up
2878#if 0
2879 CompileUnit *Unit = GetBaseCompileUnit();
2880
2881 // Don't include size of length
2882 Asm->EmitInt32(0x1c); Asm->EOL("Length of Address Ranges Info");
2883
2884 Asm->EmitInt16(dwarf::DWARF_VERSION); Asm->EOL("Dwarf Version");
2885
2886 EmitReference("info_begin", Unit->getID());
2887 Asm->EOL("Offset of Compilation Unit Info");
2888
2889 Asm->EmitInt8(TD->getPointerSize()); Asm->EOL("Size of Address");
2890
2891 Asm->EmitInt8(0); Asm->EOL("Size of Segment Descriptor");
2892
2893 Asm->EmitInt16(0); Asm->EOL("Pad (1)");
2894 Asm->EmitInt16(0); Asm->EOL("Pad (2)");
2895
2896 // Range 1
2897 EmitReference("text_begin", 0); Asm->EOL("Address");
2898 EmitDifference("text_end", 0, "text_begin", 0, true); Asm->EOL("Length");
2899
2900 Asm->EmitInt32(0); Asm->EOL("EOM (1)");
2901 Asm->EmitInt32(0); Asm->EOL("EOM (2)");
2902#endif
2903
2904 Asm->EOL();
2905}
2906
2907/// EmitDebugRanges - Emit visible names into a debug ranges section.
2908///
2909void DwarfDebug::EmitDebugRanges() {
2910 // Start the dwarf ranges section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002911 Asm->OutStreamer.SwitchSection(
2912 Asm->getObjFileLowering().getDwarfRangesSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002913 Asm->EOL();
2914}
2915
2916/// EmitDebugMacInfo - Emit visible names into a debug macinfo section.
2917///
2918void DwarfDebug::EmitDebugMacInfo() {
Daniel Dunbarf612ff62009-09-19 20:40:05 +00002919 if (const MCSection *LineInfo =
Chris Lattner18a4c162009-08-02 07:24:22 +00002920 Asm->getObjFileLowering().getDwarfMacroInfoSection()) {
Bill Wendling94d04b82009-05-20 23:21:38 +00002921 // Start the dwarf macinfo section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002922 Asm->OutStreamer.SwitchSection(LineInfo);
Bill Wendling94d04b82009-05-20 23:21:38 +00002923 Asm->EOL();
2924 }
2925}
2926
2927/// EmitDebugInlineInfo - Emit inline info using following format.
2928/// Section Header:
2929/// 1. length of section
2930/// 2. Dwarf version number
2931/// 3. address size.
2932///
2933/// Entries (one "entry" for each function that was inlined):
2934///
2935/// 1. offset into __debug_str section for MIPS linkage name, if exists;
2936/// otherwise offset into __debug_str for regular function name.
2937/// 2. offset into __debug_str section for regular function name.
2938/// 3. an unsigned LEB128 number indicating the number of distinct inlining
2939/// instances for the function.
2940///
2941/// The rest of the entry consists of a {die_offset, low_pc} pair for each
2942/// inlined instance; the die_offset points to the inlined_subroutine die in the
2943/// __debug_info section, and the low_pc is the starting address for the
2944/// inlining instance.
2945void DwarfDebug::EmitDebugInlineInfo() {
Chris Lattner33adcfb2009-08-22 21:43:10 +00002946 if (!MAI->doesDwarfUsesInlineInfoSection())
Bill Wendling94d04b82009-05-20 23:21:38 +00002947 return;
2948
Devang Patel1dbc7712009-06-29 20:45:18 +00002949 if (!ModuleCU)
Bill Wendling94d04b82009-05-20 23:21:38 +00002950 return;
2951
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002952 Asm->OutStreamer.SwitchSection(
2953 Asm->getObjFileLowering().getDwarfDebugInlineSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002954 Asm->EOL();
2955 EmitDifference("debug_inlined_end", 1,
2956 "debug_inlined_begin", 1, true);
2957 Asm->EOL("Length of Debug Inlined Information Entry");
2958
2959 EmitLabel("debug_inlined_begin", 1);
2960
2961 Asm->EmitInt16(dwarf::DWARF_VERSION); Asm->EOL("Dwarf Version");
2962 Asm->EmitInt8(TD->getPointerSize()); Asm->EOL("Address Size (in bytes)");
2963
Devang Patele4b27562009-08-28 23:24:31 +00002964 for (DenseMap<MDNode *, SmallVector<unsigned, 4> >::iterator
Bill Wendling94d04b82009-05-20 23:21:38 +00002965 I = InlineInfo.begin(), E = InlineInfo.end(); I != E; ++I) {
Devang Patele4b27562009-08-28 23:24:31 +00002966 MDNode *Node = I->first;
Bill Wendling94d04b82009-05-20 23:21:38 +00002967 SmallVector<unsigned, 4> &Labels = I->second;
Devang Patele4b27562009-08-28 23:24:31 +00002968 DISubprogram SP(Node);
Devang Patel5ccdd102009-09-29 18:40:58 +00002969 const char *LName = SP.getLinkageName();
2970 const char *Name = SP.getName();
Bill Wendling94d04b82009-05-20 23:21:38 +00002971
Devang Patel5ccdd102009-09-29 18:40:58 +00002972 if (!LName)
Devang Patel53cb17d2009-07-16 01:01:22 +00002973 Asm->EmitString(Name);
2974 else {
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002975 // Skip special LLVM prefix that is used to inform the asm printer to not
2976 // emit usual symbol prefix before the symbol name. This happens for
2977 // Objective-C symbol names and symbol whose name is replaced using GCC's
2978 // __asm__ attribute.
Devang Patel53cb17d2009-07-16 01:01:22 +00002979 if (LName[0] == 1)
2980 LName = &LName[1];
2981 Asm->EmitString(LName);
2982 }
Bill Wendling94d04b82009-05-20 23:21:38 +00002983 Asm->EOL("MIPS linkage name");
2984
2985 Asm->EmitString(Name); Asm->EOL("Function name");
2986
2987 Asm->EmitULEB128Bytes(Labels.size()); Asm->EOL("Inline count");
2988
2989 for (SmallVector<unsigned, 4>::iterator LI = Labels.begin(),
2990 LE = Labels.end(); LI != LE; ++LI) {
Devang Patele4b27562009-08-28 23:24:31 +00002991 DIE *SP = ModuleCU->getDieMapSlotFor(Node);
Bill Wendling94d04b82009-05-20 23:21:38 +00002992 Asm->EmitInt32(SP->getOffset()); Asm->EOL("DIE offset");
2993
2994 if (TD->getPointerSize() == sizeof(int32_t))
Chris Lattner33adcfb2009-08-22 21:43:10 +00002995 O << MAI->getData32bitsDirective();
Bill Wendling94d04b82009-05-20 23:21:38 +00002996 else
Chris Lattner33adcfb2009-08-22 21:43:10 +00002997 O << MAI->getData64bitsDirective();
Bill Wendling94d04b82009-05-20 23:21:38 +00002998
2999 PrintLabelName("label", *LI); Asm->EOL("low_pc");
3000 }
3001 }
3002
3003 EmitLabel("debug_inlined_end", 1);
3004 Asm->EOL();
3005}