diff options
Diffstat (limited to 'contrib/llvm/lib/Target/Mips/MipsTargetMachine.cpp')
| -rw-r--r-- | contrib/llvm/lib/Target/Mips/MipsTargetMachine.cpp | 152 | 
1 files changed, 65 insertions, 87 deletions
diff --git a/contrib/llvm/lib/Target/Mips/MipsTargetMachine.cpp b/contrib/llvm/lib/Target/Mips/MipsTargetMachine.cpp index 5046c1b782f6..bb1870ebe605 100644 --- a/contrib/llvm/lib/Target/Mips/MipsTargetMachine.cpp +++ b/contrib/llvm/lib/Target/Mips/MipsTargetMachine.cpp @@ -13,29 +13,29 @@  #include "MipsTargetMachine.h"  #include "Mips.h" +#include "Mips16FrameLowering.h" +#include "Mips16HardFloat.h" +#include "Mips16ISelDAGToDAG.h" +#include "Mips16ISelLowering.h" +#include "Mips16InstrInfo.h"  #include "MipsFrameLowering.h"  #include "MipsInstrInfo.h"  #include "MipsModuleISelDAGToDAG.h"  #include "MipsOs16.h"  #include "MipsSEFrameLowering.h" -#include "MipsSEInstrInfo.h" -#include "MipsSEISelLowering.h"  #include "MipsSEISelDAGToDAG.h" -#include "Mips16FrameLowering.h" -#include "Mips16HardFloat.h" -#include "Mips16InstrInfo.h" -#include "Mips16ISelDAGToDAG.h" -#include "Mips16ISelLowering.h" +#include "MipsSEISelLowering.h" +#include "MipsSEInstrInfo.h"  #include "llvm/Analysis/TargetTransformInfo.h"  #include "llvm/CodeGen/Passes.h"  #include "llvm/PassManager.h"  #include "llvm/Support/Debug.h" -#include "llvm/Support/raw_ostream.h"  #include "llvm/Support/TargetRegistry.h" +#include "llvm/Support/raw_ostream.h"  #include "llvm/Transforms/Scalar.h"  using namespace llvm; - +#define DEBUG_TYPE "mips"  extern "C" void LLVMInitializeMipsTarget() {    // Register the target. @@ -45,73 +45,26 @@ extern "C" void LLVMInitializeMipsTarget() {    RegisterTargetMachine<MipselTargetMachine> B(TheMips64elTarget);  } -// DataLayout --> Big-endian, 32-bit pointer/ABI/alignment -// The stack is always 8 byte aligned  // On function prologue, the stack is created by decrementing  // its pointer. Once decremented, all references are done with positive  // offset from the stack/frame pointer, using StackGrowsUp enables  // an easier handling.  // Using CodeModel::Large enables different CALL behavior. -MipsTargetMachine:: -MipsTargetMachine(const Target &T, StringRef TT, -                  StringRef CPU, StringRef FS, const TargetOptions &Options, -                  Reloc::Model RM, CodeModel::Model CM, -                  CodeGenOpt::Level OL, -                  bool isLittle) -  : LLVMTargetMachine(T, TT, CPU, FS, Options, RM, CM, OL), -    Subtarget(TT, CPU, FS, isLittle, RM, this), -    DL(isLittle ? -               (Subtarget.isABI_N64() ? -                "e-p:64:64:64-i8:8:32-i16:16:32-i64:64:64-f128:128:128-" -                "n32:64-S128" : -                "e-p:32:32:32-i8:8:32-i16:16:32-i64:64:64-n32-S64") : -               (Subtarget.isABI_N64() ? -                "E-p:64:64:64-i8:8:32-i16:16:32-i64:64:64-f128:128:128-" -                "n32:64-S128" : -                "E-p:32:32:32-i8:8:32-i16:16:32-i64:64:64-n32-S64")), -    InstrInfo(MipsInstrInfo::create(*this)), -    FrameLowering(MipsFrameLowering::create(*this, Subtarget)), -    TLInfo(MipsTargetLowering::create(*this)), TSInfo(*this), -    InstrItins(Subtarget.getInstrItineraryData()), JITInfo() { +MipsTargetMachine::MipsTargetMachine(const Target &T, StringRef TT, +                                     StringRef CPU, StringRef FS, +                                     const TargetOptions &Options, +                                     Reloc::Model RM, CodeModel::Model CM, +                                     CodeGenOpt::Level OL, bool isLittle) +    : LLVMTargetMachine(T, TT, CPU, FS, Options, RM, CM, OL), +      Subtarget(nullptr), DefaultSubtarget(TT, CPU, FS, isLittle, this), +      NoMips16Subtarget(TT, CPU, FS.empty() ? "-mips16" : FS.str() + ",-mips16", +                        isLittle, this), +      Mips16Subtarget(TT, CPU, FS.empty() ? "+mips16" : FS.str() + ",+mips16", +                      isLittle, this) { +  Subtarget = &DefaultSubtarget;    initAsmInfo();  } - -void MipsTargetMachine::setHelperClassesMips16() { -  InstrInfoSE.swap(InstrInfo); -  FrameLoweringSE.swap(FrameLowering); -  TLInfoSE.swap(TLInfo); -  if (!InstrInfo16) { -    InstrInfo.reset(MipsInstrInfo::create(*this)); -    FrameLowering.reset(MipsFrameLowering::create(*this, Subtarget)); -    TLInfo.reset(MipsTargetLowering::create(*this)); -  } else { -    InstrInfo16.swap(InstrInfo); -    FrameLowering16.swap(FrameLowering); -    TLInfo16.swap(TLInfo); -  } -  assert(TLInfo && "null target lowering 16"); -  assert(InstrInfo && "null instr info 16"); -  assert(FrameLowering && "null frame lowering 16"); -} - -void MipsTargetMachine::setHelperClassesMipsSE() { -  InstrInfo16.swap(InstrInfo); -  FrameLowering16.swap(FrameLowering); -  TLInfo16.swap(TLInfo); -  if (!InstrInfoSE) { -    InstrInfo.reset(MipsInstrInfo::create(*this)); -    FrameLowering.reset(MipsFrameLowering::create(*this, Subtarget)); -    TLInfo.reset(MipsTargetLowering::create(*this)); -  } else { -    InstrInfoSE.swap(InstrInfo); -    FrameLoweringSE.swap(FrameLowering); -    TLInfoSE.swap(TLInfo); -  } -  assert(TLInfo && "null target lowering in SE"); -  assert(InstrInfo && "null instr info SE"); -  assert(FrameLowering && "null frame lowering SE"); -}  void MipsebTargetMachine::anchor() { }  MipsebTargetMachine:: @@ -130,6 +83,23 @@ MipselTargetMachine(const Target &T, StringRef TT,                      CodeGenOpt::Level OL)    : MipsTargetMachine(T, TT, CPU, FS, Options, RM, CM, OL, true) {} +void MipsTargetMachine::resetSubtarget(MachineFunction *MF) { +  DEBUG(dbgs() << "resetSubtarget\n"); +  AttributeSet FnAttrs = MF->getFunction()->getAttributes(); +  bool Mips16Attr = FnAttrs.hasAttribute(AttributeSet::FunctionIndex, "mips16"); +  bool NoMips16Attr = +      FnAttrs.hasAttribute(AttributeSet::FunctionIndex, "nomips16"); +  assert(!(Mips16Attr && NoMips16Attr) && +         "mips16 and nomips16 specified on the same function"); +  if (Mips16Attr) +    Subtarget = &Mips16Subtarget; +  else if (NoMips16Attr) +    Subtarget = &NoMips16Subtarget; +  else +    Subtarget = &DefaultSubtarget; +  return; +} +  namespace {  /// Mips Code Generator Pass Configuration Options.  class MipsPassConfig : public TargetPassConfig { @@ -151,9 +121,13 @@ public:      return *getMipsTargetMachine().getSubtargetImpl();    } -  virtual void addIRPasses(); -  virtual bool addInstSelector(); -  virtual bool addPreEmitPass(); +  void addIRPasses() override; +  bool addInstSelector() override; +  void addMachineSSAOptimization() override; +  bool addPreEmitPass() override; + +  bool addPreRegAlloc() override; +  };  } // namespace @@ -172,18 +146,28 @@ void MipsPassConfig::addIRPasses() {  // Install an instruction selector pass using  // the ISelDag to gen Mips code.  bool MipsPassConfig::addInstSelector() { -  if (getMipsSubtarget().allowMixed16_32()) { -    addPass(createMipsModuleISelDag(getMipsTargetMachine())); -    addPass(createMips16ISelDag(getMipsTargetMachine())); -    addPass(createMipsSEISelDag(getMipsTargetMachine())); -  } else { -    addPass(createMipsISelDag(getMipsTargetMachine())); -  } +  addPass(createMipsModuleISelDag(getMipsTargetMachine())); +  addPass(createMips16ISelDag(getMipsTargetMachine())); +  addPass(createMipsSEISelDag(getMipsTargetMachine()));    return false;  } +void MipsPassConfig::addMachineSSAOptimization() { +  addPass(createMipsOptimizePICCallPass(getMipsTargetMachine())); +  TargetPassConfig::addMachineSSAOptimization(); +} + +bool MipsPassConfig::addPreRegAlloc() { +  if (getOptLevel() == CodeGenOpt::None) { +    addPass(createMipsOptimizePICCallPass(getMipsTargetMachine())); +    return true; +  } +  else +    return false; +} +  void MipsTargetMachine::addAnalysisPasses(PassManagerBase &PM) { -  if (Subtarget.allowMixed16_32()) { +  if (Subtarget->allowMixed16_32()) {      DEBUG(errs() << "No ");      //FIXME: The Basic Target Transform Info      // pass needs to become a function pass instead of @@ -200,15 +184,9 @@ void MipsTargetMachine::addAnalysisPasses(PassManagerBase &PM) {  // print out the code after the passes.  bool MipsPassConfig::addPreEmitPass() {    MipsTargetMachine &TM = getMipsTargetMachine(); -  const MipsSubtarget &Subtarget = TM.getSubtarget<MipsSubtarget>();    addPass(createMipsDelaySlotFillerPass(TM)); - -  if (Subtarget.enableLongBranchPass()) -    addPass(createMipsLongBranchPass(TM)); -  if (Subtarget.inMips16Mode() || -      Subtarget.allowMixed16_32()) -    addPass(createMipsConstantIslandPass(TM)); - +  addPass(createMipsLongBranchPass(TM)); +  addPass(createMipsConstantIslandPass(TM));    return true;  }  | 
