| use rustc_span::Symbol; |
| use rustc_target::spec::abi::Abi; |
| |
| use crate::*; |
| use shims::foreign_items::EmulateForeignItemResult; |
| use shims::unix::thread::EvalContextExt as _; |
| |
| pub fn is_dyn_sym(_name: &str) -> bool { |
| false |
| } |
| |
| impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for crate::MiriInterpCx<'mir, 'tcx> {} |
| pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> { |
| fn emulate_foreign_item_inner( |
| &mut self, |
| link_name: Symbol, |
| abi: Abi, |
| args: &[OpTy<'tcx, Provenance>], |
| dest: &PlaceTy<'tcx, Provenance>, |
| ) -> InterpResult<'tcx, EmulateForeignItemResult> { |
| let this = self.eval_context_mut(); |
| match link_name.as_str() { |
| // Threading |
| "pthread_attr_get_np" if this.frame_in_std() => { |
| let [_thread, _attr] = |
| this.check_shim(abi, Abi::C { unwind: false }, link_name, args)?; |
| this.write_null(dest)?; |
| } |
| "pthread_set_name_np" => { |
| let [thread, name] = |
| this.check_shim(abi, Abi::C { unwind: false }, link_name, args)?; |
| let max_len = usize::MAX; // freebsd does not seem to have a limit. |
| let res = this.pthread_setname_np( |
| this.read_scalar(thread)?, |
| this.read_scalar(name)?, |
| max_len, |
| )?; |
| this.write_scalar(res, dest)?; |
| } |
| |
| // errno |
| "__error" => { |
| let [] = this.check_shim(abi, Abi::C { unwind: false }, link_name, args)?; |
| let errno_place = this.last_error_place()?; |
| this.write_scalar(errno_place.to_ref(this).to_scalar(), dest)?; |
| } |
| |
| _ => return Ok(EmulateForeignItemResult::NotSupported), |
| } |
| Ok(EmulateForeignItemResult::NeedsJumping) |
| } |
| } |