@@ -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,9 @@ 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.`
328-
329- // Second argument (argc): length of `config.args`.
329+ // Compute argc and argv from `config.args`.
330330 let argc =
331331 ImmTy :: from_int ( i64:: try_from ( config. args . len ( ) ) . unwrap ( ) , ecx. machine . layouts . isize ) ;
332- // Third argument (`argv`): created from `config.args`.
333332 let argv = {
334333 // Put each argument in memory, collect pointers.
335334 let mut argvs = Vec :: < Immediate < Provenance > > :: with_capacity ( config. args . len ( ) ) ;
@@ -354,7 +353,7 @@ pub fn create_ecx<'tcx>(
354353 ecx. write_immediate ( arg, & place) ?;
355354 }
356355 ecx. mark_immutable ( & argvs_place) ;
357- // Store `argc` and `argv` for macOS `_NSGetArg{c,v}`.
356+ // Store `argc` and `argv` for macOS `_NSGetArg{c,v}`, and for the GC to see them .
358357 {
359358 let argc_place =
360359 ecx. allocate ( ecx. machine . layouts . isize , MiriMemoryKind :: Machine . into ( ) ) ?;
@@ -369,7 +368,7 @@ pub fn create_ecx<'tcx>(
369368 ecx. machine . argv = Some ( argv_place. ptr ( ) ) ;
370369 }
371370 // Store command line as UTF-16 for Windows `GetCommandLineW`.
372- {
371+ if tcx . sess . target . os == "windows" {
373372 // Construct a command string with all the arguments.
374373 let cmd_utf16: Vec < u16 > = args_to_utf16_command_string ( config. args . iter ( ) ) ;
375374
@@ -392,16 +391,18 @@ pub fn create_ecx<'tcx>(
392391
393392 // Some parts of initialization require a full `InterpCx`.
394393 MiriMachine :: late_init ( & mut ecx, config, {
395- let mut state = MainThreadState :: GlobalCtors {
394+ let mut main_thread_state = MainThreadState :: GlobalCtors {
396395 entry_id,
397396 entry_type,
398397 argc,
399398 argv,
400- ctor_state : ctor :: GlobalCtorState :: default ( ) ,
399+ ctor_state : global_ctor :: GlobalCtorState :: default ( ) ,
401400 } ;
402401
403402 // Cannot capture anything GC-relevant here.
404- Box :: new ( move |m| state. on_main_stack_empty ( m) )
403+ // `argc` and `argv` *are* GC_relevant, but they also get stored in `machine.argc` and
404+ // `machine.argv` so we are good.
405+ Box :: new ( move |m| main_thread_state. on_main_stack_empty ( m) )
405406 } ) ?;
406407
407408 // Make sure we have MIR. We check MIR for some stable monomorphic function in libcore.
0 commit comments