add hooks to hang target-specific goop off MachineModuleInfo,
authorChris Lattner <sabre@nondot.org>
Tue, 15 Sep 2009 22:44:26 +0000 (22:44 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 15 Sep 2009 22:44:26 +0000 (22:44 +0000)
move MachineFunctionInfo virtual method out of line to give it
a home.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@81940 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/CodeGen/MachineFunction.h
include/llvm/CodeGen/MachineModuleInfo.h
lib/CodeGen/MachineFunction.cpp
lib/CodeGen/MachineModuleInfo.cpp

index ce0a208c77d343725d374a77bcc5b7ce187fd69b..9fe5dfd6220735c711c37055483a48d7fde4087c 100644 (file)
@@ -63,7 +63,7 @@ private:
 /// of type are accessed/created with MF::getInfo and destroyed when the
 /// MachineFunction is destroyed.
 struct MachineFunctionInfo {
-  virtual ~MachineFunctionInfo() {}
+  virtual ~MachineFunctionInfo();
 };
 
 class MachineFunction {
@@ -159,8 +159,8 @@ public:
   ///
   void setAlignment(unsigned A) { Alignment = A; }
 
-  /// MachineFunctionInfo - Keep track of various per-function pieces of
-  /// information for backends that would like to do so.
+  /// getInfo - Keep track of various per-function pieces of information for
+  /// backends that would like to do so.
   ///
   template<typename Ty>
   Ty *getInfo() {
index 3618898a79da0791e49e78515751d88f985927eb..88aba7ee5e4a5b9c388e448080b1bb00dbd5e8cc 100644 (file)
@@ -54,6 +54,17 @@ class MachineFunction;
 class Module;
 class PointerType;
 class StructType;
+  
+  
+/// 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.
+struct MachineModuleInfoImpl {
+  virtual ~MachineModuleInfoImpl();
+};
+  
+  
 
 //===----------------------------------------------------------------------===//
 /// LandingPadInfo - This structure is used to retain landing pad info for
@@ -80,7 +91,10 @@ struct LandingPadInfo {
 /// schemes and reformated for specific use.
 ///
 class MachineModuleInfo : public ImmutablePass {
-private:
+  /// TargetMMI - This is the target-specific implementation of
+  /// MachineModuleInfoImpl, which lets them accumulate whatever info they want.
+  MachineModuleInfoImpl *TargetMMI;
+
   // 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
@@ -132,14 +146,9 @@ public:
   MachineModuleInfo();
   ~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);
@@ -148,6 +157,24 @@ public:
   ///
   void EndFunction();
 
+  /// getInfo - Keep track of various per-function pieces of information for
+  /// backends that would like to do so.
+  ///
+  template<typename Ty>
+  Ty *getInfo() {
+    if (TargetMMI == 0)
+      TargetMMI = new Ty(*this);
+    
+    assert((void*)dynamic_cast<Ty*>(TargetMMI) == (void*)TargetMMI &&
+           "Invalid concrete type or multiple inheritence for getInfo");
+    return static_cast<Ty*>(TargetMMI);
+  }
+  
+  template<typename Ty>
+  const Ty *getInfo() const {
+    return const_cast<MachineModuleInfo*>(this)->getInfo<Ty>();
+  }
+  
   /// AnalyzeModule - Scan the module for global debug information.
   ///
   void AnalyzeModule(Module &M);
index 14ba36011f0ed8cfb11edd22a4f84e8a17428ba2..d0773ff4575dcdb8766e75db7f1f31cb40e9fdaf 100644 (file)
@@ -73,6 +73,9 @@ FunctionPass *llvm::createMachineFunctionPrinterPass(raw_ostream &OS,
 // MachineFunction implementation
 //===---------------------------------------------------------------------===//
 
+// Out of line virtual method.
+MachineFunctionInfo::~MachineFunctionInfo() {}
+
 void ilist_traits<MachineBasicBlock>::deleteNode(MachineBasicBlock *MBB) {
   MBB->getParent()->DeleteMachineBasicBlock(MBB);
 }
index a673d177fa1e1ef8643c45f3ae2d638dfab46227..b32ed81d1cb7b3c08ec94cd63439efdba30982d4 100644 (file)
@@ -32,23 +32,23 @@ static RegisterPass<MachineModuleInfo>
 X("machinemoduleinfo", "Module Information");
 char MachineModuleInfo::ID = 0;
 
+// Out of line virtual method.
+MachineModuleInfoImpl::~MachineModuleInfoImpl() {}
+
 //===----------------------------------------------------------------------===//
 
 MachineModuleInfo::MachineModuleInfo()
 : ImmutablePass(&ID)
-, LabelIDList()
-, FrameMoves()
-, LandingPads()
-, Personalities()
+, TargetMMI(0)
 , CallsEHReturn(0)
 , CallsUnwindInit(0)
-, DbgInfoAvailable(false)
-{
+, DbgInfoAvailable(false) {
   // Always emit some info, by default "no personality" info.
   Personalities.push_back(NULL);
 }
-MachineModuleInfo::~MachineModuleInfo() {
 
+MachineModuleInfo::~MachineModuleInfo() {
+  delete TargetMMI;
 }
 
 /// doInitialization - Initialize the state for a new module.