All targets are now allowed to have their own MachineFunctionInfo objects,
authorChris Lattner <sabre@nondot.org>
Wed, 18 Aug 2004 18:13:16 +0000 (18:13 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 18 Aug 2004 18:13:16 +0000 (18:13 +0000)
also, make getInfo do some checking and cast to the appropriate concrete type.

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

include/llvm/CodeGen/MachineFunction.h

index 3969e602305ad8ea5a82b254732b6d862143e49c..ec72f6eb449f487fb559cecb4b954a2bf76b5f85 100644 (file)
 
 namespace llvm {
 
+class Function;
+class TargetMachine;
+class SSARegMap;
+class MachineFrameInfo;
+class MachineConstantPool;
+
 // ilist_traits
 template <>
 class ilist_traits<MachineBasicBlock> {
@@ -58,15 +64,13 @@ public:
                             ilist_iterator<MachineBasicBlock> last);
 };
 
-
-class Function;
-class TargetMachine;
-class SSARegMap;
-class MachineFrameInfo;
-class MachineConstantPool;
-// MachineFunctionInfoBase - This is a gross SparcV9 hack
-struct MachineFunctionInfoBase { virtual ~MachineFunctionInfoBase() {}; };
-class MachineFunctionInfo;
+/// MachineFunctionInfo - This class can be derived from and used by targets to
+/// hold private target-specific information for each MachineFunction.  Objects
+/// of type are accessed/created with MF::getInfo and destroyed when the
+/// MachineFunction is destroyed.
+struct MachineFunctionInfo {
+  virtual ~MachineFunctionInfo() {};
+};
 
 class MachineFunction : private Annotation {
   const Function *Fn;
@@ -78,8 +82,9 @@ class MachineFunction : private Annotation {
   // Keeping track of mapping from SSA values to registers
   SSARegMap *SSARegMapping;
 
-  // Used to keep track of frame and constant area information for SparcV9 BE.
-  mutable MachineFunctionInfoBase *MFInfo;
+  // Used to keep track of target-specific per-machine function information for
+  // the target implementation.
+  MachineFunctionInfo *MFInfo;
 
   // Keep track of objects allocated on the stack.
   MachineFrameInfo *FrameInfo;
@@ -124,7 +129,14 @@ public:
   /// MachineFunctionInfo - Keep track of various per-function pieces of
   /// information for the sparc backend.
   ///
-  MachineFunctionInfo *getInfo() const;
+  template<typename Ty>
+  Ty *getInfo() {
+    if (!MFInfo) MFInfo = new Ty(*this);
+
+    assert((void*)dynamic_cast<Ty*>(MFInfo) == (void*)MFInfo &&
+           "Invalid concrete type or multiple inheritence for getInfo");
+    return static_cast<Ty*>(MFInfo);
+  }
 
   /// getBlockNumbered - MachineBasicBlocks are automatically numbered when they
   /// are inserted into the machine function.  The block number for a machine