about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/librustc/session/config.rs5
-rw-r--r--src/librustc_back/target/mod.rs5
-rw-r--r--src/librustc_mir/transform/lower_128bit.rs4
-rw-r--r--src/test/mir-opt/lower_128bit_debug_test.rs2
-rw-r--r--src/test/mir-opt/lower_128bit_test.rs2
5 files changed, 13 insertions, 5 deletions
diff --git a/src/librustc/session/config.rs b/src/librustc/session/config.rs
index 70b63886084..81e18fe536d 100644
--- a/src/librustc/session/config.rs
+++ b/src/librustc/session/config.rs
@@ -1176,9 +1176,10 @@ options! {DebuggingOptions, DebuggingSetter, basic_debugging_options,
     saturating_float_casts: bool = (false, parse_bool, [TRACKED],
         "make float->int casts UB-free: numbers outside the integer type's range are clipped to \
          the max/min integer respectively, and NaN is mapped to 0"),
-    lower_128bit_ops: bool = (false, parse_bool, [TRACKED],
+    lower_128bit_ops: Option<bool> = (None, parse_opt_bool, [TRACKED],
         "rewrite operators on i128 and u128 into lang item calls (typically provided \
-         by compiler-builtins) so translation doesn't need to support them"),
+         by compiler-builtins) so translation doesn't need to support them,
+         overriding the default for the current target"),
 }
 
 pub fn default_lib_output() -> CrateType {
diff --git a/src/librustc_back/target/mod.rs b/src/librustc_back/target/mod.rs
index 7599a60ba5a..6f9ba5dada2 100644
--- a/src/librustc_back/target/mod.rs
+++ b/src/librustc_back/target/mod.rs
@@ -453,6 +453,10 @@ pub struct TargetOptions {
     /// Whether library functions call lowering/optimization is disabled in LLVM
     /// for this target unconditionally.
     pub no_builtins: bool,
+
+    /// Whether to lower 128-bit operations to compiler_builtins calls.  Use if
+    /// your backend only supports 64-bit and smaller math.
+    pub i128_lowering: bool,
 }
 
 impl Default for TargetOptions {
@@ -521,6 +525,7 @@ impl Default for TargetOptions {
             requires_lto: false,
             singlethread: false,
             no_builtins: false,
+            i128_lowering: false,
         }
     }
 }
diff --git a/src/librustc_mir/transform/lower_128bit.rs b/src/librustc_mir/transform/lower_128bit.rs
index 7027d827c84..80456efff83 100644
--- a/src/librustc_mir/transform/lower_128bit.rs
+++ b/src/librustc_mir/transform/lower_128bit.rs
@@ -25,7 +25,9 @@ impl MirPass for Lower128Bit {
                           tcx: TyCtxt<'a, 'tcx, 'tcx>,
                           _src: MirSource,
                           mir: &mut Mir<'tcx>) {
-        if !tcx.sess.opts.debugging_opts.lower_128bit_ops {
+        let debugging_override = tcx.sess.opts.debugging_opts.lower_128bit_ops;
+        let target_default = tcx.sess.host.options.i128_lowering;
+        if !debugging_override.unwrap_or(target_default) {
             return
         }
 
diff --git a/src/test/mir-opt/lower_128bit_debug_test.rs b/src/test/mir-opt/lower_128bit_debug_test.rs
index 4f9bb809e99..82d08155547 100644
--- a/src/test/mir-opt/lower_128bit_debug_test.rs
+++ b/src/test/mir-opt/lower_128bit_debug_test.rs
@@ -13,7 +13,7 @@
 // ignore-asmjs
 // ignore-emscripten
 
-// compile-flags: -Z lower_128bit_ops -C debug_assertions=yes
+// compile-flags: -Z lower_128bit_ops=yes -C debug_assertions=yes
 
 #![feature(i128_type)]
 
diff --git a/src/test/mir-opt/lower_128bit_test.rs b/src/test/mir-opt/lower_128bit_test.rs
index e8c8412db80..4b54f9a6d44 100644
--- a/src/test/mir-opt/lower_128bit_test.rs
+++ b/src/test/mir-opt/lower_128bit_test.rs
@@ -13,7 +13,7 @@
 // ignore-asmjs
 // ignore-emscripten
 
-// compile-flags: -Z lower_128bit_ops -C debug_assertions=no
+// compile-flags: -Z lower_128bit_ops=yes -C debug_assertions=no
 
 #![feature(i128_type)]