blob: 5093dd9a9c11b0a95576da16d14349407e718bb3 [file] [log] [blame]
Shih-wei Liaoe264f622010-02-10 11:10:31 -08001//===-- 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//===----------------------------------------------------------------------===//
13#define DEBUG_TYPE "dwarfdebug"
14#include "DwarfDebug.h"
15#include "llvm/Module.h"
16#include "llvm/CodeGen/MachineFunction.h"
17#include "llvm/CodeGen/MachineModuleInfo.h"
18#include "llvm/MC/MCSection.h"
19#include "llvm/MC/MCStreamer.h"
20#include "llvm/MC/MCAsmInfo.h"
21#include "llvm/Target/Mangler.h"
22#include "llvm/Target/TargetData.h"
23#include "llvm/Target/TargetFrameInfo.h"
24#include "llvm/Target/TargetLoweringObjectFile.h"
25#include "llvm/Target/TargetRegisterInfo.h"
26#include "llvm/ADT/StringExtras.h"
27#include "llvm/Support/Debug.h"
28#include "llvm/Support/ErrorHandling.h"
29#include "llvm/Support/ValueHandle.h"
30#include "llvm/Support/FormattedStream.h"
31#include "llvm/Support/Timer.h"
32#include "llvm/System/Path.h"
33using namespace llvm;
34
35//===----------------------------------------------------------------------===//
36
37/// Configuration values for initial hash set sizes (log2).
38///
39static const unsigned InitAbbreviationsSetSize = 9; // log2(512)
40
41namespace llvm {
42
43//===----------------------------------------------------------------------===//
44/// CompileUnit - This dwarf writer support class manages information associate
45/// with a source file.
46class CompileUnit {
47 /// ID - File identifier for source.
48 ///
49 unsigned ID;
50
51 /// Die - Compile unit debug information entry.
52 ///
53 DIE *CUDie;
54
55 /// IndexTyDie - An anonymous type for index type.
56 DIE *IndexTyDie;
57
58 /// GVToDieMap - Tracks the mapping of unit level debug informaton
59 /// variables to debug information entries.
60 /// FIXME : Rename GVToDieMap -> NodeToDieMap
61 DenseMap<MDNode *, DIE *> GVToDieMap;
62
63 /// GVToDIEEntryMap - Tracks the mapping of unit level debug informaton
64 /// descriptors to debug information entries using a DIEEntry proxy.
65 /// FIXME : Rename
66 DenseMap<MDNode *, DIEEntry *> GVToDIEEntryMap;
67
68 /// Globals - A map of globally visible named entities for this unit.
69 ///
70 StringMap<DIE*> Globals;
71
72 /// GlobalTypes - A map of globally visible types for this unit.
73 ///
74 StringMap<DIE*> GlobalTypes;
75
76public:
77 CompileUnit(unsigned I, DIE *D)
78 : ID(I), CUDie(D), IndexTyDie(0) {}
79 ~CompileUnit() { delete CUDie; delete IndexTyDie; }
80
81 // Accessors.
82 unsigned getID() const { return ID; }
83 DIE* getCUDie() const { return CUDie; }
84 const StringMap<DIE*> &getGlobals() const { return Globals; }
85 const StringMap<DIE*> &getGlobalTypes() const { return GlobalTypes; }
86
87 /// hasContent - Return true if this compile unit has something to write out.
88 ///
89 bool hasContent() const { return !CUDie->getChildren().empty(); }
90
91 /// addGlobal - Add a new global entity to the compile unit.
92 ///
93 void addGlobal(const std::string &Name, DIE *Die) { Globals[Name] = Die; }
94
95 /// addGlobalType - Add a new global type to the compile unit.
96 ///
97 void addGlobalType(const std::string &Name, DIE *Die) {
98 GlobalTypes[Name] = Die;
99 }
100
101 /// getDIE - Returns the debug information entry map slot for the
102 /// specified debug variable.
103 DIE *getDIE(MDNode *N) { return GVToDieMap.lookup(N); }
104
105 /// insertDIE - Insert DIE into the map.
106 void insertDIE(MDNode *N, DIE *D) {
107 GVToDieMap.insert(std::make_pair(N, D));
108 }
109
110 /// getDIEEntry - Returns the debug information entry for the speciefied
111 /// debug variable.
112 DIEEntry *getDIEEntry(MDNode *N) {
113 DenseMap<MDNode *, DIEEntry *>::iterator I = GVToDIEEntryMap.find(N);
114 if (I == GVToDIEEntryMap.end())
115 return NULL;
116 return I->second;
117 }
118
119 /// insertDIEEntry - Insert debug information entry into the map.
120 void insertDIEEntry(MDNode *N, DIEEntry *E) {
121 GVToDIEEntryMap.insert(std::make_pair(N, E));
122 }
123
124 /// addDie - Adds or interns the DIE to the compile unit.
125 ///
126 void addDie(DIE *Buffer) {
127 this->CUDie->addChild(Buffer);
128 }
129
130 // getIndexTyDie - Get an anonymous type for index type.
131 DIE *getIndexTyDie() {
132 return IndexTyDie;
133 }
134
135 // setIndexTyDie - Set D as anonymous type for index which can be reused
136 // later.
137 void setIndexTyDie(DIE *D) {
138 IndexTyDie = D;
139 }
140
141};
142
143//===----------------------------------------------------------------------===//
144/// DbgVariable - This class is used to track local variable information.
145///
146class DbgVariable {
147 DIVariable Var; // Variable Descriptor.
148 unsigned FrameIndex; // Variable frame index.
149 DbgVariable *AbstractVar; // Abstract variable for this variable.
150 DIE *TheDIE;
151public:
152 DbgVariable(DIVariable V, unsigned I)
153 : Var(V), FrameIndex(I), AbstractVar(0), TheDIE(0) {}
154
155 // Accessors.
156 DIVariable getVariable() const { return Var; }
157 unsigned getFrameIndex() const { return FrameIndex; }
158 void setAbstractVariable(DbgVariable *V) { AbstractVar = V; }
159 DbgVariable *getAbstractVariable() const { return AbstractVar; }
160 void setDIE(DIE *D) { TheDIE = D; }
161 DIE *getDIE() const { return TheDIE; }
162};
163
164//===----------------------------------------------------------------------===//
165/// DbgScope - This class is used to track scope information.
166///
167class DbgScope {
168 DbgScope *Parent; // Parent to this scope.
169 DIDescriptor Desc; // Debug info descriptor for scope.
170 // Location at which this scope is inlined.
171 AssertingVH<MDNode> InlinedAtLocation;
172 bool AbstractScope; // Abstract Scope
173 unsigned StartLabelID; // Label ID of the beginning of scope.
174 unsigned EndLabelID; // Label ID of the end of scope.
175 const MachineInstr *LastInsn; // Last instruction of this scope.
176 const MachineInstr *FirstInsn; // First instruction of this scope.
177 SmallVector<DbgScope *, 4> Scopes; // Scopes defined in scope.
178 SmallVector<DbgVariable *, 8> Variables;// Variables declared in scope.
179
180 // Private state for dump()
181 mutable unsigned IndentLevel;
182public:
183 DbgScope(DbgScope *P, DIDescriptor D, MDNode *I = 0)
184 : Parent(P), Desc(D), InlinedAtLocation(I), AbstractScope(false),
185 StartLabelID(0), EndLabelID(0),
186 LastInsn(0), FirstInsn(0), IndentLevel(0) {}
187 virtual ~DbgScope();
188
189 // Accessors.
190 DbgScope *getParent() const { return Parent; }
191 void setParent(DbgScope *P) { Parent = P; }
192 DIDescriptor getDesc() const { return Desc; }
193 MDNode *getInlinedAt() const {
194 return InlinedAtLocation;
195 }
196 MDNode *getScopeNode() const { return Desc.getNode(); }
197 unsigned getStartLabelID() const { return StartLabelID; }
198 unsigned getEndLabelID() const { return EndLabelID; }
199 SmallVector<DbgScope *, 4> &getScopes() { return Scopes; }
200 SmallVector<DbgVariable *, 8> &getVariables() { return Variables; }
201 void setStartLabelID(unsigned S) { StartLabelID = S; }
202 void setEndLabelID(unsigned E) { EndLabelID = E; }
203 void setLastInsn(const MachineInstr *MI) { LastInsn = MI; }
204 const MachineInstr *getLastInsn() { return LastInsn; }
205 void setFirstInsn(const MachineInstr *MI) { FirstInsn = MI; }
206 void setAbstractScope() { AbstractScope = true; }
207 bool isAbstractScope() const { return AbstractScope; }
208 const MachineInstr *getFirstInsn() { return FirstInsn; }
209
210 /// addScope - Add a scope to the scope.
211 ///
212 void addScope(DbgScope *S) { Scopes.push_back(S); }
213
214 /// addVariable - Add a variable to the scope.
215 ///
216 void addVariable(DbgVariable *V) { Variables.push_back(V); }
217
218 void fixInstructionMarkers(DenseMap<const MachineInstr *,
219 unsigned> &MIIndexMap) {
220 assert (getFirstInsn() && "First instruction is missing!");
221
222 // Use the end of last child scope as end of this scope.
223 SmallVector<DbgScope *, 4> &Scopes = getScopes();
224 const MachineInstr *LastInsn = getFirstInsn();
225 unsigned LIndex = 0;
226 if (Scopes.empty()) {
227 assert (getLastInsn() && "Inner most scope does not have last insn!");
228 return;
229 }
230 for (SmallVector<DbgScope *, 4>::iterator SI = Scopes.begin(),
231 SE = Scopes.end(); SI != SE; ++SI) {
232 DbgScope *DS = *SI;
233 DS->fixInstructionMarkers(MIIndexMap);
234 const MachineInstr *DSLastInsn = DS->getLastInsn();
235 unsigned DSI = MIIndexMap[DSLastInsn];
236 if (DSI > LIndex) {
237 LastInsn = DSLastInsn;
238 LIndex = DSI;
239 }
240 }
241 setLastInsn(LastInsn);
242 }
243
244#ifndef NDEBUG
245 void dump() const;
246#endif
247};
248
249#ifndef NDEBUG
250void DbgScope::dump() const {
251 raw_ostream &err = dbgs();
252 err.indent(IndentLevel);
253 MDNode *N = Desc.getNode();
254 N->dump();
255 err << " [" << StartLabelID << ", " << EndLabelID << "]\n";
256 if (AbstractScope)
257 err << "Abstract Scope\n";
258
259 IndentLevel += 2;
260 if (!Scopes.empty())
261 err << "Children ...\n";
262 for (unsigned i = 0, e = Scopes.size(); i != e; ++i)
263 if (Scopes[i] != this)
264 Scopes[i]->dump();
265
266 IndentLevel -= 2;
267}
268#endif
269
270DbgScope::~DbgScope() {
271 for (unsigned i = 0, N = Scopes.size(); i < N; ++i)
272 delete Scopes[i];
273 for (unsigned j = 0, M = Variables.size(); j < M; ++j)
274 delete Variables[j];
275}
276
277} // end llvm namespace
278
279DwarfDebug::DwarfDebug(raw_ostream &OS, AsmPrinter *A, const MCAsmInfo *T)
280 : DwarfPrinter(OS, A, T, "dbg"), ModuleCU(0),
281 AbbreviationsSet(InitAbbreviationsSetSize), Abbreviations(),
282 DIEValues(), StringPool(),
283 SectionSourceLines(), didInitial(false), shouldEmit(false),
284 CurrentFnDbgScope(0), DebugTimer(0) {
285 if (TimePassesIsEnabled)
286 DebugTimer = new Timer("Dwarf Debug Writer");
287}
288DwarfDebug::~DwarfDebug() {
289 for (unsigned j = 0, M = DIEValues.size(); j < M; ++j)
290 delete DIEValues[j];
291
292 delete DebugTimer;
293}
294
295/// assignAbbrevNumber - Define a unique number for the abbreviation.
296///
297void DwarfDebug::assignAbbrevNumber(DIEAbbrev &Abbrev) {
298 // Profile the node so that we can make it unique.
299 FoldingSetNodeID ID;
300 Abbrev.Profile(ID);
301
302 // Check the set for priors.
303 DIEAbbrev *InSet = AbbreviationsSet.GetOrInsertNode(&Abbrev);
304
305 // If it's newly added.
306 if (InSet == &Abbrev) {
307 // Add to abbreviation list.
308 Abbreviations.push_back(&Abbrev);
309
310 // Assign the vector position + 1 as its number.
311 Abbrev.setNumber(Abbreviations.size());
312 } else {
313 // Assign existing abbreviation number.
314 Abbrev.setNumber(InSet->getNumber());
315 }
316}
317
318/// createDIEEntry - Creates a new DIEEntry to be a proxy for a debug
319/// information entry.
320DIEEntry *DwarfDebug::createDIEEntry(DIE *Entry) {
321 DIEEntry *Value = new DIEEntry(Entry);
322 DIEValues.push_back(Value);
323 return Value;
324}
325
326/// addUInt - Add an unsigned integer attribute data and value.
327///
328void DwarfDebug::addUInt(DIE *Die, unsigned Attribute,
329 unsigned Form, uint64_t Integer) {
330 if (!Form) Form = DIEInteger::BestForm(false, Integer);
331 DIEValue *Value = new DIEInteger(Integer);
332 DIEValues.push_back(Value);
333 Die->addValue(Attribute, Form, Value);
334}
335
336/// addSInt - Add an signed integer attribute data and value.
337///
338void DwarfDebug::addSInt(DIE *Die, unsigned Attribute,
339 unsigned Form, int64_t Integer) {
340 if (!Form) Form = DIEInteger::BestForm(true, Integer);
341 DIEValue *Value = new DIEInteger(Integer);
342 DIEValues.push_back(Value);
343 Die->addValue(Attribute, Form, Value);
344}
345
346/// addString - Add a string attribute data and value. DIEString only
347/// keeps string reference.
348void DwarfDebug::addString(DIE *Die, unsigned Attribute, unsigned Form,
349 StringRef String) {
350 DIEValue *Value = new DIEString(String);
351 DIEValues.push_back(Value);
352 Die->addValue(Attribute, Form, Value);
353}
354
355/// addLabel - Add a Dwarf label attribute data and value.
356///
357void DwarfDebug::addLabel(DIE *Die, unsigned Attribute, unsigned Form,
358 const DWLabel &Label) {
359 DIEValue *Value = new DIEDwarfLabel(Label);
360 DIEValues.push_back(Value);
361 Die->addValue(Attribute, Form, Value);
362}
363
364/// addObjectLabel - Add an non-Dwarf label attribute data and value.
365///
366void DwarfDebug::addObjectLabel(DIE *Die, unsigned Attribute, unsigned Form,
367 const MCSymbol *Sym) {
368 DIEValue *Value = new DIEObjectLabel(Sym);
369 DIEValues.push_back(Value);
370 Die->addValue(Attribute, Form, Value);
371}
372
373/// addSectionOffset - Add a section offset label attribute data and value.
374///
375void DwarfDebug::addSectionOffset(DIE *Die, unsigned Attribute, unsigned Form,
376 const DWLabel &Label, const DWLabel &Section,
377 bool isEH, bool useSet) {
378 DIEValue *Value = new DIESectionOffset(Label, Section, isEH, useSet);
379 DIEValues.push_back(Value);
380 Die->addValue(Attribute, Form, Value);
381}
382
383/// addDelta - Add a label delta attribute data and value.
384///
385void DwarfDebug::addDelta(DIE *Die, unsigned Attribute, unsigned Form,
386 const DWLabel &Hi, const DWLabel &Lo) {
387 DIEValue *Value = new DIEDelta(Hi, Lo);
388 DIEValues.push_back(Value);
389 Die->addValue(Attribute, Form, Value);
390}
391
392/// addBlock - Add block data.
393///
394void DwarfDebug::addBlock(DIE *Die, unsigned Attribute, unsigned Form,
395 DIEBlock *Block) {
396 Block->ComputeSize(TD);
397 DIEValues.push_back(Block);
398 Die->addValue(Attribute, Block->BestForm(), Block);
399}
400
401/// addSourceLine - Add location information to specified debug information
402/// entry.
403void DwarfDebug::addSourceLine(DIE *Die, const DIVariable *V) {
404 // If there is no compile unit specified, don't add a line #.
405 if (V->getCompileUnit().isNull())
406 return;
407
408 unsigned Line = V->getLineNumber();
409 unsigned FileID = findCompileUnit(V->getCompileUnit())->getID();
410 assert(FileID && "Invalid file id");
411 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
412 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
413}
414
415/// addSourceLine - Add location information to specified debug information
416/// entry.
417void DwarfDebug::addSourceLine(DIE *Die, const DIGlobal *G) {
418 // If there is no compile unit specified, don't add a line #.
419 if (G->getCompileUnit().isNull())
420 return;
421
422 unsigned Line = G->getLineNumber();
423 unsigned FileID = findCompileUnit(G->getCompileUnit())->getID();
424 assert(FileID && "Invalid file id");
425 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
426 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
427}
428
429/// addSourceLine - Add location information to specified debug information
430/// entry.
431void DwarfDebug::addSourceLine(DIE *Die, const DISubprogram *SP) {
432 // If there is no compile unit specified, don't add a line #.
433 if (SP->getCompileUnit().isNull())
434 return;
435 // If the line number is 0, don't add it.
436 if (SP->getLineNumber() == 0)
437 return;
438
439
440 unsigned Line = SP->getLineNumber();
441 unsigned FileID = findCompileUnit(SP->getCompileUnit())->getID();
442 assert(FileID && "Invalid file id");
443 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
444 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
445}
446
447/// addSourceLine - Add location information to specified debug information
448/// entry.
449void DwarfDebug::addSourceLine(DIE *Die, const DIType *Ty) {
450 // If there is no compile unit specified, don't add a line #.
451 DICompileUnit CU = Ty->getCompileUnit();
452 if (CU.isNull())
453 return;
454
455 unsigned Line = Ty->getLineNumber();
456 unsigned FileID = findCompileUnit(CU)->getID();
457 assert(FileID && "Invalid file id");
458 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
459 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
460}
461
462/// addSourceLine - Add location information to specified debug information
463/// entry.
464void DwarfDebug::addSourceLine(DIE *Die, const DINameSpace *NS) {
465 // If there is no compile unit specified, don't add a line #.
466 if (NS->getCompileUnit().isNull())
467 return;
468
469 unsigned Line = NS->getLineNumber();
470 StringRef FN = NS->getFilename();
471 StringRef Dir = NS->getDirectory();
472
473 unsigned FileID = GetOrCreateSourceID(Dir, FN);
474 assert(FileID && "Invalid file id");
475 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
476 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
477}
478
479/* Byref variables, in Blocks, are declared by the programmer as
480 "SomeType VarName;", but the compiler creates a
481 __Block_byref_x_VarName struct, and gives the variable VarName
482 either the struct, or a pointer to the struct, as its type. This
483 is necessary for various behind-the-scenes things the compiler
484 needs to do with by-reference variables in blocks.
485
486 However, as far as the original *programmer* is concerned, the
487 variable should still have type 'SomeType', as originally declared.
488
489 The following function dives into the __Block_byref_x_VarName
490 struct to find the original type of the variable. This will be
491 passed back to the code generating the type for the Debug
492 Information Entry for the variable 'VarName'. 'VarName' will then
493 have the original type 'SomeType' in its debug information.
494
495 The original type 'SomeType' will be the type of the field named
496 'VarName' inside the __Block_byref_x_VarName struct.
497
498 NOTE: In order for this to not completely fail on the debugger
499 side, the Debug Information Entry for the variable VarName needs to
500 have a DW_AT_location that tells the debugger how to unwind through
501 the pointers and __Block_byref_x_VarName struct to find the actual
502 value of the variable. The function addBlockByrefType does this. */
503
504/// Find the type the programmer originally declared the variable to be
505/// and return that type.
506///
507DIType DwarfDebug::getBlockByrefType(DIType Ty, std::string Name) {
508
509 DIType subType = Ty;
510 unsigned tag = Ty.getTag();
511
512 if (tag == dwarf::DW_TAG_pointer_type) {
513 DIDerivedType DTy = DIDerivedType(Ty.getNode());
514 subType = DTy.getTypeDerivedFrom();
515 }
516
517 DICompositeType blockStruct = DICompositeType(subType.getNode());
518
519 DIArray Elements = blockStruct.getTypeArray();
520
521 if (Elements.isNull())
522 return Ty;
523
524 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
525 DIDescriptor Element = Elements.getElement(i);
526 DIDerivedType DT = DIDerivedType(Element.getNode());
527 if (Name == DT.getName())
528 return (DT.getTypeDerivedFrom());
529 }
530
531 return Ty;
532}
533
534/// addComplexAddress - Start with the address based on the location provided,
535/// and generate the DWARF information necessary to find the actual variable
536/// given the extra address information encoded in the DIVariable, starting from
537/// the starting location. Add the DWARF information to the die.
538///
539void DwarfDebug::addComplexAddress(DbgVariable *&DV, DIE *Die,
540 unsigned Attribute,
541 const MachineLocation &Location) {
542 const DIVariable &VD = DV->getVariable();
543 DIType Ty = VD.getType();
544
545 // Decode the original location, and use that as the start of the byref
546 // variable's location.
547 unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
548 DIEBlock *Block = new DIEBlock();
549
550 if (Location.isReg()) {
551 if (Reg < 32) {
552 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
553 } else {
554 Reg = Reg - dwarf::DW_OP_reg0;
555 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
556 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
557 }
558 } else {
559 if (Reg < 32)
560 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
561 else {
562 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
563 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
564 }
565
566 addUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
567 }
568
569 for (unsigned i = 0, N = VD.getNumAddrElements(); i < N; ++i) {
570 uint64_t Element = VD.getAddrElement(i);
571
572 if (Element == DIFactory::OpPlus) {
573 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
574 addUInt(Block, 0, dwarf::DW_FORM_udata, VD.getAddrElement(++i));
575 } else if (Element == DIFactory::OpDeref) {
576 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
577 } else llvm_unreachable("unknown DIFactory Opcode");
578 }
579
580 // Now attach the location information to the DIE.
581 addBlock(Die, Attribute, 0, Block);
582}
583
584/* Byref variables, in Blocks, are declared by the programmer as "SomeType
585 VarName;", but the compiler creates a __Block_byref_x_VarName struct, and
586 gives the variable VarName either the struct, or a pointer to the struct, as
587 its type. This is necessary for various behind-the-scenes things the
588 compiler needs to do with by-reference variables in Blocks.
589
590 However, as far as the original *programmer* is concerned, the variable
591 should still have type 'SomeType', as originally declared.
592
593 The function getBlockByrefType dives into the __Block_byref_x_VarName
594 struct to find the original type of the variable, which is then assigned to
595 the variable's Debug Information Entry as its real type. So far, so good.
596 However now the debugger will expect the variable VarName to have the type
597 SomeType. So we need the location attribute for the variable to be an
598 expression that explains to the debugger how to navigate through the
599 pointers and struct to find the actual variable of type SomeType.
600
601 The following function does just that. We start by getting
602 the "normal" location for the variable. This will be the location
603 of either the struct __Block_byref_x_VarName or the pointer to the
604 struct __Block_byref_x_VarName.
605
606 The struct will look something like:
607
608 struct __Block_byref_x_VarName {
609 ... <various fields>
610 struct __Block_byref_x_VarName *forwarding;
611 ... <various other fields>
612 SomeType VarName;
613 ... <maybe more fields>
614 };
615
616 If we are given the struct directly (as our starting point) we
617 need to tell the debugger to:
618
619 1). Add the offset of the forwarding field.
620
621 2). Follow that pointer to get the real __Block_byref_x_VarName
622 struct to use (the real one may have been copied onto the heap).
623
624 3). Add the offset for the field VarName, to find the actual variable.
625
626 If we started with a pointer to the struct, then we need to
627 dereference that pointer first, before the other steps.
628 Translating this into DWARF ops, we will need to append the following
629 to the current location description for the variable:
630
631 DW_OP_deref -- optional, if we start with a pointer
632 DW_OP_plus_uconst <forward_fld_offset>
633 DW_OP_deref
634 DW_OP_plus_uconst <varName_fld_offset>
635
636 That is what this function does. */
637
638/// addBlockByrefAddress - Start with the address based on the location
639/// provided, and generate the DWARF information necessary to find the
640/// actual Block variable (navigating the Block struct) based on the
641/// starting location. Add the DWARF information to the die. For
642/// more information, read large comment just above here.
643///
644void DwarfDebug::addBlockByrefAddress(DbgVariable *&DV, DIE *Die,
645 unsigned Attribute,
646 const MachineLocation &Location) {
647 const DIVariable &VD = DV->getVariable();
648 DIType Ty = VD.getType();
649 DIType TmpTy = Ty;
650 unsigned Tag = Ty.getTag();
651 bool isPointer = false;
652
653 StringRef varName = VD.getName();
654
655 if (Tag == dwarf::DW_TAG_pointer_type) {
656 DIDerivedType DTy = DIDerivedType(Ty.getNode());
657 TmpTy = DTy.getTypeDerivedFrom();
658 isPointer = true;
659 }
660
661 DICompositeType blockStruct = DICompositeType(TmpTy.getNode());
662
663 // Find the __forwarding field and the variable field in the __Block_byref
664 // struct.
665 DIArray Fields = blockStruct.getTypeArray();
666 DIDescriptor varField = DIDescriptor();
667 DIDescriptor forwardingField = DIDescriptor();
668
669
670 for (unsigned i = 0, N = Fields.getNumElements(); i < N; ++i) {
671 DIDescriptor Element = Fields.getElement(i);
672 DIDerivedType DT = DIDerivedType(Element.getNode());
673 StringRef fieldName = DT.getName();
674 if (fieldName == "__forwarding")
675 forwardingField = Element;
676 else if (fieldName == varName)
677 varField = Element;
678 }
679
680 assert(!varField.isNull() && "Can't find byref variable in Block struct");
681 assert(!forwardingField.isNull()
682 && "Can't find forwarding field in Block struct");
683
684 // Get the offsets for the forwarding field and the variable field.
685 unsigned int forwardingFieldOffset =
686 DIDerivedType(forwardingField.getNode()).getOffsetInBits() >> 3;
687 unsigned int varFieldOffset =
688 DIDerivedType(varField.getNode()).getOffsetInBits() >> 3;
689
690 // Decode the original location, and use that as the start of the byref
691 // variable's location.
692 unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
693 DIEBlock *Block = new DIEBlock();
694
695 if (Location.isReg()) {
696 if (Reg < 32)
697 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
698 else {
699 Reg = Reg - dwarf::DW_OP_reg0;
700 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
701 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
702 }
703 } else {
704 if (Reg < 32)
705 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
706 else {
707 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
708 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
709 }
710
711 addUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
712 }
713
714 // If we started with a pointer to the __Block_byref... struct, then
715 // the first thing we need to do is dereference the pointer (DW_OP_deref).
716 if (isPointer)
717 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
718
719 // Next add the offset for the '__forwarding' field:
720 // DW_OP_plus_uconst ForwardingFieldOffset. Note there's no point in
721 // adding the offset if it's 0.
722 if (forwardingFieldOffset > 0) {
723 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
724 addUInt(Block, 0, dwarf::DW_FORM_udata, forwardingFieldOffset);
725 }
726
727 // Now dereference the __forwarding field to get to the real __Block_byref
728 // struct: DW_OP_deref.
729 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
730
731 // Now that we've got the real __Block_byref... struct, add the offset
732 // for the variable's field to get to the location of the actual variable:
733 // DW_OP_plus_uconst varFieldOffset. Again, don't add if it's 0.
734 if (varFieldOffset > 0) {
735 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
736 addUInt(Block, 0, dwarf::DW_FORM_udata, varFieldOffset);
737 }
738
739 // Now attach the location information to the DIE.
740 addBlock(Die, Attribute, 0, Block);
741}
742
743/// addAddress - Add an address attribute to a die based on the location
744/// provided.
745void DwarfDebug::addAddress(DIE *Die, unsigned Attribute,
746 const MachineLocation &Location) {
747 unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
748 DIEBlock *Block = new DIEBlock();
749
750 if (Location.isReg()) {
751 if (Reg < 32) {
752 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
753 } else {
754 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
755 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
756 }
757 } else {
758 if (Reg < 32) {
759 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
760 } else {
761 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
762 addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
763 }
764
765 addUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
766 }
767
768 addBlock(Die, Attribute, 0, Block);
769}
770
771/// addToContextOwner - Add Die into the list of its context owner's children.
772void DwarfDebug::addToContextOwner(DIE *Die, DIDescriptor Context) {
773 if (Context.isNull())
774 ModuleCU->addDie(Die);
775 else if (Context.isType()) {
776 DIE *ContextDIE = getOrCreateTypeDIE(DIType(Context.getNode()));
777 ContextDIE->addChild(Die);
778 } else if (Context.isNameSpace()) {
779 DIE *ContextDIE = getOrCreateNameSpace(DINameSpace(Context.getNode()));
780 ContextDIE->addChild(Die);
781 } else if (DIE *ContextDIE = ModuleCU->getDIE(Context.getNode()))
782 ContextDIE->addChild(Die);
783 else
784 ModuleCU->addDie(Die);
785}
786
787/// getOrCreateTypeDIE - Find existing DIE or create new DIE for the
788/// given DIType.
789DIE *DwarfDebug::getOrCreateTypeDIE(DIType Ty) {
790 DIE *TyDIE = ModuleCU->getDIE(Ty.getNode());
791 if (TyDIE)
792 return TyDIE;
793
794 // Create new type.
795 TyDIE = new DIE(dwarf::DW_TAG_base_type);
796 ModuleCU->insertDIE(Ty.getNode(), TyDIE);
797 if (Ty.isBasicType())
798 constructTypeDIE(*TyDIE, DIBasicType(Ty.getNode()));
799 else if (Ty.isCompositeType())
800 constructTypeDIE(*TyDIE, DICompositeType(Ty.getNode()));
801 else {
802 assert(Ty.isDerivedType() && "Unknown kind of DIType");
803 constructTypeDIE(*TyDIE, DIDerivedType(Ty.getNode()));
804 }
805
806 addToContextOwner(TyDIE, Ty.getContext());
807 return TyDIE;
808}
809
810/// addType - Add a new type attribute to the specified entity.
811void DwarfDebug::addType(DIE *Entity, DIType Ty) {
812 if (Ty.isNull())
813 return;
814
815 // Check for pre-existence.
816 DIEEntry *Entry = ModuleCU->getDIEEntry(Ty.getNode());
817 // If it exists then use the existing value.
818 if (Entry) {
819 Entity->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, Entry);
820 return;
821 }
822
823 // Set up proxy.
824 Entry = createDIEEntry();
825 ModuleCU->insertDIEEntry(Ty.getNode(), Entry);
826
827 // Construct type.
828 DIE *Buffer = getOrCreateTypeDIE(Ty);
829
830 Entry->setEntry(Buffer);
831 Entity->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, Entry);
832}
833
834/// constructTypeDIE - Construct basic type die from DIBasicType.
835void DwarfDebug::constructTypeDIE(DIE &Buffer, DIBasicType BTy) {
836 // Get core information.
837 StringRef Name = BTy.getName();
838 Buffer.setTag(dwarf::DW_TAG_base_type);
839 addUInt(&Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
840 BTy.getEncoding());
841
842 // Add name if not anonymous or intermediate type.
843 if (!Name.empty())
844 addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
845 uint64_t Size = BTy.getSizeInBits() >> 3;
846 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
847}
848
849/// constructTypeDIE - Construct derived type die from DIDerivedType.
850void DwarfDebug::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) {
851 // Get core information.
852 StringRef Name = DTy.getName();
853 uint64_t Size = DTy.getSizeInBits() >> 3;
854 unsigned Tag = DTy.getTag();
855
856 // FIXME - Workaround for templates.
857 if (Tag == dwarf::DW_TAG_inheritance) Tag = dwarf::DW_TAG_reference_type;
858
859 Buffer.setTag(Tag);
860
861 // Map to main type, void will not have a type.
862 DIType FromTy = DTy.getTypeDerivedFrom();
863 addType(&Buffer, FromTy);
864
865 // Add name if not anonymous or intermediate type.
866 if (!Name.empty())
867 addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
868
869 // Add size if non-zero (derived types might be zero-sized.)
870 if (Size)
871 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
872
873 // Add source line info if available and TyDesc is not a forward declaration.
874 if (!DTy.isForwardDecl())
875 addSourceLine(&Buffer, &DTy);
876}
877
878/// constructTypeDIE - Construct type DIE from DICompositeType.
879void DwarfDebug::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
880 // Get core information.
881 StringRef Name = CTy.getName();
882
883 uint64_t Size = CTy.getSizeInBits() >> 3;
884 unsigned Tag = CTy.getTag();
885 Buffer.setTag(Tag);
886
887 switch (Tag) {
888 case dwarf::DW_TAG_vector_type:
889 case dwarf::DW_TAG_array_type:
890 constructArrayTypeDIE(Buffer, &CTy);
891 break;
892 case dwarf::DW_TAG_enumeration_type: {
893 DIArray Elements = CTy.getTypeArray();
894
895 // Add enumerators to enumeration type.
896 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
897 DIE *ElemDie = NULL;
898 DIEnumerator Enum(Elements.getElement(i).getNode());
899 if (!Enum.isNull()) {
900 ElemDie = constructEnumTypeDIE(&Enum);
901 Buffer.addChild(ElemDie);
902 }
903 }
904 }
905 break;
906 case dwarf::DW_TAG_subroutine_type: {
907 // Add return type.
908 DIArray Elements = CTy.getTypeArray();
909 DIDescriptor RTy = Elements.getElement(0);
910 addType(&Buffer, DIType(RTy.getNode()));
911
912 // Add prototype flag.
913 addUInt(&Buffer, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
914
915 // Add arguments.
916 for (unsigned i = 1, N = Elements.getNumElements(); i < N; ++i) {
917 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
918 DIDescriptor Ty = Elements.getElement(i);
919 addType(Arg, DIType(Ty.getNode()));
920 Buffer.addChild(Arg);
921 }
922 }
923 break;
924 case dwarf::DW_TAG_structure_type:
925 case dwarf::DW_TAG_union_type:
926 case dwarf::DW_TAG_class_type: {
927 // Add elements to structure type.
928 DIArray Elements = CTy.getTypeArray();
929
930 // A forward struct declared type may not have elements available.
931 if (Elements.isNull())
932 break;
933
934 // Add elements to structure type.
935 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
936 DIDescriptor Element = Elements.getElement(i);
937 if (Element.isNull())
938 continue;
939 DIE *ElemDie = NULL;
940 if (Element.getTag() == dwarf::DW_TAG_subprogram)
941 ElemDie = createSubprogramDIE(DISubprogram(Element.getNode()));
942 else if (Element.getTag() == dwarf::DW_TAG_auto_variable) {
943 DIVariable DV(Element.getNode());
944 ElemDie = new DIE(dwarf::DW_TAG_variable);
945 addString(ElemDie, dwarf::DW_AT_name, dwarf::DW_FORM_string,
946 DV.getName());
947 addType(ElemDie, DV.getType());
948 addUInt(ElemDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
949 addUInt(ElemDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
950 addSourceLine(ElemDie, &DV);
951 } else
952 ElemDie = createMemberDIE(DIDerivedType(Element.getNode()));
953 Buffer.addChild(ElemDie);
954 }
955
956 if (CTy.isAppleBlockExtension())
957 addUInt(&Buffer, dwarf::DW_AT_APPLE_block, dwarf::DW_FORM_flag, 1);
958
959 unsigned RLang = CTy.getRunTimeLang();
960 if (RLang)
961 addUInt(&Buffer, dwarf::DW_AT_APPLE_runtime_class,
962 dwarf::DW_FORM_data1, RLang);
963
964 DICompositeType ContainingType = CTy.getContainingType();
965 if (!ContainingType.isNull())
966 addDIEEntry(&Buffer, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4,
967 getOrCreateTypeDIE(DIType(ContainingType.getNode())));
968 break;
969 }
970 default:
971 break;
972 }
973
974 // Add name if not anonymous or intermediate type.
975 if (!Name.empty())
976 addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
977
978 if (Tag == dwarf::DW_TAG_enumeration_type || Tag == dwarf::DW_TAG_class_type ||
979 Tag == dwarf::DW_TAG_structure_type || Tag == dwarf::DW_TAG_union_type) {
980 // Add size if non-zero (derived types might be zero-sized.)
981 if (Size)
982 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
983 else {
984 // Add zero size if it is not a forward declaration.
985 if (CTy.isForwardDecl())
986 addUInt(&Buffer, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
987 else
988 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, 0);
989 }
990
991 // Add source line info if available.
992 if (!CTy.isForwardDecl())
993 addSourceLine(&Buffer, &CTy);
994 }
995}
996
997/// constructSubrangeDIE - Construct subrange DIE from DISubrange.
998void DwarfDebug::constructSubrangeDIE(DIE &Buffer, DISubrange SR, DIE *IndexTy){
999 int64_t L = SR.getLo();
1000 int64_t H = SR.getHi();
1001 DIE *DW_Subrange = new DIE(dwarf::DW_TAG_subrange_type);
1002
1003 addDIEEntry(DW_Subrange, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IndexTy);
1004 if (L)
1005 addSInt(DW_Subrange, dwarf::DW_AT_lower_bound, 0, L);
1006 addSInt(DW_Subrange, dwarf::DW_AT_upper_bound, 0, H);
1007
1008 Buffer.addChild(DW_Subrange);
1009}
1010
1011/// constructArrayTypeDIE - Construct array type DIE from DICompositeType.
1012void DwarfDebug::constructArrayTypeDIE(DIE &Buffer,
1013 DICompositeType *CTy) {
1014 Buffer.setTag(dwarf::DW_TAG_array_type);
1015 if (CTy->getTag() == dwarf::DW_TAG_vector_type)
1016 addUInt(&Buffer, dwarf::DW_AT_GNU_vector, dwarf::DW_FORM_flag, 1);
1017
1018 // Emit derived type.
1019 addType(&Buffer, CTy->getTypeDerivedFrom());
1020 DIArray Elements = CTy->getTypeArray();
1021
1022 // Get an anonymous type for index type.
1023 DIE *IdxTy = ModuleCU->getIndexTyDie();
1024 if (!IdxTy) {
1025 // Construct an anonymous type for index type.
1026 IdxTy = new DIE(dwarf::DW_TAG_base_type);
1027 addUInt(IdxTy, dwarf::DW_AT_byte_size, 0, sizeof(int32_t));
1028 addUInt(IdxTy, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
1029 dwarf::DW_ATE_signed);
1030 ModuleCU->addDie(IdxTy);
1031 ModuleCU->setIndexTyDie(IdxTy);
1032 }
1033
1034 // Add subranges to array type.
1035 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1036 DIDescriptor Element = Elements.getElement(i);
1037 if (Element.getTag() == dwarf::DW_TAG_subrange_type)
1038 constructSubrangeDIE(Buffer, DISubrange(Element.getNode()), IdxTy);
1039 }
1040}
1041
1042/// constructEnumTypeDIE - Construct enum type DIE from DIEnumerator.
1043DIE *DwarfDebug::constructEnumTypeDIE(DIEnumerator *ETy) {
1044 DIE *Enumerator = new DIE(dwarf::DW_TAG_enumerator);
1045 StringRef Name = ETy->getName();
1046 addString(Enumerator, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1047 int64_t Value = ETy->getEnumValue();
1048 addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, Value);
1049 return Enumerator;
1050}
1051
1052/// getRealLinkageName - If special LLVM prefix that is used to inform the asm
1053/// printer to not emit usual symbol prefix before the symbol name is used then
1054/// return linkage name after skipping this special LLVM prefix.
1055static StringRef getRealLinkageName(StringRef LinkageName) {
1056 char One = '\1';
1057 if (LinkageName.startswith(StringRef(&One, 1)))
1058 return LinkageName.substr(1);
1059 return LinkageName;
1060}
1061
1062/// createGlobalVariableDIE - Create new DIE using GV.
1063DIE *DwarfDebug::createGlobalVariableDIE(const DIGlobalVariable &GV) {
1064 // If the global variable was optmized out then no need to create debug info
1065 // entry.
1066 if (!GV.getGlobal()) return NULL;
1067 if (GV.getDisplayName().empty()) return NULL;
1068
1069 DIE *GVDie = new DIE(dwarf::DW_TAG_variable);
1070 addString(GVDie, dwarf::DW_AT_name, dwarf::DW_FORM_string,
1071 GV.getDisplayName());
1072
1073 StringRef LinkageName = GV.getLinkageName();
1074 if (!LinkageName.empty())
1075 addString(GVDie, dwarf::DW_AT_MIPS_linkage_name, dwarf::DW_FORM_string,
1076 getRealLinkageName(LinkageName));
1077
1078 addType(GVDie, GV.getType());
1079 if (!GV.isLocalToUnit())
1080 addUInt(GVDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
1081 addSourceLine(GVDie, &GV);
1082
1083 return GVDie;
1084}
1085
1086/// createMemberDIE - Create new member DIE.
1087DIE *DwarfDebug::createMemberDIE(const DIDerivedType &DT) {
1088 DIE *MemberDie = new DIE(DT.getTag());
1089 StringRef Name = DT.getName();
1090 if (!Name.empty())
1091 addString(MemberDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1092
1093 addType(MemberDie, DT.getTypeDerivedFrom());
1094
1095 addSourceLine(MemberDie, &DT);
1096
1097 DIEBlock *MemLocationDie = new DIEBlock();
1098 addUInt(MemLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
1099
1100 uint64_t Size = DT.getSizeInBits();
1101 uint64_t FieldSize = DT.getOriginalTypeSize();
1102
1103 if (Size != FieldSize) {
1104 // Handle bitfield.
1105 addUInt(MemberDie, dwarf::DW_AT_byte_size, 0, DT.getOriginalTypeSize()>>3);
1106 addUInt(MemberDie, dwarf::DW_AT_bit_size, 0, DT.getSizeInBits());
1107
1108 uint64_t Offset = DT.getOffsetInBits();
1109 uint64_t AlignMask = ~(DT.getAlignInBits() - 1);
1110 uint64_t HiMark = (Offset + FieldSize) & AlignMask;
1111 uint64_t FieldOffset = (HiMark - FieldSize);
1112 Offset -= FieldOffset;
1113
1114 // Maybe we need to work from the other end.
1115 if (TD->isLittleEndian()) Offset = FieldSize - (Offset + Size);
1116 addUInt(MemberDie, dwarf::DW_AT_bit_offset, 0, Offset);
1117
1118 // Here WD_AT_data_member_location points to the anonymous
1119 // field that includes this bit field.
1120 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, FieldOffset >> 3);
1121
1122 } else
1123 // This is not a bitfield.
1124 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits() >> 3);
1125
1126 if (DT.getTag() == dwarf::DW_TAG_inheritance
1127 && DT.isVirtual()) {
1128
1129 // For C++, virtual base classes are not at fixed offset. Use following
1130 // expression to extract appropriate offset from vtable.
1131 // BaseAddr = ObAddr + *((*ObAddr) - Offset)
1132
1133 DIEBlock *VBaseLocationDie = new DIEBlock();
1134 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_dup);
1135 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1136 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1137 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits());
1138 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_minus);
1139 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1140 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1141
1142 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0,
1143 VBaseLocationDie);
1144 } else
1145 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, MemLocationDie);
1146
1147 if (DT.isProtected())
1148 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1149 dwarf::DW_ACCESS_protected);
1150 else if (DT.isPrivate())
1151 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1152 dwarf::DW_ACCESS_private);
1153 else if (DT.getTag() == dwarf::DW_TAG_inheritance)
1154 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1155 dwarf::DW_ACCESS_public);
1156 if (DT.isVirtual())
1157 addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_flag,
1158 dwarf::DW_VIRTUALITY_virtual);
1159 return MemberDie;
1160}
1161
1162/// createSubprogramDIE - Create new DIE using SP.
1163DIE *DwarfDebug::createSubprogramDIE(const DISubprogram &SP, bool MakeDecl) {
1164 DIE *SPDie = ModuleCU->getDIE(SP.getNode());
1165 if (SPDie)
1166 return SPDie;
1167
1168 SPDie = new DIE(dwarf::DW_TAG_subprogram);
1169 addString(SPDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, SP.getName());
1170
1171 StringRef LinkageName = SP.getLinkageName();
1172 if (!LinkageName.empty())
1173 addString(SPDie, dwarf::DW_AT_MIPS_linkage_name, dwarf::DW_FORM_string,
1174 getRealLinkageName(LinkageName));
1175
1176 addSourceLine(SPDie, &SP);
1177
1178 // Add prototyped tag, if C or ObjC.
1179 unsigned Lang = SP.getCompileUnit().getLanguage();
1180 if (Lang == dwarf::DW_LANG_C99 || Lang == dwarf::DW_LANG_C89 ||
1181 Lang == dwarf::DW_LANG_ObjC)
1182 addUInt(SPDie, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
1183
1184 // Add Return Type.
1185 DICompositeType SPTy = SP.getType();
1186 DIArray Args = SPTy.getTypeArray();
1187 unsigned SPTag = SPTy.getTag();
1188
1189 if (Args.isNull() || SPTag != dwarf::DW_TAG_subroutine_type)
1190 addType(SPDie, SPTy);
1191 else
1192 addType(SPDie, DIType(Args.getElement(0).getNode()));
1193
1194 unsigned VK = SP.getVirtuality();
1195 if (VK) {
1196 addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_flag, VK);
1197 DIEBlock *Block = new DIEBlock();
1198 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1199 addUInt(Block, 0, dwarf::DW_FORM_data1, SP.getVirtualIndex());
1200 addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, 0, Block);
1201 ContainingTypeMap.insert(std::make_pair(SPDie,
1202 SP.getContainingType().getNode()));
1203 }
1204
1205 if (MakeDecl || !SP.isDefinition()) {
1206 addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1207
1208 // Add arguments. Do not add arguments for subprogram definition. They will
1209 // be handled while processing variables.
1210 DICompositeType SPTy = SP.getType();
1211 DIArray Args = SPTy.getTypeArray();
1212 unsigned SPTag = SPTy.getTag();
1213
1214 if (SPTag == dwarf::DW_TAG_subroutine_type)
1215 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
1216 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1217 DIType ATy = DIType(DIType(Args.getElement(i).getNode()));
1218 addType(Arg, ATy);
1219 if (ATy.isArtificial())
1220 addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1221 SPDie->addChild(Arg);
1222 }
1223 }
1224
1225 if (SP.isArtificial())
1226 addUInt(SPDie, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1227
1228 // DW_TAG_inlined_subroutine may refer to this DIE.
1229 ModuleCU->insertDIE(SP.getNode(), SPDie);
1230 return SPDie;
1231}
1232
1233/// findCompileUnit - Get the compile unit for the given descriptor.
1234///
1235CompileUnit *DwarfDebug::findCompileUnit(DICompileUnit Unit) {
1236 DenseMap<Value *, CompileUnit *>::const_iterator I =
1237 CompileUnitMap.find(Unit.getNode());
1238 if (I == CompileUnitMap.end())
1239 return constructCompileUnit(Unit.getNode());
1240 return I->second;
1241}
1242
1243/// getUpdatedDbgScope - Find or create DbgScope assicated with the instruction.
1244/// Initialize scope and update scope hierarchy.
1245DbgScope *DwarfDebug::getUpdatedDbgScope(MDNode *N, const MachineInstr *MI,
1246 MDNode *InlinedAt) {
1247 assert (N && "Invalid Scope encoding!");
1248 assert (MI && "Missing machine instruction!");
1249 bool GetConcreteScope = (MI && InlinedAt);
1250
1251 DbgScope *NScope = NULL;
1252
1253 if (InlinedAt)
1254 NScope = DbgScopeMap.lookup(InlinedAt);
1255 else
1256 NScope = DbgScopeMap.lookup(N);
1257 assert (NScope && "Unable to find working scope!");
1258
1259 if (NScope->getFirstInsn())
1260 return NScope;
1261
1262 DbgScope *Parent = NULL;
1263 if (GetConcreteScope) {
1264 DILocation IL(InlinedAt);
1265 Parent = getUpdatedDbgScope(IL.getScope().getNode(), MI,
1266 IL.getOrigLocation().getNode());
1267 assert (Parent && "Unable to find Parent scope!");
1268 NScope->setParent(Parent);
1269 Parent->addScope(NScope);
1270 } else if (DIDescriptor(N).isLexicalBlock()) {
1271 DILexicalBlock DB(N);
1272 if (!DB.getContext().isNull()) {
1273 Parent = getUpdatedDbgScope(DB.getContext().getNode(), MI, InlinedAt);
1274 NScope->setParent(Parent);
1275 Parent->addScope(NScope);
1276 }
1277 }
1278
1279 NScope->setFirstInsn(MI);
1280
1281 if (!Parent && !InlinedAt) {
1282 StringRef SPName = DISubprogram(N).getLinkageName();
1283 if (SPName == MF->getFunction()->getName())
1284 CurrentFnDbgScope = NScope;
1285 }
1286
1287 if (GetConcreteScope) {
1288 ConcreteScopes[InlinedAt] = NScope;
1289 getOrCreateAbstractScope(N);
1290 }
1291
1292 return NScope;
1293}
1294
1295DbgScope *DwarfDebug::getOrCreateAbstractScope(MDNode *N) {
1296 assert (N && "Invalid Scope encoding!");
1297
1298 DbgScope *AScope = AbstractScopes.lookup(N);
1299 if (AScope)
1300 return AScope;
1301
1302 DbgScope *Parent = NULL;
1303
1304 DIDescriptor Scope(N);
1305 if (Scope.isLexicalBlock()) {
1306 DILexicalBlock DB(N);
1307 DIDescriptor ParentDesc = DB.getContext();
1308 if (!ParentDesc.isNull())
1309 Parent = getOrCreateAbstractScope(ParentDesc.getNode());
1310 }
1311
1312 AScope = new DbgScope(Parent, DIDescriptor(N), NULL);
1313
1314 if (Parent)
1315 Parent->addScope(AScope);
1316 AScope->setAbstractScope();
1317 AbstractScopes[N] = AScope;
1318 if (DIDescriptor(N).isSubprogram())
1319 AbstractScopesList.push_back(AScope);
1320 return AScope;
1321}
1322
1323/// updateSubprogramScopeDIE - Find DIE for the given subprogram and
1324/// attach appropriate DW_AT_low_pc and DW_AT_high_pc attributes.
1325/// If there are global variables in this scope then create and insert
1326/// DIEs for these variables.
1327DIE *DwarfDebug::updateSubprogramScopeDIE(MDNode *SPNode) {
1328
1329 DIE *SPDie = ModuleCU->getDIE(SPNode);
1330 assert (SPDie && "Unable to find subprogram DIE!");
1331 DISubprogram SP(SPNode);
1332 // There is not any need to generate specification DIE for a function
1333 // defined at compile unit level. If a function is defined inside another
1334 // function then gdb prefers the definition at top level and but does not
1335 // expect specification DIE in parent function. So avoid creating
1336 // specification DIE for a function defined inside a function.
1337 if (SP.isDefinition() && !SP.getContext().isCompileUnit()
1338 && !SP.getContext().isSubprogram()) {
1339 addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1340 // Add arguments.
1341 DICompositeType SPTy = SP.getType();
1342 DIArray Args = SPTy.getTypeArray();
1343 unsigned SPTag = SPTy.getTag();
1344 if (SPTag == dwarf::DW_TAG_subroutine_type)
1345 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
1346 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1347 DIType ATy = DIType(DIType(Args.getElement(i).getNode()));
1348 addType(Arg, ATy);
1349 if (ATy.isArtificial())
1350 addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1351 SPDie->addChild(Arg);
1352 }
1353 DIE *SPDeclDie = SPDie;
1354 SPDie = new DIE(dwarf::DW_TAG_subprogram);
1355 addDIEEntry(SPDie, dwarf::DW_AT_specification, dwarf::DW_FORM_ref4,
1356 SPDeclDie);
1357 ModuleCU->addDie(SPDie);
1358 }
1359
1360 addLabel(SPDie, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
1361 DWLabel("func_begin", SubprogramCount));
1362 addLabel(SPDie, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
1363 DWLabel("func_end", SubprogramCount));
1364 MachineLocation Location(RI->getFrameRegister(*MF));
1365 addAddress(SPDie, dwarf::DW_AT_frame_base, Location);
1366
1367 if (!DISubprogram(SPNode).isLocalToUnit())
1368 addUInt(SPDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
1369
1370 return SPDie;
1371}
1372
1373/// constructLexicalScope - Construct new DW_TAG_lexical_block
1374/// for this scope and attach DW_AT_low_pc/DW_AT_high_pc labels.
1375DIE *DwarfDebug::constructLexicalScopeDIE(DbgScope *Scope) {
1376 unsigned StartID = MMI->MappedLabel(Scope->getStartLabelID());
1377 unsigned EndID = MMI->MappedLabel(Scope->getEndLabelID());
1378
1379 // Ignore empty scopes.
1380 if (StartID == EndID && StartID != 0)
1381 return NULL;
1382
1383 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_lexical_block);
1384 if (Scope->isAbstractScope())
1385 return ScopeDIE;
1386
1387 addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
1388 StartID ?
1389 DWLabel("label", StartID)
1390 : DWLabel("func_begin", SubprogramCount));
1391 addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
1392 EndID ?
1393 DWLabel("label", EndID)
1394 : DWLabel("func_end", SubprogramCount));
1395
1396
1397
1398 return ScopeDIE;
1399}
1400
1401/// constructInlinedScopeDIE - This scope represents inlined body of
1402/// a function. Construct DIE to represent this concrete inlined copy
1403/// of the function.
1404DIE *DwarfDebug::constructInlinedScopeDIE(DbgScope *Scope) {
1405 unsigned StartID = MMI->MappedLabel(Scope->getStartLabelID());
1406 unsigned EndID = MMI->MappedLabel(Scope->getEndLabelID());
1407 assert (StartID && "Invalid starting label for an inlined scope!");
1408 assert (EndID && "Invalid end label for an inlined scope!");
1409 // Ignore empty scopes.
1410 if (StartID == EndID && StartID != 0)
1411 return NULL;
1412
1413 DIScope DS(Scope->getScopeNode());
1414 if (DS.isNull())
1415 return NULL;
1416 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_inlined_subroutine);
1417
1418 DISubprogram InlinedSP = getDISubprogram(DS.getNode());
1419 DIE *OriginDIE = ModuleCU->getDIE(InlinedSP.getNode());
1420 assert (OriginDIE && "Unable to find Origin DIE!");
1421 addDIEEntry(ScopeDIE, dwarf::DW_AT_abstract_origin,
1422 dwarf::DW_FORM_ref4, OriginDIE);
1423
1424 addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
1425 DWLabel("label", StartID));
1426 addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
1427 DWLabel("label", EndID));
1428
1429 InlinedSubprogramDIEs.insert(OriginDIE);
1430
1431 // Track the start label for this inlined function.
1432 DenseMap<MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator
1433 I = InlineInfo.find(InlinedSP.getNode());
1434
1435 if (I == InlineInfo.end()) {
1436 InlineInfo[InlinedSP.getNode()].push_back(std::make_pair(StartID,
1437 ScopeDIE));
1438 InlinedSPNodes.push_back(InlinedSP.getNode());
1439 } else
1440 I->second.push_back(std::make_pair(StartID, ScopeDIE));
1441
1442 StringPool.insert(InlinedSP.getName());
1443 StringPool.insert(getRealLinkageName(InlinedSP.getLinkageName()));
1444
1445 DILocation DL(Scope->getInlinedAt());
1446 addUInt(ScopeDIE, dwarf::DW_AT_call_file, 0, ModuleCU->getID());
1447 addUInt(ScopeDIE, dwarf::DW_AT_call_line, 0, DL.getLineNumber());
1448
1449 return ScopeDIE;
1450}
1451
1452
1453/// constructVariableDIE - Construct a DIE for the given DbgVariable.
1454DIE *DwarfDebug::constructVariableDIE(DbgVariable *DV, DbgScope *Scope) {
1455 // Get the descriptor.
1456 const DIVariable &VD = DV->getVariable();
1457 StringRef Name = VD.getName();
1458 if (Name.empty())
1459 return NULL;
1460
1461 // Translate tag to proper Dwarf tag. The result variable is dropped for
1462 // now.
1463 unsigned Tag;
1464 switch (VD.getTag()) {
1465 case dwarf::DW_TAG_return_variable:
1466 return NULL;
1467 case dwarf::DW_TAG_arg_variable:
1468 Tag = dwarf::DW_TAG_formal_parameter;
1469 break;
1470 case dwarf::DW_TAG_auto_variable: // fall thru
1471 default:
1472 Tag = dwarf::DW_TAG_variable;
1473 break;
1474 }
1475
1476 // Define variable debug information entry.
1477 DIE *VariableDie = new DIE(Tag);
1478
1479
1480 DIE *AbsDIE = NULL;
1481 if (DbgVariable *AV = DV->getAbstractVariable())
1482 AbsDIE = AV->getDIE();
1483
1484 if (AbsDIE) {
1485 DIScope DS(Scope->getScopeNode());
1486 DISubprogram InlinedSP = getDISubprogram(DS.getNode());
1487 DIE *OriginSPDIE = ModuleCU->getDIE(InlinedSP.getNode());
1488 (void) OriginSPDIE;
1489 assert (OriginSPDIE && "Unable to find Origin DIE for the SP!");
1490 DIE *AbsDIE = DV->getAbstractVariable()->getDIE();
1491 assert (AbsDIE && "Unable to find Origin DIE for the Variable!");
1492 addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin,
1493 dwarf::DW_FORM_ref4, AbsDIE);
1494 }
1495 else {
1496 addString(VariableDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1497 addSourceLine(VariableDie, &VD);
1498
1499 // Add variable type.
1500 // FIXME: isBlockByrefVariable should be reformulated in terms of complex
1501 // addresses instead.
1502 if (VD.isBlockByrefVariable())
1503 addType(VariableDie, getBlockByrefType(VD.getType(), Name));
1504 else
1505 addType(VariableDie, VD.getType());
1506 }
1507
1508 // Add variable address.
1509 if (!Scope->isAbstractScope()) {
1510 MachineLocation Location;
1511 unsigned FrameReg;
1512 int Offset = RI->getFrameIndexReference(*MF, DV->getFrameIndex(), FrameReg);
1513 Location.set(FrameReg, Offset);
1514
1515 if (VD.hasComplexAddress())
1516 addComplexAddress(DV, VariableDie, dwarf::DW_AT_location, Location);
1517 else if (VD.isBlockByrefVariable())
1518 addBlockByrefAddress(DV, VariableDie, dwarf::DW_AT_location, Location);
1519 else
1520 addAddress(VariableDie, dwarf::DW_AT_location, Location);
1521 }
1522
1523 if (Tag == dwarf::DW_TAG_formal_parameter && VD.getType().isArtificial())
1524 addUInt(VariableDie, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1525 DV->setDIE(VariableDie);
1526 return VariableDie;
1527
1528}
1529
1530void DwarfDebug::addPubTypes(DISubprogram SP) {
1531 DICompositeType SPTy = SP.getType();
1532 unsigned SPTag = SPTy.getTag();
1533 if (SPTag != dwarf::DW_TAG_subroutine_type)
1534 return;
1535
1536 DIArray Args = SPTy.getTypeArray();
1537 if (Args.isNull())
1538 return;
1539
1540 for (unsigned i = 0, e = Args.getNumElements(); i != e; ++i) {
1541 DIType ATy(Args.getElement(i).getNode());
1542 if (ATy.isNull())
1543 continue;
1544 DICompositeType CATy = getDICompositeType(ATy);
1545 if (!CATy.isNull() && !CATy.getName().empty()) {
1546 if (DIEEntry *Entry = ModuleCU->getDIEEntry(CATy.getNode()))
1547 ModuleCU->addGlobalType(CATy.getName(), Entry->getEntry());
1548 }
1549 }
1550}
1551
1552/// constructScopeDIE - Construct a DIE for this scope.
1553DIE *DwarfDebug::constructScopeDIE(DbgScope *Scope) {
1554 if (!Scope)
1555 return NULL;
1556 DIScope DS(Scope->getScopeNode());
1557 if (DS.isNull())
1558 return NULL;
1559
1560 DIE *ScopeDIE = NULL;
1561 if (Scope->getInlinedAt())
1562 ScopeDIE = constructInlinedScopeDIE(Scope);
1563 else if (DS.isSubprogram()) {
1564 if (Scope->isAbstractScope())
1565 ScopeDIE = ModuleCU->getDIE(DS.getNode());
1566 else
1567 ScopeDIE = updateSubprogramScopeDIE(DS.getNode());
1568 }
1569 else {
1570 ScopeDIE = constructLexicalScopeDIE(Scope);
1571 if (!ScopeDIE) return NULL;
1572 }
1573
1574 // Add variables to scope.
1575 SmallVector<DbgVariable *, 8> &Variables = Scope->getVariables();
1576 for (unsigned i = 0, N = Variables.size(); i < N; ++i) {
1577 DIE *VariableDIE = constructVariableDIE(Variables[i], Scope);
1578 if (VariableDIE)
1579 ScopeDIE->addChild(VariableDIE);
1580 }
1581
1582 // Add nested scopes.
1583 SmallVector<DbgScope *, 4> &Scopes = Scope->getScopes();
1584 for (unsigned j = 0, M = Scopes.size(); j < M; ++j) {
1585 // Define the Scope debug information entry.
1586 DIE *NestedDIE = constructScopeDIE(Scopes[j]);
1587 if (NestedDIE)
1588 ScopeDIE->addChild(NestedDIE);
1589 }
1590
1591 if (DS.isSubprogram())
1592 addPubTypes(DISubprogram(DS.getNode()));
1593
1594 return ScopeDIE;
1595}
1596
1597/// GetOrCreateSourceID - Look up the source id with the given directory and
1598/// source file names. If none currently exists, create a new id and insert it
1599/// in the SourceIds map. This can update DirectoryNames and SourceFileNames
1600/// maps as well.
1601unsigned DwarfDebug::GetOrCreateSourceID(StringRef DirName, StringRef FileName) {
1602 unsigned DId;
1603 StringMap<unsigned>::iterator DI = DirectoryIdMap.find(DirName);
1604 if (DI != DirectoryIdMap.end()) {
1605 DId = DI->getValue();
1606 } else {
1607 DId = DirectoryNames.size() + 1;
1608 DirectoryIdMap[DirName] = DId;
1609 DirectoryNames.push_back(DirName);
1610 }
1611
1612 unsigned FId;
1613 StringMap<unsigned>::iterator FI = SourceFileIdMap.find(FileName);
1614 if (FI != SourceFileIdMap.end()) {
1615 FId = FI->getValue();
1616 } else {
1617 FId = SourceFileNames.size() + 1;
1618 SourceFileIdMap[FileName] = FId;
1619 SourceFileNames.push_back(FileName);
1620 }
1621
1622 DenseMap<std::pair<unsigned, unsigned>, unsigned>::iterator SI =
1623 SourceIdMap.find(std::make_pair(DId, FId));
1624 if (SI != SourceIdMap.end())
1625 return SI->second;
1626
1627 unsigned SrcId = SourceIds.size() + 1; // DW_AT_decl_file cannot be 0.
1628 SourceIdMap[std::make_pair(DId, FId)] = SrcId;
1629 SourceIds.push_back(std::make_pair(DId, FId));
1630
1631 return SrcId;
1632}
1633
1634/// getOrCreateNameSpace - Create a DIE for DINameSpace.
1635DIE *DwarfDebug::getOrCreateNameSpace(DINameSpace NS) {
1636 DIE *NDie = ModuleCU->getDIE(NS.getNode());
1637 if (NDie)
1638 return NDie;
1639 NDie = new DIE(dwarf::DW_TAG_namespace);
1640 ModuleCU->insertDIE(NS.getNode(), NDie);
1641 if (!NS.getName().empty())
1642 addString(NDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, NS.getName());
1643 addSourceLine(NDie, &NS);
1644 addToContextOwner(NDie, NS.getContext());
1645 return NDie;
1646}
1647
1648CompileUnit *DwarfDebug::constructCompileUnit(MDNode *N) {
1649 DICompileUnit DIUnit(N);
1650 StringRef FN = DIUnit.getFilename();
1651 StringRef Dir = DIUnit.getDirectory();
1652 unsigned ID = GetOrCreateSourceID(Dir, FN);
1653
1654 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
1655 addSectionOffset(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4,
1656 DWLabel("section_line", 0), DWLabel("section_line", 0),
1657 false);
1658 addString(Die, dwarf::DW_AT_producer, dwarf::DW_FORM_string,
1659 DIUnit.getProducer());
1660 addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data1,
1661 DIUnit.getLanguage());
1662 addString(Die, dwarf::DW_AT_name, dwarf::DW_FORM_string, FN);
1663
1664 if (!Dir.empty())
1665 addString(Die, dwarf::DW_AT_comp_dir, dwarf::DW_FORM_string, Dir);
1666 if (DIUnit.isOptimized())
1667 addUInt(Die, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1);
1668
1669 StringRef Flags = DIUnit.getFlags();
1670 if (!Flags.empty())
1671 addString(Die, dwarf::DW_AT_APPLE_flags, dwarf::DW_FORM_string, Flags);
1672
1673 unsigned RVer = DIUnit.getRunTimeVersion();
1674 if (RVer)
1675 addUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers,
1676 dwarf::DW_FORM_data1, RVer);
1677
1678 CompileUnit *Unit = new CompileUnit(ID, Die);
1679 if (!ModuleCU && DIUnit.isMain()) {
1680 // Use first compile unit marked as isMain as the compile unit
1681 // for this module.
1682 ModuleCU = Unit;
1683 }
1684
1685 CompileUnitMap[DIUnit.getNode()] = Unit;
1686 CompileUnits.push_back(Unit);
1687 return Unit;
1688}
1689
1690void DwarfDebug::constructGlobalVariableDIE(MDNode *N) {
1691 DIGlobalVariable DI_GV(N);
1692
1693 // If debug information is malformed then ignore it.
1694 if (DI_GV.Verify() == false)
1695 return;
1696
1697 // Check for pre-existence.
1698 if (ModuleCU->getDIE(DI_GV.getNode()))
1699 return;
1700
1701 DIE *VariableDie = createGlobalVariableDIE(DI_GV);
1702 if (!VariableDie)
1703 return;
1704
1705 // Add to map.
1706 ModuleCU->insertDIE(N, VariableDie);
1707
1708 // Add to context owner.
1709 DIDescriptor GVContext = DI_GV.getContext();
1710 // Do not create specification DIE if context is either compile unit
1711 // or a subprogram.
1712 if (DI_GV.isDefinition() && !GVContext.isCompileUnit()
1713 && !GVContext.isSubprogram()) {
1714 // Create specification DIE.
1715 DIE *VariableSpecDIE = new DIE(dwarf::DW_TAG_variable);
1716 addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification,
1717 dwarf::DW_FORM_ref4, VariableDie);
1718 DIEBlock *Block = new DIEBlock();
1719 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
1720 addObjectLabel(Block, 0, dwarf::DW_FORM_udata,
1721 Asm->GetGlobalValueSymbol(DI_GV.getGlobal()));
1722 addBlock(VariableSpecDIE, dwarf::DW_AT_location, 0, Block);
1723 addUInt(VariableDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1724 ModuleCU->addDie(VariableSpecDIE);
1725 } else {
1726 DIEBlock *Block = new DIEBlock();
1727 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
1728 addObjectLabel(Block, 0, dwarf::DW_FORM_udata,
1729 Asm->GetGlobalValueSymbol(DI_GV.getGlobal()));
1730 addBlock(VariableDie, dwarf::DW_AT_location, 0, Block);
1731 }
1732 addToContextOwner(VariableDie, GVContext);
1733
1734 // Expose as global. FIXME - need to check external flag.
1735 ModuleCU->addGlobal(DI_GV.getName(), VariableDie);
1736
1737 DIType GTy = DI_GV.getType();
1738 if (GTy.isCompositeType() && !GTy.getName().empty()) {
1739 DIEEntry *Entry = ModuleCU->getDIEEntry(GTy.getNode());
1740 assert (Entry && "Missing global type!");
1741 ModuleCU->addGlobalType(GTy.getName(), Entry->getEntry());
1742 }
1743 return;
1744}
1745
1746void DwarfDebug::constructSubprogramDIE(MDNode *N) {
1747 DISubprogram SP(N);
1748
1749 // Check for pre-existence.
1750 if (ModuleCU->getDIE(N))
1751 return;
1752
1753 if (!SP.isDefinition())
1754 // This is a method declaration which will be handled while constructing
1755 // class type.
1756 return;
1757
1758 DIE *SubprogramDie = createSubprogramDIE(SP);
1759
1760 // Add to map.
1761 ModuleCU->insertDIE(N, SubprogramDie);
1762
1763 // Add to context owner.
1764 addToContextOwner(SubprogramDie, SP.getContext());
1765
1766 // Expose as global.
1767 ModuleCU->addGlobal(SP.getName(), SubprogramDie);
1768
1769 return;
1770}
1771
1772/// beginModule - Emit all Dwarf sections that should come prior to the
1773/// content. Create global DIEs and emit initial debug info sections.
1774/// This is inovked by the target AsmPrinter.
1775void DwarfDebug::beginModule(Module *M, MachineModuleInfo *mmi) {
1776 this->M = M;
1777
1778 if (TimePassesIsEnabled)
1779 DebugTimer->startTimer();
1780
1781 if (!MAI->doesSupportDebugInformation())
1782 return;
1783
1784 DebugInfoFinder DbgFinder;
1785 DbgFinder.processModule(*M);
1786
1787 // Create all the compile unit DIEs.
1788 for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
1789 E = DbgFinder.compile_unit_end(); I != E; ++I)
1790 constructCompileUnit(*I);
1791
1792 if (CompileUnits.empty()) {
1793 if (TimePassesIsEnabled)
1794 DebugTimer->stopTimer();
1795
1796 return;
1797 }
1798
1799 // If main compile unit for this module is not seen than randomly
1800 // select first compile unit.
1801 if (!ModuleCU)
1802 ModuleCU = CompileUnits[0];
1803
1804 // Create DIEs for each subprogram.
1805 for (DebugInfoFinder::iterator I = DbgFinder.subprogram_begin(),
1806 E = DbgFinder.subprogram_end(); I != E; ++I)
1807 constructSubprogramDIE(*I);
1808
1809 // Create DIEs for each global variable.
1810 for (DebugInfoFinder::iterator I = DbgFinder.global_variable_begin(),
1811 E = DbgFinder.global_variable_end(); I != E; ++I)
1812 constructGlobalVariableDIE(*I);
1813
1814 MMI = mmi;
1815 shouldEmit = true;
1816 MMI->setDebugInfoAvailability(true);
1817
1818 // Prime section data.
1819 SectionMap.insert(Asm->getObjFileLowering().getTextSection());
1820
1821 // Print out .file directives to specify files for .loc directives. These are
1822 // printed out early so that they precede any .loc directives.
1823 if (MAI->hasDotLocAndDotFile()) {
1824 for (unsigned i = 1, e = getNumSourceIds()+1; i != e; ++i) {
1825 // Remember source id starts at 1.
1826 std::pair<unsigned, unsigned> Id = getSourceDirectoryAndFileIds(i);
1827 // FIXME: don't use sys::path for this! This should not depend on the
1828 // host.
1829 sys::Path FullPath(getSourceDirectoryName(Id.first));
1830 bool AppendOk =
1831 FullPath.appendComponent(getSourceFileName(Id.second));
1832 assert(AppendOk && "Could not append filename to directory!");
1833 AppendOk = false;
1834 Asm->OutStreamer.EmitDwarfFileDirective(i, FullPath.str());
1835 }
1836 }
1837
1838 // Emit initial sections
1839 emitInitial();
1840
1841 if (TimePassesIsEnabled)
1842 DebugTimer->stopTimer();
1843}
1844
1845/// endModule - Emit all Dwarf sections that should come after the content.
1846///
1847void DwarfDebug::endModule() {
1848 if (!ModuleCU)
1849 return;
1850
1851 if (TimePassesIsEnabled)
1852 DebugTimer->startTimer();
1853
1854 // Attach DW_AT_inline attribute with inlined subprogram DIEs.
1855 for (SmallPtrSet<DIE *, 4>::iterator AI = InlinedSubprogramDIEs.begin(),
1856 AE = InlinedSubprogramDIEs.end(); AI != AE; ++AI) {
1857 DIE *ISP = *AI;
1858 addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
1859 }
1860
1861 // Insert top level DIEs.
1862 for (SmallVector<DIE *, 4>::iterator TI = TopLevelDIEsVector.begin(),
1863 TE = TopLevelDIEsVector.end(); TI != TE; ++TI)
1864 ModuleCU->getCUDie()->addChild(*TI);
1865
1866 for (DenseMap<DIE *, MDNode *>::iterator CI = ContainingTypeMap.begin(),
1867 CE = ContainingTypeMap.end(); CI != CE; ++CI) {
1868 DIE *SPDie = CI->first;
1869 MDNode *N = dyn_cast_or_null<MDNode>(CI->second);
1870 if (!N) continue;
1871 DIE *NDie = ModuleCU->getDIE(N);
1872 if (!NDie) continue;
1873 addDIEEntry(SPDie, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, NDie);
1874 // FIXME - This is not the correct approach.
1875 // addDIEEntry(NDie, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, NDie);
1876 }
1877
1878 // Standard sections final addresses.
1879 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getTextSection());
1880 EmitLabel("text_end", 0);
1881 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getDataSection());
1882 EmitLabel("data_end", 0);
1883
1884 // End text sections.
1885 for (unsigned i = 1, N = SectionMap.size(); i <= N; ++i) {
1886 Asm->OutStreamer.SwitchSection(SectionMap[i]);
1887 EmitLabel("section_end", i);
1888 }
1889
1890 // Emit common frame information.
1891 emitCommonDebugFrame();
1892
1893 // Emit function debug frame information
1894 for (std::vector<FunctionDebugFrameInfo>::iterator I = DebugFrames.begin(),
1895 E = DebugFrames.end(); I != E; ++I)
1896 emitFunctionDebugFrame(*I);
1897
1898 // Compute DIE offsets and sizes.
1899 computeSizeAndOffsets();
1900
1901 // Emit all the DIEs into a debug info section
1902 emitDebugInfo();
1903
1904 // Corresponding abbreviations into a abbrev section.
1905 emitAbbreviations();
1906
1907 // Emit source line correspondence into a debug line section.
1908 emitDebugLines();
1909
1910 // Emit info into a debug pubnames section.
1911 emitDebugPubNames();
1912
1913 // Emit info into a debug pubtypes section.
1914 emitDebugPubTypes();
1915
1916 // Emit info into a debug str section.
1917 emitDebugStr();
1918
1919 // Emit info into a debug loc section.
1920 emitDebugLoc();
1921
1922 // Emit info into a debug aranges section.
1923 EmitDebugARanges();
1924
1925 // Emit info into a debug ranges section.
1926 emitDebugRanges();
1927
1928 // Emit info into a debug macinfo section.
1929 emitDebugMacInfo();
1930
1931 // Emit inline info.
1932 emitDebugInlineInfo();
1933
1934 if (TimePassesIsEnabled)
1935 DebugTimer->stopTimer();
1936}
1937
1938/// findAbstractVariable - Find abstract variable, if any, associated with Var.
1939DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &Var,
1940 unsigned FrameIdx,
1941 DILocation &ScopeLoc) {
1942
1943 DbgVariable *AbsDbgVariable = AbstractVariables.lookup(Var.getNode());
1944 if (AbsDbgVariable)
1945 return AbsDbgVariable;
1946
1947 DbgScope *Scope = AbstractScopes.lookup(ScopeLoc.getScope().getNode());
1948 if (!Scope)
1949 return NULL;
1950
1951 AbsDbgVariable = new DbgVariable(Var, FrameIdx);
1952 Scope->addVariable(AbsDbgVariable);
1953 AbstractVariables[Var.getNode()] = AbsDbgVariable;
1954 return AbsDbgVariable;
1955}
1956
1957/// collectVariableInfo - Populate DbgScope entries with variables' info.
1958void DwarfDebug::collectVariableInfo() {
1959 if (!MMI) return;
1960
1961 MachineModuleInfo::VariableDbgInfoMapTy &VMap = MMI->getVariableDbgInfo();
1962 for (MachineModuleInfo::VariableDbgInfoMapTy::iterator VI = VMap.begin(),
1963 VE = VMap.end(); VI != VE; ++VI) {
1964 MDNode *Var = VI->first;
1965 if (!Var) continue;
1966 DIVariable DV (Var);
1967 std::pair< unsigned, MDNode *> VP = VI->second;
1968 DILocation ScopeLoc(VP.second);
1969
1970 DbgScope *Scope =
1971 ConcreteScopes.lookup(ScopeLoc.getOrigLocation().getNode());
1972 if (!Scope)
1973 Scope = DbgScopeMap.lookup(ScopeLoc.getScope().getNode());
1974 // If variable scope is not found then skip this variable.
1975 if (!Scope)
1976 continue;
1977
1978 DbgVariable *RegVar = new DbgVariable(DV, VP.first);
1979 Scope->addVariable(RegVar);
1980 if (DbgVariable *AbsDbgVariable = findAbstractVariable(DV, VP.first,
1981 ScopeLoc))
1982 RegVar->setAbstractVariable(AbsDbgVariable);
1983 }
1984}
1985
1986/// beginScope - Process beginning of a scope starting at Label.
1987void DwarfDebug::beginScope(const MachineInstr *MI, unsigned Label) {
1988 InsnToDbgScopeMapTy::iterator I = DbgScopeBeginMap.find(MI);
1989 if (I == DbgScopeBeginMap.end())
1990 return;
1991 ScopeVector &SD = I->second;
1992 for (ScopeVector::iterator SDI = SD.begin(), SDE = SD.end();
1993 SDI != SDE; ++SDI)
1994 (*SDI)->setStartLabelID(Label);
1995}
1996
1997/// endScope - Process end of a scope.
1998void DwarfDebug::endScope(const MachineInstr *MI) {
1999 InsnToDbgScopeMapTy::iterator I = DbgScopeEndMap.find(MI);
2000 if (I == DbgScopeEndMap.end())
2001 return;
2002
2003 unsigned Label = MMI->NextLabelID();
2004 Asm->printLabel(Label);
2005 O << '\n';
2006
2007 SmallVector<DbgScope *, 2> &SD = I->second;
2008 for (SmallVector<DbgScope *, 2>::iterator SDI = SD.begin(), SDE = SD.end();
2009 SDI != SDE; ++SDI)
2010 (*SDI)->setEndLabelID(Label);
2011 return;
2012}
2013
2014/// createDbgScope - Create DbgScope for the scope.
2015void DwarfDebug::createDbgScope(MDNode *Scope, MDNode *InlinedAt) {
2016
2017 if (!InlinedAt) {
2018 DbgScope *WScope = DbgScopeMap.lookup(Scope);
2019 if (WScope)
2020 return;
2021 WScope = new DbgScope(NULL, DIDescriptor(Scope), NULL);
2022 DbgScopeMap.insert(std::make_pair(Scope, WScope));
2023 if (DIDescriptor(Scope).isLexicalBlock())
2024 createDbgScope(DILexicalBlock(Scope).getContext().getNode(), NULL);
2025 return;
2026 }
2027
2028 DbgScope *WScope = DbgScopeMap.lookup(InlinedAt);
2029 if (WScope)
2030 return;
2031
2032 WScope = new DbgScope(NULL, DIDescriptor(Scope), InlinedAt);
2033 DbgScopeMap.insert(std::make_pair(InlinedAt, WScope));
2034 DILocation DL(InlinedAt);
2035 createDbgScope(DL.getScope().getNode(), DL.getOrigLocation().getNode());
2036}
2037
2038/// extractScopeInformation - Scan machine instructions in this function
2039/// and collect DbgScopes. Return true, if atleast one scope was found.
2040bool DwarfDebug::extractScopeInformation() {
2041 // If scope information was extracted using .dbg intrinsics then there is not
2042 // any need to extract these information by scanning each instruction.
2043 if (!DbgScopeMap.empty())
2044 return false;
2045
2046 DenseMap<const MachineInstr *, unsigned> MIIndexMap;
2047 unsigned MIIndex = 0;
2048 // Scan each instruction and create scopes. First build working set of scopes.
2049 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2050 I != E; ++I) {
2051 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2052 II != IE; ++II) {
2053 const MachineInstr *MInsn = II;
2054 MIIndexMap[MInsn] = MIIndex++;
2055 DebugLoc DL = MInsn->getDebugLoc();
2056 if (DL.isUnknown()) continue;
2057 DILocation DLT = MF->getDILocation(DL);
2058 DIScope DLTScope = DLT.getScope();
2059 if (DLTScope.isNull()) continue;
2060 // There is no need to create another DIE for compile unit. For all
2061 // other scopes, create one DbgScope now. This will be translated
2062 // into a scope DIE at the end.
2063 if (DLTScope.isCompileUnit()) continue;
2064 createDbgScope(DLTScope.getNode(), DLT.getOrigLocation().getNode());
2065 }
2066 }
2067
2068
2069 // Build scope hierarchy using working set of scopes.
2070 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2071 I != E; ++I) {
2072 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2073 II != IE; ++II) {
2074 const MachineInstr *MInsn = II;
2075 DebugLoc DL = MInsn->getDebugLoc();
2076 if (DL.isUnknown()) continue;
2077 DILocation DLT = MF->getDILocation(DL);
2078 DIScope DLTScope = DLT.getScope();
2079 if (DLTScope.isNull()) continue;
2080 // There is no need to create another DIE for compile unit. For all
2081 // other scopes, create one DbgScope now. This will be translated
2082 // into a scope DIE at the end.
2083 if (DLTScope.isCompileUnit()) continue;
2084 DbgScope *Scope = getUpdatedDbgScope(DLTScope.getNode(), MInsn,
2085 DLT.getOrigLocation().getNode());
2086 Scope->setLastInsn(MInsn);
2087 }
2088 }
2089
2090 if (!CurrentFnDbgScope)
2091 return false;
2092
2093 CurrentFnDbgScope->fixInstructionMarkers(MIIndexMap);
2094
2095 // Each scope has first instruction and last instruction to mark beginning
2096 // and end of a scope respectively. Create an inverse map that list scopes
2097 // starts (and ends) with an instruction. One instruction may start (or end)
2098 // multiple scopes. Ignore scopes that are not reachable.
2099 SmallVector<DbgScope *, 4> WorkList;
2100 WorkList.push_back(CurrentFnDbgScope);
2101 while (!WorkList.empty()) {
2102 DbgScope *S = WorkList.back(); WorkList.pop_back();
2103
2104 SmallVector<DbgScope *, 4> &Children = S->getScopes();
2105 if (!Children.empty())
2106 for (SmallVector<DbgScope *, 4>::iterator SI = Children.begin(),
2107 SE = Children.end(); SI != SE; ++SI)
2108 WorkList.push_back(*SI);
2109
2110 if (S->isAbstractScope())
2111 continue;
2112 const MachineInstr *MI = S->getFirstInsn();
2113 assert (MI && "DbgScope does not have first instruction!");
2114
2115 InsnToDbgScopeMapTy::iterator IDI = DbgScopeBeginMap.find(MI);
2116 if (IDI != DbgScopeBeginMap.end())
2117 IDI->second.push_back(S);
2118 else
2119 DbgScopeBeginMap[MI].push_back(S);
2120
2121 MI = S->getLastInsn();
2122 assert (MI && "DbgScope does not have last instruction!");
2123 IDI = DbgScopeEndMap.find(MI);
2124 if (IDI != DbgScopeEndMap.end())
2125 IDI->second.push_back(S);
2126 else
2127 DbgScopeEndMap[MI].push_back(S);
2128 }
2129
2130 return !DbgScopeMap.empty();
2131}
2132
2133/// beginFunction - Gather pre-function debug information. Assumes being
2134/// emitted immediately after the function entry point.
2135void DwarfDebug::beginFunction(const MachineFunction *MF) {
2136 this->MF = MF;
2137
2138 if (!ShouldEmitDwarfDebug()) return;
2139
2140 if (TimePassesIsEnabled)
2141 DebugTimer->startTimer();
2142
2143 if (!extractScopeInformation())
2144 return;
2145
2146 collectVariableInfo();
2147
2148 // Assumes in correct section after the entry point.
2149 EmitLabel("func_begin", ++SubprogramCount);
2150
2151 // Emit label for the implicitly defined dbg.stoppoint at the start of the
2152 // function.
2153 DebugLoc FDL = MF->getDefaultDebugLoc();
2154 if (!FDL.isUnknown()) {
2155 DILocation DLT = MF->getDILocation(FDL);
2156 unsigned LabelID = 0;
2157 DISubprogram SP = getDISubprogram(DLT.getScope().getNode());
2158 if (!SP.isNull())
2159 LabelID = recordSourceLine(SP.getLineNumber(), 0,
2160 DLT.getScope().getNode());
2161 else
2162 LabelID = recordSourceLine(DLT.getLineNumber(),
2163 DLT.getColumnNumber(),
2164 DLT.getScope().getNode());
2165 Asm->printLabel(LabelID);
2166 O << '\n';
2167 }
2168 if (TimePassesIsEnabled)
2169 DebugTimer->stopTimer();
2170}
2171
2172/// endFunction - Gather and emit post-function debug information.
2173///
2174void DwarfDebug::endFunction(const MachineFunction *MF) {
2175 if (!ShouldEmitDwarfDebug()) return;
2176
2177 if (TimePassesIsEnabled)
2178 DebugTimer->startTimer();
2179
2180 if (DbgScopeMap.empty())
2181 return;
2182
2183 if (CurrentFnDbgScope) {
2184 // Define end label for subprogram.
2185 EmitLabel("func_end", SubprogramCount);
2186
2187 // Get function line info.
2188 if (!Lines.empty()) {
2189 // Get section line info.
2190 unsigned ID = SectionMap.insert(Asm->getCurrentSection());
2191 if (SectionSourceLines.size() < ID) SectionSourceLines.resize(ID);
2192 std::vector<SrcLineInfo> &SectionLineInfos = SectionSourceLines[ID-1];
2193 // Append the function info to section info.
2194 SectionLineInfos.insert(SectionLineInfos.end(),
2195 Lines.begin(), Lines.end());
2196 }
2197
2198 // Construct abstract scopes.
2199 for (SmallVector<DbgScope *, 4>::iterator AI = AbstractScopesList.begin(),
2200 AE = AbstractScopesList.end(); AI != AE; ++AI)
2201 constructScopeDIE(*AI);
2202
2203 constructScopeDIE(CurrentFnDbgScope);
2204
2205 DebugFrames.push_back(FunctionDebugFrameInfo(SubprogramCount,
2206 MMI->getFrameMoves()));
2207 }
2208
2209 // Clear debug info
2210 CurrentFnDbgScope = NULL;
2211 DbgScopeMap.clear();
2212 DbgScopeBeginMap.clear();
2213 DbgScopeEndMap.clear();
2214 ConcreteScopes.clear();
2215 AbstractScopesList.clear();
2216 Lines.clear();
2217
2218 if (TimePassesIsEnabled)
2219 DebugTimer->stopTimer();
2220}
2221
2222/// recordSourceLine - Records location information and associates it with a
2223/// label. Returns a unique label ID used to generate a label and provide
2224/// correspondence to the source line list.
2225unsigned DwarfDebug::recordSourceLine(unsigned Line, unsigned Col,
2226 MDNode *S) {
2227 if (!MMI)
2228 return 0;
2229
2230 if (TimePassesIsEnabled)
2231 DebugTimer->startTimer();
2232
2233 StringRef Dir;
2234 StringRef Fn;
2235
2236 DIDescriptor Scope(S);
2237 if (Scope.isCompileUnit()) {
2238 DICompileUnit CU(S);
2239 Dir = CU.getDirectory();
2240 Fn = CU.getFilename();
2241 } else if (Scope.isSubprogram()) {
2242 DISubprogram SP(S);
2243 Dir = SP.getDirectory();
2244 Fn = SP.getFilename();
2245 } else if (Scope.isLexicalBlock()) {
2246 DILexicalBlock DB(S);
2247 Dir = DB.getDirectory();
2248 Fn = DB.getFilename();
2249 } else
2250 assert (0 && "Unexpected scope info");
2251
2252 unsigned Src = GetOrCreateSourceID(Dir, Fn);
2253 unsigned ID = MMI->NextLabelID();
2254 Lines.push_back(SrcLineInfo(Line, Col, Src, ID));
2255
2256 if (TimePassesIsEnabled)
2257 DebugTimer->stopTimer();
2258
2259 return ID;
2260}
2261
2262/// getOrCreateSourceID - Public version of GetOrCreateSourceID. This can be
2263/// timed. Look up the source id with the given directory and source file
2264/// names. If none currently exists, create a new id and insert it in the
2265/// SourceIds map. This can update DirectoryNames and SourceFileNames maps as
2266/// well.
2267unsigned DwarfDebug::getOrCreateSourceID(const std::string &DirName,
2268 const std::string &FileName) {
2269 if (TimePassesIsEnabled)
2270 DebugTimer->startTimer();
2271
2272 unsigned SrcId = GetOrCreateSourceID(DirName.c_str(), FileName.c_str());
2273
2274 if (TimePassesIsEnabled)
2275 DebugTimer->stopTimer();
2276
2277 return SrcId;
2278}
2279
2280//===----------------------------------------------------------------------===//
2281// Emit Methods
2282//===----------------------------------------------------------------------===//
2283
2284/// computeSizeAndOffset - Compute the size and offset of a DIE.
2285///
2286unsigned
2287DwarfDebug::computeSizeAndOffset(DIE *Die, unsigned Offset, bool Last) {
2288 // Get the children.
2289 const std::vector<DIE *> &Children = Die->getChildren();
2290
2291 // If not last sibling and has children then add sibling offset attribute.
2292 if (!Last && !Children.empty()) Die->addSiblingOffset();
2293
2294 // Record the abbreviation.
2295 assignAbbrevNumber(Die->getAbbrev());
2296
2297 // Get the abbreviation for this DIE.
2298 unsigned AbbrevNumber = Die->getAbbrevNumber();
2299 const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2300
2301 // Set DIE offset
2302 Die->setOffset(Offset);
2303
2304 // Start the size with the size of abbreviation code.
2305 Offset += MCAsmInfo::getULEB128Size(AbbrevNumber);
2306
2307 const SmallVector<DIEValue*, 32> &Values = Die->getValues();
2308 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
2309
2310 // Size the DIE attribute values.
2311 for (unsigned i = 0, N = Values.size(); i < N; ++i)
2312 // Size attribute value.
2313 Offset += Values[i]->SizeOf(TD, AbbrevData[i].getForm());
2314
2315 // Size the DIE children if any.
2316 if (!Children.empty()) {
2317 assert(Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes &&
2318 "Children flag not set");
2319
2320 for (unsigned j = 0, M = Children.size(); j < M; ++j)
2321 Offset = computeSizeAndOffset(Children[j], Offset, (j + 1) == M);
2322
2323 // End of children marker.
2324 Offset += sizeof(int8_t);
2325 }
2326
2327 Die->setSize(Offset - Die->getOffset());
2328 return Offset;
2329}
2330
2331/// computeSizeAndOffsets - Compute the size and offset of all the DIEs.
2332///
2333void DwarfDebug::computeSizeAndOffsets() {
2334 // Compute size of compile unit header.
2335 static unsigned Offset =
2336 sizeof(int32_t) + // Length of Compilation Unit Info
2337 sizeof(int16_t) + // DWARF version number
2338 sizeof(int32_t) + // Offset Into Abbrev. Section
2339 sizeof(int8_t); // Pointer Size (in bytes)
2340
2341 computeSizeAndOffset(ModuleCU->getCUDie(), Offset, true);
2342 CompileUnitOffsets[ModuleCU] = 0;
2343}
2344
2345/// emitInitial - Emit initial Dwarf declarations. This is necessary for cc
2346/// tools to recognize the object file contains Dwarf information.
2347void DwarfDebug::emitInitial() {
2348 // Check to see if we already emitted intial headers.
2349 if (didInitial) return;
2350 didInitial = true;
2351
2352 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
2353
2354 // Dwarf sections base addresses.
2355 if (MAI->doesDwarfRequireFrameSection()) {
2356 Asm->OutStreamer.SwitchSection(TLOF.getDwarfFrameSection());
2357 EmitLabel("section_debug_frame", 0);
2358 }
2359
2360 Asm->OutStreamer.SwitchSection(TLOF.getDwarfInfoSection());
2361 EmitLabel("section_info", 0);
2362 Asm->OutStreamer.SwitchSection(TLOF.getDwarfAbbrevSection());
2363 EmitLabel("section_abbrev", 0);
2364 Asm->OutStreamer.SwitchSection(TLOF.getDwarfARangesSection());
2365 EmitLabel("section_aranges", 0);
2366
2367 if (const MCSection *LineInfoDirective = TLOF.getDwarfMacroInfoSection()) {
2368 Asm->OutStreamer.SwitchSection(LineInfoDirective);
2369 EmitLabel("section_macinfo", 0);
2370 }
2371
2372 Asm->OutStreamer.SwitchSection(TLOF.getDwarfLineSection());
2373 EmitLabel("section_line", 0);
2374 Asm->OutStreamer.SwitchSection(TLOF.getDwarfLocSection());
2375 EmitLabel("section_loc", 0);
2376 Asm->OutStreamer.SwitchSection(TLOF.getDwarfPubNamesSection());
2377 EmitLabel("section_pubnames", 0);
2378 Asm->OutStreamer.SwitchSection(TLOF.getDwarfPubTypesSection());
2379 EmitLabel("section_pubtypes", 0);
2380 Asm->OutStreamer.SwitchSection(TLOF.getDwarfStrSection());
2381 EmitLabel("section_str", 0);
2382 Asm->OutStreamer.SwitchSection(TLOF.getDwarfRangesSection());
2383 EmitLabel("section_ranges", 0);
2384
2385 Asm->OutStreamer.SwitchSection(TLOF.getTextSection());
2386 EmitLabel("text_begin", 0);
2387 Asm->OutStreamer.SwitchSection(TLOF.getDataSection());
2388 EmitLabel("data_begin", 0);
2389}
2390
2391/// emitDIE - Recusively Emits a debug information entry.
2392///
2393void DwarfDebug::emitDIE(DIE *Die) {
2394 // Get the abbreviation for this DIE.
2395 unsigned AbbrevNumber = Die->getAbbrevNumber();
2396 const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2397
2398 Asm->O << '\n';
2399
2400 // Emit the code (index) for the abbreviation.
2401 if (Asm->VerboseAsm)
2402 Asm->OutStreamer.AddComment("Abbrev [" + Twine(AbbrevNumber) + "] 0x" +
2403 Twine::utohexstr(Die->getOffset()) + ":0x" +
2404 Twine::utohexstr(Die->getSize()) + " " +
2405 dwarf::TagString(Abbrev->getTag()));
2406 EmitULEB128(AbbrevNumber);
2407
2408 SmallVector<DIEValue*, 32> &Values = Die->getValues();
2409 const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
2410
2411 // Emit the DIE attribute values.
2412 for (unsigned i = 0, N = Values.size(); i < N; ++i) {
2413 unsigned Attr = AbbrevData[i].getAttribute();
2414 unsigned Form = AbbrevData[i].getForm();
2415 assert(Form && "Too many attributes for DIE (check abbreviation)");
2416
2417 if (Asm->VerboseAsm)
2418 Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr));
2419
2420 switch (Attr) {
2421 case dwarf::DW_AT_sibling:
2422 Asm->EmitInt32(Die->getSiblingOffset());
2423 break;
2424 case dwarf::DW_AT_abstract_origin: {
2425 DIEEntry *E = cast<DIEEntry>(Values[i]);
2426 DIE *Origin = E->getEntry();
2427 unsigned Addr = Origin->getOffset();
2428 Asm->EmitInt32(Addr);
2429 break;
2430 }
2431 default:
2432 // Emit an attribute using the defined form.
2433 Values[i]->EmitValue(this, Form);
2434 O << "\n"; // REMOVE This once all EmitValue impls emit their own newline.
2435 break;
2436 }
2437 }
2438
2439 // Emit the DIE children if any.
2440 if (Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes) {
2441 const std::vector<DIE *> &Children = Die->getChildren();
2442
2443 for (unsigned j = 0, M = Children.size(); j < M; ++j)
2444 emitDIE(Children[j]);
2445
2446 Asm->EmitInt8(0); EOL("End Of Children Mark");
2447 }
2448}
2449
2450/// emitDebugInfo - Emit the debug info section.
2451///
2452void DwarfDebug::emitDebugInfo() {
2453 // Start debug info section.
2454 Asm->OutStreamer.SwitchSection(
2455 Asm->getObjFileLowering().getDwarfInfoSection());
2456 DIE *Die = ModuleCU->getCUDie();
2457
2458 // Emit the compile units header.
2459 EmitLabel("info_begin", ModuleCU->getID());
2460
2461 // Emit size of content not including length itself
2462 unsigned ContentSize = Die->getSize() +
2463 sizeof(int16_t) + // DWARF version number
2464 sizeof(int32_t) + // Offset Into Abbrev. Section
2465 sizeof(int8_t) + // Pointer Size (in bytes)
2466 sizeof(int32_t); // FIXME - extra pad for gdb bug.
2467
2468 Asm->EmitInt32(ContentSize); EOL("Length of Compilation Unit Info");
2469 Asm->EmitInt16(dwarf::DWARF_VERSION); EOL("DWARF version number");
2470 EmitSectionOffset("abbrev_begin", "section_abbrev", 0, 0, true, false);
2471 EOL("Offset Into Abbrev. Section");
2472 Asm->EmitInt8(TD->getPointerSize()); EOL("Address Size (in bytes)");
2473
2474 emitDIE(Die);
2475 // FIXME - extra padding for gdb bug.
2476 Asm->EmitInt8(0); EOL("Extra Pad For GDB");
2477 Asm->EmitInt8(0); EOL("Extra Pad For GDB");
2478 Asm->EmitInt8(0); EOL("Extra Pad For GDB");
2479 Asm->EmitInt8(0); EOL("Extra Pad For GDB");
2480 EmitLabel("info_end", ModuleCU->getID());
2481 Asm->O << '\n';
2482}
2483
2484/// emitAbbreviations - Emit the abbreviation section.
2485///
2486void DwarfDebug::emitAbbreviations() const {
2487 // Check to see if it is worth the effort.
2488 if (!Abbreviations.empty()) {
2489 // Start the debug abbrev section.
2490 Asm->OutStreamer.SwitchSection(
2491 Asm->getObjFileLowering().getDwarfAbbrevSection());
2492
2493 EmitLabel("abbrev_begin", 0);
2494
2495 // For each abbrevation.
2496 for (unsigned i = 0, N = Abbreviations.size(); i < N; ++i) {
2497 // Get abbreviation data
2498 const DIEAbbrev *Abbrev = Abbreviations[i];
2499
2500 // Emit the abbrevations code (base 1 index.)
2501 EmitULEB128(Abbrev->getNumber(), "Abbreviation Code");
2502
2503 // Emit the abbreviations data.
2504 Abbrev->Emit(this);
2505 Asm->O << '\n';
2506 }
2507
2508 // Mark end of abbreviations.
2509 EmitULEB128(0, "EOM(3)");
2510
2511 EmitLabel("abbrev_end", 0);
2512 Asm->O << '\n';
2513 }
2514}
2515
2516/// emitEndOfLineMatrix - Emit the last address of the section and the end of
2517/// the line matrix.
2518///
2519void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) {
2520 // Define last address of section.
2521 Asm->EmitInt8(0); EOL("Extended Op");
2522 Asm->EmitInt8(TD->getPointerSize() + 1); EOL("Op size");
2523 Asm->EmitInt8(dwarf::DW_LNE_set_address); EOL("DW_LNE_set_address");
2524 EmitReference("section_end", SectionEnd); EOL("Section end label");
2525
2526 // Mark end of matrix.
2527 Asm->EmitInt8(0); EOL("DW_LNE_end_sequence");
2528 Asm->EmitInt8(1);
2529 Asm->EmitInt8(1);
2530}
2531
2532/// emitDebugLines - Emit source line information.
2533///
2534void DwarfDebug::emitDebugLines() {
2535 // If the target is using .loc/.file, the assembler will be emitting the
2536 // .debug_line table automatically.
2537 if (MAI->hasDotLocAndDotFile())
2538 return;
2539
2540 // Minimum line delta, thus ranging from -10..(255-10).
2541 const int MinLineDelta = -(dwarf::DW_LNS_fixed_advance_pc + 1);
2542 // Maximum line delta, thus ranging from -10..(255-10).
2543 const int MaxLineDelta = 255 + MinLineDelta;
2544
2545 // Start the dwarf line section.
2546 Asm->OutStreamer.SwitchSection(
2547 Asm->getObjFileLowering().getDwarfLineSection());
2548
2549 // Construct the section header.
2550 EmitDifference("line_end", 0, "line_begin", 0, true);
2551 EOL("Length of Source Line Info");
2552 EmitLabel("line_begin", 0);
2553
2554 Asm->EmitInt16(dwarf::DWARF_VERSION); EOL("DWARF version number");
2555
2556 EmitDifference("line_prolog_end", 0, "line_prolog_begin", 0, true);
2557 EOL("Prolog Length");
2558 EmitLabel("line_prolog_begin", 0);
2559
2560 Asm->EmitInt8(1); EOL("Minimum Instruction Length");
2561 Asm->EmitInt8(1); EOL("Default is_stmt_start flag");
2562 Asm->EmitInt8(MinLineDelta); EOL("Line Base Value (Special Opcodes)");
2563 Asm->EmitInt8(MaxLineDelta); EOL("Line Range Value (Special Opcodes)");
2564 Asm->EmitInt8(-MinLineDelta); EOL("Special Opcode Base");
2565
2566 // Line number standard opcode encodings argument count
2567 Asm->EmitInt8(0); EOL("DW_LNS_copy arg count");
2568 Asm->EmitInt8(1); EOL("DW_LNS_advance_pc arg count");
2569 Asm->EmitInt8(1); EOL("DW_LNS_advance_line arg count");
2570 Asm->EmitInt8(1); EOL("DW_LNS_set_file arg count");
2571 Asm->EmitInt8(1); EOL("DW_LNS_set_column arg count");
2572 Asm->EmitInt8(0); EOL("DW_LNS_negate_stmt arg count");
2573 Asm->EmitInt8(0); EOL("DW_LNS_set_basic_block arg count");
2574 Asm->EmitInt8(0); EOL("DW_LNS_const_add_pc arg count");
2575 Asm->EmitInt8(1); EOL("DW_LNS_fixed_advance_pc arg count");
2576
2577 // Emit directories.
2578 for (unsigned DI = 1, DE = getNumSourceDirectories()+1; DI != DE; ++DI) {
2579 const std::string &Dir = getSourceDirectoryName(DI);
2580 if (Asm->VerboseAsm) Asm->OutStreamer.AddComment("Directory");
2581 Asm->OutStreamer.EmitBytes(StringRef(Dir.c_str(), Dir.size()+1), 0);
2582 }
2583
2584 Asm->EmitInt8(0); EOL("End of directories");
2585
2586 // Emit files.
2587 for (unsigned SI = 1, SE = getNumSourceIds()+1; SI != SE; ++SI) {
2588 // Remember source id starts at 1.
2589 std::pair<unsigned, unsigned> Id = getSourceDirectoryAndFileIds(SI);
2590 const std::string &FN = getSourceFileName(Id.second);
2591 if (Asm->VerboseAsm) Asm->OutStreamer.AddComment("Source");
2592 Asm->OutStreamer.EmitBytes(StringRef(FN.c_str(), FN.size()+1), 0);
2593
2594 EmitULEB128(Id.first, "Directory #");
2595 EmitULEB128(0, "Mod date");
2596 EmitULEB128(0, "File size");
2597 }
2598
2599 Asm->EmitInt8(0); EOL("End of files");
2600
2601 EmitLabel("line_prolog_end", 0);
2602
2603 // A sequence for each text section.
2604 unsigned SecSrcLinesSize = SectionSourceLines.size();
2605
2606 for (unsigned j = 0; j < SecSrcLinesSize; ++j) {
2607 // Isolate current sections line info.
2608 const std::vector<SrcLineInfo> &LineInfos = SectionSourceLines[j];
2609
2610 /*if (Asm->isVerbose()) {
2611 const MCSection *S = SectionMap[j + 1];
2612 O << '\t' << MAI->getCommentString() << " Section"
2613 << S->getName() << '\n';
2614 }*/
2615 Asm->O << '\n';
2616
2617 // Dwarf assumes we start with first line of first source file.
2618 unsigned Source = 1;
2619 unsigned Line = 1;
2620
2621 // Construct rows of the address, source, line, column matrix.
2622 for (unsigned i = 0, N = LineInfos.size(); i < N; ++i) {
2623 const SrcLineInfo &LineInfo = LineInfos[i];
2624 unsigned LabelID = MMI->MappedLabel(LineInfo.getLabelID());
2625 if (!LabelID) continue;
2626
2627 if (LineInfo.getLine() == 0) continue;
2628
2629 if (!Asm->isVerbose())
2630 Asm->O << '\n';
2631 else {
2632 std::pair<unsigned, unsigned> SourceID =
2633 getSourceDirectoryAndFileIds(LineInfo.getSourceID());
2634 O << '\t' << MAI->getCommentString() << ' '
2635 << getSourceDirectoryName(SourceID.first) << '/'
2636 << getSourceFileName(SourceID.second)
2637 << ':' << utostr_32(LineInfo.getLine()) << '\n';
2638 }
2639
2640 // Define the line address.
2641 Asm->EmitInt8(0); EOL("Extended Op");
2642 Asm->EmitInt8(TD->getPointerSize() + 1); EOL("Op size");
2643 Asm->EmitInt8(dwarf::DW_LNE_set_address); EOL("DW_LNE_set_address");
2644 EmitReference("label", LabelID); EOL("Location label");
2645
2646 // If change of source, then switch to the new source.
2647 if (Source != LineInfo.getSourceID()) {
2648 Source = LineInfo.getSourceID();
2649 Asm->EmitInt8(dwarf::DW_LNS_set_file); EOL("DW_LNS_set_file");
2650 EmitULEB128(Source, "New Source");
2651 }
2652
2653 // If change of line.
2654 if (Line != LineInfo.getLine()) {
2655 // Determine offset.
2656 int Offset = LineInfo.getLine() - Line;
2657 int Delta = Offset - MinLineDelta;
2658
2659 // Update line.
2660 Line = LineInfo.getLine();
2661
2662 // If delta is small enough and in range...
2663 if (Delta >= 0 && Delta < (MaxLineDelta - 1)) {
2664 // ... then use fast opcode.
2665 Asm->EmitInt8(Delta - MinLineDelta); EOL("Line Delta");
2666 } else {
2667 // ... otherwise use long hand.
2668 Asm->EmitInt8(dwarf::DW_LNS_advance_line);
2669 EOL("DW_LNS_advance_line");
2670 EmitSLEB128(Offset, "Line Offset");
2671 Asm->EmitInt8(dwarf::DW_LNS_copy); EOL("DW_LNS_copy");
2672 }
2673 } else {
2674 // Copy the previous row (different address or source)
2675 Asm->EmitInt8(dwarf::DW_LNS_copy); EOL("DW_LNS_copy");
2676 }
2677 }
2678
2679 emitEndOfLineMatrix(j + 1);
2680 }
2681
2682 if (SecSrcLinesSize == 0)
2683 // Because we're emitting a debug_line section, we still need a line
2684 // table. The linker and friends expect it to exist. If there's nothing to
2685 // put into it, emit an empty table.
2686 emitEndOfLineMatrix(1);
2687
2688 EmitLabel("line_end", 0);
2689 Asm->O << '\n';
2690}
2691
2692/// emitCommonDebugFrame - Emit common frame info into a debug frame section.
2693///
2694void DwarfDebug::emitCommonDebugFrame() {
2695 if (!MAI->doesDwarfRequireFrameSection())
2696 return;
2697
2698 int stackGrowth =
2699 Asm->TM.getFrameInfo()->getStackGrowthDirection() ==
2700 TargetFrameInfo::StackGrowsUp ?
2701 TD->getPointerSize() : -TD->getPointerSize();
2702
2703 // Start the dwarf frame section.
2704 Asm->OutStreamer.SwitchSection(
2705 Asm->getObjFileLowering().getDwarfFrameSection());
2706
2707 EmitLabel("debug_frame_common", 0);
2708 EmitDifference("debug_frame_common_end", 0,
2709 "debug_frame_common_begin", 0, true);
2710 EOL("Length of Common Information Entry");
2711
2712 EmitLabel("debug_frame_common_begin", 0);
2713 Asm->EmitInt32((int)dwarf::DW_CIE_ID);
2714 EOL("CIE Identifier Tag");
2715 Asm->EmitInt8(dwarf::DW_CIE_VERSION);
2716 EOL("CIE Version");
2717 Asm->OutStreamer.EmitIntValue(0, 1, /*addrspace*/0); // nul terminator.
2718 EOL("CIE Augmentation");
2719 EmitULEB128(1, "CIE Code Alignment Factor");
2720 EmitSLEB128(stackGrowth, "CIE Data Alignment Factor");
2721 Asm->EmitInt8(RI->getDwarfRegNum(RI->getRARegister(), false));
2722 EOL("CIE RA Column");
2723
2724 std::vector<MachineMove> Moves;
2725 RI->getInitialFrameState(Moves);
2726
2727 EmitFrameMoves(NULL, 0, Moves, false);
2728
2729 Asm->EmitAlignment(2, 0, 0, false);
2730 EmitLabel("debug_frame_common_end", 0);
2731 Asm->O << '\n';
2732}
2733
2734/// emitFunctionDebugFrame - Emit per function frame info into a debug frame
2735/// section.
2736void
2737DwarfDebug::emitFunctionDebugFrame(const FunctionDebugFrameInfo&DebugFrameInfo){
2738 if (!MAI->doesDwarfRequireFrameSection())
2739 return;
2740
2741 // Start the dwarf frame section.
2742 Asm->OutStreamer.SwitchSection(
2743 Asm->getObjFileLowering().getDwarfFrameSection());
2744
2745 EmitDifference("debug_frame_end", DebugFrameInfo.Number,
2746 "debug_frame_begin", DebugFrameInfo.Number, true);
2747 EOL("Length of Frame Information Entry");
2748
2749 EmitLabel("debug_frame_begin", DebugFrameInfo.Number);
2750
2751 EmitSectionOffset("debug_frame_common", "section_debug_frame",
2752 0, 0, true, false);
2753 EOL("FDE CIE offset");
2754
2755 EmitReference("func_begin", DebugFrameInfo.Number);
2756 EOL("FDE initial location");
2757 EmitDifference("func_end", DebugFrameInfo.Number,
2758 "func_begin", DebugFrameInfo.Number);
2759 EOL("FDE address range");
2760
2761 EmitFrameMoves("func_begin", DebugFrameInfo.Number, DebugFrameInfo.Moves,
2762 false);
2763
2764 Asm->EmitAlignment(2, 0, 0, false);
2765 EmitLabel("debug_frame_end", DebugFrameInfo.Number);
2766 Asm->O << '\n';
2767}
2768
2769/// emitDebugPubNames - Emit visible names into a debug pubnames section.
2770///
2771void DwarfDebug::emitDebugPubNames() {
2772 // Start the dwarf pubnames section.
2773 Asm->OutStreamer.SwitchSection(
2774 Asm->getObjFileLowering().getDwarfPubNamesSection());
2775
2776 EmitDifference("pubnames_end", ModuleCU->getID(),
2777 "pubnames_begin", ModuleCU->getID(), true);
2778 EOL("Length of Public Names Info");
2779
2780 EmitLabel("pubnames_begin", ModuleCU->getID());
2781
2782 Asm->EmitInt16(dwarf::DWARF_VERSION); EOL("DWARF Version");
2783
2784 EmitSectionOffset("info_begin", "section_info",
2785 ModuleCU->getID(), 0, true, false);
2786 EOL("Offset of Compilation Unit Info");
2787
2788 EmitDifference("info_end", ModuleCU->getID(), "info_begin", ModuleCU->getID(),
2789 true);
2790 EOL("Compilation Unit Length");
2791
2792 const StringMap<DIE*> &Globals = ModuleCU->getGlobals();
2793 for (StringMap<DIE*>::const_iterator
2794 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2795 const char *Name = GI->getKeyData();
2796 DIE * Entity = GI->second;
2797
2798 Asm->EmitInt32(Entity->getOffset()); EOL("DIE offset");
2799
2800 if (Asm->VerboseAsm)
2801 Asm->OutStreamer.AddComment("External Name");
2802 Asm->OutStreamer.EmitBytes(StringRef(Name, strlen(Name)+1), 0);
2803 }
2804
2805 Asm->EmitInt32(0); EOL("End Mark");
2806 EmitLabel("pubnames_end", ModuleCU->getID());
2807 Asm->O << '\n';
2808}
2809
2810void DwarfDebug::emitDebugPubTypes() {
2811 // Start the dwarf pubnames section.
2812 Asm->OutStreamer.SwitchSection(
2813 Asm->getObjFileLowering().getDwarfPubTypesSection());
2814 EmitDifference("pubtypes_end", ModuleCU->getID(),
2815 "pubtypes_begin", ModuleCU->getID(), true);
2816 EOL("Length of Public Types Info");
2817
2818 EmitLabel("pubtypes_begin", ModuleCU->getID());
2819
2820 if (Asm->VerboseAsm) Asm->OutStreamer.AddComment("DWARF Version");
2821 Asm->EmitInt16(dwarf::DWARF_VERSION);
2822
2823 EmitSectionOffset("info_begin", "section_info",
2824 ModuleCU->getID(), 0, true, false);
2825 EOL("Offset of Compilation ModuleCU Info");
2826
2827 EmitDifference("info_end", ModuleCU->getID(), "info_begin", ModuleCU->getID(),
2828 true);
2829 EOL("Compilation ModuleCU Length");
2830
2831 const StringMap<DIE*> &Globals = ModuleCU->getGlobalTypes();
2832 for (StringMap<DIE*>::const_iterator
2833 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2834 const char *Name = GI->getKeyData();
2835 DIE * Entity = GI->second;
2836
2837 if (Asm->VerboseAsm) Asm->OutStreamer.AddComment("DIE offset");
2838 Asm->EmitInt32(Entity->getOffset());
2839
2840 if (Asm->VerboseAsm) Asm->OutStreamer.AddComment("External Name");
2841 Asm->OutStreamer.EmitBytes(StringRef(Name, GI->getKeyLength()+1), 0);
2842 }
2843
2844 Asm->EmitInt32(0); EOL("End Mark");
2845 EmitLabel("pubtypes_end", ModuleCU->getID());
2846 Asm->O << '\n';
2847}
2848
2849/// emitDebugStr - Emit visible names into a debug str section.
2850///
2851void DwarfDebug::emitDebugStr() {
2852 // Check to see if it is worth the effort.
2853 if (!StringPool.empty()) {
2854 // Start the dwarf str section.
2855 Asm->OutStreamer.SwitchSection(
2856 Asm->getObjFileLowering().getDwarfStrSection());
2857
2858 // For each of strings in the string pool.
2859 for (unsigned StringID = 1, N = StringPool.size();
2860 StringID <= N; ++StringID) {
2861 // Emit a label for reference from debug information entries.
2862 EmitLabel("string", StringID);
2863
2864 // Emit the string itself.
2865 const std::string &String = StringPool[StringID];
2866 Asm->OutStreamer.EmitBytes(StringRef(String.c_str(), String.size()+1), 0);
2867 }
2868
2869 Asm->O << '\n';
2870 }
2871}
2872
2873/// emitDebugLoc - Emit visible names into a debug loc section.
2874///
2875void DwarfDebug::emitDebugLoc() {
2876 // Start the dwarf loc section.
2877 Asm->OutStreamer.SwitchSection(
2878 Asm->getObjFileLowering().getDwarfLocSection());
2879}
2880
2881/// EmitDebugARanges - Emit visible names into a debug aranges section.
2882///
2883void DwarfDebug::EmitDebugARanges() {
2884 // Start the dwarf aranges section.
2885 Asm->OutStreamer.SwitchSection(
2886 Asm->getObjFileLowering().getDwarfARangesSection());
2887
2888 // FIXME - Mock up
2889#if 0
2890 CompileUnit *Unit = GetBaseCompileUnit();
2891
2892 // Don't include size of length
2893 Asm->EmitInt32(0x1c); EOL("Length of Address Ranges Info");
2894
2895 Asm->EmitInt16(dwarf::DWARF_VERSION); EOL("Dwarf Version");
2896
2897 EmitReference("info_begin", Unit->getID());
2898 EOL("Offset of Compilation Unit Info");
2899
2900 Asm->EmitInt8(TD->getPointerSize()); EOL("Size of Address");
2901
2902 Asm->EmitInt8(0); EOL("Size of Segment Descriptor");
2903
2904 Asm->EmitInt16(0); EOL("Pad (1)");
2905 Asm->EmitInt16(0); EOL("Pad (2)");
2906
2907 // Range 1
2908 EmitReference("text_begin", 0); EOL("Address");
2909 EmitDifference("text_end", 0, "text_begin", 0, true); EOL("Length");
2910
2911 Asm->EmitInt32(0); EOL("EOM (1)");
2912 Asm->EmitInt32(0); EOL("EOM (2)");
2913#endif
2914}
2915
2916/// emitDebugRanges - Emit visible names into a debug ranges section.
2917///
2918void DwarfDebug::emitDebugRanges() {
2919 // Start the dwarf ranges section.
2920 Asm->OutStreamer.SwitchSection(
2921 Asm->getObjFileLowering().getDwarfRangesSection());
2922}
2923
2924/// emitDebugMacInfo - Emit visible names into a debug macinfo section.
2925///
2926void DwarfDebug::emitDebugMacInfo() {
2927 if (const MCSection *LineInfo =
2928 Asm->getObjFileLowering().getDwarfMacroInfoSection()) {
2929 // Start the dwarf macinfo section.
2930 Asm->OutStreamer.SwitchSection(LineInfo);
2931 }
2932}
2933
2934/// emitDebugInlineInfo - Emit inline info using following format.
2935/// Section Header:
2936/// 1. length of section
2937/// 2. Dwarf version number
2938/// 3. address size.
2939///
2940/// Entries (one "entry" for each function that was inlined):
2941///
2942/// 1. offset into __debug_str section for MIPS linkage name, if exists;
2943/// otherwise offset into __debug_str for regular function name.
2944/// 2. offset into __debug_str section for regular function name.
2945/// 3. an unsigned LEB128 number indicating the number of distinct inlining
2946/// instances for the function.
2947///
2948/// The rest of the entry consists of a {die_offset, low_pc} pair for each
2949/// inlined instance; the die_offset points to the inlined_subroutine die in the
2950/// __debug_info section, and the low_pc is the starting address for the
2951/// inlining instance.
2952void DwarfDebug::emitDebugInlineInfo() {
2953 if (!MAI->doesDwarfUsesInlineInfoSection())
2954 return;
2955
2956 if (!ModuleCU)
2957 return;
2958
2959 Asm->OutStreamer.SwitchSection(
2960 Asm->getObjFileLowering().getDwarfDebugInlineSection());
2961
2962 EmitDifference("debug_inlined_end", 1,
2963 "debug_inlined_begin", 1, true);
2964 EOL("Length of Debug Inlined Information Entry");
2965
2966 EmitLabel("debug_inlined_begin", 1);
2967
2968 Asm->EmitInt16(dwarf::DWARF_VERSION); EOL("Dwarf Version");
2969 Asm->EmitInt8(TD->getPointerSize()); EOL("Address Size (in bytes)");
2970
2971 for (SmallVector<MDNode *, 4>::iterator I = InlinedSPNodes.begin(),
2972 E = InlinedSPNodes.end(); I != E; ++I) {
2973
2974 MDNode *Node = *I;
2975 DenseMap<MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator II
2976 = InlineInfo.find(Node);
2977 SmallVector<InlineInfoLabels, 4> &Labels = II->second;
2978 DISubprogram SP(Node);
2979 StringRef LName = SP.getLinkageName();
2980 StringRef Name = SP.getName();
2981
2982 if (LName.empty()) {
2983 Asm->OutStreamer.EmitBytes(Name, 0);
2984 Asm->OutStreamer.EmitIntValue(0, 1, 0); // nul terminator.
2985 } else
2986 EmitSectionOffset("string", "section_str",
2987 StringPool.idFor(getRealLinkageName(LName)), false, true);
2988
2989 EOL("MIPS linkage name");
2990 EmitSectionOffset("string", "section_str",
2991 StringPool.idFor(Name), false, true);
2992 EOL("Function name");
2993 EmitULEB128(Labels.size(), "Inline count");
2994
2995 for (SmallVector<InlineInfoLabels, 4>::iterator LI = Labels.begin(),
2996 LE = Labels.end(); LI != LE; ++LI) {
2997 DIE *SP = LI->second;
2998 Asm->EmitInt32(SP->getOffset()); EOL("DIE offset");
2999
3000 if (TD->getPointerSize() == sizeof(int32_t))
3001 O << MAI->getData32bitsDirective();
3002 else
3003 O << MAI->getData64bitsDirective();
3004
3005 PrintLabelName("label", LI->first); EOL("low_pc");
3006 }
3007 }
3008
3009 EmitLabel("debug_inlined_end", 1);
3010 Asm->O << '\n';
3011}