about summary refs log tree commit diff
path: root/src/comp
diff options
context:
space:
mode:
authorRafael Ávila de Espíndola <respindola@mozilla.com>2011-08-11 19:09:52 -0400
committerRafael Ávila de Espíndola <respindola@mozilla.com>2011-08-11 19:09:52 -0400
commit6402b63b4fde61610488f99e40faaa304089e3f2 (patch)
treebebbc3d938154dff12108d783ad53d07a337604b /src/comp
parent4cee06397633cede0163d4b520a979cb7a5177de (diff)
downloadrust-6402b63b4fde61610488f99e40faaa304089e3f2.tar.gz
rust-6402b63b4fde61610488f99e40faaa304089e3f2.zip
Use the new C API for PassManagerBuilder.
Diffstat (limited to 'src/comp')
-rw-r--r--src/comp/back/link.rs33
-rw-r--r--src/comp/lib/llvm.rs31
2 files changed, 48 insertions, 16 deletions
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);