Skip to content

Commit dca00ab

Browse files
committed
introduce platform-specific module hierarchy for dlsym (similar to foreign_items)
1 parent bde2eb4 commit dca00ab

File tree

11 files changed

+194
-38
lines changed

11 files changed

+194
-38
lines changed

src/shims/dlsym.rs

Lines changed: 10 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,24 @@
11
use rustc_middle::mir;
22

33
use crate::*;
4-
use helpers::check_arg_count;
4+
use shims::posix::dlsym as posix;
5+
use shims::windows::dlsym as windows;
56

67
#[derive(Debug, Copy, Clone)]
8+
#[allow(non_camel_case_types)]
79
pub enum Dlsym {
8-
GetEntropy,
10+
Posix(posix::Dlsym),
11+
Windows(windows::Dlsym),
912
}
1013

1114
impl Dlsym {
1215
// Returns an error for unsupported symbols, and None if this symbol
1316
// should become a NULL pointer (pretend it does not exist).
1417
pub fn from_str(name: &[u8], target_os: &str) -> InterpResult<'static, Option<Dlsym>> {
15-
use self::Dlsym::*;
16-
let name = String::from_utf8_lossy(name);
18+
let name = &*String::from_utf8_lossy(name);
1719
Ok(match target_os {
18-
"linux" => match &*name {
19-
"__pthread_get_minstack" => None,
20-
_ => throw_unsup_format!("unsupported Linux dlsym: {}", name),
21-
}
22-
"macos" => match &*name {
23-
"getentropy" => Some(GetEntropy),
24-
_ => throw_unsup_format!("unsupported macOS dlsym: {}", name),
25-
}
26-
"windows" => match &*name {
27-
"SetThreadStackGuarantee" => None,
28-
"AcquireSRWLockExclusive" => None,
29-
"GetSystemTimePreciseAsFileTime" => None,
30-
_ => throw_unsup_format!("unsupported Windows dlsym: {}", name),
31-
}
20+
"linux" | "macos" => posix::Dlsym::from_str(name, target_os)?.map(Dlsym::Posix),
21+
"windows" => windows::Dlsym::from_str(name)?.map(Dlsym::Windows),
3222
os => bug!("dlsym not implemented for target_os {}", os),
3323
})
3424
}
@@ -42,23 +32,10 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
4232
args: &[OpTy<'tcx, Tag>],
4333
ret: Option<(PlaceTy<'tcx, Tag>, mir::BasicBlock)>,
4434
) -> InterpResult<'tcx> {
45-
use self::Dlsym::*;
46-
4735
let this = self.eval_context_mut();
48-
let (dest, ret) = ret.expect("we don't support any diverging dlsym");
49-
5036
match dlsym {
51-
GetEntropy => {
52-
let &[ptr, len] = check_arg_count(args)?;
53-
let ptr = this.read_scalar(ptr)?.not_undef()?;
54-
let len = this.read_scalar(len)?.to_machine_usize(this)?;
55-
this.gen_random(ptr, len)?;
56-
this.write_null(dest)?;
57-
}
37+
Dlsym::Posix(dlsym) => posix::EvalContextExt::call_dlsym(this, dlsym, args, ret),
38+
Dlsym::Windows(dlsym) => windows::EvalContextExt::call_dlsym(this, dlsym, args, ret),
5839
}
59-
60-
this.dump_place(*dest);
61-
this.go_to_block(ret);
62-
Ok(())
6340
}
6441
}

src/shims/posix/dlsym.rs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
use rustc_middle::mir;
2+
3+
use crate::*;
4+
use shims::posix::linux::dlsym as linux;
5+
use shims::posix::macos::dlsym as macos;
6+
7+
#[derive(Debug, Copy, Clone)]
8+
pub enum Dlsym {
9+
Linux(linux::Dlsym),
10+
MacOs(macos::Dlsym),
11+
}
12+
13+
impl Dlsym {
14+
// Returns an error for unsupported symbols, and None if this symbol
15+
// should become a NULL pointer (pretend it does not exist).
16+
pub fn from_str(name: &str, target_os: &str) -> InterpResult<'static, Option<Dlsym>> {
17+
Ok(match target_os {
18+
"linux" => linux::Dlsym::from_str(name)?.map(Dlsym::Linux),
19+
"macos" => macos::Dlsym::from_str(name)?.map(Dlsym::MacOs),
20+
_ => unreachable!(),
21+
})
22+
}
23+
}
24+
25+
impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for crate::MiriEvalContext<'mir, 'tcx> {}
26+
pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx> {
27+
fn call_dlsym(
28+
&mut self,
29+
dlsym: Dlsym,
30+
args: &[OpTy<'tcx, Tag>],
31+
ret: Option<(PlaceTy<'tcx, Tag>, mir::BasicBlock)>,
32+
) -> InterpResult<'tcx> {
33+
let this = self.eval_context_mut();
34+
match dlsym {
35+
Dlsym::Linux(dlsym) => linux::EvalContextExt::call_dlsym(this, dlsym, args, ret),
36+
Dlsym::MacOs(dlsym) => macos::EvalContextExt::call_dlsym(this, dlsym, args, ret),
37+
}
38+
}
39+
}

src/shims/posix/linux/dlsym.rs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
use rustc_middle::mir;
2+
3+
use crate::*;
4+
5+
#[derive(Debug, Copy, Clone)]
6+
pub enum Dlsym {
7+
}
8+
9+
impl Dlsym {
10+
// Returns an error for unsupported symbols, and None if this symbol
11+
// should become a NULL pointer (pretend it does not exist).
12+
pub fn from_str(name: &str) -> InterpResult<'static, Option<Dlsym>> {
13+
Ok(match &*name {
14+
"__pthread_get_minstack" => None,
15+
_ => throw_unsup_format!("unsupported Linux dlsym: {}", name),
16+
})
17+
}
18+
}
19+
20+
impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for crate::MiriEvalContext<'mir, 'tcx> {}
21+
pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx> {
22+
fn call_dlsym(
23+
&mut self,
24+
dlsym: Dlsym,
25+
_args: &[OpTy<'tcx, Tag>],
26+
ret: Option<(PlaceTy<'tcx, Tag>, mir::BasicBlock)>,
27+
) -> InterpResult<'tcx> {
28+
let this = self.eval_context_mut();
29+
let (_dest, _ret) = ret.expect("we don't support any diverging dlsym");
30+
assert!(this.tcx.sess.target.target.target_os == "linux");
31+
32+
match dlsym {}
33+
}
34+
}

src/shims/posix/linux/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
pub mod foreign_items;
2+
pub mod dlsym;

src/shims/posix/macos/dlsym.rs

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
use rustc_middle::mir;
2+
3+
use crate::*;
4+
use helpers::check_arg_count;
5+
6+
#[derive(Debug, Copy, Clone)]
7+
#[allow(non_camel_case_types)]
8+
pub enum Dlsym {
9+
getentropy,
10+
}
11+
12+
impl Dlsym {
13+
// Returns an error for unsupported symbols, and None if this symbol
14+
// should become a NULL pointer (pretend it does not exist).
15+
pub fn from_str(name: &str) -> InterpResult<'static, Option<Dlsym>> {
16+
Ok(match name {
17+
"getentropy" => Some(Dlsym::getentropy),
18+
_ => throw_unsup_format!("unsupported macOS dlsym: {}", name),
19+
})
20+
}
21+
}
22+
23+
impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for crate::MiriEvalContext<'mir, 'tcx> {}
24+
pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx> {
25+
fn call_dlsym(
26+
&mut self,
27+
dlsym: Dlsym,
28+
args: &[OpTy<'tcx, Tag>],
29+
ret: Option<(PlaceTy<'tcx, Tag>, mir::BasicBlock)>,
30+
) -> InterpResult<'tcx> {
31+
let this = self.eval_context_mut();
32+
let (dest, ret) = ret.expect("we don't support any diverging dlsym");
33+
assert!(this.tcx.sess.target.target.target_os == "macos");
34+
35+
match dlsym {
36+
Dlsym::getentropy => {
37+
let &[ptr, len] = check_arg_count(args)?;
38+
let ptr = this.read_scalar(ptr)?.not_undef()?;
39+
let len = this.read_scalar(len)?.to_machine_usize(this)?;
40+
this.gen_random(ptr, len)?;
41+
this.write_null(dest)?;
42+
}
43+
}
44+
45+
this.dump_place(*dest);
46+
this.go_to_block(ret);
47+
Ok(())
48+
}
49+
}

src/shims/posix/macos/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
pub mod foreign_items;
2+
pub mod dlsym;

src/shims/posix/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
pub mod foreign_items;
2+
pub mod dlsym;
23

34
mod fs;
45
mod sync;

src/shims/windows/dlsym.rs

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
use rustc_middle::mir;
2+
3+
use crate::*;
4+
use helpers::check_arg_count;
5+
6+
#[derive(Debug, Copy, Clone)]
7+
pub enum Dlsym {
8+
AcquireSRWLockExclusive,
9+
AcquireSRWLockShared,
10+
}
11+
12+
impl Dlsym {
13+
// Returns an error for unsupported symbols, and None if this symbol
14+
// should become a NULL pointer (pretend it does not exist).
15+
pub fn from_str(name: &str) -> InterpResult<'static, Option<Dlsym>> {
16+
Ok(match name {
17+
"AcquireSRWLockExclusive" => Some(Dlsym::AcquireSRWLockExclusive),
18+
"AcquireSRWLockShared" => Some(Dlsym::AcquireSRWLockShared),
19+
"SetThreadStackGuarantee" => None,
20+
"GetSystemTimePreciseAsFileTime" => None,
21+
_ => throw_unsup_format!("unsupported Windows dlsym: {}", name),
22+
})
23+
}
24+
}
25+
26+
impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for crate::MiriEvalContext<'mir, 'tcx> {}
27+
pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx> {
28+
fn call_dlsym(
29+
&mut self,
30+
dlsym: Dlsym,
31+
args: &[OpTy<'tcx, Tag>],
32+
ret: Option<(PlaceTy<'tcx, Tag>, mir::BasicBlock)>,
33+
) -> InterpResult<'tcx> {
34+
let this = self.eval_context_mut();
35+
let (dest, ret) = ret.expect("we don't support any diverging dlsym");
36+
assert!(this.tcx.sess.target.target.target_os == "windows");
37+
38+
match dlsym {
39+
Dlsym::AcquireSRWLockExclusive => {
40+
let &[ptr] = check_arg_count(args)?;
41+
let lock = this.deref_operand(ptr)?; // points to ptr-sized data
42+
throw_unsup_format!("AcquireSRWLockExclusive is not actually implemented");
43+
}
44+
Dlsym::AcquireSRWLockShared => {
45+
let &[ptr] = check_arg_count(args)?;
46+
let lock = this.deref_operand(ptr)?; // points to ptr-sized data
47+
throw_unsup_format!("AcquireSRWLockExclusive is not actually implemented");
48+
}
49+
}
50+
51+
this.dump_place(*dest);
52+
this.go_to_block(ret);
53+
Ok(())
54+
}
55+
}

src/shims/windows/mod.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,4 @@
11
pub mod foreign_items;
2+
pub mod dlsym;
3+
4+
mod sync;

src/shims/windows/sync.rs

Whitespace-only changes.

0 commit comments

Comments
 (0)