diff options
| -rw-r--r-- | mk/rustllvm.mk | 2 | ||||
| -rw-r--r-- | src/comp/back/link.rs | 33 | ||||
| -rw-r--r-- | src/comp/lib/llvm.rs | 31 | ||||
| -rw-r--r-- | src/rustllvm/Passes.cpp | 37 | ||||
| -rw-r--r-- | src/rustllvm/RustWrapper.cpp | 8 | ||||
| -rw-r--r-- | src/rustllvm/rustllvm.def.in | 15 |
6 files changed, 59 insertions, 67 deletions
diff --git a/mk/rustllvm.mk b/mk/rustllvm.mk index c519ea15f0d..35f52230bd9 100644 --- a/mk/rustllvm.mk +++ b/mk/rustllvm.mk @@ -2,7 +2,7 @@ # rustc LLVM-extensions (C++) library variables and rules ###################################################################### -RUSTLLVM_OBJS_CS := $(addprefix rustllvm/, Passes.cpp RustWrapper.cpp) +RUSTLLVM_OBJS_CS := $(addprefix rustllvm/, RustWrapper.cpp) RUSTLLVM_DEF := rustllvm/rustllvm$(CFG_DEF_SUFFIX) diff --git a/src/comp/back/link.rs b/src/comp/back/link.rs index 1fb3bfd039f..fee3063bd7b 100644 --- a/src/comp/back/link.rs +++ b/src/comp/back/link.rs @@ -117,19 +117,34 @@ mod write { if opts.optimize != 0u { let fpm = mk_pass_manager(); llvm::LLVMAddTargetData(td.lltd, fpm.llpm); - llvm::LLVMAddStandardFunctionPasses(fpm.llpm, 2u); + + let FPMB = llvm::LLVMPassManagerBuilderCreate(); + llvm::LLVMPassManagerBuilderSetOptLevel(FPMB, 2u); + llvm::LLVMPassManagerBuilderPopulateFunctionPassManager(FPMB, + fpm.llpm); + llvm::LLVMPassManagerBuilderDispose(FPMB); + llvm::LLVMRunPassManager(fpm.llpm, llmod); let threshold: uint = 225u; if opts.optimize == 3u { threshold = 275u; } - llvm::LLVMAddStandardModulePasses(pm.llpm, - // optimization level - opts.optimize, - False, // optimize for size - True, // unit-at-a-time - True, // unroll loops - True, // simplify lib calls - threshold); // inline threshold + let MPMB = llvm::LLVMPassManagerBuilderCreate(); + llvm::LLVMPassManagerBuilderSetOptLevel(MPMB, opts.optimize); + llvm::LLVMPassManagerBuilderSetSizeLevel(MPMB, 0); + llvm::LLVMPassManagerBuilderSetDisableUnitAtATime(MPMB, False); + llvm::LLVMPassManagerBuilderSetDisableUnrollLoops(MPMB, False); + llvm::LLVMPassManagerBuilderSetDisableSimplifyLibCalls(MPMB, + False); + + if threshold != 0u { + llvm::LLVMPassManagerBuilderUseInlinerWithThreshold(MPMB, + threshold); + } + + llvm::LLVMPassManagerBuilderPopulateModulePassManager(MPMB, + pm.llpm); + + llvm::LLVMPassManagerBuilderDispose(MPMB); } if opts.verify { llvm::LLVMAddVerifierPass(pm.llpm); } if is_object_or_assembly_or_exe(opts.output_type) { diff --git a/src/comp/lib/llvm.rs b/src/comp/lib/llvm.rs index 4def2d116bc..02fe2c6c59d 100644 --- a/src/comp/lib/llvm.rs +++ b/src/comp/lib/llvm.rs @@ -141,6 +141,7 @@ native "cdecl" mod llvm = "rustllvm" { type ModuleProviderRef; type MemoryBufferRef; type PassManagerRef; + type PassManagerBuilderRef; type UseRef; type TargetDataRef; @@ -798,13 +799,29 @@ native "cdecl" mod llvm = "rustllvm" { fn LLVMAddTypeBasedAliasAnalysisPass(PM: PassManagerRef); fn LLVMAddBasicAliasAnalysisPass(PM: PassManagerRef); - fn LLVMAddStandardFunctionPasses(PM: PassManagerRef, - OptimizationLevel: uint); - fn LLVMAddStandardModulePasses(PM: PassManagerRef, - OptimizationLevel: uint, - OptimizeSize: Bool, UnitAtATime: Bool, - UnrollLoops: Bool, SimplifyLibCalls: Bool, - InliningThreshold: uint); + fn LLVMPassManagerBuilderCreate() -> PassManagerBuilderRef; + fn LLVMPassManagerBuilderDispose(PMB: PassManagerBuilderRef); + fn LLVMPassManagerBuilderSetOptLevel(PMB: PassManagerBuilderRef, + OptimizationLevel: uint); + fn LLVMPassManagerBuilderSetSizeLevel(PMB: PassManagerBuilderRef, + Value: Bool); + fn LLVMPassManagerBuilderSetDisableUnitAtATime(PMB: PassManagerBuilderRef, + Value: Bool); + fn LLVMPassManagerBuilderSetDisableUnrollLoops(PMB: PassManagerBuilderRef, + Value: Bool); + fn LLVMPassManagerBuilderSetDisableSimplifyLibCalls(PMB: + PassManagerBuilderRef, + Value: Bool); + fn LLVMPassManagerBuilderUseInlinerWithThreshold(PMB: + PassManagerBuilderRef, + threshold: uint); + fn LLVMPassManagerBuilderPopulateModulePassManager(PMB: + PassManagerBuilderRef, + PM: PassManagerRef); + + fn LLVMPassManagerBuilderPopulateFunctionPassManager(PMB: + PassManagerBuilderRef, + PM: PassManagerRef); /** Destroys a memory buffer. */ fn LLVMDisposeMemoryBuffer(MemBuf: MemoryBufferRef); diff --git a/src/rustllvm/Passes.cpp b/src/rustllvm/Passes.cpp deleted file mode 100644 index 4aaffe89eea..00000000000 --- a/src/rustllvm/Passes.cpp +++ /dev/null @@ -1,37 +0,0 @@ -#include "llvm/Analysis/Passes.h" -#include "llvm/Transforms/IPO/PassManagerBuilder.h" -#include "llvm/Transforms/IPO.h" -#include "llvm/PassManager.h" -#include "llvm-c/Core.h" -#include <cstdlib> - -using namespace llvm; - -extern "C" void LLVMAddStandardFunctionPasses(LLVMPassManagerRef PM, - unsigned int OptimizationLevel) { - PassManagerBuilder PMBuilder; - PMBuilder.OptLevel = OptimizationLevel; - FunctionPassManager *FPM = (FunctionPassManager*) unwrap(PM); - PMBuilder.populateFunctionPassManager(*FPM); -} - -extern "C" void LLVMAddStandardModulePasses(LLVMPassManagerRef PM, - unsigned int OptimizationLevel, LLVMBool OptimizeSize, - LLVMBool UnitAtATime, LLVMBool UnrollLoops, LLVMBool SimplifyLibCalls, - unsigned int InliningThreshold) { - - PassManagerBuilder PMBuilder; - PMBuilder.OptLevel = OptimizationLevel; - PMBuilder.SizeLevel = OptimizeSize; - PMBuilder.DisableUnitAtATime = !UnitAtATime; - PMBuilder.DisableUnrollLoops = !UnrollLoops; - - PMBuilder.DisableSimplifyLibCalls = !SimplifyLibCalls; - - if (InliningThreshold) - PMBuilder.Inliner = createFunctionInliningPass(InliningThreshold); - - PassManager *MPM = (PassManager*) unwrap(PM); - PMBuilder.populateModulePassManager(*MPM); -} - diff --git a/src/rustllvm/RustWrapper.cpp b/src/rustllvm/RustWrapper.cpp index d953295803b..eadae79e376 100644 --- a/src/rustllvm/RustWrapper.cpp +++ b/src/rustllvm/RustWrapper.cpp @@ -45,14 +45,6 @@ extern "C" const char *LLVMRustGetLastError(void) { } extern "C" void LLVMAddBasicAliasAnalysisPass(LLVMPassManagerRef PM); -extern "C" void LLVMAddStandardModulePasses(LLVMPassManagerRef PM, - unsigned int OptimizationLevel, bool OptimizeSize, bool UnitAtATime, - bool UnrollLoops, bool SimplifyLibCalls, - unsigned int InliningThreshold); - -int *RustHackToFetchPassesO = (int*)LLVMAddBasicAliasAnalysisPass; -int *RustHackToFetchPasses2O = (int*)LLVMAddStandardModulePasses; - extern "C" bool LLVMLinkModules(LLVMModuleRef Dest, LLVMModuleRef Src) { static std::string err; diff --git a/src/rustllvm/rustllvm.def.in b/src/rustllvm/rustllvm.def.in index 545fd7f6f74..25185f3cde5 100644 --- a/src/rustllvm/rustllvm.def.in +++ b/src/rustllvm/rustllvm.def.in @@ -57,21 +57,17 @@ LLVMAddLoopIdiomPass LLVMAddLoopRotatePass LLVMAddLoopUnrollPass LLVMAddLoopUnswitchPass -LLVMAddLowerSetJmpPass LLVMAddMemCpyOptPass LLVMAddModule LLVMAddModuleProvider LLVMAddPromoteMemoryToRegisterPass LLVMAddPruneEHPass -LLVMAddRaiseAllocationsPass LLVMAddReassociatePass LLVMAddSCCPPass LLVMAddScalarReplAggregatesPass LLVMAddScalarReplAggregatesPassSSA LLVMAddScalarReplAggregatesPassWithThreshold LLVMAddSimplifyLibCallsPass -LLVMAddStandardFunctionPasses -LLVMAddStandardModulePasses LLVMAddStripDeadPrototypesPass LLVMAddStripSymbolsPass LLVMAddTailCallEliminationPass @@ -489,7 +485,6 @@ LLVMIsAUIToFPInst LLVMIsAUnaryInstruction LLVMIsAUndefValue LLVMIsAUnreachableInst -LLVMIsAUnwindInst LLVMIsAUser LLVMIsAVAArgInst LLVMIsAZExtInst @@ -522,6 +517,16 @@ LLVMPPCFP128Type LLVMPPCFP128TypeInContext LLVMParseBitcode LLVMParseBitcodeInContext +LLVMPassManagerBuilderCreate +LLVMPassManagerBuilderDispose +LLVMPassManagerBuilderPopulateModulePassManager +LLVMPassManagerBuilderSetDisableSimplifyLibCalls +LLVMPassManagerBuilderSetDisableUnitAtATime +LLVMPassManagerBuilderPopulateFunctionPassManager +LLVMPassManagerBuilderSetDisableUnrollLoops +LLVMPassManagerBuilderSetOptLevel +LLVMPassManagerBuilderSetSizeLevel +LLVMPassManagerBuilderUseInlinerWithThreshold LLVMPointerSize LLVMPointerType LLVMPositionBuilder |
