Skip to content

Commit

Permalink
make windows compat_fn (crudely) work on Miri
Browse files Browse the repository at this point in the history
  • Loading branch information
RalfJung committed Apr 7, 2022
1 parent 26b5e0c commit fe85591
Showing 1 changed file with 14 additions and 4 deletions.
18 changes: 14 additions & 4 deletions library/std/src/sys/windows/compat.rs
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,10 @@ macro_rules! compat_fn {
static INIT_TABLE_ENTRY: unsafe extern "C" fn() = init;

unsafe extern "C" fn init() {
PTR = get_f();
}

unsafe extern "C" fn get_f() -> Option<F> {
// There is no locking here. This code is executed before main() is entered, and
// is guaranteed to be single-threaded.
//
Expand All @@ -91,10 +95,11 @@ macro_rules! compat_fn {
match $crate::sys::c::GetProcAddress(module_handle, symbol_name as *const i8).addr() {
0 => {}
n => {
PTR = Some(mem::transmute::<usize, F>(n));
return Some(mem::transmute::<usize, F>(n));
}
}
}
return None;
}

#[allow(dead_code)]
Expand All @@ -105,10 +110,15 @@ macro_rules! compat_fn {
#[allow(dead_code)]
pub unsafe fn call($($argname: $argtype),*) -> $rettype {
if let Some(ptr) = PTR {
ptr($($argname),*)
} else {
$fallback_body
return ptr($($argname),*);
}
if cfg!(miri) {
// Miri does not run `init`, so we just call `get_f` each time.
if let Some(ptr) = get_f() {
return ptr($($argname),*);
}
}
$fallback_body
}
}

Expand Down

0 comments on commit fe85591

Please sign in to comment.