blob: bc4333d9c1bb032e71e1c99cc75a5aef3945227f [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 Lattnera87dea42009-07-31 18:48:30 +000026#include "llvm/Support/Timer.h"
Devang Patele4b27562009-08-28 23:24:31 +000027#include "llvm/Support/Debug.h"
Chris Lattnera87dea42009-07-31 18:48:30 +000028#include "llvm/System/Path.h"
Bill Wendling0310d762009-05-15 09:23:25 +000029using namespace llvm;
30
31static TimerGroup &getDwarfTimerGroup() {
32 static TimerGroup DwarfTimerGroup("Dwarf Debugging");
33 return DwarfTimerGroup;
34}
35
36//===----------------------------------------------------------------------===//
37
38/// Configuration values for initial hash set sizes (log2).
39///
40static const unsigned InitDiesSetSize = 9; // log2(512)
41static const unsigned InitAbbreviationsSetSize = 9; // log2(512)
42static const unsigned InitValuesSetSize = 9; // log2(512)
43
44namespace llvm {
45
46//===----------------------------------------------------------------------===//
47/// CompileUnit - This dwarf writer support class manages information associate
48/// with a source file.
49class VISIBILITY_HIDDEN CompileUnit {
50 /// ID - File identifier for source.
51 ///
52 unsigned ID;
53
54 /// Die - Compile unit debug information entry.
55 ///
56 DIE *Die;
57
58 /// GVToDieMap - Tracks the mapping of unit level debug informaton
59 /// variables to debug information entries.
Devang Patele4b27562009-08-28 23:24:31 +000060 /// FIXME : Rename GVToDieMap -> NodeToDieMap
61 std::map<MDNode *, DIE *> GVToDieMap;
Bill Wendling0310d762009-05-15 09:23:25 +000062
63 /// GVToDIEEntryMap - Tracks the mapping of unit level debug informaton
64 /// descriptors to debug information entries using a DIEEntry proxy.
Devang Patele4b27562009-08-28 23:24:31 +000065 /// FIXME : Rename
66 std::map<MDNode *, DIEEntry *> GVToDIEEntryMap;
Bill Wendling0310d762009-05-15 09:23:25 +000067
68 /// Globals - A map of globally visible named entities for this unit.
69 ///
70 StringMap<DIE*> Globals;
71
72 /// DiesSet - Used to uniquely define dies within the compile unit.
73 ///
74 FoldingSet<DIE> DiesSet;
75public:
76 CompileUnit(unsigned I, DIE *D)
Bill Wendling39dd6962009-05-20 23:31:45 +000077 : ID(I), Die(D), DiesSet(InitDiesSetSize) {}
78 ~CompileUnit() { delete Die; }
Bill Wendling0310d762009-05-15 09:23:25 +000079
80 // Accessors.
Bill Wendling39dd6962009-05-20 23:31:45 +000081 unsigned getID() const { return ID; }
82 DIE* getDie() const { return Die; }
Bill Wendling0310d762009-05-15 09:23:25 +000083 StringMap<DIE*> &getGlobals() { return Globals; }
84
85 /// hasContent - Return true if this compile unit has something to write out.
86 ///
Bill Wendling39dd6962009-05-20 23:31:45 +000087 bool hasContent() const { return !Die->getChildren().empty(); }
Bill Wendling0310d762009-05-15 09:23:25 +000088
89 /// AddGlobal - Add a new global entity to the compile unit.
90 ///
Bill Wendling39dd6962009-05-20 23:31:45 +000091 void AddGlobal(const std::string &Name, DIE *Die) { Globals[Name] = Die; }
Bill Wendling0310d762009-05-15 09:23:25 +000092
93 /// getDieMapSlotFor - Returns the debug information entry map slot for the
94 /// specified debug variable.
Devang Patele4b27562009-08-28 23:24:31 +000095 DIE *&getDieMapSlotFor(MDNode *N) { return GVToDieMap[N]; }
Bill Wendling0310d762009-05-15 09:23:25 +000096
Chris Lattner1cda87c2009-07-14 04:50:12 +000097 /// getDIEEntrySlotFor - Returns the debug information entry proxy slot for
98 /// the specified debug variable.
Devang Patele4b27562009-08-28 23:24:31 +000099 DIEEntry *&getDIEEntrySlotFor(MDNode *N) {
100 return GVToDIEEntryMap[N];
Bill Wendling0310d762009-05-15 09:23:25 +0000101 }
102
103 /// AddDie - Adds or interns the DIE to the compile unit.
104 ///
105 DIE *AddDie(DIE &Buffer) {
106 FoldingSetNodeID ID;
107 Buffer.Profile(ID);
108 void *Where;
109 DIE *Die = DiesSet.FindNodeOrInsertPos(ID, Where);
110
111 if (!Die) {
112 Die = new DIE(Buffer);
113 DiesSet.InsertNode(Die, Where);
114 this->Die->AddChild(Die);
115 Buffer.Detach();
116 }
117
118 return Die;
119 }
120};
121
122//===----------------------------------------------------------------------===//
123/// DbgVariable - This class is used to track local variable information.
124///
125class VISIBILITY_HIDDEN DbgVariable {
126 DIVariable Var; // Variable Descriptor.
127 unsigned FrameIndex; // Variable frame index.
Bill Wendling1180c782009-05-18 23:08:55 +0000128 bool InlinedFnVar; // Variable for an inlined function.
Bill Wendling0310d762009-05-15 09:23:25 +0000129public:
Bill Wendling1180c782009-05-18 23:08:55 +0000130 DbgVariable(DIVariable V, unsigned I, bool IFV)
131 : Var(V), FrameIndex(I), InlinedFnVar(IFV) {}
Bill Wendling0310d762009-05-15 09:23:25 +0000132
133 // Accessors.
Bill Wendling1180c782009-05-18 23:08:55 +0000134 DIVariable getVariable() const { return Var; }
Bill Wendling0310d762009-05-15 09:23:25 +0000135 unsigned getFrameIndex() const { return FrameIndex; }
Bill Wendling1180c782009-05-18 23:08:55 +0000136 bool isInlinedFnVar() const { return InlinedFnVar; }
Bill Wendling0310d762009-05-15 09:23:25 +0000137};
138
139//===----------------------------------------------------------------------===//
140/// DbgScope - This class is used to track scope information.
141///
142class DbgConcreteScope;
143class VISIBILITY_HIDDEN DbgScope {
144 DbgScope *Parent; // Parent to this scope.
145 DIDescriptor Desc; // Debug info descriptor for scope.
146 // Either subprogram or block.
147 unsigned StartLabelID; // Label ID of the beginning of scope.
148 unsigned EndLabelID; // Label ID of the end of scope.
149 SmallVector<DbgScope *, 4> Scopes; // Scopes defined in scope.
150 SmallVector<DbgVariable *, 8> Variables;// Variables declared in scope.
151 SmallVector<DbgConcreteScope *, 8> ConcreteInsts;// Concrete insts of funcs.
Owen Anderson04c05f72009-06-24 22:53:20 +0000152
153 // Private state for dump()
154 mutable unsigned IndentLevel;
Bill Wendling0310d762009-05-15 09:23:25 +0000155public:
156 DbgScope(DbgScope *P, DIDescriptor D)
Owen Anderson04c05f72009-06-24 22:53:20 +0000157 : Parent(P), Desc(D), StartLabelID(0), EndLabelID(0), IndentLevel(0) {}
Bill Wendling0310d762009-05-15 09:23:25 +0000158 virtual ~DbgScope();
159
160 // Accessors.
161 DbgScope *getParent() const { return Parent; }
162 DIDescriptor getDesc() const { return Desc; }
163 unsigned getStartLabelID() const { return StartLabelID; }
164 unsigned getEndLabelID() const { return EndLabelID; }
165 SmallVector<DbgScope *, 4> &getScopes() { return Scopes; }
166 SmallVector<DbgVariable *, 8> &getVariables() { return Variables; }
167 SmallVector<DbgConcreteScope*,8> &getConcreteInsts() { return ConcreteInsts; }
168 void setStartLabelID(unsigned S) { StartLabelID = S; }
169 void setEndLabelID(unsigned E) { EndLabelID = E; }
170
171 /// AddScope - Add a scope to the scope.
172 ///
173 void AddScope(DbgScope *S) { Scopes.push_back(S); }
174
175 /// AddVariable - Add a variable to the scope.
176 ///
177 void AddVariable(DbgVariable *V) { Variables.push_back(V); }
178
179 /// AddConcreteInst - Add a concrete instance to the scope.
180 ///
181 void AddConcreteInst(DbgConcreteScope *C) { ConcreteInsts.push_back(C); }
182
183#ifndef NDEBUG
184 void dump() const;
185#endif
186};
187
188#ifndef NDEBUG
189void DbgScope::dump() const {
Chris Lattnerc281de12009-08-23 00:51:00 +0000190 raw_ostream &err = errs();
191 err.indent(IndentLevel);
192 Desc.dump();
193 err << " [" << StartLabelID << ", " << EndLabelID << "]\n";
Bill Wendling0310d762009-05-15 09:23:25 +0000194
195 IndentLevel += 2;
196
197 for (unsigned i = 0, e = Scopes.size(); i != e; ++i)
198 if (Scopes[i] != this)
199 Scopes[i]->dump();
200
201 IndentLevel -= 2;
202}
203#endif
204
205//===----------------------------------------------------------------------===//
206/// DbgConcreteScope - This class is used to track a scope that holds concrete
207/// instance information.
208///
209class VISIBILITY_HIDDEN DbgConcreteScope : public DbgScope {
210 CompileUnit *Unit;
211 DIE *Die; // Debug info for this concrete scope.
212public:
213 DbgConcreteScope(DIDescriptor D) : DbgScope(NULL, D) {}
214
215 // Accessors.
216 DIE *getDie() const { return Die; }
217 void setDie(DIE *D) { Die = D; }
218};
219
220DbgScope::~DbgScope() {
221 for (unsigned i = 0, N = Scopes.size(); i < N; ++i)
222 delete Scopes[i];
223 for (unsigned j = 0, M = Variables.size(); j < M; ++j)
224 delete Variables[j];
225 for (unsigned k = 0, O = ConcreteInsts.size(); k < O; ++k)
226 delete ConcreteInsts[k];
227}
228
229} // end llvm namespace
230
Chris Lattneraf76e592009-08-22 20:48:53 +0000231DwarfDebug::DwarfDebug(raw_ostream &OS, AsmPrinter *A, const MCAsmInfo *T)
Devang Patel1dbc7712009-06-29 20:45:18 +0000232 : Dwarf(OS, A, T, "dbg"), ModuleCU(0),
Bill Wendling0310d762009-05-15 09:23:25 +0000233 AbbreviationsSet(InitAbbreviationsSetSize), Abbreviations(),
Chris Lattnera87dea42009-07-31 18:48:30 +0000234 ValuesSet(InitValuesSetSize), Values(), StringPool(),
Bill Wendling0310d762009-05-15 09:23:25 +0000235 SectionSourceLines(), didInitial(false), shouldEmit(false),
Devang Patel43da8fb2009-07-13 21:26:33 +0000236 FunctionDbgScope(0), DebugTimer(0) {
Bill Wendling0310d762009-05-15 09:23:25 +0000237 if (TimePassesIsEnabled)
238 DebugTimer = new Timer("Dwarf Debug Writer",
239 getDwarfTimerGroup());
240}
241DwarfDebug::~DwarfDebug() {
242 for (unsigned j = 0, M = Values.size(); j < M; ++j)
243 delete Values[j];
244
Devang Patele4b27562009-08-28 23:24:31 +0000245 for (DenseMap<const MDNode *, DbgScope *>::iterator
Bill Wendling0310d762009-05-15 09:23:25 +0000246 I = AbstractInstanceRootMap.begin(),
247 E = AbstractInstanceRootMap.end(); I != E;++I)
248 delete I->second;
249
250 delete DebugTimer;
251}
252
253/// AssignAbbrevNumber - Define a unique number for the abbreviation.
254///
255void DwarfDebug::AssignAbbrevNumber(DIEAbbrev &Abbrev) {
256 // Profile the node so that we can make it unique.
257 FoldingSetNodeID ID;
258 Abbrev.Profile(ID);
259
260 // Check the set for priors.
261 DIEAbbrev *InSet = AbbreviationsSet.GetOrInsertNode(&Abbrev);
262
263 // If it's newly added.
264 if (InSet == &Abbrev) {
265 // Add to abbreviation list.
266 Abbreviations.push_back(&Abbrev);
267
268 // Assign the vector position + 1 as its number.
269 Abbrev.setNumber(Abbreviations.size());
270 } else {
271 // Assign existing abbreviation number.
272 Abbrev.setNumber(InSet->getNumber());
273 }
274}
275
Bill Wendling995f80a2009-05-20 23:24:48 +0000276/// CreateDIEEntry - Creates a new DIEEntry to be a proxy for a debug
277/// information entry.
278DIEEntry *DwarfDebug::CreateDIEEntry(DIE *Entry) {
Bill Wendling0310d762009-05-15 09:23:25 +0000279 DIEEntry *Value;
280
281 if (Entry) {
282 FoldingSetNodeID ID;
283 DIEEntry::Profile(ID, Entry);
284 void *Where;
285 Value = static_cast<DIEEntry *>(ValuesSet.FindNodeOrInsertPos(ID, Where));
286
287 if (Value) return Value;
288
289 Value = new DIEEntry(Entry);
290 ValuesSet.InsertNode(Value, Where);
291 } else {
292 Value = new DIEEntry(Entry);
293 }
294
295 Values.push_back(Value);
296 return Value;
297}
298
299/// SetDIEEntry - Set a DIEEntry once the debug information entry is defined.
300///
301void DwarfDebug::SetDIEEntry(DIEEntry *Value, DIE *Entry) {
302 Value->setEntry(Entry);
303
304 // Add to values set if not already there. If it is, we merely have a
305 // duplicate in the values list (no harm.)
306 ValuesSet.GetOrInsertNode(Value);
307}
308
309/// AddUInt - Add an unsigned integer attribute data and value.
310///
311void DwarfDebug::AddUInt(DIE *Die, unsigned Attribute,
312 unsigned Form, uint64_t Integer) {
313 if (!Form) Form = DIEInteger::BestForm(false, Integer);
314
315 FoldingSetNodeID ID;
316 DIEInteger::Profile(ID, Integer);
317 void *Where;
318 DIEValue *Value = ValuesSet.FindNodeOrInsertPos(ID, Where);
319
320 if (!Value) {
321 Value = new DIEInteger(Integer);
322 ValuesSet.InsertNode(Value, Where);
323 Values.push_back(Value);
324 }
325
326 Die->AddValue(Attribute, Form, Value);
327}
328
329/// AddSInt - Add an signed integer attribute data and value.
330///
331void DwarfDebug::AddSInt(DIE *Die, unsigned Attribute,
332 unsigned Form, int64_t Integer) {
333 if (!Form) Form = DIEInteger::BestForm(true, Integer);
334
335 FoldingSetNodeID ID;
336 DIEInteger::Profile(ID, (uint64_t)Integer);
337 void *Where;
338 DIEValue *Value = ValuesSet.FindNodeOrInsertPos(ID, Where);
339
340 if (!Value) {
341 Value = new DIEInteger(Integer);
342 ValuesSet.InsertNode(Value, Where);
343 Values.push_back(Value);
344 }
345
346 Die->AddValue(Attribute, Form, Value);
347}
348
349/// AddString - Add a string attribute data and value.
350///
351void DwarfDebug::AddString(DIE *Die, unsigned Attribute, unsigned Form,
352 const std::string &String) {
353 FoldingSetNodeID ID;
354 DIEString::Profile(ID, String);
355 void *Where;
356 DIEValue *Value = ValuesSet.FindNodeOrInsertPos(ID, Where);
357
358 if (!Value) {
359 Value = new DIEString(String);
360 ValuesSet.InsertNode(Value, Where);
361 Values.push_back(Value);
362 }
363
364 Die->AddValue(Attribute, Form, Value);
365}
366
367/// AddLabel - Add a Dwarf label attribute data and value.
368///
369void DwarfDebug::AddLabel(DIE *Die, unsigned Attribute, unsigned Form,
370 const DWLabel &Label) {
371 FoldingSetNodeID ID;
372 DIEDwarfLabel::Profile(ID, Label);
373 void *Where;
374 DIEValue *Value = ValuesSet.FindNodeOrInsertPos(ID, Where);
375
376 if (!Value) {
377 Value = new DIEDwarfLabel(Label);
378 ValuesSet.InsertNode(Value, Where);
379 Values.push_back(Value);
380 }
381
382 Die->AddValue(Attribute, Form, Value);
383}
384
385/// AddObjectLabel - Add an non-Dwarf label attribute data and value.
386///
387void DwarfDebug::AddObjectLabel(DIE *Die, unsigned Attribute, unsigned Form,
388 const std::string &Label) {
389 FoldingSetNodeID ID;
390 DIEObjectLabel::Profile(ID, Label);
391 void *Where;
392 DIEValue *Value = ValuesSet.FindNodeOrInsertPos(ID, Where);
393
394 if (!Value) {
395 Value = new DIEObjectLabel(Label);
396 ValuesSet.InsertNode(Value, Where);
397 Values.push_back(Value);
398 }
399
400 Die->AddValue(Attribute, Form, Value);
401}
402
403/// AddSectionOffset - Add a section offset label attribute data and value.
404///
405void DwarfDebug::AddSectionOffset(DIE *Die, unsigned Attribute, unsigned Form,
406 const DWLabel &Label, const DWLabel &Section,
407 bool isEH, bool useSet) {
408 FoldingSetNodeID ID;
409 DIESectionOffset::Profile(ID, Label, Section);
410 void *Where;
411 DIEValue *Value = ValuesSet.FindNodeOrInsertPos(ID, Where);
412
413 if (!Value) {
414 Value = new DIESectionOffset(Label, Section, isEH, useSet);
415 ValuesSet.InsertNode(Value, Where);
416 Values.push_back(Value);
417 }
418
419 Die->AddValue(Attribute, Form, Value);
420}
421
422/// AddDelta - Add a label delta attribute data and value.
423///
424void DwarfDebug::AddDelta(DIE *Die, unsigned Attribute, unsigned Form,
425 const DWLabel &Hi, const DWLabel &Lo) {
426 FoldingSetNodeID ID;
427 DIEDelta::Profile(ID, Hi, Lo);
428 void *Where;
429 DIEValue *Value = ValuesSet.FindNodeOrInsertPos(ID, Where);
430
431 if (!Value) {
432 Value = new DIEDelta(Hi, Lo);
433 ValuesSet.InsertNode(Value, Where);
434 Values.push_back(Value);
435 }
436
437 Die->AddValue(Attribute, Form, Value);
438}
439
440/// AddBlock - Add block data.
441///
442void DwarfDebug::AddBlock(DIE *Die, unsigned Attribute, unsigned Form,
443 DIEBlock *Block) {
444 Block->ComputeSize(TD);
445 FoldingSetNodeID ID;
446 Block->Profile(ID);
447 void *Where;
448 DIEValue *Value = ValuesSet.FindNodeOrInsertPos(ID, Where);
449
450 if (!Value) {
451 Value = Block;
452 ValuesSet.InsertNode(Value, Where);
453 Values.push_back(Value);
454 } else {
455 // Already exists, reuse the previous one.
456 delete Block;
457 Block = cast<DIEBlock>(Value);
458 }
459
460 Die->AddValue(Attribute, Block->BestForm(), Value);
461}
462
463/// AddSourceLine - Add location information to specified debug information
464/// entry.
465void DwarfDebug::AddSourceLine(DIE *Die, const DIVariable *V) {
466 // If there is no compile unit specified, don't add a line #.
467 if (V->getCompileUnit().isNull())
468 return;
469
470 unsigned Line = V->getLineNumber();
471 unsigned FileID = FindCompileUnit(V->getCompileUnit()).getID();
472 assert(FileID && "Invalid file id");
473 AddUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
474 AddUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
475}
476
477/// AddSourceLine - Add location information to specified debug information
478/// entry.
479void DwarfDebug::AddSourceLine(DIE *Die, const DIGlobal *G) {
480 // If there is no compile unit specified, don't add a line #.
481 if (G->getCompileUnit().isNull())
482 return;
483
484 unsigned Line = G->getLineNumber();
485 unsigned FileID = FindCompileUnit(G->getCompileUnit()).getID();
486 assert(FileID && "Invalid file id");
487 AddUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
488 AddUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
489}
Devang Patel82dfc0c2009-08-31 22:47:13 +0000490
491/// AddSourceLine - Add location information to specified debug information
492/// entry.
493void DwarfDebug::AddSourceLine(DIE *Die, const DISubprogram *SP) {
494 // If there is no compile unit specified, don't add a line #.
495 if (SP->getCompileUnit().isNull())
496 return;
497
498 unsigned Line = SP->getLineNumber();
499 unsigned FileID = FindCompileUnit(SP->getCompileUnit()).getID();
500 assert(FileID && "Invalid file id");
501 AddUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
502 AddUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
503}
504
505/// AddSourceLine - Add location information to specified debug information
506/// entry.
Bill Wendling0310d762009-05-15 09:23:25 +0000507void DwarfDebug::AddSourceLine(DIE *Die, const DIType *Ty) {
508 // If there is no compile unit specified, don't add a line #.
509 DICompileUnit CU = Ty->getCompileUnit();
510 if (CU.isNull())
511 return;
512
513 unsigned Line = Ty->getLineNumber();
514 unsigned FileID = FindCompileUnit(CU).getID();
515 assert(FileID && "Invalid file id");
516 AddUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
517 AddUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
518}
519
Caroline Ticedc8f6042009-08-31 21:19:37 +0000520/* Byref variables, in Blocks, are declared by the programmer as
521 "SomeType VarName;", but the compiler creates a
522 __Block_byref_x_VarName struct, and gives the variable VarName
523 either the struct, or a pointer to the struct, as its type. This
524 is necessary for various behind-the-scenes things the compiler
525 needs to do with by-reference variables in blocks.
526
527 However, as far as the original *programmer* is concerned, the
528 variable should still have type 'SomeType', as originally declared.
529
530 The following function dives into the __Block_byref_x_VarName
531 struct to find the original type of the variable. This will be
532 passed back to the code generating the type for the Debug
533 Information Entry for the variable 'VarName'. 'VarName' will then
534 have the original type 'SomeType' in its debug information.
535
536 The original type 'SomeType' will be the type of the field named
537 'VarName' inside the __Block_byref_x_VarName struct.
538
539 NOTE: In order for this to not completely fail on the debugger
540 side, the Debug Information Entry for the variable VarName needs to
541 have a DW_AT_location that tells the debugger how to unwind through
542 the pointers and __Block_byref_x_VarName struct to find the actual
543 value of the variable. The function AddBlockByrefType does this. */
544
545/// Find the type the programmer originally declared the variable to be
546/// and return that type.
547///
548DIType DwarfDebug::GetBlockByrefType(DIType Ty, std::string Name) {
549
550 DIType subType = Ty;
551 unsigned tag = Ty.getTag();
552
553 if (tag == dwarf::DW_TAG_pointer_type) {
554 DIDerivedType DTy = DIDerivedType (Ty.getNode());
555 subType = DTy.getTypeDerivedFrom();
556 }
557
558 DICompositeType blockStruct = DICompositeType(subType.getNode());
559
560 DIArray Elements = blockStruct.getTypeArray();
561
562 if (Elements.isNull())
563 return Ty;
564
565 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
566 DIDescriptor Element = Elements.getElement(i);
567 DIDerivedType DT = DIDerivedType(Element.getNode());
568 std::string Name2;
569 DT.getName(Name2);
570 if (Name == Name2)
571 return (DT.getTypeDerivedFrom());
572 }
573
574 return Ty;
575}
576
577/* Byref variables, in Blocks, are declared by the programmer as "SomeType
578 VarName;", but the compiler creates a __Block_byref_x_VarName struct, and
579 gives the variable VarName either the struct, or a pointer to the struct, as
580 its type. This is necessary for various behind-the-scenes things the
581 compiler needs to do with by-reference variables in Blocks.
582
583 However, as far as the original *programmer* is concerned, the variable
584 should still have type 'SomeType', as originally declared.
585
586 The function GetBlockByrefType dives into the __Block_byref_x_VarName
587 struct to find the original type of the variable, which is then assigned to
588 the variable's Debug Information Entry as its real type. So far, so good.
589 However now the debugger will expect the variable VarName to have the type
590 SomeType. So we need the location attribute for the variable to be an
591 expression that explains to the debugger how to navigate through the
592 pointers and struct to find the actual variable of type SomeType.
593
594 The following function does just that. We start by getting
595 the "normal" location for the variable. This will be the location
596 of either the struct __Block_byref_x_VarName or the pointer to the
597 struct __Block_byref_x_VarName.
598
599 The struct will look something like:
600
601 struct __Block_byref_x_VarName {
602 ... <various fields>
603 struct __Block_byref_x_VarName *forwarding;
604 ... <various other fields>
605 SomeType VarName;
606 ... <maybe more fields>
607 };
608
609 If we are given the struct directly (as our starting point) we
610 need to tell the debugger to:
611
612 1). Add the offset of the forwarding field.
613
614 2). Follow that pointer to get the the real __Block_byref_x_VarName
615 struct to use (the real one may have been copied onto the heap).
616
617 3). Add the offset for the field VarName, to find the actual variable.
618
619 If we started with a pointer to the struct, then we need to
620 dereference that pointer first, before the other steps.
621 Translating this into DWARF ops, we will need to append the following
622 to the current location description for the variable:
623
624 DW_OP_deref -- optional, if we start with a pointer
625 DW_OP_plus_uconst <forward_fld_offset>
626 DW_OP_deref
627 DW_OP_plus_uconst <varName_fld_offset>
628
629 That is what this function does. */
630
631/// AddBlockByrefAddress - Start with the address based on the location
632/// provided, and generate the DWARF information necessary to find the
633/// actual Block variable (navigating the Block struct) based on the
634/// starting location. Add the DWARF information to the die. For
635/// more information, read large comment just above here.
636///
637void DwarfDebug::AddBlockByrefAddress(DbgVariable *&DV, DIE *Die,
638 unsigned Attribute,
639 const MachineLocation &Location) {
640 const DIVariable &VD = DV->getVariable();
641 DIType Ty = VD.getType();
642 DIType TmpTy = Ty;
643 unsigned Tag = Ty.getTag();
644 bool isPointer = false;
645
646 std::string varName;
647 VD.getName(varName);
648
649 if (Tag == dwarf::DW_TAG_pointer_type) {
650 DIDerivedType DTy = DIDerivedType (Ty.getNode());
651 TmpTy = DTy.getTypeDerivedFrom();
652 isPointer = true;
653 }
654
655 DICompositeType blockStruct = DICompositeType(TmpTy.getNode());
656
657 std::string typeName;
658 blockStruct.getName(typeName);
659
660 assert(typeName.find ("__Block_byref_") == 0
661 && "Attempting to get Block location of non-Block variable!");
662
663 // Find the __forwarding field and the variable field in the __Block_byref
664 // struct.
665
666 DIArray Fields = blockStruct.getTypeArray();
667 DIDescriptor varField = DIDescriptor();
668 DIDescriptor forwardingField = DIDescriptor();
669
670
671 for (unsigned i = 0, N = Fields.getNumElements(); i < N; ++i) {
672 DIDescriptor Element = Fields.getElement(i);
673 DIDerivedType DT = DIDerivedType(Element.getNode());
674 std::string fieldName;
675 DT.getName(fieldName);
676 if (fieldName == "__forwarding")
677 forwardingField = Element;
678 else if (fieldName == varName)
679 varField = Element;
680 }
681
682 assert (!varField.isNull() && "Can't find byref variable in Block struct");
683 assert (!forwardingField.isNull()
684 && "Can't find forwarding field in Block struct");
685
686 // Get the offsets for the forwarding field and the variable field.
687
688 unsigned int forwardingFieldOffset =
689 DIDerivedType(forwardingField.getNode()).getOffsetInBits() >> 3;
690 unsigned int varFieldOffset =
691 DIDerivedType(varField.getNode()).getOffsetInBits() >> 3;
692
693 // Decode the original location, and use that as the start of the
694 // byref variable's location.
695
696 unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
697 DIEBlock *Block = new DIEBlock();
698
699 if (Location.isReg()) {
700 if (Reg < 32)
701 AddUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
702 else {
703 Reg = Reg - dwarf::DW_OP_reg0;
704 AddUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
705 AddUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
706 }
707 } else {
708 if (Reg < 32)
709 AddUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
710 else {
711 AddUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
712 AddUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
713 }
714
715 AddUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
716 }
717
718 // If we started with a pointer to the__Block_byref... struct, then
719 // the first thing we need to do is dereference the pointer (DW_OP_deref).
720
721 if (isPointer)
722 AddUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
723
724 // Next add the offset for the '__forwarding' field:
725 // DW_OP_plus_uconst ForwardingFieldOffset. Note there's no point in
726 // adding the offset if it's 0.
727
728 if (forwardingFieldOffset > 0) {
729 AddUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
730 AddUInt(Block, 0, dwarf::DW_FORM_udata, forwardingFieldOffset);
731 }
732
733 // Now dereference the __forwarding field to get to the real __Block_byref
734 // struct: DW_OP_deref.
735
736 AddUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
737
738 // Now that we've got the real __Block_byref... struct, add the offset
739 // for the variable's field to get to the location of the actual variable:
740 // DW_OP_plus_uconst varFieldOffset. Again, don't add if it's 0.
741
742 if (varFieldOffset > 0) {
743 AddUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
744 AddUInt(Block, 0, dwarf::DW_FORM_udata, varFieldOffset);
745 }
746
747 // Now attach the location information to the DIE.
748
749 AddBlock(Die, Attribute, 0, Block);
750}
751
Bill Wendling0310d762009-05-15 09:23:25 +0000752/// AddAddress - Add an address attribute to a die based on the location
753/// provided.
754void DwarfDebug::AddAddress(DIE *Die, unsigned Attribute,
755 const MachineLocation &Location) {
756 unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
757 DIEBlock *Block = new DIEBlock();
758
759 if (Location.isReg()) {
760 if (Reg < 32) {
761 AddUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
762 } else {
763 AddUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
764 AddUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
765 }
766 } else {
767 if (Reg < 32) {
768 AddUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
769 } else {
770 AddUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
771 AddUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
772 }
773
774 AddUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
775 }
776
777 AddBlock(Die, Attribute, 0, Block);
778}
779
780/// AddType - Add a new type attribute to the specified entity.
781void DwarfDebug::AddType(CompileUnit *DW_Unit, DIE *Entity, DIType Ty) {
782 if (Ty.isNull())
783 return;
784
785 // Check for pre-existence.
Devang Patele4b27562009-08-28 23:24:31 +0000786 DIEEntry *&Slot = DW_Unit->getDIEEntrySlotFor(Ty.getNode());
Bill Wendling0310d762009-05-15 09:23:25 +0000787
788 // If it exists then use the existing value.
789 if (Slot) {
790 Entity->AddValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, Slot);
791 return;
792 }
793
794 // Set up proxy.
Bill Wendling995f80a2009-05-20 23:24:48 +0000795 Slot = CreateDIEEntry();
Bill Wendling0310d762009-05-15 09:23:25 +0000796
797 // Construct type.
798 DIE Buffer(dwarf::DW_TAG_base_type);
Devang Patel6ceea332009-08-31 18:49:10 +0000799 if (Ty.isBasicType())
Devang Patele4b27562009-08-28 23:24:31 +0000800 ConstructTypeDIE(DW_Unit, Buffer, DIBasicType(Ty.getNode()));
Devang Patel6ceea332009-08-31 18:49:10 +0000801 else if (Ty.isCompositeType())
Devang Patele4b27562009-08-28 23:24:31 +0000802 ConstructTypeDIE(DW_Unit, Buffer, DICompositeType(Ty.getNode()));
Bill Wendling0310d762009-05-15 09:23:25 +0000803 else {
Devang Patel6ceea332009-08-31 18:49:10 +0000804 assert(Ty.isDerivedType() && "Unknown kind of DIType");
Devang Patele4b27562009-08-28 23:24:31 +0000805 ConstructTypeDIE(DW_Unit, Buffer, DIDerivedType(Ty.getNode()));
806
Bill Wendling0310d762009-05-15 09:23:25 +0000807 }
808
809 // Add debug information entry to entity and appropriate context.
810 DIE *Die = NULL;
811 DIDescriptor Context = Ty.getContext();
812 if (!Context.isNull())
Devang Patele4b27562009-08-28 23:24:31 +0000813 Die = DW_Unit->getDieMapSlotFor(Context.getNode());
Bill Wendling0310d762009-05-15 09:23:25 +0000814
815 if (Die) {
816 DIE *Child = new DIE(Buffer);
817 Die->AddChild(Child);
818 Buffer.Detach();
819 SetDIEEntry(Slot, Child);
820 } else {
821 Die = DW_Unit->AddDie(Buffer);
822 SetDIEEntry(Slot, Die);
823 }
824
825 Entity->AddValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, Slot);
826}
827
828/// ConstructTypeDIE - Construct basic type die from DIBasicType.
829void DwarfDebug::ConstructTypeDIE(CompileUnit *DW_Unit, DIE &Buffer,
830 DIBasicType BTy) {
831 // Get core information.
832 std::string Name;
833 BTy.getName(Name);
834 Buffer.setTag(dwarf::DW_TAG_base_type);
835 AddUInt(&Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
836 BTy.getEncoding());
837
838 // Add name if not anonymous or intermediate type.
839 if (!Name.empty())
840 AddString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
841 uint64_t Size = BTy.getSizeInBits() >> 3;
842 AddUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
843}
844
845/// ConstructTypeDIE - Construct derived type die from DIDerivedType.
846void DwarfDebug::ConstructTypeDIE(CompileUnit *DW_Unit, DIE &Buffer,
847 DIDerivedType DTy) {
848 // Get core information.
849 std::string Name;
850 DTy.getName(Name);
851 uint64_t Size = DTy.getSizeInBits() >> 3;
852 unsigned Tag = DTy.getTag();
853
854 // FIXME - Workaround for templates.
855 if (Tag == dwarf::DW_TAG_inheritance) Tag = dwarf::DW_TAG_reference_type;
856
857 Buffer.setTag(Tag);
858
859 // Map to main type, void will not have a type.
860 DIType FromTy = DTy.getTypeDerivedFrom();
861 AddType(DW_Unit, &Buffer, FromTy);
862
863 // Add name if not anonymous or intermediate type.
864 if (!Name.empty())
865 AddString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
866
867 // Add size if non-zero (derived types might be zero-sized.)
868 if (Size)
869 AddUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
870
871 // Add source line info if available and TyDesc is not a forward declaration.
872 if (!DTy.isForwardDecl())
873 AddSourceLine(&Buffer, &DTy);
874}
875
876/// ConstructTypeDIE - Construct type DIE from DICompositeType.
877void DwarfDebug::ConstructTypeDIE(CompileUnit *DW_Unit, DIE &Buffer,
878 DICompositeType CTy) {
879 // Get core information.
880 std::string Name;
881 CTy.getName(Name);
882
883 uint64_t Size = CTy.getSizeInBits() >> 3;
884 unsigned Tag = CTy.getTag();
885 Buffer.setTag(Tag);
886
887 switch (Tag) {
888 case dwarf::DW_TAG_vector_type:
889 case dwarf::DW_TAG_array_type:
890 ConstructArrayTypeDIE(DW_Unit, Buffer, &CTy);
891 break;
892 case dwarf::DW_TAG_enumeration_type: {
893 DIArray Elements = CTy.getTypeArray();
894
895 // Add enumerators to enumeration type.
896 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
897 DIE *ElemDie = NULL;
Devang Patele4b27562009-08-28 23:24:31 +0000898 DIEnumerator Enum(Elements.getElement(i).getNode());
Bill Wendling0310d762009-05-15 09:23:25 +0000899 ElemDie = ConstructEnumTypeDIE(DW_Unit, &Enum);
900 Buffer.AddChild(ElemDie);
901 }
902 }
903 break;
904 case dwarf::DW_TAG_subroutine_type: {
905 // Add return type.
906 DIArray Elements = CTy.getTypeArray();
907 DIDescriptor RTy = Elements.getElement(0);
Devang Patele4b27562009-08-28 23:24:31 +0000908 AddType(DW_Unit, &Buffer, DIType(RTy.getNode()));
Bill Wendling0310d762009-05-15 09:23:25 +0000909
910 // Add prototype flag.
911 AddUInt(&Buffer, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
912
913 // Add arguments.
914 for (unsigned i = 1, N = Elements.getNumElements(); i < N; ++i) {
915 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
916 DIDescriptor Ty = Elements.getElement(i);
Devang Patele4b27562009-08-28 23:24:31 +0000917 AddType(DW_Unit, Arg, DIType(Ty.getNode()));
Bill Wendling0310d762009-05-15 09:23:25 +0000918 Buffer.AddChild(Arg);
919 }
920 }
921 break;
922 case dwarf::DW_TAG_structure_type:
923 case dwarf::DW_TAG_union_type:
924 case dwarf::DW_TAG_class_type: {
925 // Add elements to structure type.
926 DIArray Elements = CTy.getTypeArray();
927
928 // A forward struct declared type may not have elements available.
929 if (Elements.isNull())
930 break;
931
932 // Add elements to structure type.
933 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
934 DIDescriptor Element = Elements.getElement(i);
Devang Patele4b27562009-08-28 23:24:31 +0000935 if (Element.isNull())
936 continue;
Bill Wendling0310d762009-05-15 09:23:25 +0000937 DIE *ElemDie = NULL;
938 if (Element.getTag() == dwarf::DW_TAG_subprogram)
939 ElemDie = CreateSubprogramDIE(DW_Unit,
Devang Patele4b27562009-08-28 23:24:31 +0000940 DISubprogram(Element.getNode()));
Bill Wendling0310d762009-05-15 09:23:25 +0000941 else
942 ElemDie = CreateMemberDIE(DW_Unit,
Devang Patele4b27562009-08-28 23:24:31 +0000943 DIDerivedType(Element.getNode()));
Bill Wendling0310d762009-05-15 09:23:25 +0000944 Buffer.AddChild(ElemDie);
945 }
946
Devang Patela1ba2692009-08-27 23:51:51 +0000947 if (CTy.isAppleBlockExtension())
Bill Wendling0310d762009-05-15 09:23:25 +0000948 AddUInt(&Buffer, dwarf::DW_AT_APPLE_block, dwarf::DW_FORM_flag, 1);
949
950 unsigned RLang = CTy.getRunTimeLang();
951 if (RLang)
952 AddUInt(&Buffer, dwarf::DW_AT_APPLE_runtime_class,
953 dwarf::DW_FORM_data1, RLang);
954 break;
955 }
956 default:
957 break;
958 }
959
960 // Add name if not anonymous or intermediate type.
961 if (!Name.empty())
962 AddString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
963
964 if (Tag == dwarf::DW_TAG_enumeration_type ||
965 Tag == dwarf::DW_TAG_structure_type || Tag == dwarf::DW_TAG_union_type) {
966 // Add size if non-zero (derived types might be zero-sized.)
967 if (Size)
968 AddUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
969 else {
970 // Add zero size if it is not a forward declaration.
971 if (CTy.isForwardDecl())
972 AddUInt(&Buffer, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
973 else
974 AddUInt(&Buffer, dwarf::DW_AT_byte_size, 0, 0);
975 }
976
977 // Add source line info if available.
978 if (!CTy.isForwardDecl())
979 AddSourceLine(&Buffer, &CTy);
980 }
981}
982
983/// ConstructSubrangeDIE - Construct subrange DIE from DISubrange.
984void DwarfDebug::ConstructSubrangeDIE(DIE &Buffer, DISubrange SR, DIE *IndexTy){
985 int64_t L = SR.getLo();
986 int64_t H = SR.getHi();
987 DIE *DW_Subrange = new DIE(dwarf::DW_TAG_subrange_type);
988
Devang Patel6325a532009-08-14 20:59:16 +0000989 AddDIEEntry(DW_Subrange, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IndexTy);
990 if (L)
991 AddSInt(DW_Subrange, dwarf::DW_AT_lower_bound, 0, L);
992 if (H)
993 AddSInt(DW_Subrange, dwarf::DW_AT_upper_bound, 0, H);
Bill Wendling0310d762009-05-15 09:23:25 +0000994
995 Buffer.AddChild(DW_Subrange);
996}
997
998/// ConstructArrayTypeDIE - Construct array type DIE from DICompositeType.
999void DwarfDebug::ConstructArrayTypeDIE(CompileUnit *DW_Unit, DIE &Buffer,
1000 DICompositeType *CTy) {
1001 Buffer.setTag(dwarf::DW_TAG_array_type);
1002 if (CTy->getTag() == dwarf::DW_TAG_vector_type)
1003 AddUInt(&Buffer, dwarf::DW_AT_GNU_vector, dwarf::DW_FORM_flag, 1);
1004
1005 // Emit derived type.
1006 AddType(DW_Unit, &Buffer, CTy->getTypeDerivedFrom());
1007 DIArray Elements = CTy->getTypeArray();
1008
1009 // Construct an anonymous type for index type.
1010 DIE IdxBuffer(dwarf::DW_TAG_base_type);
1011 AddUInt(&IdxBuffer, dwarf::DW_AT_byte_size, 0, sizeof(int32_t));
1012 AddUInt(&IdxBuffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
1013 dwarf::DW_ATE_signed);
1014 DIE *IndexTy = DW_Unit->AddDie(IdxBuffer);
1015
1016 // Add subranges to array type.
1017 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1018 DIDescriptor Element = Elements.getElement(i);
1019 if (Element.getTag() == dwarf::DW_TAG_subrange_type)
Devang Patele4b27562009-08-28 23:24:31 +00001020 ConstructSubrangeDIE(Buffer, DISubrange(Element.getNode()), IndexTy);
Bill Wendling0310d762009-05-15 09:23:25 +00001021 }
1022}
1023
1024/// ConstructEnumTypeDIE - Construct enum type DIE from DIEnumerator.
1025DIE *DwarfDebug::ConstructEnumTypeDIE(CompileUnit *DW_Unit, DIEnumerator *ETy) {
1026 DIE *Enumerator = new DIE(dwarf::DW_TAG_enumerator);
1027 std::string Name;
1028 ETy->getName(Name);
1029 AddString(Enumerator, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1030 int64_t Value = ETy->getEnumValue();
1031 AddSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, Value);
1032 return Enumerator;
1033}
1034
1035/// CreateGlobalVariableDIE - Create new DIE using GV.
1036DIE *DwarfDebug::CreateGlobalVariableDIE(CompileUnit *DW_Unit,
1037 const DIGlobalVariable &GV) {
1038 DIE *GVDie = new DIE(dwarf::DW_TAG_variable);
1039 std::string Name;
1040 GV.getDisplayName(Name);
1041 AddString(GVDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1042 std::string LinkageName;
1043 GV.getLinkageName(LinkageName);
Devang Patel53cb17d2009-07-16 01:01:22 +00001044 if (!LinkageName.empty()) {
Chris Lattner6c2f9e12009-08-19 05:49:37 +00001045 // Skip special LLVM prefix that is used to inform the asm printer to not
1046 // emit usual symbol prefix before the symbol name. This happens for
1047 // Objective-C symbol names and symbol whose name is replaced using GCC's
1048 // __asm__ attribute.
Devang Patel53cb17d2009-07-16 01:01:22 +00001049 if (LinkageName[0] == 1)
1050 LinkageName = &LinkageName[1];
Bill Wendling0310d762009-05-15 09:23:25 +00001051 AddString(GVDie, dwarf::DW_AT_MIPS_linkage_name, dwarf::DW_FORM_string,
Devang Patel1a8d2d22009-07-14 00:55:28 +00001052 LinkageName);
Devang Patel53cb17d2009-07-16 01:01:22 +00001053 }
1054 AddType(DW_Unit, GVDie, GV.getType());
Bill Wendling0310d762009-05-15 09:23:25 +00001055 if (!GV.isLocalToUnit())
1056 AddUInt(GVDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
1057 AddSourceLine(GVDie, &GV);
1058 return GVDie;
1059}
1060
1061/// CreateMemberDIE - Create new member DIE.
1062DIE *DwarfDebug::CreateMemberDIE(CompileUnit *DW_Unit, const DIDerivedType &DT){
1063 DIE *MemberDie = new DIE(DT.getTag());
1064 std::string Name;
1065 DT.getName(Name);
1066 if (!Name.empty())
1067 AddString(MemberDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1068
1069 AddType(DW_Unit, MemberDie, DT.getTypeDerivedFrom());
1070
1071 AddSourceLine(MemberDie, &DT);
1072
1073 uint64_t Size = DT.getSizeInBits();
1074 uint64_t FieldSize = DT.getOriginalTypeSize();
1075
1076 if (Size != FieldSize) {
1077 // Handle bitfield.
1078 AddUInt(MemberDie, dwarf::DW_AT_byte_size, 0, DT.getOriginalTypeSize()>>3);
1079 AddUInt(MemberDie, dwarf::DW_AT_bit_size, 0, DT.getSizeInBits());
1080
1081 uint64_t Offset = DT.getOffsetInBits();
1082 uint64_t FieldOffset = Offset;
1083 uint64_t AlignMask = ~(DT.getAlignInBits() - 1);
1084 uint64_t HiMark = (Offset + FieldSize) & AlignMask;
1085 FieldOffset = (HiMark - FieldSize);
1086 Offset -= FieldOffset;
1087
1088 // Maybe we need to work from the other end.
1089 if (TD->isLittleEndian()) Offset = FieldSize - (Offset + Size);
1090 AddUInt(MemberDie, dwarf::DW_AT_bit_offset, 0, Offset);
1091 }
1092
1093 DIEBlock *Block = new DIEBlock();
1094 AddUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
1095 AddUInt(Block, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits() >> 3);
1096 AddBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, Block);
1097
1098 if (DT.isProtected())
1099 AddUInt(MemberDie, dwarf::DW_AT_accessibility, 0,
1100 dwarf::DW_ACCESS_protected);
1101 else if (DT.isPrivate())
1102 AddUInt(MemberDie, dwarf::DW_AT_accessibility, 0,
1103 dwarf::DW_ACCESS_private);
1104
1105 return MemberDie;
1106}
1107
1108/// CreateSubprogramDIE - Create new DIE using SP.
1109DIE *DwarfDebug::CreateSubprogramDIE(CompileUnit *DW_Unit,
1110 const DISubprogram &SP,
Bill Wendling6679ee42009-05-18 22:02:36 +00001111 bool IsConstructor,
1112 bool IsInlined) {
Bill Wendling0310d762009-05-15 09:23:25 +00001113 DIE *SPDie = new DIE(dwarf::DW_TAG_subprogram);
1114
1115 std::string Name;
1116 SP.getName(Name);
1117 AddString(SPDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1118
1119 std::string LinkageName;
1120 SP.getLinkageName(LinkageName);
Devang Patel53cb17d2009-07-16 01:01:22 +00001121 if (!LinkageName.empty()) {
1122 // Skip special LLVM prefix that is used to inform the asm printer to not emit
1123 // usual symbol prefix before the symbol name. This happens for Objective-C
1124 // symbol names and symbol whose name is replaced using GCC's __asm__ attribute.
1125 if (LinkageName[0] == 1)
1126 LinkageName = &LinkageName[1];
Bill Wendling0310d762009-05-15 09:23:25 +00001127 AddString(SPDie, dwarf::DW_AT_MIPS_linkage_name, dwarf::DW_FORM_string,
Devang Patel1a8d2d22009-07-14 00:55:28 +00001128 LinkageName);
Devang Patel53cb17d2009-07-16 01:01:22 +00001129 }
Bill Wendling0310d762009-05-15 09:23:25 +00001130 AddSourceLine(SPDie, &SP);
1131
1132 DICompositeType SPTy = SP.getType();
1133 DIArray Args = SPTy.getTypeArray();
1134
1135 // Add prototyped tag, if C or ObjC.
1136 unsigned Lang = SP.getCompileUnit().getLanguage();
1137 if (Lang == dwarf::DW_LANG_C99 || Lang == dwarf::DW_LANG_C89 ||
1138 Lang == dwarf::DW_LANG_ObjC)
1139 AddUInt(SPDie, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
1140
1141 // Add Return Type.
1142 unsigned SPTag = SPTy.getTag();
1143 if (!IsConstructor) {
1144 if (Args.isNull() || SPTag != dwarf::DW_TAG_subroutine_type)
1145 AddType(DW_Unit, SPDie, SPTy);
1146 else
Devang Patele4b27562009-08-28 23:24:31 +00001147 AddType(DW_Unit, SPDie, DIType(Args.getElement(0).getNode()));
Bill Wendling0310d762009-05-15 09:23:25 +00001148 }
1149
1150 if (!SP.isDefinition()) {
1151 AddUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1152
1153 // Add arguments. Do not add arguments for subprogram definition. They will
1154 // be handled through RecordVariable.
1155 if (SPTag == dwarf::DW_TAG_subroutine_type)
1156 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
1157 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
Devang Patele4b27562009-08-28 23:24:31 +00001158 AddType(DW_Unit, Arg, DIType(Args.getElement(i).getNode()));
Bill Wendling0310d762009-05-15 09:23:25 +00001159 AddUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1); // ??
1160 SPDie->AddChild(Arg);
1161 }
1162 }
1163
Bill Wendling6679ee42009-05-18 22:02:36 +00001164 if (!SP.isLocalToUnit() && !IsInlined)
Bill Wendling0310d762009-05-15 09:23:25 +00001165 AddUInt(SPDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
1166
1167 // DW_TAG_inlined_subroutine may refer to this DIE.
Devang Patele4b27562009-08-28 23:24:31 +00001168 DIE *&Slot = DW_Unit->getDieMapSlotFor(SP.getNode());
Bill Wendling0310d762009-05-15 09:23:25 +00001169 Slot = SPDie;
1170 return SPDie;
1171}
1172
1173/// FindCompileUnit - Get the compile unit for the given descriptor.
1174///
1175CompileUnit &DwarfDebug::FindCompileUnit(DICompileUnit Unit) const {
1176 DenseMap<Value *, CompileUnit *>::const_iterator I =
Devang Patele4b27562009-08-28 23:24:31 +00001177 CompileUnitMap.find(Unit.getNode());
Bill Wendling0310d762009-05-15 09:23:25 +00001178 assert(I != CompileUnitMap.end() && "Missing compile unit.");
1179 return *I->second;
1180}
1181
Bill Wendling995f80a2009-05-20 23:24:48 +00001182/// CreateDbgScopeVariable - Create a new scope variable.
Bill Wendling0310d762009-05-15 09:23:25 +00001183///
Bill Wendling995f80a2009-05-20 23:24:48 +00001184DIE *DwarfDebug::CreateDbgScopeVariable(DbgVariable *DV, CompileUnit *Unit) {
Bill Wendling0310d762009-05-15 09:23:25 +00001185 // Get the descriptor.
1186 const DIVariable &VD = DV->getVariable();
1187
1188 // Translate tag to proper Dwarf tag. The result variable is dropped for
1189 // now.
1190 unsigned Tag;
1191 switch (VD.getTag()) {
1192 case dwarf::DW_TAG_return_variable:
1193 return NULL;
1194 case dwarf::DW_TAG_arg_variable:
1195 Tag = dwarf::DW_TAG_formal_parameter;
1196 break;
1197 case dwarf::DW_TAG_auto_variable: // fall thru
1198 default:
1199 Tag = dwarf::DW_TAG_variable;
1200 break;
1201 }
1202
1203 // Define variable debug information entry.
1204 DIE *VariableDie = new DIE(Tag);
1205 std::string Name;
1206 VD.getName(Name);
1207 AddString(VariableDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1208
1209 // Add source line info if available.
1210 AddSourceLine(VariableDie, &VD);
1211
1212 // Add variable type.
Caroline Ticedc8f6042009-08-31 21:19:37 +00001213 if (VD.isBlockByrefVariable())
1214 AddType(Unit, VariableDie, GetBlockByrefType(VD.getType(), Name));
1215 else
1216 AddType(Unit, VariableDie, VD.getType());
Bill Wendling0310d762009-05-15 09:23:25 +00001217
1218 // Add variable address.
Bill Wendling1180c782009-05-18 23:08:55 +00001219 if (!DV->isInlinedFnVar()) {
1220 // Variables for abstract instances of inlined functions don't get a
1221 // location.
1222 MachineLocation Location;
1223 Location.set(RI->getFrameRegister(*MF),
1224 RI->getFrameIndexOffset(*MF, DV->getFrameIndex()));
Caroline Ticedc8f6042009-08-31 21:19:37 +00001225
1226 if (VD.isBlockByrefVariable())
1227 AddBlockByrefAddress (DV, VariableDie, dwarf::DW_AT_location, Location);
1228 else
1229 AddAddress(VariableDie, dwarf::DW_AT_location, Location);
Bill Wendling1180c782009-05-18 23:08:55 +00001230 }
Bill Wendling0310d762009-05-15 09:23:25 +00001231
1232 return VariableDie;
1233}
1234
1235/// getOrCreateScope - Returns the scope associated with the given descriptor.
1236///
Devang Patele4b27562009-08-28 23:24:31 +00001237DbgScope *DwarfDebug::getOrCreateScope(MDNode *N) {
1238 DbgScope *&Slot = DbgScopeMap[N];
Bill Wendling0310d762009-05-15 09:23:25 +00001239 if (Slot) return Slot;
1240
1241 DbgScope *Parent = NULL;
Devang Patel5e005d82009-08-31 22:00:15 +00001242 DILexicalBlock Block(N);
Bill Wendling0310d762009-05-15 09:23:25 +00001243
Bill Wendling8fff19b2009-06-01 20:18:46 +00001244 // Don't create a new scope if we already created one for an inlined function.
Devang Patele4b27562009-08-28 23:24:31 +00001245 DenseMap<const MDNode *, DbgScope *>::iterator
1246 II = AbstractInstanceRootMap.find(N);
Bill Wendling8fff19b2009-06-01 20:18:46 +00001247 if (II != AbstractInstanceRootMap.end())
1248 return LexicalScopeStack.back();
1249
Bill Wendling0310d762009-05-15 09:23:25 +00001250 if (!Block.isNull()) {
1251 DIDescriptor ParentDesc = Block.getContext();
1252 Parent =
Devang Patele4b27562009-08-28 23:24:31 +00001253 ParentDesc.isNull() ? NULL : getOrCreateScope(ParentDesc.getNode());
Bill Wendling0310d762009-05-15 09:23:25 +00001254 }
1255
Devang Patele4b27562009-08-28 23:24:31 +00001256 Slot = new DbgScope(Parent, DIDescriptor(N));
Bill Wendling0310d762009-05-15 09:23:25 +00001257
1258 if (Parent)
1259 Parent->AddScope(Slot);
1260 else
1261 // First function is top level function.
1262 FunctionDbgScope = Slot;
1263
1264 return Slot;
1265}
1266
1267/// ConstructDbgScope - Construct the components of a scope.
1268///
1269void DwarfDebug::ConstructDbgScope(DbgScope *ParentScope,
1270 unsigned ParentStartID,
1271 unsigned ParentEndID,
1272 DIE *ParentDie, CompileUnit *Unit) {
1273 // Add variables to scope.
1274 SmallVector<DbgVariable *, 8> &Variables = ParentScope->getVariables();
1275 for (unsigned i = 0, N = Variables.size(); i < N; ++i) {
Bill Wendling995f80a2009-05-20 23:24:48 +00001276 DIE *VariableDie = CreateDbgScopeVariable(Variables[i], Unit);
Bill Wendling0310d762009-05-15 09:23:25 +00001277 if (VariableDie) ParentDie->AddChild(VariableDie);
1278 }
1279
1280 // Add concrete instances to scope.
1281 SmallVector<DbgConcreteScope *, 8> &ConcreteInsts =
1282 ParentScope->getConcreteInsts();
1283 for (unsigned i = 0, N = ConcreteInsts.size(); i < N; ++i) {
1284 DbgConcreteScope *ConcreteInst = ConcreteInsts[i];
1285 DIE *Die = ConcreteInst->getDie();
1286
1287 unsigned StartID = ConcreteInst->getStartLabelID();
1288 unsigned EndID = ConcreteInst->getEndLabelID();
1289
1290 // Add the scope bounds.
1291 if (StartID)
1292 AddLabel(Die, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
1293 DWLabel("label", StartID));
1294 else
1295 AddLabel(Die, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
1296 DWLabel("func_begin", SubprogramCount));
1297
1298 if (EndID)
1299 AddLabel(Die, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
1300 DWLabel("label", EndID));
1301 else
1302 AddLabel(Die, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
1303 DWLabel("func_end", SubprogramCount));
1304
1305 ParentDie->AddChild(Die);
1306 }
1307
1308 // Add nested scopes.
1309 SmallVector<DbgScope *, 4> &Scopes = ParentScope->getScopes();
1310 for (unsigned j = 0, M = Scopes.size(); j < M; ++j) {
1311 // Define the Scope debug information entry.
1312 DbgScope *Scope = Scopes[j];
1313
1314 unsigned StartID = MMI->MappedLabel(Scope->getStartLabelID());
1315 unsigned EndID = MMI->MappedLabel(Scope->getEndLabelID());
1316
1317 // Ignore empty scopes.
1318 if (StartID == EndID && StartID != 0) continue;
1319
1320 // Do not ignore inlined scopes even if they don't have any variables or
1321 // scopes.
1322 if (Scope->getScopes().empty() && Scope->getVariables().empty() &&
1323 Scope->getConcreteInsts().empty())
1324 continue;
1325
1326 if (StartID == ParentStartID && EndID == ParentEndID) {
1327 // Just add stuff to the parent scope.
1328 ConstructDbgScope(Scope, ParentStartID, ParentEndID, ParentDie, Unit);
1329 } else {
1330 DIE *ScopeDie = new DIE(dwarf::DW_TAG_lexical_block);
1331
1332 // Add the scope bounds.
1333 if (StartID)
1334 AddLabel(ScopeDie, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
1335 DWLabel("label", StartID));
1336 else
1337 AddLabel(ScopeDie, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
1338 DWLabel("func_begin", SubprogramCount));
1339
1340 if (EndID)
1341 AddLabel(ScopeDie, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
1342 DWLabel("label", EndID));
1343 else
1344 AddLabel(ScopeDie, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
1345 DWLabel("func_end", SubprogramCount));
1346
1347 // Add the scope's contents.
1348 ConstructDbgScope(Scope, StartID, EndID, ScopeDie, Unit);
1349 ParentDie->AddChild(ScopeDie);
1350 }
1351 }
1352}
1353
1354/// ConstructFunctionDbgScope - Construct the scope for the subprogram.
1355///
Bill Wendling17956162009-05-20 23:28:48 +00001356void DwarfDebug::ConstructFunctionDbgScope(DbgScope *RootScope,
1357 bool AbstractScope) {
Bill Wendling0310d762009-05-15 09:23:25 +00001358 // Exit if there is no root scope.
1359 if (!RootScope) return;
1360 DIDescriptor Desc = RootScope->getDesc();
1361 if (Desc.isNull())
1362 return;
1363
1364 // Get the subprogram debug information entry.
Devang Patele4b27562009-08-28 23:24:31 +00001365 DISubprogram SPD(Desc.getNode());
Bill Wendling0310d762009-05-15 09:23:25 +00001366
Bill Wendling0310d762009-05-15 09:23:25 +00001367 // Get the subprogram die.
Devang Patele4b27562009-08-28 23:24:31 +00001368 DIE *SPDie = ModuleCU->getDieMapSlotFor(SPD.getNode());
Bill Wendling0310d762009-05-15 09:23:25 +00001369 assert(SPDie && "Missing subprogram descriptor");
1370
Bill Wendling17956162009-05-20 23:28:48 +00001371 if (!AbstractScope) {
1372 // Add the function bounds.
1373 AddLabel(SPDie, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
1374 DWLabel("func_begin", SubprogramCount));
1375 AddLabel(SPDie, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
1376 DWLabel("func_end", SubprogramCount));
1377 MachineLocation Location(RI->getFrameRegister(*MF));
1378 AddAddress(SPDie, dwarf::DW_AT_frame_base, Location);
1379 }
Bill Wendling0310d762009-05-15 09:23:25 +00001380
Devang Patel1dbc7712009-06-29 20:45:18 +00001381 ConstructDbgScope(RootScope, 0, 0, SPDie, ModuleCU);
Bill Wendling0310d762009-05-15 09:23:25 +00001382}
1383
Bill Wendling0310d762009-05-15 09:23:25 +00001384/// ConstructDefaultDbgScope - Construct a default scope for the subprogram.
1385///
1386void DwarfDebug::ConstructDefaultDbgScope(MachineFunction *MF) {
Devang Patel1dbc7712009-06-29 20:45:18 +00001387 StringMap<DIE*> &Globals = ModuleCU->getGlobals();
Daniel Dunbar460f6562009-07-26 09:48:23 +00001388 StringMap<DIE*>::iterator GI = Globals.find(MF->getFunction()->getName());
Devang Patel70f44262009-06-29 20:38:13 +00001389 if (GI != Globals.end()) {
1390 DIE *SPDie = GI->second;
1391
1392 // Add the function bounds.
1393 AddLabel(SPDie, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
1394 DWLabel("func_begin", SubprogramCount));
1395 AddLabel(SPDie, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
1396 DWLabel("func_end", SubprogramCount));
1397
1398 MachineLocation Location(RI->getFrameRegister(*MF));
1399 AddAddress(SPDie, dwarf::DW_AT_frame_base, Location);
Bill Wendling0310d762009-05-15 09:23:25 +00001400 }
Bill Wendling0310d762009-05-15 09:23:25 +00001401}
1402
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001403/// GetOrCreateSourceID - Look up the source id with the given directory and
1404/// source file names. If none currently exists, create a new id and insert it
1405/// in the SourceIds map. This can update DirectoryNames and SourceFileNames
1406/// maps as well.
1407unsigned DwarfDebug::GetOrCreateSourceID(const std::string &DirName,
1408 const std::string &FileName) {
1409 unsigned DId;
1410 StringMap<unsigned>::iterator DI = DirectoryIdMap.find(DirName);
1411 if (DI != DirectoryIdMap.end()) {
1412 DId = DI->getValue();
1413 } else {
1414 DId = DirectoryNames.size() + 1;
1415 DirectoryIdMap[DirName] = DId;
1416 DirectoryNames.push_back(DirName);
1417 }
1418
1419 unsigned FId;
1420 StringMap<unsigned>::iterator FI = SourceFileIdMap.find(FileName);
1421 if (FI != SourceFileIdMap.end()) {
1422 FId = FI->getValue();
1423 } else {
1424 FId = SourceFileNames.size() + 1;
1425 SourceFileIdMap[FileName] = FId;
1426 SourceFileNames.push_back(FileName);
1427 }
1428
1429 DenseMap<std::pair<unsigned, unsigned>, unsigned>::iterator SI =
1430 SourceIdMap.find(std::make_pair(DId, FId));
1431 if (SI != SourceIdMap.end())
1432 return SI->second;
1433
1434 unsigned SrcId = SourceIds.size() + 1; // DW_AT_decl_file cannot be 0.
1435 SourceIdMap[std::make_pair(DId, FId)] = SrcId;
1436 SourceIds.push_back(std::make_pair(DId, FId));
1437
1438 return SrcId;
1439}
1440
Devang Patele4b27562009-08-28 23:24:31 +00001441void DwarfDebug::ConstructCompileUnit(MDNode *N) {
1442 DICompileUnit DIUnit(N);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001443 std::string Dir, FN, Prod;
1444 unsigned ID = GetOrCreateSourceID(DIUnit.getDirectory(Dir),
1445 DIUnit.getFilename(FN));
1446
1447 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
1448 AddSectionOffset(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4,
1449 DWLabel("section_line", 0), DWLabel("section_line", 0),
1450 false);
1451 AddString(Die, dwarf::DW_AT_producer, dwarf::DW_FORM_string,
1452 DIUnit.getProducer(Prod));
1453 AddUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data1,
1454 DIUnit.getLanguage());
1455 AddString(Die, dwarf::DW_AT_name, dwarf::DW_FORM_string, FN);
1456
1457 if (!Dir.empty())
1458 AddString(Die, dwarf::DW_AT_comp_dir, dwarf::DW_FORM_string, Dir);
1459 if (DIUnit.isOptimized())
1460 AddUInt(Die, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1);
1461
1462 std::string Flags;
1463 DIUnit.getFlags(Flags);
1464 if (!Flags.empty())
1465 AddString(Die, dwarf::DW_AT_APPLE_flags, dwarf::DW_FORM_string, Flags);
1466
1467 unsigned RVer = DIUnit.getRunTimeVersion();
1468 if (RVer)
1469 AddUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers,
1470 dwarf::DW_FORM_data1, RVer);
1471
1472 CompileUnit *Unit = new CompileUnit(ID, Die);
Devang Patel1dbc7712009-06-29 20:45:18 +00001473 if (!ModuleCU && DIUnit.isMain()) {
Devang Patel70f44262009-06-29 20:38:13 +00001474 // Use first compile unit marked as isMain as the compile unit
1475 // for this module.
Devang Patel1dbc7712009-06-29 20:45:18 +00001476 ModuleCU = Unit;
Devang Patel70f44262009-06-29 20:38:13 +00001477 }
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001478
Devang Patele4b27562009-08-28 23:24:31 +00001479 CompileUnitMap[DIUnit.getNode()] = Unit;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001480 CompileUnits.push_back(Unit);
1481}
1482
Devang Patele4b27562009-08-28 23:24:31 +00001483void DwarfDebug::ConstructGlobalVariableDIE(MDNode *N) {
1484 DIGlobalVariable DI_GV(N);
Devang Patel905cf5e2009-09-04 23:59:07 +00001485
1486 // If debug information is malformed then ignore it.
1487 if (DI_GV.Verify() == false)
1488 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001489
1490 // Check for pre-existence.
Devang Patele4b27562009-08-28 23:24:31 +00001491 DIE *&Slot = ModuleCU->getDieMapSlotFor(DI_GV.getNode());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001492 if (Slot)
Devang Patel13e16b62009-06-26 01:49:18 +00001493 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001494
Devang Patel1dbc7712009-06-29 20:45:18 +00001495 DIE *VariableDie = CreateGlobalVariableDIE(ModuleCU, DI_GV);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001496
1497 // Add address.
1498 DIEBlock *Block = new DIEBlock();
1499 AddUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
1500 std::string GLN;
1501 AddObjectLabel(Block, 0, dwarf::DW_FORM_udata,
1502 Asm->getGlobalLinkName(DI_GV.getGlobal(), GLN));
1503 AddBlock(VariableDie, dwarf::DW_AT_location, 0, Block);
1504
1505 // Add to map.
1506 Slot = VariableDie;
1507
1508 // Add to context owner.
Devang Patel1dbc7712009-06-29 20:45:18 +00001509 ModuleCU->getDie()->AddChild(VariableDie);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001510
1511 // Expose as global. FIXME - need to check external flag.
1512 std::string Name;
Devang Patel1dbc7712009-06-29 20:45:18 +00001513 ModuleCU->AddGlobal(DI_GV.getName(Name), VariableDie);
Devang Patel13e16b62009-06-26 01:49:18 +00001514 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001515}
1516
Devang Patele4b27562009-08-28 23:24:31 +00001517void DwarfDebug::ConstructSubprogram(MDNode *N) {
1518 DISubprogram SP(N);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001519
1520 // Check for pre-existence.
Devang Patele4b27562009-08-28 23:24:31 +00001521 DIE *&Slot = ModuleCU->getDieMapSlotFor(N);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001522 if (Slot)
Devang Patel13e16b62009-06-26 01:49:18 +00001523 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001524
1525 if (!SP.isDefinition())
1526 // This is a method declaration which will be handled while constructing
1527 // class type.
Devang Patel13e16b62009-06-26 01:49:18 +00001528 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001529
Devang Patel1dbc7712009-06-29 20:45:18 +00001530 DIE *SubprogramDie = CreateSubprogramDIE(ModuleCU, SP);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001531
1532 // Add to map.
1533 Slot = SubprogramDie;
1534
1535 // Add to context owner.
Devang Patel1dbc7712009-06-29 20:45:18 +00001536 ModuleCU->getDie()->AddChild(SubprogramDie);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001537
1538 // Expose as global.
1539 std::string Name;
Devang Patel1dbc7712009-06-29 20:45:18 +00001540 ModuleCU->AddGlobal(SP.getName(Name), SubprogramDie);
Devang Patel13e16b62009-06-26 01:49:18 +00001541 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001542}
1543
Devang Patel208622d2009-06-25 22:36:02 +00001544 /// BeginModule - Emit all Dwarf sections that should come prior to the
1545 /// content. Create global DIEs and emit initial debug info sections.
1546 /// This is inovked by the target AsmPrinter.
1547void DwarfDebug::BeginModule(Module *M, MachineModuleInfo *mmi) {
1548 this->M = M;
1549
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001550 if (TimePassesIsEnabled)
1551 DebugTimer->startTimer();
1552
Devang Patel78ab9e22009-07-30 18:56:46 +00001553 DebugInfoFinder DbgFinder;
1554 DbgFinder.processModule(*M);
Devang Patel13e16b62009-06-26 01:49:18 +00001555
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001556 // Create all the compile unit DIEs.
Devang Patel78ab9e22009-07-30 18:56:46 +00001557 for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
1558 E = DbgFinder.compile_unit_end(); I != E; ++I)
Devang Patel13e16b62009-06-26 01:49:18 +00001559 ConstructCompileUnit(*I);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001560
1561 if (CompileUnits.empty()) {
1562 if (TimePassesIsEnabled)
1563 DebugTimer->stopTimer();
1564
1565 return;
1566 }
1567
Devang Patel70f44262009-06-29 20:38:13 +00001568 // If main compile unit for this module is not seen than randomly
1569 // select first compile unit.
Devang Patel1dbc7712009-06-29 20:45:18 +00001570 if (!ModuleCU)
1571 ModuleCU = CompileUnits[0];
Devang Patel70f44262009-06-29 20:38:13 +00001572
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001573 // If there is not any debug info available for any global variables and any
1574 // subprograms then there is not any debug info to emit.
Devang Patel78ab9e22009-07-30 18:56:46 +00001575 if (DbgFinder.global_variable_count() == 0
1576 && DbgFinder.subprogram_count() == 0) {
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001577 if (TimePassesIsEnabled)
1578 DebugTimer->stopTimer();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001579 return;
1580 }
Devang Patel78ab9e22009-07-30 18:56:46 +00001581
Devang Patel13e16b62009-06-26 01:49:18 +00001582 // Create DIEs for each of the externally visible global variables.
Devang Patel78ab9e22009-07-30 18:56:46 +00001583 for (DebugInfoFinder::iterator I = DbgFinder.global_variable_begin(),
1584 E = DbgFinder.global_variable_end(); I != E; ++I)
Devang Patel13e16b62009-06-26 01:49:18 +00001585 ConstructGlobalVariableDIE(*I);
1586
1587 // Create DIEs for each of the externally visible subprograms.
Devang Patel78ab9e22009-07-30 18:56:46 +00001588 for (DebugInfoFinder::iterator I = DbgFinder.subprogram_begin(),
1589 E = DbgFinder.subprogram_end(); I != E; ++I)
Devang Patel13e16b62009-06-26 01:49:18 +00001590 ConstructSubprogram(*I);
1591
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001592 MMI = mmi;
1593 shouldEmit = true;
1594 MMI->setDebugInfoAvailability(true);
1595
1596 // Prime section data.
Chris Lattnerf0144122009-07-28 03:13:23 +00001597 SectionMap.insert(Asm->getObjFileLowering().getTextSection());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001598
1599 // Print out .file directives to specify files for .loc directives. These are
1600 // printed out early so that they precede any .loc directives.
Chris Lattner33adcfb2009-08-22 21:43:10 +00001601 if (MAI->hasDotLocAndDotFile()) {
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001602 for (unsigned i = 1, e = getNumSourceIds()+1; i != e; ++i) {
1603 // Remember source id starts at 1.
1604 std::pair<unsigned, unsigned> Id = getSourceDirectoryAndFileIds(i);
1605 sys::Path FullPath(getSourceDirectoryName(Id.first));
1606 bool AppendOk =
1607 FullPath.appendComponent(getSourceFileName(Id.second));
1608 assert(AppendOk && "Could not append filename to directory!");
1609 AppendOk = false;
Chris Lattner74382b72009-08-23 22:45:37 +00001610 Asm->EmitFile(i, FullPath.str());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001611 Asm->EOL();
1612 }
1613 }
1614
1615 // Emit initial sections
1616 EmitInitial();
1617
1618 if (TimePassesIsEnabled)
1619 DebugTimer->stopTimer();
1620}
1621
1622/// EndModule - Emit all Dwarf sections that should come after the content.
1623///
1624void DwarfDebug::EndModule() {
1625 if (!ShouldEmitDwarfDebug())
1626 return;
1627
1628 if (TimePassesIsEnabled)
1629 DebugTimer->startTimer();
1630
1631 // Standard sections final addresses.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00001632 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getTextSection());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001633 EmitLabel("text_end", 0);
Chris Lattner6c2f9e12009-08-19 05:49:37 +00001634 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getDataSection());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001635 EmitLabel("data_end", 0);
1636
1637 // End text sections.
1638 for (unsigned i = 1, N = SectionMap.size(); i <= N; ++i) {
Chris Lattner6c2f9e12009-08-19 05:49:37 +00001639 Asm->OutStreamer.SwitchSection(SectionMap[i]);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001640 EmitLabel("section_end", i);
1641 }
1642
1643 // Emit common frame information.
1644 EmitCommonDebugFrame();
1645
1646 // Emit function debug frame information
1647 for (std::vector<FunctionDebugFrameInfo>::iterator I = DebugFrames.begin(),
1648 E = DebugFrames.end(); I != E; ++I)
1649 EmitFunctionDebugFrame(*I);
1650
1651 // Compute DIE offsets and sizes.
1652 SizeAndOffsets();
1653
1654 // Emit all the DIEs into a debug info section
1655 EmitDebugInfo();
1656
1657 // Corresponding abbreviations into a abbrev section.
1658 EmitAbbreviations();
1659
1660 // Emit source line correspondence into a debug line section.
1661 EmitDebugLines();
1662
1663 // Emit info into a debug pubnames section.
1664 EmitDebugPubNames();
1665
1666 // Emit info into a debug str section.
1667 EmitDebugStr();
1668
1669 // Emit info into a debug loc section.
1670 EmitDebugLoc();
1671
1672 // Emit info into a debug aranges section.
1673 EmitDebugARanges();
1674
1675 // Emit info into a debug ranges section.
1676 EmitDebugRanges();
1677
1678 // Emit info into a debug macinfo section.
1679 EmitDebugMacInfo();
1680
1681 // Emit inline info.
1682 EmitDebugInlineInfo();
1683
1684 if (TimePassesIsEnabled)
1685 DebugTimer->stopTimer();
1686}
1687
1688/// BeginFunction - Gather pre-function debug information. Assumes being
1689/// emitted immediately after the function entry point.
1690void DwarfDebug::BeginFunction(MachineFunction *MF) {
1691 this->MF = MF;
1692
1693 if (!ShouldEmitDwarfDebug()) return;
1694
1695 if (TimePassesIsEnabled)
1696 DebugTimer->startTimer();
1697
1698 // Begin accumulating function debug information.
1699 MMI->BeginFunction(MF);
1700
1701 // Assumes in correct section after the entry point.
1702 EmitLabel("func_begin", ++SubprogramCount);
1703
1704 // Emit label for the implicitly defined dbg.stoppoint at the start of the
1705 // function.
1706 DebugLoc FDL = MF->getDefaultDebugLoc();
1707 if (!FDL.isUnknown()) {
1708 DebugLocTuple DLT = MF->getDebugLocTuple(FDL);
1709 unsigned LabelID = RecordSourceLine(DLT.Line, DLT.Col,
1710 DICompileUnit(DLT.CompileUnit));
1711 Asm->printLabel(LabelID);
1712 }
1713
1714 if (TimePassesIsEnabled)
1715 DebugTimer->stopTimer();
1716}
1717
1718/// EndFunction - Gather and emit post-function debug information.
1719///
1720void DwarfDebug::EndFunction(MachineFunction *MF) {
1721 if (!ShouldEmitDwarfDebug()) return;
1722
1723 if (TimePassesIsEnabled)
1724 DebugTimer->startTimer();
1725
1726 // Define end label for subprogram.
1727 EmitLabel("func_end", SubprogramCount);
1728
1729 // Get function line info.
1730 if (!Lines.empty()) {
1731 // Get section line info.
Chris Lattner290c2f52009-08-03 23:20:21 +00001732 unsigned ID = SectionMap.insert(Asm->getCurrentSection());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001733 if (SectionSourceLines.size() < ID) SectionSourceLines.resize(ID);
1734 std::vector<SrcLineInfo> &SectionLineInfos = SectionSourceLines[ID-1];
1735 // Append the function info to section info.
1736 SectionLineInfos.insert(SectionLineInfos.end(),
1737 Lines.begin(), Lines.end());
1738 }
1739
1740 // Construct the DbgScope for abstract instances.
1741 for (SmallVector<DbgScope *, 32>::iterator
1742 I = AbstractInstanceRootList.begin(),
1743 E = AbstractInstanceRootList.end(); I != E; ++I)
Bill Wendling17956162009-05-20 23:28:48 +00001744 ConstructFunctionDbgScope(*I);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001745
1746 // Construct scopes for subprogram.
1747 if (FunctionDbgScope)
1748 ConstructFunctionDbgScope(FunctionDbgScope);
1749 else
1750 // FIXME: This is wrong. We are essentially getting past a problem with
1751 // debug information not being able to handle unreachable blocks that have
1752 // debug information in them. In particular, those unreachable blocks that
1753 // have "region end" info in them. That situation results in the "root
1754 // scope" not being created. If that's the case, then emit a "default"
1755 // scope, i.e., one that encompasses the whole function. This isn't
1756 // desirable. And a better way of handling this (and all of the debugging
1757 // information) needs to be explored.
1758 ConstructDefaultDbgScope(MF);
1759
1760 DebugFrames.push_back(FunctionDebugFrameInfo(SubprogramCount,
1761 MMI->getFrameMoves()));
1762
1763 // Clear debug info
1764 if (FunctionDbgScope) {
1765 delete FunctionDbgScope;
1766 DbgScopeMap.clear();
1767 DbgAbstractScopeMap.clear();
1768 DbgConcreteScopeMap.clear();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001769 FunctionDbgScope = NULL;
1770 LexicalScopeStack.clear();
1771 AbstractInstanceRootList.clear();
Devang Patel9217f792009-06-12 19:24:05 +00001772 AbstractInstanceRootMap.clear();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001773 }
1774
1775 Lines.clear();
1776
1777 if (TimePassesIsEnabled)
1778 DebugTimer->stopTimer();
1779}
1780
1781/// RecordSourceLine - Records location information and associates it with a
1782/// label. Returns a unique label ID used to generate a label and provide
1783/// correspondence to the source line list.
1784unsigned DwarfDebug::RecordSourceLine(Value *V, unsigned Line, unsigned Col) {
1785 if (TimePassesIsEnabled)
1786 DebugTimer->startTimer();
1787
1788 CompileUnit *Unit = CompileUnitMap[V];
1789 assert(Unit && "Unable to find CompileUnit");
1790 unsigned ID = MMI->NextLabelID();
1791 Lines.push_back(SrcLineInfo(Line, Col, Unit->getID(), ID));
1792
1793 if (TimePassesIsEnabled)
1794 DebugTimer->stopTimer();
1795
1796 return ID;
1797}
1798
1799/// RecordSourceLine - Records location information and associates it with a
1800/// label. Returns a unique label ID used to generate a label and provide
1801/// correspondence to the source line list.
1802unsigned DwarfDebug::RecordSourceLine(unsigned Line, unsigned Col,
1803 DICompileUnit CU) {
Devang Patele4b27562009-08-28 23:24:31 +00001804 if (!MMI)
1805 return 0;
1806
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001807 if (TimePassesIsEnabled)
1808 DebugTimer->startTimer();
1809
1810 std::string Dir, Fn;
1811 unsigned Src = GetOrCreateSourceID(CU.getDirectory(Dir),
1812 CU.getFilename(Fn));
1813 unsigned ID = MMI->NextLabelID();
1814 Lines.push_back(SrcLineInfo(Line, Col, Src, ID));
1815
1816 if (TimePassesIsEnabled)
1817 DebugTimer->stopTimer();
1818
1819 return ID;
1820}
1821
1822/// getOrCreateSourceID - Public version of GetOrCreateSourceID. This can be
1823/// timed. Look up the source id with the given directory and source file
1824/// names. If none currently exists, create a new id and insert it in the
1825/// SourceIds map. This can update DirectoryNames and SourceFileNames maps as
1826/// well.
1827unsigned DwarfDebug::getOrCreateSourceID(const std::string &DirName,
1828 const std::string &FileName) {
1829 if (TimePassesIsEnabled)
1830 DebugTimer->startTimer();
1831
1832 unsigned SrcId = GetOrCreateSourceID(DirName, FileName);
1833
1834 if (TimePassesIsEnabled)
1835 DebugTimer->stopTimer();
1836
1837 return SrcId;
1838}
1839
1840/// RecordRegionStart - Indicate the start of a region.
Devang Patele4b27562009-08-28 23:24:31 +00001841unsigned DwarfDebug::RecordRegionStart(MDNode *N) {
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001842 if (TimePassesIsEnabled)
1843 DebugTimer->startTimer();
1844
Devang Patele4b27562009-08-28 23:24:31 +00001845 DbgScope *Scope = getOrCreateScope(N);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001846 unsigned ID = MMI->NextLabelID();
1847 if (!Scope->getStartLabelID()) Scope->setStartLabelID(ID);
1848 LexicalScopeStack.push_back(Scope);
1849
1850 if (TimePassesIsEnabled)
1851 DebugTimer->stopTimer();
1852
1853 return ID;
1854}
1855
1856/// RecordRegionEnd - Indicate the end of a region.
Devang Patele4b27562009-08-28 23:24:31 +00001857unsigned DwarfDebug::RecordRegionEnd(MDNode *N) {
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001858 if (TimePassesIsEnabled)
1859 DebugTimer->startTimer();
1860
Devang Patele4b27562009-08-28 23:24:31 +00001861 DbgScope *Scope = getOrCreateScope(N);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001862 unsigned ID = MMI->NextLabelID();
1863 Scope->setEndLabelID(ID);
Devang Pateldaf9e022009-06-13 02:16:18 +00001864 // FIXME : region.end() may not be in the last basic block.
1865 // For now, do not pop last lexical scope because next basic
1866 // block may start new inlined function's body.
1867 unsigned LSSize = LexicalScopeStack.size();
1868 if (LSSize != 0 && LSSize != 1)
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001869 LexicalScopeStack.pop_back();
1870
1871 if (TimePassesIsEnabled)
1872 DebugTimer->stopTimer();
1873
1874 return ID;
1875}
1876
1877/// RecordVariable - Indicate the declaration of a local variable.
Devang Patele4b27562009-08-28 23:24:31 +00001878void DwarfDebug::RecordVariable(MDNode *N, unsigned FrameIndex) {
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001879 if (TimePassesIsEnabled)
1880 DebugTimer->startTimer();
1881
Devang Patele4b27562009-08-28 23:24:31 +00001882 DIDescriptor Desc(N);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001883 DbgScope *Scope = NULL;
1884 bool InlinedFnVar = false;
1885
Devang Patele4b27562009-08-28 23:24:31 +00001886 if (Desc.getTag() == dwarf::DW_TAG_variable)
1887 Scope = getOrCreateScope(DIGlobalVariable(N).getContext().getNode());
1888 else {
Devang Patel24f20e02009-08-22 17:12:53 +00001889 bool InlinedVar = false;
Devang Patele4b27562009-08-28 23:24:31 +00001890 MDNode *Context = DIVariable(N).getContext().getNode();
1891 DISubprogram SP(Context);
Devang Patel24f20e02009-08-22 17:12:53 +00001892 if (!SP.isNull()) {
1893 // SP is inserted into DbgAbstractScopeMap when inlined function
1894 // start was recorded by RecordInlineFnStart.
Devang Patele4b27562009-08-28 23:24:31 +00001895 DenseMap<MDNode *, DbgScope *>::iterator
1896 I = DbgAbstractScopeMap.find(SP.getNode());
Devang Patel24f20e02009-08-22 17:12:53 +00001897 if (I != DbgAbstractScopeMap.end()) {
1898 InlinedVar = true;
1899 Scope = I->second;
1900 }
1901 }
Devang Patele4b27562009-08-28 23:24:31 +00001902 if (!InlinedVar)
1903 Scope = getOrCreateScope(Context);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001904 }
1905
1906 assert(Scope && "Unable to find the variable's scope");
Devang Patele4b27562009-08-28 23:24:31 +00001907 DbgVariable *DV = new DbgVariable(DIVariable(N), FrameIndex, InlinedFnVar);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001908 Scope->AddVariable(DV);
1909
1910 if (TimePassesIsEnabled)
1911 DebugTimer->stopTimer();
1912}
1913
1914//// RecordInlinedFnStart - Indicate the start of inlined subroutine.
1915unsigned DwarfDebug::RecordInlinedFnStart(DISubprogram &SP, DICompileUnit CU,
1916 unsigned Line, unsigned Col) {
1917 unsigned LabelID = MMI->NextLabelID();
1918
Chris Lattner33adcfb2009-08-22 21:43:10 +00001919 if (!MAI->doesDwarfUsesInlineInfoSection())
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001920 return LabelID;
1921
1922 if (TimePassesIsEnabled)
1923 DebugTimer->startTimer();
1924
Devang Patele4b27562009-08-28 23:24:31 +00001925 MDNode *Node = SP.getNode();
1926 DenseMap<const MDNode *, DbgScope *>::iterator
1927 II = AbstractInstanceRootMap.find(Node);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001928
1929 if (II == AbstractInstanceRootMap.end()) {
1930 // Create an abstract instance entry for this inlined function if it doesn't
1931 // already exist.
Devang Patele4b27562009-08-28 23:24:31 +00001932 DbgScope *Scope = new DbgScope(NULL, DIDescriptor(Node));
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001933
1934 // Get the compile unit context.
Devang Patele4b27562009-08-28 23:24:31 +00001935 DIE *SPDie = ModuleCU->getDieMapSlotFor(Node);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001936 if (!SPDie)
Devang Patel1dbc7712009-06-29 20:45:18 +00001937 SPDie = CreateSubprogramDIE(ModuleCU, SP, false, true);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001938
1939 // Mark as being inlined. This makes this subprogram entry an abstract
1940 // instance root.
1941 // FIXME: Our debugger doesn't care about the value of DW_AT_inline, only
1942 // that it's defined. That probably won't change in the future. However,
1943 // this could be more elegant.
1944 AddUInt(SPDie, dwarf::DW_AT_inline, 0, dwarf::DW_INL_declared_not_inlined);
1945
1946 // Keep track of the abstract scope for this function.
Devang Patele4b27562009-08-28 23:24:31 +00001947 DbgAbstractScopeMap[Node] = Scope;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001948
Devang Patele4b27562009-08-28 23:24:31 +00001949 AbstractInstanceRootMap[Node] = Scope;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001950 AbstractInstanceRootList.push_back(Scope);
1951 }
1952
1953 // Create a concrete inlined instance for this inlined function.
Devang Patele4b27562009-08-28 23:24:31 +00001954 DbgConcreteScope *ConcreteScope = new DbgConcreteScope(DIDescriptor(Node));
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001955 DIE *ScopeDie = new DIE(dwarf::DW_TAG_inlined_subroutine);
Devang Patel1dbc7712009-06-29 20:45:18 +00001956 ScopeDie->setAbstractCompileUnit(ModuleCU);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001957
Devang Patele4b27562009-08-28 23:24:31 +00001958 DIE *Origin = ModuleCU->getDieMapSlotFor(Node);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001959 AddDIEEntry(ScopeDie, dwarf::DW_AT_abstract_origin,
1960 dwarf::DW_FORM_ref4, Origin);
Devang Patel1dbc7712009-06-29 20:45:18 +00001961 AddUInt(ScopeDie, dwarf::DW_AT_call_file, 0, ModuleCU->getID());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001962 AddUInt(ScopeDie, dwarf::DW_AT_call_line, 0, Line);
1963 AddUInt(ScopeDie, dwarf::DW_AT_call_column, 0, Col);
1964
1965 ConcreteScope->setDie(ScopeDie);
1966 ConcreteScope->setStartLabelID(LabelID);
1967 MMI->RecordUsedDbgLabel(LabelID);
1968
1969 LexicalScopeStack.back()->AddConcreteInst(ConcreteScope);
1970
1971 // Keep track of the concrete scope that's inlined into this function.
Devang Patele4b27562009-08-28 23:24:31 +00001972 DenseMap<MDNode *, SmallVector<DbgScope *, 8> >::iterator
1973 SI = DbgConcreteScopeMap.find(Node);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001974
1975 if (SI == DbgConcreteScopeMap.end())
Devang Patele4b27562009-08-28 23:24:31 +00001976 DbgConcreteScopeMap[Node].push_back(ConcreteScope);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001977 else
1978 SI->second.push_back(ConcreteScope);
1979
1980 // Track the start label for this inlined function.
Devang Patele4b27562009-08-28 23:24:31 +00001981 DenseMap<MDNode *, SmallVector<unsigned, 4> >::iterator
1982 I = InlineInfo.find(Node);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001983
1984 if (I == InlineInfo.end())
Devang Patele4b27562009-08-28 23:24:31 +00001985 InlineInfo[Node].push_back(LabelID);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001986 else
1987 I->second.push_back(LabelID);
1988
1989 if (TimePassesIsEnabled)
1990 DebugTimer->stopTimer();
1991
1992 return LabelID;
1993}
1994
1995/// RecordInlinedFnEnd - Indicate the end of inlined subroutine.
1996unsigned DwarfDebug::RecordInlinedFnEnd(DISubprogram &SP) {
Chris Lattner33adcfb2009-08-22 21:43:10 +00001997 if (!MAI->doesDwarfUsesInlineInfoSection())
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001998 return 0;
1999
2000 if (TimePassesIsEnabled)
2001 DebugTimer->startTimer();
2002
Devang Patele4b27562009-08-28 23:24:31 +00002003 MDNode *Node = SP.getNode();
2004 DenseMap<MDNode *, SmallVector<DbgScope *, 8> >::iterator
2005 I = DbgConcreteScopeMap.find(Node);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002006
2007 if (I == DbgConcreteScopeMap.end()) {
2008 // FIXME: Can this situation actually happen? And if so, should it?
2009 if (TimePassesIsEnabled)
2010 DebugTimer->stopTimer();
2011
2012 return 0;
2013 }
2014
2015 SmallVector<DbgScope *, 8> &Scopes = I->second;
Devang Patel11a407f2009-06-15 21:45:50 +00002016 if (Scopes.empty()) {
2017 // Returned ID is 0 if this is unbalanced "end of inlined
2018 // scope". This could happen if optimizer eats dbg intrinsics
2019 // or "beginning of inlined scope" is not recoginized due to
2020 // missing location info. In such cases, ignore this region.end.
2021 return 0;
2022 }
2023
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002024 DbgScope *Scope = Scopes.back(); Scopes.pop_back();
2025 unsigned ID = MMI->NextLabelID();
2026 MMI->RecordUsedDbgLabel(ID);
2027 Scope->setEndLabelID(ID);
2028
2029 if (TimePassesIsEnabled)
2030 DebugTimer->stopTimer();
2031
2032 return ID;
2033}
2034
Bill Wendling829e67b2009-05-20 23:22:40 +00002035//===----------------------------------------------------------------------===//
2036// Emit Methods
2037//===----------------------------------------------------------------------===//
2038
Bill Wendling94d04b82009-05-20 23:21:38 +00002039/// SizeAndOffsetDie - Compute the size and offset of a DIE.
2040///
2041unsigned DwarfDebug::SizeAndOffsetDie(DIE *Die, unsigned Offset, bool Last) {
2042 // Get the children.
2043 const std::vector<DIE *> &Children = Die->getChildren();
2044
2045 // If not last sibling and has children then add sibling offset attribute.
2046 if (!Last && !Children.empty()) Die->AddSiblingOffset();
2047
2048 // Record the abbreviation.
2049 AssignAbbrevNumber(Die->getAbbrev());
2050
2051 // Get the abbreviation for this DIE.
2052 unsigned AbbrevNumber = Die->getAbbrevNumber();
2053 const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2054
2055 // Set DIE offset
2056 Die->setOffset(Offset);
2057
2058 // Start the size with the size of abbreviation code.
Chris Lattneraf76e592009-08-22 20:48:53 +00002059 Offset += MCAsmInfo::getULEB128Size(AbbrevNumber);
Bill Wendling94d04b82009-05-20 23:21:38 +00002060
2061 const SmallVector<DIEValue*, 32> &Values = Die->getValues();
2062 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
2063
2064 // Size the DIE attribute values.
2065 for (unsigned i = 0, N = Values.size(); i < N; ++i)
2066 // Size attribute value.
2067 Offset += Values[i]->SizeOf(TD, AbbrevData[i].getForm());
2068
2069 // Size the DIE children if any.
2070 if (!Children.empty()) {
2071 assert(Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes &&
2072 "Children flag not set");
2073
2074 for (unsigned j = 0, M = Children.size(); j < M; ++j)
2075 Offset = SizeAndOffsetDie(Children[j], Offset, (j + 1) == M);
2076
2077 // End of children marker.
2078 Offset += sizeof(int8_t);
2079 }
2080
2081 Die->setSize(Offset - Die->getOffset());
2082 return Offset;
2083}
2084
2085/// SizeAndOffsets - Compute the size and offset of all the DIEs.
2086///
2087void DwarfDebug::SizeAndOffsets() {
2088 // Compute size of compile unit header.
2089 static unsigned Offset =
2090 sizeof(int32_t) + // Length of Compilation Unit Info
2091 sizeof(int16_t) + // DWARF version number
2092 sizeof(int32_t) + // Offset Into Abbrev. Section
2093 sizeof(int8_t); // Pointer Size (in bytes)
2094
Devang Patel1dbc7712009-06-29 20:45:18 +00002095 SizeAndOffsetDie(ModuleCU->getDie(), Offset, true);
2096 CompileUnitOffsets[ModuleCU] = 0;
Bill Wendling94d04b82009-05-20 23:21:38 +00002097}
2098
2099/// EmitInitial - Emit initial Dwarf declarations. This is necessary for cc
2100/// tools to recognize the object file contains Dwarf information.
2101void DwarfDebug::EmitInitial() {
2102 // Check to see if we already emitted intial headers.
2103 if (didInitial) return;
2104 didInitial = true;
2105
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002106 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
2107
Bill Wendling94d04b82009-05-20 23:21:38 +00002108 // Dwarf sections base addresses.
Chris Lattner33adcfb2009-08-22 21:43:10 +00002109 if (MAI->doesDwarfRequireFrameSection()) {
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002110 Asm->OutStreamer.SwitchSection(TLOF.getDwarfFrameSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002111 EmitLabel("section_debug_frame", 0);
2112 }
2113
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002114 Asm->OutStreamer.SwitchSection(TLOF.getDwarfInfoSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002115 EmitLabel("section_info", 0);
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002116 Asm->OutStreamer.SwitchSection(TLOF.getDwarfAbbrevSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002117 EmitLabel("section_abbrev", 0);
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002118 Asm->OutStreamer.SwitchSection(TLOF.getDwarfARangesSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002119 EmitLabel("section_aranges", 0);
2120
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002121 if (const MCSection *LineInfoDirective = TLOF.getDwarfMacroInfoSection()) {
2122 Asm->OutStreamer.SwitchSection(LineInfoDirective);
Bill Wendling94d04b82009-05-20 23:21:38 +00002123 EmitLabel("section_macinfo", 0);
2124 }
2125
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002126 Asm->OutStreamer.SwitchSection(TLOF.getDwarfLineSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002127 EmitLabel("section_line", 0);
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002128 Asm->OutStreamer.SwitchSection(TLOF.getDwarfLocSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002129 EmitLabel("section_loc", 0);
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002130 Asm->OutStreamer.SwitchSection(TLOF.getDwarfPubNamesSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002131 EmitLabel("section_pubnames", 0);
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002132 Asm->OutStreamer.SwitchSection(TLOF.getDwarfStrSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002133 EmitLabel("section_str", 0);
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002134 Asm->OutStreamer.SwitchSection(TLOF.getDwarfRangesSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002135 EmitLabel("section_ranges", 0);
2136
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002137 Asm->OutStreamer.SwitchSection(TLOF.getTextSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002138 EmitLabel("text_begin", 0);
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002139 Asm->OutStreamer.SwitchSection(TLOF.getDataSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002140 EmitLabel("data_begin", 0);
2141}
2142
2143/// EmitDIE - Recusively Emits a debug information entry.
2144///
2145void DwarfDebug::EmitDIE(DIE *Die) {
2146 // Get the abbreviation for this DIE.
2147 unsigned AbbrevNumber = Die->getAbbrevNumber();
2148 const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2149
2150 Asm->EOL();
2151
2152 // Emit the code (index) for the abbreviation.
2153 Asm->EmitULEB128Bytes(AbbrevNumber);
2154
2155 if (Asm->isVerbose())
2156 Asm->EOL(std::string("Abbrev [" +
2157 utostr(AbbrevNumber) +
2158 "] 0x" + utohexstr(Die->getOffset()) +
2159 ":0x" + utohexstr(Die->getSize()) + " " +
2160 dwarf::TagString(Abbrev->getTag())));
2161 else
2162 Asm->EOL();
2163
2164 SmallVector<DIEValue*, 32> &Values = Die->getValues();
2165 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
2166
2167 // Emit the DIE attribute values.
2168 for (unsigned i = 0, N = Values.size(); i < N; ++i) {
2169 unsigned Attr = AbbrevData[i].getAttribute();
2170 unsigned Form = AbbrevData[i].getForm();
2171 assert(Form && "Too many attributes for DIE (check abbreviation)");
2172
2173 switch (Attr) {
2174 case dwarf::DW_AT_sibling:
2175 Asm->EmitInt32(Die->SiblingOffset());
2176 break;
2177 case dwarf::DW_AT_abstract_origin: {
2178 DIEEntry *E = cast<DIEEntry>(Values[i]);
2179 DIE *Origin = E->getEntry();
2180 unsigned Addr =
2181 CompileUnitOffsets[Die->getAbstractCompileUnit()] +
2182 Origin->getOffset();
2183
2184 Asm->EmitInt32(Addr);
2185 break;
2186 }
2187 default:
2188 // Emit an attribute using the defined form.
2189 Values[i]->EmitValue(this, Form);
2190 break;
2191 }
2192
2193 Asm->EOL(dwarf::AttributeString(Attr));
2194 }
2195
2196 // Emit the DIE children if any.
2197 if (Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes) {
2198 const std::vector<DIE *> &Children = Die->getChildren();
2199
2200 for (unsigned j = 0, M = Children.size(); j < M; ++j)
2201 EmitDIE(Children[j]);
2202
2203 Asm->EmitInt8(0); Asm->EOL("End Of Children Mark");
2204 }
2205}
2206
2207/// EmitDebugInfo / EmitDebugInfoPerCU - Emit the debug info section.
2208///
2209void DwarfDebug::EmitDebugInfoPerCU(CompileUnit *Unit) {
2210 DIE *Die = Unit->getDie();
2211
2212 // Emit the compile units header.
2213 EmitLabel("info_begin", Unit->getID());
2214
2215 // Emit size of content not including length itself
2216 unsigned ContentSize = Die->getSize() +
2217 sizeof(int16_t) + // DWARF version number
2218 sizeof(int32_t) + // Offset Into Abbrev. Section
2219 sizeof(int8_t) + // Pointer Size (in bytes)
2220 sizeof(int32_t); // FIXME - extra pad for gdb bug.
2221
2222 Asm->EmitInt32(ContentSize); Asm->EOL("Length of Compilation Unit Info");
2223 Asm->EmitInt16(dwarf::DWARF_VERSION); Asm->EOL("DWARF version number");
2224 EmitSectionOffset("abbrev_begin", "section_abbrev", 0, 0, true, false);
2225 Asm->EOL("Offset Into Abbrev. Section");
2226 Asm->EmitInt8(TD->getPointerSize()); Asm->EOL("Address Size (in bytes)");
2227
2228 EmitDIE(Die);
2229 // FIXME - extra padding for gdb bug.
2230 Asm->EmitInt8(0); Asm->EOL("Extra Pad For GDB");
2231 Asm->EmitInt8(0); Asm->EOL("Extra Pad For GDB");
2232 Asm->EmitInt8(0); Asm->EOL("Extra Pad For GDB");
2233 Asm->EmitInt8(0); Asm->EOL("Extra Pad For GDB");
2234 EmitLabel("info_end", Unit->getID());
2235
2236 Asm->EOL();
2237}
2238
2239void DwarfDebug::EmitDebugInfo() {
2240 // Start debug info section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002241 Asm->OutStreamer.SwitchSection(
2242 Asm->getObjFileLowering().getDwarfInfoSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002243
Devang Patel1dbc7712009-06-29 20:45:18 +00002244 EmitDebugInfoPerCU(ModuleCU);
Bill Wendling94d04b82009-05-20 23:21:38 +00002245}
2246
2247/// EmitAbbreviations - Emit the abbreviation section.
2248///
2249void DwarfDebug::EmitAbbreviations() const {
2250 // Check to see if it is worth the effort.
2251 if (!Abbreviations.empty()) {
2252 // Start the debug abbrev section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002253 Asm->OutStreamer.SwitchSection(
2254 Asm->getObjFileLowering().getDwarfAbbrevSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002255
2256 EmitLabel("abbrev_begin", 0);
2257
2258 // For each abbrevation.
2259 for (unsigned i = 0, N = Abbreviations.size(); i < N; ++i) {
2260 // Get abbreviation data
2261 const DIEAbbrev *Abbrev = Abbreviations[i];
2262
2263 // Emit the abbrevations code (base 1 index.)
2264 Asm->EmitULEB128Bytes(Abbrev->getNumber());
2265 Asm->EOL("Abbreviation Code");
2266
2267 // Emit the abbreviations data.
2268 Abbrev->Emit(Asm);
2269
2270 Asm->EOL();
2271 }
2272
2273 // Mark end of abbreviations.
2274 Asm->EmitULEB128Bytes(0); Asm->EOL("EOM(3)");
2275
2276 EmitLabel("abbrev_end", 0);
2277 Asm->EOL();
2278 }
2279}
2280
2281/// EmitEndOfLineMatrix - Emit the last address of the section and the end of
2282/// the line matrix.
2283///
2284void DwarfDebug::EmitEndOfLineMatrix(unsigned SectionEnd) {
2285 // Define last address of section.
2286 Asm->EmitInt8(0); Asm->EOL("Extended Op");
2287 Asm->EmitInt8(TD->getPointerSize() + 1); Asm->EOL("Op size");
2288 Asm->EmitInt8(dwarf::DW_LNE_set_address); Asm->EOL("DW_LNE_set_address");
2289 EmitReference("section_end", SectionEnd); Asm->EOL("Section end label");
2290
2291 // Mark end of matrix.
2292 Asm->EmitInt8(0); Asm->EOL("DW_LNE_end_sequence");
2293 Asm->EmitULEB128Bytes(1); Asm->EOL();
2294 Asm->EmitInt8(1); Asm->EOL();
2295}
2296
2297/// EmitDebugLines - Emit source line information.
2298///
2299void DwarfDebug::EmitDebugLines() {
2300 // If the target is using .loc/.file, the assembler will be emitting the
2301 // .debug_line table automatically.
Chris Lattner33adcfb2009-08-22 21:43:10 +00002302 if (MAI->hasDotLocAndDotFile())
Bill Wendling94d04b82009-05-20 23:21:38 +00002303 return;
2304
2305 // Minimum line delta, thus ranging from -10..(255-10).
2306 const int MinLineDelta = -(dwarf::DW_LNS_fixed_advance_pc + 1);
2307 // Maximum line delta, thus ranging from -10..(255-10).
2308 const int MaxLineDelta = 255 + MinLineDelta;
2309
2310 // Start the dwarf line section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002311 Asm->OutStreamer.SwitchSection(
2312 Asm->getObjFileLowering().getDwarfLineSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002313
2314 // Construct the section header.
2315 EmitDifference("line_end", 0, "line_begin", 0, true);
2316 Asm->EOL("Length of Source Line Info");
2317 EmitLabel("line_begin", 0);
2318
2319 Asm->EmitInt16(dwarf::DWARF_VERSION); Asm->EOL("DWARF version number");
2320
2321 EmitDifference("line_prolog_end", 0, "line_prolog_begin", 0, true);
2322 Asm->EOL("Prolog Length");
2323 EmitLabel("line_prolog_begin", 0);
2324
2325 Asm->EmitInt8(1); Asm->EOL("Minimum Instruction Length");
2326
2327 Asm->EmitInt8(1); Asm->EOL("Default is_stmt_start flag");
2328
2329 Asm->EmitInt8(MinLineDelta); Asm->EOL("Line Base Value (Special Opcodes)");
2330
2331 Asm->EmitInt8(MaxLineDelta); Asm->EOL("Line Range Value (Special Opcodes)");
2332
2333 Asm->EmitInt8(-MinLineDelta); Asm->EOL("Special Opcode Base");
2334
2335 // Line number standard opcode encodings argument count
2336 Asm->EmitInt8(0); Asm->EOL("DW_LNS_copy arg count");
2337 Asm->EmitInt8(1); Asm->EOL("DW_LNS_advance_pc arg count");
2338 Asm->EmitInt8(1); Asm->EOL("DW_LNS_advance_line arg count");
2339 Asm->EmitInt8(1); Asm->EOL("DW_LNS_set_file arg count");
2340 Asm->EmitInt8(1); Asm->EOL("DW_LNS_set_column arg count");
2341 Asm->EmitInt8(0); Asm->EOL("DW_LNS_negate_stmt arg count");
2342 Asm->EmitInt8(0); Asm->EOL("DW_LNS_set_basic_block arg count");
2343 Asm->EmitInt8(0); Asm->EOL("DW_LNS_const_add_pc arg count");
2344 Asm->EmitInt8(1); Asm->EOL("DW_LNS_fixed_advance_pc arg count");
2345
2346 // Emit directories.
2347 for (unsigned DI = 1, DE = getNumSourceDirectories()+1; DI != DE; ++DI) {
2348 Asm->EmitString(getSourceDirectoryName(DI));
2349 Asm->EOL("Directory");
2350 }
2351
2352 Asm->EmitInt8(0); Asm->EOL("End of directories");
2353
2354 // Emit files.
2355 for (unsigned SI = 1, SE = getNumSourceIds()+1; SI != SE; ++SI) {
2356 // Remember source id starts at 1.
2357 std::pair<unsigned, unsigned> Id = getSourceDirectoryAndFileIds(SI);
2358 Asm->EmitString(getSourceFileName(Id.second));
2359 Asm->EOL("Source");
2360 Asm->EmitULEB128Bytes(Id.first);
2361 Asm->EOL("Directory #");
2362 Asm->EmitULEB128Bytes(0);
2363 Asm->EOL("Mod date");
2364 Asm->EmitULEB128Bytes(0);
2365 Asm->EOL("File size");
2366 }
2367
2368 Asm->EmitInt8(0); Asm->EOL("End of files");
2369
2370 EmitLabel("line_prolog_end", 0);
2371
2372 // A sequence for each text section.
2373 unsigned SecSrcLinesSize = SectionSourceLines.size();
2374
2375 for (unsigned j = 0; j < SecSrcLinesSize; ++j) {
2376 // Isolate current sections line info.
2377 const std::vector<SrcLineInfo> &LineInfos = SectionSourceLines[j];
2378
Chris Lattner93b6db32009-08-08 23:39:42 +00002379 /*if (Asm->isVerbose()) {
Chris Lattnera87dea42009-07-31 18:48:30 +00002380 const MCSection *S = SectionMap[j + 1];
Chris Lattner33adcfb2009-08-22 21:43:10 +00002381 O << '\t' << MAI->getCommentString() << " Section"
Bill Wendling94d04b82009-05-20 23:21:38 +00002382 << S->getName() << '\n';
Chris Lattner93b6db32009-08-08 23:39:42 +00002383 }*/
2384 Asm->EOL();
Bill Wendling94d04b82009-05-20 23:21:38 +00002385
2386 // Dwarf assumes we start with first line of first source file.
2387 unsigned Source = 1;
2388 unsigned Line = 1;
2389
2390 // Construct rows of the address, source, line, column matrix.
2391 for (unsigned i = 0, N = LineInfos.size(); i < N; ++i) {
2392 const SrcLineInfo &LineInfo = LineInfos[i];
2393 unsigned LabelID = MMI->MappedLabel(LineInfo.getLabelID());
2394 if (!LabelID) continue;
2395
2396 if (!Asm->isVerbose())
2397 Asm->EOL();
2398 else {
2399 std::pair<unsigned, unsigned> SourceID =
2400 getSourceDirectoryAndFileIds(LineInfo.getSourceID());
Chris Lattner33adcfb2009-08-22 21:43:10 +00002401 O << '\t' << MAI->getCommentString() << ' '
Bill Wendling94d04b82009-05-20 23:21:38 +00002402 << getSourceDirectoryName(SourceID.first) << ' '
2403 << getSourceFileName(SourceID.second)
2404 <<" :" << utostr_32(LineInfo.getLine()) << '\n';
2405 }
2406
2407 // Define the line address.
2408 Asm->EmitInt8(0); Asm->EOL("Extended Op");
2409 Asm->EmitInt8(TD->getPointerSize() + 1); Asm->EOL("Op size");
2410 Asm->EmitInt8(dwarf::DW_LNE_set_address); Asm->EOL("DW_LNE_set_address");
2411 EmitReference("label", LabelID); Asm->EOL("Location label");
2412
2413 // If change of source, then switch to the new source.
2414 if (Source != LineInfo.getSourceID()) {
2415 Source = LineInfo.getSourceID();
2416 Asm->EmitInt8(dwarf::DW_LNS_set_file); Asm->EOL("DW_LNS_set_file");
2417 Asm->EmitULEB128Bytes(Source); Asm->EOL("New Source");
2418 }
2419
2420 // If change of line.
2421 if (Line != LineInfo.getLine()) {
2422 // Determine offset.
2423 int Offset = LineInfo.getLine() - Line;
2424 int Delta = Offset - MinLineDelta;
2425
2426 // Update line.
2427 Line = LineInfo.getLine();
2428
2429 // If delta is small enough and in range...
2430 if (Delta >= 0 && Delta < (MaxLineDelta - 1)) {
2431 // ... then use fast opcode.
2432 Asm->EmitInt8(Delta - MinLineDelta); Asm->EOL("Line Delta");
2433 } else {
2434 // ... otherwise use long hand.
2435 Asm->EmitInt8(dwarf::DW_LNS_advance_line);
2436 Asm->EOL("DW_LNS_advance_line");
2437 Asm->EmitSLEB128Bytes(Offset); Asm->EOL("Line Offset");
2438 Asm->EmitInt8(dwarf::DW_LNS_copy); Asm->EOL("DW_LNS_copy");
2439 }
2440 } else {
2441 // Copy the previous row (different address or source)
2442 Asm->EmitInt8(dwarf::DW_LNS_copy); Asm->EOL("DW_LNS_copy");
2443 }
2444 }
2445
2446 EmitEndOfLineMatrix(j + 1);
2447 }
2448
2449 if (SecSrcLinesSize == 0)
2450 // Because we're emitting a debug_line section, we still need a line
2451 // table. The linker and friends expect it to exist. If there's nothing to
2452 // put into it, emit an empty table.
2453 EmitEndOfLineMatrix(1);
2454
2455 EmitLabel("line_end", 0);
2456 Asm->EOL();
2457}
2458
2459/// EmitCommonDebugFrame - Emit common frame info into a debug frame section.
2460///
2461void DwarfDebug::EmitCommonDebugFrame() {
Chris Lattner33adcfb2009-08-22 21:43:10 +00002462 if (!MAI->doesDwarfRequireFrameSection())
Bill Wendling94d04b82009-05-20 23:21:38 +00002463 return;
2464
2465 int stackGrowth =
2466 Asm->TM.getFrameInfo()->getStackGrowthDirection() ==
2467 TargetFrameInfo::StackGrowsUp ?
2468 TD->getPointerSize() : -TD->getPointerSize();
2469
2470 // Start the dwarf frame section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002471 Asm->OutStreamer.SwitchSection(
2472 Asm->getObjFileLowering().getDwarfFrameSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002473
2474 EmitLabel("debug_frame_common", 0);
2475 EmitDifference("debug_frame_common_end", 0,
2476 "debug_frame_common_begin", 0, true);
2477 Asm->EOL("Length of Common Information Entry");
2478
2479 EmitLabel("debug_frame_common_begin", 0);
2480 Asm->EmitInt32((int)dwarf::DW_CIE_ID);
2481 Asm->EOL("CIE Identifier Tag");
2482 Asm->EmitInt8(dwarf::DW_CIE_VERSION);
2483 Asm->EOL("CIE Version");
2484 Asm->EmitString("");
2485 Asm->EOL("CIE Augmentation");
2486 Asm->EmitULEB128Bytes(1);
2487 Asm->EOL("CIE Code Alignment Factor");
2488 Asm->EmitSLEB128Bytes(stackGrowth);
2489 Asm->EOL("CIE Data Alignment Factor");
2490 Asm->EmitInt8(RI->getDwarfRegNum(RI->getRARegister(), false));
2491 Asm->EOL("CIE RA Column");
2492
2493 std::vector<MachineMove> Moves;
2494 RI->getInitialFrameState(Moves);
2495
2496 EmitFrameMoves(NULL, 0, Moves, false);
2497
2498 Asm->EmitAlignment(2, 0, 0, false);
2499 EmitLabel("debug_frame_common_end", 0);
2500
2501 Asm->EOL();
2502}
2503
2504/// EmitFunctionDebugFrame - Emit per function frame info into a debug frame
2505/// section.
2506void
2507DwarfDebug::EmitFunctionDebugFrame(const FunctionDebugFrameInfo&DebugFrameInfo){
Chris Lattner33adcfb2009-08-22 21:43:10 +00002508 if (!MAI->doesDwarfRequireFrameSection())
Bill Wendling94d04b82009-05-20 23:21:38 +00002509 return;
2510
2511 // Start the dwarf frame section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002512 Asm->OutStreamer.SwitchSection(
2513 Asm->getObjFileLowering().getDwarfFrameSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002514
2515 EmitDifference("debug_frame_end", DebugFrameInfo.Number,
2516 "debug_frame_begin", DebugFrameInfo.Number, true);
2517 Asm->EOL("Length of Frame Information Entry");
2518
2519 EmitLabel("debug_frame_begin", DebugFrameInfo.Number);
2520
2521 EmitSectionOffset("debug_frame_common", "section_debug_frame",
2522 0, 0, true, false);
2523 Asm->EOL("FDE CIE offset");
2524
2525 EmitReference("func_begin", DebugFrameInfo.Number);
2526 Asm->EOL("FDE initial location");
2527 EmitDifference("func_end", DebugFrameInfo.Number,
2528 "func_begin", DebugFrameInfo.Number);
2529 Asm->EOL("FDE address range");
2530
2531 EmitFrameMoves("func_begin", DebugFrameInfo.Number, DebugFrameInfo.Moves,
2532 false);
2533
2534 Asm->EmitAlignment(2, 0, 0, false);
2535 EmitLabel("debug_frame_end", DebugFrameInfo.Number);
2536
2537 Asm->EOL();
2538}
2539
2540void DwarfDebug::EmitDebugPubNamesPerCU(CompileUnit *Unit) {
2541 EmitDifference("pubnames_end", Unit->getID(),
2542 "pubnames_begin", Unit->getID(), true);
2543 Asm->EOL("Length of Public Names Info");
2544
2545 EmitLabel("pubnames_begin", Unit->getID());
2546
2547 Asm->EmitInt16(dwarf::DWARF_VERSION); Asm->EOL("DWARF Version");
2548
2549 EmitSectionOffset("info_begin", "section_info",
2550 Unit->getID(), 0, true, false);
2551 Asm->EOL("Offset of Compilation Unit Info");
2552
2553 EmitDifference("info_end", Unit->getID(), "info_begin", Unit->getID(),
2554 true);
2555 Asm->EOL("Compilation Unit Length");
2556
2557 StringMap<DIE*> &Globals = Unit->getGlobals();
2558 for (StringMap<DIE*>::const_iterator
2559 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2560 const char *Name = GI->getKeyData();
2561 DIE * Entity = GI->second;
2562
2563 Asm->EmitInt32(Entity->getOffset()); Asm->EOL("DIE offset");
2564 Asm->EmitString(Name, strlen(Name)); Asm->EOL("External Name");
2565 }
2566
2567 Asm->EmitInt32(0); Asm->EOL("End Mark");
2568 EmitLabel("pubnames_end", Unit->getID());
2569
2570 Asm->EOL();
2571}
2572
2573/// EmitDebugPubNames - Emit visible names into a debug pubnames section.
2574///
2575void DwarfDebug::EmitDebugPubNames() {
2576 // Start the dwarf pubnames section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002577 Asm->OutStreamer.SwitchSection(
2578 Asm->getObjFileLowering().getDwarfPubNamesSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002579
Devang Patel1dbc7712009-06-29 20:45:18 +00002580 EmitDebugPubNamesPerCU(ModuleCU);
Bill Wendling94d04b82009-05-20 23:21:38 +00002581}
2582
2583/// EmitDebugStr - Emit visible names into a debug str section.
2584///
2585void DwarfDebug::EmitDebugStr() {
2586 // Check to see if it is worth the effort.
2587 if (!StringPool.empty()) {
2588 // Start the dwarf str section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002589 Asm->OutStreamer.SwitchSection(
2590 Asm->getObjFileLowering().getDwarfStrSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002591
2592 // For each of strings in the string pool.
2593 for (unsigned StringID = 1, N = StringPool.size();
2594 StringID <= N; ++StringID) {
2595 // Emit a label for reference from debug information entries.
2596 EmitLabel("string", StringID);
2597
2598 // Emit the string itself.
2599 const std::string &String = StringPool[StringID];
2600 Asm->EmitString(String); Asm->EOL();
2601 }
2602
2603 Asm->EOL();
2604 }
2605}
2606
2607/// EmitDebugLoc - Emit visible names into a debug loc section.
2608///
2609void DwarfDebug::EmitDebugLoc() {
2610 // Start the dwarf loc section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002611 Asm->OutStreamer.SwitchSection(
2612 Asm->getObjFileLowering().getDwarfLocSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002613 Asm->EOL();
2614}
2615
2616/// EmitDebugARanges - Emit visible names into a debug aranges section.
2617///
2618void DwarfDebug::EmitDebugARanges() {
2619 // Start the dwarf aranges section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002620 Asm->OutStreamer.SwitchSection(
2621 Asm->getObjFileLowering().getDwarfARangesSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002622
2623 // FIXME - Mock up
2624#if 0
2625 CompileUnit *Unit = GetBaseCompileUnit();
2626
2627 // Don't include size of length
2628 Asm->EmitInt32(0x1c); Asm->EOL("Length of Address Ranges Info");
2629
2630 Asm->EmitInt16(dwarf::DWARF_VERSION); Asm->EOL("Dwarf Version");
2631
2632 EmitReference("info_begin", Unit->getID());
2633 Asm->EOL("Offset of Compilation Unit Info");
2634
2635 Asm->EmitInt8(TD->getPointerSize()); Asm->EOL("Size of Address");
2636
2637 Asm->EmitInt8(0); Asm->EOL("Size of Segment Descriptor");
2638
2639 Asm->EmitInt16(0); Asm->EOL("Pad (1)");
2640 Asm->EmitInt16(0); Asm->EOL("Pad (2)");
2641
2642 // Range 1
2643 EmitReference("text_begin", 0); Asm->EOL("Address");
2644 EmitDifference("text_end", 0, "text_begin", 0, true); Asm->EOL("Length");
2645
2646 Asm->EmitInt32(0); Asm->EOL("EOM (1)");
2647 Asm->EmitInt32(0); Asm->EOL("EOM (2)");
2648#endif
2649
2650 Asm->EOL();
2651}
2652
2653/// EmitDebugRanges - Emit visible names into a debug ranges section.
2654///
2655void DwarfDebug::EmitDebugRanges() {
2656 // Start the dwarf ranges section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002657 Asm->OutStreamer.SwitchSection(
2658 Asm->getObjFileLowering().getDwarfRangesSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002659 Asm->EOL();
2660}
2661
2662/// EmitDebugMacInfo - Emit visible names into a debug macinfo section.
2663///
2664void DwarfDebug::EmitDebugMacInfo() {
Chris Lattner18a4c162009-08-02 07:24:22 +00002665 if (const MCSection *LineInfo =
2666 Asm->getObjFileLowering().getDwarfMacroInfoSection()) {
Bill Wendling94d04b82009-05-20 23:21:38 +00002667 // Start the dwarf macinfo section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002668 Asm->OutStreamer.SwitchSection(LineInfo);
Bill Wendling94d04b82009-05-20 23:21:38 +00002669 Asm->EOL();
2670 }
2671}
2672
2673/// EmitDebugInlineInfo - Emit inline info using following format.
2674/// Section Header:
2675/// 1. length of section
2676/// 2. Dwarf version number
2677/// 3. address size.
2678///
2679/// Entries (one "entry" for each function that was inlined):
2680///
2681/// 1. offset into __debug_str section for MIPS linkage name, if exists;
2682/// otherwise offset into __debug_str for regular function name.
2683/// 2. offset into __debug_str section for regular function name.
2684/// 3. an unsigned LEB128 number indicating the number of distinct inlining
2685/// instances for the function.
2686///
2687/// The rest of the entry consists of a {die_offset, low_pc} pair for each
2688/// inlined instance; the die_offset points to the inlined_subroutine die in the
2689/// __debug_info section, and the low_pc is the starting address for the
2690/// inlining instance.
2691void DwarfDebug::EmitDebugInlineInfo() {
Chris Lattner33adcfb2009-08-22 21:43:10 +00002692 if (!MAI->doesDwarfUsesInlineInfoSection())
Bill Wendling94d04b82009-05-20 23:21:38 +00002693 return;
2694
Devang Patel1dbc7712009-06-29 20:45:18 +00002695 if (!ModuleCU)
Bill Wendling94d04b82009-05-20 23:21:38 +00002696 return;
2697
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002698 Asm->OutStreamer.SwitchSection(
2699 Asm->getObjFileLowering().getDwarfDebugInlineSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002700 Asm->EOL();
2701 EmitDifference("debug_inlined_end", 1,
2702 "debug_inlined_begin", 1, true);
2703 Asm->EOL("Length of Debug Inlined Information Entry");
2704
2705 EmitLabel("debug_inlined_begin", 1);
2706
2707 Asm->EmitInt16(dwarf::DWARF_VERSION); Asm->EOL("Dwarf Version");
2708 Asm->EmitInt8(TD->getPointerSize()); Asm->EOL("Address Size (in bytes)");
2709
Devang Patele4b27562009-08-28 23:24:31 +00002710 for (DenseMap<MDNode *, SmallVector<unsigned, 4> >::iterator
Bill Wendling94d04b82009-05-20 23:21:38 +00002711 I = InlineInfo.begin(), E = InlineInfo.end(); I != E; ++I) {
Devang Patele4b27562009-08-28 23:24:31 +00002712 MDNode *Node = I->first;
Bill Wendling94d04b82009-05-20 23:21:38 +00002713 SmallVector<unsigned, 4> &Labels = I->second;
Devang Patele4b27562009-08-28 23:24:31 +00002714 DISubprogram SP(Node);
Bill Wendling94d04b82009-05-20 23:21:38 +00002715 std::string Name;
2716 std::string LName;
2717
2718 SP.getLinkageName(LName);
2719 SP.getName(Name);
2720
Devang Patel53cb17d2009-07-16 01:01:22 +00002721 if (LName.empty())
2722 Asm->EmitString(Name);
2723 else {
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002724 // Skip special LLVM prefix that is used to inform the asm printer to not
2725 // emit usual symbol prefix before the symbol name. This happens for
2726 // Objective-C symbol names and symbol whose name is replaced using GCC's
2727 // __asm__ attribute.
Devang Patel53cb17d2009-07-16 01:01:22 +00002728 if (LName[0] == 1)
2729 LName = &LName[1];
2730 Asm->EmitString(LName);
2731 }
Bill Wendling94d04b82009-05-20 23:21:38 +00002732 Asm->EOL("MIPS linkage name");
2733
2734 Asm->EmitString(Name); Asm->EOL("Function name");
2735
2736 Asm->EmitULEB128Bytes(Labels.size()); Asm->EOL("Inline count");
2737
2738 for (SmallVector<unsigned, 4>::iterator LI = Labels.begin(),
2739 LE = Labels.end(); LI != LE; ++LI) {
Devang Patele4b27562009-08-28 23:24:31 +00002740 DIE *SP = ModuleCU->getDieMapSlotFor(Node);
Bill Wendling94d04b82009-05-20 23:21:38 +00002741 Asm->EmitInt32(SP->getOffset()); Asm->EOL("DIE offset");
2742
2743 if (TD->getPointerSize() == sizeof(int32_t))
Chris Lattner33adcfb2009-08-22 21:43:10 +00002744 O << MAI->getData32bitsDirective();
Bill Wendling94d04b82009-05-20 23:21:38 +00002745 else
Chris Lattner33adcfb2009-08-22 21:43:10 +00002746 O << MAI->getData64bitsDirective();
Bill Wendling94d04b82009-05-20 23:21:38 +00002747
2748 PrintLabelName("label", *LI); Asm->EOL("low_pc");
2749 }
2750 }
2751
2752 EmitLabel("debug_inlined_end", 1);
2753 Asm->EOL();
2754}