[Modules] Move ValueHandle into the IR library where Value itself lives.
[oota-llvm.git] / include / llvm / CodeGen / MachineModuleInfo.h
index 347254d125e14bf9d9aa3d0f235c9c16a7df99df..b51020654af558267e05629114433a44597d5f36 100644 (file)
 #ifndef LLVM_CODEGEN_MACHINEMODULEINFO_H
 #define LLVM_CODEGEN_MACHINEMODULEINFO_H
 
-#include "llvm/Support/Dwarf.h"
-#include "llvm/Support/DataTypes.h"
-#include "llvm/ADT/SmallVector.h"
 #include "llvm/ADT/DenseMap.h"
-#include "llvm/ADT/UniqueVector.h"
+#include "llvm/ADT/PointerIntPair.h"
 #include "llvm/ADT/SmallPtrSet.h"
-#include "llvm/ADT/StringMap.h"
-#include "llvm/CodeGen/MachineLocation.h"
-#include "llvm/GlobalValue.h"
+#include "llvm/ADT/SmallVector.h"
+#include "llvm/IR/Metadata.h"
+#include "llvm/IR/ValueHandle.h"
+#include "llvm/MC/MCContext.h"
+#include "llvm/MC/MachineLocation.h"
 #include "llvm/Pass.h"
+#include "llvm/Support/DataTypes.h"
+#include "llvm/Support/DebugLoc.h"
+#include "llvm/Support/Dwarf.h"
 
 namespace llvm {
 
 //===----------------------------------------------------------------------===//
 // Forward declarations.
 class Constant;
-class DebugInfoDesc;
 class GlobalVariable;
+class MDNode;
+class MMIAddrLabelMap;
 class MachineBasicBlock;
 class MachineFunction;
 class Module;
@@ -56,1164 +59,217 @@ class PointerType;
 class StructType;
 
 //===----------------------------------------------------------------------===//
-// Debug info constants.
-
-enum {
-  LLVMDebugVersion = (7 << 16),         // Current version of debug information.
-  LLVMDebugVersion6 = (6 << 16),        // Constant for version 6.
-  LLVMDebugVersion5 = (5 << 16),        // Constant for version 5.
-  LLVMDebugVersion4 = (4 << 16),        // Constant for version 4.
-  LLVMDebugVersionMask = 0xffff0000     // Mask for version number.
-};
-
-//===----------------------------------------------------------------------===//
-/// DIVisitor - Subclasses of this class apply steps to each of the fields in
-/// the supplied DebugInfoDesc.
-class DIVisitor {
-public:
-  DIVisitor() {}
-  virtual ~DIVisitor() {}
-
-  /// ApplyToFields - Target the visitor to each field of the debug information
-  /// descriptor.
-  void ApplyToFields(DebugInfoDesc *DD);
-  
-  /// Apply - Subclasses override each of these methods to perform the
-  /// appropriate action for the type of field.
-  virtual void Apply(int &Field) = 0;
-  virtual void Apply(unsigned &Field) = 0;
-  virtual void Apply(int64_t &Field) = 0;
-  virtual void Apply(uint64_t &Field) = 0;
-  virtual void Apply(bool &Field) = 0;
-  virtual void Apply(std::string &Field) = 0;
-  virtual void Apply(DebugInfoDesc *&Field) = 0;
-  virtual void Apply(GlobalVariable *&Field) = 0;
-  virtual void Apply(std::vector<DebugInfoDesc *> &Field) = 0;
-};
-
-//===----------------------------------------------------------------------===//
-/// DebugInfoDesc - This class is the base class for debug info descriptors.
-///
-class DebugInfoDesc {
-private:
-  unsigned Tag;                         // Content indicator.  Dwarf values are
-                                        // used but that does not limit use to
-                                        // Dwarf writers.
-  
-protected:
-  explicit DebugInfoDesc(unsigned T) : Tag(T | LLVMDebugVersion) {}
-  
-public:
-  virtual ~DebugInfoDesc() {}
-
-  // Accessors
-  unsigned getTag()          const { return Tag & ~LLVMDebugVersionMask; }
-  unsigned getVersion()      const { return Tag &  LLVMDebugVersionMask; }
-  void setTag(unsigned T)          { Tag = T | LLVMDebugVersion; }
-  
-  /// TagFromGlobal - Returns the tag number from a debug info descriptor
-  /// GlobalVariable.   Return DIIValid if operand is not an unsigned int. 
-  static unsigned TagFromGlobal(GlobalVariable *GV);
-
-  /// VersionFromGlobal - Returns the version number from a debug info
-  /// descriptor GlobalVariable.  Return DIIValid if operand is not an unsigned
-  /// int.
-  static unsigned VersionFromGlobal(GlobalVariable *GV);
-
-  /// DescFactory - Create an instance of debug info descriptor based on Tag.
-  /// Return NULL if not a recognized Tag.
-  static DebugInfoDesc *DescFactory(unsigned Tag);
-  
-  /// getLinkage - get linkage appropriate for this type of descriptor.
-  ///
-  virtual GlobalValue::LinkageTypes getLinkage() const;
-    
-  //===--------------------------------------------------------------------===//
-  // Subclasses should supply the following static methods.
-  
-  // Implement isa/cast/dyncast.
-  static bool classof(const DebugInfoDesc *) { return true; }
-  
-  //===--------------------------------------------------------------------===//
-  // Subclasses should supply the following virtual methods.
-  
-  /// ApplyToFields - Target the vistor to the fields of the descriptor.
-  ///
-  virtual void ApplyToFields(DIVisitor *Visitor);
-
-  /// getDescString - Return a string used to compose global names and labels.
-  ///
-  virtual const char *getDescString() const = 0;
-  
-  /// getTypeString - Return a string used to label this descriptor's type.
-  ///
-  virtual const char *getTypeString() const = 0;
-  
-#ifndef NDEBUG
-  virtual void dump() = 0;
-#endif
-};
-
-//===----------------------------------------------------------------------===//
-/// AnchorDesc - Descriptors of this class act as markers for identifying
-/// descriptors of certain groups.
-class AnchoredDesc;
-class AnchorDesc : public DebugInfoDesc {
-private:
-  unsigned AnchorTag;                   // Tag number of descriptors anchored
-                                        // by this object.
-  
-public:
-  AnchorDesc();
-  explicit AnchorDesc(AnchoredDesc *D);
-  
-  // Accessors
-  unsigned getAnchorTag() const { return AnchorTag; }
-
-  // Implement isa/cast/dyncast.
-  static bool classof(const AnchorDesc *) { return true; }
-  static bool classof(const DebugInfoDesc *D);
-
-  /// getLinkage - get linkage appropriate for this type of descriptor.
-  ///
-  virtual GlobalValue::LinkageTypes getLinkage() const;
-
-  /// ApplyToFields - Target the visitor to the fields of the AnchorDesc.
-  ///
-  virtual void ApplyToFields(DIVisitor *Visitor);
-
-  /// getDescString - Return a string used to compose global names and labels.
-  ///
-  virtual const char *getDescString() const;
-    
-  /// getTypeString - Return a string used to label this descriptor's type.
-  ///
-  virtual const char *getTypeString() const;
-    
-#ifndef NDEBUG
-  virtual void dump();
-#endif
-};
-
-//===----------------------------------------------------------------------===//
-/// AnchoredDesc - This class manages anchors for a variety of top level
-/// descriptors.
-class AnchoredDesc : public DebugInfoDesc {
-private:  
-  DebugInfoDesc *Anchor;                // Anchor for all descriptors of the
-                                        // same type.
-
-protected:
-
-  explicit AnchoredDesc(unsigned T);
-
-public:  
-  // Accessors.
-  AnchorDesc *getAnchor() const { return static_cast<AnchorDesc *>(Anchor); }
-  void setAnchor(AnchorDesc *A) { Anchor = static_cast<DebugInfoDesc *>(A); }
-
-  //===--------------------------------------------------------------------===//
-  // Subclasses should supply the following virtual methods.
-  
-  /// getAnchorString - Return a string used to label descriptor's anchor.
-  ///
-  virtual const char *getAnchorString() const = 0;
-    
-  /// ApplyToFields - Target the visitor to the fields of the AnchoredDesc.
-  ///
-  virtual void ApplyToFields(DIVisitor *Visitor);
-};
-
-//===----------------------------------------------------------------------===//
-/// CompileUnitDesc - This class packages debug information associated with a 
-/// source/header file.
-class CompileUnitDesc : public AnchoredDesc {
-private:  
-  unsigned Language;                    // Language number (ex. DW_LANG_C89.)
-  std::string FileName;                 // Source file name.
-  std::string Directory;                // Source file directory.
-  std::string Producer;                 // Compiler string.
-  
-public:
-  CompileUnitDesc();
-  
-  
-  // Accessors
-  unsigned getLanguage()                  const { return Language; }
-  const std::string &getFileName()        const { return FileName; }
-  const std::string &getDirectory()       const { return Directory; }
-  const std::string &getProducer()        const { return Producer; }
-  void setLanguage(unsigned L)                  { Language = L; }
-  void setFileName(const std::string &FN)       { FileName = FN; }
-  void setDirectory(const std::string &D)       { Directory = D; }
-  void setProducer(const std::string &P)        { Producer = P; }
-  
-  // FIXME - Need translation unit getter/setter.
-
-  // Implement isa/cast/dyncast.
-  static bool classof(const CompileUnitDesc *) { return true; }
-  static bool classof(const DebugInfoDesc *D);
-  
-  /// ApplyToFields - Target the visitor to the fields of the CompileUnitDesc.
-  ///
-  virtual void ApplyToFields(DIVisitor *Visitor);
-
-  /// getDescString - Return a string used to compose global names and labels.
-  ///
-  virtual const char *getDescString() const;
-    
-  /// getTypeString - Return a string used to label this descriptor's type.
-  ///
-  virtual const char *getTypeString() const;
-  
-  /// getAnchorString - Return a string used to label this descriptor's anchor.
-  ///
-  static const char *const AnchorString;
-  virtual const char *getAnchorString() const;
-    
-#ifndef NDEBUG
-  virtual void dump();
-#endif
-};
-
-//===----------------------------------------------------------------------===//
-/// TypeDesc - This class packages debug information associated with a type.
+/// LandingPadInfo - This structure is used to retain landing pad info for
+/// the current function.
 ///
-class TypeDesc : public DebugInfoDesc {
-private:
-  enum {
-    FlagPrivate    = 1 << 0,
-    FlagProtected  = 1 << 1,
-    FlagFwdDecl    = 1 << 2
-  };
-  DebugInfoDesc *Context;               // Context debug descriptor.
-  std::string Name;                     // Type name (may be empty.)
-  DebugInfoDesc *File;                  // Defined compile unit (may be NULL.)
-  unsigned Line;                        // Defined line# (may be zero.)
-  uint64_t Size;                        // Type bit size (may be zero.)
-  uint64_t Align;                       // Type bit alignment (may be zero.)
-  uint64_t Offset;                      // Type bit offset (may be zero.)
-
-protected:
-  unsigned Flags;                       // Miscellaneous flags.
-
-public:
-  explicit TypeDesc(unsigned T);
-
-  // Accessors
-  DebugInfoDesc *getContext()                const { return Context; }
-  const std::string &getName()               const { return Name; }
-  CompileUnitDesc *getFile() const {
-    return static_cast<CompileUnitDesc *>(File);
-  }
-  unsigned getLine()                         const { return Line; }
-  uint64_t getSize()                         const { return Size; }
-  uint64_t getAlign()                        const { return Align; }
-  uint64_t getOffset()                       const { return Offset; }
-  bool isPrivate() const {
-    return (Flags & FlagPrivate) != 0;
-  }
-  bool isProtected() const {
-    return (Flags & FlagProtected) != 0;
-  }
-  bool isForwardDecl() const {
-    return (Flags & FlagFwdDecl) != 0;
-  }
-  void setContext(DebugInfoDesc *C)                { Context = C; }
-  void setName(const std::string &N)               { Name = N; }
-  void setFile(CompileUnitDesc *U) {
-    File = static_cast<DebugInfoDesc *>(U);
-  }
-  void setLine(unsigned L)                         { Line = L; }
-  void setSize(uint64_t S)                         { Size = S; }
-  void setAlign(uint64_t A)                        { Align = A; }
-  void setOffset(uint64_t O)                       { Offset = O; }
-  void setIsPrivate()                              { Flags |= FlagPrivate; }
-  void setIsProtected()                            { Flags |= FlagProtected; }
-  void setIsForwardDecl()                          { Flags |= FlagFwdDecl; }
-  
-  /// ApplyToFields - Target the visitor to the fields of the TypeDesc.
-  ///
-  virtual void ApplyToFields(DIVisitor *Visitor);
-
-  /// getDescString - Return a string used to compose global names and labels.
-  ///
-  virtual const char *getDescString() const;
-
-  /// getTypeString - Return a string used to label this descriptor's type.
-  ///
-  virtual const char *getTypeString() const;
-  
-#ifndef NDEBUG
-  virtual void dump();
-#endif
-};
-
-//===----------------------------------------------------------------------===//
-/// BasicTypeDesc - This class packages debug information associated with a
-/// basic type (eg. int, bool, double.)
-class BasicTypeDesc : public TypeDesc {
-private:
-  unsigned Encoding;                    // Type encoding.
-  
-public:
-  BasicTypeDesc();
-  
-  // Accessors
-  unsigned getEncoding()                     const { return Encoding; }
-  void setEncoding(unsigned E)                     { Encoding = E; }
-
-  // Implement isa/cast/dyncast.
-  static bool classof(const BasicTypeDesc *) { return true; }
-  static bool classof(const DebugInfoDesc *D);
-  
-  /// ApplyToFields - Target the visitor to the fields of the BasicTypeDesc.
-  ///
-  virtual void ApplyToFields(DIVisitor *Visitor);
-
-  /// getDescString - Return a string used to compose global names and labels.
-  ///
-  virtual const char *getDescString() const;
-
-  /// getTypeString - Return a string used to label this descriptor's type.
-  ///
-  virtual const char *getTypeString() const;
-
-#ifndef NDEBUG
-  virtual void dump();
-#endif
-};
-
-
-//===----------------------------------------------------------------------===//
-/// DerivedTypeDesc - This class packages debug information associated with a
-/// derived types (eg., typedef, pointer, reference.)
-class DerivedTypeDesc : public TypeDesc {
-private:
-  DebugInfoDesc *FromType;              // Type derived from.
-
-public:
-  explicit DerivedTypeDesc(unsigned T);
-  
-  // Accessors
-  TypeDesc *getFromType() const {
-    return static_cast<TypeDesc *>(FromType);
-  }
-  void setFromType(TypeDesc *F) {
-    FromType = static_cast<DebugInfoDesc *>(F);
-  }
-
-  // Implement isa/cast/dyncast.
-  static bool classof(const DerivedTypeDesc *) { return true; }
-  static bool classof(const DebugInfoDesc *D);
-  
-  /// ApplyToFields - Target the visitor to the fields of the DerivedTypeDesc.
-  ///
-  virtual void ApplyToFields(DIVisitor *Visitor);
-
-  /// getDescString - Return a string used to compose global names and labels.
-  ///
-  virtual const char *getDescString() const;
-
-  /// getTypeString - Return a string used to label this descriptor's type.
-  ///
-  virtual const char *getTypeString() const;
-
-#ifndef NDEBUG
-  virtual void dump();
-#endif
-};
-
-//===----------------------------------------------------------------------===//
-/// CompositeTypeDesc - This class packages debug information associated with a
-/// array/struct types (eg., arrays, struct, union, enums.)
-class CompositeTypeDesc : public DerivedTypeDesc {
-private:
-  std::vector<DebugInfoDesc *> Elements;// Information used to compose type.
-
-public:
-  explicit CompositeTypeDesc(unsigned T);
-  
-  // Accessors
-  std::vector<DebugInfoDesc *> &getElements() { return Elements; }
-
-  // Implement isa/cast/dyncast.
-  static bool classof(const CompositeTypeDesc *) { return true; }
-  static bool classof(const DebugInfoDesc *D);
-  
-  /// ApplyToFields - Target the visitor to the fields of the CompositeTypeDesc.
-  ///
-  virtual void ApplyToFields(DIVisitor *Visitor);
-
-  /// getDescString - Return a string used to compose global names and labels.
-  ///
-  virtual const char *getDescString() const;
-
-  /// getTypeString - Return a string used to label this descriptor's type.
-  ///
-  virtual const char *getTypeString() const;
-
-#ifndef NDEBUG
-  virtual void dump();
-#endif
-};
-
-//===----------------------------------------------------------------------===//
-/// SubrangeDesc - This class packages debug information associated with integer
-/// value ranges.
-class SubrangeDesc : public DebugInfoDesc {
-private:
-  int64_t Lo;                           // Low value of range.
-  int64_t Hi;                           // High value of range.
-
-public:
-  SubrangeDesc();
-  
-  // Accessors
-  int64_t getLo()                            const { return Lo; }
-  int64_t getHi()                            const { return Hi; }
-  void setLo(int64_t L)                            { Lo = L; }
-  void setHi(int64_t H)                            { Hi = H; }
-
-  // Implement isa/cast/dyncast.
-  static bool classof(const SubrangeDesc *) { return true; }
-  static bool classof(const DebugInfoDesc *D);
-  
-  /// ApplyToFields - Target the visitor to the fields of the SubrangeDesc.
-  ///
-  virtual void ApplyToFields(DIVisitor *Visitor);
-
-  /// getDescString - Return a string used to compose global names and labels.
-  ///
-  virtual const char *getDescString() const;
-    
-  /// getTypeString - Return a string used to label this descriptor's type.
-  ///
-  virtual const char *getTypeString() const;
+struct LandingPadInfo {
+  MachineBasicBlock *LandingPadBlock;    // Landing pad block.
+  SmallVector<MCSymbol*, 1> BeginLabels; // Labels prior to invoke.
+  SmallVector<MCSymbol*, 1> EndLabels;   // Labels after invoke.
+  MCSymbol *LandingPadLabel;             // Label at beginning of landing pad.
+  const Function *Personality;           // Personality function.
+  std::vector<int> TypeIds;              // List of type ids (filters negative)
 
-#ifndef NDEBUG
-  virtual void dump();
-#endif
+  explicit LandingPadInfo(MachineBasicBlock *MBB)
+    : LandingPadBlock(MBB), LandingPadLabel(0), Personality(0) {}
 };
 
 //===----------------------------------------------------------------------===//
-/// EnumeratorDesc - This class packages debug information associated with
-/// named integer constants.
-class EnumeratorDesc : public DebugInfoDesc {
-private:
-  std::string Name;                     // Enumerator name.
-  int64_t Value;                        // Enumerator value.
-
+/// MachineModuleInfoImpl - This class can be derived from and used by targets
+/// to hold private target-specific information for each Module.  Objects of
+/// type are accessed/created with MMI::getInfo and destroyed when the
+/// MachineModuleInfo is destroyed.
+/// 
+class MachineModuleInfoImpl {
 public:
-  EnumeratorDesc();
-  
-  // Accessors
-  const std::string &getName()               const { return Name; }
-  int64_t getValue()                         const { return Value; }
-  void setName(const std::string &N)               { Name = N; }
-  void setValue(int64_t V)                         { Value = V; }
-
-  // Implement isa/cast/dyncast.
-  static bool classof(const EnumeratorDesc *) { return true; }
-  static bool classof(const DebugInfoDesc *D);
-  
-  /// ApplyToFields - Target the visitor to the fields of the EnumeratorDesc.
-  ///
-  virtual void ApplyToFields(DIVisitor *Visitor);
-
-  /// getDescString - Return a string used to compose global names and labels.
-  ///
-  virtual const char *getDescString() const;
-    
-  /// getTypeString - Return a string used to label this descriptor's type.
-  ///
-  virtual const char *getTypeString() const;
-
-#ifndef NDEBUG
-  virtual void dump();
-#endif
-};
-
-//===----------------------------------------------------------------------===//
-/// VariableDesc - This class packages debug information associated with a
-/// subprogram variable.
-///
-class VariableDesc : public DebugInfoDesc {
-private:
-  DebugInfoDesc *Context;               // Context debug descriptor.
-  std::string Name;                     // Type name (may be empty.)
-  DebugInfoDesc *File;                  // Defined compile unit (may be NULL.)
-  unsigned Line;                        // Defined line# (may be zero.)
-  DebugInfoDesc *TyDesc;                // Type of variable.
-
-public:
-  explicit VariableDesc(unsigned T);
-
-  // Accessors
-  DebugInfoDesc *getContext()                const { return Context; }
-  const std::string &getName()               const { return Name; }
-  CompileUnitDesc *getFile() const {
-    return static_cast<CompileUnitDesc *>(File);
-  }
-  unsigned getLine()                         const { return Line; }
-  TypeDesc *getType() const {
-    return static_cast<TypeDesc *>(TyDesc);
-  }
-  void setContext(DebugInfoDesc *C)                { Context = C; }
-  void setName(const std::string &N)               { Name = N; }
-  void setFile(CompileUnitDesc *U) {
-    File = static_cast<DebugInfoDesc *>(U);
-  }
-  void setLine(unsigned L)                         { Line = L; }
-  void setType(TypeDesc *T) {
-    TyDesc = static_cast<DebugInfoDesc *>(T);
-  }
-  
-  // Implement isa/cast/dyncast.
-  static bool classof(const VariableDesc *) { return true; }
-  static bool classof(const DebugInfoDesc *D);
-  
-  /// ApplyToFields - Target the visitor to the fields of the VariableDesc.
-  ///
-  virtual void ApplyToFields(DIVisitor *Visitor);
-
-  /// getDescString - Return a string used to compose global names and labels.
-  ///
-  virtual const char *getDescString() const;
-
-  /// getTypeString - Return a string used to label this descriptor's type.
-  ///
-  virtual const char *getTypeString() const;
-  
-#ifndef NDEBUG
-  virtual void dump();
-#endif
-};
-
-//===----------------------------------------------------------------------===//
-/// GlobalDesc - This class is the base descriptor for global functions and
-/// variables.
-class GlobalDesc : public AnchoredDesc {
-private:
-  DebugInfoDesc *Context;               // Context debug descriptor.
-  std::string Name;                     // Global name.
-  std::string FullName;                 // Fully qualified name.
-  std::string LinkageName;              // Name for binding to MIPS linkage.
-  DebugInfoDesc *File;                  // Defined compile unit (may be NULL.)
-  unsigned Line;                        // Defined line# (may be zero.)
-  DebugInfoDesc *TyDesc;                // Type debug descriptor.
-  bool IsStatic;                        // Is the global a static.
-  bool IsDefinition;                    // Is the global defined in context.
-  
+  typedef PointerIntPair<MCSymbol*, 1, bool> StubValueTy;
+  virtual ~MachineModuleInfoImpl();
+  typedef std::vector<std::pair<MCSymbol*, StubValueTy> > SymbolListTy;
 protected:
-  explicit GlobalDesc(unsigned T);
-
-public:
-  // Accessors
-  DebugInfoDesc *getContext()                const { return Context; }
-  const std::string &getName()               const { return Name; }
-  const std::string &getFullName()           const { return FullName; }
-  const std::string &getLinkageName()        const { return LinkageName; }
-  CompileUnitDesc *getFile() const {
-    return static_cast<CompileUnitDesc *>(File);
-  }
-  unsigned getLine()                         const { return Line; }
-  TypeDesc *getType() const {
-    return static_cast<TypeDesc *>(TyDesc);
-  }
-  bool isStatic()                            const { return IsStatic; }
-  bool isDefinition()                        const { return IsDefinition; }
-  void setContext(DebugInfoDesc *C)                { Context = C; }
-  void setName(const std::string &N)               { Name = N; }
-  void setFullName(const std::string &N)           { FullName = N; }
-  void setLinkageName(const std::string &N)        { LinkageName = N; }
-  void setFile(CompileUnitDesc *U) {
-    File = static_cast<DebugInfoDesc *>(U);
-  }
-  void setLine(unsigned L)                         { Line = L; }
-  void setType(TypeDesc *T) {
-    TyDesc = static_cast<DebugInfoDesc *>(T);
-  }
-  void setIsStatic(bool IS)                        { IsStatic = IS; }
-  void setIsDefinition(bool ID)                    { IsDefinition = ID; }
-
-  /// ApplyToFields - Target the visitor to the fields of the GlobalDesc.
-  ///
-  virtual void ApplyToFields(DIVisitor *Visitor);
-};
-
-//===----------------------------------------------------------------------===//
-/// GlobalVariableDesc - This class packages debug information associated with a
-/// GlobalVariable.
-class GlobalVariableDesc : public GlobalDesc {
-private:
-  GlobalVariable *Global;               // llvm global.
-  
-public:
-  GlobalVariableDesc();
-
-  // Accessors.
-  GlobalVariable *getGlobalVariable()        const { return Global; }
-  void setGlobalVariable(GlobalVariable *GV)       { Global = GV; }
-  // Implement isa/cast/dyncast.
-  static bool classof(const GlobalVariableDesc *) { return true; }
-  static bool classof(const DebugInfoDesc *D);
-  
-  /// ApplyToFields - Target the visitor to the fields of the
-  /// GlobalVariableDesc.
-  virtual void ApplyToFields(DIVisitor *Visitor);
-
-  /// getDescString - Return a string used to compose global names and labels.
-  ///
-  virtual const char *getDescString() const;
-
-  /// getTypeString - Return a string used to label this descriptor's type.
-  ///
-  virtual const char *getTypeString() const;
-  
-  /// getAnchorString - Return a string used to label this descriptor's anchor.
-  ///
-  static const char *const AnchorString;
-  virtual const char *getAnchorString() const;
-    
-#ifndef NDEBUG
-  virtual void dump();
-#endif
-};
-
-//===----------------------------------------------------------------------===//
-/// SubprogramDesc - This class packages debug information associated with a
-/// subprogram/function.
-class SubprogramDesc : public GlobalDesc {
-private:
-  
-public:
-  SubprogramDesc();
-  
-  // Accessors
-  
-  // Implement isa/cast/dyncast.
-  static bool classof(const SubprogramDesc *) { return true; }
-  static bool classof(const DebugInfoDesc *D);
-  
-  /// ApplyToFields - Target the visitor to the fields of the SubprogramDesc.
-  ///
-  virtual void ApplyToFields(DIVisitor *Visitor);
-
-  /// getDescString - Return a string used to compose global names and labels.
-  ///
-  virtual const char *getDescString() const;
-
-  /// getTypeString - Return a string used to label this descriptor's type.
-  ///
-  virtual const char *getTypeString() const;
-  
-  /// getAnchorString - Return a string used to label this descriptor's anchor.
-  ///
-  static const char *const AnchorString;
-  virtual const char *getAnchorString() const;
-    
-#ifndef NDEBUG
-  virtual void dump();
-#endif
+  static SymbolListTy GetSortedStubs(const DenseMap<MCSymbol*, StubValueTy>&);
 };
 
 //===----------------------------------------------------------------------===//
-/// BlockDesc - This descriptor groups variables and blocks nested in a block.
+/// MachineModuleInfo - This class contains meta information specific to a
+/// module.  Queries can be made by different debugging and exception handling
+/// schemes and reformated for specific use.
 ///
-class BlockDesc : public DebugInfoDesc {
-private:
-  DebugInfoDesc *Context;               // Context debug descriptor.
-
-public:
-  BlockDesc();
-  
-  // Accessors
-  DebugInfoDesc *getContext()                const { return Context; }
-  void setContext(DebugInfoDesc *C)                { Context = C; }
-  
-  // Implement isa/cast/dyncast.
-  static bool classof(const BlockDesc *) { return true; }
-  static bool classof(const DebugInfoDesc *D);
-  
-  /// ApplyToFields - Target the visitor to the fields of the BlockDesc.
-  ///
-  virtual void ApplyToFields(DIVisitor *Visitor);
-
-  /// getDescString - Return a string used to compose global names and labels.
-  ///
-  virtual const char *getDescString() const;
-
-  /// getTypeString - Return a string used to label this descriptor's type.
-  ///
-  virtual const char *getTypeString() const;
-    
-#ifndef NDEBUG
-  virtual void dump();
-#endif
-};
-
-//===----------------------------------------------------------------------===//
-/// DIDeserializer - This class is responsible for casting GlobalVariables
-/// into DebugInfoDesc objects.
-class DIDeserializer {
-  // Previously defined gloabls.
-  std::map<GlobalVariable*, DebugInfoDesc*> GlobalDescs;
-public:
-  const std::map<GlobalVariable *, DebugInfoDesc *> &getGlobalDescs() const {
-    return GlobalDescs;
-  }
-
-  /// Deserialize - Reconstitute a GlobalVariable into it's component
-  /// DebugInfoDesc objects.
-  DebugInfoDesc *Deserialize(Value *V);
-  DebugInfoDesc *Deserialize(GlobalVariable *GV);
-};
-
-//===----------------------------------------------------------------------===//
-/// DISerializer - This class is responsible for casting DebugInfoDesc objects
-/// into GlobalVariables.
-class DISerializer {
-  Module *M;                            // Definition space module.
-  PointerType *StrPtrTy;                // A "i8*" type.  Created lazily.
-  PointerType *EmptyStructPtrTy;        // A "{ }*" type.  Created lazily.
-
-  // Types per Tag. Created lazily.
-  std::map<unsigned, StructType *> TagTypes;
+class MachineModuleInfo : public ImmutablePass {
+  /// Context - This is the MCContext used for the entire code generator.
+  MCContext Context;
 
-  // Previously defined descriptors.
-  DenseMap<DebugInfoDesc *, GlobalVariable *> DescGlobals;
+  /// TheModule - This is the LLVM Module being worked on.
+  const Module *TheModule;
 
-  // Previously defined strings.
-  StringMap<Constant*> StringCache;
-public:
-  DISerializer()
-    : M(NULL), StrPtrTy(NULL), EmptyStructPtrTy(NULL), TagTypes(),
-      DescGlobals(), StringCache()
-  {}
-  
-  // Accessors
-  Module *getModule()        const { return M; };
-  void setModule(Module *module)  { M = module; }
-
-  /// getStrPtrType - Return a "i8*" type.
-  ///
-  const PointerType *getStrPtrType();
-  
-  /// getEmptyStructPtrType - Return a "{ }*" type.
-  ///
-  const PointerType *getEmptyStructPtrType();
-  
-  /// getTagType - Return the type describing the specified descriptor (via
-  /// tag.)
-  const StructType *getTagType(DebugInfoDesc *DD);
-  
-  /// getString - Construct the string as constant string global.
-  ///
-  Constant *getString(const std::string &String);
-  
-  /// Serialize - Recursively cast the specified descriptor into a
-  /// GlobalVariable so that it can be serialized to a .bc or .ll file.
-  GlobalVariable *Serialize(DebugInfoDesc *DD);
-
-  /// addDescriptor - Directly connect DD with existing GV.
-  void addDescriptor(DebugInfoDesc *DD, GlobalVariable *GV);
-};
+  /// ObjFileMMI - This is the object-file-format-specific implementation of
+  /// MachineModuleInfoImpl, which lets targets accumulate whatever info they
+  /// want.
+  MachineModuleInfoImpl *ObjFileMMI;
 
-//===----------------------------------------------------------------------===//
-/// DIVerifier - This class is responsible for verifying the given network of
-/// GlobalVariables are valid as DebugInfoDesc objects.
-class DIVerifier {
-  enum {
-    Unknown = 0,
-    Invalid,
-    Valid
-  };
-  DenseMap<GlobalVariable *, unsigned> Validity; // Tracks prior results.
-  std::map<unsigned, unsigned> Counts; // Count of fields per Tag type.
-public:
-  DIVerifier()
-    : Validity(), Counts()
-  {}
-  
-  /// Verify - Return true if the GlobalVariable appears to be a valid
-  /// serialization of a DebugInfoDesc.
-  bool Verify(Value *V);
-  bool Verify(GlobalVariable *GV);
-
-  /// isVerified - Return true if the specified GV has already been
-  /// verified as a debug information descriptor.
-  bool isVerified(GlobalVariable *GV);
-};
+  /// List of moves done by a function's prolog.  Used to construct frame maps
+  /// by debug and exception handling consumers.
+  std::vector<MCCFIInstruction> FrameInstructions;
 
-//===----------------------------------------------------------------------===//
-/// SourceLineInfo - This class is used to record source line correspondence.
-///
-class SourceLineInfo {
-  unsigned Line;                        // Source line number.
-  unsigned Column;                      // Source column.
-  unsigned SourceID;                    // Source ID number.
-  unsigned LabelID;                     // Label in code ID number.
-public:
-  SourceLineInfo(unsigned L, unsigned C, unsigned S, unsigned I)
-  : Line(L), Column(C), SourceID(S), LabelID(I) {}
-  
-  // Accessors
-  unsigned getLine()     const { return Line; }
-  unsigned getColumn()   const { return Column; }
-  unsigned getSourceID() const { return SourceID; }
-  unsigned getLabelID()  const { return LabelID; }
-};
+  /// CompactUnwindEncoding - If the target supports it, this is the compact
+  /// unwind encoding. It replaces a function's CIE and FDE.
+  uint32_t CompactUnwindEncoding;
 
-//===----------------------------------------------------------------------===//
-/// SourceFileInfo - This class is used to track source information.
-///
-class SourceFileInfo {
-  unsigned DirectoryID;                 // Directory ID number.
-  std::string Name;                     // File name (not including directory.)
-public:
-  SourceFileInfo(unsigned D, const std::string &N) : DirectoryID(D), Name(N) {}
-            
-  // Accessors
-  unsigned getDirectoryID()    const { return DirectoryID; }
-  const std::string &getName() const { return Name; }
+  /// LandingPads - List of LandingPadInfo describing the landing pad
+  /// information in the current function.
+  std::vector<LandingPadInfo> LandingPads;
 
-  /// operator== - Used by UniqueVector to locate entry.
-  ///
-  bool operator==(const SourceFileInfo &SI) const {
-    return getDirectoryID() == SI.getDirectoryID() && getName() == SI.getName();
-  }
+  /// LPadToCallSiteMap - Map a landing pad's EH symbol to the call site
+  /// indexes.
+  DenseMap<MCSymbol*, SmallVector<unsigned, 4> > LPadToCallSiteMap;
 
-  /// operator< - Used by UniqueVector to locate entry.
-  ///
-  bool operator<(const SourceFileInfo &SI) const {
-    return getDirectoryID() < SI.getDirectoryID() ||
-          (getDirectoryID() == SI.getDirectoryID() && getName() < SI.getName());
-  }
-};
+  /// CallSiteMap - Map of invoke call site index values to associated begin
+  /// EH_LABEL for the current function.
+  DenseMap<MCSymbol*, unsigned> CallSiteMap;
 
-//===----------------------------------------------------------------------===//
-/// DebugVariable - This class is used to track local variable information.
-///
-class DebugVariable {
-private:
-  VariableDesc *Desc;                   // Variable Descriptor.
-  unsigned FrameIndex;                  // Variable frame index.
+  /// CurCallSite - The current call site index being processed, if any. 0 if
+  /// none.
+  unsigned CurCallSite;
 
-public:
-  DebugVariable(VariableDesc *D, unsigned I)
-  : Desc(D)
-  , FrameIndex(I)
-  {}
-  
-  // Accessors.
-  VariableDesc *getDesc()  const { return Desc; }
-  unsigned getFrameIndex() const { return FrameIndex; }
-};
+  /// TypeInfos - List of C++ TypeInfo used in the current function.
+  std::vector<const GlobalVariable *> TypeInfos;
 
-//===----------------------------------------------------------------------===//
-/// DebugScope - This class is used to track scope information.
-///
-class DebugScope {
-private:
-  DebugScope *Parent;                   // Parent to this scope.
-  DebugInfoDesc *Desc;                  // Debug info descriptor for scope.
-                                        // Either subprogram or block.
-  unsigned StartLabelID;                // Label ID of the beginning of scope.
-  unsigned EndLabelID;                  // Label ID of the end of scope.
-  std::vector<DebugScope *> Scopes;     // Scopes defined in scope.
-  std::vector<DebugVariable *> Variables;// Variables declared in scope.
-  
-public:
-  DebugScope(DebugScope *P, DebugInfoDesc *D)
-  : Parent(P)
-  , Desc(D)
-  , StartLabelID(0)
-  , EndLabelID(0)
-  , Scopes()
-  , Variables()
-  {}
-  ~DebugScope();
-  
-  // Accessors.
-  DebugScope *getParent()        const { return Parent; }
-  DebugInfoDesc *getDesc()       const { return Desc; }
-  unsigned getStartLabelID()     const { return StartLabelID; }
-  unsigned getEndLabelID()       const { return EndLabelID; }
-  std::vector<DebugScope *> &getScopes() { return Scopes; }
-  std::vector<DebugVariable *> &getVariables() { return Variables; }
-  void setStartLabelID(unsigned S) { StartLabelID = S; }
-  void setEndLabelID(unsigned E)   { EndLabelID = E; }
-  
-  /// AddScope - Add a scope to the scope.
-  ///
-  void AddScope(DebugScope *S) { Scopes.push_back(S); }
-  
-  /// AddVariable - Add a variable to the scope.
-  ///
-  void AddVariable(DebugVariable *V) { Variables.push_back(V); }
-};
-
-//===----------------------------------------------------------------------===//
-/// LandingPadInfo - This structure is used to retain landing pad info for
-/// the current function.
-///
-struct LandingPadInfo {
-  MachineBasicBlock *LandingPadBlock;   // Landing pad block.
-  SmallVector<unsigned, 1> BeginLabels; // Labels prior to invoke.
-  SmallVector<unsigned, 1> EndLabels;   // Labels after invoke.
-  unsigned LandingPadLabel;             // Label at beginning of landing pad.
-  Function *Personality;                // Personality function.
-  std::vector<int> TypeIds;             // List of type ids (filters negative)
-
-  explicit LandingPadInfo(MachineBasicBlock *MBB)
-  : LandingPadBlock(MBB)
-  , LandingPadLabel(0)
-  , Personality(NULL)  
-  {}
-};
-
-//===----------------------------------------------------------------------===//
-/// MachineModuleInfo - This class contains meta information specific to a
-/// module.  Queries can be made by different debugging and exception handling 
-/// schemes and reformated for specific use.
-///
-class MachineModuleInfo : public ImmutablePass {
-private:
-  // Use the same deserializer/verifier for the module.
-  DIDeserializer DR;
-  DIVerifier VR;
-
-  // CompileUnits - Uniquing vector for compile units.
-  UniqueVector<CompileUnitDesc *> CompileUnits;
-  
-  // Directories - Uniquing vector for directories.
-  UniqueVector<std::string> Directories;
-                                         
-  // SourceFiles - Uniquing vector for source files.
-  UniqueVector<SourceFileInfo> SourceFiles;
-
-  // Lines - List of of source line correspondence.
-  std::vector<SourceLineInfo> Lines;
-  
-  // LabelIDList - One entry per assigned label.  Normally the entry is equal to
-  // the list index(+1).  If the entry is zero then the label has been deleted.
-  // Any other value indicates the label has been deleted by is mapped to
-  // another label.
-  std::vector<unsigned> LabelIDList;
-  
-  // ScopeMap - Tracks the scopes in the current function.
-  std::map<DebugInfoDesc *, DebugScope *> ScopeMap;
-  
-  // RootScope - Top level scope for the current function.
-  //
-  DebugScope *RootScope;
-  
-  // FrameMoves - List of moves done by a function's prolog.  Used to construct
-  // frame maps by debug and exception handling consumers.
-  std::vector<MachineMove> FrameMoves;
-  
-  // LandingPads - List of LandingPadInfo describing the landing pad information
-  // in the current function.
-  std::vector<LandingPadInfo> LandingPads;
-  
-  // TypeInfos - List of C++ TypeInfo used in the current function.
-  //
-  std::vector<GlobalVariable *> TypeInfos;
-
-  // FilterIds - List of typeids encoding filters used in the current function.
-  //
+  /// FilterIds - List of typeids encoding filters used in the current function.
   std::vector<unsigned> FilterIds;
 
-  // FilterEnds - List of the indices in FilterIds corresponding to filter
-  // terminators.
-  //
+  /// FilterEnds - List of the indices in FilterIds corresponding to filter
+  /// terminators.
   std::vector<unsigned> FilterEnds;
 
-  // Personalities - Vector of all personality functions ever seen. Used to emit
-  // common EH frames.
-  std::vector<Function *> Personalities;
+  /// Personalities - Vector of all personality functions ever seen. Used to
+  /// emit common EH frames.
+  std::vector<const Function *> Personalities;
 
-  // UsedFunctions - the functions in the llvm.used list in a more easily
-  // searchable format.
+  /// UsedFunctions - The functions in the @llvm.used list in a more easily
+  /// searchable format.  This does not include the functions in
+  /// llvm.compiler.used.
   SmallPtrSet<const Function *, 32> UsedFunctions;
 
+  /// AddrLabelSymbols - This map keeps track of which symbol is being used for
+  /// the specified basic block's address of label.
+  MMIAddrLabelMap *AddrLabelSymbols;
+
   bool CallsEHReturn;
   bool CallsUnwindInit;
+
   /// DbgInfoAvailable - True if debugging information is available
   /// in this module.
   bool DbgInfoAvailable;
+
+  /// UsesVAFloatArgument - True if this module calls VarArg function with
+  /// floating-point arguments.  This is used to emit an undefined reference
+  /// to _fltused on Windows targets.
+  bool UsesVAFloatArgument;
+
 public:
   static char ID; // Pass identification, replacement for typeid
 
-  MachineModuleInfo();
+  typedef std::pair<unsigned, DebugLoc> UnsignedDebugLocPair;
+  typedef SmallVector<std::pair<TrackingVH<MDNode>, UnsignedDebugLocPair>, 4>
+    VariableDbgInfoMapTy;
+  VariableDbgInfoMapTy VariableDbgInfo;
+
+  MachineModuleInfo();  // DUMMY CONSTRUCTOR, DO NOT CALL.
+  // Real constructor.
+  MachineModuleInfo(const MCAsmInfo &MAI, const MCRegisterInfo &MRI,
+                    const MCObjectFileInfo *MOFI);
   ~MachineModuleInfo();
-  
-  /// doInitialization - Initialize the state for a new module.
-  ///
-  bool doInitialization();
-  
-  /// doFinalization - Tear down the state after completion of a module.
-  ///
-  bool doFinalization();
-  
-  /// BeginFunction - Begin gathering function meta information.
-  ///
-  void BeginFunction(MachineFunction *MF);
-  
+
+  // Initialization and Finalization
+  virtual bool doInitialization(Module &);
+  virtual bool doFinalization(Module &);
+
   /// EndFunction - Discard function meta information.
   ///
   void EndFunction();
 
-  /// getDescFor - Convert a Value to a debug information descriptor.
-  ///
-  // FIXME - use new Value type when available.
-  DebugInfoDesc *getDescFor(Value *V);
-  
-  /// Verify - Verify that a Value is debug information descriptor.
+  const MCContext &getContext() const { return Context; }
+  MCContext &getContext() { return Context; }
+
+  void setModule(const Module *M) { TheModule = M; }
+  const Module *getModule() const { return TheModule; }
+
+  /// getInfo - Keep track of various per-function pieces of information for
+  /// backends that would like to do so.
   ///
-  bool Verify(Value *V) { return VR.Verify(V); }
+  template<typename Ty>
+  Ty &getObjFileInfo() {
+    if (ObjFileMMI == 0)
+      ObjFileMMI = new Ty(*this);
+    return *static_cast<Ty*>(ObjFileMMI);
+  }
+
+  template<typename Ty>
+  const Ty &getObjFileInfo() const {
+    return const_cast<MachineModuleInfo*>(this)->getObjFileInfo<Ty>();
+  }
 
-  /// isVerified - Return true if the specified GV has already been
-  /// verified as a debug information descriptor.
-  bool isVerified(GlobalVariable *GV) { return VR.isVerified(GV); }
-  
   /// AnalyzeModule - Scan the module for global debug information.
   ///
-  void AnalyzeModule(Module &M);
-  
+  void AnalyzeModule(const Module &M);
+
   /// hasDebugInfo - Returns true if valid debug info is present.
   ///
   bool hasDebugInfo() const { return DbgInfoAvailable; }
-  void setDebugInfoAvailability(bool avail) { DbgInfoAvailable = true; }
+  void setDebugInfoAvailability(bool avail) { DbgInfoAvailable = avail; }
 
   bool callsEHReturn() const { return CallsEHReturn; }
   void setCallsEHReturn(bool b) { CallsEHReturn = b; }
 
   bool callsUnwindInit() const { return CallsUnwindInit; }
   void setCallsUnwindInit(bool b) { CallsUnwindInit = b; }
-  
-  /// NextLabelID - Return the next unique label id.
-  ///
-  unsigned NextLabelID() {
-    unsigned ID = (unsigned)LabelIDList.size() + 1;
-    LabelIDList.push_back(ID);
-    return ID;
-  }
-  
-  /// RecordSourceLine - Records location information and associates it with a
-  /// label.  Returns a unique label ID used to generate a label and 
-  /// provide correspondence to the source line list.
-  unsigned RecordSourceLine(unsigned Line, unsigned Column, unsigned Source);
-  
-  /// InvalidateLabel - Inhibit use of the specified label # from
-  /// MachineModuleInfo, for example because the code was deleted.
-  void InvalidateLabel(unsigned LabelID) {
-    // Remap to zero to indicate deletion.
-    RemapLabel(LabelID, 0);
-  }
 
-  /// RemapLabel - Indicate that a label has been merged into another.
-  ///
-  void RemapLabel(unsigned OldLabelID, unsigned NewLabelID) {
-    assert(0 < OldLabelID && OldLabelID <= LabelIDList.size() &&
-          "Old label ID out of range.");
-    assert(NewLabelID <= LabelIDList.size() &&
-          "New label ID out of range.");
-    LabelIDList[OldLabelID - 1] = NewLabelID;
-  }
-  
-  /// MappedLabel - Find out the label's final ID.  Zero indicates deletion.
-  /// ID != Mapped ID indicates that the label was folded into another label.
-  unsigned MappedLabel(unsigned LabelID) const {
-    assert(LabelID <= LabelIDList.size() && "Debug label ID out of range.");
-    return LabelID ? LabelIDList[LabelID - 1] : 0;
+  bool usesVAFloatArgument() const {
+    return UsesVAFloatArgument;
   }
 
-  /// RecordSource - Register a source file with debug info. Returns an source
-  /// ID.
-  unsigned RecordSource(const std::string &Directory,
-                        const std::string &Source);
-  unsigned RecordSource(const CompileUnitDesc *CompileUnit);
-  
-  /// getDirectories - Return the UniqueVector of std::string representing
-  /// directories.
-  const UniqueVector<std::string> &getDirectories() const {
-    return Directories;
-  }
-  
-  /// getSourceFiles - Return the UniqueVector of source files. 
-  ///
-  const UniqueVector<SourceFileInfo> &getSourceFiles() const {
-    return SourceFiles;
+  void setUsesVAFloatArgument(bool b) {
+    UsesVAFloatArgument = b;
   }
-  
-  /// getSourceLines - Return a vector of source lines.
-  ///
-  const std::vector<SourceLineInfo> &getSourceLines() const {
-    return Lines;
+
+  /// \brief Returns a reference to a list of cfi instructions in the current
+  /// function's prologue.  Used to construct frame maps for debug and exception
+  /// handling comsumers.
+  const std::vector<MCCFIInstruction> &getFrameInstructions() const {
+    return FrameInstructions;
   }
-  
-  /// SetupCompileUnits - Set up the unique vector of compile units.
-  ///
-  void SetupCompileUnits(Module &M);
 
-  /// getCompileUnits - Return a vector of debug compile units.
-  ///
-  const UniqueVector<CompileUnitDesc *> getCompileUnits() const;
-  
-  /// getGlobalVariablesUsing - Return all of the GlobalVariables that use the
-  /// named GlobalVariable.
-  void getGlobalVariablesUsing(Module &M, const std::string &RootName,
-                               std::vector<GlobalVariable*> &Result);
-
-  /// getAnchoredDescriptors - Return a vector of anchored debug descriptors.
-  ///
-  template <class T>
-  void getAnchoredDescriptors(Module &M, std::vector<T*> &AnchoredDescs) {
-    T Desc;
-    std::vector<GlobalVariable *> Globals;
-    getGlobalVariablesUsing(M, Desc.getAnchorString(), Globals);
-
-    for (unsigned i = 0, N = Globals.size(); i < N; ++i) {
-      GlobalVariable *GV = Globals[i];
-
-      // FIXME - In the short term, changes are too drastic to continue.
-      if (DebugInfoDesc::TagFromGlobal(GV) == Desc.getTag() &&
-          DebugInfoDesc::VersionFromGlobal(GV) == LLVMDebugVersion) {
-        AnchoredDescs.push_back(cast<T>(DR.Deserialize(GV)));
-      }
-    }
+  void addFrameInst(const MCCFIInstruction &Inst) {
+    FrameInstructions.push_back(Inst);
   }
-  
-  /// RecordRegionStart - Indicate the start of a region.
-  ///
-  unsigned RecordRegionStart(Value *V);
 
-  /// RecordRegionEnd - Indicate the end of a region.
-  ///
-  unsigned RecordRegionEnd(Value *V);
+  /// getCompactUnwindEncoding - Returns the compact unwind encoding for a
+  /// function if the target supports the encoding. This encoding replaces a
+  /// function's CIE and FDE.
+  uint32_t getCompactUnwindEncoding() const { return CompactUnwindEncoding; }
 
-  /// RecordVariable - Indicate the declaration of  a local variable.
-  ///
-  void RecordVariable(GlobalValue *GV, unsigned FrameIndex);
-  
-  /// getRootScope - Return current functions root scope.
-  ///
-  DebugScope *getRootScope() { return RootScope; }
-  
-  /// getOrCreateScope - Returns the scope associated with the given descriptor.
-  ///
-  DebugScope *getOrCreateScope(DebugInfoDesc *ScopeDesc);
-  
-  /// getFrameMoves - Returns a reference to a list of moves done in the current
-  /// function's prologue.  Used to construct frame maps for debug and exception
-  /// handling comsumers.
-  std::vector<MachineMove> &getFrameMoves() { return FrameMoves; }
-  
-  //===-EH-----------------------------------------------------------------===//
+  /// setCompactUnwindEncoding - Set the compact unwind encoding for a function
+  /// if the target supports the encoding.
+  void setCompactUnwindEncoding(uint32_t Enc) { CompactUnwindEncoding = Enc; }
+
+  /// getAddrLabelSymbol - Return the symbol to be used for the specified basic
+  /// block when its address is taken.  This cannot be its normal LBB label
+  /// because the block may be accessed outside its containing function.
+  MCSymbol *getAddrLabelSymbol(const BasicBlock *BB);
+
+  /// getAddrLabelSymbolToEmit - Return the symbol to be used for the specified
+  /// basic block when its address is taken.  If other blocks were RAUW'd to
+  /// this one, we may have to emit them as well, return the whole set.
+  std::vector<MCSymbol*> getAddrLabelSymbolToEmit(const BasicBlock *BB);
+
+  /// takeDeletedSymbolsForFunction - If the specified function has had any
+  /// references to address-taken blocks generated, but the block got deleted,
+  /// return the symbol now so we can emit it.  This prevents emitting a
+  /// reference to a symbol that has no definition.
+  void takeDeletedSymbolsForFunction(const Function *F,
+                                     std::vector<MCSymbol*> &Result);
+
+
+  //===- EH ---------------------------------------------------------------===//
 
   /// getOrCreateLandingPadInfo - Find or create an LandingPadInfo for the
   /// specified MachineBasicBlock.
@@ -1221,48 +277,51 @@ public:
 
   /// addInvoke - Provide the begin and end labels of an invoke style call and
   /// associate it with a try landing pad block.
-  void addInvoke(MachineBasicBlock *LandingPad, unsigned BeginLabel,
-                                                unsigned EndLabel);
-  
-  /// addLandingPad - Add a new panding pad.  Returns the label ID for the 
+  void addInvoke(MachineBasicBlock *LandingPad,
+                 MCSymbol *BeginLabel, MCSymbol *EndLabel);
+
+  /// addLandingPad - Add a new panding pad.  Returns the label ID for the
   /// landing pad entry.
-  unsigned addLandingPad(MachineBasicBlock *LandingPad);
-  
+  MCSymbol *addLandingPad(MachineBasicBlock *LandingPad);
+
   /// addPersonality - Provide the personality function for the exception
   /// information.
-  void addPersonality(MachineBasicBlock *LandingPad, Function *Personality);
+  void addPersonality(MachineBasicBlock *LandingPad,
+                      const Function *Personality);
 
   /// getPersonalityIndex - Get index of the current personality function inside
   /// Personalitites array
   unsigned getPersonalityIndex() const;
 
   /// getPersonalities - Return array of personality functions ever seen.
-  const std::vector<Function *>& getPersonalities() const {
+  const std::vector<const Function *>& getPersonalities() const {
     return Personalities;
   }
 
-  // UsedFunctions - Return set of the functions in the llvm.used list.
-  const SmallPtrSet<const Function *, 32>& getUsedFunctions() const {
-    return UsedFunctions;
+  /// isUsedFunction - Return true if the functions in the llvm.used list.  This
+  /// does not return true for things in llvm.compiler.used unless they are also
+  /// in llvm.used.
+  bool isUsedFunction(const Function *F) const {
+    return UsedFunctions.count(F);
   }
 
   /// addCatchTypeInfo - Provide the catch typeinfo for a landing pad.
   ///
   void addCatchTypeInfo(MachineBasicBlock *LandingPad,
-                        std::vector<GlobalVariable *> &TyInfo);
+                        ArrayRef<const GlobalVariable *> TyInfo);
 
   /// addFilterTypeInfo - Provide the filter typeinfo for a landing pad.
   ///
   void addFilterTypeInfo(MachineBasicBlock *LandingPad,
-                         std::vector<GlobalVariable *> &TyInfo);
+                         ArrayRef<const GlobalVariable *> TyInfo);
 
   /// addCleanup - Add a cleanup action for a landing pad.
   ///
   void addCleanup(MachineBasicBlock *LandingPad);
 
-  /// getTypeIDFor - Return the type id for the specified typeinfo.  This is 
+  /// getTypeIDFor - Return the type id for the specified typeinfo.  This is
   /// function wide.
-  unsigned getTypeIDFor(GlobalVariable *TI);
+  unsigned getTypeIDFor(const GlobalVariable *TI);
 
   /// getFilterIDFor - Return the id of the filter encoded by TyIds.  This is
   /// function wide.
@@ -1270,17 +329,60 @@ public:
 
   /// TidyLandingPads - Remap landing pad labels and remove any deleted landing
   /// pads.
-  void TidyLandingPads();
-                        
+  void TidyLandingPads(DenseMap<MCSymbol*, uintptr_t> *LPMap = 0);
+
   /// getLandingPads - Return a reference to the landing pad info for the
   /// current function.
   const std::vector<LandingPadInfo> &getLandingPads() const {
     return LandingPads;
   }
-  
+
+  /// setCallSiteLandingPad - Map the landing pad's EH symbol to the call
+  /// site indexes.
+  void setCallSiteLandingPad(MCSymbol *Sym, ArrayRef<unsigned> Sites);
+
+  /// getCallSiteLandingPad - Get the call site indexes for a landing pad EH
+  /// symbol.
+  SmallVectorImpl<unsigned> &getCallSiteLandingPad(MCSymbol *Sym) {
+    assert(hasCallSiteLandingPad(Sym) &&
+           "missing call site number for landing pad!");
+    return LPadToCallSiteMap[Sym];
+  }
+
+  /// hasCallSiteLandingPad - Return true if the landing pad Eh symbol has an
+  /// associated call site.
+  bool hasCallSiteLandingPad(MCSymbol *Sym) {
+    return !LPadToCallSiteMap[Sym].empty();
+  }
+
+  /// setCallSiteBeginLabel - Map the begin label for a call site.
+  void setCallSiteBeginLabel(MCSymbol *BeginLabel, unsigned Site) {
+    CallSiteMap[BeginLabel] = Site;
+  }
+
+  /// getCallSiteBeginLabel - Get the call site number for a begin label.
+  unsigned getCallSiteBeginLabel(MCSymbol *BeginLabel) {
+    assert(hasCallSiteBeginLabel(BeginLabel) &&
+           "Missing call site number for EH_LABEL!");
+    return CallSiteMap[BeginLabel];
+  }
+
+  /// hasCallSiteBeginLabel - Return true if the begin label has a call site
+  /// number associated with it.
+  bool hasCallSiteBeginLabel(MCSymbol *BeginLabel) {
+    return CallSiteMap[BeginLabel] != 0;
+  }
+
+  /// setCurrentCallSite - Set the call site currently being processed.
+  void setCurrentCallSite(unsigned Site) { CurCallSite = Site; }
+
+  /// getCurrentCallSite - Get the call site currently being processed, if any.
+  /// return zero if none.
+  unsigned getCurrentCallSite() { return CurCallSite; }
+
   /// getTypeInfos - Return a reference to the C++ typeinfo for the current
   /// function.
-  const std::vector<GlobalVariable *> &getTypeInfos() const {
+  const std::vector<const GlobalVariable *> &getTypeInfos() const {
     return TypeInfos;
   }
 
@@ -1292,9 +394,16 @@ public:
 
   /// getPersonality - Return a personality function if available.  The presence
   /// of one is required to emit exception handling info.
-  Function *getPersonality() const;
+  const Function *getPersonality() const;
+
+  /// setVariableDbgInfo - Collect information used to emit debugging
+  /// information of a variable.
+  void setVariableDbgInfo(MDNode *N, unsigned Slot, DebugLoc Loc) {
+    VariableDbgInfo.push_back(std::make_pair(N, std::make_pair(Slot, Loc)));
+  }
+
+  VariableDbgInfoMapTy &getVariableDbgInfo() { return VariableDbgInfo; }
 
-  DIDeserializer *getDIDeserializer() { return &DR; }
 }; // End class MachineModuleInfo
 
 } // End llvm namespace