@@ -324,13 +324,11 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
324324 let symbol_name = this. memory ( ) . get ( symbol. alloc_id ) ?. read_c_str ( tcx, symbol) ?;
325325 let err = format ! ( "bad c unicode symbol: {:?}" , symbol_name) ;
326326 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) ? {
328328 let ptr = this. memory_mut ( ) . create_fn_alloc ( FnVal :: Other ( dlsym) ) ;
329329 this. write_scalar ( Scalar :: from ( ptr) , dest) ?;
330330 } else {
331- return err ! ( Unimplemented ( format!(
332- "Unsupported dlsym: {}" , symbol_name
333- ) ) ) ;
331+ this. write_null ( dest) ?;
334332 }
335333 }
336334
@@ -713,24 +711,31 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
713711 this. write_null ( dest) ?;
714712 }
715713
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 " => {
719717 this. write_null ( dest) ?;
720718 }
721719 "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+
727732 // Return success (`0`).
728733 this. write_null ( dest) ?;
729734 }
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" ) ) ) ;
734739 }
735740
736741 // 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
758763 }
759764
760765 // 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+ }
761777 "_tlv_atexit" => {
762778 // FIXME: register the destructor.
763779 } ,
0 commit comments