aboutsummaryrefslogtreecommitdiff
path: root/include/llvm/CodeGen/MachineFunction.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/llvm/CodeGen/MachineFunction.h')
-rw-r--r--include/llvm/CodeGen/MachineFunction.h36
1 files changed, 24 insertions, 12 deletions
diff --git a/include/llvm/CodeGen/MachineFunction.h b/include/llvm/CodeGen/MachineFunction.h
index 3969e60230..ec72f6eb44 100644
--- a/include/llvm/CodeGen/MachineFunction.h
+++ b/include/llvm/CodeGen/MachineFunction.h
@@ -23,6 +23,12 @@
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