about summary refs log tree commit diff
path: root/src/librustc_codegen_llvm/declare.rs
diff options
context:
space:
mode:
authorSimonas Kazlauskas <git@kazlauskas.me>2018-10-27 15:29:06 +0300
committerSimonas Kazlauskas <git@kazlauskas.me>2019-01-24 20:13:50 +0200
commitf38d0da89389c45067d37ba15e783c024088a09a (patch)
tree75260423c9caa95661d32a8bbdef5888f8591fa4 /src/librustc_codegen_llvm/declare.rs
parent095b44c83b540bb4dbf74be1cae604f4bae87989 (diff)
downloadrust-f38d0da89389c45067d37ba15e783c024088a09a.tar.gz
rust-f38d0da89389c45067d37ba15e783c024088a09a.zip
Implement optimize(size) and optimize(speed)
Diffstat (limited to 'src/librustc_codegen_llvm/declare.rs')
-rw-r--r--src/librustc_codegen_llvm/declare.rs21
1 files changed, 15 insertions, 6 deletions
diff --git a/src/librustc_codegen_llvm/declare.rs b/src/librustc_codegen_llvm/declare.rs
index aa2a0016b3e..166c6ab9ae9 100644
--- a/src/librustc_codegen_llvm/declare.rs
+++ b/src/librustc_codegen_llvm/declare.rs
@@ -15,7 +15,7 @@ use llvm;
 use llvm::AttributePlace::Function;
 use rustc::ty::{self, PolyFnSig};
 use rustc::ty::layout::LayoutOf;
-use rustc::session::config::Sanitizer;
+use rustc::session::config::{Sanitizer, OptLevel};
 use rustc_data_structures::small_c_str::SmallCStr;
 use abi::{FnType, FnTypeExt};
 use attributes;
@@ -65,15 +65,24 @@ fn declare_raw_fn(
         }
     }
 
-    match cx.tcx.sess.opts.cg.opt_level.as_ref().map(String::as_ref) {
-        Some("s") => {
+    // FIXME(opt): this is kinda duplicated with similar code in attributes::from_fm_attrs…
+    match cx.tcx.sess.opts.optimize {
+        OptLevel::Size => {
+            llvm::Attribute::MinSize.unapply_llfn(Function, llfn);
             llvm::Attribute::OptimizeForSize.apply_llfn(Function, llfn);
+            llvm::Attribute::OptimizeNone.unapply_llfn(Function, llfn);
         },
-        Some("z") => {
+        OptLevel::SizeMin => {
             llvm::Attribute::MinSize.apply_llfn(Function, llfn);
             llvm::Attribute::OptimizeForSize.apply_llfn(Function, llfn);
-        },
-        _ => {},
+            llvm::Attribute::OptimizeNone.unapply_llfn(Function, llfn);
+        }
+        OptLevel::No => {
+            llvm::Attribute::MinSize.unapply_llfn(Function, llfn);
+            llvm::Attribute::OptimizeForSize.unapply_llfn(Function, llfn);
+            llvm::Attribute::OptimizeNone.apply_llfn(Function, llfn);
+        }
+        _ => {}
     }
 
     attributes::non_lazy_bind(cx.sess(), llfn);