mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-24 22:24:54 +00:00
Add subtarget caches to aarch64, arm, ppc, and x86.
These will make it easier to test further changes to the code generation and optimization pipelines as those are moved to subtargets initialized with target feature and target cpu. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@219106 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -14,6 +14,7 @@
|
||||
#include "ARMTargetMachine.h"
|
||||
#include "ARMFrameLowering.h"
|
||||
#include "llvm/CodeGen/Passes.h"
|
||||
#include "llvm/IR/Function.h"
|
||||
#include "llvm/MC/MCAsmInfo.h"
|
||||
#include "llvm/PassManager.h"
|
||||
#include "llvm/Support/CommandLine.h"
|
||||
@@ -42,7 +43,6 @@ extern "C" void LLVMInitializeARMTarget() {
|
||||
RegisterTargetMachine<ThumbBETargetMachine> B(TheThumbBETarget);
|
||||
}
|
||||
|
||||
|
||||
/// TargetMachine ctor - Create an ARM architecture model.
|
||||
///
|
||||
ARMBaseTargetMachine::ARMBaseTargetMachine(const Target &T, StringRef TT,
|
||||
@@ -51,7 +51,7 @@ ARMBaseTargetMachine::ARMBaseTargetMachine(const Target &T, StringRef TT,
|
||||
Reloc::Model RM, CodeModel::Model CM,
|
||||
CodeGenOpt::Level OL, bool isLittle)
|
||||
: LLVMTargetMachine(T, TT, CPU, FS, Options, RM, CM, OL),
|
||||
Subtarget(TT, CPU, FS, *this, isLittle) {
|
||||
Subtarget(TT, CPU, FS, *this, isLittle), isLittle(isLittle) {
|
||||
|
||||
// Default to triple-appropriate float ABI
|
||||
if (Options.FloatABIType == FloatABI::Default)
|
||||
@@ -59,6 +59,44 @@ ARMBaseTargetMachine::ARMBaseTargetMachine(const Target &T, StringRef TT,
|
||||
Subtarget.isTargetHardFloat() ? FloatABI::Hard : FloatABI::Soft;
|
||||
}
|
||||
|
||||
const ARMSubtarget *
|
||||
ARMBaseTargetMachine::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;
|
||||
|
||||
// FIXME: This is related to the code below to reset the target options,
|
||||
// we need to know whether or not the soft float flag is set on the
|
||||
// function before we can generate a subtarget. We also need to use
|
||||
// it as a key for the subtarget since that can be the only difference
|
||||
// between two functions.
|
||||
Attribute SFAttr =
|
||||
FnAttrs.getAttribute(AttributeSet::FunctionIndex, "use-soft-float");
|
||||
bool SoftFloat = !SFAttr.hasAttribute(Attribute::None)
|
||||
? SFAttr.getValueAsString() == "true"
|
||||
: Options.UseSoftFloat;
|
||||
|
||||
auto &I = SubtargetMap[CPU + FS + (SoftFloat ? "use-soft-float=true"
|
||||
: "use-soft-float=false")];
|
||||
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<ARMSubtarget>(TargetTriple, CPU, FS, *this, isLittle);
|
||||
}
|
||||
return I.get();
|
||||
}
|
||||
|
||||
void ARMBaseTargetMachine::addAnalysisPasses(PassManagerBase &PM) {
|
||||
// Add first the target-independent BasicTTI pass, then our ARM pass. This
|
||||
// allows the ARM pass to delegate to the target independent layer when
|
||||
|
Reference in New Issue
Block a user