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