diff options
Diffstat (limited to 'llvm/lib/Target/PowerPC')
| -rw-r--r-- | llvm/lib/Target/PowerPC/PPCTargetMachine.cpp | 26 | ||||
| -rw-r--r-- | llvm/lib/Target/PowerPC/PPCTargetMachine.h | 5 | 
2 files changed, 30 insertions, 1 deletions
diff --git a/llvm/lib/Target/PowerPC/PPCTargetMachine.cpp b/llvm/lib/Target/PowerPC/PPCTargetMachine.cpp index 6645734fba7..b0bfaab125d 100644 --- a/llvm/lib/Target/PowerPC/PPCTargetMachine.cpp +++ b/llvm/lib/Target/PowerPC/PPCTargetMachine.cpp @@ -14,6 +14,7 @@  #include "PPCTargetMachine.h"  #include "PPC.h"  #include "llvm/CodeGen/Passes.h" +#include "llvm/IR/Function.h"  #include "llvm/MC/MCStreamer.h"  #include "llvm/PassManager.h"  #include "llvm/Support/CommandLine.h" @@ -93,6 +94,31 @@ PPC64TargetMachine::PPC64TargetMachine(const Target &T, StringRef TT,    : PPCTargetMachine(T, TT, CPU, FS, Options, RM, CM, OL) {  } +const PPCSubtarget * +PPCTargetMachine::getSubtargetImpl(const Function &F) const { +  AttributeSet FnAttrs = F.getAttributes(); +  Attribute CPUAttr = +      FnAttrs.getAttribute(AttributeSet::FunctionIndex, "target-cpu"); +  Attribute FSAttr = +      FnAttrs.getAttribute(AttributeSet::FunctionIndex, "target-features"); + +  std::string CPU = !CPUAttr.hasAttribute(Attribute::None) +                        ? CPUAttr.getValueAsString().str() +                        : TargetCPU; +  std::string FS = !FSAttr.hasAttribute(Attribute::None) +                       ? FSAttr.getValueAsString().str() +                       : TargetFS; + +  auto &I = SubtargetMap[CPU + FS]; +  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 = llvm::make_unique<PPCSubtarget>(TargetTriple, CPU, FS, *this); +  } +  return I.get(); +}  //===----------------------------------------------------------------------===//  // Pass Pipeline Configuration diff --git a/llvm/lib/Target/PowerPC/PPCTargetMachine.h b/llvm/lib/Target/PowerPC/PPCTargetMachine.h index ea7f27ae18a..35e2518462b 100644 --- a/llvm/lib/Target/PowerPC/PPCTargetMachine.h +++ b/llvm/lib/Target/PowerPC/PPCTargetMachine.h @@ -24,7 +24,9 @@ namespace llvm {  /// PPCTargetMachine - Common code between 32-bit and 64-bit PowerPC targets.  ///  class PPCTargetMachine : public LLVMTargetMachine { -  PPCSubtarget        Subtarget; +  PPCSubtarget Subtarget; + +  mutable StringMap<std::unique_ptr<PPCSubtarget>> SubtargetMap;  public:    PPCTargetMachine(const Target &T, StringRef TT, @@ -33,6 +35,7 @@ public:                     CodeGenOpt::Level OL);    const PPCSubtarget *getSubtargetImpl() const override { return &Subtarget; } +  const PPCSubtarget *getSubtargetImpl(const Function &F) const override;    // Pass Pipeline Configuration    TargetPassConfig *createPassConfig(PassManagerBase &PM) override;  | 

