about summary refs log tree commit diff
diff options
context:
space:
mode:
authorSimonas Kazlauskas <git@kazlauskas.me>2018-03-06 20:27:19 +0200
committerSimonas Kazlauskas <git@kazlauskas.me>2018-05-01 10:44:44 +0300
commit09d2db4e963c6696f7c22386b6791e419ad75cfb (patch)
treeface2460d8fc7b217c6ce884bfd639a1711cb58a
parent5b800c231f45fcd823a3e958bb942cd620ceb3e0 (diff)
downloadrust-09d2db4e963c6696f7c22386b6791e419ad75cfb.tar.gz
rust-09d2db4e963c6696f7c22386b6791e419ad75cfb.zip
Rework force-frame-pointer
This reworks the force-frame-pointer PR to explicitly only consider the
value of the flag if it is provided, and use a target default otherwise.

Something that was tried but not kept was renaming the flag to
`frame-pointer`, because for flag `frame-pointer=no`, there is no
guarante, that LLVM will elide *all* the frame pointers; oposite of what
the literal reading of the flag would suggest.
-rw-r--r--src/librustc/session/config.rs6
-rw-r--r--src/librustc/session/mod.rs7
-rw-r--r--src/test/codegen/force-frame-pointers.rs2
3 files changed, 9 insertions, 6 deletions
diff --git a/src/librustc/session/config.rs b/src/librustc/session/config.rs
index 023be789222..59b40e9e2dc 100644
--- a/src/librustc/session/config.rs
+++ b/src/librustc/session/config.rs
@@ -1053,8 +1053,8 @@ options! {CodegenOptions, CodegenSetter, basic_codegen_options,
          2 = full debug info with variable and type information"),
     opt_level: Option<String> = (None, parse_opt_string, [TRACKED],
         "optimize with possible levels 0-3, s, or z"),
-    force_frame_pointers: bool = (false, parse_bool, [TRACKED],
-        "force frame pointers to be used"),
+    force_frame_pointers: Option<bool> = (None, parse_opt_bool, [TRACKED],
+        "force use of the frame pointers"),
     debug_assertions: Option<bool> = (None, parse_opt_bool, [TRACKED],
         "explicitly enable the cfg(debug_assertions) directive"),
     inline_threshold: Option<usize> = (None, parse_opt_uint, [TRACKED],
@@ -2968,7 +2968,7 @@ mod tests {
         assert!(reference.dep_tracking_hash() != opts.dep_tracking_hash());
 
         opts = reference.clone();
-        opts.cg.force_frame_pointers = true;
+        opts.cg.force_frame_pointers = Some(false);
         assert!(reference.dep_tracking_hash() != opts.dep_tracking_hash());
 
         opts = reference.clone();
diff --git a/src/librustc/session/mod.rs b/src/librustc/session/mod.rs
index 45b7e2d1740..2ab72ba20bf 100644
--- a/src/librustc/session/mod.rs
+++ b/src/librustc/session/mod.rs
@@ -658,8 +658,11 @@ impl Session {
     }
 
     pub fn must_not_eliminate_frame_pointers(&self) -> bool {
-        self.opts.debuginfo != DebugInfoLevel::NoDebugInfo
-            || !self.target.target.options.eliminate_frame_pointer
+        if let Some(x) = self.opts.cg.force_frame_pointers {
+            x
+        } else {
+            !self.target.target.options.eliminate_frame_pointer
+        }
     }
 
     /// Returns the symbol name for the registrar function,
diff --git a/src/test/codegen/force-frame-pointers.rs b/src/test/codegen/force-frame-pointers.rs
index d40406a0476..f70e3667198 100644
--- a/src/test/codegen/force-frame-pointers.rs
+++ b/src/test/codegen/force-frame-pointers.rs
@@ -8,7 +8,7 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 //
-// compile-flags: -C no-prepopulate-passes -C force-frame-pointers
+// compile-flags: -C no-prepopulate-passes -C force-frame-pointers=y
 
 #![crate_type="lib"]