Auto merge of #48786 - nagisa:fp, r=nikomatsakis
Add force-frame-pointer flag to allow control of frame pointer ommision Rebase of #47152 plus some changes suggested by https://github.com/rust-lang/rust/issues/48785. Fixes #11906 r? @nikomatsakis
This commit is contained in:
commit
0eb68b797b
7 changed files with 31 additions and 5 deletions
|
@ -1053,6 +1053,8 @@ options! {CodegenOptions, CodegenSetter, basic_codegen_options,
|
||||||
2 = full debug info with variable and type information"),
|
2 = full debug info with variable and type information"),
|
||||||
opt_level: Option<String> = (None, parse_opt_string, [TRACKED],
|
opt_level: Option<String> = (None, parse_opt_string, [TRACKED],
|
||||||
"optimize with possible levels 0-3, s, or z"),
|
"optimize with possible levels 0-3, s, or z"),
|
||||||
|
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],
|
debug_assertions: Option<bool> = (None, parse_opt_bool, [TRACKED],
|
||||||
"explicitly enable the cfg(debug_assertions) directive"),
|
"explicitly enable the cfg(debug_assertions) directive"),
|
||||||
inline_threshold: Option<usize> = (None, parse_opt_uint, [TRACKED],
|
inline_threshold: Option<usize> = (None, parse_opt_uint, [TRACKED],
|
||||||
|
@ -2965,6 +2967,10 @@ mod tests {
|
||||||
opts.cg.debuginfo = Some(0xba5eba11);
|
opts.cg.debuginfo = Some(0xba5eba11);
|
||||||
assert!(reference.dep_tracking_hash() != opts.dep_tracking_hash());
|
assert!(reference.dep_tracking_hash() != opts.dep_tracking_hash());
|
||||||
|
|
||||||
|
opts = reference.clone();
|
||||||
|
opts.cg.force_frame_pointers = Some(false);
|
||||||
|
assert!(reference.dep_tracking_hash() != opts.dep_tracking_hash());
|
||||||
|
|
||||||
opts = reference.clone();
|
opts = reference.clone();
|
||||||
opts.cg.debug_assertions = Some(true);
|
opts.cg.debug_assertions = Some(true);
|
||||||
assert!(reference.dep_tracking_hash() != opts.dep_tracking_hash());
|
assert!(reference.dep_tracking_hash() != opts.dep_tracking_hash());
|
||||||
|
|
|
@ -20,7 +20,7 @@ use lint::builtin::BuiltinLintDiagnostics;
|
||||||
use middle::allocator::AllocatorKind;
|
use middle::allocator::AllocatorKind;
|
||||||
use middle::dependency_format;
|
use middle::dependency_format;
|
||||||
use session::search_paths::PathKind;
|
use session::search_paths::PathKind;
|
||||||
use session::config::{DebugInfoLevel, OutputType};
|
use session::config::{OutputType};
|
||||||
use ty::tls;
|
use ty::tls;
|
||||||
use util::nodemap::{FxHashSet};
|
use util::nodemap::{FxHashSet};
|
||||||
use util::common::{duration_to_secs_str, ErrorReported};
|
use util::common::{duration_to_secs_str, ErrorReported};
|
||||||
|
@ -658,8 +658,11 @@ impl Session {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn must_not_eliminate_frame_pointers(&self) -> bool {
|
pub fn must_not_eliminate_frame_pointers(&self) -> bool {
|
||||||
self.opts.debuginfo != DebugInfoLevel::NoDebugInfo
|
if let Some(x) = self.opts.cg.force_frame_pointers {
|
||||||
|| !self.target.target.options.eliminate_frame_pointer
|
x
|
||||||
|
} else {
|
||||||
|
!self.target.target.options.eliminate_frame_pointer
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the symbol name for the registrar function,
|
/// Returns the symbol name for the registrar function,
|
||||||
|
|
|
@ -98,6 +98,7 @@ pub fn opts(arch: Arch) -> Result<TargetOptions, String> {
|
||||||
executables: true,
|
executables: true,
|
||||||
pre_link_args,
|
pre_link_args,
|
||||||
has_elf_tls: false,
|
has_elf_tls: false,
|
||||||
|
eliminate_frame_pointer: false,
|
||||||
// The following line is a workaround for jemalloc 4.5 being broken on
|
// The following line is a workaround for jemalloc 4.5 being broken on
|
||||||
// ios. jemalloc 5.0 is supposed to fix this.
|
// ios. jemalloc 5.0 is supposed to fix this.
|
||||||
// see https://github.com/rust-lang/rust/issues/45262
|
// see https://github.com/rust-lang/rust/issues/45262
|
||||||
|
|
|
@ -16,6 +16,7 @@ pub fn target() -> TargetResult {
|
||||||
base.max_atomic_width = Some(64);
|
base.max_atomic_width = Some(64);
|
||||||
base.pre_link_args.insert(LinkerFlavor::Gcc, vec!["-m32".to_string()]);
|
base.pre_link_args.insert(LinkerFlavor::Gcc, vec!["-m32".to_string()]);
|
||||||
base.stack_probes = true;
|
base.stack_probes = true;
|
||||||
|
base.eliminate_frame_pointer = false;
|
||||||
|
|
||||||
Ok(Target {
|
Ok(Target {
|
||||||
llvm_target: "i686-apple-darwin".to_string(),
|
llvm_target: "i686-apple-darwin".to_string(),
|
||||||
|
|
|
@ -69,8 +69,6 @@ pub fn naked(val: ValueRef, is_naked: bool) {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn set_frame_pointer_elimination(cx: &CodegenCx, llfn: ValueRef) {
|
pub fn set_frame_pointer_elimination(cx: &CodegenCx, llfn: ValueRef) {
|
||||||
// FIXME: #11906: Omitting frame pointers breaks retrieving the value of a
|
|
||||||
// parameter.
|
|
||||||
if cx.sess().must_not_eliminate_frame_pointers() {
|
if cx.sess().must_not_eliminate_frame_pointers() {
|
||||||
llvm::AddFunctionAttrStringValue(
|
llvm::AddFunctionAttrStringValue(
|
||||||
llfn, llvm::AttributePlace::Function,
|
llfn, llvm::AttributePlace::Function,
|
||||||
|
|
16
src/test/codegen/force-frame-pointers.rs
Normal file
16
src/test/codegen/force-frame-pointers.rs
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
// Copyright 2018 The Rust Project Developers. See the COPYRIGHT
|
||||||
|
// file at the top-level directory of this distribution and at
|
||||||
|
// http://rust-lang.org/COPYRIGHT.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||||
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||||
|
// 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=y
|
||||||
|
|
||||||
|
#![crate_type="lib"]
|
||||||
|
|
||||||
|
// CHECK: attributes #{{.*}} "no-frame-pointer-elim"="true"
|
||||||
|
pub fn foo() {}
|
|
@ -16,6 +16,7 @@
|
||||||
// "enable" to 0 instead.
|
// "enable" to 0 instead.
|
||||||
|
|
||||||
// compile-flags:-g -Cllvm-args=-enable-tail-merge=0 -Cllvm-args=-opt-bisect-limit=0
|
// compile-flags:-g -Cllvm-args=-enable-tail-merge=0 -Cllvm-args=-opt-bisect-limit=0
|
||||||
|
// compile-flags:-Cforce-frame-pointers=yes
|
||||||
// ignore-pretty issue #37195
|
// ignore-pretty issue #37195
|
||||||
// ignore-cloudabi spawning processes is not supported
|
// ignore-cloudabi spawning processes is not supported
|
||||||
// ignore-emscripten spawning processes is not supported
|
// ignore-emscripten spawning processes is not supported
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue