@@ -303,13 +303,11 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
303
303
let symbol_name = this. memory ( ) . get ( symbol. alloc_id ) ?. read_c_str ( tcx, symbol) ?;
304
304
let err = format ! ( "bad c unicode symbol: {:?}" , symbol_name) ;
305
305
let symbol_name = :: std:: str:: from_utf8 ( symbol_name) . unwrap_or ( & err) ;
306
- if let Some ( dlsym) = Dlsym :: from_str ( symbol_name) {
306
+ if let Some ( dlsym) = Dlsym :: from_str ( symbol_name) ? {
307
307
let ptr = this. memory_mut ( ) . create_fn_alloc ( FnVal :: Other ( dlsym) ) ;
308
308
this. write_scalar ( Scalar :: from ( ptr) , dest) ?;
309
309
} else {
310
- return err ! ( Unimplemented ( format!(
311
- "Unsupported dlsym: {}" , symbol_name
312
- ) ) ) ;
310
+ this. write_null ( dest) ?;
313
311
}
314
312
}
315
313
@@ -697,24 +695,31 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
697
695
this. write_null ( dest) ?;
698
696
}
699
697
700
- // Determine stack base address.
701
- "pthread_attr_init" | "pthread_attr_destroy" | "pthread_attr_get_np " |
702
- "pthread_getattr_np" | "pthread_self" | "pthread_get_stacksize_np " => {
698
+ // Stack size/ address stuff .
699
+ "pthread_attr_init" | "pthread_attr_destroy" | "pthread_self " |
700
+ "pthread_attr_setstacksize " => {
703
701
this. write_null ( dest) ?;
704
702
}
705
703
"pthread_attr_getstack" => {
706
- // Second argument is where we are supposed to write the stack size.
707
- let ptr = this. deref_operand ( args[ 1 ] ) ?;
708
- // Just any address.
709
- let stack_addr = Scalar :: from_uint ( STACK_ADDR , args[ 1 ] . layout . size ) ;
710
- this. write_scalar ( stack_addr, ptr. into ( ) ) ?;
704
+ let addr_place = this. deref_operand ( args[ 1 ] ) ?;
705
+ let size_place = this. deref_operand ( args[ 2 ] ) ?;
706
+
707
+ this. write_scalar (
708
+ Scalar :: from_uint ( STACK_ADDR , addr_place. layout . size ) ,
709
+ addr_place. into ( ) ,
710
+ ) ?;
711
+ this. write_scalar (
712
+ Scalar :: from_uint ( STACK_SIZE , size_place. layout . size ) ,
713
+ size_place. into ( ) ,
714
+ ) ?;
715
+
711
716
// Return success (`0`).
712
717
this. write_null ( dest) ?;
713
718
}
714
- "pthread_get_stackaddr_np" => {
715
- // Just any address .
716
- let stack_addr = Scalar :: from_uint ( STACK_ADDR , dest . layout . size ) ;
717
- this . write_scalar ( stack_addr , dest ) ? ;
719
+
720
+ // We don't support threading .
721
+ "pthread_create" => {
722
+ return err ! ( Unimplemented ( format! ( "Miri does not support threading" ) ) ) ;
718
723
}
719
724
720
725
// Stub out calls for condvar, mutex and rwlock, to just return `0`.
@@ -742,6 +747,17 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
742
747
}
743
748
744
749
// macOS API stubs.
750
+ "pthread_attr_get_np" | "pthread_getattr_np" => {
751
+ this. write_null ( dest) ?;
752
+ }
753
+ "pthread_get_stackaddr_np" => {
754
+ let stack_addr = Scalar :: from_uint ( STACK_ADDR , dest. layout . size ) ;
755
+ this. write_scalar ( stack_addr, dest) ?;
756
+ }
757
+ "pthread_get_stacksize_np" => {
758
+ let stack_size = Scalar :: from_uint ( STACK_SIZE , dest. layout . size ) ;
759
+ this. write_scalar ( stack_size, dest) ?;
760
+ }
745
761
"_tlv_atexit" => {
746
762
// FIXME: register the destructor.
747
763
} ,
0 commit comments