From 8bdf87d1d8abde45c40b2698dd9af8407007281c Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Wed, 18 Aug 2004 18:13:16 +0000 Subject: [PATCH] All targets are now allowed to have their own MachineFunctionInfo objects, 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 | 36 +++++++++++++++++--------- 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/include/llvm/CodeGen/MachineFunction.h b/include/llvm/CodeGen/MachineFunction.h index 3969e602305..ec72f6eb449 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 { @@ -58,15 +64,13 @@ public: ilist_iterator 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 + Ty *getInfo() { + if (!MFInfo) MFInfo = new Ty(*this); + + assert((void*)dynamic_cast(MFInfo) == (void*)MFInfo && + "Invalid concrete type or multiple inheritence for getInfo"); + return static_cast(MFInfo); + } /// getBlockNumbered - MachineBasicBlocks are automatically numbered when they /// are inserted into the machine function. The block number for a machine