diff --git a/configure b/configure index 086dd9f74e080..34132b7e5f535 100755 --- a/configure +++ b/configure @@ -607,6 +607,7 @@ opt dist-host-only 0 "only install bins for the host architecture" opt inject-std-version 1 "inject the current compiler version of libstd into programs" opt llvm-version-check 1 "check if the LLVM version is supported, build anyway" opt rustbuild 0 "use the rust and cargo based build system" +opt orbit 0 "get MIR where it belongs - everywhere; most importantly, in orbit" # Optimization and debugging options. These may be overridden by the release channel, etc. opt_nosave optimize 1 "build optimized rust code" @@ -713,6 +714,8 @@ if [ -n "$CFG_ENABLE_DEBUG_ASSERTIONS" ]; then putvar CFG_ENABLE_DEBUG_ASSERTION if [ -n "$CFG_ENABLE_DEBUGINFO" ]; then putvar CFG_ENABLE_DEBUGINFO; fi if [ -n "$CFG_ENABLE_DEBUG_JEMALLOC" ]; then putvar CFG_ENABLE_DEBUG_JEMALLOC; fi +if [ -n "$CFG_ENABLE_ORBIT" ]; then putvar CFG_ENABLE_ORBIT; fi + # A magic value that allows the compiler to use unstable features # during the bootstrap even when doing so would normally be an error # because of feature staging or because the build turns on diff --git a/mk/main.mk b/mk/main.mk index 887247b80c4cd..9df04a6d43eac 100644 --- a/mk/main.mk +++ b/mk/main.mk @@ -134,6 +134,11 @@ ifdef CFG_ENABLE_DEBUGINFO CFG_RUSTC_FLAGS += -g endif +ifdef CFG_ENABLE_ORBIT + $(info cfg: launching MIR (CFG_ENABLE_ORBIT)) + CFG_RUSTC_FLAGS += -Z orbit +endif + ifdef SAVE_TEMPS CFG_RUSTC_FLAGS += --save-temps endif diff --git a/src/librustc/session/config.rs b/src/librustc/session/config.rs index 679da4abf5f9f..f58498f3f2dd3 100644 --- a/src/librustc/session/config.rs +++ b/src/librustc/session/config.rs @@ -659,6 +659,8 @@ options! {DebuggingOptions, DebuggingSetter, basic_debugging_options, "print the result of the translation item collection pass"), mir_opt_level: Option = (None, parse_opt_uint, "set the MIR optimization level (0-3)"), + orbit: bool = (false, parse_bool, + "get MIR where it belongs - everywhere; most importantly, in orbit"), } pub fn default_lib_output() -> CrateType { diff --git a/src/librustc_trans/trans/base.rs b/src/librustc_trans/trans/base.rs index f64585915b591..5b644f5a1f362 100644 --- a/src/librustc_trans/trans/base.rs +++ b/src/librustc_trans/trans/base.rs @@ -1432,7 +1432,9 @@ impl<'blk, 'tcx> FunctionContext<'blk, 'tcx> { }; let check_attrs = |attrs: &[ast::Attribute]| { - attrs.iter().any(|item| item.check_name("rustc_mir")) + let default_to_mir = ccx.sess().opts.debugging_opts.orbit; + let invert = if default_to_mir { "rustc_no_mir" } else { "rustc_mir" }; + default_to_mir ^ attrs.iter().any(|item| item.check_name(invert)) }; let use_mir = if let Some(id) = local_id { @@ -1464,13 +1466,13 @@ impl<'blk, 'tcx> FunctionContext<'blk, 'tcx> { }; FunctionContext { + needs_ret_allocas: nested_returns && mir.is_none(), mir: mir, llfn: llfndecl, llretslotptr: Cell::new(None), param_env: ccx.tcx().empty_parameter_environment(), alloca_insert_pt: Cell::new(None), llreturn: Cell::new(None), - needs_ret_allocas: nested_returns, landingpad_alloca: Cell::new(None), lllocals: RefCell::new(NodeMap()), llupvars: RefCell::new(NodeMap()), diff --git a/src/libsyntax/feature_gate.rs b/src/libsyntax/feature_gate.rs index 14a3f93738a32..8048b40e930e8 100644 --- a/src/libsyntax/feature_gate.rs +++ b/src/libsyntax/feature_gate.rs @@ -347,10 +347,14 @@ pub const KNOWN_ATTRIBUTES: &'static [(&'static str, AttributeType, AttributeGat "the `#[rustc_move_fragments]` attribute \ is just used for rustc unit tests \ and will never be stable")), - ("rustc_mir", Normal, Gated("rustc_attrs", - "the `#[rustc_mir]` attribute \ - is just used for rustc unit tests \ - and will never be stable")), + ("rustc_mir", Whitelisted, Gated("rustc_attrs", + "the `#[rustc_mir]` attribute \ + is just used for rustc unit tests \ + and will never be stable")), + ("rustc_no_mir", Whitelisted, Gated("rustc_attrs", + "the `#[rustc_no_mir]` attribute \ + is just used to make tests pass \ + and will never be stable")), ("allow_internal_unstable", Normal, Gated("allow_internal_unstable", EXPLAIN_ALLOW_INTERNAL_UNSTABLE)),