@@ -18,7 +18,7 @@ use rustc_session::config::EntryFnType;
1818use crate :: concurrency:: GenmcCtx ;
1919use crate :: concurrency:: thread:: TlsAllocAction ;
2020use crate :: diagnostics:: report_leaks;
21- use crate :: shims:: { ctor , tls} ;
21+ use crate :: shims:: { global_ctor , tls} ;
2222use crate :: * ;
2323
2424#[ derive( Copy , Clone , Debug ) ]
@@ -219,9 +219,11 @@ impl Default for MiriConfig {
219219#[ derive( Debug ) ]
220220enum MainThreadState < ' tcx > {
221221 GlobalCtors {
222- ctor_state : ctor:: GlobalCtorState < ' tcx > ,
222+ ctor_state : global_ctor:: GlobalCtorState < ' tcx > ,
223+ /// The main function to call.
223224 entry_id : DefId ,
224225 entry_type : MiriEntryFnType ,
226+ /// Arguments passed to `main`.
225227 argc : ImmTy < ' tcx > ,
226228 argv : ImmTy < ' tcx > ,
227229 } ,
@@ -324,12 +326,19 @@ pub fn create_ecx<'tcx>(
324326 MiriMachine :: new ( config, layout_cx, genmc_ctx) ,
325327 ) ;
326328
327- // First argument is constructed later, because it's skipped for `miri_start.`
329+ // Make sure we have MIR. We check MIR for some stable monomorphic function in libcore.
330+ let sentinel =
331+ helpers:: try_resolve_path ( tcx, & [ "core" , "ascii" , "escape_default" ] , Namespace :: ValueNS ) ;
332+ if !matches ! ( sentinel, Some ( s) if tcx. is_mir_available( s. def. def_id( ) ) ) {
333+ tcx. dcx ( ) . fatal (
334+ "the current sysroot was built without `-Zalways-encode-mir`, or libcore seems missing. \
335+ Use `cargo miri setup` to prepare a sysroot that is suitable for Miri."
336+ ) ;
337+ }
328338
329- // Second argument ( argc): length of `config.args`.
339+ // Compute argc and argv from `config.args`.
330340 let argc =
331341 ImmTy :: from_int ( i64:: try_from ( config. args . len ( ) ) . unwrap ( ) , ecx. machine . layouts . isize ) ;
332- // Third argument (`argv`): created from `config.args`.
333342 let argv = {
334343 // Put each argument in memory, collect pointers.
335344 let mut argvs = Vec :: < Immediate < Provenance > > :: with_capacity ( config. args . len ( ) ) ;
@@ -354,7 +363,7 @@ pub fn create_ecx<'tcx>(
354363 ecx. write_immediate ( arg, & place) ?;
355364 }
356365 ecx. mark_immutable ( & argvs_place) ;
357- // Store `argc` and `argv` for macOS `_NSGetArg{c,v}`.
366+ // Store `argc` and `argv` for macOS `_NSGetArg{c,v}`, and for the GC to see them .
358367 {
359368 let argc_place =
360369 ecx. allocate ( ecx. machine . layouts . isize , MiriMemoryKind :: Machine . into ( ) ) ?;
@@ -369,7 +378,7 @@ pub fn create_ecx<'tcx>(
369378 ecx. machine . argv = Some ( argv_place. ptr ( ) ) ;
370379 }
371380 // Store command line as UTF-16 for Windows `GetCommandLineW`.
372- {
381+ if tcx . sess . target . os == "windows" {
373382 // Construct a command string with all the arguments.
374383 let cmd_utf16: Vec < u16 > = args_to_utf16_command_string ( config. args . iter ( ) ) ;
375384
@@ -392,28 +401,20 @@ pub fn create_ecx<'tcx>(
392401
393402 // Some parts of initialization require a full `InterpCx`.
394403 MiriMachine :: late_init ( & mut ecx, config, {
395- let mut state = MainThreadState :: GlobalCtors {
404+ let mut main_thread_state = MainThreadState :: GlobalCtors {
396405 entry_id,
397406 entry_type,
398407 argc,
399408 argv,
400- ctor_state : ctor :: GlobalCtorState :: default ( ) ,
409+ ctor_state : global_ctor :: GlobalCtorState :: default ( ) ,
401410 } ;
402411
403412 // Cannot capture anything GC-relevant here.
404- Box :: new ( move |m| state. on_main_stack_empty ( m) )
413+ // `argc` and `argv` *are* GC_relevant, but they also get stored in `machine.argc` and
414+ // `machine.argv` so we are good.
415+ Box :: new ( move |m| main_thread_state. on_main_stack_empty ( m) )
405416 } ) ?;
406417
407- // Make sure we have MIR. We check MIR for some stable monomorphic function in libcore.
408- let sentinel =
409- helpers:: try_resolve_path ( tcx, & [ "core" , "ascii" , "escape_default" ] , Namespace :: ValueNS ) ;
410- if !matches ! ( sentinel, Some ( s) if tcx. is_mir_available( s. def. def_id( ) ) ) {
411- tcx. dcx ( ) . fatal (
412- "the current sysroot was built without `-Zalways-encode-mir`, or libcore seems missing. \
413- Use `cargo miri setup` to prepare a sysroot that is suitable for Miri."
414- ) ;
415- }
416-
417418 interp_ok ( ecx)
418419}
419420
0 commit comments