diff options
Diffstat (limited to 'llvm/lib/Target/ARM/ARMTargetMachine.cpp')
-rw-r--r-- | llvm/lib/Target/ARM/ARMTargetMachine.cpp | 33 |
1 files changed, 22 insertions, 11 deletions
diff --git a/llvm/lib/Target/ARM/ARMTargetMachine.cpp b/llvm/lib/Target/ARM/ARMTargetMachine.cpp index 5c8007f101d9..84876eda33a6 100644 --- a/llvm/lib/Target/ARM/ARMTargetMachine.cpp +++ b/llvm/lib/Target/ARM/ARMTargetMachine.cpp @@ -46,6 +46,7 @@ #include "llvm/Support/TargetRegistry.h" #include "llvm/Target/TargetLoweringObjectFile.h" #include "llvm/Target/TargetOptions.h" +#include "llvm/Transforms/CFGuard.h" #include "llvm/Transforms/Scalar.h" #include <cassert> #include <memory> @@ -78,7 +79,7 @@ namespace llvm { void initializeARMExecutionDomainFixPass(PassRegistry&); } -extern "C" void LLVMInitializeARMTarget() { +extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeARMTarget() { // Register the target. RegisterTargetMachine<ARMLETargetMachine> X(getTheARMLETarget()); RegisterTargetMachine<ARMLETargetMachine> A(getTheThumbLETarget()); @@ -90,7 +91,6 @@ extern "C" void LLVMInitializeARMTarget() { initializeARMLoadStoreOptPass(Registry); initializeARMPreAllocLoadStoreOptPass(Registry); initializeARMParallelDSPPass(Registry); - initializeARMCodeGenPreparePass(Registry); initializeARMConstantIslandsPass(Registry); initializeARMExecutionDomainFixPass(Registry); initializeARMExpandPseudoPass(Registry); @@ -98,6 +98,7 @@ extern "C" void LLVMInitializeARMTarget() { initializeMVEVPTBlockPass(Registry); initializeMVETailPredicationPass(Registry); initializeARMLowOverheadLoopsPass(Registry); + initializeMVEGatherScatterLoweringPass(Registry); } static std::unique_ptr<TargetLoweringObjectFile> createTLOF(const Triple &TT) { @@ -321,14 +322,7 @@ namespace { class ARMPassConfig : public TargetPassConfig { public: ARMPassConfig(ARMBaseTargetMachine &TM, PassManagerBase &PM) - : TargetPassConfig(TM, PM) { - if (TM.getOptLevel() != CodeGenOpt::None) { - ARMGenSubtargetInfo STI(TM.getTargetTriple(), TM.getTargetCPU(), - TM.getTargetFeatureString()); - if (STI.hasFeature(ARM::FeatureUseMISched)) - substitutePass(&PostRASchedulerID, &PostMachineSchedulerID); - } - } + : TargetPassConfig(TM, PM) {} ARMBaseTargetMachine &getARMTargetMachine() const { return getTM<ARMBaseTargetMachine>(); @@ -411,6 +405,8 @@ void ARMPassConfig::addIRPasses() { return ST.hasAnyDataBarrier() && !ST.isThumb1Only(); })); + addPass(createMVEGatherScatterLoweringPass()); + TargetPassConfig::addIRPasses(); // Run the parallel DSP pass. @@ -420,11 +416,15 @@ void ARMPassConfig::addIRPasses() { // Match interleaved memory accesses to ldN/stN intrinsics. if (TM->getOptLevel() != CodeGenOpt::None) addPass(createInterleavedAccessPass()); + + // Add Control Flow Guard checks. + if (TM->getTargetTriple().isOSWindows()) + addPass(createCFGuardCheckPass()); } void ARMPassConfig::addCodeGenPrepare() { if (getOptLevel() != CodeGenOpt::None) - addPass(createARMCodeGenPreparePass()); + addPass(createTypePromotionPass()); TargetPassConfig::addCodeGenPrepare(); } @@ -518,6 +518,13 @@ void ARMPassConfig::addPreSched2() { } addPass(createMVEVPTBlockPass()); addPass(createThumb2ITBlockPass()); + + // Add both scheduling passes to give the subtarget an opportunity to pick + // between them. + if (getOptLevel() != CodeGenOpt::None) { + addPass(&PostMachineSchedulerID); + addPass(&PostRASchedulerID); + } } void ARMPassConfig::addPreEmitPass() { @@ -534,4 +541,8 @@ void ARMPassConfig::addPreEmitPass() { addPass(createARMConstantIslandPass()); addPass(createARMLowOverheadLoopsPass()); + + // Identify valid longjmp targets for Windows Control Flow Guard. + if (TM->getTargetTriple().isOSWindows()) + addPass(createCFGuardLongjmpPass()); } |