Skip to content

Commit 16cde06

Browse files
committed
allow dyn_sym in the files where they are defined; remove unreachable android code
1 parent 099311b commit 16cde06

File tree

4 files changed

+25
-19
lines changed

4 files changed

+25
-19
lines changed

src/tools/miri/src/machine.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -707,7 +707,8 @@ impl<'mir, 'tcx> MiriMachine<'mir, 'tcx> {
707707
);
708708
}
709709
"android" => {
710-
// "signal"
710+
// "signal" -- just needs a non-zero pointer value (function does not even get called),
711+
// but we arrange for this to be callable anyway (it will then do nothing).
711712
let layout = this.machine.layouts.const_raw_ptr;
712713
let ptr = this.fn_ptr(FnVal::Other(DynSym::from_str("signal")));
713714
let val = ImmTy::from_scalar(Scalar::from_pointer(ptr, this), layout);

src/tools/miri/src/shims/unix/android/foreign_items.rs

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,12 @@ use shims::foreign_items::EmulateForeignItemResult;
66

77
impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for crate::MiriInterpCx<'mir, 'tcx> {}
88

9-
pub fn is_dyn_sym(name: &str) -> bool {
10-
matches!(name, "signal")
9+
pub fn is_dyn_sym(_name: &str) -> bool {
10+
false
1111
}
1212

1313
pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> {
14+
#[allow(unused, clippy::match_single_binding)] // there isn't anything here yet
1415
fn emulate_foreign_item_inner(
1516
&mut self,
1617
link_name: Symbol,
@@ -21,15 +22,9 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> {
2122
let this = self.eval_context_mut();
2223

2324
match link_name.as_str() {
24-
"signal" if this.frame_in_std() => {
25-
let [_sig, _func] =
26-
this.check_shim(abi, Abi::C { unwind: false }, link_name, args)?;
27-
this.write_null(dest)?;
28-
}
2925
_ => return Ok(EmulateForeignItemResult::NotSupported),
3026
}
3127

32-
#[allow(unreachable_code)]
3328
Ok(EmulateForeignItemResult::NeedsJumping)
3429
}
3530
}

src/tools/miri/src/shims/unix/foreign_items.rs

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,23 @@ use shims::unix::freebsd::foreign_items as freebsd;
2020
use shims::unix::linux::foreign_items as linux;
2121
use shims::unix::macos::foreign_items as macos;
2222

23+
fn is_dyn_sym(name: &str, target_os: &str) -> bool {
24+
match name {
25+
// `signal` is set up as a weak symbol in `init_extern_statics` so we might as well allow it
26+
// in `dlsym` as well.
27+
"signal" => true,
28+
// Give specific OSes a chance to allow their symbols.
29+
_ =>
30+
match target_os {
31+
"android" => android::is_dyn_sym(name),
32+
"freebsd" => freebsd::is_dyn_sym(name),
33+
"linux" => linux::is_dyn_sym(name),
34+
"macos" => macos::is_dyn_sym(name),
35+
target_os => panic!("unsupported Unix OS {target_os}"),
36+
},
37+
}
38+
}
39+
2340
impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for crate::MiriInterpCx<'mir, 'tcx> {}
2441
pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> {
2542
fn emulate_foreign_item_inner(
@@ -237,14 +254,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> {
237254
this.read_target_usize(handle)?;
238255
let symbol = this.read_pointer(symbol)?;
239256
let name = this.read_c_str(symbol)?;
240-
let is_dyn_sym = |name| match &*this.tcx.sess.target.os {
241-
"android" => android::is_dyn_sym(name),
242-
"freebsd" => freebsd::is_dyn_sym(name),
243-
"linux" => linux::is_dyn_sym(name),
244-
"macos" => macos::is_dyn_sym(name),
245-
target_os => panic!("unsupported Unix OS {target_os}"),
246-
};
247-
if let Ok(name) = str::from_utf8(name) && is_dyn_sym(name) {
257+
if let Ok(name) = str::from_utf8(name) && is_dyn_sym(name, &this.tcx.sess.target.os) {
248258
let ptr = this.fn_ptr(FnVal::Other(DynSym::from_str(name)));
249259
this.write_pointer(ptr, dest)?;
250260
} else {

src/tools/miri/src/shims/unix/linux/foreign_items.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ use shims::unix::linux::sync::futex;
1212
use shims::unix::sync::EvalContextExt as _;
1313
use shims::unix::thread::EvalContextExt as _;
1414

15-
pub fn is_dyn_sym(_name: &str) -> bool {
16-
false
15+
pub fn is_dyn_sym(name: &str) -> bool {
16+
matches!(name, "getrandom")
1717
}
1818

1919
impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for crate::MiriInterpCx<'mir, 'tcx> {}

0 commit comments

Comments
 (0)