Propagation in TargetLowering. Includes passing a DL
[oota-llvm.git] / include / llvm / CodeGen / MachineModuleInfo.h
index 63d50a9e3a4d6ea2ffef9268657672b9e51a568b..1ff7ee7d56795a4e9e4756d22fd38c7641933fbb 100644 (file)
 #ifndef LLVM_CODEGEN_MACHINEMODULEINFO_H
 #define LLVM_CODEGEN_MACHINEMODULEINFO_H
 
-#include "llvm/GlobalValue.h"
-#include "llvm/Pass.h"
-#include "llvm/ADT/DenseMap.h"
-#include "llvm/ADT/SmallPtrSet.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/Support/DataTypes.h"
-#include "llvm/Support/Dwarf.h"
+#include "llvm/ADT/SmallPtrSet.h"
+#include "llvm/ADT/StringMap.h"
+#include "llvm/CodeGen/MachineLocation.h"
+#include "llvm/GlobalValue.h"
+#include "llvm/Pass.h"
 
 namespace llvm {
 
 //===----------------------------------------------------------------------===//
 // Forward declarations.
-class AnchoredDesc;
-class CompileUnitDesc;
 class Constant;
-class DebugInfoDesc;
 class GlobalVariable;
 class MachineBasicBlock;
 class MachineFunction;
-class MachineMove;
 class Module;
 class PointerType;
 class StructType;
-class VariableDesc;
-
-//===----------------------------------------------------------------------===//
-/// 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;
-};
-
-//===----------------------------------------------------------------------===//
-/// 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;
-
-  // Previously defined descriptors.
-  DenseMap<DebugInfoDesc *, GlobalVariable *> DescGlobals;
-
-  // Previously defined strings.
-  DenseMap<const char *, 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);
-};
-
-//===----------------------------------------------------------------------===//
-/// 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);
-};
 
 //===----------------------------------------------------------------------===//
 /// SourceLineInfo - This class is used to record source line correspondence.
@@ -194,95 +73,6 @@ public:
   unsigned getLabelID()  const { return LabelID; }
 };
 
-//===----------------------------------------------------------------------===//
-/// 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; }
-
-  /// operator== - Used by UniqueVector to locate entry.
-  ///
-  bool operator==(const SourceFileInfo &SI) const {
-    return getDirectoryID() == SI.getDirectoryID() && getName() == SI.getName();
-  }
-
-  /// operator< - Used by UniqueVector to locate entry.
-  ///
-  bool operator<(const SourceFileInfo &SI) const {
-    return getDirectoryID() < SI.getDirectoryID() ||
-          (getDirectoryID() == SI.getDirectoryID() && getName() < SI.getName());
-  }
-};
-
-//===----------------------------------------------------------------------===//
-/// DebugVariable - This class is used to track local variable information.
-///
-class DebugVariable {
-private:
-  VariableDesc *Desc;                   // Variable Descriptor.
-  unsigned FrameIndex;                  // Variable frame index.
-
-public:
-  DebugVariable(VariableDesc *D, unsigned I)
-  : Desc(D)
-  , FrameIndex(I)
-  {}
-  
-  // Accessors.
-  VariableDesc *getDesc()  const { return Desc; }
-  unsigned getFrameIndex() const { return FrameIndex; }
-};
-
-//===----------------------------------------------------------------------===//
-/// 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.
@@ -309,19 +99,6 @@ struct LandingPadInfo {
 ///
 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;
   
@@ -331,13 +108,6 @@ private:
   // 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;
@@ -369,6 +139,10 @@ private:
 
   bool CallsEHReturn;
   bool CallsUnwindInit;
+  /// DbgInfoAvailable - True if debugging information is available
+  /// in this module.
+  bool DbgInfoAvailable;
 public:
   static char ID; // Pass identification, replacement for typeid
 
@@ -391,27 +165,15 @@ public:
   ///
   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.
-  ///
-  bool Verify(Value *V) { return VR.Verify(V); }
-
-  /// 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);
   
   /// hasDebugInfo - Returns true if valid debug info is present.
   ///
-  bool hasDebugInfo() const { return !CompileUnits.empty(); }
-  
+  bool hasDebugInfo() const { return DbgInfoAvailable; }
+  void setDebugInfoAvailability(bool avail) { DbgInfoAvailable = true; }
+
   bool callsEHReturn() const { return CallsEHReturn; }
   void setCallsEHReturn(bool b) { CallsEHReturn = b; }
 
@@ -455,68 +217,12 @@ public:
     return LabelID ? LabelIDList[LabelID - 1] : 0;
   }
 
-  /// 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;
-  }
-  
   /// getSourceLines - Return a vector of source lines.
   ///
   const std::vector<SourceLineInfo> &getSourceLines() const {
     return Lines;
   }
   
-  /// 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.
-  ///
-  void getAnchoredDescriptors(Module &M, const AnchoredDesc *Desc,
-                              std::vector<void*> &AnchoredDescs);
-  
-  /// RecordRegionStart - Indicate the start of a region.
-  ///
-  unsigned RecordRegionStart(Value *V);
-
-  /// RecordRegionEnd - Indicate the end of a region.
-  ///
-  unsigned RecordRegionEnd(Value *V);
-
-  /// 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.
@@ -603,7 +309,6 @@ public:
   /// of one is required to emit exception handling info.
   Function *getPersonality() const;
 
-  DIDeserializer *getDIDeserializer() { return &DR; }
 }; // End class MachineModuleInfo
 
 } // End llvm namespace