Change target-specific classes to use more precise static types.
authorDan Gohman <gohman@apple.com>
Wed, 14 May 2008 01:58:56 +0000 (01:58 +0000)
committerDan Gohman <gohman@apple.com>
Wed, 14 May 2008 01:58:56 +0000 (01:58 +0000)
This eliminates the need for several awkward casts, including
the last dynamic_cast under lib/Target.

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

24 files changed:
lib/Target/ARM/ARMInstrInfo.h
lib/Target/ARM/ARMTargetMachine.h
lib/Target/Alpha/Alpha.h
lib/Target/Alpha/AlphaISelDAGToDAG.cpp
lib/Target/Alpha/AlphaInstrInfo.h
lib/Target/Alpha/AlphaTargetMachine.h
lib/Target/CellSPU/SPUInstrInfo.h
lib/Target/CellSPU/SPUTargetMachine.h
lib/Target/IA64/IA64InstrInfo.h
lib/Target/IA64/IA64TargetMachine.h
lib/Target/Mips/MipsInstrInfo.h
lib/Target/Mips/MipsTargetMachine.h
lib/Target/PIC16/PIC16InstrInfo.h
lib/Target/PIC16/PIC16TargetMachine.h
lib/Target/PowerPC/PPCInstrInfo.h
lib/Target/PowerPC/PPCTargetMachine.h
lib/Target/Sparc/SparcInstrInfo.h
lib/Target/Sparc/SparcTargetMachine.h
lib/Target/X86/X86CodeEmitter.cpp
lib/Target/X86/X86ISelLowering.cpp
lib/Target/X86/X86ISelLowering.h
lib/Target/X86/X86InstrInfo.cpp
lib/Target/X86/X86InstrInfo.h
lib/Target/X86/X86TargetMachine.h

index 7bcedd8329b818939e3daadb96c692312e44873b..be95d56a69ac0f5671e7d535e1f411c5460142f1 100644 (file)
@@ -134,7 +134,7 @@ public:
   /// such, whenever a client has an instance of instruction info, it should
   /// always be able to get register info as well (through this method).
   ///
-  virtual const TargetRegisterInfo &getRegisterInfo() const { return RI; }
+  virtual const ARMRegisterInfo &getRegisterInfo() const { return RI; }
 
   /// getPointerRegClass - Return the register class to use to hold pointers.
   /// This is used for addressing modes.
index d4c4118572122b52a05ac1c6c58d2bd76d3c76c3..79aa45d8def7900df8d76143673340ee2f798fa9 100644 (file)
@@ -38,10 +38,10 @@ class ARMTargetMachine : public LLVMTargetMachine {
 public:
   ARMTargetMachine(const Module &M, const std::string &FS, bool isThumb = false);
 
-  virtual const ARMInstrInfo *getInstrInfo() const { return &InstrInfo; }
-  virtual const TargetFrameInfo  *getFrameInfo() const { return &FrameInfo; }
-  virtual       TargetJITInfo    *getJITInfo()         { return &JITInfo; }
-  virtual const TargetRegisterInfo *getRegisterInfo() const {
+  virtual const ARMInstrInfo     *getInstrInfo() const { return &InstrInfo; }
+  virtual const ARMFrameInfo     *getFrameInfo() const { return &FrameInfo; }
+  virtual       ARMJITInfo       *getJITInfo()         { return &JITInfo; }
+  virtual const ARMRegisterInfo  *getRegisterInfo() const {
     return &InstrInfo.getRegisterInfo();
   }
   virtual const TargetData       *getTargetData() const { return &DataLayout; }
index 40725afcfefd64cd0662f6e76293868340dee221..77b404f025ff8015953a2c09acca919ed8fc6851 100644 (file)
@@ -25,7 +25,7 @@ namespace llvm {
   class MachineCodeEmitter;
 
   FunctionPass *createAlphaSimpleInstructionSelector(TargetMachine &TM);
-  FunctionPass *createAlphaISelDag(TargetMachine &TM);
+  FunctionPass *createAlphaISelDag(AlphaTargetMachine &TM);
   FunctionPass *createAlphaCodePrinterPass(std::ostream &OS,
                                              TargetMachine &TM);
   FunctionPass *createAlphaPatternInstructionSelector(TargetMachine &TM);
index b0ca39b945c9cace0c986ae92d8cb540160846ca..303c5aa3b3f568cf474fd25caf7962583380f059 100644 (file)
@@ -146,9 +146,9 @@ namespace {
     }
 
   public:
-    AlphaDAGToDAGISel(TargetMachine &TM)
+    explicit AlphaDAGToDAGISel(AlphaTargetMachine &TM)
       : SelectionDAGISel(AlphaLowering), 
-        AlphaLowering(*(AlphaTargetLowering*)(TM.getTargetLowering())) 
+        AlphaLowering(*TM.getTargetLowering())
     {}
 
     /// getI64Imm - Return a target constant with the specified value, of type
@@ -559,6 +559,6 @@ void AlphaDAGToDAGISel::SelectCALL(SDOperand Op) {
 /// createAlphaISelDag - This pass converts a legalized DAG into a 
 /// Alpha-specific DAG, ready for instruction scheduling.
 ///
-FunctionPass *llvm::createAlphaISelDag(TargetMachine &TM) {
+FunctionPass *llvm::createAlphaISelDag(AlphaTargetMachine &TM) {
   return new AlphaDAGToDAGISel(TM);
 }
index 0b51f2d32200611fca6cc0e97df99eff1693f5a7..063eb0c21813062e030120d7363e149b24fe4bf1 100644 (file)
@@ -28,7 +28,7 @@ public:
   /// such, whenever a client has an instance of instruction info, it should
   /// always be able to get register info as well (through this method).
   ///
-  virtual const TargetRegisterInfo &getRegisterInfo() const { return RI; }
+  virtual const AlphaRegisterInfo &getRegisterInfo() const { return RI; }
 
   /// Return true if the instruction is a register to register move and
   /// leave the source and dest operands in the passed parameters.
index d365b7d29b0c1951fff7766e9204c1de7ec45a93..eab34c2afaed395ee6c83d41e707b24dab3ded4d 100644 (file)
@@ -42,15 +42,15 @@ public:
 
   virtual const AlphaInstrInfo *getInstrInfo() const { return &InstrInfo; }
   virtual const TargetFrameInfo  *getFrameInfo() const { return &FrameInfo; }
-  virtual const TargetSubtarget  *getSubtargetImpl() const{ return &Subtarget; }
-  virtual const TargetRegisterInfo *getRegisterInfo() const {
+  virtual const AlphaSubtarget   *getSubtargetImpl() const{ return &Subtarget; }
+  virtual const AlphaRegisterInfo *getRegisterInfo() const {
     return &InstrInfo.getRegisterInfo();
   }
-  virtual TargetLowering* getTargetLowering() const { 
+  virtual AlphaTargetLowering* getTargetLowering() const { 
     return const_cast<AlphaTargetLowering*>(&TLInfo);
   }
   virtual const TargetData       *getTargetData() const { return &DataLayout; }
-  virtual TargetJITInfo* getJITInfo() {
+  virtual AlphaJITInfo* getJITInfo() {
     return &JITInfo;
   }
 
index dc492023bb58aea587754bccc1e449e02b47d4bf..9adffde66b9be630301e3ba84256f428dd230285 100644 (file)
@@ -30,7 +30,7 @@ namespace llvm {
     /// such, whenever a client has an instance of instruction info, it should
     /// always be able to get register info as well (through this method).
     ///
-    virtual const TargetRegisterInfo &getRegisterInfo() const { return RI; }
+    virtual const SPURegisterInfo &getRegisterInfo() const { return RI; }
 
     /// getPointerRegClass - Return the register class to use to hold pointers.
     /// This is used for addressing modes.
index c8f70d7683943e3619284b65509031e04cf4cd46..78fb5478b748fb8dd6558fe38c7395d2c08d812b 100644 (file)
@@ -49,7 +49,7 @@ public:
   virtual const SPUInstrInfo     *getInstrInfo() const {
     return &InstrInfo;
   }
-  virtual const TargetFrameInfo  *getFrameInfo() const {
+  virtual const SPUFrameInfo     *getFrameInfo() const {
     return &FrameInfo;
   }
   /*!
@@ -70,7 +70,7 @@ public:
    return const_cast<SPUTargetLowering*>(&TLInfo); 
   }
 
-  virtual const TargetRegisterInfo *getRegisterInfo() const {
+  virtual const SPURegisterInfo *getRegisterInfo() const {
     return &InstrInfo.getRegisterInfo();
   }
   
index e5da6f1e25a486cd7b02ffddd9dd67d6f428959c..66276d509d0ac666b11467c4782eb71810d8e457 100644 (file)
@@ -28,7 +28,7 @@ public:
   /// such, whenever a client has an instance of instruction info, it should
   /// always be able to get register info as well (through this method).
   ///
-  virtual const TargetRegisterInfo &getRegisterInfo() const { return RI; }
+  virtual const IA64RegisterInfo &getRegisterInfo() const { return RI; }
 
   //
   // Return true if the instruction is a register to register move and
index 9e553a1338ec456251b59a836555d647fc34d343..cbcbb0fa9eb285e29e5dd9f10b45938cc98778c6 100644 (file)
@@ -40,7 +40,7 @@ public:
   virtual       IA64TargetLowering *getTargetLowering() const { 
     return const_cast<IA64TargetLowering*>(&TLInfo);
   }
-  virtual const TargetRegisterInfo    *getRegisterInfo() const {
+  virtual const IA64RegisterInfo   *getRegisterInfo() const {
     return &InstrInfo.getRegisterInfo();
   }
   virtual const TargetData       *getTargetData() const { return &DataLayout; }
index 9842414dbab89b1fa4032ed090b6a1cbb60b53be..1c094a8f3dbeef942eb806f601302223d65c8054 100644 (file)
@@ -52,7 +52,7 @@ public:
   /// such, whenever a client has an instance of instruction info, it should
   /// always be able to get register info as well (through this method).
   ///
-  virtual const TargetRegisterInfo &getRegisterInfo() const { return RI; }
+  virtual const MipsRegisterInfo &getRegisterInfo() const { return RI; }
 
   /// Return true if the instruction is a register to register move and
   /// leave the source and dest operands in the passed parameters.
index 2b877f2beefd9e517685b343cdfeb81843ce14e3..8e08479f3adb892723056ca710e0bf2a680fec5a 100644 (file)
@@ -39,12 +39,12 @@ namespace llvm {
     { return &InstrInfo; }
     virtual const TargetFrameInfo *getFrameInfo()     const 
     { return &FrameInfo; }
-    virtual const TargetSubtarget *getSubtargetImpl() const 
+    virtual const MipsSubtarget   *getSubtargetImpl() const 
     { return &Subtarget; }
     virtual const TargetData      *getTargetData()    const 
     { return &DataLayout;}
 
-    virtual const TargetRegisterInfo   *getRegisterInfo()  const {
+    virtual const MipsRegisterInfo *getRegisterInfo()  const {
       return &InstrInfo.getRegisterInfo();
     }
 
index f764668eac2e414fb9bdaa88312f05634df7dfbe..b8648307e542258852d7ed086f6b54c0a81e58dd 100644 (file)
@@ -32,7 +32,7 @@ public:
   /// such, whenever a client has an instance of instruction info, it should
   /// always be able to get register info as well (through this method).
   ///
-  virtual const TargetRegisterInfo &getRegisterInfo() const { return RI; }
+  virtual const PIC16RegisterInfo &getRegisterInfo() const { return RI; }
 
   
   /// isLoadFromStackSlot - If the specified machine instruction is a direct
index 93ef0d1e9935e600fb2311f65f05077f001ae517..b89addccc9238e4c1327ef33870091fe60ed3618 100644 (file)
@@ -47,7 +47,7 @@ public:
   { return &DataLayout; }
   virtual PIC16TargetLowering *getTargetLowering() const 
   { return const_cast<PIC16TargetLowering*>(&TLInfo); }
-  virtual const TargetRegisterInfo *getRegisterInfo() const 
+  virtual const PIC16RegisterInfo *getRegisterInfo() const 
   { return &InstrInfo.getRegisterInfo(); }
   
   virtual bool addInstSelector(PassManagerBase &PM, bool Fast);
index 5bd4c4d9476d030ea7f4139366c2a57f9221a3f6..ffeab791c83bae0b038f8c78e2fc02dd1c3ebf51 100644 (file)
@@ -78,7 +78,7 @@ public:
   /// such, whenever a client has an instance of instruction info, it should
   /// always be able to get register info as well (through this method).
   ///
-  virtual const TargetRegisterInfo &getRegisterInfo() const { return RI; }
+  virtual const PPCRegisterInfo &getRegisterInfo() const { return RI; }
 
   /// getPointerRegClass - Return the register class to use to hold pointers.
   /// This is used for addressing modes.
index ed8780968fe027d8ad31d7d88a965904bc41314b..ac2c2aa723ef5fd77bcdbf7b1ff6c7dec5cadcfb 100644 (file)
@@ -46,12 +46,12 @@ public:
   PPCTargetMachine(const Module &M, const std::string &FS, bool is64Bit);
 
   virtual const PPCInstrInfo     *getInstrInfo() const { return &InstrInfo; }
-  virtual const TargetFrameInfo  *getFrameInfo() const { return &FrameInfo; }
-  virtual       TargetJITInfo    *getJITInfo()         { return &JITInfo; }
+  virtual const PPCFrameInfo     *getFrameInfo() const { return &FrameInfo; }
+  virtual       PPCJITInfo       *getJITInfo()         { return &JITInfo; }
   virtual       PPCTargetLowering *getTargetLowering() const { 
    return const_cast<PPCTargetLowering*>(&TLInfo); 
   }
-  virtual const TargetRegisterInfo    *getRegisterInfo() const {
+  virtual const PPCRegisterInfo  *getRegisterInfo() const {
     return &InstrInfo.getRegisterInfo();
   }
   
index e9ce790a2a004e4ceb84c684d724f51c269e5ef6..309b268bba44a6233c59f23aee4a04d42e793185 100644 (file)
@@ -41,7 +41,7 @@ public:
   /// such, whenever a client has an instance of instruction info, it should
   /// always be able to get register info as well (through this method).
   ///
-  virtual const TargetRegisterInfo &getRegisterInfo() const { return RI; }
+  virtual const SparcRegisterInfo &getRegisterInfo() const { return RI; }
 
   /// Return true if the instruction is a register to register move and
   /// leave the source and dest operands in the passed parameters.
index 6ccb0d6c3b35d2e5c6a240b1a92b53aee096012e..1d1acd26ee1ae5f7b045c182aeacd0f9b41885a8 100644 (file)
@@ -38,8 +38,8 @@ public:
 
   virtual const SparcInstrInfo *getInstrInfo() const { return &InstrInfo; }
   virtual const TargetFrameInfo  *getFrameInfo() const { return &FrameInfo; }
-  virtual const TargetSubtarget  *getSubtargetImpl() const{ return &Subtarget; }
-  virtual const TargetRegisterInfo *getRegisterInfo() const {
+  virtual const SparcSubtarget   *getSubtargetImpl() const{ return &Subtarget; }
+  virtual const SparcRegisterInfo *getRegisterInfo() const {
     return &InstrInfo.getRegisterInfo();
   }
   virtual const TargetData       *getTargetData() const { return &DataLayout; }
index 70dc926c79854630bf3c5bb94f4574431e49ab9a..7aa4506ad1d1d708ae4dfc58e06ff2d06ef36a94 100644 (file)
@@ -38,18 +38,18 @@ namespace {
   class VISIBILITY_HIDDEN Emitter : public MachineFunctionPass {
     const X86InstrInfo  *II;
     const TargetData    *TD;
-    TargetMachine       &TM;
+    X86TargetMachine    &TM;
     MachineCodeEmitter  &MCE;
     intptr_t PICBaseOffset;
     bool Is64BitMode;
     bool IsPIC;
   public:
     static char ID;
-    explicit Emitter(TargetMachine &tm, MachineCodeEmitter &mce)
+    explicit Emitter(X86TargetMachine &tm, MachineCodeEmitter &mce)
       : MachineFunctionPass((intptr_t)&ID), II(0), TD(0), TM(tm), 
       MCE(mce), PICBaseOffset(0), Is64BitMode(false),
       IsPIC(TM.getRelocationModel() == Reloc::PIC_) {}
-    Emitter(TargetMachine &tm, MachineCodeEmitter &mce,
+    Emitter(X86TargetMachine &tm, MachineCodeEmitter &mce,
             const X86InstrInfo &ii, const TargetData &td, bool is64)
       : MachineFunctionPass((intptr_t)&ID), II(&ii), TD(&td), TM(tm), 
       MCE(mce), PICBaseOffset(0), Is64BitMode(is64),
@@ -112,8 +112,8 @@ bool Emitter::runOnMachineFunction(MachineFunction &MF) {
   
   MCE.setModuleInfo(&getAnalysis<MachineModuleInfo>());
   
-  II = ((X86TargetMachine&)TM).getInstrInfo();
-  TD = ((X86TargetMachine&)TM).getTargetData();
+  II = TM.getInstrInfo();
+  TD = TM.getTargetData();
   Is64BitMode = TM.getSubtarget<X86Subtarget>().is64Bit();
   
   do {
@@ -220,7 +220,7 @@ void Emitter::emitJumpTableAddress(unsigned JTI, unsigned Reloc,
 }
 
 unsigned Emitter::getX86RegNum(unsigned RegNo) const {
-  return ((const X86RegisterInfo&)II->getRegisterInfo()).getX86RegNum(RegNo);
+  return II->getRegisterInfo().getX86RegNum(RegNo);
 }
 
 inline static unsigned char ModRMByte(unsigned Mod, unsigned RegOpcode,
@@ -503,7 +503,7 @@ void Emitter::emitInstruction(const MachineInstr &MI,
       emitConstant(0, X86InstrInfo::sizeOfImm(Desc));
       // Remember PIC base.
       PICBaseOffset = MCE.getCurrentPCOffset();
-      X86JITInfo *JTI = dynamic_cast<X86JITInfo*>(TM.getJITInfo());
+      X86JITInfo *JTI = TM.getJITInfo();
       JTI->setPICBase(MCE.getCurrentPCValue());
       break;
     }
index 4cc3f2702220833fe783f2bfd75226f0341b7972..3bb4bc712bbb6827306d3900daa9afb8292acb06 100644 (file)
@@ -44,7 +44,7 @@ using namespace llvm;
 // Forward declarations.
 static SDOperand getMOVLMask(unsigned NumElems, SelectionDAG &DAG);
 
-X86TargetLowering::X86TargetLowering(TargetMachine &TM)
+X86TargetLowering::X86TargetLowering(X86TargetMachine &TM)
   : TargetLowering(TM) {
   Subtarget = &TM.getSubtarget<X86Subtarget>();
   X86ScalarSSEf64 = Subtarget->hasSSE2();
@@ -5284,10 +5284,8 @@ SDOperand X86TargetLowering::LowerTRAMPOLINE(SDOperand Op,
     const unsigned char JMP64r  = TII->getBaseOpcodeFor(X86::JMP64r);
     const unsigned char MOV64ri = TII->getBaseOpcodeFor(X86::MOV64ri);
 
-    const unsigned char N86R10 =
-      ((const X86RegisterInfo*)RegInfo)->getX86RegNum(X86::R10);
-    const unsigned char N86R11 =
-      ((const X86RegisterInfo*)RegInfo)->getX86RegNum(X86::R11);
+    const unsigned char N86R10 = RegInfo->getX86RegNum(X86::R10);
+    const unsigned char N86R11 = RegInfo->getX86RegNum(X86::R11);
 
     const unsigned char REX_WB = 0x40 | 0x08 | 0x01; // REX prefix
 
@@ -5374,8 +5372,7 @@ SDOperand X86TargetLowering::LowerTRAMPOLINE(SDOperand Op,
     Disp = DAG.getNode(ISD::SUB, MVT::i32, FPtr, Addr);
 
     const unsigned char MOV32ri = TII->getBaseOpcodeFor(X86::MOV32ri);
-    const unsigned char N86Reg =
-      ((const X86RegisterInfo*)RegInfo)->getX86RegNum(NestReg);
+    const unsigned char N86Reg = RegInfo->getX86RegNum(NestReg);
     OutChains[0] = DAG.getStore(Root, DAG.getConstant(MOV32ri|N86Reg, MVT::i8),
                                 Trmp, TrmpAddr, 0);
 
index 59cc5163cc2b9bc423985a05f0759ef1aa61dd62..eea10eee6300aaff977ed13c59b07c8a8faf3dc4 100644 (file)
@@ -311,7 +311,7 @@ namespace llvm {
     int BytesCallerReserves;          // Number of arg bytes caller makes.
 
   public:
-    explicit X86TargetLowering(TargetMachine &TM);
+    explicit X86TargetLowering(X86TargetMachine &TM);
 
     /// getPICJumpTableRelocaBase - Returns relocation base for the given PIC
     /// jumptable.
@@ -454,7 +454,7 @@ namespace llvm {
     /// Subtarget - Keep a pointer to the X86Subtarget around so that we can
     /// make the right decision when generating code for different targets.
     const X86Subtarget *Subtarget;
-    const TargetRegisterInfo *RegInfo;
+    const X86RegisterInfo *RegInfo;
 
     /// X86StackPtr - X86 physical register used as stack ptr.
     unsigned X86StackPtr;
index d2c5abe6d6380bae5e86a5d07dadf294f45f117a..4d4867ffef41038dc88503c06cdaf310ec8f6b51 100644 (file)
@@ -2820,7 +2820,7 @@ static unsigned GetInstSizeWithDesc(const MachineInstr &MI,
 unsigned X86InstrInfo::GetInstSizeInBytes(const MachineInstr *MI) const {
   const TargetInstrDesc &Desc = MI->getDesc();
   bool IsPIC = (TM.getRelocationModel() == Reloc::PIC_);
-  bool Is64BitMode = ((X86Subtarget*)TM.getSubtargetImpl())->is64Bit();
+  bool Is64BitMode = TM.getSubtargetImpl()->is64Bit();
   unsigned Size = GetInstSizeWithDesc(*MI, &Desc, IsPIC, Is64BitMode);
   if (Desc.getOpcode() == X86::MOVPC32r) {
     Size += GetInstSizeWithDesc(*MI, &get(X86::POP32r), IsPIC, Is64BitMode);
index 06080b74af4b414cb5574270a8baba49453fded7..b49fb31c16a678faf835b9935654507ea11d9301 100644 (file)
@@ -250,7 +250,7 @@ public:
   /// such, whenever a client has an instance of instruction info, it should
   /// always be able to get register info as well (through this method).
   ///
-  virtual const TargetRegisterInfo &getRegisterInfo() const { return RI; }
+  virtual const X86RegisterInfo &getRegisterInfo() const { return RI; }
 
   // Return true if the instruction is a register to register move and
   // leave the source and dest operands in the passed parameters.
index 294478c3a285ecbaee220f164ad321c4e21f37eb..5f814ea70401e7ac75ca8b7ad5509e9eb9e773f9 100644 (file)
@@ -44,12 +44,12 @@ public:
 
   virtual const X86InstrInfo     *getInstrInfo() const { return &InstrInfo; }
   virtual const TargetFrameInfo  *getFrameInfo() const { return &FrameInfo; }
-  virtual       TargetJITInfo    *getJITInfo()         { return &JITInfo; }
-  virtual const TargetSubtarget  *getSubtargetImpl() const{ return &Subtarget; }
+  virtual       X86JITInfo       *getJITInfo()         { return &JITInfo; }
+  virtual const X86Subtarget     *getSubtargetImpl() const{ return &Subtarget; }
   virtual       X86TargetLowering *getTargetLowering() const { 
     return const_cast<X86TargetLowering*>(&TLInfo); 
   }
-  virtual const TargetRegisterInfo    *getRegisterInfo() const {
+  virtual const X86RegisterInfo  *getRegisterInfo() const {
     return &InstrInfo.getRegisterInfo();
   }
   virtual const TargetData       *getTargetData() const { return &DataLayout; }