Appropriately truncate debug info range in dwarf output.
[oota-llvm.git] / lib / CodeGen / AsmPrinter / DwarfDebug.cpp
1 //===-- 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
14 #define DEBUG_TYPE "dwarfdebug"
15 #include "DwarfDebug.h"
16 #include "DIE.h"
17 #include "llvm/Constants.h"
18 #include "llvm/Module.h"
19 #include "llvm/CodeGen/MachineFunction.h"
20 #include "llvm/CodeGen/MachineModuleInfo.h"
21 #include "llvm/MC/MCAsmInfo.h"
22 #include "llvm/MC/MCSection.h"
23 #include "llvm/MC/MCStreamer.h"
24 #include "llvm/MC/MCSymbol.h"
25 #include "llvm/Target/Mangler.h"
26 #include "llvm/Target/TargetData.h"
27 #include "llvm/Target/TargetFrameInfo.h"
28 #include "llvm/Target/TargetLoweringObjectFile.h"
29 #include "llvm/Target/TargetMachine.h"
30 #include "llvm/Target/TargetRegisterInfo.h"
31 #include "llvm/Target/TargetOptions.h"
32 #include "llvm/Analysis/DebugInfo.h"
33 #include "llvm/ADT/Statistic.h"
34 #include "llvm/ADT/STLExtras.h"
35 #include "llvm/ADT/StringExtras.h"
36 #include "llvm/Support/CommandLine.h"
37 #include "llvm/Support/Debug.h"
38 #include "llvm/Support/ErrorHandling.h"
39 #include "llvm/Support/ValueHandle.h"
40 #include "llvm/Support/FormattedStream.h"
41 #include "llvm/Support/Timer.h"
42 #include "llvm/Support/Path.h"
43 using namespace llvm;
44
45 static cl::opt<bool> PrintDbgScope("print-dbgscope", cl::Hidden,
46      cl::desc("Print DbgScope information for each machine instruction"));
47
48 static cl::opt<bool> DisableDebugInfoPrinting("disable-debug-info-print",
49                                               cl::Hidden,
50      cl::desc("Disable debug info printing"));
51
52 static cl::opt<bool> UnknownLocations("use-unknown-locations", cl::Hidden,
53      cl::desc("Make an absense of debug location information explicit."),
54      cl::init(false));
55
56 #ifndef NDEBUG
57 STATISTIC(BlocksWithoutLineNo, "Number of blocks without any line number");
58 #endif
59
60 namespace {
61   const char *DWARFGroupName = "DWARF Emission";
62   const char *DbgTimerName = "DWARF Debug Writer";
63 } // end anonymous namespace
64
65 //===----------------------------------------------------------------------===//
66
67 /// Configuration values for initial hash set sizes (log2).
68 ///
69 static const unsigned InitAbbreviationsSetSize = 9; // log2(512)
70
71 namespace llvm {
72
73 //===----------------------------------------------------------------------===//
74 /// CompileUnit - This dwarf writer support class manages information associate
75 /// with a source file.
76 class CompileUnit {
77   /// ID - File identifier for source.
78   ///
79   unsigned ID;
80
81   /// Die - Compile unit debug information entry.
82   ///
83   const OwningPtr<DIE> CUDie;
84
85   /// IndexTyDie - An anonymous type for index type.  Owned by CUDie.
86   DIE *IndexTyDie;
87
88   /// MDNodeToDieMap - Tracks the mapping of unit level debug informaton
89   /// variables to debug information entries.
90   DenseMap<const MDNode *, DIE *> MDNodeToDieMap;
91
92   /// MDNodeToDIEEntryMap - Tracks the mapping of unit level debug informaton
93   /// descriptors to debug information entries using a DIEEntry proxy.
94   DenseMap<const MDNode *, DIEEntry *> MDNodeToDIEEntryMap;
95
96   /// Globals - A map of globally visible named entities for this unit.
97   ///
98   StringMap<DIE*> Globals;
99
100   /// GlobalTypes - A map of globally visible types for this unit.
101   ///
102   StringMap<DIE*> GlobalTypes;
103
104 public:
105   CompileUnit(unsigned I, DIE *D)
106     : ID(I), CUDie(D), IndexTyDie(0) {}
107
108   // Accessors.
109   unsigned getID()                  const { return ID; }
110   DIE* getCUDie()                   const { return CUDie.get(); }
111   const StringMap<DIE*> &getGlobals()     const { return Globals; }
112   const StringMap<DIE*> &getGlobalTypes() const { return GlobalTypes; }
113
114   /// hasContent - Return true if this compile unit has something to write out.
115   ///
116   bool hasContent() const { return !CUDie->getChildren().empty(); }
117
118   /// addGlobal - Add a new global entity to the compile unit.
119   ///
120   void addGlobal(StringRef Name, DIE *Die) { Globals[Name] = Die; }
121
122   /// addGlobalType - Add a new global type to the compile unit.
123   ///
124   void addGlobalType(StringRef Name, DIE *Die) {
125     GlobalTypes[Name] = Die;
126   }
127
128   /// getDIE - Returns the debug information entry map slot for the
129   /// specified debug variable.
130   DIE *getDIE(const MDNode *N) { return MDNodeToDieMap.lookup(N); }
131
132   /// insertDIE - Insert DIE into the map.
133   void insertDIE(const MDNode *N, DIE *D) {
134     MDNodeToDieMap.insert(std::make_pair(N, D));
135   }
136
137   /// getDIEEntry - Returns the debug information entry for the speciefied
138   /// debug variable.
139   DIEEntry *getDIEEntry(const MDNode *N) {
140     DenseMap<const MDNode *, DIEEntry *>::iterator I =
141       MDNodeToDIEEntryMap.find(N);
142     if (I == MDNodeToDIEEntryMap.end())
143       return NULL;
144     return I->second;
145   }
146
147   /// insertDIEEntry - Insert debug information entry into the map.
148   void insertDIEEntry(const MDNode *N, DIEEntry *E) {
149     MDNodeToDIEEntryMap.insert(std::make_pair(N, E));
150   }
151
152   /// addDie - Adds or interns the DIE to the compile unit.
153   ///
154   void addDie(DIE *Buffer) {
155     this->CUDie->addChild(Buffer);
156   }
157
158   // getIndexTyDie - Get an anonymous type for index type.
159   DIE *getIndexTyDie() {
160     return IndexTyDie;
161   }
162
163   // setIndexTyDie - Set D as anonymous type for index which can be reused
164   // later.
165   void setIndexTyDie(DIE *D) {
166     IndexTyDie = D;
167   }
168
169 };
170
171 //===----------------------------------------------------------------------===//
172 /// DbgVariable - This class is used to track local variable information.
173 ///
174 class DbgVariable {
175   DIVariable Var;                    // Variable Descriptor.
176   DIE *TheDIE;                       // Variable DIE.
177   unsigned DotDebugLocOffset;        // Offset in DotDebugLocEntries.
178 public:
179   // AbsVar may be NULL.
180   DbgVariable(DIVariable V) : Var(V), TheDIE(0), DotDebugLocOffset(~0U) {}
181
182   // Accessors.
183   DIVariable getVariable()           const { return Var; }
184   void setDIE(DIE *D)                      { TheDIE = D; }
185   DIE *getDIE()                      const { return TheDIE; }
186   void setDotDebugLocOffset(unsigned O)    { DotDebugLocOffset = O; }
187   unsigned getDotDebugLocOffset()    const { return DotDebugLocOffset; }
188   StringRef getName()                const { return Var.getName(); }
189   unsigned getTag()                  const { return Var.getTag(); }
190   bool variableHasComplexAddress()   const {
191     assert(Var.Verify() && "Invalid complex DbgVariable!");
192     return Var.hasComplexAddress();
193   }
194   bool isBlockByrefVariable()        const {
195     assert(Var.Verify() && "Invalid complex DbgVariable!");
196     return Var.isBlockByrefVariable();
197   }
198   unsigned getNumAddrElements()      const { 
199     assert(Var.Verify() && "Invalid complex DbgVariable!");
200     return Var.getNumAddrElements();
201   }
202   uint64_t getAddrElement(unsigned i) const {
203     return Var.getAddrElement(i);
204   }
205   DIType getType()               const {
206     DIType Ty = Var.getType();
207     // FIXME: isBlockByrefVariable should be reformulated in terms of complex
208     // addresses instead.
209     if (Var.isBlockByrefVariable()) {
210       /* Byref variables, in Blocks, are declared by the programmer as
211          "SomeType VarName;", but the compiler creates a
212          __Block_byref_x_VarName struct, and gives the variable VarName
213          either the struct, or a pointer to the struct, as its type.  This
214          is necessary for various behind-the-scenes things the compiler
215          needs to do with by-reference variables in blocks.
216          
217          However, as far as the original *programmer* is concerned, the
218          variable should still have type 'SomeType', as originally declared.
219          
220          The following function dives into the __Block_byref_x_VarName
221          struct to find the original type of the variable.  This will be
222          passed back to the code generating the type for the Debug
223          Information Entry for the variable 'VarName'.  'VarName' will then
224          have the original type 'SomeType' in its debug information.
225          
226          The original type 'SomeType' will be the type of the field named
227          'VarName' inside the __Block_byref_x_VarName struct.
228          
229          NOTE: In order for this to not completely fail on the debugger
230          side, the Debug Information Entry for the variable VarName needs to
231          have a DW_AT_location that tells the debugger how to unwind through
232          the pointers and __Block_byref_x_VarName struct to find the actual
233          value of the variable.  The function addBlockByrefType does this.  */
234       DIType subType = Ty;
235       unsigned tag = Ty.getTag();
236       
237       if (tag == dwarf::DW_TAG_pointer_type) {
238         DIDerivedType DTy = DIDerivedType(Ty);
239         subType = DTy.getTypeDerivedFrom();
240       }
241       
242       DICompositeType blockStruct = DICompositeType(subType);
243       DIArray Elements = blockStruct.getTypeArray();
244       
245       for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
246         DIDescriptor Element = Elements.getElement(i);
247         DIDerivedType DT = DIDerivedType(Element);
248         if (getName() == DT.getName())
249           return (DT.getTypeDerivedFrom());
250       }
251       return Ty;
252     }
253     return Ty;
254   }
255 };
256
257 //===----------------------------------------------------------------------===//
258 /// DbgRange - This is used to track range of instructions with identical
259 /// debug info scope.
260 ///
261 typedef std::pair<const MachineInstr *, const MachineInstr *> DbgRange;
262
263 //===----------------------------------------------------------------------===//
264 /// DbgScope - This class is used to track scope information.
265 ///
266 class DbgScope {
267   DbgScope *Parent;                   // Parent to this scope.
268   DIDescriptor Desc;                  // Debug info descriptor for scope.
269   // Location at which this scope is inlined.
270   AssertingVH<const MDNode> InlinedAtLocation;
271   bool AbstractScope;                 // Abstract Scope
272   const MachineInstr *LastInsn;       // Last instruction of this scope.
273   const MachineInstr *FirstInsn;      // First instruction of this scope.
274   unsigned DFSIn, DFSOut;
275   // Scopes defined in scope.  Contents not owned.
276   SmallVector<DbgScope *, 4> Scopes;
277   // Variables declared in scope.  Contents owned.
278   SmallVector<DbgVariable *, 8> Variables;
279   SmallVector<DbgRange, 4> Ranges;
280   // Private state for dump()
281   mutable unsigned IndentLevel;
282 public:
283   DbgScope(DbgScope *P, DIDescriptor D, const MDNode *I = 0)
284     : Parent(P), Desc(D), InlinedAtLocation(I), AbstractScope(false),
285       LastInsn(0), FirstInsn(0),
286       DFSIn(0), DFSOut(0), IndentLevel(0) {}
287   virtual ~DbgScope();
288
289   // Accessors.
290   DbgScope *getParent()          const { return Parent; }
291   void setParent(DbgScope *P)          { Parent = P; }
292   DIDescriptor getDesc()         const { return Desc; }
293   const MDNode *getInlinedAt()         const { return InlinedAtLocation; }
294   const MDNode *getScopeNode()         const { return Desc; }
295   const SmallVector<DbgScope *, 4> &getScopes() { return Scopes; }
296   const SmallVector<DbgVariable *, 8> &getDbgVariables() { return Variables; }
297   const SmallVector<DbgRange, 4> &getRanges() { return Ranges; }
298
299   /// openInsnRange - This scope covers instruction range starting from MI.
300   void openInsnRange(const MachineInstr *MI) {
301     if (!FirstInsn)
302       FirstInsn = MI;
303
304     if (Parent)
305       Parent->openInsnRange(MI);
306   }
307
308   /// extendInsnRange - Extend the current instruction range covered by
309   /// this scope.
310   void extendInsnRange(const MachineInstr *MI) {
311     assert (FirstInsn && "MI Range is not open!");
312     LastInsn = MI;
313     if (Parent)
314       Parent->extendInsnRange(MI);
315   }
316
317   /// closeInsnRange - Create a range based on FirstInsn and LastInsn collected
318   /// until now. This is used when a new scope is encountered while walking
319   /// machine instructions.
320   void closeInsnRange(DbgScope *NewScope = NULL) {
321     assert (LastInsn && "Last insn missing!");
322     Ranges.push_back(DbgRange(FirstInsn, LastInsn));
323     FirstInsn = NULL;
324     LastInsn = NULL;
325     // If Parent dominates NewScope then do not close Parent's instruction
326     // range.
327     if (Parent && (!NewScope || !Parent->dominates(NewScope)))
328       Parent->closeInsnRange(NewScope);
329   }
330
331   void setAbstractScope() { AbstractScope = true; }
332   bool isAbstractScope() const { return AbstractScope; }
333
334   // Depth First Search support to walk and mainpluate DbgScope hierarchy.
335   unsigned getDFSOut() const { return DFSOut; }
336   void setDFSOut(unsigned O) { DFSOut = O; }
337   unsigned getDFSIn() const  { return DFSIn; }
338   void setDFSIn(unsigned I)  { DFSIn = I; }
339   bool dominates(const DbgScope *S) {
340     if (S == this)
341       return true;
342     if (DFSIn < S->getDFSIn() && DFSOut > S->getDFSOut())
343       return true;
344     return false;
345   }
346
347   /// addScope - Add a scope to the scope.
348   ///
349   void addScope(DbgScope *S) { Scopes.push_back(S); }
350
351   /// addVariable - Add a variable to the scope.
352   ///
353   void addVariable(DbgVariable *V) { Variables.push_back(V); }
354
355 #ifndef NDEBUG
356   void dump() const;
357 #endif
358 };
359
360 } // end llvm namespace
361
362 #ifndef NDEBUG
363 void DbgScope::dump() const {
364   raw_ostream &err = dbgs();
365   err.indent(IndentLevel);
366   const MDNode *N = Desc;
367   N->dump();
368   if (AbstractScope)
369     err << "Abstract Scope\n";
370
371   IndentLevel += 2;
372   if (!Scopes.empty())
373     err << "Children ...\n";
374   for (unsigned i = 0, e = Scopes.size(); i != e; ++i)
375     if (Scopes[i] != this)
376       Scopes[i]->dump();
377
378   IndentLevel -= 2;
379 }
380 #endif
381
382 DbgScope::~DbgScope() {
383   for (unsigned j = 0, M = Variables.size(); j < M; ++j)
384     delete Variables[j];
385 }
386
387 DwarfDebug::DwarfDebug(AsmPrinter *A, Module *M)
388   : Asm(A), MMI(Asm->MMI), FirstCU(0),
389     AbbreviationsSet(InitAbbreviationsSetSize),
390     CurrentFnDbgScope(0), PrevLabel(NULL) {
391   NextStringPoolNumber = 0;
392
393   DwarfFrameSectionSym = DwarfInfoSectionSym = DwarfAbbrevSectionSym = 0;
394   DwarfStrSectionSym = TextSectionSym = 0;
395   DwarfDebugRangeSectionSym = DwarfDebugLocSectionSym = 0;
396   FunctionBeginSym = FunctionEndSym = 0;
397   DIEIntegerOne = new (DIEValueAllocator) DIEInteger(1);
398   {
399     NamedRegionTimer T(DbgTimerName, DWARFGroupName, TimePassesIsEnabled);
400     beginModule(M);
401   }
402 }
403 DwarfDebug::~DwarfDebug() {
404   for (unsigned j = 0, M = DIEBlocks.size(); j < M; ++j)
405     DIEBlocks[j]->~DIEBlock();
406 }
407
408 MCSymbol *DwarfDebug::getStringPoolEntry(StringRef Str) {
409   std::pair<MCSymbol*, unsigned> &Entry = StringPool[Str];
410   if (Entry.first) return Entry.first;
411
412   Entry.second = NextStringPoolNumber++;
413   return Entry.first = Asm->GetTempSymbol("string", Entry.second);
414 }
415
416
417 /// assignAbbrevNumber - Define a unique number for the abbreviation.
418 ///
419 void DwarfDebug::assignAbbrevNumber(DIEAbbrev &Abbrev) {
420   // Profile the node so that we can make it unique.
421   FoldingSetNodeID ID;
422   Abbrev.Profile(ID);
423
424   // Check the set for priors.
425   DIEAbbrev *InSet = AbbreviationsSet.GetOrInsertNode(&Abbrev);
426
427   // If it's newly added.
428   if (InSet == &Abbrev) {
429     // Add to abbreviation list.
430     Abbreviations.push_back(&Abbrev);
431
432     // Assign the vector position + 1 as its number.
433     Abbrev.setNumber(Abbreviations.size());
434   } else {
435     // Assign existing abbreviation number.
436     Abbrev.setNumber(InSet->getNumber());
437   }
438 }
439
440 /// createDIEEntry - Creates a new DIEEntry to be a proxy for a debug
441 /// information entry.
442 DIEEntry *DwarfDebug::createDIEEntry(DIE *Entry) {
443   DIEEntry *Value = new (DIEValueAllocator) DIEEntry(Entry);
444   return Value;
445 }
446
447 /// addUInt - Add an unsigned integer attribute data and value.
448 ///
449 void DwarfDebug::addUInt(DIE *Die, unsigned Attribute,
450                          unsigned Form, uint64_t Integer) {
451   if (!Form) Form = DIEInteger::BestForm(false, Integer);
452   DIEValue *Value = Integer == 1 ?
453     DIEIntegerOne : new (DIEValueAllocator) DIEInteger(Integer);
454   Die->addValue(Attribute, Form, Value);
455 }
456
457 /// addSInt - Add an signed integer attribute data and value.
458 ///
459 void DwarfDebug::addSInt(DIE *Die, unsigned Attribute,
460                          unsigned Form, int64_t Integer) {
461   if (!Form) Form = DIEInteger::BestForm(true, Integer);
462   DIEValue *Value = new (DIEValueAllocator) DIEInteger(Integer);
463   Die->addValue(Attribute, Form, Value);
464 }
465
466 /// addString - Add a string attribute data and value. DIEString only
467 /// keeps string reference.
468 void DwarfDebug::addString(DIE *Die, unsigned Attribute, unsigned Form,
469                            StringRef String) {
470   DIEValue *Value = new (DIEValueAllocator) DIEString(String);
471   Die->addValue(Attribute, Form, Value);
472 }
473
474 /// addLabel - Add a Dwarf label attribute data and value.
475 ///
476 void DwarfDebug::addLabel(DIE *Die, unsigned Attribute, unsigned Form,
477                           const MCSymbol *Label) {
478   DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
479   Die->addValue(Attribute, Form, Value);
480 }
481
482 /// addDelta - Add a label delta attribute data and value.
483 ///
484 void DwarfDebug::addDelta(DIE *Die, unsigned Attribute, unsigned Form,
485                           const MCSymbol *Hi, const MCSymbol *Lo) {
486   DIEValue *Value = new (DIEValueAllocator) DIEDelta(Hi, Lo);
487   Die->addValue(Attribute, Form, Value);
488 }
489
490 /// addDIEEntry - Add a DIE attribute data and value.
491 ///
492 void DwarfDebug::addDIEEntry(DIE *Die, unsigned Attribute, unsigned Form,
493                              DIE *Entry) {
494   Die->addValue(Attribute, Form, createDIEEntry(Entry));
495 }
496
497
498 /// addBlock - Add block data.
499 ///
500 void DwarfDebug::addBlock(DIE *Die, unsigned Attribute, unsigned Form,
501                           DIEBlock *Block) {
502   Block->ComputeSize(Asm);
503   DIEBlocks.push_back(Block); // Memoize so we can call the destructor later on.
504   Die->addValue(Attribute, Block->BestForm(), Block);
505 }
506
507 /// addSourceLine - Add location information to specified debug information
508 /// entry.
509 void DwarfDebug::addSourceLine(DIE *Die, DIVariable V) {
510   // Verify variable.
511   if (!V.Verify())
512     return;
513
514   unsigned Line = V.getLineNumber();
515   if (Line == 0)
516     return;
517   unsigned FileID = GetOrCreateSourceID(V.getContext().getFilename());
518   assert(FileID && "Invalid file id");
519   addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
520   addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
521 }
522
523 /// addSourceLine - Add location information to specified debug information
524 /// entry.
525 void DwarfDebug::addSourceLine(DIE *Die, DIGlobalVariable G) {
526   // Verify global variable.
527   if (!G.Verify())
528     return;
529
530   unsigned Line = G.getLineNumber();
531   if (Line == 0)
532     return;
533   unsigned FileID = GetOrCreateSourceID(G.getContext().getFilename());
534   assert(FileID && "Invalid file id");
535   addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
536   addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
537 }
538
539 /// addSourceLine - Add location information to specified debug information
540 /// entry.
541 void DwarfDebug::addSourceLine(DIE *Die, DISubprogram SP) {
542   // Verify subprogram.
543   if (!SP.Verify())
544     return;
545   // If the line number is 0, don't add it.
546   if (SP.getLineNumber() == 0)
547     return;
548
549   unsigned Line = SP.getLineNumber();
550   if (!SP.getContext().Verify())
551     return;
552   unsigned FileID = GetOrCreateSourceID(SP.getFilename());
553   assert(FileID && "Invalid file id");
554   addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
555   addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
556 }
557
558 /// addSourceLine - Add location information to specified debug information
559 /// entry.
560 void DwarfDebug::addSourceLine(DIE *Die, DIType Ty) {
561   // Verify type.
562   if (!Ty.Verify())
563     return;
564
565   unsigned Line = Ty.getLineNumber();
566   if (Line == 0 || !Ty.getContext().Verify())
567     return;
568   unsigned FileID = GetOrCreateSourceID(Ty.getFilename());
569   assert(FileID && "Invalid file id");
570   addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
571   addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
572 }
573
574 /// addSourceLine - Add location information to specified debug information
575 /// entry.
576 void DwarfDebug::addSourceLine(DIE *Die, DINameSpace NS) {
577   // Verify namespace.
578   if (!NS.Verify())
579     return;
580
581   unsigned Line = NS.getLineNumber();
582   if (Line == 0)
583     return;
584   StringRef FN = NS.getFilename();
585
586   unsigned FileID = GetOrCreateSourceID(FN);
587   assert(FileID && "Invalid file id");
588   addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
589   addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
590 }
591
592 /// addVariableAddress - Add DW_AT_location attribute for a DbgVariable based
593 /// on provided frame index.
594 void DwarfDebug::addVariableAddress(DbgVariable *&DV, DIE *Die, int64_t FI) {
595   MachineLocation Location;
596   unsigned FrameReg;
597   const TargetFrameInfo *TFI = Asm->TM.getFrameInfo();
598   int Offset = TFI->getFrameIndexReference(*Asm->MF, FI, FrameReg);
599   Location.set(FrameReg, Offset);
600
601   if (DV->variableHasComplexAddress())
602     addComplexAddress(DV, Die, dwarf::DW_AT_location, Location);
603   else if (DV->isBlockByrefVariable())
604     addBlockByrefAddress(DV, Die, dwarf::DW_AT_location, Location);
605   else
606     addAddress(Die, dwarf::DW_AT_location, Location);
607 }
608
609 /// addComplexAddress - Start with the address based on the location provided,
610 /// and generate the DWARF information necessary to find the actual variable
611 /// given the extra address information encoded in the DIVariable, starting from
612 /// the starting location.  Add the DWARF information to the die.
613 ///
614 void DwarfDebug::addComplexAddress(DbgVariable *&DV, DIE *Die,
615                                    unsigned Attribute,
616                                    const MachineLocation &Location) {
617   DIType Ty = DV->getType();
618
619   // Decode the original location, and use that as the start of the byref
620   // variable's location.
621   const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
622   unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
623   DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
624
625   if (Location.isReg()) {
626     if (Reg < 32) {
627       addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
628     } else {
629       Reg = Reg - dwarf::DW_OP_reg0;
630       addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
631       addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
632     }
633   } else {
634     if (Reg < 32)
635       addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
636     else {
637       addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
638       addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
639     }
640
641     addUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
642   }
643
644   for (unsigned i = 0, N = DV->getNumAddrElements(); i < N; ++i) {
645     uint64_t Element = DV->getAddrElement(i);
646
647     if (Element == DIFactory::OpPlus) {
648       addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
649       addUInt(Block, 0, dwarf::DW_FORM_udata, DV->getAddrElement(++i));
650     } else if (Element == DIFactory::OpDeref) {
651       addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
652     } else llvm_unreachable("unknown DIFactory Opcode");
653   }
654
655   // Now attach the location information to the DIE.
656   addBlock(Die, Attribute, 0, Block);
657 }
658
659 /* Byref variables, in Blocks, are declared by the programmer as "SomeType
660    VarName;", but the compiler creates a __Block_byref_x_VarName struct, and
661    gives the variable VarName either the struct, or a pointer to the struct, as
662    its type.  This is necessary for various behind-the-scenes things the
663    compiler needs to do with by-reference variables in Blocks.
664
665    However, as far as the original *programmer* is concerned, the variable
666    should still have type 'SomeType', as originally declared.
667
668    The function getBlockByrefType dives into the __Block_byref_x_VarName
669    struct to find the original type of the variable, which is then assigned to
670    the variable's Debug Information Entry as its real type.  So far, so good.
671    However now the debugger will expect the variable VarName to have the type
672    SomeType.  So we need the location attribute for the variable to be an
673    expression that explains to the debugger how to navigate through the
674    pointers and struct to find the actual variable of type SomeType.
675
676    The following function does just that.  We start by getting
677    the "normal" location for the variable. This will be the location
678    of either the struct __Block_byref_x_VarName or the pointer to the
679    struct __Block_byref_x_VarName.
680
681    The struct will look something like:
682
683    struct __Block_byref_x_VarName {
684      ... <various fields>
685      struct __Block_byref_x_VarName *forwarding;
686      ... <various other fields>
687      SomeType VarName;
688      ... <maybe more fields>
689    };
690
691    If we are given the struct directly (as our starting point) we
692    need to tell the debugger to:
693
694    1).  Add the offset of the forwarding field.
695
696    2).  Follow that pointer to get the real __Block_byref_x_VarName
697    struct to use (the real one may have been copied onto the heap).
698
699    3).  Add the offset for the field VarName, to find the actual variable.
700
701    If we started with a pointer to the struct, then we need to
702    dereference that pointer first, before the other steps.
703    Translating this into DWARF ops, we will need to append the following
704    to the current location description for the variable:
705
706    DW_OP_deref                    -- optional, if we start with a pointer
707    DW_OP_plus_uconst <forward_fld_offset>
708    DW_OP_deref
709    DW_OP_plus_uconst <varName_fld_offset>
710
711    That is what this function does.  */
712
713 /// addBlockByrefAddress - Start with the address based on the location
714 /// provided, and generate the DWARF information necessary to find the
715 /// actual Block variable (navigating the Block struct) based on the
716 /// starting location.  Add the DWARF information to the die.  For
717 /// more information, read large comment just above here.
718 ///
719 void DwarfDebug::addBlockByrefAddress(DbgVariable *&DV, DIE *Die,
720                                       unsigned Attribute,
721                                       const MachineLocation &Location) {
722   DIType Ty = DV->getType();
723   DIType TmpTy = Ty;
724   unsigned Tag = Ty.getTag();
725   bool isPointer = false;
726
727   StringRef varName = DV->getName();
728
729   if (Tag == dwarf::DW_TAG_pointer_type) {
730     DIDerivedType DTy = DIDerivedType(Ty);
731     TmpTy = DTy.getTypeDerivedFrom();
732     isPointer = true;
733   }
734
735   DICompositeType blockStruct = DICompositeType(TmpTy);
736
737   // Find the __forwarding field and the variable field in the __Block_byref
738   // struct.
739   DIArray Fields = blockStruct.getTypeArray();
740   DIDescriptor varField = DIDescriptor();
741   DIDescriptor forwardingField = DIDescriptor();
742
743   for (unsigned i = 0, N = Fields.getNumElements(); i < N; ++i) {
744     DIDescriptor Element = Fields.getElement(i);
745     DIDerivedType DT = DIDerivedType(Element);
746     StringRef fieldName = DT.getName();
747     if (fieldName == "__forwarding")
748       forwardingField = Element;
749     else if (fieldName == varName)
750       varField = Element;
751   }
752
753   // Get the offsets for the forwarding field and the variable field.
754   unsigned forwardingFieldOffset =
755     DIDerivedType(forwardingField).getOffsetInBits() >> 3;
756   unsigned varFieldOffset =
757     DIDerivedType(varField).getOffsetInBits() >> 3;
758
759   // Decode the original location, and use that as the start of the byref
760   // variable's location.
761   const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
762   unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
763   DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
764
765   if (Location.isReg()) {
766     if (Reg < 32)
767       addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
768     else {
769       Reg = Reg - dwarf::DW_OP_reg0;
770       addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
771       addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
772     }
773   } else {
774     if (Reg < 32)
775       addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
776     else {
777       addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
778       addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
779     }
780
781     addUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
782   }
783
784   // If we started with a pointer to the __Block_byref... struct, then
785   // the first thing we need to do is dereference the pointer (DW_OP_deref).
786   if (isPointer)
787     addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
788
789   // Next add the offset for the '__forwarding' field:
790   // DW_OP_plus_uconst ForwardingFieldOffset.  Note there's no point in
791   // adding the offset if it's 0.
792   if (forwardingFieldOffset > 0) {
793     addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
794     addUInt(Block, 0, dwarf::DW_FORM_udata, forwardingFieldOffset);
795   }
796
797   // Now dereference the __forwarding field to get to the real __Block_byref
798   // struct:  DW_OP_deref.
799   addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
800
801   // Now that we've got the real __Block_byref... struct, add the offset
802   // for the variable's field to get to the location of the actual variable:
803   // DW_OP_plus_uconst varFieldOffset.  Again, don't add if it's 0.
804   if (varFieldOffset > 0) {
805     addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
806     addUInt(Block, 0, dwarf::DW_FORM_udata, varFieldOffset);
807   }
808
809   // Now attach the location information to the DIE.
810   addBlock(Die, Attribute, 0, Block);
811 }
812
813 /// addAddress - Add an address attribute to a die based on the location
814 /// provided.
815 void DwarfDebug::addAddress(DIE *Die, unsigned Attribute,
816                             const MachineLocation &Location) {
817   const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
818   unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
819   DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
820
821   if (RI->getFrameRegister(*Asm->MF) == Location.getReg()
822       && Location.getOffset()) {
823     // If variable offset is based in frame register then use fbreg.
824     addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_fbreg);
825     addSInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
826     addBlock(Die, Attribute, 0, Block);
827     return;
828   }
829
830   if (Location.isReg()) {
831     if (Reg < 32) {
832       addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
833     } else {
834       addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
835       addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
836     }
837   } else {
838     if (Reg < 32) {
839       addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
840     } else {
841       addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
842       addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
843     }
844
845     addUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
846   }
847
848   addBlock(Die, Attribute, 0, Block);
849 }
850
851 /// addRegisterAddress - Add register location entry in variable DIE.
852 bool DwarfDebug::addRegisterAddress(DIE *Die, const MachineOperand &MO) {
853   assert (MO.isReg() && "Invalid machine operand!");
854   if (!MO.getReg())
855     return false;
856   MachineLocation Location;
857   Location.set(MO.getReg());
858   addAddress(Die, dwarf::DW_AT_location, Location);
859   return true;
860 }
861
862 /// addConstantValue - Add constant value entry in variable DIE.
863 bool DwarfDebug::addConstantValue(DIE *Die, const MachineOperand &MO) {
864   assert (MO.isImm() && "Invalid machine operand!");
865   DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
866   unsigned Imm = MO.getImm();
867   addUInt(Block, 0, dwarf::DW_FORM_udata, Imm);
868   addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
869   return true;
870 }
871
872 /// addConstantFPValue - Add constant value entry in variable DIE.
873 bool DwarfDebug::addConstantFPValue(DIE *Die, const MachineOperand &MO) {
874   assert (MO.isFPImm() && "Invalid machine operand!");
875   DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
876   APFloat FPImm = MO.getFPImm()->getValueAPF();
877
878   // Get the raw data form of the floating point.
879   const APInt FltVal = FPImm.bitcastToAPInt();
880   const char *FltPtr = (const char*)FltVal.getRawData();
881
882   int NumBytes = FltVal.getBitWidth() / 8; // 8 bits per byte.
883   bool LittleEndian = Asm->getTargetData().isLittleEndian();
884   int Incr = (LittleEndian ? 1 : -1);
885   int Start = (LittleEndian ? 0 : NumBytes - 1);
886   int Stop = (LittleEndian ? NumBytes : -1);
887
888   // Output the constant to DWARF one byte at a time.
889   for (; Start != Stop; Start += Incr)
890     addUInt(Block, 0, dwarf::DW_FORM_data1,
891             (unsigned char)0xFF & FltPtr[Start]);
892
893   addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
894   return true;
895 }
896
897 /// addConstantValue - Add constant value entry in variable DIE.
898 bool DwarfDebug::addConstantValue(DIE *Die, ConstantInt *CI,
899                                   bool Unsigned) {
900   if (CI->getBitWidth() <= 64) {
901     if (Unsigned)
902       addUInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_udata,
903               CI->getZExtValue());
904     else
905       addSInt(Die, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata,
906               CI->getSExtValue());
907     return true;
908   }
909
910   DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
911
912   // Get the raw data form of the large APInt.
913   const APInt Val = CI->getValue();
914   const char *Ptr = (const char*)Val.getRawData();
915
916   int NumBytes = Val.getBitWidth() / 8; // 8 bits per byte.
917   bool LittleEndian = Asm->getTargetData().isLittleEndian();
918   int Incr = (LittleEndian ? 1 : -1);
919   int Start = (LittleEndian ? 0 : NumBytes - 1);
920   int Stop = (LittleEndian ? NumBytes : -1);
921
922   // Output the constant to DWARF one byte at a time.
923   for (; Start != Stop; Start += Incr)
924     addUInt(Block, 0, dwarf::DW_FORM_data1,
925             (unsigned char)0xFF & Ptr[Start]);
926
927   addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
928   return true;
929 }
930
931 /// addToContextOwner - Add Die into the list of its context owner's children.
932 void DwarfDebug::addToContextOwner(DIE *Die, DIDescriptor Context) {
933   if (Context.isType()) {
934     DIE *ContextDIE = getOrCreateTypeDIE(DIType(Context));
935     ContextDIE->addChild(Die);
936   } else if (Context.isNameSpace()) {
937     DIE *ContextDIE = getOrCreateNameSpace(DINameSpace(Context));
938     ContextDIE->addChild(Die);
939   } else if (Context.isSubprogram()) {
940     DIE *ContextDIE = createSubprogramDIE(DISubprogram(Context));
941     ContextDIE->addChild(Die);
942   } else if (DIE *ContextDIE = getCompileUnit(Context)->getDIE(Context))
943     ContextDIE->addChild(Die);
944   else
945     getCompileUnit(Context)->addDie(Die);
946 }
947
948 /// getOrCreateTypeDIE - Find existing DIE or create new DIE for the
949 /// given DIType.
950 DIE *DwarfDebug::getOrCreateTypeDIE(DIType Ty) {
951   CompileUnit *TypeCU = getCompileUnit(Ty);
952   DIE *TyDIE = TypeCU->getDIE(Ty);
953   if (TyDIE)
954     return TyDIE;
955
956   // Create new type.
957   TyDIE = new DIE(dwarf::DW_TAG_base_type);
958   TypeCU->insertDIE(Ty, TyDIE);
959   if (Ty.isBasicType())
960     constructTypeDIE(*TyDIE, DIBasicType(Ty));
961   else if (Ty.isCompositeType())
962     constructTypeDIE(*TyDIE, DICompositeType(Ty));
963   else {
964     assert(Ty.isDerivedType() && "Unknown kind of DIType");
965     constructTypeDIE(*TyDIE, DIDerivedType(Ty));
966   }
967
968   addToContextOwner(TyDIE, Ty.getContext());
969   return TyDIE;
970 }
971
972 /// addType - Add a new type attribute to the specified entity.
973 void DwarfDebug::addType(DIE *Entity, DIType Ty) {
974   if (!Ty.Verify())
975     return;
976
977   // Check for pre-existence.
978   CompileUnit *TypeCU = getCompileUnit(Ty);
979   DIEEntry *Entry = TypeCU->getDIEEntry(Ty);
980   // If it exists then use the existing value.
981   if (Entry) {
982     Entity->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, Entry);
983     return;
984   }
985
986   // Construct type.
987   DIE *Buffer = getOrCreateTypeDIE(Ty);
988
989   // Set up proxy.
990   Entry = createDIEEntry(Buffer);
991   TypeCU->insertDIEEntry(Ty, Entry);
992
993   Entity->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, Entry);
994 }
995
996 /// constructTypeDIE - Construct basic type die from DIBasicType.
997 void DwarfDebug::constructTypeDIE(DIE &Buffer, DIBasicType BTy) {
998   // Get core information.
999   StringRef Name = BTy.getName();
1000   Buffer.setTag(dwarf::DW_TAG_base_type);
1001   addUInt(&Buffer, dwarf::DW_AT_encoding,  dwarf::DW_FORM_data1,
1002           BTy.getEncoding());
1003
1004   // Add name if not anonymous or intermediate type.
1005   if (!Name.empty())
1006     addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1007   uint64_t Size = BTy.getSizeInBits() >> 3;
1008   addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
1009 }
1010
1011 /// constructTypeDIE - Construct derived type die from DIDerivedType.
1012 void DwarfDebug::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) {
1013   // Get core information.
1014   StringRef Name = DTy.getName();
1015   uint64_t Size = DTy.getSizeInBits() >> 3;
1016   unsigned Tag = DTy.getTag();
1017
1018   // FIXME - Workaround for templates.
1019   if (Tag == dwarf::DW_TAG_inheritance) Tag = dwarf::DW_TAG_reference_type;
1020
1021   Buffer.setTag(Tag);
1022
1023   // Map to main type, void will not have a type.
1024   DIType FromTy = DTy.getTypeDerivedFrom();
1025   addType(&Buffer, FromTy);
1026
1027   // Add name if not anonymous or intermediate type.
1028   if (!Name.empty())
1029     addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1030
1031   // Add size if non-zero (derived types might be zero-sized.)
1032   if (Size)
1033     addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
1034
1035   // Add source line info if available and TyDesc is not a forward declaration.
1036   if (!DTy.isForwardDecl())
1037     addSourceLine(&Buffer, DTy);
1038 }
1039
1040 /// constructTypeDIE - Construct type DIE from DICompositeType.
1041 void DwarfDebug::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
1042   // Get core information.
1043   StringRef Name = CTy.getName();
1044
1045   uint64_t Size = CTy.getSizeInBits() >> 3;
1046   unsigned Tag = CTy.getTag();
1047   Buffer.setTag(Tag);
1048
1049   switch (Tag) {
1050   case dwarf::DW_TAG_vector_type:
1051   case dwarf::DW_TAG_array_type:
1052     constructArrayTypeDIE(Buffer, &CTy);
1053     break;
1054   case dwarf::DW_TAG_enumeration_type: {
1055     DIArray Elements = CTy.getTypeArray();
1056
1057     // Add enumerators to enumeration type.
1058     for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1059       DIE *ElemDie = NULL;
1060       DIDescriptor Enum(Elements.getElement(i));
1061       if (Enum.isEnumerator()) {
1062         ElemDie = constructEnumTypeDIE(DIEnumerator(Enum));
1063         Buffer.addChild(ElemDie);
1064       }
1065     }
1066   }
1067     break;
1068   case dwarf::DW_TAG_subroutine_type: {
1069     // Add return type.
1070     DIArray Elements = CTy.getTypeArray();
1071     DIDescriptor RTy = Elements.getElement(0);
1072     addType(&Buffer, DIType(RTy));
1073
1074     bool isPrototyped = true;
1075     // Add arguments.
1076     for (unsigned i = 1, N = Elements.getNumElements(); i < N; ++i) {
1077       DIDescriptor Ty = Elements.getElement(i);
1078       if (Ty.isUnspecifiedParameter()) {
1079         DIE *Arg = new DIE(dwarf::DW_TAG_unspecified_parameters);
1080         Buffer.addChild(Arg);
1081         isPrototyped = false;
1082       } else {
1083         DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1084         addType(Arg, DIType(Ty));
1085         Buffer.addChild(Arg);
1086       }
1087     }
1088     // Add prototype flag.
1089     if (isPrototyped)
1090       addUInt(&Buffer, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
1091   }
1092     break;
1093   case dwarf::DW_TAG_structure_type:
1094   case dwarf::DW_TAG_union_type:
1095   case dwarf::DW_TAG_class_type: {
1096     // Add elements to structure type.
1097     DIArray Elements = CTy.getTypeArray();
1098
1099     // A forward struct declared type may not have elements available.
1100     unsigned N = Elements.getNumElements();
1101     if (N == 0)
1102       break;
1103
1104     // Add elements to structure type.
1105     for (unsigned i = 0; i < N; ++i) {
1106       DIDescriptor Element = Elements.getElement(i);
1107       DIE *ElemDie = NULL;
1108       if (Element.isSubprogram()) {
1109         DISubprogram SP(Element);
1110         ElemDie = createSubprogramDIE(DISubprogram(Element));
1111         if (SP.isProtected())
1112           addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1113                   dwarf::DW_ACCESS_protected);
1114         else if (SP.isPrivate())
1115           addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1116                   dwarf::DW_ACCESS_private);
1117         else 
1118           addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1119             dwarf::DW_ACCESS_public);
1120         if (SP.isExplicit())
1121           addUInt(ElemDie, dwarf::DW_AT_explicit, dwarf::DW_FORM_flag, 1);
1122       }
1123       else if (Element.isVariable()) {
1124         DIVariable DV(Element);
1125         ElemDie = new DIE(dwarf::DW_TAG_variable);
1126         addString(ElemDie, dwarf::DW_AT_name, dwarf::DW_FORM_string,
1127                   DV.getName());
1128         addType(ElemDie, DV.getType());
1129         addUInt(ElemDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1130         addUInt(ElemDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
1131         addSourceLine(ElemDie, DV);
1132       } else if (Element.isDerivedType())
1133         ElemDie = createMemberDIE(DIDerivedType(Element));
1134       else
1135         continue;
1136       Buffer.addChild(ElemDie);
1137     }
1138
1139     if (CTy.isAppleBlockExtension())
1140       addUInt(&Buffer, dwarf::DW_AT_APPLE_block, dwarf::DW_FORM_flag, 1);
1141
1142     unsigned RLang = CTy.getRunTimeLang();
1143     if (RLang)
1144       addUInt(&Buffer, dwarf::DW_AT_APPLE_runtime_class,
1145               dwarf::DW_FORM_data1, RLang);
1146
1147     DICompositeType ContainingType = CTy.getContainingType();
1148     if (DIDescriptor(ContainingType).isCompositeType())
1149       addDIEEntry(&Buffer, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4,
1150                   getOrCreateTypeDIE(DIType(ContainingType)));
1151     else {
1152       DIDescriptor Context = CTy.getContext();
1153       addToContextOwner(&Buffer, Context);
1154     }
1155     break;
1156   }
1157   default:
1158     break;
1159   }
1160
1161   // Add name if not anonymous or intermediate type.
1162   if (!Name.empty())
1163     addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1164
1165   if (Tag == dwarf::DW_TAG_enumeration_type || Tag == dwarf::DW_TAG_class_type
1166       || Tag == dwarf::DW_TAG_structure_type || Tag == dwarf::DW_TAG_union_type)
1167     {
1168     // Add size if non-zero (derived types might be zero-sized.)
1169     if (Size)
1170       addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
1171     else {
1172       // Add zero size if it is not a forward declaration.
1173       if (CTy.isForwardDecl())
1174         addUInt(&Buffer, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1175       else
1176         addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, 0);
1177     }
1178
1179     // Add source line info if available.
1180     if (!CTy.isForwardDecl())
1181       addSourceLine(&Buffer, CTy);
1182   }
1183 }
1184
1185 /// constructSubrangeDIE - Construct subrange DIE from DISubrange.
1186 void DwarfDebug::constructSubrangeDIE(DIE &Buffer, DISubrange SR, DIE *IndexTy){
1187   int64_t L = SR.getLo();
1188   int64_t H = SR.getHi();
1189   DIE *DW_Subrange = new DIE(dwarf::DW_TAG_subrange_type);
1190
1191   addDIEEntry(DW_Subrange, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IndexTy);
1192   if (L)
1193     addSInt(DW_Subrange, dwarf::DW_AT_lower_bound, 0, L);
1194   addSInt(DW_Subrange, dwarf::DW_AT_upper_bound, 0, H);
1195
1196   Buffer.addChild(DW_Subrange);
1197 }
1198
1199 /// constructArrayTypeDIE - Construct array type DIE from DICompositeType.
1200 void DwarfDebug::constructArrayTypeDIE(DIE &Buffer,
1201                                        DICompositeType *CTy) {
1202   Buffer.setTag(dwarf::DW_TAG_array_type);
1203   if (CTy->getTag() == dwarf::DW_TAG_vector_type)
1204     addUInt(&Buffer, dwarf::DW_AT_GNU_vector, dwarf::DW_FORM_flag, 1);
1205
1206   // Emit derived type.
1207   addType(&Buffer, CTy->getTypeDerivedFrom());
1208   DIArray Elements = CTy->getTypeArray();
1209
1210   // Get an anonymous type for index type.
1211   CompileUnit *TheCU = getCompileUnit(*CTy);
1212   DIE *IdxTy = TheCU->getIndexTyDie();
1213   if (!IdxTy) {
1214     // Construct an anonymous type for index type.
1215     IdxTy = new DIE(dwarf::DW_TAG_base_type);
1216     addUInt(IdxTy, dwarf::DW_AT_byte_size, 0, sizeof(int32_t));
1217     addUInt(IdxTy, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
1218             dwarf::DW_ATE_signed);
1219     TheCU->addDie(IdxTy);
1220     TheCU->setIndexTyDie(IdxTy);
1221   }
1222
1223   // Add subranges to array type.
1224   for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1225     DIDescriptor Element = Elements.getElement(i);
1226     if (Element.getTag() == dwarf::DW_TAG_subrange_type)
1227       constructSubrangeDIE(Buffer, DISubrange(Element), IdxTy);
1228   }
1229 }
1230
1231 /// constructEnumTypeDIE - Construct enum type DIE from DIEnumerator.
1232 DIE *DwarfDebug::constructEnumTypeDIE(DIEnumerator ETy) {
1233   DIE *Enumerator = new DIE(dwarf::DW_TAG_enumerator);
1234   StringRef Name = ETy.getName();
1235   addString(Enumerator, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1236   int64_t Value = ETy.getEnumValue();
1237   addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, Value);
1238   return Enumerator;
1239 }
1240
1241 /// getRealLinkageName - If special LLVM prefix that is used to inform the asm
1242 /// printer to not emit usual symbol prefix before the symbol name is used then
1243 /// return linkage name after skipping this special LLVM prefix.
1244 static StringRef getRealLinkageName(StringRef LinkageName) {
1245   char One = '\1';
1246   if (LinkageName.startswith(StringRef(&One, 1)))
1247     return LinkageName.substr(1);
1248   return LinkageName;
1249 }
1250
1251 /// createMemberDIE - Create new member DIE.
1252 DIE *DwarfDebug::createMemberDIE(DIDerivedType DT) {
1253   DIE *MemberDie = new DIE(DT.getTag());
1254   StringRef Name = DT.getName();
1255   if (!Name.empty())
1256     addString(MemberDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1257
1258   addType(MemberDie, DT.getTypeDerivedFrom());
1259
1260   addSourceLine(MemberDie, DT);
1261
1262   DIEBlock *MemLocationDie = new (DIEValueAllocator) DIEBlock();
1263   addUInt(MemLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
1264
1265   uint64_t Size = DT.getSizeInBits();
1266   uint64_t FieldSize = DT.getOriginalTypeSize();
1267
1268   if (Size != FieldSize) {
1269     // Handle bitfield.
1270     addUInt(MemberDie, dwarf::DW_AT_byte_size, 0, DT.getOriginalTypeSize()>>3);
1271     addUInt(MemberDie, dwarf::DW_AT_bit_size, 0, DT.getSizeInBits());
1272
1273     uint64_t Offset = DT.getOffsetInBits();
1274     uint64_t AlignMask = ~(DT.getAlignInBits() - 1);
1275     uint64_t HiMark = (Offset + FieldSize) & AlignMask;
1276     uint64_t FieldOffset = (HiMark - FieldSize);
1277     Offset -= FieldOffset;
1278
1279     // Maybe we need to work from the other end.
1280     if (Asm->getTargetData().isLittleEndian())
1281       Offset = FieldSize - (Offset + Size);
1282     addUInt(MemberDie, dwarf::DW_AT_bit_offset, 0, Offset);
1283
1284     // Here WD_AT_data_member_location points to the anonymous
1285     // field that includes this bit field.
1286     addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, FieldOffset >> 3);
1287
1288   } else
1289     // This is not a bitfield.
1290     addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits() >> 3);
1291
1292   if (DT.getTag() == dwarf::DW_TAG_inheritance
1293       && DT.isVirtual()) {
1294
1295     // For C++, virtual base classes are not at fixed offset. Use following
1296     // expression to extract appropriate offset from vtable.
1297     // BaseAddr = ObAddr + *((*ObAddr) - Offset)
1298
1299     DIEBlock *VBaseLocationDie = new (DIEValueAllocator) DIEBlock();
1300     addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_dup);
1301     addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1302     addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1303     addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits());
1304     addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_minus);
1305     addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1306     addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1307
1308     addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0,
1309              VBaseLocationDie);
1310   } else
1311     addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, MemLocationDie);
1312
1313   if (DT.isProtected())
1314     addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1315             dwarf::DW_ACCESS_protected);
1316   else if (DT.isPrivate())
1317     addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1318             dwarf::DW_ACCESS_private);
1319   // Otherwise C++ member and base classes are considered public.
1320   else if (DT.getCompileUnit().getLanguage() == dwarf::DW_LANG_C_plus_plus)
1321     addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1322             dwarf::DW_ACCESS_public);
1323   if (DT.isVirtual())
1324     addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_flag,
1325             dwarf::DW_VIRTUALITY_virtual);
1326   return MemberDie;
1327 }
1328
1329 /// createSubprogramDIE - Create new DIE using SP.
1330 DIE *DwarfDebug::createSubprogramDIE(DISubprogram SP) {
1331   CompileUnit *SPCU = getCompileUnit(SP);
1332   DIE *SPDie = SPCU->getDIE(SP);
1333   if (SPDie)
1334     return SPDie;
1335
1336   SPDie = new DIE(dwarf::DW_TAG_subprogram);
1337   // Constructors and operators for anonymous aggregates do not have names.
1338   if (!SP.getName().empty())
1339     addString(SPDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, SP.getName());
1340
1341   StringRef LinkageName = SP.getLinkageName();
1342   if (!LinkageName.empty())
1343     addString(SPDie, dwarf::DW_AT_MIPS_linkage_name, dwarf::DW_FORM_string,
1344               getRealLinkageName(LinkageName));
1345
1346   addSourceLine(SPDie, SP);
1347
1348   if (SP.isPrototyped()) 
1349     addUInt(SPDie, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
1350
1351   // Add Return Type.
1352   DICompositeType SPTy = SP.getType();
1353   DIArray Args = SPTy.getTypeArray();
1354   unsigned SPTag = SPTy.getTag();
1355
1356   if (Args.getNumElements() == 0 || SPTag != dwarf::DW_TAG_subroutine_type)
1357     addType(SPDie, SPTy);
1358   else
1359     addType(SPDie, DIType(Args.getElement(0)));
1360
1361   unsigned VK = SP.getVirtuality();
1362   if (VK) {
1363     addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_flag, VK);
1364     DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1365     addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1366     addUInt(Block, 0, dwarf::DW_FORM_udata, SP.getVirtualIndex());
1367     addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, 0, Block);
1368     ContainingTypeMap.insert(std::make_pair(SPDie,
1369                                             SP.getContainingType()));
1370   }
1371
1372   if (!SP.isDefinition()) {
1373     addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1374
1375     // Add arguments. Do not add arguments for subprogram definition. They will
1376     // be handled while processing variables.
1377     DICompositeType SPTy = SP.getType();
1378     DIArray Args = SPTy.getTypeArray();
1379     unsigned SPTag = SPTy.getTag();
1380
1381     if (SPTag == dwarf::DW_TAG_subroutine_type)
1382       for (unsigned i = 1, N =  Args.getNumElements(); i < N; ++i) {
1383         DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1384         DIType ATy = DIType(DIType(Args.getElement(i)));
1385         addType(Arg, ATy);
1386         if (ATy.isArtificial())
1387           addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1388         SPDie->addChild(Arg);
1389       }
1390   }
1391
1392   if (SP.isArtificial())
1393     addUInt(SPDie, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1394
1395   if (!SP.isLocalToUnit())
1396     addUInt(SPDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
1397
1398   if (SP.isOptimized())
1399     addUInt(SPDie, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1);
1400
1401   if (unsigned isa = Asm->getISAEncoding()) {
1402     addUInt(SPDie, dwarf::DW_AT_APPLE_isa, dwarf::DW_FORM_flag, isa);
1403   }
1404
1405   // DW_TAG_inlined_subroutine may refer to this DIE.
1406   SPCU->insertDIE(SP, SPDie);
1407
1408   // Add to context owner.
1409   addToContextOwner(SPDie, SP.getContext());
1410
1411   return SPDie;
1412 }
1413
1414 DbgScope *DwarfDebug::getOrCreateAbstractScope(const MDNode *N) {
1415   assert(N && "Invalid Scope encoding!");
1416
1417   DbgScope *AScope = AbstractScopes.lookup(N);
1418   if (AScope)
1419     return AScope;
1420
1421   DbgScope *Parent = NULL;
1422
1423   DIDescriptor Scope(N);
1424   if (Scope.isLexicalBlock()) {
1425     DILexicalBlock DB(N);
1426     DIDescriptor ParentDesc = DB.getContext();
1427     Parent = getOrCreateAbstractScope(ParentDesc);
1428   }
1429
1430   AScope = new DbgScope(Parent, DIDescriptor(N), NULL);
1431
1432   if (Parent)
1433     Parent->addScope(AScope);
1434   AScope->setAbstractScope();
1435   AbstractScopes[N] = AScope;
1436   if (DIDescriptor(N).isSubprogram())
1437     AbstractScopesList.push_back(AScope);
1438   return AScope;
1439 }
1440
1441 /// isSubprogramContext - Return true if Context is either a subprogram
1442 /// or another context nested inside a subprogram.
1443 static bool isSubprogramContext(const MDNode *Context) {
1444   if (!Context)
1445     return false;
1446   DIDescriptor D(Context);
1447   if (D.isSubprogram())
1448     return true;
1449   if (D.isType())
1450     return isSubprogramContext(DIType(Context).getContext());
1451   return false;
1452 }
1453
1454 /// updateSubprogramScopeDIE - Find DIE for the given subprogram and
1455 /// attach appropriate DW_AT_low_pc and DW_AT_high_pc attributes.
1456 /// If there are global variables in this scope then create and insert
1457 /// DIEs for these variables.
1458 DIE *DwarfDebug::updateSubprogramScopeDIE(const MDNode *SPNode) {
1459   CompileUnit *SPCU = getCompileUnit(SPNode);
1460   DIE *SPDie = SPCU->getDIE(SPNode);
1461
1462   assert(SPDie && "Unable to find subprogram DIE!");
1463   DISubprogram SP(SPNode);
1464
1465   // There is not any need to generate specification DIE for a function
1466   // defined at compile unit level. If a function is defined inside another
1467   // function then gdb prefers the definition at top level and but does not
1468   // expect specification DIE in parent function. So avoid creating
1469   // specification DIE for a function defined inside a function.
1470   if (SP.isDefinition() && !SP.getContext().isCompileUnit() &&
1471       !SP.getContext().isFile() &&
1472       !isSubprogramContext(SP.getContext())) {
1473     addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1474
1475     // Add arguments.
1476     DICompositeType SPTy = SP.getType();
1477     DIArray Args = SPTy.getTypeArray();
1478     unsigned SPTag = SPTy.getTag();
1479     if (SPTag == dwarf::DW_TAG_subroutine_type)
1480       for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
1481         DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1482         DIType ATy = DIType(DIType(Args.getElement(i)));
1483         addType(Arg, ATy);
1484         if (ATy.isArtificial())
1485           addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1486         SPDie->addChild(Arg);
1487       }
1488     DIE *SPDeclDie = SPDie;
1489     SPDie = new DIE(dwarf::DW_TAG_subprogram);
1490     addDIEEntry(SPDie, dwarf::DW_AT_specification, dwarf::DW_FORM_ref4,
1491                 SPDeclDie);
1492     SPCU->addDie(SPDie);
1493   }
1494
1495   // Pick up abstract subprogram DIE.
1496   if (DIE *AbsSPDIE = AbstractSPDies.lookup(SPNode)) {
1497     SPDie = new DIE(dwarf::DW_TAG_subprogram);
1498     addDIEEntry(SPDie, dwarf::DW_AT_abstract_origin,
1499                 dwarf::DW_FORM_ref4, AbsSPDIE);
1500     SPCU->addDie(SPDie);
1501   }
1502
1503   addLabel(SPDie, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
1504            Asm->GetTempSymbol("func_begin", Asm->getFunctionNumber()));
1505   addLabel(SPDie, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
1506            Asm->GetTempSymbol("func_end", Asm->getFunctionNumber()));
1507   const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
1508   MachineLocation Location(RI->getFrameRegister(*Asm->MF));
1509   addAddress(SPDie, dwarf::DW_AT_frame_base, Location);
1510
1511   return SPDie;
1512 }
1513
1514 /// constructLexicalScope - Construct new DW_TAG_lexical_block
1515 /// for this scope and attach DW_AT_low_pc/DW_AT_high_pc labels.
1516 DIE *DwarfDebug::constructLexicalScopeDIE(DbgScope *Scope) {
1517
1518   DIE *ScopeDIE = new DIE(dwarf::DW_TAG_lexical_block);
1519   if (Scope->isAbstractScope())
1520     return ScopeDIE;
1521
1522   const SmallVector<DbgRange, 4> &Ranges = Scope->getRanges();
1523   if (Ranges.empty())
1524     return 0;
1525
1526   SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin();
1527   if (Ranges.size() > 1) {
1528     // .debug_range section has not been laid out yet. Emit offset in
1529     // .debug_range as a uint, size 4, for now. emitDIE will handle
1530     // DW_AT_ranges appropriately.
1531     addUInt(ScopeDIE, dwarf::DW_AT_ranges, dwarf::DW_FORM_data4,
1532             DebugRangeSymbols.size() * Asm->getTargetData().getPointerSize());
1533     for (SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin(),
1534          RE = Ranges.end(); RI != RE; ++RI) {
1535       DebugRangeSymbols.push_back(getLabelBeforeInsn(RI->first));
1536       DebugRangeSymbols.push_back(getLabelAfterInsn(RI->second));
1537     }
1538     DebugRangeSymbols.push_back(NULL);
1539     DebugRangeSymbols.push_back(NULL);
1540     return ScopeDIE;
1541   }
1542
1543   const MCSymbol *Start = getLabelBeforeInsn(RI->first);
1544   const MCSymbol *End = getLabelAfterInsn(RI->second);
1545
1546   if (End == 0) return 0;
1547
1548   assert(Start->isDefined() && "Invalid starting label for an inlined scope!");
1549   assert(End->isDefined() && "Invalid end label for an inlined scope!");
1550
1551   addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, Start);
1552   addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr, End);
1553
1554   return ScopeDIE;
1555 }
1556
1557 /// constructInlinedScopeDIE - This scope represents inlined body of
1558 /// a function. Construct DIE to represent this concrete inlined copy
1559 /// of the function.
1560 DIE *DwarfDebug::constructInlinedScopeDIE(DbgScope *Scope) {
1561
1562   const SmallVector<DbgRange, 4> &Ranges = Scope->getRanges();
1563   assert (Ranges.empty() == false
1564           && "DbgScope does not have instruction markers!");
1565
1566   // FIXME : .debug_inlined section specification does not clearly state how
1567   // to emit inlined scope that is split into multiple instruction ranges.
1568   // For now, use first instruction range and emit low_pc/high_pc pair and
1569   // corresponding .debug_inlined section entry for this pair.
1570   SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin();
1571   const MCSymbol *StartLabel = getLabelBeforeInsn(RI->first);
1572   const MCSymbol *EndLabel = getLabelAfterInsn(RI->second);
1573
1574   if (StartLabel == 0 || EndLabel == 0) {
1575     assert (0 && "Unexpected Start and End  labels for a inlined scope!");
1576     return 0;
1577   }
1578   assert(StartLabel->isDefined() &&
1579          "Invalid starting label for an inlined scope!");
1580   assert(EndLabel->isDefined() &&
1581          "Invalid end label for an inlined scope!");
1582
1583   if (!Scope->getScopeNode())
1584     return NULL;
1585   DIScope DS(Scope->getScopeNode());
1586   DIE *ScopeDIE = new DIE(dwarf::DW_TAG_inlined_subroutine);
1587
1588   DISubprogram InlinedSP = getDISubprogram(DS);
1589   CompileUnit *TheCU = getCompileUnit(InlinedSP);
1590   DIE *OriginDIE = TheCU->getDIE(InlinedSP);
1591   assert(OriginDIE && "Unable to find Origin DIE!");
1592   addDIEEntry(ScopeDIE, dwarf::DW_AT_abstract_origin,
1593               dwarf::DW_FORM_ref4, OriginDIE);
1594
1595   addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, StartLabel);
1596   addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr, EndLabel);
1597
1598   InlinedSubprogramDIEs.insert(OriginDIE);
1599
1600   // Track the start label for this inlined function.
1601   DenseMap<const MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator
1602     I = InlineInfo.find(InlinedSP);
1603
1604   if (I == InlineInfo.end()) {
1605     InlineInfo[InlinedSP].push_back(std::make_pair(StartLabel,
1606                                                              ScopeDIE));
1607     InlinedSPNodes.push_back(InlinedSP);
1608   } else
1609     I->second.push_back(std::make_pair(StartLabel, ScopeDIE));
1610
1611   DILocation DL(Scope->getInlinedAt());
1612   addUInt(ScopeDIE, dwarf::DW_AT_call_file, 0, TheCU->getID());
1613   addUInt(ScopeDIE, dwarf::DW_AT_call_line, 0, DL.getLineNumber());
1614
1615   return ScopeDIE;
1616 }
1617
1618
1619 /// constructVariableDIE - Construct a DIE for the given DbgVariable.
1620 DIE *DwarfDebug::constructVariableDIE(DbgVariable *DV, DbgScope *Scope) {
1621   StringRef Name = DV->getName();
1622   if (Name.empty())
1623     return NULL;
1624
1625   // Translate tag to proper Dwarf tag.  The result variable is dropped for
1626   // now.
1627   unsigned Tag;
1628   switch (DV->getTag()) {
1629   case dwarf::DW_TAG_return_variable:
1630     return NULL;
1631   case dwarf::DW_TAG_arg_variable:
1632     Tag = dwarf::DW_TAG_formal_parameter;
1633     break;
1634   case dwarf::DW_TAG_auto_variable:    // fall thru
1635   default:
1636     Tag = dwarf::DW_TAG_variable;
1637     break;
1638   }
1639
1640   // Define variable debug information entry.
1641   DIE *VariableDie = new DIE(Tag);
1642
1643   DIE *AbsDIE = NULL;
1644   DenseMap<const DbgVariable *, const DbgVariable *>::iterator
1645     V2AVI = VarToAbstractVarMap.find(DV);
1646   if (V2AVI != VarToAbstractVarMap.end())
1647     AbsDIE = V2AVI->second->getDIE();
1648
1649   if (AbsDIE)
1650     addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin,
1651                 dwarf::DW_FORM_ref4, AbsDIE);
1652   else {
1653     addString(VariableDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1654     addSourceLine(VariableDie, DV->getVariable());
1655
1656     // Add variable type.
1657     addType(VariableDie, DV->getType());
1658   }
1659
1660   if (Tag == dwarf::DW_TAG_formal_parameter && DV->getType().isArtificial())
1661     addUInt(VariableDie, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1662   else if (DIVariable(DV->getVariable()).isArtificial())
1663     addUInt(VariableDie, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1664
1665   if (Scope->isAbstractScope()) {
1666     DV->setDIE(VariableDie);
1667     return VariableDie;
1668   }
1669
1670   // Add variable address.
1671
1672   unsigned Offset = DV->getDotDebugLocOffset();
1673   if (Offset != ~0U) {
1674     addLabel(VariableDie, dwarf::DW_AT_location, dwarf::DW_FORM_data4,
1675              Asm->GetTempSymbol("debug_loc", Offset));
1676     DV->setDIE(VariableDie);
1677     UseDotDebugLocEntry.insert(VariableDie);
1678     return VariableDie;
1679   }
1680
1681   // Check if variable is described by a  DBG_VALUE instruction.
1682   DenseMap<const DbgVariable *, const MachineInstr *>::iterator DVI =
1683     DbgVariableToDbgInstMap.find(DV);
1684   if (DVI != DbgVariableToDbgInstMap.end()) {
1685     const MachineInstr *DVInsn = DVI->second;
1686     bool updated = false;
1687     // FIXME : Handle getNumOperands != 3
1688     if (DVInsn->getNumOperands() == 3) {
1689       if (DVInsn->getOperand(0).isReg()) {
1690         const MachineOperand RegOp = DVInsn->getOperand(0);
1691         const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
1692         if (DVInsn->getOperand(1).isImm() &&
1693             TRI->getFrameRegister(*Asm->MF) == RegOp.getReg()) {
1694           addVariableAddress(DV, VariableDie, DVInsn->getOperand(1).getImm());
1695           updated = true;
1696         } else
1697           updated = addRegisterAddress(VariableDie, RegOp);
1698       }
1699       else if (DVInsn->getOperand(0).isImm())
1700         updated = addConstantValue(VariableDie, DVInsn->getOperand(0));
1701       else if (DVInsn->getOperand(0).isFPImm())
1702         updated =
1703           addConstantFPValue(VariableDie, DVInsn->getOperand(0));
1704     } else {
1705       MachineLocation Location = Asm->getDebugValueLocation(DVInsn);
1706       if (Location.getReg()) {
1707         addAddress(VariableDie, dwarf::DW_AT_location, Location);
1708         updated = true;
1709       }
1710     }
1711     if (!updated) {
1712       // If variableDie is not updated then DBG_VALUE instruction does not
1713       // have valid variable info.
1714       delete VariableDie;
1715       return NULL;
1716     }
1717     DV->setDIE(VariableDie);
1718     return VariableDie;
1719   }
1720
1721   // .. else use frame index, if available.
1722   int FI = 0;
1723   if (findVariableFrameIndex(DV, &FI))
1724     addVariableAddress(DV, VariableDie, FI);
1725   
1726   DV->setDIE(VariableDie);
1727   return VariableDie;
1728
1729 }
1730
1731 void DwarfDebug::addPubTypes(DISubprogram SP) {
1732   DICompositeType SPTy = SP.getType();
1733   unsigned SPTag = SPTy.getTag();
1734   if (SPTag != dwarf::DW_TAG_subroutine_type)
1735     return;
1736
1737   DIArray Args = SPTy.getTypeArray();
1738   for (unsigned i = 0, e = Args.getNumElements(); i != e; ++i) {
1739     DIType ATy(Args.getElement(i));
1740     if (!ATy.Verify())
1741       continue;
1742     DICompositeType CATy = getDICompositeType(ATy);
1743     if (DIDescriptor(CATy).Verify() && !CATy.getName().empty()
1744         && !CATy.isForwardDecl()) {
1745       CompileUnit *TheCU = getCompileUnit(CATy);
1746       if (DIEEntry *Entry = TheCU->getDIEEntry(CATy))
1747         TheCU->addGlobalType(CATy.getName(), Entry->getEntry());
1748     }
1749   }
1750 }
1751
1752 /// constructScopeDIE - Construct a DIE for this scope.
1753 DIE *DwarfDebug::constructScopeDIE(DbgScope *Scope) {
1754   if (!Scope || !Scope->getScopeNode())
1755     return NULL;
1756
1757   DIScope DS(Scope->getScopeNode());
1758   DIE *ScopeDIE = NULL;
1759   if (Scope->getInlinedAt())
1760     ScopeDIE = constructInlinedScopeDIE(Scope);
1761   else if (DS.isSubprogram()) {
1762     ProcessedSPNodes.insert(DS);
1763     if (Scope->isAbstractScope()) {
1764       ScopeDIE = getCompileUnit(DS)->getDIE(DS);
1765       // Note down abstract DIE.
1766       if (ScopeDIE)
1767         AbstractSPDies.insert(std::make_pair(DS, ScopeDIE));
1768     }
1769     else
1770       ScopeDIE = updateSubprogramScopeDIE(DS);
1771   }
1772   else
1773     ScopeDIE = constructLexicalScopeDIE(Scope);
1774   if (!ScopeDIE) return NULL;
1775
1776   // Add variables to scope.
1777   const SmallVector<DbgVariable *, 8> &Variables = Scope->getDbgVariables();
1778   for (unsigned i = 0, N = Variables.size(); i < N; ++i) {
1779     DIE *VariableDIE = constructVariableDIE(Variables[i], Scope);
1780     if (VariableDIE)
1781       ScopeDIE->addChild(VariableDIE);
1782   }
1783
1784   // Add nested scopes.
1785   const SmallVector<DbgScope *, 4> &Scopes = Scope->getScopes();
1786   for (unsigned j = 0, M = Scopes.size(); j < M; ++j) {
1787     // Define the Scope debug information entry.
1788     DIE *NestedDIE = constructScopeDIE(Scopes[j]);
1789     if (NestedDIE)
1790       ScopeDIE->addChild(NestedDIE);
1791   }
1792
1793   if (DS.isSubprogram())
1794     addPubTypes(DISubprogram(DS));
1795
1796  return ScopeDIE;
1797 }
1798
1799 /// GetOrCreateSourceID - Look up the source id with the given directory and
1800 /// source file names. If none currently exists, create a new id and insert it
1801 /// in the SourceIds map. This can update DirectoryNames and SourceFileNames
1802 /// maps as well.
1803
1804 unsigned DwarfDebug::GetOrCreateSourceID(StringRef FileName){
1805   // If FE did not provide a file name, then assume stdin.
1806   if (FileName.empty())
1807     return GetOrCreateSourceID("<stdin>");
1808
1809   StringMapEntry<unsigned> &Entry = SourceIdMap.GetOrCreateValue(FileName);
1810   if (Entry.getValue())
1811     return Entry.getValue();
1812
1813   unsigned SrcId = SourceIdMap.size();
1814   Entry.setValue(SrcId);
1815
1816   // Print out a .file directive to specify files for .loc directives.
1817   Asm->OutStreamer.EmitDwarfFileDirective(SrcId, FileName);
1818
1819   return SrcId;
1820 }
1821
1822 /// getOrCreateNameSpace - Create a DIE for DINameSpace.
1823 DIE *DwarfDebug::getOrCreateNameSpace(DINameSpace NS) {
1824   CompileUnit *TheCU = getCompileUnit(NS);
1825   DIE *NDie = TheCU->getDIE(NS);
1826   if (NDie)
1827     return NDie;
1828   NDie = new DIE(dwarf::DW_TAG_namespace);
1829   TheCU->insertDIE(NS, NDie);
1830   if (!NS.getName().empty())
1831     addString(NDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, NS.getName());
1832   addSourceLine(NDie, NS);
1833   addToContextOwner(NDie, NS.getContext());
1834   return NDie;
1835 }
1836
1837 /// constructCompileUnit - Create new CompileUnit for the given
1838 /// metadata node with tag DW_TAG_compile_unit.
1839 void DwarfDebug::constructCompileUnit(const MDNode *N) {
1840   DICompileUnit DIUnit(N);
1841   StringRef FN = DIUnit.getFilename();
1842   StringRef Dir = DIUnit.getDirectory();
1843   unsigned ID = GetOrCreateSourceID(FN);
1844
1845   DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
1846   addString(Die, dwarf::DW_AT_producer, dwarf::DW_FORM_string,
1847             DIUnit.getProducer());
1848   addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data1,
1849           DIUnit.getLanguage());
1850   addString(Die, dwarf::DW_AT_name, dwarf::DW_FORM_string, FN);
1851   // Use DW_AT_entry_pc instead of DW_AT_low_pc/DW_AT_high_pc pair. This
1852   // simplifies debug range entries.
1853   addUInt(Die, dwarf::DW_AT_entry_pc, dwarf::DW_FORM_addr, 0);
1854   // DW_AT_stmt_list is a offset of line number information for this
1855   // compile unit in debug_line section.
1856   if (Asm->MAI->doesDwarfUsesAbsoluteLabelForStmtList())
1857     addLabel(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_addr,
1858              Asm->GetTempSymbol("section_line"));
1859   else
1860     addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4, 0);
1861
1862   if (!Dir.empty())
1863     addString(Die, dwarf::DW_AT_comp_dir, dwarf::DW_FORM_string, Dir);
1864   if (DIUnit.isOptimized())
1865     addUInt(Die, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1);
1866
1867   StringRef Flags = DIUnit.getFlags();
1868   if (!Flags.empty())
1869     addString(Die, dwarf::DW_AT_APPLE_flags, dwarf::DW_FORM_string, Flags);
1870
1871   unsigned RVer = DIUnit.getRunTimeVersion();
1872   if (RVer)
1873     addUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers,
1874             dwarf::DW_FORM_data1, RVer);
1875
1876   CompileUnit *NewCU = new CompileUnit(ID, Die);
1877   if (!FirstCU)
1878     FirstCU = NewCU;
1879   CUMap.insert(std::make_pair(N, NewCU));
1880 }
1881
1882 /// getCompielUnit - Get CompileUnit DIE.
1883 CompileUnit *DwarfDebug::getCompileUnit(const MDNode *N) const {
1884   assert (N && "Invalid DwarfDebug::getCompileUnit argument!");
1885   DIDescriptor D(N);
1886   const MDNode *CUNode = NULL;
1887   if (D.isCompileUnit())
1888     CUNode = N;
1889   else if (D.isSubprogram())
1890     CUNode = DISubprogram(N).getCompileUnit();
1891   else if (D.isType())
1892     CUNode = DIType(N).getCompileUnit();
1893   else if (D.isGlobalVariable())
1894     CUNode = DIGlobalVariable(N).getCompileUnit();
1895   else if (D.isVariable())
1896     CUNode = DIVariable(N).getCompileUnit();
1897   else if (D.isNameSpace())
1898     CUNode = DINameSpace(N).getCompileUnit();
1899   else if (D.isFile())
1900     CUNode = DIFile(N).getCompileUnit();
1901   else
1902     return FirstCU;
1903
1904   DenseMap<const MDNode *, CompileUnit *>::const_iterator I
1905     = CUMap.find(CUNode);
1906   if (I == CUMap.end())
1907     return FirstCU;
1908   return I->second;
1909 }
1910
1911 /// isUnsignedDIType - Return true if type encoding is unsigned.
1912 static bool isUnsignedDIType(DIType Ty) {
1913   DIDerivedType DTy(Ty);
1914   if (DTy.Verify())
1915     return isUnsignedDIType(DTy.getTypeDerivedFrom());
1916
1917   DIBasicType BTy(Ty);
1918   if (BTy.Verify()) {
1919     unsigned Encoding = BTy.getEncoding();
1920     if (Encoding == dwarf::DW_ATE_unsigned ||
1921         Encoding == dwarf::DW_ATE_unsigned_char)
1922       return true;
1923   }
1924   return false;
1925 }
1926
1927 /// constructGlobalVariableDIE - Construct global variable DIE.
1928 void DwarfDebug::constructGlobalVariableDIE(const MDNode *N) {
1929   DIGlobalVariable GV(N);
1930
1931   // If debug information is malformed then ignore it.
1932   if (GV.Verify() == false)
1933     return;
1934
1935   // Check for pre-existence.
1936   CompileUnit *TheCU = getCompileUnit(N);
1937   if (TheCU->getDIE(GV))
1938     return;
1939
1940   DIType GTy = GV.getType();
1941   DIE *VariableDIE = new DIE(GV.getTag());
1942
1943   bool isGlobalVariable = GV.getGlobal() != NULL;
1944
1945   // Add name.
1946   addString(VariableDIE, dwarf::DW_AT_name, dwarf::DW_FORM_string,
1947             GV.getDisplayName());
1948   StringRef LinkageName = GV.getLinkageName();
1949   if (!LinkageName.empty() && isGlobalVariable)
1950     addString(VariableDIE, dwarf::DW_AT_MIPS_linkage_name, dwarf::DW_FORM_string,
1951               getRealLinkageName(LinkageName));
1952   // Add type.
1953   addType(VariableDIE, GTy);
1954   if (GTy.isCompositeType() && !GTy.getName().empty()
1955       && !GTy.isForwardDecl()) {
1956     DIEEntry *Entry = TheCU->getDIEEntry(GTy);
1957     assert(Entry && "Missing global type!");
1958     TheCU->addGlobalType(GTy.getName(), Entry->getEntry());
1959   }
1960   // Add scoping info.
1961   if (!GV.isLocalToUnit()) {
1962     addUInt(VariableDIE, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
1963     // Expose as global. 
1964     TheCU->addGlobal(GV.getName(), VariableDIE);
1965   }
1966   // Add line number info.
1967   addSourceLine(VariableDIE, GV);
1968   // Add to map.
1969   TheCU->insertDIE(N, VariableDIE);
1970   // Add to context owner.
1971   DIDescriptor GVContext = GV.getContext();
1972   addToContextOwner(VariableDIE, GVContext);
1973   // Add location.
1974   if (isGlobalVariable) {
1975     DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1976     addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
1977     addLabel(Block, 0, dwarf::DW_FORM_udata,
1978              Asm->Mang->getSymbol(GV.getGlobal()));
1979     // Do not create specification DIE if context is either compile unit
1980     // or a subprogram.
1981     if (GV.isDefinition() && !GVContext.isCompileUnit() &&
1982         !GVContext.isFile() && !isSubprogramContext(GVContext)) {
1983       // Create specification DIE.
1984       DIE *VariableSpecDIE = new DIE(dwarf::DW_TAG_variable);
1985       addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification,
1986                   dwarf::DW_FORM_ref4, VariableDIE);
1987       addBlock(VariableSpecDIE, dwarf::DW_AT_location, 0, Block);
1988       addUInt(VariableDIE, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1989       TheCU->addDie(VariableSpecDIE);
1990     } else {
1991       addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
1992     } 
1993   } else if (ConstantInt *CI = 
1994              dyn_cast_or_null<ConstantInt>(GV.getConstant()))
1995     addConstantValue(VariableDIE, CI, isUnsignedDIType(GTy));
1996
1997   return;
1998 }
1999
2000 /// construct SubprogramDIE - Construct subprogram DIE.
2001 void DwarfDebug::constructSubprogramDIE(const MDNode *N) {
2002   DISubprogram SP(N);
2003
2004   // Check for pre-existence.
2005   CompileUnit *TheCU = getCompileUnit(N);
2006   if (TheCU->getDIE(N))
2007     return;
2008
2009   if (!SP.isDefinition())
2010     // This is a method declaration which will be handled while constructing
2011     // class type.
2012     return;
2013
2014   DIE *SubprogramDie = createSubprogramDIE(SP);
2015
2016   // Add to map.
2017   TheCU->insertDIE(N, SubprogramDie);
2018
2019   // Add to context owner.
2020   addToContextOwner(SubprogramDie, SP.getContext());
2021
2022   // Expose as global.
2023   TheCU->addGlobal(SP.getName(), SubprogramDie);
2024
2025   return;
2026 }
2027
2028 /// beginModule - Emit all Dwarf sections that should come prior to the
2029 /// content. Create global DIEs and emit initial debug info sections.
2030 /// This is inovked by the target AsmPrinter.
2031 void DwarfDebug::beginModule(Module *M) {
2032   if (DisableDebugInfoPrinting)
2033     return;
2034
2035   DebugInfoFinder DbgFinder;
2036   DbgFinder.processModule(*M);
2037
2038   bool HasDebugInfo = false;
2039
2040   // Scan all the compile-units to see if there are any marked as the main unit.
2041   // if not, we do not generate debug info.
2042   for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
2043        E = DbgFinder.compile_unit_end(); I != E; ++I) {
2044     if (DICompileUnit(*I).isMain()) {
2045       HasDebugInfo = true;
2046       break;
2047     }
2048   }
2049
2050   if (!HasDebugInfo) return;
2051
2052   // Tell MMI that we have debug info.
2053   MMI->setDebugInfoAvailability(true);
2054
2055   // Emit initial sections.
2056   EmitSectionLabels();
2057
2058   // Create all the compile unit DIEs.
2059   for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
2060          E = DbgFinder.compile_unit_end(); I != E; ++I)
2061     constructCompileUnit(*I);
2062
2063   // Create DIEs for each subprogram.
2064   for (DebugInfoFinder::iterator I = DbgFinder.subprogram_begin(),
2065          E = DbgFinder.subprogram_end(); I != E; ++I)
2066     constructSubprogramDIE(*I);
2067
2068   // Create DIEs for each global variable.
2069   for (DebugInfoFinder::iterator I = DbgFinder.global_variable_begin(),
2070          E = DbgFinder.global_variable_end(); I != E; ++I)
2071     constructGlobalVariableDIE(*I);
2072
2073   //getOrCreateTypeDIE
2074   if (NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.enum"))
2075     for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i)
2076       getOrCreateTypeDIE(DIType(NMD->getOperand(i)));
2077
2078   if (NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.ty"))
2079     for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i)
2080       getOrCreateTypeDIE(DIType(NMD->getOperand(i)));
2081
2082   // Prime section data.
2083   SectionMap.insert(Asm->getObjFileLowering().getTextSection());
2084 }
2085
2086 /// endModule - Emit all Dwarf sections that should come after the content.
2087 ///
2088 void DwarfDebug::endModule() {
2089   if (!FirstCU) return;
2090   const Module *M = MMI->getModule();
2091   DenseMap<const MDNode *, DbgScope *> DeadFnScopeMap;
2092   if (NamedMDNode *AllSPs = M->getNamedMetadata("llvm.dbg.sp")) {
2093     for (unsigned SI = 0, SE = AllSPs->getNumOperands(); SI != SE; ++SI) {
2094       if (ProcessedSPNodes.count(AllSPs->getOperand(SI)) != 0) continue;
2095       DISubprogram SP(AllSPs->getOperand(SI));
2096       if (!SP.Verify()) continue;
2097
2098       // Collect info for variables that were optimized out.
2099       if (!SP.isDefinition()) continue;
2100       StringRef FName = SP.getLinkageName();
2101       if (FName.empty())
2102         FName = SP.getName();
2103       NamedMDNode *NMD = getFnSpecificMDNode(*(MMI->getModule()), FName);
2104       if (!NMD) continue;
2105       unsigned E = NMD->getNumOperands();
2106       if (!E) continue;
2107       DbgScope *Scope = new DbgScope(NULL, DIDescriptor(SP), NULL);
2108       DeadFnScopeMap[SP] = Scope;
2109       for (unsigned I = 0; I != E; ++I) {
2110         DIVariable DV(NMD->getOperand(I));
2111         if (!DV.Verify()) continue;
2112         Scope->addVariable(new DbgVariable(DV));
2113       }
2114
2115       // Construct subprogram DIE and add variables DIEs.
2116       constructSubprogramDIE(SP);
2117       DIE *ScopeDIE = getCompileUnit(SP)->getDIE(SP);
2118       const SmallVector<DbgVariable *, 8> &Variables = Scope->getDbgVariables();
2119       for (unsigned i = 0, N = Variables.size(); i < N; ++i) {
2120         DIE *VariableDIE = constructVariableDIE(Variables[i], Scope);
2121         if (VariableDIE)
2122           ScopeDIE->addChild(VariableDIE);
2123       }
2124     }
2125   }
2126
2127   // Attach DW_AT_inline attribute with inlined subprogram DIEs.
2128   for (SmallPtrSet<DIE *, 4>::iterator AI = InlinedSubprogramDIEs.begin(),
2129          AE = InlinedSubprogramDIEs.end(); AI != AE; ++AI) {
2130     DIE *ISP = *AI;
2131     addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
2132   }
2133
2134   for (DenseMap<DIE *, const MDNode *>::iterator CI = ContainingTypeMap.begin(),
2135          CE = ContainingTypeMap.end(); CI != CE; ++CI) {
2136     DIE *SPDie = CI->first;
2137     const MDNode *N = dyn_cast_or_null<MDNode>(CI->second);
2138     if (!N) continue;
2139     DIE *NDie = getCompileUnit(N)->getDIE(N);
2140     if (!NDie) continue;
2141     addDIEEntry(SPDie, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, NDie);
2142   }
2143
2144   // Standard sections final addresses.
2145   Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getTextSection());
2146   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("text_end"));
2147   Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getDataSection());
2148   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("data_end"));
2149
2150   // End text sections.
2151   for (unsigned i = 1, N = SectionMap.size(); i <= N; ++i) {
2152     Asm->OutStreamer.SwitchSection(SectionMap[i]);
2153     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("section_end", i));
2154   }
2155
2156   // Emit common frame information.
2157   emitCommonDebugFrame();
2158
2159   // Emit function debug frame information
2160   for (std::vector<FunctionDebugFrameInfo>::iterator I = DebugFrames.begin(),
2161          E = DebugFrames.end(); I != E; ++I)
2162     emitFunctionDebugFrame(*I);
2163
2164   // Compute DIE offsets and sizes.
2165   computeSizeAndOffsets();
2166
2167   // Emit all the DIEs into a debug info section
2168   emitDebugInfo();
2169
2170   // Corresponding abbreviations into a abbrev section.
2171   emitAbbreviations();
2172
2173   // Emit info into a debug pubnames section.
2174   emitDebugPubNames();
2175
2176   // Emit info into a debug pubtypes section.
2177   emitDebugPubTypes();
2178
2179   // Emit info into a debug loc section.
2180   emitDebugLoc();
2181
2182   // Emit info into a debug aranges section.
2183   EmitDebugARanges();
2184
2185   // Emit info into a debug ranges section.
2186   emitDebugRanges();
2187
2188   // Emit info into a debug macinfo section.
2189   emitDebugMacInfo();
2190
2191   // Emit inline info.
2192   emitDebugInlineInfo();
2193
2194   // Emit info into a debug str section.
2195   emitDebugStr();
2196
2197   // clean up.
2198   DeleteContainerSeconds(DeadFnScopeMap);
2199   for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2200          E = CUMap.end(); I != E; ++I)
2201     delete I->second;
2202   FirstCU = NULL;  // Reset for the next Module, if any.
2203 }
2204
2205 /// findAbstractVariable - Find abstract variable, if any, associated with Var.
2206 DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &Var,
2207                                               DebugLoc ScopeLoc) {
2208
2209   DbgVariable *AbsDbgVariable = AbstractVariables.lookup(Var);
2210   if (AbsDbgVariable)
2211     return AbsDbgVariable;
2212
2213   LLVMContext &Ctx = Var->getContext();
2214   DbgScope *Scope = AbstractScopes.lookup(ScopeLoc.getScope(Ctx));
2215   if (!Scope)
2216     return NULL;
2217
2218   AbsDbgVariable = new DbgVariable(Var);
2219   Scope->addVariable(AbsDbgVariable);
2220   AbstractVariables[Var] = AbsDbgVariable;
2221   return AbsDbgVariable;
2222 }
2223
2224 /// collectVariableInfoFromMMITable - Collect variable information from
2225 /// side table maintained by MMI.
2226 void
2227 DwarfDebug::collectVariableInfoFromMMITable(const MachineFunction * MF,
2228                                    SmallPtrSet<const MDNode *, 16> &Processed) {
2229   const LLVMContext &Ctx = Asm->MF->getFunction()->getContext();
2230   MachineModuleInfo::VariableDbgInfoMapTy &VMap = MMI->getVariableDbgInfo();
2231   for (MachineModuleInfo::VariableDbgInfoMapTy::iterator VI = VMap.begin(),
2232          VE = VMap.end(); VI != VE; ++VI) {
2233     const MDNode *Var = VI->first;
2234     if (!Var) continue;
2235     Processed.insert(Var);
2236     DIVariable DV(Var);
2237     const std::pair<unsigned, DebugLoc> &VP = VI->second;
2238
2239     DbgScope *Scope = 0;
2240     if (const MDNode *IA = VP.second.getInlinedAt(Ctx))
2241       Scope = ConcreteScopes.lookup(IA);
2242     if (Scope == 0)
2243       Scope = DbgScopeMap.lookup(VP.second.getScope(Ctx));
2244
2245     // If variable scope is not found then skip this variable.
2246     if (Scope == 0)
2247       continue;
2248
2249     DbgVariable *AbsDbgVariable = findAbstractVariable(DV, VP.second);
2250     DbgVariable *RegVar = new DbgVariable(DV);
2251     recordVariableFrameIndex(RegVar, VP.first);
2252     Scope->addVariable(RegVar);
2253     if (AbsDbgVariable) {
2254       recordVariableFrameIndex(AbsDbgVariable, VP.first);
2255       VarToAbstractVarMap[RegVar] = AbsDbgVariable;
2256     }
2257   }
2258 }
2259
2260 /// isDbgValueInDefinedReg - Return true if debug value, encoded by
2261 /// DBG_VALUE instruction, is in a defined reg.
2262 static bool isDbgValueInDefinedReg(const MachineInstr *MI) {
2263   assert (MI->isDebugValue() && "Invalid DBG_VALUE machine instruction!");
2264   if (MI->getOperand(0).isReg() && MI->getOperand(0).getReg())
2265     return true;
2266   return false;
2267 }
2268
2269 /// collectVariableInfo - Populate DbgScope entries with variables' info.
2270 void
2271 DwarfDebug::collectVariableInfo(const MachineFunction *MF,
2272                                 SmallPtrSet<const MDNode *, 16> &Processed) {
2273
2274   /// collection info from MMI table.
2275   collectVariableInfoFromMMITable(MF, Processed);
2276
2277   SmallVector<const MachineInstr *, 8> DbgValues;
2278   // Collect variable information from DBG_VALUE machine instructions;
2279   for (MachineFunction::const_iterator I = Asm->MF->begin(), E = Asm->MF->end();
2280        I != E; ++I)
2281     for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2282          II != IE; ++II) {
2283       const MachineInstr *MInsn = II;
2284       if (!MInsn->isDebugValue())
2285         continue;
2286       DbgValues.push_back(MInsn);
2287     }
2288
2289   // This is a collection of DBV_VALUE instructions describing same variable.
2290   SmallVector<const MachineInstr *, 4> MultipleValues;
2291   for(SmallVector<const MachineInstr *, 8>::iterator I = DbgValues.begin(),
2292         E = DbgValues.end(); I != E; ++I) {
2293     const MachineInstr *MInsn = *I;
2294     MultipleValues.clear();
2295     if (isDbgValueInDefinedReg(MInsn))
2296       MultipleValues.push_back(MInsn);
2297     DIVariable DV(MInsn->getOperand(MInsn->getNumOperands() - 1).getMetadata());
2298     if (Processed.count(DV) != 0)
2299       continue;
2300
2301     const MachineInstr *PrevMI = MInsn;
2302     for (SmallVector<const MachineInstr *, 8>::iterator MI = I+1,
2303            ME = DbgValues.end(); MI != ME; ++MI) {
2304       const MDNode *Var =
2305         (*MI)->getOperand((*MI)->getNumOperands()-1).getMetadata();
2306       if (Var == DV && 
2307           !PrevMI->isIdenticalTo(*MI))
2308         MultipleValues.push_back(*MI);
2309       PrevMI = *MI;
2310     }
2311
2312     DbgScope *Scope = NULL;
2313     if (DV.getTag() == dwarf::DW_TAG_arg_variable &&
2314         DISubprogram(DV.getContext()).describes(MF->getFunction()))
2315       Scope = CurrentFnDbgScope;
2316     else
2317       Scope = findDbgScope(MInsn);
2318     // If variable scope is not found then skip this variable.
2319     if (!Scope)
2320       continue;
2321
2322     Processed.insert(DV);
2323     DbgVariable *RegVar = new DbgVariable(DV);
2324     Scope->addVariable(RegVar);
2325     if (DbgVariable *AbsVar = findAbstractVariable(DV, MInsn->getDebugLoc())) {
2326       DbgVariableToDbgInstMap[AbsVar] = MInsn;
2327       VarToAbstractVarMap[RegVar] = AbsVar;
2328     }
2329     if (MultipleValues.size() <= 1) {
2330       DbgVariableToDbgInstMap[RegVar] = MInsn;
2331       continue;
2332     }
2333
2334     // handle multiple DBG_VALUE instructions describing one variable.
2335     if (DotDebugLocEntries.empty())
2336       RegVar->setDotDebugLocOffset(0);
2337     else
2338       RegVar->setDotDebugLocOffset(DotDebugLocEntries.size());
2339     const MachineInstr *Begin = NULL;
2340     const MachineInstr *End = NULL;
2341     for (SmallVector<const MachineInstr *, 4>::iterator
2342            MVI = MultipleValues.begin(), MVE = MultipleValues.end();
2343          MVI != MVE; ++MVI) {
2344       if (!Begin) {
2345         Begin = *MVI;
2346         continue;
2347       }
2348       End = *MVI;
2349       MachineLocation MLoc;
2350       if (Begin->getNumOperands() == 3) {
2351         if (Begin->getOperand(0).isReg() && Begin->getOperand(1).isImm())
2352           MLoc.set(Begin->getOperand(0).getReg(), Begin->getOperand(1).getImm());
2353       } else
2354         MLoc = Asm->getDebugValueLocation(Begin);
2355
2356       const MCSymbol *FLabel = getLabelBeforeInsn(Begin);
2357       const MCSymbol *SLabel = getLabelBeforeInsn(End);
2358       if (MLoc.getReg())
2359         DotDebugLocEntries.push_back(DotDebugLocEntry(FLabel, SLabel, MLoc));
2360
2361       Begin = End;
2362       if (MVI + 1 == MVE) {
2363         // If End is the last instruction then its value is valid
2364         // until the end of the funtion.
2365         MachineLocation EMLoc;
2366         if (End->getNumOperands() == 3) {
2367           if (End->getOperand(0).isReg() && Begin->getOperand(1).isImm())
2368           EMLoc.set(Begin->getOperand(0).getReg(), Begin->getOperand(1).getImm());
2369         } else
2370           EMLoc = Asm->getDebugValueLocation(End);
2371         if (EMLoc.getReg()) 
2372           DotDebugLocEntries.
2373             push_back(DotDebugLocEntry(SLabel, FunctionEndSym, EMLoc));
2374       }
2375     }
2376     DotDebugLocEntries.push_back(DotDebugLocEntry());
2377   }
2378
2379   // Collect info for variables that were optimized out.
2380   const Function *F = MF->getFunction();
2381   if (NamedMDNode *NMD = getFnSpecificMDNode(*(F->getParent()), F->getName())) {
2382     for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
2383       DIVariable DV(cast<MDNode>(NMD->getOperand(i)));
2384       if (!DV || !Processed.insert(DV))
2385         continue;
2386       DbgScope *Scope = DbgScopeMap.lookup(DV.getContext());
2387       if (Scope)
2388         Scope->addVariable(new DbgVariable(DV));
2389     }
2390   }
2391 }
2392
2393 /// getLabelBeforeInsn - Return Label preceding the instruction.
2394 const MCSymbol *DwarfDebug::getLabelBeforeInsn(const MachineInstr *MI) {
2395   DenseMap<const MachineInstr *, MCSymbol *>::iterator I =
2396     LabelsBeforeInsn.find(MI);
2397   if (I == LabelsBeforeInsn.end())
2398     // FunctionBeginSym always preceeds all the instruction in current function.
2399     return FunctionBeginSym;
2400   return I->second;
2401 }
2402
2403 /// getLabelAfterInsn - Return Label immediately following the instruction.
2404 const MCSymbol *DwarfDebug::getLabelAfterInsn(const MachineInstr *MI) {
2405   DenseMap<const MachineInstr *, MCSymbol *>::iterator I =
2406     LabelsAfterInsn.find(MI);
2407   if (I == LabelsAfterInsn.end())
2408     return NULL;
2409   return I->second;
2410 }
2411
2412 /// beginInstruction - Process beginning of an instruction.
2413 void DwarfDebug::beginInstruction(const MachineInstr *MI) {
2414   if (InsnNeedsLabel.count(MI) == 0) {
2415     LabelsBeforeInsn[MI] = PrevLabel;
2416     return;
2417   }
2418
2419   // Check location.
2420   DebugLoc DL = MI->getDebugLoc();
2421   if (!DL.isUnknown()) {
2422     const MDNode *Scope = DL.getScope(Asm->MF->getFunction()->getContext());
2423     PrevLabel = recordSourceLine(DL.getLine(), DL.getCol(), Scope);
2424     PrevInstLoc = DL;
2425     LabelsBeforeInsn[MI] = PrevLabel;
2426     return;
2427   }
2428
2429   // If location is unknown then use temp label for this DBG_VALUE
2430   // instruction.
2431   if (MI->isDebugValue()) {
2432     PrevLabel = MMI->getContext().CreateTempSymbol();
2433     Asm->OutStreamer.EmitLabel(PrevLabel);
2434     LabelsBeforeInsn[MI] = PrevLabel;
2435     return;
2436   }
2437
2438   if (UnknownLocations) {
2439     PrevLabel = recordSourceLine(0, 0, 0);
2440     LabelsBeforeInsn[MI] = PrevLabel;
2441     return;
2442   }
2443
2444   assert (0 && "Instruction is not processed!");
2445 }
2446
2447 /// endInstruction - Process end of an instruction.
2448 void DwarfDebug::endInstruction(const MachineInstr *MI) {
2449   if (InsnsEndScopeSet.count(MI) != 0) {
2450     // Emit a label if this instruction ends a scope.
2451     MCSymbol *Label = MMI->getContext().CreateTempSymbol();
2452     Asm->OutStreamer.EmitLabel(Label);
2453     LabelsAfterInsn[MI] = Label;
2454   }
2455 }
2456
2457 /// getOrCreateDbgScope - Create DbgScope for the scope.
2458 DbgScope *DwarfDebug::getOrCreateDbgScope(const MDNode *Scope,
2459                                           const MDNode *InlinedAt) {
2460   if (!InlinedAt) {
2461     DbgScope *WScope = DbgScopeMap.lookup(Scope);
2462     if (WScope)
2463       return WScope;
2464     WScope = new DbgScope(NULL, DIDescriptor(Scope), NULL);
2465     DbgScopeMap.insert(std::make_pair(Scope, WScope));
2466     if (DIDescriptor(Scope).isLexicalBlock()) {
2467       DbgScope *Parent =
2468         getOrCreateDbgScope(DILexicalBlock(Scope).getContext(), NULL);
2469       WScope->setParent(Parent);
2470       Parent->addScope(WScope);
2471     }
2472
2473     if (!WScope->getParent()) {
2474       StringRef SPName = DISubprogram(Scope).getLinkageName();
2475       // We used to check only for a linkage name, but that fails
2476       // since we began omitting the linkage name for private
2477       // functions.  The new way is to check for the name in metadata,
2478       // but that's not supported in old .ll test cases.  Ergo, we
2479       // check both.
2480       if (SPName == Asm->MF->getFunction()->getName() ||
2481           DISubprogram(Scope).getFunction() == Asm->MF->getFunction())
2482         CurrentFnDbgScope = WScope;
2483     }
2484
2485     return WScope;
2486   }
2487
2488   getOrCreateAbstractScope(Scope);
2489   DbgScope *WScope = DbgScopeMap.lookup(InlinedAt);
2490   if (WScope)
2491     return WScope;
2492
2493   WScope = new DbgScope(NULL, DIDescriptor(Scope), InlinedAt);
2494   DbgScopeMap.insert(std::make_pair(InlinedAt, WScope));
2495   DILocation DL(InlinedAt);
2496   DbgScope *Parent =
2497     getOrCreateDbgScope(DL.getScope(), DL.getOrigLocation());
2498   WScope->setParent(Parent);
2499   Parent->addScope(WScope);
2500
2501   ConcreteScopes[InlinedAt] = WScope;
2502
2503   return WScope;
2504 }
2505
2506 /// hasValidLocation - Return true if debug location entry attached with
2507 /// machine instruction encodes valid location info.
2508 static bool hasValidLocation(LLVMContext &Ctx,
2509                              const MachineInstr *MInsn,
2510                              const MDNode *&Scope, const MDNode *&InlinedAt) {
2511   DebugLoc DL = MInsn->getDebugLoc();
2512   if (DL.isUnknown()) return false;
2513
2514   const MDNode *S = DL.getScope(Ctx);
2515
2516   // There is no need to create another DIE for compile unit. For all
2517   // other scopes, create one DbgScope now. This will be translated
2518   // into a scope DIE at the end.
2519   if (DIScope(S).isCompileUnit()) return false;
2520
2521   Scope = S;
2522   InlinedAt = DL.getInlinedAt(Ctx);
2523   return true;
2524 }
2525
2526 /// calculateDominanceGraph - Calculate dominance graph for DbgScope
2527 /// hierarchy.
2528 static void calculateDominanceGraph(DbgScope *Scope) {
2529   assert (Scope && "Unable to calculate scop edominance graph!");
2530   SmallVector<DbgScope *, 4> WorkStack;
2531   WorkStack.push_back(Scope);
2532   unsigned Counter = 0;
2533   while (!WorkStack.empty()) {
2534     DbgScope *WS = WorkStack.back();
2535     const SmallVector<DbgScope *, 4> &Children = WS->getScopes();
2536     bool visitedChildren = false;
2537     for (SmallVector<DbgScope *, 4>::const_iterator SI = Children.begin(),
2538            SE = Children.end(); SI != SE; ++SI) {
2539       DbgScope *ChildScope = *SI;
2540       if (!ChildScope->getDFSOut()) {
2541         WorkStack.push_back(ChildScope);
2542         visitedChildren = true;
2543         ChildScope->setDFSIn(++Counter);
2544         break;
2545       }
2546     }
2547     if (!visitedChildren) {
2548       WorkStack.pop_back();
2549       WS->setDFSOut(++Counter);
2550     }
2551   }
2552 }
2553
2554 /// printDbgScopeInfo - Print DbgScope info for each machine instruction.
2555 static
2556 void printDbgScopeInfo(LLVMContext &Ctx, const MachineFunction *MF,
2557                        DenseMap<const MachineInstr *, DbgScope *> &MI2ScopeMap)
2558 {
2559 #ifndef NDEBUG
2560   unsigned PrevDFSIn = 0;
2561   for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2562        I != E; ++I) {
2563     for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2564          II != IE; ++II) {
2565       const MachineInstr *MInsn = II;
2566       const MDNode *Scope = NULL;
2567       const MDNode *InlinedAt = NULL;
2568
2569       // Check if instruction has valid location information.
2570       if (hasValidLocation(Ctx, MInsn, Scope, InlinedAt)) {
2571         dbgs() << " [ ";
2572         if (InlinedAt)
2573           dbgs() << "*";
2574         DenseMap<const MachineInstr *, DbgScope *>::iterator DI =
2575           MI2ScopeMap.find(MInsn);
2576         if (DI != MI2ScopeMap.end()) {
2577           DbgScope *S = DI->second;
2578           dbgs() << S->getDFSIn();
2579           PrevDFSIn = S->getDFSIn();
2580         } else
2581           dbgs() << PrevDFSIn;
2582       } else
2583         dbgs() << " [ x" << PrevDFSIn;
2584       dbgs() << " ]";
2585       MInsn->dump();
2586     }
2587     dbgs() << "\n";
2588   }
2589 #endif
2590 }
2591 /// extractScopeInformation - Scan machine instructions in this function
2592 /// and collect DbgScopes. Return true, if at least one scope was found.
2593 bool DwarfDebug::extractScopeInformation() {
2594   // If scope information was extracted using .dbg intrinsics then there is not
2595   // any need to extract these information by scanning each instruction.
2596   if (!DbgScopeMap.empty())
2597     return false;
2598
2599   // Scan each instruction and create scopes. First build working set of scopes.
2600   LLVMContext &Ctx = Asm->MF->getFunction()->getContext();
2601   SmallVector<DbgRange, 4> MIRanges;
2602   DenseMap<const MachineInstr *, DbgScope *> MI2ScopeMap;
2603   const MDNode *PrevScope = NULL;
2604   const MDNode *PrevInlinedAt = NULL;
2605   const MachineInstr *RangeBeginMI = NULL;
2606   const MachineInstr *PrevMI = NULL;
2607   for (MachineFunction::const_iterator I = Asm->MF->begin(), E = Asm->MF->end();
2608        I != E; ++I) {
2609     for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2610          II != IE; ++II) {
2611       const MachineInstr *MInsn = II;
2612       const MDNode *Scope = NULL;
2613       const MDNode *InlinedAt = NULL;
2614
2615       // Check if instruction has valid location information.
2616       if (!hasValidLocation(Ctx, MInsn, Scope, InlinedAt)) {
2617         PrevMI = MInsn;
2618         continue;
2619       }
2620
2621       // If scope has not changed then skip this instruction.
2622       if (Scope == PrevScope && PrevInlinedAt == InlinedAt) {
2623         PrevMI = MInsn;
2624         continue;
2625       }
2626
2627       if (RangeBeginMI) {
2628         // If we have alread seen a beginning of a instruction range and
2629         // current instruction scope does not match scope of first instruction
2630         // in this range then create a new instruction range.
2631         DbgRange R(RangeBeginMI, PrevMI);
2632         MI2ScopeMap[RangeBeginMI] = getOrCreateDbgScope(PrevScope,
2633                                                         PrevInlinedAt);
2634         MIRanges.push_back(R);
2635       }
2636
2637       // This is a beginning of a new instruction range.
2638       RangeBeginMI = MInsn;
2639
2640       // Reset previous markers.
2641       PrevMI = MInsn;
2642       PrevScope = Scope;
2643       PrevInlinedAt = InlinedAt;
2644     }
2645   }
2646
2647   // Create last instruction range.
2648   if (RangeBeginMI && PrevMI && PrevScope) {
2649     DbgRange R(RangeBeginMI, PrevMI);
2650     MIRanges.push_back(R);
2651     MI2ScopeMap[RangeBeginMI] = getOrCreateDbgScope(PrevScope, PrevInlinedAt);
2652   }
2653
2654   if (!CurrentFnDbgScope)
2655     return false;
2656
2657   calculateDominanceGraph(CurrentFnDbgScope);
2658   if (PrintDbgScope)
2659     printDbgScopeInfo(Ctx, Asm->MF, MI2ScopeMap);
2660
2661   // Find ranges of instructions covered by each DbgScope;
2662   DbgScope *PrevDbgScope = NULL;
2663   for (SmallVector<DbgRange, 4>::const_iterator RI = MIRanges.begin(),
2664          RE = MIRanges.end(); RI != RE; ++RI) {
2665     const DbgRange &R = *RI;
2666     DbgScope *S = MI2ScopeMap.lookup(R.first);
2667     assert (S && "Lost DbgScope for a machine instruction!");
2668     if (PrevDbgScope && !PrevDbgScope->dominates(S))
2669       PrevDbgScope->closeInsnRange(S);
2670     S->openInsnRange(R.first);
2671     S->extendInsnRange(R.second);
2672     PrevDbgScope = S;
2673   }
2674
2675   if (PrevDbgScope)
2676     PrevDbgScope->closeInsnRange();
2677
2678   identifyScopeMarkers();
2679
2680   return !DbgScopeMap.empty();
2681 }
2682
2683 /// identifyScopeMarkers() -
2684 /// Each DbgScope has first instruction and last instruction to mark beginning
2685 /// and end of a scope respectively. Create an inverse map that list scopes
2686 /// starts (and ends) with an instruction. One instruction may start (or end)
2687 /// multiple scopes. Ignore scopes that are not reachable.
2688 void DwarfDebug::identifyScopeMarkers() {
2689   SmallVector<DbgScope *, 4> WorkList;
2690   WorkList.push_back(CurrentFnDbgScope);
2691   while (!WorkList.empty()) {
2692     DbgScope *S = WorkList.pop_back_val();
2693
2694     const SmallVector<DbgScope *, 4> &Children = S->getScopes();
2695     if (!Children.empty())
2696       for (SmallVector<DbgScope *, 4>::const_iterator SI = Children.begin(),
2697              SE = Children.end(); SI != SE; ++SI)
2698         WorkList.push_back(*SI);
2699
2700     if (S->isAbstractScope())
2701       continue;
2702
2703     const SmallVector<DbgRange, 4> &Ranges = S->getRanges();
2704     if (Ranges.empty())
2705       continue;
2706     for (SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin(),
2707            RE = Ranges.end(); RI != RE; ++RI) {
2708       assert(RI->first && "DbgRange does not have first instruction!");
2709       assert(RI->second && "DbgRange does not have second instruction!");
2710       InsnsEndScopeSet.insert(RI->second);
2711     }
2712   }
2713 }
2714
2715 /// FindFirstDebugLoc - Find the first debug location in the function. This
2716 /// is intended to be an approximation for the source position of the
2717 /// beginning of the function.
2718 static DebugLoc FindFirstDebugLoc(const MachineFunction *MF) {
2719   for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2720        I != E; ++I)
2721     for (MachineBasicBlock::const_iterator MBBI = I->begin(), MBBE = I->end();
2722          MBBI != MBBE; ++MBBI) {
2723       DebugLoc DL = MBBI->getDebugLoc();
2724       if (!DL.isUnknown())
2725         return DL;
2726     }
2727   return DebugLoc();
2728 }
2729
2730 #ifndef NDEBUG
2731 /// CheckLineNumbers - Count basicblocks whose instructions do not have any
2732 /// line number information.
2733 static void CheckLineNumbers(const MachineFunction *MF) {
2734   for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2735        I != E; ++I) {
2736     bool FoundLineNo = false;
2737     for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2738          II != IE; ++II) {
2739       const MachineInstr *MI = II;
2740       if (!MI->getDebugLoc().isUnknown()) {
2741         FoundLineNo = true;
2742         break;
2743       }
2744     }
2745     if (!FoundLineNo && I->size())
2746       ++BlocksWithoutLineNo;      
2747   }
2748 }
2749 #endif
2750
2751 /// beginFunction - Gather pre-function debug information.  Assumes being
2752 /// emitted immediately after the function entry point.
2753 void DwarfDebug::beginFunction(const MachineFunction *MF) {
2754   if (!MMI->hasDebugInfo()) return;
2755   if (!extractScopeInformation()) return;
2756
2757 #ifndef NDEBUG
2758   CheckLineNumbers(MF);
2759 #endif
2760
2761   FunctionBeginSym = Asm->GetTempSymbol("func_begin",
2762                                         Asm->getFunctionNumber());
2763   // Assumes in correct section after the entry point.
2764   Asm->OutStreamer.EmitLabel(FunctionBeginSym);
2765
2766   // Emit label for the implicitly defined dbg.stoppoint at the start of the
2767   // function.
2768   DebugLoc FDL = FindFirstDebugLoc(MF);
2769   if (FDL.isUnknown()) return;
2770
2771   const MDNode *Scope = FDL.getScope(MF->getFunction()->getContext());
2772   const MDNode *TheScope = 0;
2773
2774   DISubprogram SP = getDISubprogram(Scope);
2775   unsigned Line, Col;
2776   if (SP.Verify()) {
2777     Line = SP.getLineNumber();
2778     Col = 0;
2779     TheScope = SP;
2780   } else {
2781     Line = FDL.getLine();
2782     Col = FDL.getCol();
2783     TheScope = Scope;
2784   }
2785
2786   recordSourceLine(Line, Col, TheScope);
2787
2788   /// ProcessedArgs - Collection of arguments already processed.
2789   SmallPtrSet<const MDNode *, 8> ProcessedArgs;
2790
2791   DebugLoc PrevLoc;
2792   for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2793        I != E; ++I)
2794     for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2795          II != IE; ++II) {
2796       const MachineInstr *MI = II;
2797       DebugLoc DL = MI->getDebugLoc();
2798       if (MI->isDebugValue()) {
2799         assert (MI->getNumOperands() > 1 && "Invalid machine instruction!");
2800         DIVariable DV(MI->getOperand(MI->getNumOperands() - 1).getMetadata());
2801         if (!DV.Verify()) continue;
2802         // If DBG_VALUE is for a local variable then it needs a label.
2803         if (DV.getTag() != dwarf::DW_TAG_arg_variable)
2804           InsnNeedsLabel.insert(MI);
2805         // DBG_VALUE for inlined functions argument needs a label.
2806         else if (!DISubprogram(getDISubprogram(DV.getContext())).
2807                  describes(MF->getFunction()))
2808           InsnNeedsLabel.insert(MI);
2809         // DBG_VALUE indicating argument location change needs a label.
2810         else if (!ProcessedArgs.insert(DV))
2811           InsnNeedsLabel.insert(MI);
2812       } else {
2813         // If location is unknown then instruction needs a location only if
2814         // UnknownLocations flag is set.
2815         if (DL.isUnknown()) {
2816           if (UnknownLocations && !PrevLoc.isUnknown())
2817             InsnNeedsLabel.insert(MI);
2818         } else if (DL != PrevLoc)
2819           // Otherwise, instruction needs a location only if it is new location.
2820           InsnNeedsLabel.insert(MI);
2821       }
2822
2823       if (!DL.isUnknown() || UnknownLocations)
2824         PrevLoc = DL;
2825     }
2826
2827   PrevLabel = FunctionBeginSym;
2828 }
2829
2830 /// endFunction - Gather and emit post-function debug information.
2831 ///
2832 void DwarfDebug::endFunction(const MachineFunction *MF) {
2833   if (!MMI->hasDebugInfo() || DbgScopeMap.empty()) return;
2834
2835   if (CurrentFnDbgScope) {
2836
2837     // Define end label for subprogram.
2838     FunctionEndSym = Asm->GetTempSymbol("func_end",
2839                                         Asm->getFunctionNumber());
2840     // Assumes in correct section after the entry point.
2841     Asm->OutStreamer.EmitLabel(FunctionEndSym);
2842
2843     SmallPtrSet<const MDNode *, 16> ProcessedVars;
2844     collectVariableInfo(MF, ProcessedVars);
2845
2846     // Construct abstract scopes.
2847     for (SmallVector<DbgScope *, 4>::iterator AI = AbstractScopesList.begin(),
2848            AE = AbstractScopesList.end(); AI != AE; ++AI) {
2849       DISubprogram SP((*AI)->getScopeNode());
2850       if (SP.Verify()) {
2851         // Collect info for variables that were optimized out.
2852         StringRef FName = SP.getLinkageName();
2853         if (FName.empty())
2854           FName = SP.getName();
2855         if (NamedMDNode *NMD = 
2856             getFnSpecificMDNode(*(MF->getFunction()->getParent()), FName)) {
2857           for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
2858           DIVariable DV(cast<MDNode>(NMD->getOperand(i)));
2859           if (!DV || !ProcessedVars.insert(DV))
2860             continue;
2861           DbgScope *Scope = AbstractScopes.lookup(DV.getContext());
2862           if (Scope)
2863             Scope->addVariable(new DbgVariable(DV));
2864           }
2865         }
2866       }
2867       if (ProcessedSPNodes.count((*AI)->getScopeNode()) == 0)
2868         constructScopeDIE(*AI);
2869     }
2870
2871     DIE *CurFnDIE = constructScopeDIE(CurrentFnDbgScope);
2872
2873     if (!DisableFramePointerElim(*MF))
2874       addUInt(CurFnDIE, dwarf::DW_AT_APPLE_omit_frame_ptr,
2875               dwarf::DW_FORM_flag, 1);
2876
2877
2878     DebugFrames.push_back(FunctionDebugFrameInfo(Asm->getFunctionNumber(),
2879                                                  MMI->getFrameMoves()));
2880   }
2881
2882   // Clear debug info
2883   CurrentFnDbgScope = NULL;
2884   InsnNeedsLabel.clear();
2885   DbgVariableToFrameIndexMap.clear();
2886   VarToAbstractVarMap.clear();
2887   DbgVariableToDbgInstMap.clear();
2888   DeleteContainerSeconds(DbgScopeMap);
2889   InsnsEndScopeSet.clear();
2890   ConcreteScopes.clear();
2891   DeleteContainerSeconds(AbstractScopes);
2892   AbstractScopesList.clear();
2893   AbstractVariables.clear();
2894   LabelsBeforeInsn.clear();
2895   LabelsAfterInsn.clear();
2896   PrevLabel = NULL;
2897 }
2898
2899 /// recordVariableFrameIndex - Record a variable's index.
2900 void DwarfDebug::recordVariableFrameIndex(const DbgVariable *V, int Index) {
2901   assert (V && "Invalid DbgVariable!");
2902   DbgVariableToFrameIndexMap[V] = Index;
2903 }
2904
2905 /// findVariableFrameIndex - Return true if frame index for the variable
2906 /// is found. Update FI to hold value of the index.
2907 bool DwarfDebug::findVariableFrameIndex(const DbgVariable *V, int *FI) {
2908   assert (V && "Invalid DbgVariable!");
2909   DenseMap<const DbgVariable *, int>::iterator I =
2910     DbgVariableToFrameIndexMap.find(V);
2911   if (I == DbgVariableToFrameIndexMap.end())
2912     return false;
2913   *FI = I->second;
2914   return true;
2915 }
2916
2917 /// findDbgScope - Find DbgScope for the debug loc attached with an
2918 /// instruction.
2919 DbgScope *DwarfDebug::findDbgScope(const MachineInstr *MInsn) {
2920   DbgScope *Scope = NULL;
2921   LLVMContext &Ctx =
2922     MInsn->getParent()->getParent()->getFunction()->getContext();
2923   DebugLoc DL = MInsn->getDebugLoc();
2924
2925   if (DL.isUnknown())
2926     return Scope;
2927
2928   if (const MDNode *IA = DL.getInlinedAt(Ctx))
2929     Scope = ConcreteScopes.lookup(IA);
2930   if (Scope == 0)
2931     Scope = DbgScopeMap.lookup(DL.getScope(Ctx));
2932
2933   return Scope;
2934 }
2935
2936
2937 /// recordSourceLine - Register a source line with debug info. Returns the
2938 /// unique label that was emitted and which provides correspondence to
2939 /// the source line list.
2940 MCSymbol *DwarfDebug::recordSourceLine(unsigned Line, unsigned Col,
2941                                        const MDNode *S) {
2942   StringRef Fn;
2943
2944   unsigned Src = 1;
2945   if (S) {
2946     DIDescriptor Scope(S);
2947
2948     if (Scope.isCompileUnit()) {
2949       DICompileUnit CU(S);
2950       Fn = CU.getFilename();
2951     } else if (Scope.isFile()) {
2952       DIFile F(S);
2953       Fn = F.getFilename();
2954     } else if (Scope.isSubprogram()) {
2955       DISubprogram SP(S);
2956       Fn = SP.getFilename();
2957     } else if (Scope.isLexicalBlock()) {
2958       DILexicalBlock DB(S);
2959       Fn = DB.getFilename();
2960     } else
2961       assert(0 && "Unexpected scope info");
2962
2963     Src = GetOrCreateSourceID(Fn);
2964   }
2965
2966   Asm->OutStreamer.EmitDwarfLocDirective(Src, Line, Col, DWARF2_FLAG_IS_STMT,
2967                                          0, 0);
2968
2969   MCSymbol *Label = MMI->getContext().CreateTempSymbol();
2970   Asm->OutStreamer.EmitLabel(Label);
2971   return Label;
2972 }
2973
2974 //===----------------------------------------------------------------------===//
2975 // Emit Methods
2976 //===----------------------------------------------------------------------===//
2977
2978 /// computeSizeAndOffset - Compute the size and offset of a DIE.
2979 ///
2980 unsigned
2981 DwarfDebug::computeSizeAndOffset(DIE *Die, unsigned Offset, bool Last) {
2982   // Get the children.
2983   const std::vector<DIE *> &Children = Die->getChildren();
2984
2985   // If not last sibling and has children then add sibling offset attribute.
2986   if (!Last && !Children.empty())
2987     Die->addSiblingOffset(DIEValueAllocator);
2988
2989   // Record the abbreviation.
2990   assignAbbrevNumber(Die->getAbbrev());
2991
2992   // Get the abbreviation for this DIE.
2993   unsigned AbbrevNumber = Die->getAbbrevNumber();
2994   const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2995
2996   // Set DIE offset
2997   Die->setOffset(Offset);
2998
2999   // Start the size with the size of abbreviation code.
3000   Offset += MCAsmInfo::getULEB128Size(AbbrevNumber);
3001
3002   const SmallVector<DIEValue*, 32> &Values = Die->getValues();
3003   const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
3004
3005   // Size the DIE attribute values.
3006   for (unsigned i = 0, N = Values.size(); i < N; ++i)
3007     // Size attribute value.
3008     Offset += Values[i]->SizeOf(Asm, AbbrevData[i].getForm());
3009
3010   // Size the DIE children if any.
3011   if (!Children.empty()) {
3012     assert(Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes &&
3013            "Children flag not set");
3014
3015     for (unsigned j = 0, M = Children.size(); j < M; ++j)
3016       Offset = computeSizeAndOffset(Children[j], Offset, (j + 1) == M);
3017
3018     // End of children marker.
3019     Offset += sizeof(int8_t);
3020   }
3021
3022   Die->setSize(Offset - Die->getOffset());
3023   return Offset;
3024 }
3025
3026 /// computeSizeAndOffsets - Compute the size and offset of all the DIEs.
3027 ///
3028 void DwarfDebug::computeSizeAndOffsets() {
3029   unsigned PrevOffset = 0;
3030   for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
3031          E = CUMap.end(); I != E; ++I) {
3032     // Compute size of compile unit header.
3033     static unsigned Offset = PrevOffset +
3034       sizeof(int32_t) + // Length of Compilation Unit Info
3035       sizeof(int16_t) + // DWARF version number
3036       sizeof(int32_t) + // Offset Into Abbrev. Section
3037       sizeof(int8_t);   // Pointer Size (in bytes)
3038     computeSizeAndOffset(I->second->getCUDie(), Offset, true);
3039     PrevOffset = Offset;
3040   }
3041 }
3042
3043 /// EmitSectionSym - Switch to the specified MCSection and emit an assembler
3044 /// temporary label to it if SymbolStem is specified.
3045 static MCSymbol *EmitSectionSym(AsmPrinter *Asm, const MCSection *Section,
3046                                 const char *SymbolStem = 0) {
3047   Asm->OutStreamer.SwitchSection(Section);
3048   if (!SymbolStem) return 0;
3049
3050   MCSymbol *TmpSym = Asm->GetTempSymbol(SymbolStem);
3051   Asm->OutStreamer.EmitLabel(TmpSym);
3052   return TmpSym;
3053 }
3054
3055 /// EmitSectionLabels - Emit initial Dwarf sections with a label at
3056 /// the start of each one.
3057 void DwarfDebug::EmitSectionLabels() {
3058   const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
3059
3060   // Dwarf sections base addresses.
3061   if (Asm->MAI->doesDwarfRequireFrameSection()) {
3062     DwarfFrameSectionSym =
3063       EmitSectionSym(Asm, TLOF.getDwarfFrameSection(), "section_debug_frame");
3064    }
3065
3066   DwarfInfoSectionSym =
3067     EmitSectionSym(Asm, TLOF.getDwarfInfoSection(), "section_info");
3068   DwarfAbbrevSectionSym =
3069     EmitSectionSym(Asm, TLOF.getDwarfAbbrevSection(), "section_abbrev");
3070   EmitSectionSym(Asm, TLOF.getDwarfARangesSection());
3071
3072   if (const MCSection *MacroInfo = TLOF.getDwarfMacroInfoSection())
3073     EmitSectionSym(Asm, MacroInfo);
3074
3075   EmitSectionSym(Asm, TLOF.getDwarfLineSection(), "section_line");
3076   EmitSectionSym(Asm, TLOF.getDwarfLocSection());
3077   EmitSectionSym(Asm, TLOF.getDwarfPubNamesSection());
3078   EmitSectionSym(Asm, TLOF.getDwarfPubTypesSection());
3079   DwarfStrSectionSym =
3080     EmitSectionSym(Asm, TLOF.getDwarfStrSection(), "section_str");
3081   DwarfDebugRangeSectionSym = EmitSectionSym(Asm, TLOF.getDwarfRangesSection(),
3082                                              "debug_range");
3083
3084   DwarfDebugLocSectionSym = EmitSectionSym(Asm, TLOF.getDwarfLocSection(),
3085                                            "section_debug_loc");
3086
3087   TextSectionSym = EmitSectionSym(Asm, TLOF.getTextSection(), "text_begin");
3088   EmitSectionSym(Asm, TLOF.getDataSection());
3089 }
3090
3091 /// emitDIE - Recusively Emits a debug information entry.
3092 ///
3093 void DwarfDebug::emitDIE(DIE *Die) {
3094   // Get the abbreviation for this DIE.
3095   unsigned AbbrevNumber = Die->getAbbrevNumber();
3096   const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
3097
3098   // Emit the code (index) for the abbreviation.
3099   if (Asm->isVerbose())
3100     Asm->OutStreamer.AddComment("Abbrev [" + Twine(AbbrevNumber) + "] 0x" +
3101                                 Twine::utohexstr(Die->getOffset()) + ":0x" +
3102                                 Twine::utohexstr(Die->getSize()) + " " +
3103                                 dwarf::TagString(Abbrev->getTag()));
3104   Asm->EmitULEB128(AbbrevNumber);
3105
3106   const SmallVector<DIEValue*, 32> &Values = Die->getValues();
3107   const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
3108
3109   // Emit the DIE attribute values.
3110   for (unsigned i = 0, N = Values.size(); i < N; ++i) {
3111     unsigned Attr = AbbrevData[i].getAttribute();
3112     unsigned Form = AbbrevData[i].getForm();
3113     assert(Form && "Too many attributes for DIE (check abbreviation)");
3114
3115     if (Asm->isVerbose())
3116       Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr));
3117
3118     switch (Attr) {
3119     case dwarf::DW_AT_sibling:
3120       Asm->EmitInt32(Die->getSiblingOffset());
3121       break;
3122     case dwarf::DW_AT_abstract_origin: {
3123       DIEEntry *E = cast<DIEEntry>(Values[i]);
3124       DIE *Origin = E->getEntry();
3125       unsigned Addr = Origin->getOffset();
3126       Asm->EmitInt32(Addr);
3127       break;
3128     }
3129     case dwarf::DW_AT_ranges: {
3130       // DW_AT_range Value encodes offset in debug_range section.
3131       DIEInteger *V = cast<DIEInteger>(Values[i]);
3132
3133       if (Asm->MAI->doesDwarfUsesLabelOffsetForRanges()) {
3134         Asm->EmitLabelPlusOffset(DwarfDebugRangeSectionSym,
3135                                  V->getValue(),
3136                                  4);
3137       } else {
3138         Asm->EmitLabelOffsetDifference(DwarfDebugRangeSectionSym,
3139                                        V->getValue(),
3140                                        DwarfDebugRangeSectionSym,
3141                                        4);
3142       }
3143       break;
3144     }
3145     case dwarf::DW_AT_location: {
3146       if (UseDotDebugLocEntry.count(Die) != 0) {
3147         DIELabel *L = cast<DIELabel>(Values[i]);
3148         Asm->EmitLabelDifference(L->getValue(), DwarfDebugLocSectionSym, 4);
3149       } else
3150         Values[i]->EmitValue(Asm, Form);
3151       break;
3152     }
3153     case dwarf::DW_AT_accessibility: {
3154       if (Asm->isVerbose()) {
3155         DIEInteger *V = cast<DIEInteger>(Values[i]);
3156         Asm->OutStreamer.AddComment(dwarf::AccessibilityString(V->getValue()));
3157       }
3158       Values[i]->EmitValue(Asm, Form);
3159       break;
3160     }
3161     default:
3162       // Emit an attribute using the defined form.
3163       Values[i]->EmitValue(Asm, Form);
3164       break;
3165     }
3166   }
3167
3168   // Emit the DIE children if any.
3169   if (Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes) {
3170     const std::vector<DIE *> &Children = Die->getChildren();
3171
3172     for (unsigned j = 0, M = Children.size(); j < M; ++j)
3173       emitDIE(Children[j]);
3174
3175     if (Asm->isVerbose())
3176       Asm->OutStreamer.AddComment("End Of Children Mark");
3177     Asm->EmitInt8(0);
3178   }
3179 }
3180
3181 /// emitDebugInfo - Emit the debug info section.
3182 ///
3183 void DwarfDebug::emitDebugInfo() {
3184   // Start debug info section.
3185   Asm->OutStreamer.SwitchSection(
3186                             Asm->getObjFileLowering().getDwarfInfoSection());
3187   for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
3188          E = CUMap.end(); I != E; ++I) {
3189     CompileUnit *TheCU = I->second;
3190     DIE *Die = TheCU->getCUDie();
3191
3192     // Emit the compile units header.
3193     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_begin",
3194                                                   TheCU->getID()));
3195
3196     // Emit size of content not including length itself
3197     unsigned ContentSize = Die->getSize() +
3198       sizeof(int16_t) + // DWARF version number
3199       sizeof(int32_t) + // Offset Into Abbrev. Section
3200       sizeof(int8_t) +  // Pointer Size (in bytes)
3201       sizeof(int32_t);  // FIXME - extra pad for gdb bug.
3202
3203     Asm->OutStreamer.AddComment("Length of Compilation Unit Info");
3204     Asm->EmitInt32(ContentSize);
3205     Asm->OutStreamer.AddComment("DWARF version number");
3206     Asm->EmitInt16(dwarf::DWARF_VERSION);
3207     Asm->OutStreamer.AddComment("Offset Into Abbrev. Section");
3208     Asm->EmitSectionOffset(Asm->GetTempSymbol("abbrev_begin"),
3209                            DwarfAbbrevSectionSym);
3210     Asm->OutStreamer.AddComment("Address Size (in bytes)");
3211     Asm->EmitInt8(Asm->getTargetData().getPointerSize());
3212
3213     emitDIE(Die);
3214     // FIXME - extra padding for gdb bug.
3215     Asm->OutStreamer.AddComment("4 extra padding bytes for GDB");
3216     Asm->EmitInt8(0);
3217     Asm->EmitInt8(0);
3218     Asm->EmitInt8(0);
3219     Asm->EmitInt8(0);
3220     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_end", TheCU->getID()));
3221   }
3222 }
3223
3224 /// emitAbbreviations - Emit the abbreviation section.
3225 ///
3226 void DwarfDebug::emitAbbreviations() const {
3227   // Check to see if it is worth the effort.
3228   if (!Abbreviations.empty()) {
3229     // Start the debug abbrev section.
3230     Asm->OutStreamer.SwitchSection(
3231                             Asm->getObjFileLowering().getDwarfAbbrevSection());
3232
3233     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_begin"));
3234
3235     // For each abbrevation.
3236     for (unsigned i = 0, N = Abbreviations.size(); i < N; ++i) {
3237       // Get abbreviation data
3238       const DIEAbbrev *Abbrev = Abbreviations[i];
3239
3240       // Emit the abbrevations code (base 1 index.)
3241       Asm->EmitULEB128(Abbrev->getNumber(), "Abbreviation Code");
3242
3243       // Emit the abbreviations data.
3244       Abbrev->Emit(Asm);
3245     }
3246
3247     // Mark end of abbreviations.
3248     Asm->EmitULEB128(0, "EOM(3)");
3249
3250     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_end"));
3251   }
3252 }
3253
3254 /// emitEndOfLineMatrix - Emit the last address of the section and the end of
3255 /// the line matrix.
3256 ///
3257 void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) {
3258   // Define last address of section.
3259   Asm->OutStreamer.AddComment("Extended Op");
3260   Asm->EmitInt8(0);
3261
3262   Asm->OutStreamer.AddComment("Op size");
3263   Asm->EmitInt8(Asm->getTargetData().getPointerSize() + 1);
3264   Asm->OutStreamer.AddComment("DW_LNE_set_address");
3265   Asm->EmitInt8(dwarf::DW_LNE_set_address);
3266
3267   Asm->OutStreamer.AddComment("Section end label");
3268
3269   Asm->OutStreamer.EmitSymbolValue(Asm->GetTempSymbol("section_end",SectionEnd),
3270                                    Asm->getTargetData().getPointerSize(),
3271                                    0/*AddrSpace*/);
3272
3273   // Mark end of matrix.
3274   Asm->OutStreamer.AddComment("DW_LNE_end_sequence");
3275   Asm->EmitInt8(0);
3276   Asm->EmitInt8(1);
3277   Asm->EmitInt8(1);
3278 }
3279
3280 /// emitCommonDebugFrame - Emit common frame info into a debug frame section.
3281 ///
3282 void DwarfDebug::emitCommonDebugFrame() {
3283   if (!Asm->MAI->doesDwarfRequireFrameSection())
3284     return;
3285
3286   int stackGrowth = Asm->getTargetData().getPointerSize();
3287   if (Asm->TM.getFrameInfo()->getStackGrowthDirection() ==
3288       TargetFrameInfo::StackGrowsDown)
3289     stackGrowth *= -1;
3290
3291   // Start the dwarf frame section.
3292   Asm->OutStreamer.SwitchSection(
3293                               Asm->getObjFileLowering().getDwarfFrameSection());
3294
3295   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_frame_common"));
3296   Asm->OutStreamer.AddComment("Length of Common Information Entry");
3297   Asm->EmitLabelDifference(Asm->GetTempSymbol("debug_frame_common_end"),
3298                            Asm->GetTempSymbol("debug_frame_common_begin"), 4);
3299
3300   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_frame_common_begin"));
3301   Asm->OutStreamer.AddComment("CIE Identifier Tag");
3302   Asm->EmitInt32((int)dwarf::DW_CIE_ID);
3303   Asm->OutStreamer.AddComment("CIE Version");
3304   Asm->EmitInt8(dwarf::DW_CIE_VERSION);
3305   Asm->OutStreamer.AddComment("CIE Augmentation");
3306   Asm->OutStreamer.EmitIntValue(0, 1, /*addrspace*/0); // nul terminator.
3307   Asm->EmitULEB128(1, "CIE Code Alignment Factor");
3308   Asm->EmitSLEB128(stackGrowth, "CIE Data Alignment Factor");
3309   Asm->OutStreamer.AddComment("CIE RA Column");
3310   const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
3311   const TargetFrameInfo *TFI = Asm->TM.getFrameInfo();
3312   Asm->EmitInt8(RI->getDwarfRegNum(RI->getRARegister(), false));
3313
3314   std::vector<MachineMove> Moves;
3315   TFI->getInitialFrameState(Moves);
3316
3317   Asm->EmitFrameMoves(Moves, 0, false);
3318
3319   Asm->EmitAlignment(2);
3320   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_frame_common_end"));
3321 }
3322
3323 /// emitFunctionDebugFrame - Emit per function frame info into a debug frame
3324 /// section.
3325 void DwarfDebug::
3326 emitFunctionDebugFrame(const FunctionDebugFrameInfo &DebugFrameInfo) {
3327   if (!Asm->MAI->doesDwarfRequireFrameSection())
3328     return;
3329
3330   // Start the dwarf frame section.
3331   Asm->OutStreamer.SwitchSection(
3332                               Asm->getObjFileLowering().getDwarfFrameSection());
3333
3334   Asm->OutStreamer.AddComment("Length of Frame Information Entry");
3335   MCSymbol *DebugFrameBegin =
3336     Asm->GetTempSymbol("debug_frame_begin", DebugFrameInfo.Number);
3337   MCSymbol *DebugFrameEnd =
3338     Asm->GetTempSymbol("debug_frame_end", DebugFrameInfo.Number);
3339   Asm->EmitLabelDifference(DebugFrameEnd, DebugFrameBegin, 4);
3340
3341   Asm->OutStreamer.EmitLabel(DebugFrameBegin);
3342
3343   Asm->OutStreamer.AddComment("FDE CIE offset");
3344   Asm->EmitSectionOffset(Asm->GetTempSymbol("debug_frame_common"),
3345                          DwarfFrameSectionSym);
3346
3347   Asm->OutStreamer.AddComment("FDE initial location");
3348   MCSymbol *FuncBeginSym =
3349     Asm->GetTempSymbol("func_begin", DebugFrameInfo.Number);
3350   Asm->OutStreamer.EmitSymbolValue(FuncBeginSym,
3351                                    Asm->getTargetData().getPointerSize(),
3352                                    0/*AddrSpace*/);
3353
3354
3355   Asm->OutStreamer.AddComment("FDE address range");
3356   Asm->EmitLabelDifference(Asm->GetTempSymbol("func_end",DebugFrameInfo.Number),
3357                            FuncBeginSym, Asm->getTargetData().getPointerSize());
3358
3359   Asm->EmitFrameMoves(DebugFrameInfo.Moves, FuncBeginSym, false);
3360
3361   Asm->EmitAlignment(2);
3362   Asm->OutStreamer.EmitLabel(DebugFrameEnd);
3363 }
3364
3365 /// emitDebugPubNames - Emit visible names into a debug pubnames section.
3366 ///
3367 void DwarfDebug::emitDebugPubNames() {
3368   for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
3369          E = CUMap.end(); I != E; ++I) {
3370     CompileUnit *TheCU = I->second;
3371     // Start the dwarf pubnames section.
3372     Asm->OutStreamer.SwitchSection(
3373       Asm->getObjFileLowering().getDwarfPubNamesSection());
3374
3375     Asm->OutStreamer.AddComment("Length of Public Names Info");
3376     Asm->EmitLabelDifference(
3377       Asm->GetTempSymbol("pubnames_end", TheCU->getID()),
3378       Asm->GetTempSymbol("pubnames_begin", TheCU->getID()), 4);
3379
3380     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_begin",
3381                                                   TheCU->getID()));
3382
3383     Asm->OutStreamer.AddComment("DWARF Version");
3384     Asm->EmitInt16(dwarf::DWARF_VERSION);
3385
3386     Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
3387     Asm->EmitSectionOffset(Asm->GetTempSymbol("info_begin", TheCU->getID()),
3388                            DwarfInfoSectionSym);
3389
3390     Asm->OutStreamer.AddComment("Compilation Unit Length");
3391     Asm->EmitLabelDifference(Asm->GetTempSymbol("info_end", TheCU->getID()),
3392                              Asm->GetTempSymbol("info_begin", TheCU->getID()),
3393                              4);
3394
3395     const StringMap<DIE*> &Globals = TheCU->getGlobals();
3396     for (StringMap<DIE*>::const_iterator
3397            GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
3398       const char *Name = GI->getKeyData();
3399       DIE *Entity = GI->second;
3400
3401       Asm->OutStreamer.AddComment("DIE offset");
3402       Asm->EmitInt32(Entity->getOffset());
3403
3404       if (Asm->isVerbose())
3405         Asm->OutStreamer.AddComment("External Name");
3406       Asm->OutStreamer.EmitBytes(StringRef(Name, strlen(Name)+1), 0);
3407     }
3408
3409     Asm->OutStreamer.AddComment("End Mark");
3410     Asm->EmitInt32(0);
3411     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_end",
3412                                                 TheCU->getID()));
3413   }
3414 }
3415
3416 void DwarfDebug::emitDebugPubTypes() {
3417   for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
3418          E = CUMap.end(); I != E; ++I) {
3419     CompileUnit *TheCU = I->second;
3420     // Start the dwarf pubnames section.
3421     Asm->OutStreamer.SwitchSection(
3422       Asm->getObjFileLowering().getDwarfPubTypesSection());
3423     Asm->OutStreamer.AddComment("Length of Public Types Info");
3424     Asm->EmitLabelDifference(
3425       Asm->GetTempSymbol("pubtypes_end", TheCU->getID()),
3426       Asm->GetTempSymbol("pubtypes_begin", TheCU->getID()), 4);
3427
3428     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_begin",
3429                                                   TheCU->getID()));
3430
3431     if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DWARF Version");
3432     Asm->EmitInt16(dwarf::DWARF_VERSION);
3433
3434     Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
3435     Asm->EmitSectionOffset(Asm->GetTempSymbol("info_begin", TheCU->getID()),
3436                            DwarfInfoSectionSym);
3437
3438     Asm->OutStreamer.AddComment("Compilation Unit Length");
3439     Asm->EmitLabelDifference(Asm->GetTempSymbol("info_end", TheCU->getID()),
3440                              Asm->GetTempSymbol("info_begin", TheCU->getID()),
3441                              4);
3442
3443     const StringMap<DIE*> &Globals = TheCU->getGlobalTypes();
3444     for (StringMap<DIE*>::const_iterator
3445            GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
3446       const char *Name = GI->getKeyData();
3447       DIE * Entity = GI->second;
3448
3449       if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
3450       Asm->EmitInt32(Entity->getOffset());
3451
3452       if (Asm->isVerbose()) Asm->OutStreamer.AddComment("External Name");
3453       Asm->OutStreamer.EmitBytes(StringRef(Name, GI->getKeyLength()+1), 0);
3454     }
3455
3456     Asm->OutStreamer.AddComment("End Mark");
3457     Asm->EmitInt32(0);
3458     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_end",
3459                                                   TheCU->getID()));
3460   }
3461 }
3462
3463 /// emitDebugStr - Emit visible names into a debug str section.
3464 ///
3465 void DwarfDebug::emitDebugStr() {
3466   // Check to see if it is worth the effort.
3467   if (StringPool.empty()) return;
3468
3469   // Start the dwarf str section.
3470   Asm->OutStreamer.SwitchSection(
3471                                 Asm->getObjFileLowering().getDwarfStrSection());
3472
3473   // Get all of the string pool entries and put them in an array by their ID so
3474   // we can sort them.
3475   SmallVector<std::pair<unsigned,
3476       StringMapEntry<std::pair<MCSymbol*, unsigned> >*>, 64> Entries;
3477
3478   for (StringMap<std::pair<MCSymbol*, unsigned> >::iterator
3479        I = StringPool.begin(), E = StringPool.end(); I != E; ++I)
3480     Entries.push_back(std::make_pair(I->second.second, &*I));
3481
3482   array_pod_sort(Entries.begin(), Entries.end());
3483
3484   for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
3485     // Emit a label for reference from debug information entries.
3486     Asm->OutStreamer.EmitLabel(Entries[i].second->getValue().first);
3487
3488     // Emit the string itself.
3489     Asm->OutStreamer.EmitBytes(Entries[i].second->getKey(), 0/*addrspace*/);
3490   }
3491 }
3492
3493 /// emitDebugLoc - Emit visible names into a debug loc section.
3494 ///
3495 void DwarfDebug::emitDebugLoc() {
3496   if (DotDebugLocEntries.empty())
3497     return;
3498
3499   // Start the dwarf loc section.
3500   Asm->OutStreamer.SwitchSection(
3501     Asm->getObjFileLowering().getDwarfLocSection());
3502   unsigned char Size = Asm->getTargetData().getPointerSize();
3503   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", 0));
3504   unsigned index = 1;
3505   for (SmallVector<DotDebugLocEntry, 4>::iterator
3506          I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
3507        I != E; ++I, ++index) {
3508     DotDebugLocEntry Entry = *I;
3509     if (Entry.isEmpty()) {
3510       Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
3511       Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
3512       Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", index));
3513     } else {
3514       Asm->OutStreamer.EmitSymbolValue(Entry.Begin, Size, 0);
3515       Asm->OutStreamer.EmitSymbolValue(Entry.End, Size, 0);
3516       const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
3517       unsigned Reg = RI->getDwarfRegNum(Entry.Loc.getReg(), false);
3518       if (int Offset =  Entry.Loc.getOffset()) {
3519         // If the value is at a certain offset from frame register then
3520         // use DW_OP_fbreg.
3521         unsigned OffsetSize = Offset ? MCAsmInfo::getSLEB128Size(Offset) : 1;
3522         Asm->OutStreamer.AddComment("Loc expr size");
3523         Asm->EmitInt16(1 + OffsetSize);
3524         Asm->OutStreamer.AddComment(
3525           dwarf::OperationEncodingString(dwarf::DW_OP_fbreg));
3526         Asm->EmitInt8(dwarf::DW_OP_fbreg);
3527         Asm->OutStreamer.AddComment("Offset");
3528         Asm->EmitSLEB128(Offset);
3529       } else {
3530         if (Reg < 32) {
3531           Asm->OutStreamer.AddComment("Loc expr size");
3532           Asm->EmitInt16(1);
3533           Asm->OutStreamer.AddComment(
3534             dwarf::OperationEncodingString(dwarf::DW_OP_reg0 + Reg));
3535           Asm->EmitInt8(dwarf::DW_OP_reg0 + Reg);
3536         } else {
3537           Asm->OutStreamer.AddComment("Loc expr size");
3538           Asm->EmitInt16(1 + MCAsmInfo::getULEB128Size(Reg));
3539           Asm->EmitInt8(dwarf::DW_OP_regx);
3540           Asm->EmitULEB128(Reg);
3541         }
3542       }
3543     }
3544   }
3545 }
3546
3547 /// EmitDebugARanges - Emit visible names into a debug aranges section.
3548 ///
3549 void DwarfDebug::EmitDebugARanges() {
3550   // Start the dwarf aranges section.
3551   Asm->OutStreamer.SwitchSection(
3552                           Asm->getObjFileLowering().getDwarfARangesSection());
3553 }
3554
3555 /// emitDebugRanges - Emit visible names into a debug ranges section.
3556 ///
3557 void DwarfDebug::emitDebugRanges() {
3558   // Start the dwarf ranges section.
3559   Asm->OutStreamer.SwitchSection(
3560     Asm->getObjFileLowering().getDwarfRangesSection());
3561   unsigned char Size = Asm->getTargetData().getPointerSize();
3562   for (SmallVector<const MCSymbol *, 8>::iterator
3563          I = DebugRangeSymbols.begin(), E = DebugRangeSymbols.end();
3564        I != E; ++I) {
3565     if (*I)
3566       Asm->OutStreamer.EmitSymbolValue(const_cast<MCSymbol*>(*I), Size, 0);
3567     else
3568       Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
3569   }
3570 }
3571
3572 /// emitDebugMacInfo - Emit visible names into a debug macinfo section.
3573 ///
3574 void DwarfDebug::emitDebugMacInfo() {
3575   if (const MCSection *LineInfo =
3576       Asm->getObjFileLowering().getDwarfMacroInfoSection()) {
3577     // Start the dwarf macinfo section.
3578     Asm->OutStreamer.SwitchSection(LineInfo);
3579   }
3580 }
3581
3582 /// emitDebugInlineInfo - Emit inline info using following format.
3583 /// Section Header:
3584 /// 1. length of section
3585 /// 2. Dwarf version number
3586 /// 3. address size.
3587 ///
3588 /// Entries (one "entry" for each function that was inlined):
3589 ///
3590 /// 1. offset into __debug_str section for MIPS linkage name, if exists;
3591 ///   otherwise offset into __debug_str for regular function name.
3592 /// 2. offset into __debug_str section for regular function name.
3593 /// 3. an unsigned LEB128 number indicating the number of distinct inlining
3594 /// instances for the function.
3595 ///
3596 /// The rest of the entry consists of a {die_offset, low_pc} pair for each
3597 /// inlined instance; the die_offset points to the inlined_subroutine die in the
3598 /// __debug_info section, and the low_pc is the starting address for the
3599 /// inlining instance.
3600 void DwarfDebug::emitDebugInlineInfo() {
3601   if (!Asm->MAI->doesDwarfUsesInlineInfoSection())
3602     return;
3603
3604   if (!FirstCU)
3605     return;
3606
3607   Asm->OutStreamer.SwitchSection(
3608                         Asm->getObjFileLowering().getDwarfDebugInlineSection());
3609
3610   Asm->OutStreamer.AddComment("Length of Debug Inlined Information Entry");
3611   Asm->EmitLabelDifference(Asm->GetTempSymbol("debug_inlined_end", 1),
3612                            Asm->GetTempSymbol("debug_inlined_begin", 1), 4);
3613
3614   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_begin", 1));
3615
3616   Asm->OutStreamer.AddComment("Dwarf Version");
3617   Asm->EmitInt16(dwarf::DWARF_VERSION);
3618   Asm->OutStreamer.AddComment("Address Size (in bytes)");
3619   Asm->EmitInt8(Asm->getTargetData().getPointerSize());
3620
3621   for (SmallVector<const MDNode *, 4>::iterator I = InlinedSPNodes.begin(),
3622          E = InlinedSPNodes.end(); I != E; ++I) {
3623
3624     const MDNode *Node = *I;
3625     DenseMap<const MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator II
3626       = InlineInfo.find(Node);
3627     SmallVector<InlineInfoLabels, 4> &Labels = II->second;
3628     DISubprogram SP(Node);
3629     StringRef LName = SP.getLinkageName();
3630     StringRef Name = SP.getName();
3631
3632     Asm->OutStreamer.AddComment("MIPS linkage name");
3633     if (LName.empty()) {
3634       Asm->OutStreamer.EmitBytes(Name, 0);
3635       Asm->OutStreamer.EmitIntValue(0, 1, 0); // nul terminator.
3636     } else
3637       Asm->EmitSectionOffset(getStringPoolEntry(getRealLinkageName(LName)),
3638                              DwarfStrSectionSym);
3639
3640     Asm->OutStreamer.AddComment("Function name");
3641     Asm->EmitSectionOffset(getStringPoolEntry(Name), DwarfStrSectionSym);
3642     Asm->EmitULEB128(Labels.size(), "Inline count");
3643
3644     for (SmallVector<InlineInfoLabels, 4>::iterator LI = Labels.begin(),
3645            LE = Labels.end(); LI != LE; ++LI) {
3646       if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
3647       Asm->EmitInt32(LI->second->getOffset());
3648
3649       if (Asm->isVerbose()) Asm->OutStreamer.AddComment("low_pc");
3650       Asm->OutStreamer.EmitSymbolValue(LI->first,
3651                                        Asm->getTargetData().getPointerSize(),0);
3652     }
3653   }
3654
3655   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_end", 1));
3656 }