diff options
Diffstat (limited to 'llvm/lib/Target/RISCV/RISCVTargetMachine.cpp')
| -rw-r--r-- | llvm/lib/Target/RISCV/RISCVTargetMachine.cpp | 33 | 
1 files changed, 30 insertions, 3 deletions
| diff --git a/llvm/lib/Target/RISCV/RISCVTargetMachine.cpp b/llvm/lib/Target/RISCV/RISCVTargetMachine.cpp index 5ffc6eda6bd7..2bb26988c7da 100644 --- a/llvm/lib/Target/RISCV/RISCVTargetMachine.cpp +++ b/llvm/lib/Target/RISCV/RISCVTargetMachine.cpp @@ -25,12 +25,13 @@  #include "llvm/CodeGen/TargetLoweringObjectFileImpl.h"  #include "llvm/CodeGen/TargetPassConfig.h"  #include "llvm/IR/LegacyPassManager.h" +#include "llvm/InitializePasses.h"  #include "llvm/Support/FormattedStream.h"  #include "llvm/Support/TargetRegistry.h"  #include "llvm/Target/TargetOptions.h"  using namespace llvm; -extern "C" void LLVMInitializeRISCVTarget() { +extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeRISCVTarget() {    RegisterTargetMachine<RISCVTargetMachine> X(getTheRISCV32Target());    RegisterTargetMachine<RISCVTargetMachine> Y(getTheRISCV64Target());    auto PR = PassRegistry::getPassRegistry(); @@ -63,9 +64,35 @@ RISCVTargetMachine::RISCVTargetMachine(const Target &T, const Triple &TT,      : LLVMTargetMachine(T, computeDataLayout(TT), TT, CPU, FS, Options,                          getEffectiveRelocModel(TT, RM),                          getEffectiveCodeModel(CM, CodeModel::Small), OL), -      TLOF(std::make_unique<RISCVELFTargetObjectFile>()), -      Subtarget(TT, CPU, FS, Options.MCOptions.getABIName(), *this) { +      TLOF(std::make_unique<RISCVELFTargetObjectFile>()) {    initAsmInfo(); + +  // RISC-V supports the MachineOutliner. +  setMachineOutliner(true); +} + +const RISCVSubtarget * +RISCVTargetMachine::getSubtargetImpl(const Function &F) const { +  Attribute CPUAttr = F.getFnAttribute("target-cpu"); +  Attribute FSAttr = F.getFnAttribute("target-features"); + +  std::string CPU = !CPUAttr.hasAttribute(Attribute::None) +                        ? CPUAttr.getValueAsString().str() +                        : TargetCPU; +  std::string FS = !FSAttr.hasAttribute(Attribute::None) +                       ? FSAttr.getValueAsString().str() +                       : TargetFS; +  std::string Key = CPU + FS; +  auto &I = SubtargetMap[Key]; +  if (!I) { +    // This needs to be done before we create a new subtarget since any +    // creation will depend on the TM and the code generation flags on the +    // function that reside in TargetOptions. +    resetTargetOptions(F); +    I = std::make_unique<RISCVSubtarget>(TargetTriple, CPU, FS, +                                         Options.MCOptions.getABIName(), *this); +  } +  return I.get();  }  TargetTransformInfo | 
