@@ -324,13 +324,11 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
324
324
let symbol_name = this. memory ( ) . get ( symbol. alloc_id ) ?. read_c_str ( tcx, symbol) ?;
325
325
let err = format ! ( "bad c unicode symbol: {:?}" , symbol_name) ;
326
326
let symbol_name = :: std:: str:: from_utf8 ( symbol_name) . unwrap_or ( & err) ;
327
- if let Some ( dlsym) = Dlsym :: from_str ( symbol_name) {
327
+ if let Some ( dlsym) = Dlsym :: from_str ( symbol_name) ? {
328
328
let ptr = this. memory_mut ( ) . create_fn_alloc ( FnVal :: Other ( dlsym) ) ;
329
329
this. write_scalar ( Scalar :: from ( ptr) , dest) ?;
330
330
} else {
331
- return err ! ( Unimplemented ( format!(
332
- "Unsupported dlsym: {}" , symbol_name
333
- ) ) ) ;
331
+ this. write_null ( dest) ?;
334
332
}
335
333
}
336
334
@@ -713,24 +711,31 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
713
711
this. write_null ( dest) ?;
714
712
}
715
713
716
- // Determine stack base address.
717
- "pthread_attr_init" | "pthread_attr_destroy" | "pthread_attr_get_np " |
718
- "pthread_getattr_np" | "pthread_self" | "pthread_get_stacksize_np " => {
714
+ // Stack size/ address stuff .
715
+ "pthread_attr_init" | "pthread_attr_destroy" | "pthread_self " |
716
+ "pthread_attr_setstacksize " => {
719
717
this. write_null ( dest) ?;
720
718
}
721
719
"pthread_attr_getstack" => {
722
- // Second argument is where we are supposed to write the stack size.
723
- let ptr = this. deref_operand ( args[ 1 ] ) ?;
724
- // Just any address.
725
- let stack_addr = Scalar :: from_uint ( STACK_ADDR , args[ 1 ] . layout . size ) ;
726
- this. write_scalar ( stack_addr, ptr. into ( ) ) ?;
720
+ let addr_place = this. deref_operand ( args[ 1 ] ) ?;
721
+ let size_place = this. deref_operand ( args[ 2 ] ) ?;
722
+
723
+ this. write_scalar (
724
+ Scalar :: from_uint ( STACK_ADDR , addr_place. layout . size ) ,
725
+ addr_place. into ( ) ,
726
+ ) ?;
727
+ this. write_scalar (
728
+ Scalar :: from_uint ( STACK_SIZE , size_place. layout . size ) ,
729
+ size_place. into ( ) ,
730
+ ) ?;
731
+
727
732
// Return success (`0`).
728
733
this. write_null ( dest) ?;
729
734
}
730
- "pthread_get_stackaddr_np" => {
731
- // Just any address .
732
- let stack_addr = Scalar :: from_uint ( STACK_ADDR , dest . layout . size ) ;
733
- this . write_scalar ( stack_addr , dest ) ? ;
735
+
736
+ // We don't support threading .
737
+ "pthread_create" => {
738
+ return err ! ( Unimplemented ( format! ( "Miri does not support threading" ) ) ) ;
734
739
}
735
740
736
741
// Stub out calls for condvar, mutex and rwlock, to just return `0`.
@@ -758,6 +763,17 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
758
763
}
759
764
760
765
// macOS API stubs.
766
+ "pthread_attr_get_np" | "pthread_getattr_np" => {
767
+ this. write_null ( dest) ?;
768
+ }
769
+ "pthread_get_stackaddr_np" => {
770
+ let stack_addr = Scalar :: from_uint ( STACK_ADDR , dest. layout . size ) ;
771
+ this. write_scalar ( stack_addr, dest) ?;
772
+ }
773
+ "pthread_get_stacksize_np" => {
774
+ let stack_size = Scalar :: from_uint ( STACK_SIZE , dest. layout . size ) ;
775
+ this. write_scalar ( stack_size, dest) ?;
776
+ }
761
777
"_tlv_atexit" => {
762
778
// FIXME: register the destructor.
763
779
} ,
0 commit comments