diff options
Diffstat (limited to 'lib/Target/Mips/MipsConstantIslandPass.cpp')
| -rw-r--r-- | lib/Target/Mips/MipsConstantIslandPass.cpp | 85 | 
1 files changed, 85 insertions, 0 deletions
| diff --git a/lib/Target/Mips/MipsConstantIslandPass.cpp b/lib/Target/Mips/MipsConstantIslandPass.cpp new file mode 100644 index 000000000000..b5de1ebad22b --- /dev/null +++ b/lib/Target/Mips/MipsConstantIslandPass.cpp @@ -0,0 +1,85 @@ +//===-- MipsConstantIslandPass.cpp - Emit Pc Relative loads----------------===// +// +//                     The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// +// This pass is used to make Pc relative loads of constants. +// For now, only Mips16 will use this. While it has the same name and +// uses many ideas from the LLVM ARM Constant Island Pass, it's not intended +// to reuse any of the code from the ARM version. +// +// Loading constants inline is expensive on Mips16 and it's in general better +// to place the constant nearby in code space and then it can be loaded with a +// simple 16 bit load instruction. +// +// The constants can be not just numbers but addresses of functions and labels. +// This can be particularly helpful in static relocation mode for embedded +// non linux targets. +// +// + +#define DEBUG_TYPE "mips-constant-islands" + +#include "Mips.h" +#include "MCTargetDesc/MipsBaseInfo.h" +#include "MipsTargetMachine.h" +#include "llvm/ADT/Statistic.h" +#include "llvm/CodeGen/MachineFunctionPass.h" +#include "llvm/CodeGen/MachineInstrBuilder.h" +#include "llvm/IR/Function.h" +#include "llvm/Support/CommandLine.h" +#include "llvm/Support/MathExtras.h" +#include "llvm/Target/TargetInstrInfo.h" +#include "llvm/Target/TargetMachine.h" +#include "llvm/Target/TargetRegisterInfo.h" + +using namespace llvm; + +namespace { +  typedef MachineBasicBlock::iterator Iter; +  typedef MachineBasicBlock::reverse_iterator ReverseIter; + +  class MipsConstantIslands : public MachineFunctionPass { + +  public: +    static char ID; +    MipsConstantIslands(TargetMachine &tm) +      : MachineFunctionPass(ID), TM(tm), +        TII(static_cast<const MipsInstrInfo*>(tm.getInstrInfo())), +        IsPIC(TM.getRelocationModel() == Reloc::PIC_), +        ABI(TM.getSubtarget<MipsSubtarget>().getTargetABI()) {} + +    virtual const char *getPassName() const { +      return "Mips Constant Islands"; +    } + +    bool runOnMachineFunction(MachineFunction &F); + +  private: + + +    const TargetMachine &TM; +    const MipsInstrInfo *TII; +    bool IsPIC; +    unsigned ABI; + +  }; + +  char MipsConstantIslands::ID = 0; +} // end of anonymous namespace + +/// createMipsLongBranchPass - Returns a pass that converts branches to long +/// branches. +FunctionPass *llvm::createMipsConstantIslandPass(MipsTargetMachine &tm) { +  return new MipsConstantIslands(tm); +} + +bool MipsConstantIslands::runOnMachineFunction(MachineFunction &F) { +  return true; +} + | 
