Add gettimeofday shim for macOS

This commit is contained in:
Christian Poveda 2019-10-08 14:04:23 -05:00
parent 7a6df8504f
commit b7863f2509

View File

@ -559,6 +559,58 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
}
}
"gettimeofday" => {
if !this.machine.communicate {
throw_unsup_format!("`gettimeofday` not available when isolation is enabled")
} else {
let tcx = &{ this.tcx.tcx };
let tz = this.read_scalar(args[1])?.not_undef()?;
// Using tz is obsolete and should always be null
if !this.is_null(tz)? {
let einval = this.eval_libc("EINVAL")?;
this.set_last_error(einval)?;
this.write_scalar(Scalar::from_int(-1i32, dest.layout.size), dest)?;
} else {
let tv = this.force_ptr(this.read_scalar(args[0])?.not_undef()?)?;
let time_t = this.resolve_path(&["libc", "time_t"])?.ty(*tcx);
let suseconds_t = this.resolve_path(&["libc", "suseconds_t"])?.ty(*tcx);
let tv_sec_size = this.layout_of(time_t)?.size;
let tv_usec_size = this.layout_of(suseconds_t)?.size;
let allocation = this.memory_mut().get_mut(tv.alloc_id)?;
let mut sign = 1;
let duration = std::time::SystemTime::now()
.duration_since(std::time::SystemTime::UNIX_EPOCH)
.unwrap_or_else(|e| {
sign = -1;
e.duration()
});
allocation.write_scalar(
tcx,
tv,
Scalar::from_int(sign * (duration.as_secs() as i64), tv_sec_size)
.into(),
tv_sec_size,
)?;
allocation.write_scalar(
tcx,
tv.offset(tv_sec_size, tcx)?,
Scalar::from_int(duration.subsec_micros() as i64, tv_usec_size).into(),
tv_usec_size,
)?;
this.write_scalar(Scalar::from_int(0i32, dest.layout.size), dest)?;
}
}
}
"strlen" => {
let ptr = this.read_scalar(args[0])?.not_undef()?;
let n = this.memory().read_c_str(ptr)?.len();