blob: f9193bad02a4085f4632b4017421dfea3730e6cd [file] [log] [blame]
Bill Wendling0310d762009-05-15 09:23:25 +00001//===-- llvm/CodeGen/DwarfDebug.cpp - Dwarf Debug Framework ---------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file contains support for writing dwarf debug info into asm files.
11//
12//===----------------------------------------------------------------------===//
Devang Patele4b27562009-08-28 23:24:31 +000013#define DEBUG_TYPE "dwarfdebug"
Bill Wendling0310d762009-05-15 09:23:25 +000014#include "DwarfDebug.h"
15#include "llvm/Module.h"
David Greeneb2c66fc2009-08-19 21:52:55 +000016#include "llvm/CodeGen/MachineFunction.h"
Bill Wendling0310d762009-05-15 09:23:25 +000017#include "llvm/CodeGen/MachineModuleInfo.h"
Chris Lattnera87dea42009-07-31 18:48:30 +000018#include "llvm/MC/MCSection.h"
Chris Lattner6c2f9e12009-08-19 05:49:37 +000019#include "llvm/MC/MCStreamer.h"
Chris Lattneraf76e592009-08-22 20:48:53 +000020#include "llvm/MC/MCAsmInfo.h"
Bill Wendling0310d762009-05-15 09:23:25 +000021#include "llvm/Target/TargetData.h"
22#include "llvm/Target/TargetFrameInfo.h"
Chris Lattnerf0144122009-07-28 03:13:23 +000023#include "llvm/Target/TargetLoweringObjectFile.h"
24#include "llvm/Target/TargetRegisterInfo.h"
Chris Lattner23132b12009-08-24 03:52:50 +000025#include "llvm/ADT/StringExtras.h"
Chris Lattner334fd1f2009-09-16 00:08:41 +000026#include "llvm/Support/Mangler.h"
Chris Lattnera87dea42009-07-31 18:48:30 +000027#include "llvm/Support/Timer.h"
Devang Patele4b27562009-08-28 23:24:31 +000028#include "llvm/Support/Debug.h"
Chris Lattnera87dea42009-07-31 18:48:30 +000029#include "llvm/System/Path.h"
Bill Wendling0310d762009-05-15 09:23:25 +000030using namespace llvm;
31
32static TimerGroup &getDwarfTimerGroup() {
33 static TimerGroup DwarfTimerGroup("Dwarf Debugging");
34 return DwarfTimerGroup;
35}
36
37//===----------------------------------------------------------------------===//
38
39/// Configuration values for initial hash set sizes (log2).
40///
41static const unsigned InitDiesSetSize = 9; // log2(512)
42static const unsigned InitAbbreviationsSetSize = 9; // log2(512)
43static const unsigned InitValuesSetSize = 9; // log2(512)
44
45namespace llvm {
46
47//===----------------------------------------------------------------------===//
48/// CompileUnit - This dwarf writer support class manages information associate
49/// with a source file.
50class VISIBILITY_HIDDEN CompileUnit {
51 /// ID - File identifier for source.
52 ///
53 unsigned ID;
54
55 /// Die - Compile unit debug information entry.
56 ///
57 DIE *Die;
58
59 /// GVToDieMap - Tracks the mapping of unit level debug informaton
60 /// variables to debug information entries.
Devang Patele4b27562009-08-28 23:24:31 +000061 /// FIXME : Rename GVToDieMap -> NodeToDieMap
62 std::map<MDNode *, DIE *> GVToDieMap;
Bill Wendling0310d762009-05-15 09:23:25 +000063
64 /// GVToDIEEntryMap - Tracks the mapping of unit level debug informaton
65 /// descriptors to debug information entries using a DIEEntry proxy.
Devang Patele4b27562009-08-28 23:24:31 +000066 /// FIXME : Rename
67 std::map<MDNode *, DIEEntry *> GVToDIEEntryMap;
Bill Wendling0310d762009-05-15 09:23:25 +000068
69 /// Globals - A map of globally visible named entities for this unit.
70 ///
71 StringMap<DIE*> Globals;
72
73 /// DiesSet - Used to uniquely define dies within the compile unit.
74 ///
75 FoldingSet<DIE> DiesSet;
76public:
77 CompileUnit(unsigned I, DIE *D)
Bill Wendling39dd6962009-05-20 23:31:45 +000078 : ID(I), Die(D), DiesSet(InitDiesSetSize) {}
79 ~CompileUnit() { delete Die; }
Bill Wendling0310d762009-05-15 09:23:25 +000080
81 // Accessors.
Bill Wendling39dd6962009-05-20 23:31:45 +000082 unsigned getID() const { return ID; }
83 DIE* getDie() const { return Die; }
Bill Wendling0310d762009-05-15 09:23:25 +000084 StringMap<DIE*> &getGlobals() { return Globals; }
85
86 /// hasContent - Return true if this compile unit has something to write out.
87 ///
Bill Wendling39dd6962009-05-20 23:31:45 +000088 bool hasContent() const { return !Die->getChildren().empty(); }
Bill Wendling0310d762009-05-15 09:23:25 +000089
90 /// AddGlobal - Add a new global entity to the compile unit.
91 ///
Bill Wendling39dd6962009-05-20 23:31:45 +000092 void AddGlobal(const std::string &Name, DIE *Die) { Globals[Name] = Die; }
Bill Wendling0310d762009-05-15 09:23:25 +000093
94 /// getDieMapSlotFor - Returns the debug information entry map slot for the
95 /// specified debug variable.
Devang Patele4b27562009-08-28 23:24:31 +000096 DIE *&getDieMapSlotFor(MDNode *N) { return GVToDieMap[N]; }
Bill Wendling0310d762009-05-15 09:23:25 +000097
Chris Lattner1cda87c2009-07-14 04:50:12 +000098 /// getDIEEntrySlotFor - Returns the debug information entry proxy slot for
99 /// the specified debug variable.
Devang Patele4b27562009-08-28 23:24:31 +0000100 DIEEntry *&getDIEEntrySlotFor(MDNode *N) {
101 return GVToDIEEntryMap[N];
Bill Wendling0310d762009-05-15 09:23:25 +0000102 }
103
104 /// AddDie - Adds or interns the DIE to the compile unit.
105 ///
106 DIE *AddDie(DIE &Buffer) {
107 FoldingSetNodeID ID;
108 Buffer.Profile(ID);
109 void *Where;
110 DIE *Die = DiesSet.FindNodeOrInsertPos(ID, Where);
111
112 if (!Die) {
113 Die = new DIE(Buffer);
114 DiesSet.InsertNode(Die, Where);
115 this->Die->AddChild(Die);
116 Buffer.Detach();
117 }
118
119 return Die;
120 }
121};
122
123//===----------------------------------------------------------------------===//
124/// DbgVariable - This class is used to track local variable information.
125///
126class VISIBILITY_HIDDEN DbgVariable {
127 DIVariable Var; // Variable Descriptor.
128 unsigned FrameIndex; // Variable frame index.
Bill Wendling1180c782009-05-18 23:08:55 +0000129 bool InlinedFnVar; // Variable for an inlined function.
Bill Wendling0310d762009-05-15 09:23:25 +0000130public:
Bill Wendling1180c782009-05-18 23:08:55 +0000131 DbgVariable(DIVariable V, unsigned I, bool IFV)
132 : Var(V), FrameIndex(I), InlinedFnVar(IFV) {}
Bill Wendling0310d762009-05-15 09:23:25 +0000133
134 // Accessors.
Bill Wendling1180c782009-05-18 23:08:55 +0000135 DIVariable getVariable() const { return Var; }
Bill Wendling0310d762009-05-15 09:23:25 +0000136 unsigned getFrameIndex() const { return FrameIndex; }
Bill Wendling1180c782009-05-18 23:08:55 +0000137 bool isInlinedFnVar() const { return InlinedFnVar; }
Bill Wendling0310d762009-05-15 09:23:25 +0000138};
139
140//===----------------------------------------------------------------------===//
141/// DbgScope - This class is used to track scope information.
142///
143class DbgConcreteScope;
144class VISIBILITY_HIDDEN DbgScope {
145 DbgScope *Parent; // Parent to this scope.
146 DIDescriptor Desc; // Debug info descriptor for scope.
147 // Either subprogram or block.
148 unsigned StartLabelID; // Label ID of the beginning of scope.
149 unsigned EndLabelID; // Label ID of the end of scope.
150 SmallVector<DbgScope *, 4> Scopes; // Scopes defined in scope.
151 SmallVector<DbgVariable *, 8> Variables;// Variables declared in scope.
152 SmallVector<DbgConcreteScope *, 8> ConcreteInsts;// Concrete insts of funcs.
Daniel Dunbarf612ff62009-09-19 20:40:05 +0000153
Owen Anderson04c05f72009-06-24 22:53:20 +0000154 // Private state for dump()
155 mutable unsigned IndentLevel;
Bill Wendling0310d762009-05-15 09:23:25 +0000156public:
157 DbgScope(DbgScope *P, DIDescriptor D)
Owen Anderson04c05f72009-06-24 22:53:20 +0000158 : Parent(P), Desc(D), StartLabelID(0), EndLabelID(0), IndentLevel(0) {}
Bill Wendling0310d762009-05-15 09:23:25 +0000159 virtual ~DbgScope();
160
161 // Accessors.
162 DbgScope *getParent() const { return Parent; }
163 DIDescriptor getDesc() const { return Desc; }
164 unsigned getStartLabelID() const { return StartLabelID; }
165 unsigned getEndLabelID() const { return EndLabelID; }
166 SmallVector<DbgScope *, 4> &getScopes() { return Scopes; }
167 SmallVector<DbgVariable *, 8> &getVariables() { return Variables; }
168 SmallVector<DbgConcreteScope*,8> &getConcreteInsts() { return ConcreteInsts; }
169 void setStartLabelID(unsigned S) { StartLabelID = S; }
170 void setEndLabelID(unsigned E) { EndLabelID = E; }
171
172 /// AddScope - Add a scope to the scope.
173 ///
174 void AddScope(DbgScope *S) { Scopes.push_back(S); }
175
176 /// AddVariable - Add a variable to the scope.
177 ///
178 void AddVariable(DbgVariable *V) { Variables.push_back(V); }
179
180 /// AddConcreteInst - Add a concrete instance to the scope.
181 ///
182 void AddConcreteInst(DbgConcreteScope *C) { ConcreteInsts.push_back(C); }
183
184#ifndef NDEBUG
185 void dump() const;
186#endif
187};
188
189#ifndef NDEBUG
190void DbgScope::dump() const {
Chris Lattnerc281de12009-08-23 00:51:00 +0000191 raw_ostream &err = errs();
192 err.indent(IndentLevel);
193 Desc.dump();
194 err << " [" << StartLabelID << ", " << EndLabelID << "]\n";
Bill Wendling0310d762009-05-15 09:23:25 +0000195
196 IndentLevel += 2;
197
198 for (unsigned i = 0, e = Scopes.size(); i != e; ++i)
199 if (Scopes[i] != this)
200 Scopes[i]->dump();
201
202 IndentLevel -= 2;
203}
204#endif
205
206//===----------------------------------------------------------------------===//
207/// DbgConcreteScope - This class is used to track a scope that holds concrete
208/// instance information.
209///
210class VISIBILITY_HIDDEN DbgConcreteScope : public DbgScope {
211 CompileUnit *Unit;
212 DIE *Die; // Debug info for this concrete scope.
213public:
214 DbgConcreteScope(DIDescriptor D) : DbgScope(NULL, D) {}
215
216 // Accessors.
217 DIE *getDie() const { return Die; }
218 void setDie(DIE *D) { Die = D; }
219};
220
221DbgScope::~DbgScope() {
222 for (unsigned i = 0, N = Scopes.size(); i < N; ++i)
223 delete Scopes[i];
224 for (unsigned j = 0, M = Variables.size(); j < M; ++j)
225 delete Variables[j];
226 for (unsigned k = 0, O = ConcreteInsts.size(); k < O; ++k)
227 delete ConcreteInsts[k];
228}
229
230} // end llvm namespace
231
Chris Lattneraf76e592009-08-22 20:48:53 +0000232DwarfDebug::DwarfDebug(raw_ostream &OS, AsmPrinter *A, const MCAsmInfo *T)
Devang Patel1dbc7712009-06-29 20:45:18 +0000233 : Dwarf(OS, A, T, "dbg"), ModuleCU(0),
Bill Wendling0310d762009-05-15 09:23:25 +0000234 AbbreviationsSet(InitAbbreviationsSetSize), Abbreviations(),
Daniel Dunbarf612ff62009-09-19 20:40:05 +0000235 ValuesSet(InitValuesSetSize), Values(), StringPool(),
Bill Wendling0310d762009-05-15 09:23:25 +0000236 SectionSourceLines(), didInitial(false), shouldEmit(false),
Devang Patel43da8fb2009-07-13 21:26:33 +0000237 FunctionDbgScope(0), DebugTimer(0) {
Bill Wendling0310d762009-05-15 09:23:25 +0000238 if (TimePassesIsEnabled)
239 DebugTimer = new Timer("Dwarf Debug Writer",
240 getDwarfTimerGroup());
241}
242DwarfDebug::~DwarfDebug() {
243 for (unsigned j = 0, M = Values.size(); j < M; ++j)
244 delete Values[j];
245
Devang Patele4b27562009-08-28 23:24:31 +0000246 for (DenseMap<const MDNode *, DbgScope *>::iterator
Bill Wendling0310d762009-05-15 09:23:25 +0000247 I = AbstractInstanceRootMap.begin(),
248 E = AbstractInstanceRootMap.end(); I != E;++I)
249 delete I->second;
250
251 delete DebugTimer;
252}
253
254/// AssignAbbrevNumber - Define a unique number for the abbreviation.
255///
256void DwarfDebug::AssignAbbrevNumber(DIEAbbrev &Abbrev) {
257 // Profile the node so that we can make it unique.
258 FoldingSetNodeID ID;
259 Abbrev.Profile(ID);
260
261 // Check the set for priors.
262 DIEAbbrev *InSet = AbbreviationsSet.GetOrInsertNode(&Abbrev);
263
264 // If it's newly added.
265 if (InSet == &Abbrev) {
266 // Add to abbreviation list.
267 Abbreviations.push_back(&Abbrev);
268
269 // Assign the vector position + 1 as its number.
270 Abbrev.setNumber(Abbreviations.size());
271 } else {
272 // Assign existing abbreviation number.
273 Abbrev.setNumber(InSet->getNumber());
274 }
275}
276
Bill Wendling995f80a2009-05-20 23:24:48 +0000277/// CreateDIEEntry - Creates a new DIEEntry to be a proxy for a debug
278/// information entry.
279DIEEntry *DwarfDebug::CreateDIEEntry(DIE *Entry) {
Bill Wendling0310d762009-05-15 09:23:25 +0000280 DIEEntry *Value;
281
282 if (Entry) {
283 FoldingSetNodeID ID;
284 DIEEntry::Profile(ID, Entry);
285 void *Where;
286 Value = static_cast<DIEEntry *>(ValuesSet.FindNodeOrInsertPos(ID, Where));
287
288 if (Value) return Value;
289
290 Value = new DIEEntry(Entry);
291 ValuesSet.InsertNode(Value, Where);
292 } else {
293 Value = new DIEEntry(Entry);
294 }
295
296 Values.push_back(Value);
297 return Value;
298}
299
300/// SetDIEEntry - Set a DIEEntry once the debug information entry is defined.
301///
302void DwarfDebug::SetDIEEntry(DIEEntry *Value, DIE *Entry) {
303 Value->setEntry(Entry);
304
305 // Add to values set if not already there. If it is, we merely have a
306 // duplicate in the values list (no harm.)
307 ValuesSet.GetOrInsertNode(Value);
308}
309
310/// AddUInt - Add an unsigned integer attribute data and value.
311///
312void DwarfDebug::AddUInt(DIE *Die, unsigned Attribute,
313 unsigned Form, uint64_t Integer) {
314 if (!Form) Form = DIEInteger::BestForm(false, Integer);
315
316 FoldingSetNodeID ID;
317 DIEInteger::Profile(ID, Integer);
318 void *Where;
319 DIEValue *Value = ValuesSet.FindNodeOrInsertPos(ID, Where);
320
321 if (!Value) {
322 Value = new DIEInteger(Integer);
323 ValuesSet.InsertNode(Value, Where);
324 Values.push_back(Value);
325 }
326
327 Die->AddValue(Attribute, Form, Value);
328}
329
330/// AddSInt - Add an signed integer attribute data and value.
331///
332void DwarfDebug::AddSInt(DIE *Die, unsigned Attribute,
333 unsigned Form, int64_t Integer) {
334 if (!Form) Form = DIEInteger::BestForm(true, Integer);
335
336 FoldingSetNodeID ID;
337 DIEInteger::Profile(ID, (uint64_t)Integer);
338 void *Where;
339 DIEValue *Value = ValuesSet.FindNodeOrInsertPos(ID, Where);
340
341 if (!Value) {
342 Value = new DIEInteger(Integer);
343 ValuesSet.InsertNode(Value, Where);
344 Values.push_back(Value);
345 }
346
347 Die->AddValue(Attribute, Form, Value);
348}
349
350/// AddString - Add a string attribute data and value.
351///
352void DwarfDebug::AddString(DIE *Die, unsigned Attribute, unsigned Form,
353 const std::string &String) {
354 FoldingSetNodeID ID;
355 DIEString::Profile(ID, String);
356 void *Where;
357 DIEValue *Value = ValuesSet.FindNodeOrInsertPos(ID, Where);
358
359 if (!Value) {
360 Value = new DIEString(String);
361 ValuesSet.InsertNode(Value, Where);
362 Values.push_back(Value);
363 }
364
365 Die->AddValue(Attribute, Form, Value);
366}
367
368/// AddLabel - Add a Dwarf label attribute data and value.
369///
370void DwarfDebug::AddLabel(DIE *Die, unsigned Attribute, unsigned Form,
371 const DWLabel &Label) {
372 FoldingSetNodeID ID;
373 DIEDwarfLabel::Profile(ID, Label);
374 void *Where;
375 DIEValue *Value = ValuesSet.FindNodeOrInsertPos(ID, Where);
376
377 if (!Value) {
378 Value = new DIEDwarfLabel(Label);
379 ValuesSet.InsertNode(Value, Where);
380 Values.push_back(Value);
381 }
382
383 Die->AddValue(Attribute, Form, Value);
384}
385
386/// AddObjectLabel - Add an non-Dwarf label attribute data and value.
387///
388void DwarfDebug::AddObjectLabel(DIE *Die, unsigned Attribute, unsigned Form,
389 const std::string &Label) {
390 FoldingSetNodeID ID;
391 DIEObjectLabel::Profile(ID, Label);
392 void *Where;
393 DIEValue *Value = ValuesSet.FindNodeOrInsertPos(ID, Where);
394
395 if (!Value) {
396 Value = new DIEObjectLabel(Label);
397 ValuesSet.InsertNode(Value, Where);
398 Values.push_back(Value);
399 }
400
401 Die->AddValue(Attribute, Form, Value);
402}
403
404/// AddSectionOffset - Add a section offset label attribute data and value.
405///
406void DwarfDebug::AddSectionOffset(DIE *Die, unsigned Attribute, unsigned Form,
407 const DWLabel &Label, const DWLabel &Section,
408 bool isEH, bool useSet) {
409 FoldingSetNodeID ID;
410 DIESectionOffset::Profile(ID, Label, Section);
411 void *Where;
412 DIEValue *Value = ValuesSet.FindNodeOrInsertPos(ID, Where);
413
414 if (!Value) {
415 Value = new DIESectionOffset(Label, Section, isEH, useSet);
416 ValuesSet.InsertNode(Value, Where);
417 Values.push_back(Value);
418 }
419
420 Die->AddValue(Attribute, Form, Value);
421}
422
423/// AddDelta - Add a label delta attribute data and value.
424///
425void DwarfDebug::AddDelta(DIE *Die, unsigned Attribute, unsigned Form,
426 const DWLabel &Hi, const DWLabel &Lo) {
427 FoldingSetNodeID ID;
428 DIEDelta::Profile(ID, Hi, Lo);
429 void *Where;
430 DIEValue *Value = ValuesSet.FindNodeOrInsertPos(ID, Where);
431
432 if (!Value) {
433 Value = new DIEDelta(Hi, Lo);
434 ValuesSet.InsertNode(Value, Where);
435 Values.push_back(Value);
436 }
437
438 Die->AddValue(Attribute, Form, Value);
439}
440
441/// AddBlock - Add block data.
442///
443void DwarfDebug::AddBlock(DIE *Die, unsigned Attribute, unsigned Form,
444 DIEBlock *Block) {
445 Block->ComputeSize(TD);
446 FoldingSetNodeID ID;
447 Block->Profile(ID);
448 void *Where;
449 DIEValue *Value = ValuesSet.FindNodeOrInsertPos(ID, Where);
450
451 if (!Value) {
452 Value = Block;
453 ValuesSet.InsertNode(Value, Where);
454 Values.push_back(Value);
455 } else {
456 // Already exists, reuse the previous one.
457 delete Block;
458 Block = cast<DIEBlock>(Value);
459 }
460
461 Die->AddValue(Attribute, Block->BestForm(), Value);
462}
463
464/// AddSourceLine - Add location information to specified debug information
465/// entry.
466void DwarfDebug::AddSourceLine(DIE *Die, const DIVariable *V) {
467 // If there is no compile unit specified, don't add a line #.
468 if (V->getCompileUnit().isNull())
469 return;
470
471 unsigned Line = V->getLineNumber();
472 unsigned FileID = FindCompileUnit(V->getCompileUnit()).getID();
473 assert(FileID && "Invalid file id");
474 AddUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
475 AddUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
476}
477
478/// AddSourceLine - Add location information to specified debug information
479/// entry.
480void DwarfDebug::AddSourceLine(DIE *Die, const DIGlobal *G) {
481 // If there is no compile unit specified, don't add a line #.
482 if (G->getCompileUnit().isNull())
483 return;
484
485 unsigned Line = G->getLineNumber();
486 unsigned FileID = FindCompileUnit(G->getCompileUnit()).getID();
487 assert(FileID && "Invalid file id");
488 AddUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
489 AddUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
490}
Devang Patel82dfc0c2009-08-31 22:47:13 +0000491
492/// AddSourceLine - Add location information to specified debug information
493/// entry.
494void DwarfDebug::AddSourceLine(DIE *Die, const DISubprogram *SP) {
495 // If there is no compile unit specified, don't add a line #.
496 if (SP->getCompileUnit().isNull())
497 return;
Caroline Ticec6f9d622009-09-11 18:25:54 +0000498 // If the line number is 0, don't add it.
499 if (SP->getLineNumber() == 0)
500 return;
501
Devang Patel82dfc0c2009-08-31 22:47:13 +0000502
503 unsigned Line = SP->getLineNumber();
504 unsigned FileID = FindCompileUnit(SP->getCompileUnit()).getID();
505 assert(FileID && "Invalid file id");
506 AddUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
507 AddUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
508}
509
510/// AddSourceLine - Add location information to specified debug information
511/// entry.
Bill Wendling0310d762009-05-15 09:23:25 +0000512void DwarfDebug::AddSourceLine(DIE *Die, const DIType *Ty) {
513 // If there is no compile unit specified, don't add a line #.
514 DICompileUnit CU = Ty->getCompileUnit();
515 if (CU.isNull())
516 return;
517
518 unsigned Line = Ty->getLineNumber();
519 unsigned FileID = FindCompileUnit(CU).getID();
520 assert(FileID && "Invalid file id");
521 AddUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
522 AddUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
523}
524
Caroline Ticedc8f6042009-08-31 21:19:37 +0000525/* Byref variables, in Blocks, are declared by the programmer as
526 "SomeType VarName;", but the compiler creates a
527 __Block_byref_x_VarName struct, and gives the variable VarName
528 either the struct, or a pointer to the struct, as its type. This
529 is necessary for various behind-the-scenes things the compiler
530 needs to do with by-reference variables in blocks.
531
532 However, as far as the original *programmer* is concerned, the
533 variable should still have type 'SomeType', as originally declared.
534
535 The following function dives into the __Block_byref_x_VarName
536 struct to find the original type of the variable. This will be
537 passed back to the code generating the type for the Debug
538 Information Entry for the variable 'VarName'. 'VarName' will then
539 have the original type 'SomeType' in its debug information.
540
541 The original type 'SomeType' will be the type of the field named
542 'VarName' inside the __Block_byref_x_VarName struct.
543
544 NOTE: In order for this to not completely fail on the debugger
545 side, the Debug Information Entry for the variable VarName needs to
546 have a DW_AT_location that tells the debugger how to unwind through
547 the pointers and __Block_byref_x_VarName struct to find the actual
548 value of the variable. The function AddBlockByrefType does this. */
549
550/// Find the type the programmer originally declared the variable to be
551/// and return that type.
552///
553DIType DwarfDebug::GetBlockByrefType(DIType Ty, std::string Name) {
554
555 DIType subType = Ty;
556 unsigned tag = Ty.getTag();
557
558 if (tag == dwarf::DW_TAG_pointer_type) {
559 DIDerivedType DTy = DIDerivedType (Ty.getNode());
560 subType = DTy.getTypeDerivedFrom();
561 }
562
563 DICompositeType blockStruct = DICompositeType(subType.getNode());
564
565 DIArray Elements = blockStruct.getTypeArray();
566
567 if (Elements.isNull())
568 return Ty;
569
570 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
571 DIDescriptor Element = Elements.getElement(i);
572 DIDerivedType DT = DIDerivedType(Element.getNode());
573 std::string Name2;
574 DT.getName(Name2);
575 if (Name == Name2)
576 return (DT.getTypeDerivedFrom());
577 }
578
579 return Ty;
580}
581
582/* Byref variables, in Blocks, are declared by the programmer as "SomeType
583 VarName;", but the compiler creates a __Block_byref_x_VarName struct, and
584 gives the variable VarName either the struct, or a pointer to the struct, as
585 its type. This is necessary for various behind-the-scenes things the
586 compiler needs to do with by-reference variables in Blocks.
587
588 However, as far as the original *programmer* is concerned, the variable
589 should still have type 'SomeType', as originally declared.
590
591 The function GetBlockByrefType dives into the __Block_byref_x_VarName
592 struct to find the original type of the variable, which is then assigned to
593 the variable's Debug Information Entry as its real type. So far, so good.
594 However now the debugger will expect the variable VarName to have the type
595 SomeType. So we need the location attribute for the variable to be an
Daniel Dunbarf612ff62009-09-19 20:40:05 +0000596 expression that explains to the debugger how to navigate through the
Caroline Ticedc8f6042009-08-31 21:19:37 +0000597 pointers and struct to find the actual variable of type SomeType.
598
599 The following function does just that. We start by getting
600 the "normal" location for the variable. This will be the location
601 of either the struct __Block_byref_x_VarName or the pointer to the
602 struct __Block_byref_x_VarName.
603
604 The struct will look something like:
605
606 struct __Block_byref_x_VarName {
607 ... <various fields>
608 struct __Block_byref_x_VarName *forwarding;
609 ... <various other fields>
610 SomeType VarName;
611 ... <maybe more fields>
612 };
613
614 If we are given the struct directly (as our starting point) we
615 need to tell the debugger to:
616
617 1). Add the offset of the forwarding field.
618
619 2). Follow that pointer to get the the real __Block_byref_x_VarName
620 struct to use (the real one may have been copied onto the heap).
621
622 3). Add the offset for the field VarName, to find the actual variable.
623
624 If we started with a pointer to the struct, then we need to
625 dereference that pointer first, before the other steps.
626 Translating this into DWARF ops, we will need to append the following
627 to the current location description for the variable:
628
629 DW_OP_deref -- optional, if we start with a pointer
630 DW_OP_plus_uconst <forward_fld_offset>
631 DW_OP_deref
632 DW_OP_plus_uconst <varName_fld_offset>
633
634 That is what this function does. */
635
636/// AddBlockByrefAddress - Start with the address based on the location
637/// provided, and generate the DWARF information necessary to find the
638/// actual Block variable (navigating the Block struct) based on the
639/// starting location. Add the DWARF information to the die. For
640/// more information, read large comment just above here.
641///
Daniel Dunbarf612ff62009-09-19 20:40:05 +0000642void DwarfDebug::AddBlockByrefAddress(DbgVariable *&DV, DIE *Die,
Daniel Dunbar00564992009-09-19 20:40:14 +0000643 unsigned Attribute,
644 const MachineLocation &Location) {
Caroline Ticedc8f6042009-08-31 21:19:37 +0000645 const DIVariable &VD = DV->getVariable();
646 DIType Ty = VD.getType();
647 DIType TmpTy = Ty;
648 unsigned Tag = Ty.getTag();
649 bool isPointer = false;
650
651 std::string varName;
652 VD.getName(varName);
653
654 if (Tag == dwarf::DW_TAG_pointer_type) {
655 DIDerivedType DTy = DIDerivedType (Ty.getNode());
656 TmpTy = DTy.getTypeDerivedFrom();
657 isPointer = true;
658 }
659
660 DICompositeType blockStruct = DICompositeType(TmpTy.getNode());
661
662 std::string typeName;
663 blockStruct.getName(typeName);
664
Daniel Dunbar00564992009-09-19 20:40:14 +0000665 // Find the __forwarding field and the variable field in the __Block_byref
666 // struct.
Daniel Dunbar00564992009-09-19 20:40:14 +0000667 DIArray Fields = blockStruct.getTypeArray();
668 DIDescriptor varField = DIDescriptor();
669 DIDescriptor forwardingField = DIDescriptor();
Caroline Ticedc8f6042009-08-31 21:19:37 +0000670
671
Daniel Dunbar00564992009-09-19 20:40:14 +0000672 for (unsigned i = 0, N = Fields.getNumElements(); i < N; ++i) {
673 DIDescriptor Element = Fields.getElement(i);
674 DIDerivedType DT = DIDerivedType(Element.getNode());
675 std::string fieldName;
676 DT.getName(fieldName);
677 if (fieldName == "__forwarding")
678 forwardingField = Element;
679 else if (fieldName == varName)
680 varField = Element;
681 }
Daniel Dunbarf612ff62009-09-19 20:40:05 +0000682
Mike Stump7e3720d2009-09-24 23:21:26 +0000683 assert(!varField.isNull() && "Can't find byref variable in Block struct");
684 assert(!forwardingField.isNull()
685 && "Can't find forwarding field in Block struct");
Caroline Ticedc8f6042009-08-31 21:19:37 +0000686
Daniel Dunbar00564992009-09-19 20:40:14 +0000687 // Get the offsets for the forwarding field and the variable field.
Daniel Dunbar00564992009-09-19 20:40:14 +0000688 unsigned int forwardingFieldOffset =
689 DIDerivedType(forwardingField.getNode()).getOffsetInBits() >> 3;
690 unsigned int varFieldOffset =
691 DIDerivedType(varField.getNode()).getOffsetInBits() >> 3;
Caroline Ticedc8f6042009-08-31 21:19:37 +0000692
Mike Stump7e3720d2009-09-24 23:21:26 +0000693 // Decode the original location, and use that as the start of the byref
694 // variable's location.
Daniel Dunbar00564992009-09-19 20:40:14 +0000695 unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
696 DIEBlock *Block = new DIEBlock();
Caroline Ticedc8f6042009-08-31 21:19:37 +0000697
Daniel Dunbar00564992009-09-19 20:40:14 +0000698 if (Location.isReg()) {
699 if (Reg < 32)
700 AddUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
701 else {
702 Reg = Reg - dwarf::DW_OP_reg0;
703 AddUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
704 AddUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
705 }
706 } else {
707 if (Reg < 32)
708 AddUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
709 else {
710 AddUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
711 AddUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
712 }
Caroline Ticedc8f6042009-08-31 21:19:37 +0000713
Daniel Dunbar00564992009-09-19 20:40:14 +0000714 AddUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
715 }
Caroline Ticedc8f6042009-08-31 21:19:37 +0000716
Mike Stump7e3720d2009-09-24 23:21:26 +0000717 // If we started with a pointer to the __Block_byref... struct, then
Daniel Dunbar00564992009-09-19 20:40:14 +0000718 // the first thing we need to do is dereference the pointer (DW_OP_deref).
Daniel Dunbar00564992009-09-19 20:40:14 +0000719 if (isPointer)
720 AddUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Caroline Ticedc8f6042009-08-31 21:19:37 +0000721
Daniel Dunbar00564992009-09-19 20:40:14 +0000722 // Next add the offset for the '__forwarding' field:
723 // DW_OP_plus_uconst ForwardingFieldOffset. Note there's no point in
724 // adding the offset if it's 0.
Daniel Dunbar00564992009-09-19 20:40:14 +0000725 if (forwardingFieldOffset > 0) {
726 AddUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
727 AddUInt(Block, 0, dwarf::DW_FORM_udata, forwardingFieldOffset);
728 }
Caroline Ticedc8f6042009-08-31 21:19:37 +0000729
Daniel Dunbar00564992009-09-19 20:40:14 +0000730 // Now dereference the __forwarding field to get to the real __Block_byref
731 // struct: DW_OP_deref.
Daniel Dunbar00564992009-09-19 20:40:14 +0000732 AddUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
Caroline Ticedc8f6042009-08-31 21:19:37 +0000733
Daniel Dunbar00564992009-09-19 20:40:14 +0000734 // Now that we've got the real __Block_byref... struct, add the offset
735 // for the variable's field to get to the location of the actual variable:
736 // DW_OP_plus_uconst varFieldOffset. Again, don't add if it's 0.
Daniel Dunbar00564992009-09-19 20:40:14 +0000737 if (varFieldOffset > 0) {
738 AddUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
739 AddUInt(Block, 0, dwarf::DW_FORM_udata, varFieldOffset);
740 }
Caroline Ticedc8f6042009-08-31 21:19:37 +0000741
Daniel Dunbar00564992009-09-19 20:40:14 +0000742 // Now attach the location information to the DIE.
Daniel Dunbar00564992009-09-19 20:40:14 +0000743 AddBlock(Die, Attribute, 0, Block);
Caroline Ticedc8f6042009-08-31 21:19:37 +0000744}
745
Bill Wendling0310d762009-05-15 09:23:25 +0000746/// AddAddress - Add an address attribute to a die based on the location
747/// provided.
748void DwarfDebug::AddAddress(DIE *Die, unsigned Attribute,
749 const MachineLocation &Location) {
750 unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
751 DIEBlock *Block = new DIEBlock();
752
753 if (Location.isReg()) {
754 if (Reg < 32) {
755 AddUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
756 } else {
757 AddUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
758 AddUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
759 }
760 } else {
761 if (Reg < 32) {
762 AddUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
763 } else {
764 AddUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
765 AddUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
766 }
767
768 AddUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
769 }
770
771 AddBlock(Die, Attribute, 0, Block);
772}
773
774/// AddType - Add a new type attribute to the specified entity.
775void DwarfDebug::AddType(CompileUnit *DW_Unit, DIE *Entity, DIType Ty) {
776 if (Ty.isNull())
777 return;
778
779 // Check for pre-existence.
Devang Patele4b27562009-08-28 23:24:31 +0000780 DIEEntry *&Slot = DW_Unit->getDIEEntrySlotFor(Ty.getNode());
Bill Wendling0310d762009-05-15 09:23:25 +0000781
782 // If it exists then use the existing value.
783 if (Slot) {
784 Entity->AddValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, Slot);
785 return;
786 }
787
788 // Set up proxy.
Bill Wendling995f80a2009-05-20 23:24:48 +0000789 Slot = CreateDIEEntry();
Bill Wendling0310d762009-05-15 09:23:25 +0000790
791 // Construct type.
792 DIE Buffer(dwarf::DW_TAG_base_type);
Devang Patel6ceea332009-08-31 18:49:10 +0000793 if (Ty.isBasicType())
Devang Patele4b27562009-08-28 23:24:31 +0000794 ConstructTypeDIE(DW_Unit, Buffer, DIBasicType(Ty.getNode()));
Devang Patel6ceea332009-08-31 18:49:10 +0000795 else if (Ty.isCompositeType())
Devang Patele4b27562009-08-28 23:24:31 +0000796 ConstructTypeDIE(DW_Unit, Buffer, DICompositeType(Ty.getNode()));
Bill Wendling0310d762009-05-15 09:23:25 +0000797 else {
Devang Patel6ceea332009-08-31 18:49:10 +0000798 assert(Ty.isDerivedType() && "Unknown kind of DIType");
Devang Patele4b27562009-08-28 23:24:31 +0000799 ConstructTypeDIE(DW_Unit, Buffer, DIDerivedType(Ty.getNode()));
800
Bill Wendling0310d762009-05-15 09:23:25 +0000801 }
802
803 // Add debug information entry to entity and appropriate context.
804 DIE *Die = NULL;
805 DIDescriptor Context = Ty.getContext();
806 if (!Context.isNull())
Devang Patele4b27562009-08-28 23:24:31 +0000807 Die = DW_Unit->getDieMapSlotFor(Context.getNode());
Bill Wendling0310d762009-05-15 09:23:25 +0000808
809 if (Die) {
810 DIE *Child = new DIE(Buffer);
811 Die->AddChild(Child);
812 Buffer.Detach();
813 SetDIEEntry(Slot, Child);
814 } else {
815 Die = DW_Unit->AddDie(Buffer);
816 SetDIEEntry(Slot, Die);
817 }
818
819 Entity->AddValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, Slot);
820}
821
822/// ConstructTypeDIE - Construct basic type die from DIBasicType.
823void DwarfDebug::ConstructTypeDIE(CompileUnit *DW_Unit, DIE &Buffer,
824 DIBasicType BTy) {
825 // Get core information.
826 std::string Name;
827 BTy.getName(Name);
828 Buffer.setTag(dwarf::DW_TAG_base_type);
829 AddUInt(&Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
830 BTy.getEncoding());
831
832 // Add name if not anonymous or intermediate type.
833 if (!Name.empty())
834 AddString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
835 uint64_t Size = BTy.getSizeInBits() >> 3;
836 AddUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
837}
838
839/// ConstructTypeDIE - Construct derived type die from DIDerivedType.
840void DwarfDebug::ConstructTypeDIE(CompileUnit *DW_Unit, DIE &Buffer,
841 DIDerivedType DTy) {
842 // Get core information.
843 std::string Name;
844 DTy.getName(Name);
845 uint64_t Size = DTy.getSizeInBits() >> 3;
846 unsigned Tag = DTy.getTag();
847
848 // FIXME - Workaround for templates.
849 if (Tag == dwarf::DW_TAG_inheritance) Tag = dwarf::DW_TAG_reference_type;
850
851 Buffer.setTag(Tag);
852
853 // Map to main type, void will not have a type.
854 DIType FromTy = DTy.getTypeDerivedFrom();
855 AddType(DW_Unit, &Buffer, FromTy);
856
857 // Add name if not anonymous or intermediate type.
858 if (!Name.empty())
859 AddString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
860
861 // Add size if non-zero (derived types might be zero-sized.)
862 if (Size)
863 AddUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
864
865 // Add source line info if available and TyDesc is not a forward declaration.
866 if (!DTy.isForwardDecl())
867 AddSourceLine(&Buffer, &DTy);
868}
869
870/// ConstructTypeDIE - Construct type DIE from DICompositeType.
871void DwarfDebug::ConstructTypeDIE(CompileUnit *DW_Unit, DIE &Buffer,
872 DICompositeType CTy) {
873 // Get core information.
874 std::string Name;
875 CTy.getName(Name);
876
877 uint64_t Size = CTy.getSizeInBits() >> 3;
878 unsigned Tag = CTy.getTag();
879 Buffer.setTag(Tag);
880
881 switch (Tag) {
882 case dwarf::DW_TAG_vector_type:
883 case dwarf::DW_TAG_array_type:
884 ConstructArrayTypeDIE(DW_Unit, Buffer, &CTy);
885 break;
886 case dwarf::DW_TAG_enumeration_type: {
887 DIArray Elements = CTy.getTypeArray();
888
889 // Add enumerators to enumeration type.
890 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
891 DIE *ElemDie = NULL;
Devang Patele4b27562009-08-28 23:24:31 +0000892 DIEnumerator Enum(Elements.getElement(i).getNode());
Bill Wendling0310d762009-05-15 09:23:25 +0000893 ElemDie = ConstructEnumTypeDIE(DW_Unit, &Enum);
894 Buffer.AddChild(ElemDie);
895 }
896 }
897 break;
898 case dwarf::DW_TAG_subroutine_type: {
899 // Add return type.
900 DIArray Elements = CTy.getTypeArray();
901 DIDescriptor RTy = Elements.getElement(0);
Devang Patele4b27562009-08-28 23:24:31 +0000902 AddType(DW_Unit, &Buffer, DIType(RTy.getNode()));
Bill Wendling0310d762009-05-15 09:23:25 +0000903
904 // Add prototype flag.
905 AddUInt(&Buffer, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
906
907 // Add arguments.
908 for (unsigned i = 1, N = Elements.getNumElements(); i < N; ++i) {
909 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
910 DIDescriptor Ty = Elements.getElement(i);
Devang Patele4b27562009-08-28 23:24:31 +0000911 AddType(DW_Unit, Arg, DIType(Ty.getNode()));
Bill Wendling0310d762009-05-15 09:23:25 +0000912 Buffer.AddChild(Arg);
913 }
914 }
915 break;
916 case dwarf::DW_TAG_structure_type:
917 case dwarf::DW_TAG_union_type:
918 case dwarf::DW_TAG_class_type: {
919 // Add elements to structure type.
920 DIArray Elements = CTy.getTypeArray();
921
922 // A forward struct declared type may not have elements available.
923 if (Elements.isNull())
924 break;
925
926 // Add elements to structure type.
927 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
928 DIDescriptor Element = Elements.getElement(i);
Devang Patele4b27562009-08-28 23:24:31 +0000929 if (Element.isNull())
930 continue;
Bill Wendling0310d762009-05-15 09:23:25 +0000931 DIE *ElemDie = NULL;
932 if (Element.getTag() == dwarf::DW_TAG_subprogram)
933 ElemDie = CreateSubprogramDIE(DW_Unit,
Devang Patele4b27562009-08-28 23:24:31 +0000934 DISubprogram(Element.getNode()));
Bill Wendling0310d762009-05-15 09:23:25 +0000935 else
936 ElemDie = CreateMemberDIE(DW_Unit,
Devang Patele4b27562009-08-28 23:24:31 +0000937 DIDerivedType(Element.getNode()));
Bill Wendling0310d762009-05-15 09:23:25 +0000938 Buffer.AddChild(ElemDie);
939 }
940
Devang Patela1ba2692009-08-27 23:51:51 +0000941 if (CTy.isAppleBlockExtension())
Bill Wendling0310d762009-05-15 09:23:25 +0000942 AddUInt(&Buffer, dwarf::DW_AT_APPLE_block, dwarf::DW_FORM_flag, 1);
943
944 unsigned RLang = CTy.getRunTimeLang();
945 if (RLang)
946 AddUInt(&Buffer, dwarf::DW_AT_APPLE_runtime_class,
947 dwarf::DW_FORM_data1, RLang);
948 break;
949 }
950 default:
951 break;
952 }
953
954 // Add name if not anonymous or intermediate type.
955 if (!Name.empty())
956 AddString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
957
958 if (Tag == dwarf::DW_TAG_enumeration_type ||
959 Tag == dwarf::DW_TAG_structure_type || Tag == dwarf::DW_TAG_union_type) {
960 // Add size if non-zero (derived types might be zero-sized.)
961 if (Size)
962 AddUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
963 else {
964 // Add zero size if it is not a forward declaration.
965 if (CTy.isForwardDecl())
966 AddUInt(&Buffer, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
967 else
968 AddUInt(&Buffer, dwarf::DW_AT_byte_size, 0, 0);
969 }
970
971 // Add source line info if available.
972 if (!CTy.isForwardDecl())
973 AddSourceLine(&Buffer, &CTy);
974 }
975}
976
977/// ConstructSubrangeDIE - Construct subrange DIE from DISubrange.
978void DwarfDebug::ConstructSubrangeDIE(DIE &Buffer, DISubrange SR, DIE *IndexTy){
979 int64_t L = SR.getLo();
980 int64_t H = SR.getHi();
981 DIE *DW_Subrange = new DIE(dwarf::DW_TAG_subrange_type);
982
Devang Patel6325a532009-08-14 20:59:16 +0000983 AddDIEEntry(DW_Subrange, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IndexTy);
984 if (L)
985 AddSInt(DW_Subrange, dwarf::DW_AT_lower_bound, 0, L);
986 if (H)
Daniel Dunbar00564992009-09-19 20:40:14 +0000987 AddSInt(DW_Subrange, dwarf::DW_AT_upper_bound, 0, H);
Bill Wendling0310d762009-05-15 09:23:25 +0000988
989 Buffer.AddChild(DW_Subrange);
990}
991
992/// ConstructArrayTypeDIE - Construct array type DIE from DICompositeType.
993void DwarfDebug::ConstructArrayTypeDIE(CompileUnit *DW_Unit, DIE &Buffer,
994 DICompositeType *CTy) {
995 Buffer.setTag(dwarf::DW_TAG_array_type);
996 if (CTy->getTag() == dwarf::DW_TAG_vector_type)
997 AddUInt(&Buffer, dwarf::DW_AT_GNU_vector, dwarf::DW_FORM_flag, 1);
998
999 // Emit derived type.
1000 AddType(DW_Unit, &Buffer, CTy->getTypeDerivedFrom());
1001 DIArray Elements = CTy->getTypeArray();
1002
1003 // Construct an anonymous type for index type.
1004 DIE IdxBuffer(dwarf::DW_TAG_base_type);
1005 AddUInt(&IdxBuffer, dwarf::DW_AT_byte_size, 0, sizeof(int32_t));
1006 AddUInt(&IdxBuffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
1007 dwarf::DW_ATE_signed);
1008 DIE *IndexTy = DW_Unit->AddDie(IdxBuffer);
1009
1010 // Add subranges to array type.
1011 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1012 DIDescriptor Element = Elements.getElement(i);
1013 if (Element.getTag() == dwarf::DW_TAG_subrange_type)
Devang Patele4b27562009-08-28 23:24:31 +00001014 ConstructSubrangeDIE(Buffer, DISubrange(Element.getNode()), IndexTy);
Bill Wendling0310d762009-05-15 09:23:25 +00001015 }
1016}
1017
1018/// ConstructEnumTypeDIE - Construct enum type DIE from DIEnumerator.
1019DIE *DwarfDebug::ConstructEnumTypeDIE(CompileUnit *DW_Unit, DIEnumerator *ETy) {
1020 DIE *Enumerator = new DIE(dwarf::DW_TAG_enumerator);
1021 std::string Name;
1022 ETy->getName(Name);
1023 AddString(Enumerator, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1024 int64_t Value = ETy->getEnumValue();
1025 AddSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, Value);
1026 return Enumerator;
1027}
1028
1029/// CreateGlobalVariableDIE - Create new DIE using GV.
1030DIE *DwarfDebug::CreateGlobalVariableDIE(CompileUnit *DW_Unit,
1031 const DIGlobalVariable &GV) {
1032 DIE *GVDie = new DIE(dwarf::DW_TAG_variable);
1033 std::string Name;
1034 GV.getDisplayName(Name);
1035 AddString(GVDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1036 std::string LinkageName;
1037 GV.getLinkageName(LinkageName);
Devang Patel53cb17d2009-07-16 01:01:22 +00001038 if (!LinkageName.empty()) {
Chris Lattner6c2f9e12009-08-19 05:49:37 +00001039 // Skip special LLVM prefix that is used to inform the asm printer to not
1040 // emit usual symbol prefix before the symbol name. This happens for
1041 // Objective-C symbol names and symbol whose name is replaced using GCC's
1042 // __asm__ attribute.
Devang Patel53cb17d2009-07-16 01:01:22 +00001043 if (LinkageName[0] == 1)
1044 LinkageName = &LinkageName[1];
Bill Wendling0310d762009-05-15 09:23:25 +00001045 AddString(GVDie, dwarf::DW_AT_MIPS_linkage_name, dwarf::DW_FORM_string,
Devang Patel1a8d2d22009-07-14 00:55:28 +00001046 LinkageName);
Devang Patel53cb17d2009-07-16 01:01:22 +00001047 }
Daniel Dunbar00564992009-09-19 20:40:14 +00001048 AddType(DW_Unit, GVDie, GV.getType());
Bill Wendling0310d762009-05-15 09:23:25 +00001049 if (!GV.isLocalToUnit())
1050 AddUInt(GVDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
1051 AddSourceLine(GVDie, &GV);
1052 return GVDie;
1053}
1054
1055/// CreateMemberDIE - Create new member DIE.
1056DIE *DwarfDebug::CreateMemberDIE(CompileUnit *DW_Unit, const DIDerivedType &DT){
1057 DIE *MemberDie = new DIE(DT.getTag());
1058 std::string Name;
1059 DT.getName(Name);
1060 if (!Name.empty())
1061 AddString(MemberDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1062
1063 AddType(DW_Unit, MemberDie, DT.getTypeDerivedFrom());
1064
1065 AddSourceLine(MemberDie, &DT);
1066
1067 uint64_t Size = DT.getSizeInBits();
1068 uint64_t FieldSize = DT.getOriginalTypeSize();
1069
1070 if (Size != FieldSize) {
1071 // Handle bitfield.
1072 AddUInt(MemberDie, dwarf::DW_AT_byte_size, 0, DT.getOriginalTypeSize()>>3);
1073 AddUInt(MemberDie, dwarf::DW_AT_bit_size, 0, DT.getSizeInBits());
1074
1075 uint64_t Offset = DT.getOffsetInBits();
1076 uint64_t FieldOffset = Offset;
1077 uint64_t AlignMask = ~(DT.getAlignInBits() - 1);
1078 uint64_t HiMark = (Offset + FieldSize) & AlignMask;
1079 FieldOffset = (HiMark - FieldSize);
1080 Offset -= FieldOffset;
1081
1082 // Maybe we need to work from the other end.
1083 if (TD->isLittleEndian()) Offset = FieldSize - (Offset + Size);
1084 AddUInt(MemberDie, dwarf::DW_AT_bit_offset, 0, Offset);
1085 }
1086
1087 DIEBlock *Block = new DIEBlock();
1088 AddUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
1089 AddUInt(Block, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits() >> 3);
1090 AddBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, Block);
1091
1092 if (DT.isProtected())
1093 AddUInt(MemberDie, dwarf::DW_AT_accessibility, 0,
1094 dwarf::DW_ACCESS_protected);
1095 else if (DT.isPrivate())
1096 AddUInt(MemberDie, dwarf::DW_AT_accessibility, 0,
1097 dwarf::DW_ACCESS_private);
1098
1099 return MemberDie;
1100}
1101
1102/// CreateSubprogramDIE - Create new DIE using SP.
1103DIE *DwarfDebug::CreateSubprogramDIE(CompileUnit *DW_Unit,
1104 const DISubprogram &SP,
Bill Wendling6679ee42009-05-18 22:02:36 +00001105 bool IsConstructor,
1106 bool IsInlined) {
Bill Wendling0310d762009-05-15 09:23:25 +00001107 DIE *SPDie = new DIE(dwarf::DW_TAG_subprogram);
1108
1109 std::string Name;
1110 SP.getName(Name);
1111 AddString(SPDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1112
1113 std::string LinkageName;
1114 SP.getLinkageName(LinkageName);
Devang Patel53cb17d2009-07-16 01:01:22 +00001115 if (!LinkageName.empty()) {
1116 // Skip special LLVM prefix that is used to inform the asm printer to not emit
1117 // usual symbol prefix before the symbol name. This happens for Objective-C
1118 // symbol names and symbol whose name is replaced using GCC's __asm__ attribute.
1119 if (LinkageName[0] == 1)
1120 LinkageName = &LinkageName[1];
Bill Wendling0310d762009-05-15 09:23:25 +00001121 AddString(SPDie, dwarf::DW_AT_MIPS_linkage_name, dwarf::DW_FORM_string,
Devang Patel1a8d2d22009-07-14 00:55:28 +00001122 LinkageName);
Devang Patel53cb17d2009-07-16 01:01:22 +00001123 }
Bill Wendling0310d762009-05-15 09:23:25 +00001124 AddSourceLine(SPDie, &SP);
1125
1126 DICompositeType SPTy = SP.getType();
1127 DIArray Args = SPTy.getTypeArray();
1128
1129 // Add prototyped tag, if C or ObjC.
1130 unsigned Lang = SP.getCompileUnit().getLanguage();
1131 if (Lang == dwarf::DW_LANG_C99 || Lang == dwarf::DW_LANG_C89 ||
1132 Lang == dwarf::DW_LANG_ObjC)
1133 AddUInt(SPDie, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
1134
1135 // Add Return Type.
1136 unsigned SPTag = SPTy.getTag();
1137 if (!IsConstructor) {
1138 if (Args.isNull() || SPTag != dwarf::DW_TAG_subroutine_type)
1139 AddType(DW_Unit, SPDie, SPTy);
1140 else
Devang Patele4b27562009-08-28 23:24:31 +00001141 AddType(DW_Unit, SPDie, DIType(Args.getElement(0).getNode()));
Bill Wendling0310d762009-05-15 09:23:25 +00001142 }
1143
1144 if (!SP.isDefinition()) {
1145 AddUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1146
1147 // Add arguments. Do not add arguments for subprogram definition. They will
1148 // be handled through RecordVariable.
1149 if (SPTag == dwarf::DW_TAG_subroutine_type)
1150 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
1151 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
Devang Patele4b27562009-08-28 23:24:31 +00001152 AddType(DW_Unit, Arg, DIType(Args.getElement(i).getNode()));
Bill Wendling0310d762009-05-15 09:23:25 +00001153 AddUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1); // ??
1154 SPDie->AddChild(Arg);
1155 }
1156 }
1157
Bill Wendling6679ee42009-05-18 22:02:36 +00001158 if (!SP.isLocalToUnit() && !IsInlined)
Bill Wendling0310d762009-05-15 09:23:25 +00001159 AddUInt(SPDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
1160
1161 // DW_TAG_inlined_subroutine may refer to this DIE.
Devang Patele4b27562009-08-28 23:24:31 +00001162 DIE *&Slot = DW_Unit->getDieMapSlotFor(SP.getNode());
Bill Wendling0310d762009-05-15 09:23:25 +00001163 Slot = SPDie;
1164 return SPDie;
1165}
1166
1167/// FindCompileUnit - Get the compile unit for the given descriptor.
1168///
1169CompileUnit &DwarfDebug::FindCompileUnit(DICompileUnit Unit) const {
1170 DenseMap<Value *, CompileUnit *>::const_iterator I =
Devang Patele4b27562009-08-28 23:24:31 +00001171 CompileUnitMap.find(Unit.getNode());
Bill Wendling0310d762009-05-15 09:23:25 +00001172 assert(I != CompileUnitMap.end() && "Missing compile unit.");
1173 return *I->second;
1174}
1175
Bill Wendling995f80a2009-05-20 23:24:48 +00001176/// CreateDbgScopeVariable - Create a new scope variable.
Bill Wendling0310d762009-05-15 09:23:25 +00001177///
Bill Wendling995f80a2009-05-20 23:24:48 +00001178DIE *DwarfDebug::CreateDbgScopeVariable(DbgVariable *DV, CompileUnit *Unit) {
Bill Wendling0310d762009-05-15 09:23:25 +00001179 // Get the descriptor.
1180 const DIVariable &VD = DV->getVariable();
1181
1182 // Translate tag to proper Dwarf tag. The result variable is dropped for
1183 // now.
1184 unsigned Tag;
1185 switch (VD.getTag()) {
1186 case dwarf::DW_TAG_return_variable:
1187 return NULL;
1188 case dwarf::DW_TAG_arg_variable:
1189 Tag = dwarf::DW_TAG_formal_parameter;
1190 break;
1191 case dwarf::DW_TAG_auto_variable: // fall thru
1192 default:
1193 Tag = dwarf::DW_TAG_variable;
1194 break;
1195 }
1196
1197 // Define variable debug information entry.
1198 DIE *VariableDie = new DIE(Tag);
1199 std::string Name;
1200 VD.getName(Name);
1201 AddString(VariableDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1202
1203 // Add source line info if available.
1204 AddSourceLine(VariableDie, &VD);
1205
1206 // Add variable type.
Caroline Ticedc8f6042009-08-31 21:19:37 +00001207 if (VD.isBlockByrefVariable())
1208 AddType(Unit, VariableDie, GetBlockByrefType(VD.getType(), Name));
1209 else
1210 AddType(Unit, VariableDie, VD.getType());
Bill Wendling0310d762009-05-15 09:23:25 +00001211
1212 // Add variable address.
Bill Wendling1180c782009-05-18 23:08:55 +00001213 if (!DV->isInlinedFnVar()) {
1214 // Variables for abstract instances of inlined functions don't get a
1215 // location.
1216 MachineLocation Location;
1217 Location.set(RI->getFrameRegister(*MF),
1218 RI->getFrameIndexOffset(*MF, DV->getFrameIndex()));
Caroline Ticedc8f6042009-08-31 21:19:37 +00001219
1220 if (VD.isBlockByrefVariable())
Mike Stumpee4b8a72009-09-24 23:11:08 +00001221 AddBlockByrefAddress(DV, VariableDie, dwarf::DW_AT_location, Location);
Caroline Ticedc8f6042009-08-31 21:19:37 +00001222 else
1223 AddAddress(VariableDie, dwarf::DW_AT_location, Location);
Bill Wendling1180c782009-05-18 23:08:55 +00001224 }
Bill Wendling0310d762009-05-15 09:23:25 +00001225
1226 return VariableDie;
1227}
1228
1229/// getOrCreateScope - Returns the scope associated with the given descriptor.
1230///
Devang Patele4b27562009-08-28 23:24:31 +00001231DbgScope *DwarfDebug::getOrCreateScope(MDNode *N) {
1232 DbgScope *&Slot = DbgScopeMap[N];
Bill Wendling0310d762009-05-15 09:23:25 +00001233 if (Slot) return Slot;
1234
1235 DbgScope *Parent = NULL;
Devang Patel5e005d82009-08-31 22:00:15 +00001236 DILexicalBlock Block(N);
Bill Wendling0310d762009-05-15 09:23:25 +00001237
Bill Wendling8fff19b2009-06-01 20:18:46 +00001238 // Don't create a new scope if we already created one for an inlined function.
Devang Patele4b27562009-08-28 23:24:31 +00001239 DenseMap<const MDNode *, DbgScope *>::iterator
1240 II = AbstractInstanceRootMap.find(N);
Bill Wendling8fff19b2009-06-01 20:18:46 +00001241 if (II != AbstractInstanceRootMap.end())
1242 return LexicalScopeStack.back();
1243
Bill Wendling0310d762009-05-15 09:23:25 +00001244 if (!Block.isNull()) {
1245 DIDescriptor ParentDesc = Block.getContext();
1246 Parent =
Devang Patele4b27562009-08-28 23:24:31 +00001247 ParentDesc.isNull() ? NULL : getOrCreateScope(ParentDesc.getNode());
Bill Wendling0310d762009-05-15 09:23:25 +00001248 }
1249
Devang Patele4b27562009-08-28 23:24:31 +00001250 Slot = new DbgScope(Parent, DIDescriptor(N));
Bill Wendling0310d762009-05-15 09:23:25 +00001251
1252 if (Parent)
1253 Parent->AddScope(Slot);
1254 else
1255 // First function is top level function.
1256 FunctionDbgScope = Slot;
1257
1258 return Slot;
1259}
1260
1261/// ConstructDbgScope - Construct the components of a scope.
1262///
1263void DwarfDebug::ConstructDbgScope(DbgScope *ParentScope,
1264 unsigned ParentStartID,
1265 unsigned ParentEndID,
1266 DIE *ParentDie, CompileUnit *Unit) {
1267 // Add variables to scope.
1268 SmallVector<DbgVariable *, 8> &Variables = ParentScope->getVariables();
1269 for (unsigned i = 0, N = Variables.size(); i < N; ++i) {
Bill Wendling995f80a2009-05-20 23:24:48 +00001270 DIE *VariableDie = CreateDbgScopeVariable(Variables[i], Unit);
Bill Wendling0310d762009-05-15 09:23:25 +00001271 if (VariableDie) ParentDie->AddChild(VariableDie);
1272 }
1273
1274 // Add concrete instances to scope.
1275 SmallVector<DbgConcreteScope *, 8> &ConcreteInsts =
1276 ParentScope->getConcreteInsts();
1277 for (unsigned i = 0, N = ConcreteInsts.size(); i < N; ++i) {
1278 DbgConcreteScope *ConcreteInst = ConcreteInsts[i];
1279 DIE *Die = ConcreteInst->getDie();
1280
1281 unsigned StartID = ConcreteInst->getStartLabelID();
1282 unsigned EndID = ConcreteInst->getEndLabelID();
1283
1284 // Add the scope bounds.
1285 if (StartID)
1286 AddLabel(Die, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
1287 DWLabel("label", StartID));
1288 else
1289 AddLabel(Die, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
1290 DWLabel("func_begin", SubprogramCount));
1291
1292 if (EndID)
1293 AddLabel(Die, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
1294 DWLabel("label", EndID));
1295 else
1296 AddLabel(Die, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
1297 DWLabel("func_end", SubprogramCount));
1298
1299 ParentDie->AddChild(Die);
1300 }
1301
1302 // Add nested scopes.
1303 SmallVector<DbgScope *, 4> &Scopes = ParentScope->getScopes();
1304 for (unsigned j = 0, M = Scopes.size(); j < M; ++j) {
1305 // Define the Scope debug information entry.
1306 DbgScope *Scope = Scopes[j];
1307
1308 unsigned StartID = MMI->MappedLabel(Scope->getStartLabelID());
1309 unsigned EndID = MMI->MappedLabel(Scope->getEndLabelID());
1310
1311 // Ignore empty scopes.
1312 if (StartID == EndID && StartID != 0) continue;
1313
1314 // Do not ignore inlined scopes even if they don't have any variables or
1315 // scopes.
1316 if (Scope->getScopes().empty() && Scope->getVariables().empty() &&
1317 Scope->getConcreteInsts().empty())
1318 continue;
1319
1320 if (StartID == ParentStartID && EndID == ParentEndID) {
1321 // Just add stuff to the parent scope.
1322 ConstructDbgScope(Scope, ParentStartID, ParentEndID, ParentDie, Unit);
1323 } else {
1324 DIE *ScopeDie = new DIE(dwarf::DW_TAG_lexical_block);
1325
1326 // Add the scope bounds.
1327 if (StartID)
1328 AddLabel(ScopeDie, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
1329 DWLabel("label", StartID));
1330 else
1331 AddLabel(ScopeDie, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
1332 DWLabel("func_begin", SubprogramCount));
1333
1334 if (EndID)
1335 AddLabel(ScopeDie, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
1336 DWLabel("label", EndID));
1337 else
1338 AddLabel(ScopeDie, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
1339 DWLabel("func_end", SubprogramCount));
1340
1341 // Add the scope's contents.
1342 ConstructDbgScope(Scope, StartID, EndID, ScopeDie, Unit);
1343 ParentDie->AddChild(ScopeDie);
1344 }
1345 }
1346}
1347
1348/// ConstructFunctionDbgScope - Construct the scope for the subprogram.
1349///
Bill Wendling17956162009-05-20 23:28:48 +00001350void DwarfDebug::ConstructFunctionDbgScope(DbgScope *RootScope,
1351 bool AbstractScope) {
Bill Wendling0310d762009-05-15 09:23:25 +00001352 // Exit if there is no root scope.
1353 if (!RootScope) return;
1354 DIDescriptor Desc = RootScope->getDesc();
1355 if (Desc.isNull())
1356 return;
1357
1358 // Get the subprogram debug information entry.
Devang Patele4b27562009-08-28 23:24:31 +00001359 DISubprogram SPD(Desc.getNode());
Bill Wendling0310d762009-05-15 09:23:25 +00001360
Bill Wendling0310d762009-05-15 09:23:25 +00001361 // Get the subprogram die.
Devang Patele4b27562009-08-28 23:24:31 +00001362 DIE *SPDie = ModuleCU->getDieMapSlotFor(SPD.getNode());
Bill Wendling0310d762009-05-15 09:23:25 +00001363 assert(SPDie && "Missing subprogram descriptor");
1364
Bill Wendling17956162009-05-20 23:28:48 +00001365 if (!AbstractScope) {
1366 // Add the function bounds.
1367 AddLabel(SPDie, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
1368 DWLabel("func_begin", SubprogramCount));
1369 AddLabel(SPDie, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
1370 DWLabel("func_end", SubprogramCount));
1371 MachineLocation Location(RI->getFrameRegister(*MF));
1372 AddAddress(SPDie, dwarf::DW_AT_frame_base, Location);
1373 }
Bill Wendling0310d762009-05-15 09:23:25 +00001374
Devang Patel1dbc7712009-06-29 20:45:18 +00001375 ConstructDbgScope(RootScope, 0, 0, SPDie, ModuleCU);
Bill Wendling0310d762009-05-15 09:23:25 +00001376}
1377
Bill Wendling0310d762009-05-15 09:23:25 +00001378/// ConstructDefaultDbgScope - Construct a default scope for the subprogram.
1379///
1380void DwarfDebug::ConstructDefaultDbgScope(MachineFunction *MF) {
Devang Patel1dbc7712009-06-29 20:45:18 +00001381 StringMap<DIE*> &Globals = ModuleCU->getGlobals();
Daniel Dunbar460f6562009-07-26 09:48:23 +00001382 StringMap<DIE*>::iterator GI = Globals.find(MF->getFunction()->getName());
Devang Patel70f44262009-06-29 20:38:13 +00001383 if (GI != Globals.end()) {
1384 DIE *SPDie = GI->second;
Daniel Dunbarf612ff62009-09-19 20:40:05 +00001385
Devang Patel70f44262009-06-29 20:38:13 +00001386 // Add the function bounds.
1387 AddLabel(SPDie, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
1388 DWLabel("func_begin", SubprogramCount));
1389 AddLabel(SPDie, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
1390 DWLabel("func_end", SubprogramCount));
Daniel Dunbarf612ff62009-09-19 20:40:05 +00001391
Devang Patel70f44262009-06-29 20:38:13 +00001392 MachineLocation Location(RI->getFrameRegister(*MF));
1393 AddAddress(SPDie, dwarf::DW_AT_frame_base, Location);
Bill Wendling0310d762009-05-15 09:23:25 +00001394 }
Bill Wendling0310d762009-05-15 09:23:25 +00001395}
1396
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001397/// GetOrCreateSourceID - Look up the source id with the given directory and
1398/// source file names. If none currently exists, create a new id and insert it
1399/// in the SourceIds map. This can update DirectoryNames and SourceFileNames
1400/// maps as well.
1401unsigned DwarfDebug::GetOrCreateSourceID(const std::string &DirName,
1402 const std::string &FileName) {
1403 unsigned DId;
1404 StringMap<unsigned>::iterator DI = DirectoryIdMap.find(DirName);
1405 if (DI != DirectoryIdMap.end()) {
1406 DId = DI->getValue();
1407 } else {
1408 DId = DirectoryNames.size() + 1;
1409 DirectoryIdMap[DirName] = DId;
1410 DirectoryNames.push_back(DirName);
1411 }
1412
1413 unsigned FId;
1414 StringMap<unsigned>::iterator FI = SourceFileIdMap.find(FileName);
1415 if (FI != SourceFileIdMap.end()) {
1416 FId = FI->getValue();
1417 } else {
1418 FId = SourceFileNames.size() + 1;
1419 SourceFileIdMap[FileName] = FId;
1420 SourceFileNames.push_back(FileName);
1421 }
1422
1423 DenseMap<std::pair<unsigned, unsigned>, unsigned>::iterator SI =
1424 SourceIdMap.find(std::make_pair(DId, FId));
1425 if (SI != SourceIdMap.end())
1426 return SI->second;
1427
1428 unsigned SrcId = SourceIds.size() + 1; // DW_AT_decl_file cannot be 0.
1429 SourceIdMap[std::make_pair(DId, FId)] = SrcId;
1430 SourceIds.push_back(std::make_pair(DId, FId));
1431
1432 return SrcId;
1433}
1434
Devang Patele4b27562009-08-28 23:24:31 +00001435void DwarfDebug::ConstructCompileUnit(MDNode *N) {
1436 DICompileUnit DIUnit(N);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001437 std::string Dir, FN, Prod;
1438 unsigned ID = GetOrCreateSourceID(DIUnit.getDirectory(Dir),
1439 DIUnit.getFilename(FN));
1440
1441 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
1442 AddSectionOffset(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4,
1443 DWLabel("section_line", 0), DWLabel("section_line", 0),
1444 false);
1445 AddString(Die, dwarf::DW_AT_producer, dwarf::DW_FORM_string,
1446 DIUnit.getProducer(Prod));
1447 AddUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data1,
1448 DIUnit.getLanguage());
1449 AddString(Die, dwarf::DW_AT_name, dwarf::DW_FORM_string, FN);
1450
1451 if (!Dir.empty())
1452 AddString(Die, dwarf::DW_AT_comp_dir, dwarf::DW_FORM_string, Dir);
1453 if (DIUnit.isOptimized())
1454 AddUInt(Die, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1);
1455
1456 std::string Flags;
1457 DIUnit.getFlags(Flags);
1458 if (!Flags.empty())
1459 AddString(Die, dwarf::DW_AT_APPLE_flags, dwarf::DW_FORM_string, Flags);
1460
1461 unsigned RVer = DIUnit.getRunTimeVersion();
1462 if (RVer)
1463 AddUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers,
1464 dwarf::DW_FORM_data1, RVer);
1465
1466 CompileUnit *Unit = new CompileUnit(ID, Die);
Devang Patel1dbc7712009-06-29 20:45:18 +00001467 if (!ModuleCU && DIUnit.isMain()) {
Devang Patel70f44262009-06-29 20:38:13 +00001468 // Use first compile unit marked as isMain as the compile unit
1469 // for this module.
Devang Patel1dbc7712009-06-29 20:45:18 +00001470 ModuleCU = Unit;
Devang Patel70f44262009-06-29 20:38:13 +00001471 }
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001472
Devang Patele4b27562009-08-28 23:24:31 +00001473 CompileUnitMap[DIUnit.getNode()] = Unit;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001474 CompileUnits.push_back(Unit);
1475}
1476
Devang Patele4b27562009-08-28 23:24:31 +00001477void DwarfDebug::ConstructGlobalVariableDIE(MDNode *N) {
1478 DIGlobalVariable DI_GV(N);
Daniel Dunbarf612ff62009-09-19 20:40:05 +00001479
Devang Patel905cf5e2009-09-04 23:59:07 +00001480 // If debug information is malformed then ignore it.
1481 if (DI_GV.Verify() == false)
1482 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001483
1484 // Check for pre-existence.
Devang Patele4b27562009-08-28 23:24:31 +00001485 DIE *&Slot = ModuleCU->getDieMapSlotFor(DI_GV.getNode());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001486 if (Slot)
Devang Patel13e16b62009-06-26 01:49:18 +00001487 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001488
Devang Patel1dbc7712009-06-29 20:45:18 +00001489 DIE *VariableDie = CreateGlobalVariableDIE(ModuleCU, DI_GV);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001490
1491 // Add address.
1492 DIEBlock *Block = new DIEBlock();
1493 AddUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001494 AddObjectLabel(Block, 0, dwarf::DW_FORM_udata,
Chris Lattner334fd1f2009-09-16 00:08:41 +00001495 Asm->Mang->getMangledName(DI_GV.getGlobal()));
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001496 AddBlock(VariableDie, dwarf::DW_AT_location, 0, Block);
1497
1498 // Add to map.
1499 Slot = VariableDie;
1500
1501 // Add to context owner.
Devang Patel1dbc7712009-06-29 20:45:18 +00001502 ModuleCU->getDie()->AddChild(VariableDie);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001503
1504 // Expose as global. FIXME - need to check external flag.
1505 std::string Name;
Devang Patel1dbc7712009-06-29 20:45:18 +00001506 ModuleCU->AddGlobal(DI_GV.getName(Name), VariableDie);
Devang Patel13e16b62009-06-26 01:49:18 +00001507 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001508}
1509
Devang Patele4b27562009-08-28 23:24:31 +00001510void DwarfDebug::ConstructSubprogram(MDNode *N) {
1511 DISubprogram SP(N);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001512
1513 // Check for pre-existence.
Devang Patele4b27562009-08-28 23:24:31 +00001514 DIE *&Slot = ModuleCU->getDieMapSlotFor(N);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001515 if (Slot)
Devang Patel13e16b62009-06-26 01:49:18 +00001516 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001517
1518 if (!SP.isDefinition())
1519 // This is a method declaration which will be handled while constructing
1520 // class type.
Devang Patel13e16b62009-06-26 01:49:18 +00001521 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001522
Devang Patel1dbc7712009-06-29 20:45:18 +00001523 DIE *SubprogramDie = CreateSubprogramDIE(ModuleCU, SP);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001524
1525 // Add to map.
1526 Slot = SubprogramDie;
1527
1528 // Add to context owner.
Devang Patel1dbc7712009-06-29 20:45:18 +00001529 ModuleCU->getDie()->AddChild(SubprogramDie);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001530
1531 // Expose as global.
1532 std::string Name;
Devang Patel1dbc7712009-06-29 20:45:18 +00001533 ModuleCU->AddGlobal(SP.getName(Name), SubprogramDie);
Devang Patel13e16b62009-06-26 01:49:18 +00001534 return;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001535}
1536
Daniel Dunbar00564992009-09-19 20:40:14 +00001537/// BeginModule - Emit all Dwarf sections that should come prior to the
1538/// content. Create global DIEs and emit initial debug info sections.
1539/// This is inovked by the target AsmPrinter.
Devang Patel208622d2009-06-25 22:36:02 +00001540void DwarfDebug::BeginModule(Module *M, MachineModuleInfo *mmi) {
1541 this->M = M;
1542
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001543 if (TimePassesIsEnabled)
1544 DebugTimer->startTimer();
1545
Devang Patel78ab9e22009-07-30 18:56:46 +00001546 DebugInfoFinder DbgFinder;
1547 DbgFinder.processModule(*M);
Devang Patel13e16b62009-06-26 01:49:18 +00001548
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001549 // Create all the compile unit DIEs.
Devang Patel78ab9e22009-07-30 18:56:46 +00001550 for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
1551 E = DbgFinder.compile_unit_end(); I != E; ++I)
Devang Patel13e16b62009-06-26 01:49:18 +00001552 ConstructCompileUnit(*I);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001553
1554 if (CompileUnits.empty()) {
1555 if (TimePassesIsEnabled)
1556 DebugTimer->stopTimer();
1557
1558 return;
1559 }
1560
Devang Patel70f44262009-06-29 20:38:13 +00001561 // If main compile unit for this module is not seen than randomly
1562 // select first compile unit.
Devang Patel1dbc7712009-06-29 20:45:18 +00001563 if (!ModuleCU)
1564 ModuleCU = CompileUnits[0];
Devang Patel70f44262009-06-29 20:38:13 +00001565
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001566 // If there is not any debug info available for any global variables and any
1567 // subprograms then there is not any debug info to emit.
Devang Patel78ab9e22009-07-30 18:56:46 +00001568 if (DbgFinder.global_variable_count() == 0
1569 && DbgFinder.subprogram_count() == 0) {
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001570 if (TimePassesIsEnabled)
1571 DebugTimer->stopTimer();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001572 return;
1573 }
Daniel Dunbarf612ff62009-09-19 20:40:05 +00001574
Devang Patel13e16b62009-06-26 01:49:18 +00001575 // Create DIEs for each of the externally visible global variables.
Devang Patel78ab9e22009-07-30 18:56:46 +00001576 for (DebugInfoFinder::iterator I = DbgFinder.global_variable_begin(),
1577 E = DbgFinder.global_variable_end(); I != E; ++I)
Devang Patel13e16b62009-06-26 01:49:18 +00001578 ConstructGlobalVariableDIE(*I);
1579
1580 // Create DIEs for each of the externally visible subprograms.
Devang Patel78ab9e22009-07-30 18:56:46 +00001581 for (DebugInfoFinder::iterator I = DbgFinder.subprogram_begin(),
1582 E = DbgFinder.subprogram_end(); I != E; ++I)
Devang Patel13e16b62009-06-26 01:49:18 +00001583 ConstructSubprogram(*I);
1584
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001585 MMI = mmi;
1586 shouldEmit = true;
1587 MMI->setDebugInfoAvailability(true);
1588
1589 // Prime section data.
Chris Lattnerf0144122009-07-28 03:13:23 +00001590 SectionMap.insert(Asm->getObjFileLowering().getTextSection());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001591
1592 // Print out .file directives to specify files for .loc directives. These are
1593 // printed out early so that they precede any .loc directives.
Chris Lattner33adcfb2009-08-22 21:43:10 +00001594 if (MAI->hasDotLocAndDotFile()) {
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001595 for (unsigned i = 1, e = getNumSourceIds()+1; i != e; ++i) {
1596 // Remember source id starts at 1.
1597 std::pair<unsigned, unsigned> Id = getSourceDirectoryAndFileIds(i);
1598 sys::Path FullPath(getSourceDirectoryName(Id.first));
1599 bool AppendOk =
1600 FullPath.appendComponent(getSourceFileName(Id.second));
1601 assert(AppendOk && "Could not append filename to directory!");
1602 AppendOk = false;
Chris Lattner74382b72009-08-23 22:45:37 +00001603 Asm->EmitFile(i, FullPath.str());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001604 Asm->EOL();
1605 }
1606 }
1607
1608 // Emit initial sections
1609 EmitInitial();
1610
1611 if (TimePassesIsEnabled)
1612 DebugTimer->stopTimer();
1613}
1614
1615/// EndModule - Emit all Dwarf sections that should come after the content.
1616///
1617void DwarfDebug::EndModule() {
1618 if (!ShouldEmitDwarfDebug())
1619 return;
1620
1621 if (TimePassesIsEnabled)
1622 DebugTimer->startTimer();
1623
1624 // Standard sections final addresses.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00001625 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getTextSection());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001626 EmitLabel("text_end", 0);
Chris Lattner6c2f9e12009-08-19 05:49:37 +00001627 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getDataSection());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001628 EmitLabel("data_end", 0);
1629
1630 // End text sections.
1631 for (unsigned i = 1, N = SectionMap.size(); i <= N; ++i) {
Chris Lattner6c2f9e12009-08-19 05:49:37 +00001632 Asm->OutStreamer.SwitchSection(SectionMap[i]);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001633 EmitLabel("section_end", i);
1634 }
1635
1636 // Emit common frame information.
1637 EmitCommonDebugFrame();
1638
1639 // Emit function debug frame information
1640 for (std::vector<FunctionDebugFrameInfo>::iterator I = DebugFrames.begin(),
1641 E = DebugFrames.end(); I != E; ++I)
1642 EmitFunctionDebugFrame(*I);
1643
1644 // Compute DIE offsets and sizes.
1645 SizeAndOffsets();
1646
1647 // Emit all the DIEs into a debug info section
1648 EmitDebugInfo();
1649
1650 // Corresponding abbreviations into a abbrev section.
1651 EmitAbbreviations();
1652
1653 // Emit source line correspondence into a debug line section.
1654 EmitDebugLines();
1655
1656 // Emit info into a debug pubnames section.
1657 EmitDebugPubNames();
1658
1659 // Emit info into a debug str section.
1660 EmitDebugStr();
1661
1662 // Emit info into a debug loc section.
1663 EmitDebugLoc();
1664
1665 // Emit info into a debug aranges section.
1666 EmitDebugARanges();
1667
1668 // Emit info into a debug ranges section.
1669 EmitDebugRanges();
1670
1671 // Emit info into a debug macinfo section.
1672 EmitDebugMacInfo();
1673
1674 // Emit inline info.
1675 EmitDebugInlineInfo();
1676
1677 if (TimePassesIsEnabled)
1678 DebugTimer->stopTimer();
1679}
1680
1681/// BeginFunction - Gather pre-function debug information. Assumes being
1682/// emitted immediately after the function entry point.
1683void DwarfDebug::BeginFunction(MachineFunction *MF) {
1684 this->MF = MF;
1685
1686 if (!ShouldEmitDwarfDebug()) return;
1687
1688 if (TimePassesIsEnabled)
1689 DebugTimer->startTimer();
1690
1691 // Begin accumulating function debug information.
1692 MMI->BeginFunction(MF);
1693
1694 // Assumes in correct section after the entry point.
1695 EmitLabel("func_begin", ++SubprogramCount);
1696
1697 // Emit label for the implicitly defined dbg.stoppoint at the start of the
1698 // function.
1699 DebugLoc FDL = MF->getDefaultDebugLoc();
1700 if (!FDL.isUnknown()) {
1701 DebugLocTuple DLT = MF->getDebugLocTuple(FDL);
1702 unsigned LabelID = RecordSourceLine(DLT.Line, DLT.Col,
1703 DICompileUnit(DLT.CompileUnit));
1704 Asm->printLabel(LabelID);
Chris Lattnerc5ea2632009-09-09 23:14:36 +00001705 O << '\n';
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001706 }
1707
1708 if (TimePassesIsEnabled)
1709 DebugTimer->stopTimer();
1710}
1711
1712/// EndFunction - Gather and emit post-function debug information.
1713///
1714void DwarfDebug::EndFunction(MachineFunction *MF) {
1715 if (!ShouldEmitDwarfDebug()) return;
1716
1717 if (TimePassesIsEnabled)
1718 DebugTimer->startTimer();
1719
1720 // Define end label for subprogram.
1721 EmitLabel("func_end", SubprogramCount);
1722
1723 // Get function line info.
1724 if (!Lines.empty()) {
1725 // Get section line info.
Chris Lattner290c2f52009-08-03 23:20:21 +00001726 unsigned ID = SectionMap.insert(Asm->getCurrentSection());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001727 if (SectionSourceLines.size() < ID) SectionSourceLines.resize(ID);
1728 std::vector<SrcLineInfo> &SectionLineInfos = SectionSourceLines[ID-1];
1729 // Append the function info to section info.
1730 SectionLineInfos.insert(SectionLineInfos.end(),
1731 Lines.begin(), Lines.end());
1732 }
1733
1734 // Construct the DbgScope for abstract instances.
1735 for (SmallVector<DbgScope *, 32>::iterator
1736 I = AbstractInstanceRootList.begin(),
1737 E = AbstractInstanceRootList.end(); I != E; ++I)
Bill Wendling17956162009-05-20 23:28:48 +00001738 ConstructFunctionDbgScope(*I);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001739
1740 // Construct scopes for subprogram.
1741 if (FunctionDbgScope)
1742 ConstructFunctionDbgScope(FunctionDbgScope);
1743 else
1744 // FIXME: This is wrong. We are essentially getting past a problem with
1745 // debug information not being able to handle unreachable blocks that have
1746 // debug information in them. In particular, those unreachable blocks that
1747 // have "region end" info in them. That situation results in the "root
1748 // scope" not being created. If that's the case, then emit a "default"
1749 // scope, i.e., one that encompasses the whole function. This isn't
1750 // desirable. And a better way of handling this (and all of the debugging
1751 // information) needs to be explored.
1752 ConstructDefaultDbgScope(MF);
1753
1754 DebugFrames.push_back(FunctionDebugFrameInfo(SubprogramCount,
1755 MMI->getFrameMoves()));
1756
1757 // Clear debug info
1758 if (FunctionDbgScope) {
1759 delete FunctionDbgScope;
1760 DbgScopeMap.clear();
1761 DbgAbstractScopeMap.clear();
1762 DbgConcreteScopeMap.clear();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001763 FunctionDbgScope = NULL;
1764 LexicalScopeStack.clear();
1765 AbstractInstanceRootList.clear();
Devang Patel9217f792009-06-12 19:24:05 +00001766 AbstractInstanceRootMap.clear();
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001767 }
1768
1769 Lines.clear();
1770
1771 if (TimePassesIsEnabled)
1772 DebugTimer->stopTimer();
1773}
1774
1775/// RecordSourceLine - Records location information and associates it with a
1776/// label. Returns a unique label ID used to generate a label and provide
1777/// correspondence to the source line list.
1778unsigned DwarfDebug::RecordSourceLine(Value *V, unsigned Line, unsigned Col) {
1779 if (TimePassesIsEnabled)
1780 DebugTimer->startTimer();
1781
1782 CompileUnit *Unit = CompileUnitMap[V];
1783 assert(Unit && "Unable to find CompileUnit");
1784 unsigned ID = MMI->NextLabelID();
1785 Lines.push_back(SrcLineInfo(Line, Col, Unit->getID(), ID));
1786
1787 if (TimePassesIsEnabled)
1788 DebugTimer->stopTimer();
1789
1790 return ID;
1791}
1792
1793/// RecordSourceLine - Records location information and associates it with a
1794/// label. Returns a unique label ID used to generate a label and provide
1795/// correspondence to the source line list.
1796unsigned DwarfDebug::RecordSourceLine(unsigned Line, unsigned Col,
1797 DICompileUnit CU) {
Devang Patele4b27562009-08-28 23:24:31 +00001798 if (!MMI)
1799 return 0;
1800
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001801 if (TimePassesIsEnabled)
1802 DebugTimer->startTimer();
1803
1804 std::string Dir, Fn;
1805 unsigned Src = GetOrCreateSourceID(CU.getDirectory(Dir),
1806 CU.getFilename(Fn));
1807 unsigned ID = MMI->NextLabelID();
1808 Lines.push_back(SrcLineInfo(Line, Col, Src, ID));
1809
1810 if (TimePassesIsEnabled)
1811 DebugTimer->stopTimer();
1812
1813 return ID;
1814}
1815
1816/// getOrCreateSourceID - Public version of GetOrCreateSourceID. This can be
1817/// timed. Look up the source id with the given directory and source file
1818/// names. If none currently exists, create a new id and insert it in the
1819/// SourceIds map. This can update DirectoryNames and SourceFileNames maps as
1820/// well.
1821unsigned DwarfDebug::getOrCreateSourceID(const std::string &DirName,
1822 const std::string &FileName) {
1823 if (TimePassesIsEnabled)
1824 DebugTimer->startTimer();
1825
1826 unsigned SrcId = GetOrCreateSourceID(DirName, FileName);
1827
1828 if (TimePassesIsEnabled)
1829 DebugTimer->stopTimer();
1830
1831 return SrcId;
1832}
1833
1834/// RecordRegionStart - Indicate the start of a region.
Devang Patele4b27562009-08-28 23:24:31 +00001835unsigned DwarfDebug::RecordRegionStart(MDNode *N) {
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001836 if (TimePassesIsEnabled)
1837 DebugTimer->startTimer();
1838
Devang Patele4b27562009-08-28 23:24:31 +00001839 DbgScope *Scope = getOrCreateScope(N);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001840 unsigned ID = MMI->NextLabelID();
1841 if (!Scope->getStartLabelID()) Scope->setStartLabelID(ID);
1842 LexicalScopeStack.push_back(Scope);
1843
1844 if (TimePassesIsEnabled)
1845 DebugTimer->stopTimer();
1846
1847 return ID;
1848}
1849
1850/// RecordRegionEnd - Indicate the end of a region.
Devang Patele4b27562009-08-28 23:24:31 +00001851unsigned DwarfDebug::RecordRegionEnd(MDNode *N) {
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001852 if (TimePassesIsEnabled)
1853 DebugTimer->startTimer();
1854
Devang Patele4b27562009-08-28 23:24:31 +00001855 DbgScope *Scope = getOrCreateScope(N);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001856 unsigned ID = MMI->NextLabelID();
1857 Scope->setEndLabelID(ID);
Devang Pateldaf9e022009-06-13 02:16:18 +00001858 // FIXME : region.end() may not be in the last basic block.
1859 // For now, do not pop last lexical scope because next basic
1860 // block may start new inlined function's body.
1861 unsigned LSSize = LexicalScopeStack.size();
1862 if (LSSize != 0 && LSSize != 1)
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001863 LexicalScopeStack.pop_back();
1864
1865 if (TimePassesIsEnabled)
1866 DebugTimer->stopTimer();
1867
1868 return ID;
1869}
1870
1871/// RecordVariable - Indicate the declaration of a local variable.
Devang Patele4b27562009-08-28 23:24:31 +00001872void DwarfDebug::RecordVariable(MDNode *N, unsigned FrameIndex) {
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001873 if (TimePassesIsEnabled)
1874 DebugTimer->startTimer();
1875
Devang Patele4b27562009-08-28 23:24:31 +00001876 DIDescriptor Desc(N);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001877 DbgScope *Scope = NULL;
1878 bool InlinedFnVar = false;
1879
Devang Patele4b27562009-08-28 23:24:31 +00001880 if (Desc.getTag() == dwarf::DW_TAG_variable)
1881 Scope = getOrCreateScope(DIGlobalVariable(N).getContext().getNode());
1882 else {
Devang Patel24f20e02009-08-22 17:12:53 +00001883 bool InlinedVar = false;
Devang Patele4b27562009-08-28 23:24:31 +00001884 MDNode *Context = DIVariable(N).getContext().getNode();
1885 DISubprogram SP(Context);
Devang Patel24f20e02009-08-22 17:12:53 +00001886 if (!SP.isNull()) {
1887 // SP is inserted into DbgAbstractScopeMap when inlined function
1888 // start was recorded by RecordInlineFnStart.
Devang Patele4b27562009-08-28 23:24:31 +00001889 DenseMap<MDNode *, DbgScope *>::iterator
1890 I = DbgAbstractScopeMap.find(SP.getNode());
Devang Patel24f20e02009-08-22 17:12:53 +00001891 if (I != DbgAbstractScopeMap.end()) {
1892 InlinedVar = true;
1893 Scope = I->second;
1894 }
1895 }
Daniel Dunbarf612ff62009-09-19 20:40:05 +00001896 if (!InlinedVar)
Devang Patele4b27562009-08-28 23:24:31 +00001897 Scope = getOrCreateScope(Context);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001898 }
1899
1900 assert(Scope && "Unable to find the variable's scope");
Devang Patele4b27562009-08-28 23:24:31 +00001901 DbgVariable *DV = new DbgVariable(DIVariable(N), FrameIndex, InlinedFnVar);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001902 Scope->AddVariable(DV);
1903
1904 if (TimePassesIsEnabled)
1905 DebugTimer->stopTimer();
1906}
1907
1908//// RecordInlinedFnStart - Indicate the start of inlined subroutine.
1909unsigned DwarfDebug::RecordInlinedFnStart(DISubprogram &SP, DICompileUnit CU,
1910 unsigned Line, unsigned Col) {
1911 unsigned LabelID = MMI->NextLabelID();
1912
Chris Lattner33adcfb2009-08-22 21:43:10 +00001913 if (!MAI->doesDwarfUsesInlineInfoSection())
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001914 return LabelID;
1915
1916 if (TimePassesIsEnabled)
1917 DebugTimer->startTimer();
1918
Devang Patele4b27562009-08-28 23:24:31 +00001919 MDNode *Node = SP.getNode();
1920 DenseMap<const MDNode *, DbgScope *>::iterator
1921 II = AbstractInstanceRootMap.find(Node);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001922
1923 if (II == AbstractInstanceRootMap.end()) {
1924 // Create an abstract instance entry for this inlined function if it doesn't
1925 // already exist.
Devang Patele4b27562009-08-28 23:24:31 +00001926 DbgScope *Scope = new DbgScope(NULL, DIDescriptor(Node));
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001927
1928 // Get the compile unit context.
Devang Patele4b27562009-08-28 23:24:31 +00001929 DIE *SPDie = ModuleCU->getDieMapSlotFor(Node);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001930 if (!SPDie)
Devang Patel1dbc7712009-06-29 20:45:18 +00001931 SPDie = CreateSubprogramDIE(ModuleCU, SP, false, true);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001932
1933 // Mark as being inlined. This makes this subprogram entry an abstract
1934 // instance root.
1935 // FIXME: Our debugger doesn't care about the value of DW_AT_inline, only
1936 // that it's defined. That probably won't change in the future. However,
1937 // this could be more elegant.
1938 AddUInt(SPDie, dwarf::DW_AT_inline, 0, dwarf::DW_INL_declared_not_inlined);
1939
1940 // Keep track of the abstract scope for this function.
Devang Patele4b27562009-08-28 23:24:31 +00001941 DbgAbstractScopeMap[Node] = Scope;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001942
Devang Patele4b27562009-08-28 23:24:31 +00001943 AbstractInstanceRootMap[Node] = Scope;
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001944 AbstractInstanceRootList.push_back(Scope);
1945 }
1946
1947 // Create a concrete inlined instance for this inlined function.
Devang Patele4b27562009-08-28 23:24:31 +00001948 DbgConcreteScope *ConcreteScope = new DbgConcreteScope(DIDescriptor(Node));
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001949 DIE *ScopeDie = new DIE(dwarf::DW_TAG_inlined_subroutine);
Devang Patel1dbc7712009-06-29 20:45:18 +00001950 ScopeDie->setAbstractCompileUnit(ModuleCU);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001951
Devang Patele4b27562009-08-28 23:24:31 +00001952 DIE *Origin = ModuleCU->getDieMapSlotFor(Node);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001953 AddDIEEntry(ScopeDie, dwarf::DW_AT_abstract_origin,
1954 dwarf::DW_FORM_ref4, Origin);
Devang Patel1dbc7712009-06-29 20:45:18 +00001955 AddUInt(ScopeDie, dwarf::DW_AT_call_file, 0, ModuleCU->getID());
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001956 AddUInt(ScopeDie, dwarf::DW_AT_call_line, 0, Line);
1957 AddUInt(ScopeDie, dwarf::DW_AT_call_column, 0, Col);
1958
1959 ConcreteScope->setDie(ScopeDie);
1960 ConcreteScope->setStartLabelID(LabelID);
1961 MMI->RecordUsedDbgLabel(LabelID);
1962
1963 LexicalScopeStack.back()->AddConcreteInst(ConcreteScope);
1964
1965 // Keep track of the concrete scope that's inlined into this function.
Devang Patele4b27562009-08-28 23:24:31 +00001966 DenseMap<MDNode *, SmallVector<DbgScope *, 8> >::iterator
1967 SI = DbgConcreteScopeMap.find(Node);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001968
1969 if (SI == DbgConcreteScopeMap.end())
Devang Patele4b27562009-08-28 23:24:31 +00001970 DbgConcreteScopeMap[Node].push_back(ConcreteScope);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001971 else
1972 SI->second.push_back(ConcreteScope);
1973
1974 // Track the start label for this inlined function.
Devang Patele4b27562009-08-28 23:24:31 +00001975 DenseMap<MDNode *, SmallVector<unsigned, 4> >::iterator
1976 I = InlineInfo.find(Node);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001977
1978 if (I == InlineInfo.end())
Devang Patele4b27562009-08-28 23:24:31 +00001979 InlineInfo[Node].push_back(LabelID);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001980 else
1981 I->second.push_back(LabelID);
1982
1983 if (TimePassesIsEnabled)
1984 DebugTimer->stopTimer();
1985
1986 return LabelID;
1987}
1988
1989/// RecordInlinedFnEnd - Indicate the end of inlined subroutine.
1990unsigned DwarfDebug::RecordInlinedFnEnd(DISubprogram &SP) {
Chris Lattner33adcfb2009-08-22 21:43:10 +00001991 if (!MAI->doesDwarfUsesInlineInfoSection())
Bill Wendlingf0fb9872009-05-20 23:19:06 +00001992 return 0;
1993
1994 if (TimePassesIsEnabled)
1995 DebugTimer->startTimer();
1996
Devang Patele4b27562009-08-28 23:24:31 +00001997 MDNode *Node = SP.getNode();
1998 DenseMap<MDNode *, SmallVector<DbgScope *, 8> >::iterator
1999 I = DbgConcreteScopeMap.find(Node);
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002000
2001 if (I == DbgConcreteScopeMap.end()) {
2002 // FIXME: Can this situation actually happen? And if so, should it?
2003 if (TimePassesIsEnabled)
2004 DebugTimer->stopTimer();
2005
2006 return 0;
2007 }
2008
2009 SmallVector<DbgScope *, 8> &Scopes = I->second;
Devang Patel11a407f2009-06-15 21:45:50 +00002010 if (Scopes.empty()) {
2011 // Returned ID is 0 if this is unbalanced "end of inlined
2012 // scope". This could happen if optimizer eats dbg intrinsics
2013 // or "beginning of inlined scope" is not recoginized due to
2014 // missing location info. In such cases, ignore this region.end.
2015 return 0;
2016 }
2017
Bill Wendlingf0fb9872009-05-20 23:19:06 +00002018 DbgScope *Scope = Scopes.back(); Scopes.pop_back();
2019 unsigned ID = MMI->NextLabelID();
2020 MMI->RecordUsedDbgLabel(ID);
2021 Scope->setEndLabelID(ID);
2022
2023 if (TimePassesIsEnabled)
2024 DebugTimer->stopTimer();
2025
2026 return ID;
2027}
2028
Bill Wendling829e67b2009-05-20 23:22:40 +00002029//===----------------------------------------------------------------------===//
2030// Emit Methods
2031//===----------------------------------------------------------------------===//
2032
Bill Wendling94d04b82009-05-20 23:21:38 +00002033/// SizeAndOffsetDie - Compute the size and offset of a DIE.
2034///
2035unsigned DwarfDebug::SizeAndOffsetDie(DIE *Die, unsigned Offset, bool Last) {
2036 // Get the children.
2037 const std::vector<DIE *> &Children = Die->getChildren();
2038
2039 // If not last sibling and has children then add sibling offset attribute.
2040 if (!Last && !Children.empty()) Die->AddSiblingOffset();
2041
2042 // Record the abbreviation.
2043 AssignAbbrevNumber(Die->getAbbrev());
2044
2045 // Get the abbreviation for this DIE.
2046 unsigned AbbrevNumber = Die->getAbbrevNumber();
2047 const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2048
2049 // Set DIE offset
2050 Die->setOffset(Offset);
2051
2052 // Start the size with the size of abbreviation code.
Chris Lattneraf76e592009-08-22 20:48:53 +00002053 Offset += MCAsmInfo::getULEB128Size(AbbrevNumber);
Bill Wendling94d04b82009-05-20 23:21:38 +00002054
2055 const SmallVector<DIEValue*, 32> &Values = Die->getValues();
2056 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
2057
2058 // Size the DIE attribute values.
2059 for (unsigned i = 0, N = Values.size(); i < N; ++i)
2060 // Size attribute value.
2061 Offset += Values[i]->SizeOf(TD, AbbrevData[i].getForm());
2062
2063 // Size the DIE children if any.
2064 if (!Children.empty()) {
2065 assert(Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes &&
2066 "Children flag not set");
2067
2068 for (unsigned j = 0, M = Children.size(); j < M; ++j)
2069 Offset = SizeAndOffsetDie(Children[j], Offset, (j + 1) == M);
2070
2071 // End of children marker.
2072 Offset += sizeof(int8_t);
2073 }
2074
2075 Die->setSize(Offset - Die->getOffset());
2076 return Offset;
2077}
2078
2079/// SizeAndOffsets - Compute the size and offset of all the DIEs.
2080///
2081void DwarfDebug::SizeAndOffsets() {
2082 // Compute size of compile unit header.
2083 static unsigned Offset =
2084 sizeof(int32_t) + // Length of Compilation Unit Info
2085 sizeof(int16_t) + // DWARF version number
2086 sizeof(int32_t) + // Offset Into Abbrev. Section
2087 sizeof(int8_t); // Pointer Size (in bytes)
2088
Devang Patel1dbc7712009-06-29 20:45:18 +00002089 SizeAndOffsetDie(ModuleCU->getDie(), Offset, true);
2090 CompileUnitOffsets[ModuleCU] = 0;
Bill Wendling94d04b82009-05-20 23:21:38 +00002091}
2092
2093/// EmitInitial - Emit initial Dwarf declarations. This is necessary for cc
2094/// tools to recognize the object file contains Dwarf information.
2095void DwarfDebug::EmitInitial() {
2096 // Check to see if we already emitted intial headers.
2097 if (didInitial) return;
2098 didInitial = true;
2099
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002100 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
Daniel Dunbarf612ff62009-09-19 20:40:05 +00002101
Bill Wendling94d04b82009-05-20 23:21:38 +00002102 // Dwarf sections base addresses.
Chris Lattner33adcfb2009-08-22 21:43:10 +00002103 if (MAI->doesDwarfRequireFrameSection()) {
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002104 Asm->OutStreamer.SwitchSection(TLOF.getDwarfFrameSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002105 EmitLabel("section_debug_frame", 0);
2106 }
2107
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002108 Asm->OutStreamer.SwitchSection(TLOF.getDwarfInfoSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002109 EmitLabel("section_info", 0);
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002110 Asm->OutStreamer.SwitchSection(TLOF.getDwarfAbbrevSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002111 EmitLabel("section_abbrev", 0);
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002112 Asm->OutStreamer.SwitchSection(TLOF.getDwarfARangesSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002113 EmitLabel("section_aranges", 0);
2114
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002115 if (const MCSection *LineInfoDirective = TLOF.getDwarfMacroInfoSection()) {
2116 Asm->OutStreamer.SwitchSection(LineInfoDirective);
Bill Wendling94d04b82009-05-20 23:21:38 +00002117 EmitLabel("section_macinfo", 0);
2118 }
2119
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002120 Asm->OutStreamer.SwitchSection(TLOF.getDwarfLineSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002121 EmitLabel("section_line", 0);
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002122 Asm->OutStreamer.SwitchSection(TLOF.getDwarfLocSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002123 EmitLabel("section_loc", 0);
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002124 Asm->OutStreamer.SwitchSection(TLOF.getDwarfPubNamesSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002125 EmitLabel("section_pubnames", 0);
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002126 Asm->OutStreamer.SwitchSection(TLOF.getDwarfStrSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002127 EmitLabel("section_str", 0);
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002128 Asm->OutStreamer.SwitchSection(TLOF.getDwarfRangesSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002129 EmitLabel("section_ranges", 0);
2130
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002131 Asm->OutStreamer.SwitchSection(TLOF.getTextSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002132 EmitLabel("text_begin", 0);
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002133 Asm->OutStreamer.SwitchSection(TLOF.getDataSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002134 EmitLabel("data_begin", 0);
2135}
2136
2137/// EmitDIE - Recusively Emits a debug information entry.
2138///
2139void DwarfDebug::EmitDIE(DIE *Die) {
2140 // Get the abbreviation for this DIE.
2141 unsigned AbbrevNumber = Die->getAbbrevNumber();
2142 const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2143
2144 Asm->EOL();
2145
2146 // Emit the code (index) for the abbreviation.
2147 Asm->EmitULEB128Bytes(AbbrevNumber);
2148
2149 if (Asm->isVerbose())
2150 Asm->EOL(std::string("Abbrev [" +
2151 utostr(AbbrevNumber) +
2152 "] 0x" + utohexstr(Die->getOffset()) +
2153 ":0x" + utohexstr(Die->getSize()) + " " +
2154 dwarf::TagString(Abbrev->getTag())));
2155 else
2156 Asm->EOL();
2157
2158 SmallVector<DIEValue*, 32> &Values = Die->getValues();
2159 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
2160
2161 // Emit the DIE attribute values.
2162 for (unsigned i = 0, N = Values.size(); i < N; ++i) {
2163 unsigned Attr = AbbrevData[i].getAttribute();
2164 unsigned Form = AbbrevData[i].getForm();
2165 assert(Form && "Too many attributes for DIE (check abbreviation)");
2166
2167 switch (Attr) {
2168 case dwarf::DW_AT_sibling:
2169 Asm->EmitInt32(Die->SiblingOffset());
2170 break;
2171 case dwarf::DW_AT_abstract_origin: {
2172 DIEEntry *E = cast<DIEEntry>(Values[i]);
2173 DIE *Origin = E->getEntry();
2174 unsigned Addr =
2175 CompileUnitOffsets[Die->getAbstractCompileUnit()] +
2176 Origin->getOffset();
2177
2178 Asm->EmitInt32(Addr);
2179 break;
2180 }
2181 default:
2182 // Emit an attribute using the defined form.
2183 Values[i]->EmitValue(this, Form);
2184 break;
2185 }
2186
2187 Asm->EOL(dwarf::AttributeString(Attr));
2188 }
2189
2190 // Emit the DIE children if any.
2191 if (Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes) {
2192 const std::vector<DIE *> &Children = Die->getChildren();
2193
2194 for (unsigned j = 0, M = Children.size(); j < M; ++j)
2195 EmitDIE(Children[j]);
2196
2197 Asm->EmitInt8(0); Asm->EOL("End Of Children Mark");
2198 }
2199}
2200
2201/// EmitDebugInfo / EmitDebugInfoPerCU - Emit the debug info section.
2202///
2203void DwarfDebug::EmitDebugInfoPerCU(CompileUnit *Unit) {
2204 DIE *Die = Unit->getDie();
2205
2206 // Emit the compile units header.
2207 EmitLabel("info_begin", Unit->getID());
2208
2209 // Emit size of content not including length itself
2210 unsigned ContentSize = Die->getSize() +
2211 sizeof(int16_t) + // DWARF version number
2212 sizeof(int32_t) + // Offset Into Abbrev. Section
2213 sizeof(int8_t) + // Pointer Size (in bytes)
2214 sizeof(int32_t); // FIXME - extra pad for gdb bug.
2215
2216 Asm->EmitInt32(ContentSize); Asm->EOL("Length of Compilation Unit Info");
2217 Asm->EmitInt16(dwarf::DWARF_VERSION); Asm->EOL("DWARF version number");
2218 EmitSectionOffset("abbrev_begin", "section_abbrev", 0, 0, true, false);
2219 Asm->EOL("Offset Into Abbrev. Section");
2220 Asm->EmitInt8(TD->getPointerSize()); Asm->EOL("Address Size (in bytes)");
2221
2222 EmitDIE(Die);
2223 // FIXME - extra padding for gdb bug.
2224 Asm->EmitInt8(0); Asm->EOL("Extra Pad For GDB");
2225 Asm->EmitInt8(0); Asm->EOL("Extra Pad For GDB");
2226 Asm->EmitInt8(0); Asm->EOL("Extra Pad For GDB");
2227 Asm->EmitInt8(0); Asm->EOL("Extra Pad For GDB");
2228 EmitLabel("info_end", Unit->getID());
2229
2230 Asm->EOL();
2231}
2232
2233void DwarfDebug::EmitDebugInfo() {
2234 // Start debug info section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002235 Asm->OutStreamer.SwitchSection(
2236 Asm->getObjFileLowering().getDwarfInfoSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002237
Devang Patel1dbc7712009-06-29 20:45:18 +00002238 EmitDebugInfoPerCU(ModuleCU);
Bill Wendling94d04b82009-05-20 23:21:38 +00002239}
2240
2241/// EmitAbbreviations - Emit the abbreviation section.
2242///
2243void DwarfDebug::EmitAbbreviations() const {
2244 // Check to see if it is worth the effort.
2245 if (!Abbreviations.empty()) {
2246 // Start the debug abbrev section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002247 Asm->OutStreamer.SwitchSection(
2248 Asm->getObjFileLowering().getDwarfAbbrevSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002249
2250 EmitLabel("abbrev_begin", 0);
2251
2252 // For each abbrevation.
2253 for (unsigned i = 0, N = Abbreviations.size(); i < N; ++i) {
2254 // Get abbreviation data
2255 const DIEAbbrev *Abbrev = Abbreviations[i];
2256
2257 // Emit the abbrevations code (base 1 index.)
2258 Asm->EmitULEB128Bytes(Abbrev->getNumber());
2259 Asm->EOL("Abbreviation Code");
2260
2261 // Emit the abbreviations data.
2262 Abbrev->Emit(Asm);
2263
2264 Asm->EOL();
2265 }
2266
2267 // Mark end of abbreviations.
2268 Asm->EmitULEB128Bytes(0); Asm->EOL("EOM(3)");
2269
2270 EmitLabel("abbrev_end", 0);
2271 Asm->EOL();
2272 }
2273}
2274
2275/// EmitEndOfLineMatrix - Emit the last address of the section and the end of
2276/// the line matrix.
2277///
2278void DwarfDebug::EmitEndOfLineMatrix(unsigned SectionEnd) {
2279 // Define last address of section.
2280 Asm->EmitInt8(0); Asm->EOL("Extended Op");
2281 Asm->EmitInt8(TD->getPointerSize() + 1); Asm->EOL("Op size");
2282 Asm->EmitInt8(dwarf::DW_LNE_set_address); Asm->EOL("DW_LNE_set_address");
2283 EmitReference("section_end", SectionEnd); Asm->EOL("Section end label");
2284
2285 // Mark end of matrix.
2286 Asm->EmitInt8(0); Asm->EOL("DW_LNE_end_sequence");
2287 Asm->EmitULEB128Bytes(1); Asm->EOL();
2288 Asm->EmitInt8(1); Asm->EOL();
2289}
2290
2291/// EmitDebugLines - Emit source line information.
2292///
2293void DwarfDebug::EmitDebugLines() {
2294 // If the target is using .loc/.file, the assembler will be emitting the
2295 // .debug_line table automatically.
Chris Lattner33adcfb2009-08-22 21:43:10 +00002296 if (MAI->hasDotLocAndDotFile())
Bill Wendling94d04b82009-05-20 23:21:38 +00002297 return;
2298
2299 // Minimum line delta, thus ranging from -10..(255-10).
2300 const int MinLineDelta = -(dwarf::DW_LNS_fixed_advance_pc + 1);
2301 // Maximum line delta, thus ranging from -10..(255-10).
2302 const int MaxLineDelta = 255 + MinLineDelta;
2303
2304 // Start the dwarf line section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002305 Asm->OutStreamer.SwitchSection(
2306 Asm->getObjFileLowering().getDwarfLineSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002307
2308 // Construct the section header.
2309 EmitDifference("line_end", 0, "line_begin", 0, true);
2310 Asm->EOL("Length of Source Line Info");
2311 EmitLabel("line_begin", 0);
2312
2313 Asm->EmitInt16(dwarf::DWARF_VERSION); Asm->EOL("DWARF version number");
2314
2315 EmitDifference("line_prolog_end", 0, "line_prolog_begin", 0, true);
2316 Asm->EOL("Prolog Length");
2317 EmitLabel("line_prolog_begin", 0);
2318
2319 Asm->EmitInt8(1); Asm->EOL("Minimum Instruction Length");
2320
2321 Asm->EmitInt8(1); Asm->EOL("Default is_stmt_start flag");
2322
2323 Asm->EmitInt8(MinLineDelta); Asm->EOL("Line Base Value (Special Opcodes)");
2324
2325 Asm->EmitInt8(MaxLineDelta); Asm->EOL("Line Range Value (Special Opcodes)");
2326
2327 Asm->EmitInt8(-MinLineDelta); Asm->EOL("Special Opcode Base");
2328
2329 // Line number standard opcode encodings argument count
2330 Asm->EmitInt8(0); Asm->EOL("DW_LNS_copy arg count");
2331 Asm->EmitInt8(1); Asm->EOL("DW_LNS_advance_pc arg count");
2332 Asm->EmitInt8(1); Asm->EOL("DW_LNS_advance_line arg count");
2333 Asm->EmitInt8(1); Asm->EOL("DW_LNS_set_file arg count");
2334 Asm->EmitInt8(1); Asm->EOL("DW_LNS_set_column arg count");
2335 Asm->EmitInt8(0); Asm->EOL("DW_LNS_negate_stmt arg count");
2336 Asm->EmitInt8(0); Asm->EOL("DW_LNS_set_basic_block arg count");
2337 Asm->EmitInt8(0); Asm->EOL("DW_LNS_const_add_pc arg count");
2338 Asm->EmitInt8(1); Asm->EOL("DW_LNS_fixed_advance_pc arg count");
2339
2340 // Emit directories.
2341 for (unsigned DI = 1, DE = getNumSourceDirectories()+1; DI != DE; ++DI) {
2342 Asm->EmitString(getSourceDirectoryName(DI));
2343 Asm->EOL("Directory");
2344 }
2345
2346 Asm->EmitInt8(0); Asm->EOL("End of directories");
2347
2348 // Emit files.
2349 for (unsigned SI = 1, SE = getNumSourceIds()+1; SI != SE; ++SI) {
2350 // Remember source id starts at 1.
2351 std::pair<unsigned, unsigned> Id = getSourceDirectoryAndFileIds(SI);
2352 Asm->EmitString(getSourceFileName(Id.second));
2353 Asm->EOL("Source");
2354 Asm->EmitULEB128Bytes(Id.first);
2355 Asm->EOL("Directory #");
2356 Asm->EmitULEB128Bytes(0);
2357 Asm->EOL("Mod date");
2358 Asm->EmitULEB128Bytes(0);
2359 Asm->EOL("File size");
2360 }
2361
2362 Asm->EmitInt8(0); Asm->EOL("End of files");
2363
2364 EmitLabel("line_prolog_end", 0);
2365
2366 // A sequence for each text section.
2367 unsigned SecSrcLinesSize = SectionSourceLines.size();
2368
2369 for (unsigned j = 0; j < SecSrcLinesSize; ++j) {
2370 // Isolate current sections line info.
2371 const std::vector<SrcLineInfo> &LineInfos = SectionSourceLines[j];
2372
Chris Lattner93b6db32009-08-08 23:39:42 +00002373 /*if (Asm->isVerbose()) {
Chris Lattnera87dea42009-07-31 18:48:30 +00002374 const MCSection *S = SectionMap[j + 1];
Chris Lattner33adcfb2009-08-22 21:43:10 +00002375 O << '\t' << MAI->getCommentString() << " Section"
Bill Wendling94d04b82009-05-20 23:21:38 +00002376 << S->getName() << '\n';
Chris Lattner93b6db32009-08-08 23:39:42 +00002377 }*/
2378 Asm->EOL();
Bill Wendling94d04b82009-05-20 23:21:38 +00002379
2380 // Dwarf assumes we start with first line of first source file.
2381 unsigned Source = 1;
2382 unsigned Line = 1;
2383
2384 // Construct rows of the address, source, line, column matrix.
2385 for (unsigned i = 0, N = LineInfos.size(); i < N; ++i) {
2386 const SrcLineInfo &LineInfo = LineInfos[i];
2387 unsigned LabelID = MMI->MappedLabel(LineInfo.getLabelID());
2388 if (!LabelID) continue;
2389
Caroline Ticec6f9d622009-09-11 18:25:54 +00002390 if (LineInfo.getLine() == 0) continue;
2391
Bill Wendling94d04b82009-05-20 23:21:38 +00002392 if (!Asm->isVerbose())
2393 Asm->EOL();
2394 else {
2395 std::pair<unsigned, unsigned> SourceID =
2396 getSourceDirectoryAndFileIds(LineInfo.getSourceID());
Chris Lattner33adcfb2009-08-22 21:43:10 +00002397 O << '\t' << MAI->getCommentString() << ' '
Bill Wendling94d04b82009-05-20 23:21:38 +00002398 << getSourceDirectoryName(SourceID.first) << ' '
2399 << getSourceFileName(SourceID.second)
2400 <<" :" << utostr_32(LineInfo.getLine()) << '\n';
2401 }
2402
2403 // Define the line address.
2404 Asm->EmitInt8(0); Asm->EOL("Extended Op");
2405 Asm->EmitInt8(TD->getPointerSize() + 1); Asm->EOL("Op size");
2406 Asm->EmitInt8(dwarf::DW_LNE_set_address); Asm->EOL("DW_LNE_set_address");
2407 EmitReference("label", LabelID); Asm->EOL("Location label");
2408
2409 // If change of source, then switch to the new source.
2410 if (Source != LineInfo.getSourceID()) {
2411 Source = LineInfo.getSourceID();
2412 Asm->EmitInt8(dwarf::DW_LNS_set_file); Asm->EOL("DW_LNS_set_file");
2413 Asm->EmitULEB128Bytes(Source); Asm->EOL("New Source");
2414 }
2415
2416 // If change of line.
2417 if (Line != LineInfo.getLine()) {
2418 // Determine offset.
2419 int Offset = LineInfo.getLine() - Line;
2420 int Delta = Offset - MinLineDelta;
2421
2422 // Update line.
2423 Line = LineInfo.getLine();
2424
2425 // If delta is small enough and in range...
2426 if (Delta >= 0 && Delta < (MaxLineDelta - 1)) {
2427 // ... then use fast opcode.
2428 Asm->EmitInt8(Delta - MinLineDelta); Asm->EOL("Line Delta");
2429 } else {
2430 // ... otherwise use long hand.
2431 Asm->EmitInt8(dwarf::DW_LNS_advance_line);
2432 Asm->EOL("DW_LNS_advance_line");
2433 Asm->EmitSLEB128Bytes(Offset); Asm->EOL("Line Offset");
2434 Asm->EmitInt8(dwarf::DW_LNS_copy); Asm->EOL("DW_LNS_copy");
2435 }
2436 } else {
2437 // Copy the previous row (different address or source)
2438 Asm->EmitInt8(dwarf::DW_LNS_copy); Asm->EOL("DW_LNS_copy");
2439 }
2440 }
2441
2442 EmitEndOfLineMatrix(j + 1);
2443 }
2444
2445 if (SecSrcLinesSize == 0)
2446 // Because we're emitting a debug_line section, we still need a line
2447 // table. The linker and friends expect it to exist. If there's nothing to
2448 // put into it, emit an empty table.
2449 EmitEndOfLineMatrix(1);
2450
2451 EmitLabel("line_end", 0);
2452 Asm->EOL();
2453}
2454
2455/// EmitCommonDebugFrame - Emit common frame info into a debug frame section.
2456///
2457void DwarfDebug::EmitCommonDebugFrame() {
Chris Lattner33adcfb2009-08-22 21:43:10 +00002458 if (!MAI->doesDwarfRequireFrameSection())
Bill Wendling94d04b82009-05-20 23:21:38 +00002459 return;
2460
2461 int stackGrowth =
2462 Asm->TM.getFrameInfo()->getStackGrowthDirection() ==
2463 TargetFrameInfo::StackGrowsUp ?
2464 TD->getPointerSize() : -TD->getPointerSize();
2465
2466 // Start the dwarf frame section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002467 Asm->OutStreamer.SwitchSection(
2468 Asm->getObjFileLowering().getDwarfFrameSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002469
2470 EmitLabel("debug_frame_common", 0);
2471 EmitDifference("debug_frame_common_end", 0,
2472 "debug_frame_common_begin", 0, true);
2473 Asm->EOL("Length of Common Information Entry");
2474
2475 EmitLabel("debug_frame_common_begin", 0);
2476 Asm->EmitInt32((int)dwarf::DW_CIE_ID);
2477 Asm->EOL("CIE Identifier Tag");
2478 Asm->EmitInt8(dwarf::DW_CIE_VERSION);
2479 Asm->EOL("CIE Version");
2480 Asm->EmitString("");
2481 Asm->EOL("CIE Augmentation");
2482 Asm->EmitULEB128Bytes(1);
2483 Asm->EOL("CIE Code Alignment Factor");
2484 Asm->EmitSLEB128Bytes(stackGrowth);
2485 Asm->EOL("CIE Data Alignment Factor");
2486 Asm->EmitInt8(RI->getDwarfRegNum(RI->getRARegister(), false));
2487 Asm->EOL("CIE RA Column");
2488
2489 std::vector<MachineMove> Moves;
2490 RI->getInitialFrameState(Moves);
2491
2492 EmitFrameMoves(NULL, 0, Moves, false);
2493
2494 Asm->EmitAlignment(2, 0, 0, false);
2495 EmitLabel("debug_frame_common_end", 0);
2496
2497 Asm->EOL();
2498}
2499
2500/// EmitFunctionDebugFrame - Emit per function frame info into a debug frame
2501/// section.
2502void
2503DwarfDebug::EmitFunctionDebugFrame(const FunctionDebugFrameInfo&DebugFrameInfo){
Chris Lattner33adcfb2009-08-22 21:43:10 +00002504 if (!MAI->doesDwarfRequireFrameSection())
Bill Wendling94d04b82009-05-20 23:21:38 +00002505 return;
2506
2507 // Start the dwarf frame section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002508 Asm->OutStreamer.SwitchSection(
2509 Asm->getObjFileLowering().getDwarfFrameSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002510
2511 EmitDifference("debug_frame_end", DebugFrameInfo.Number,
2512 "debug_frame_begin", DebugFrameInfo.Number, true);
2513 Asm->EOL("Length of Frame Information Entry");
2514
2515 EmitLabel("debug_frame_begin", DebugFrameInfo.Number);
2516
2517 EmitSectionOffset("debug_frame_common", "section_debug_frame",
2518 0, 0, true, false);
2519 Asm->EOL("FDE CIE offset");
2520
2521 EmitReference("func_begin", DebugFrameInfo.Number);
2522 Asm->EOL("FDE initial location");
2523 EmitDifference("func_end", DebugFrameInfo.Number,
2524 "func_begin", DebugFrameInfo.Number);
2525 Asm->EOL("FDE address range");
2526
2527 EmitFrameMoves("func_begin", DebugFrameInfo.Number, DebugFrameInfo.Moves,
2528 false);
2529
2530 Asm->EmitAlignment(2, 0, 0, false);
2531 EmitLabel("debug_frame_end", DebugFrameInfo.Number);
2532
2533 Asm->EOL();
2534}
2535
2536void DwarfDebug::EmitDebugPubNamesPerCU(CompileUnit *Unit) {
2537 EmitDifference("pubnames_end", Unit->getID(),
2538 "pubnames_begin", Unit->getID(), true);
2539 Asm->EOL("Length of Public Names Info");
2540
2541 EmitLabel("pubnames_begin", Unit->getID());
2542
2543 Asm->EmitInt16(dwarf::DWARF_VERSION); Asm->EOL("DWARF Version");
2544
2545 EmitSectionOffset("info_begin", "section_info",
2546 Unit->getID(), 0, true, false);
2547 Asm->EOL("Offset of Compilation Unit Info");
2548
2549 EmitDifference("info_end", Unit->getID(), "info_begin", Unit->getID(),
2550 true);
2551 Asm->EOL("Compilation Unit Length");
2552
2553 StringMap<DIE*> &Globals = Unit->getGlobals();
2554 for (StringMap<DIE*>::const_iterator
2555 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2556 const char *Name = GI->getKeyData();
2557 DIE * Entity = GI->second;
2558
2559 Asm->EmitInt32(Entity->getOffset()); Asm->EOL("DIE offset");
2560 Asm->EmitString(Name, strlen(Name)); Asm->EOL("External Name");
2561 }
2562
2563 Asm->EmitInt32(0); Asm->EOL("End Mark");
2564 EmitLabel("pubnames_end", Unit->getID());
2565
2566 Asm->EOL();
2567}
2568
2569/// EmitDebugPubNames - Emit visible names into a debug pubnames section.
2570///
2571void DwarfDebug::EmitDebugPubNames() {
2572 // Start the dwarf pubnames section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002573 Asm->OutStreamer.SwitchSection(
2574 Asm->getObjFileLowering().getDwarfPubNamesSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002575
Devang Patel1dbc7712009-06-29 20:45:18 +00002576 EmitDebugPubNamesPerCU(ModuleCU);
Bill Wendling94d04b82009-05-20 23:21:38 +00002577}
2578
2579/// EmitDebugStr - Emit visible names into a debug str section.
2580///
2581void DwarfDebug::EmitDebugStr() {
2582 // Check to see if it is worth the effort.
2583 if (!StringPool.empty()) {
2584 // Start the dwarf str section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002585 Asm->OutStreamer.SwitchSection(
2586 Asm->getObjFileLowering().getDwarfStrSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002587
2588 // For each of strings in the string pool.
2589 for (unsigned StringID = 1, N = StringPool.size();
2590 StringID <= N; ++StringID) {
2591 // Emit a label for reference from debug information entries.
2592 EmitLabel("string", StringID);
2593
2594 // Emit the string itself.
2595 const std::string &String = StringPool[StringID];
2596 Asm->EmitString(String); Asm->EOL();
2597 }
2598
2599 Asm->EOL();
2600 }
2601}
2602
2603/// EmitDebugLoc - Emit visible names into a debug loc section.
2604///
2605void DwarfDebug::EmitDebugLoc() {
2606 // Start the dwarf loc section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002607 Asm->OutStreamer.SwitchSection(
2608 Asm->getObjFileLowering().getDwarfLocSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002609 Asm->EOL();
2610}
2611
2612/// EmitDebugARanges - Emit visible names into a debug aranges section.
2613///
2614void DwarfDebug::EmitDebugARanges() {
2615 // Start the dwarf aranges section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002616 Asm->OutStreamer.SwitchSection(
2617 Asm->getObjFileLowering().getDwarfARangesSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002618
2619 // FIXME - Mock up
2620#if 0
2621 CompileUnit *Unit = GetBaseCompileUnit();
2622
2623 // Don't include size of length
2624 Asm->EmitInt32(0x1c); Asm->EOL("Length of Address Ranges Info");
2625
2626 Asm->EmitInt16(dwarf::DWARF_VERSION); Asm->EOL("Dwarf Version");
2627
2628 EmitReference("info_begin", Unit->getID());
2629 Asm->EOL("Offset of Compilation Unit Info");
2630
2631 Asm->EmitInt8(TD->getPointerSize()); Asm->EOL("Size of Address");
2632
2633 Asm->EmitInt8(0); Asm->EOL("Size of Segment Descriptor");
2634
2635 Asm->EmitInt16(0); Asm->EOL("Pad (1)");
2636 Asm->EmitInt16(0); Asm->EOL("Pad (2)");
2637
2638 // Range 1
2639 EmitReference("text_begin", 0); Asm->EOL("Address");
2640 EmitDifference("text_end", 0, "text_begin", 0, true); Asm->EOL("Length");
2641
2642 Asm->EmitInt32(0); Asm->EOL("EOM (1)");
2643 Asm->EmitInt32(0); Asm->EOL("EOM (2)");
2644#endif
2645
2646 Asm->EOL();
2647}
2648
2649/// EmitDebugRanges - Emit visible names into a debug ranges section.
2650///
2651void DwarfDebug::EmitDebugRanges() {
2652 // Start the dwarf ranges section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002653 Asm->OutStreamer.SwitchSection(
2654 Asm->getObjFileLowering().getDwarfRangesSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002655 Asm->EOL();
2656}
2657
2658/// EmitDebugMacInfo - Emit visible names into a debug macinfo section.
2659///
2660void DwarfDebug::EmitDebugMacInfo() {
Daniel Dunbarf612ff62009-09-19 20:40:05 +00002661 if (const MCSection *LineInfo =
Chris Lattner18a4c162009-08-02 07:24:22 +00002662 Asm->getObjFileLowering().getDwarfMacroInfoSection()) {
Bill Wendling94d04b82009-05-20 23:21:38 +00002663 // Start the dwarf macinfo section.
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002664 Asm->OutStreamer.SwitchSection(LineInfo);
Bill Wendling94d04b82009-05-20 23:21:38 +00002665 Asm->EOL();
2666 }
2667}
2668
2669/// EmitDebugInlineInfo - Emit inline info using following format.
2670/// Section Header:
2671/// 1. length of section
2672/// 2. Dwarf version number
2673/// 3. address size.
2674///
2675/// Entries (one "entry" for each function that was inlined):
2676///
2677/// 1. offset into __debug_str section for MIPS linkage name, if exists;
2678/// otherwise offset into __debug_str for regular function name.
2679/// 2. offset into __debug_str section for regular function name.
2680/// 3. an unsigned LEB128 number indicating the number of distinct inlining
2681/// instances for the function.
2682///
2683/// The rest of the entry consists of a {die_offset, low_pc} pair for each
2684/// inlined instance; the die_offset points to the inlined_subroutine die in the
2685/// __debug_info section, and the low_pc is the starting address for the
2686/// inlining instance.
2687void DwarfDebug::EmitDebugInlineInfo() {
Chris Lattner33adcfb2009-08-22 21:43:10 +00002688 if (!MAI->doesDwarfUsesInlineInfoSection())
Bill Wendling94d04b82009-05-20 23:21:38 +00002689 return;
2690
Devang Patel1dbc7712009-06-29 20:45:18 +00002691 if (!ModuleCU)
Bill Wendling94d04b82009-05-20 23:21:38 +00002692 return;
2693
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002694 Asm->OutStreamer.SwitchSection(
2695 Asm->getObjFileLowering().getDwarfDebugInlineSection());
Bill Wendling94d04b82009-05-20 23:21:38 +00002696 Asm->EOL();
2697 EmitDifference("debug_inlined_end", 1,
2698 "debug_inlined_begin", 1, true);
2699 Asm->EOL("Length of Debug Inlined Information Entry");
2700
2701 EmitLabel("debug_inlined_begin", 1);
2702
2703 Asm->EmitInt16(dwarf::DWARF_VERSION); Asm->EOL("Dwarf Version");
2704 Asm->EmitInt8(TD->getPointerSize()); Asm->EOL("Address Size (in bytes)");
2705
Devang Patele4b27562009-08-28 23:24:31 +00002706 for (DenseMap<MDNode *, SmallVector<unsigned, 4> >::iterator
Bill Wendling94d04b82009-05-20 23:21:38 +00002707 I = InlineInfo.begin(), E = InlineInfo.end(); I != E; ++I) {
Devang Patele4b27562009-08-28 23:24:31 +00002708 MDNode *Node = I->first;
Bill Wendling94d04b82009-05-20 23:21:38 +00002709 SmallVector<unsigned, 4> &Labels = I->second;
Devang Patele4b27562009-08-28 23:24:31 +00002710 DISubprogram SP(Node);
Bill Wendling94d04b82009-05-20 23:21:38 +00002711 std::string Name;
2712 std::string LName;
2713
2714 SP.getLinkageName(LName);
2715 SP.getName(Name);
2716
Devang Patel53cb17d2009-07-16 01:01:22 +00002717 if (LName.empty())
2718 Asm->EmitString(Name);
2719 else {
Chris Lattner6c2f9e12009-08-19 05:49:37 +00002720 // Skip special LLVM prefix that is used to inform the asm printer to not
2721 // emit usual symbol prefix before the symbol name. This happens for
2722 // Objective-C symbol names and symbol whose name is replaced using GCC's
2723 // __asm__ attribute.
Devang Patel53cb17d2009-07-16 01:01:22 +00002724 if (LName[0] == 1)
2725 LName = &LName[1];
2726 Asm->EmitString(LName);
2727 }
Bill Wendling94d04b82009-05-20 23:21:38 +00002728 Asm->EOL("MIPS linkage name");
2729
2730 Asm->EmitString(Name); Asm->EOL("Function name");
2731
2732 Asm->EmitULEB128Bytes(Labels.size()); Asm->EOL("Inline count");
2733
2734 for (SmallVector<unsigned, 4>::iterator LI = Labels.begin(),
2735 LE = Labels.end(); LI != LE; ++LI) {
Devang Patele4b27562009-08-28 23:24:31 +00002736 DIE *SP = ModuleCU->getDieMapSlotFor(Node);
Bill Wendling94d04b82009-05-20 23:21:38 +00002737 Asm->EmitInt32(SP->getOffset()); Asm->EOL("DIE offset");
2738
2739 if (TD->getPointerSize() == sizeof(int32_t))
Chris Lattner33adcfb2009-08-22 21:43:10 +00002740 O << MAI->getData32bitsDirective();
Bill Wendling94d04b82009-05-20 23:21:38 +00002741 else
Chris Lattner33adcfb2009-08-22 21:43:10 +00002742 O << MAI->getData64bitsDirective();
Bill Wendling94d04b82009-05-20 23:21:38 +00002743
2744 PrintLabelName("label", *LI); Asm->EOL("low_pc");
2745 }
2746 }
2747
2748 EmitLabel("debug_inlined_end", 1);
2749 Asm->EOL();
2750}