about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--mk/rustllvm.mk2
-rw-r--r--src/comp/back/link.rs33
-rw-r--r--src/comp/lib/llvm.rs31
-rw-r--r--src/rustllvm/Passes.cpp37
-rw-r--r--src/rustllvm/RustWrapper.cpp8
-rw-r--r--src/rustllvm/rustllvm.def.in15
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