Skip to content

Commit f2781da

Browse files
committed
minor tweaks and comments
1 parent 5495c4d commit f2781da

File tree

4 files changed

+20
-14
lines changed

4 files changed

+20
-14
lines changed

src/concurrency/thread.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -677,6 +677,8 @@ trait EvalContextPrivExt<'tcx>: MiriInterpCxExt<'tcx> {
677677
fn run_on_stack_empty(&mut self) -> InterpResult<'tcx, Poll<()>> {
678678
let this = self.eval_context_mut();
679679
// Inform GenMC that a thread has finished all user code. GenMC needs to know this for scheduling.
680+
// FIXME(GenMC): Thread-local destructors *are* user code, so this is odd. Also now that we
681+
// support pre-main constructors, it can get called there as well.
680682
if let Some(genmc_ctx) = this.machine.data_race.as_genmc_ref() {
681683
let thread_id = this.active_thread();
682684
genmc_ctx.handle_thread_stack_empty(thread_id);

src/eval.rs

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ use rustc_session::config::EntryFnType;
1818
use crate::concurrency::GenmcCtx;
1919
use crate::concurrency::thread::TlsAllocAction;
2020
use crate::diagnostics::report_leaks;
21-
use crate::shims::{ctor, tls};
21+
use crate::shims::{global_ctor, tls};
2222
use crate::*;
2323

2424
#[derive(Copy, Clone, Debug)]
@@ -219,9 +219,11 @@ impl Default for MiriConfig {
219219
#[derive(Debug)]
220220
enum 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.

src/shims/ctor.rs renamed to src/shims/global_ctor.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,11 @@ impl<'tcx> GlobalCtorState<'tcx> {
4545

4646
segment_name == Some("__DATA")
4747
&& section_name == Some("__mod_init_func")
48-
// The `mod_init_funcs` directive ensures that the `S_MOD_INIT_FUNC_POINTERS` flag
49-
// is set on the section, but it is not strictly required.
48+
// The `mod_init_funcs` directive ensures that the
49+
// `S_MOD_INIT_FUNC_POINTERS` flag is set on the section. LLVM
50+
// adds this automatically so we currently do not require it.
51+
// FIXME: is this guaranteed LLVM behavior? If not, we shouldn't
52+
// implicitly add it here.
5053
&& matches!(section_type, None | Some("mod_init_funcs"))
5154
})?,
5255

src/shims/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,10 @@ mod wasi;
1111
mod windows;
1212
mod x86;
1313

14-
pub mod ctor;
1514
pub mod env;
1615
pub mod extern_static;
1716
pub mod foreign_items;
17+
pub mod global_ctor;
1818
pub mod io_error;
1919
pub mod os_str;
2020
pub mod panic;

0 commit comments

Comments
 (0)