From d7918fb2e889c5ccb58ab8b97d2581cc763f2306 Mon Sep 17 00:00:00 2001 From: Bastian Köcher Date: Sun, 3 Dec 2017 22:16:24 +0100 Subject: Implements RFC 1937: `?` in `main` This is the first part of the RFC 1937 that supports new `Termination` trait in the rust `main` function. --- src/libstd/rt.rs | 45 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) (limited to 'src/libstd/rt.rs') diff --git a/src/libstd/rt.rs b/src/libstd/rt.rs index 40b24cedcdc..2b75201ad2b 100644 --- a/src/libstd/rt.rs +++ b/src/libstd/rt.rs @@ -26,7 +26,50 @@ // Reexport some of our utilities which are expected by other crates. pub use panicking::{begin_panic, begin_panic_fmt, update_panic_count}; -#[cfg(not(test))] +#[cfg(not(any(test, stage0)))] +#[lang = "start"] +fn lang_start + (main: fn() -> T, argc: isize, argv: *const *const u8) -> ! +{ + use panic; + use sys; + use sys_common; + use sys_common::thread_info; + use thread::Thread; + use process; + #[cfg(not(feature = "backtrace"))] + use mem; + + sys::init(); + + process::exit(unsafe { + let main_guard = sys::thread::guard::init(); + sys::stack_overflow::init(); + + // Next, set up the current Thread with the guard information we just + // created. Note that this isn't necessary in general for new threads, + // but we just do this to name the main thread and to give it correct + // info about the stack bounds. + let thread = Thread::new(Some("main".to_owned())); + thread_info::set(main_guard, thread); + + // Store our args if necessary in a squirreled away location + sys::args::init(argc, argv); + + // Let's run some code! + #[cfg(feature = "backtrace")] + let exit_code = panic::catch_unwind(|| { + ::sys_common::backtrace::__rust_begin_short_backtrace(move || main().report()) + }); + #[cfg(not(feature = "backtrace"))] + let exit_code = panic::catch_unwind(mem::transmute::<_, fn()>(main).report()); + + sys_common::cleanup(); + exit_code.unwrap_or(101) + }); +} + +#[cfg(all(not(test), stage0))] #[lang = "start"] fn lang_start(main: fn(), argc: isize, argv: *const *const u8) -> isize { use panic; -- cgit 1.4.1-3-g733a5 From 88bf2b4630ca52c4949665ff3016731fd924eaf1 Mon Sep 17 00:00:00 2001 From: Bastian Köcher Date: Fri, 22 Dec 2017 16:11:09 +0100 Subject: Removes some obscure transmute call in `lang_start` --- src/libstd/rt.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/libstd/rt.rs') diff --git a/src/libstd/rt.rs b/src/libstd/rt.rs index 2b75201ad2b..bfea64153c6 100644 --- a/src/libstd/rt.rs +++ b/src/libstd/rt.rs @@ -62,7 +62,7 @@ fn lang_start ::sys_common::backtrace::__rust_begin_short_backtrace(move || main().report()) }); #[cfg(not(feature = "backtrace"))] - let exit_code = panic::catch_unwind(mem::transmute::<_, fn()>(main).report()); + let exit_code = panic::catch_unwind(|| main().report()); sys_common::cleanup(); exit_code.unwrap_or(101) -- cgit 1.4.1-3-g733a5 From 072f3ebd878ad044abedd3324469ae1b01eca67b Mon Sep 17 00:00:00 2001 From: Bastian Köcher Date: Fri, 22 Dec 2017 20:39:31 +0100 Subject: Use move for optimization purposes --- src/libstd/rt.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/libstd/rt.rs') diff --git a/src/libstd/rt.rs b/src/libstd/rt.rs index bfea64153c6..1fd7c270d19 100644 --- a/src/libstd/rt.rs +++ b/src/libstd/rt.rs @@ -62,7 +62,7 @@ fn lang_start ::sys_common::backtrace::__rust_begin_short_backtrace(move || main().report()) }); #[cfg(not(feature = "backtrace"))] - let exit_code = panic::catch_unwind(|| main().report()); + let exit_code = panic::catch_unwind(move || main().report()); sys_common::cleanup(); exit_code.unwrap_or(101) -- cgit 1.4.1-3-g733a5 From 7dfec34a20af59e50f59f73799f471795a50eeb8 Mon Sep 17 00:00:00 2001 From: Bastian Köcher Date: Sun, 24 Dec 2017 00:15:38 +0100 Subject: Split `lang_start` in two functions to reduce generated code --- src/libstd/rt.rs | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) (limited to 'src/libstd/rt.rs') diff --git a/src/libstd/rt.rs b/src/libstd/rt.rs index 1fd7c270d19..27c20be7a9a 100644 --- a/src/libstd/rt.rs +++ b/src/libstd/rt.rs @@ -26,10 +26,11 @@ // Reexport some of our utilities which are expected by other crates. pub use panicking::{begin_panic, begin_panic_fmt, update_panic_count}; +// To reduce the generated code of the new `lang_start`, this function is doing +// the real work. #[cfg(not(any(test, stage0)))] -#[lang = "start"] -fn lang_start - (main: fn() -> T, argc: isize, argv: *const *const u8) -> ! +fn lang_start_real(main: F, argc: isize, argv: *const *const u8) -> ! + where F: FnOnce() -> i32 + Send + ::panic::UnwindSafe + 'static { use panic; use sys; @@ -59,16 +60,24 @@ fn lang_start // Let's run some code! #[cfg(feature = "backtrace")] let exit_code = panic::catch_unwind(|| { - ::sys_common::backtrace::__rust_begin_short_backtrace(move || main().report()) + ::sys_common::backtrace::__rust_begin_short_backtrace(move || main()) }); #[cfg(not(feature = "backtrace"))] - let exit_code = panic::catch_unwind(move || main().report()); + let exit_code = panic::catch_unwind(move || main()); sys_common::cleanup(); exit_code.unwrap_or(101) }); } +#[cfg(not(any(test, stage0)))] +#[lang = "start"] +fn lang_start + (main: fn() -> T, argc: isize, argv: *const *const u8) -> ! +{ + lang_start_real(move || main().report(), argc, argv) +} + #[cfg(all(not(test), stage0))] #[lang = "start"] fn lang_start(main: fn(), argc: isize, argv: *const *const u8) -> isize { -- cgit 1.4.1-3-g733a5 From 81e375dba5e7915548dc6067cf16c62cdbce4853 Mon Sep 17 00:00:00 2001 From: Bastian Köcher Date: Sun, 24 Dec 2017 00:35:38 +0100 Subject: Change name of `lang_start_real` to `lang_start_internal` Also remove `'static` from `__rust_begin_short_backtrace` --- src/libstd/rt.rs | 7 +++---- src/libstd/sys_common/backtrace.rs | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) (limited to 'src/libstd/rt.rs') diff --git a/src/libstd/rt.rs b/src/libstd/rt.rs index 27c20be7a9a..d17dfb25f31 100644 --- a/src/libstd/rt.rs +++ b/src/libstd/rt.rs @@ -29,9 +29,8 @@ pub use panicking::{begin_panic, begin_panic_fmt, update_panic_count}; // To reduce the generated code of the new `lang_start`, this function is doing // the real work. #[cfg(not(any(test, stage0)))] -fn lang_start_real(main: F, argc: isize, argv: *const *const u8) -> ! - where F: FnOnce() -> i32 + Send + ::panic::UnwindSafe + 'static -{ +fn lang_start_internal(main: &(Fn() -> i32 + Sync + ::panic::RefUnwindSafe), + argc: isize, argv: *const *const u8) -> ! { use panic; use sys; use sys_common; @@ -75,7 +74,7 @@ fn lang_start_real(main: F, argc: isize, argv: *const *const u8) -> ! fn lang_start (main: fn() -> T, argc: isize, argv: *const *const u8) -> ! { - lang_start_real(move || main().report(), argc, argv) + lang_start_internal(&move || main().report(), argc, argv) } #[cfg(all(not(test), stage0))] diff --git a/src/libstd/sys_common/backtrace.rs b/src/libstd/sys_common/backtrace.rs index b5cf6d7d34f..36cbce2df75 100644 --- a/src/libstd/sys_common/backtrace.rs +++ b/src/libstd/sys_common/backtrace.rs @@ -128,7 +128,7 @@ fn filter_frames(frames: &[Frame], /// Fixed frame used to clean the backtrace with `RUST_BACKTRACE=1`. #[inline(never)] pub fn __rust_begin_short_backtrace(f: F) -> T - where F: FnOnce() -> T, F: Send + 'static, T: Send + 'static + where F: FnOnce() -> T, F: Send, T: Send { f() } -- cgit 1.4.1-3-g733a5 From 5a4298b6d36c493cabeae1453119d1edc96e1472 Mon Sep 17 00:00:00 2001 From: Bastian Köcher Date: Tue, 26 Dec 2017 23:52:20 +0100 Subject: Don't use `process::exit` as it is an `unreachable` on wasm32 --- src/librustc_trans/base.rs | 12 ++---------- src/libstd/rt.rs | 11 +++++------ 2 files changed, 7 insertions(+), 16 deletions(-) (limited to 'src/libstd/rt.rs') diff --git a/src/librustc_trans/base.rs b/src/librustc_trans/base.rs index 3955171f939..680821d6d68 100644 --- a/src/librustc_trans/base.rs +++ b/src/librustc_trans/base.rs @@ -552,10 +552,7 @@ fn maybe_create_entry_wrapper(ccx: &CrateContext) { rust_main: ValueRef, rust_main_def_id: DefId, use_start_lang_item: bool) { - // The libstd lang_start function does not return anything, while user defined lang start - // returns a isize - let start_output_ty = if use_start_lang_item { Type::void(ccx) } else { Type::c_int(ccx) }; - let llfty = Type::func(&[Type::c_int(ccx), Type::i8p(ccx).ptr_to()], &start_output_ty); + let llfty = Type::func(&[Type::c_int(ccx), Type::i8p(ccx).ptr_to()], &Type::c_int(ccx)); let main_ret_ty = ccx.tcx().fn_sig(rust_main_def_id).output(); // Given that `main()` has no arguments, @@ -600,12 +597,7 @@ fn maybe_create_entry_wrapper(ccx: &CrateContext) { }; let result = bld.call(start_fn, &args, None); - - if use_start_lang_item { - bld.ret_void(); - } else { - bld.ret(bld.intcast(result, Type::c_int(ccx), true)); - } + bld.ret(bld.intcast(result, Type::c_int(ccx), true)); } } diff --git a/src/libstd/rt.rs b/src/libstd/rt.rs index d17dfb25f31..e2c1bba50c4 100644 --- a/src/libstd/rt.rs +++ b/src/libstd/rt.rs @@ -30,19 +30,18 @@ pub use panicking::{begin_panic, begin_panic_fmt, update_panic_count}; // the real work. #[cfg(not(any(test, stage0)))] fn lang_start_internal(main: &(Fn() -> i32 + Sync + ::panic::RefUnwindSafe), - argc: isize, argv: *const *const u8) -> ! { + argc: isize, argv: *const *const u8) -> isize { use panic; use sys; use sys_common; use sys_common::thread_info; use thread::Thread; - use process; #[cfg(not(feature = "backtrace"))] use mem; sys::init(); - process::exit(unsafe { + unsafe { let main_guard = sys::thread::guard::init(); sys::stack_overflow::init(); @@ -65,14 +64,14 @@ fn lang_start_internal(main: &(Fn() -> i32 + Sync + ::panic::RefUnwindSafe), let exit_code = panic::catch_unwind(move || main()); sys_common::cleanup(); - exit_code.unwrap_or(101) - }); + exit_code.unwrap_or(101) as isize + } } #[cfg(not(any(test, stage0)))] #[lang = "start"] fn lang_start - (main: fn() -> T, argc: isize, argv: *const *const u8) -> ! + (main: fn() -> T, argc: isize, argv: *const *const u8) -> isize { lang_start_internal(&move || main().report(), argc, argv) } -- cgit 1.4.1-3-g733a5