add a panic-strategy field to the target specification
Now a target can define its panic strategy in its specification. If a user doesn't specify a panic strategy via the command line, i.e. '-C panic', then the compiler will use the panic strategy defined by the target specification. Custom targets can pick their panic strategy via the "panic-strategy" field of their target specification JSON file. If omitted in the specification, the strategy defaults to "unwind". closes #36647
This commit is contained in:
parent
49dd95b078
commit
cbb967f316
12 changed files with 82 additions and 36 deletions
|
|
@ -19,6 +19,7 @@ pub use self::DebugInfoLevel::*;
|
|||
use session::{early_error, early_warn, Session};
|
||||
use session::search_paths::SearchPaths;
|
||||
|
||||
use rustc_back::PanicStrategy;
|
||||
use rustc_back::target::Target;
|
||||
use lint;
|
||||
use middle::cstore;
|
||||
|
|
@ -493,21 +494,6 @@ impl Passes {
|
|||
}
|
||||
}
|
||||
|
||||
#[derive(Clone, PartialEq, Hash, RustcEncodable, RustcDecodable)]
|
||||
pub enum PanicStrategy {
|
||||
Unwind,
|
||||
Abort,
|
||||
}
|
||||
|
||||
impl PanicStrategy {
|
||||
pub fn desc(&self) -> &str {
|
||||
match *self {
|
||||
PanicStrategy::Unwind => "unwind",
|
||||
PanicStrategy::Abort => "abort",
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Declare a macro that will define all CodegenOptions/DebuggingOptions fields and parsers all
|
||||
/// at once. The goal of this macro is to define an interface that can be
|
||||
/// programmatically used by the option parser in order to initialize the struct
|
||||
|
|
@ -620,7 +606,8 @@ macro_rules! options {
|
|||
|
||||
#[allow(dead_code)]
|
||||
mod $mod_set {
|
||||
use super::{$struct_name, Passes, SomePasses, AllPasses, PanicStrategy};
|
||||
use super::{$struct_name, Passes, SomePasses, AllPasses};
|
||||
use rustc_back::PanicStrategy;
|
||||
|
||||
$(
|
||||
pub fn $opt(cg: &mut $struct_name, v: Option<&str>) -> bool {
|
||||
|
|
@ -725,10 +712,10 @@ macro_rules! options {
|
|||
}
|
||||
}
|
||||
|
||||
fn parse_panic_strategy(slot: &mut PanicStrategy, v: Option<&str>) -> bool {
|
||||
fn parse_panic_strategy(slot: &mut Option<PanicStrategy>, v: Option<&str>) -> bool {
|
||||
match v {
|
||||
Some("unwind") => *slot = PanicStrategy::Unwind,
|
||||
Some("abort") => *slot = PanicStrategy::Abort,
|
||||
Some("unwind") => *slot = Some(PanicStrategy::Unwind),
|
||||
Some("abort") => *slot = Some(PanicStrategy::Abort),
|
||||
_ => return false
|
||||
}
|
||||
true
|
||||
|
|
@ -800,7 +787,7 @@ options! {CodegenOptions, CodegenSetter, basic_codegen_options,
|
|||
"explicitly enable the cfg(debug_assertions) directive"),
|
||||
inline_threshold: Option<usize> = (None, parse_opt_uint, [TRACKED],
|
||||
"set the inlining threshold for"),
|
||||
panic: PanicStrategy = (PanicStrategy::Unwind, parse_panic_strategy,
|
||||
panic: Option<PanicStrategy> = (None, parse_panic_strategy,
|
||||
[TRACKED], "panic strategy to compile crate with"),
|
||||
}
|
||||
|
||||
|
|
@ -1676,9 +1663,10 @@ mod dep_tracking {
|
|||
use std::collections::BTreeMap;
|
||||
use std::hash::{Hash, SipHasher};
|
||||
use std::path::PathBuf;
|
||||
use super::{Passes, PanicStrategy, CrateType, OptLevel, DebugInfoLevel,
|
||||
use super::{Passes, CrateType, OptLevel, DebugInfoLevel,
|
||||
OutputTypes, Externs, ErrorOutputType};
|
||||
use syntax::feature_gate::UnstableFeatures;
|
||||
use rustc_back::PanicStrategy;
|
||||
|
||||
pub trait DepTrackingHash {
|
||||
fn hash(&self, &mut SipHasher, ErrorOutputType);
|
||||
|
|
@ -1717,6 +1705,7 @@ mod dep_tracking {
|
|||
impl_dep_tracking_hash_via_hash!(Option<bool>);
|
||||
impl_dep_tracking_hash_via_hash!(Option<usize>);
|
||||
impl_dep_tracking_hash_via_hash!(Option<String>);
|
||||
impl_dep_tracking_hash_via_hash!(Option<PanicStrategy>);
|
||||
impl_dep_tracking_hash_via_hash!(Option<lint::Level>);
|
||||
impl_dep_tracking_hash_via_hash!(Option<PathBuf>);
|
||||
impl_dep_tracking_hash_via_hash!(CrateType);
|
||||
|
|
@ -1783,7 +1772,8 @@ mod tests {
|
|||
use std::iter::FromIterator;
|
||||
use std::path::PathBuf;
|
||||
use std::rc::Rc;
|
||||
use super::{OutputType, OutputTypes, Externs, PanicStrategy};
|
||||
use super::{OutputType, OutputTypes, Externs};
|
||||
use rustc_back::PanicStrategy;
|
||||
use syntax::{ast, attr};
|
||||
use syntax::parse::token::InternedString;
|
||||
use syntax::codemap::dummy_spanned;
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@ use lint;
|
|||
use middle::cstore::CrateStore;
|
||||
use middle::dependency_format;
|
||||
use session::search_paths::PathKind;
|
||||
use session::config::{DebugInfoLevel, PanicStrategy};
|
||||
use session::config::DebugInfoLevel;
|
||||
use ty::tls;
|
||||
use util::nodemap::{NodeMap, FnvHashMap};
|
||||
use util::common::duration_to_secs_str;
|
||||
|
|
@ -33,6 +33,7 @@ use syntax::{ast, codemap};
|
|||
use syntax::feature_gate::AttributeType;
|
||||
use syntax_pos::{Span, MultiSpan};
|
||||
|
||||
use rustc_back::PanicStrategy;
|
||||
use rustc_back::target::Target;
|
||||
use rustc_data_structures::flock;
|
||||
use llvm;
|
||||
|
|
@ -306,9 +307,13 @@ impl Session {
|
|||
pub fn lto(&self) -> bool {
|
||||
self.opts.cg.lto
|
||||
}
|
||||
/// Returns the panic strategy for this compile session. If the user explicitly selected one
|
||||
/// using '-C panic', use that, otherwise use the panic strategy defined by the target.
|
||||
pub fn panic_strategy(&self) -> PanicStrategy {
|
||||
self.opts.cg.panic.unwrap_or(self.target.target.options.panic_strategy)
|
||||
}
|
||||
pub fn no_landing_pads(&self) -> bool {
|
||||
self.opts.debugging_opts.no_landing_pads ||
|
||||
self.opts.cg.panic == PanicStrategy::Abort
|
||||
self.opts.debugging_opts.no_landing_pads || self.panic_strategy() == PanicStrategy::Abort
|
||||
}
|
||||
pub fn unstable_options(&self) -> bool {
|
||||
self.opts.debugging_opts.unstable_options
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue