revision 906:268ea359f884
summary |
tree |
shortlog |
changelog |
graph |
changeset |
raw | bz2 | zip | gz changeset | 906:268ea359f884 |
parent | 905:4c17ebd9ef5e |
child | 907:5ecafd8d7923 |
author | nkeynes |
date | Thu Oct 30 00:06:49 2008 +0000 (15 years ago) |
Change xlat_get_native_pc to pass in the expected code region - this lets the Mac
unwind implementation range test the IP address (which works) rather than EBP
(which doesn't for some reason).
Remove the test in configure that prevents fomit-frame-pointer being used in Mac
builds.
unwind implementation range test the IP address (which works) rather than EBP
(which doesn't for some reason).
Remove the test in configure that prevents fomit-frame-pointer being used in Mac
builds.
configure | view | annotate | diff | log | ||
configure.in | view | annotate | diff | log | ||
src/sh4/ia32abi.h | view | annotate | diff | log | ||
src/sh4/ia32mac.h | view | annotate | diff | log | ||
src/sh4/sh4trans.c | view | annotate | diff | log | ||
src/sh4/xltcache.h | view | annotate | diff | log |
1.1 --- a/configure Wed Oct 29 23:51:58 2008 +00001.2 +++ b/configure Thu Oct 30 00:06:49 2008 +00001.3 @@ -6865,7 +6865,7 @@1.4 _ACEOF1.6 fi1.7 -if test "x$enable_optimized" = "xyes" -a "x$APPLE_BUILD" != "xyes"; then1.8 +if test "x$enable_optimized" = "xyes"; then1.9 CFLAGS="$CFLAGS -fexceptions -fomit-frame-pointer"1.11 cat >>confdefs.h <<\_ACEOF
2.1 --- a/configure.in Wed Oct 29 23:51:58 2008 +00002.2 +++ b/configure.in Thu Oct 30 00:06:49 2008 +00002.3 @@ -91,7 +91,7 @@2.4 if test "x$HAVE_COCOA" = 'xyes' -a "x$with_gtk" = "xno"; then2.5 AC_DEFINE(OSX_BUNDLE, [1], [Generating a bundled application])2.6 fi2.7 -if test "x$enable_optimized" = "xyes" -a "x$APPLE_BUILD" != "xyes"; then2.8 +if test "x$enable_optimized" = "xyes"; then2.9 CFLAGS="$CFLAGS -fexceptions -fomit-frame-pointer"2.10 AC_DEFINE(HAVE_EXCEPTIONS, [1], [Have exception stack-frame information])2.11 fi
3.1 --- a/src/sh4/ia32abi.h Wed Oct 29 23:51:58 2008 +00003.2 +++ b/src/sh4/ia32abi.h Thu Oct 30 00:06:49 2008 +00003.3 @@ -333,7 +333,7 @@3.4 return _URC_NO_REASON;3.5 }3.7 -void *xlat_get_native_pc()3.8 +void *xlat_get_native_pc( void *code, uint32_t code_size )3.9 {3.10 struct _Unwind_Exception exc;3.11 struct UnwindInfo info;3.12 @@ -346,7 +346,7 @@3.13 return NULL;3.14 }3.15 #else3.16 -void *xlat_get_native_pc()3.17 +void *xlat_get_native_pc( void *code, uint32_t code_size )3.18 {3.19 void *result = NULL;3.20 asm(
4.1 --- a/src/sh4/ia32mac.h Wed Oct 29 23:51:58 2008 +00004.2 +++ b/src/sh4/ia32mac.h Thu Oct 30 00:06:49 2008 +00004.3 @@ -343,39 +343,37 @@4.4 #include <unwind.h>4.6 struct UnwindInfo {4.7 - int have_result;4.8 + uintptr_t block_start;4.9 + uintptr_t block_end;4.10 void *pc;4.11 };4.13 _Unwind_Reason_Code xlat_check_frame( struct _Unwind_Context *context, void *arg )4.14 {4.15 - void *ebp = (void *)_Unwind_GetGR(context, 5);4.16 - void *expect = (((uint8_t *)&sh4r) + 128 );4.17 struct UnwindInfo *info = arg;4.18 - if( ebp == expect ) {4.19 - info->have_result = 1;4.20 - info->pc = (void *)_Unwind_GetIP(context);4.21 - } else if( info->have_result ) {4.22 + void *pc = (void *)_Unwind_GetIP(context);4.23 + if( ((uintptr_t)pc) >= info->block_start && ((uintptr_t)pc) < info->block_end ) {4.24 + info->pc = pc;4.25 return _URC_NORMAL_STOP;4.26 }4.28 return _URC_NO_REASON;4.29 }4.31 -void *xlat_get_native_pc()4.32 +void *xlat_get_native_pc( void *code, uint32_t code_size )4.33 {4.34 struct _Unwind_Exception exc;4.35 struct UnwindInfo info;4.37 - info.have_result = 0;4.38 + info.pc = NULL;4.39 + info.block_start = (uintptr_t)code;4.40 + info.block_end = info.block_start + code_size;4.41 void *result = NULL;4.42 _Unwind_Backtrace( xlat_check_frame, &info );4.43 - if( info.have_result )4.44 - return info.pc;4.45 - return NULL;4.46 + return info.pc;4.47 }4.48 #else4.49 -void *xlat_get_native_pc()4.50 +void *xlat_get_native_pc( void *code, uint32_t code_size )4.51 {4.52 void *result = NULL;4.53 asm(
5.1 --- a/src/sh4/sh4trans.c Wed Oct 29 23:51:58 2008 +00005.2 +++ b/src/sh4/sh4trans.c Thu Oct 30 00:06:49 2008 +00005.3 @@ -158,14 +158,17 @@5.5 void sh4_translate_exit_recover( )5.6 {5.7 - void *pc = xlat_get_native_pc();5.8 - if( pc != NULL ) {5.9 - // could be null if we're not actually running inside the translator5.10 - void *code = xlat_get_code( sh4r.pc );5.11 - xlat_recovery_record_t recover = xlat_get_post_recovery(code, pc, TRUE);5.12 - if( recover != NULL ) {5.13 - // Can be null if there is no recovery necessary5.14 - sh4_translate_run_recovery(recover);5.15 + void *code = xlat_get_code_by_vma( sh4r.pc );5.16 + if( code != NULL ) {5.17 + uint32_t size = xlat_get_code_size( code );5.18 + void *pc = xlat_get_native_pc( code, size );5.19 + if( pc != NULL ) {5.20 + // could be null if we're not actually running inside the translator5.21 + xlat_recovery_record_t recover = xlat_get_post_recovery(code, pc, TRUE);5.22 + if( recover != NULL ) {5.23 + // Can be null if there is no recovery necessary5.24 + sh4_translate_run_recovery(recover);5.25 + }5.26 }5.27 }5.28 }5.29 @@ -191,19 +194,22 @@5.30 */5.31 gboolean sh4_translate_flush_cache()5.32 {5.33 - void *pc = xlat_get_native_pc();5.34 - assert( pc != NULL );5.35 + void *code = xlat_get_code_by_vma( sh4r.pc );5.36 + if( code != NULL ) {5.37 + uint32_t size = xlat_get_code_size( code );5.38 + void *pc = xlat_get_native_pc( code, size );5.39 + assert( pc != NULL );5.41 - void *code = xlat_get_code( sh4r.pc );5.42 - xlat_recovery_record_t recover = xlat_get_post_recovery(code, pc, FALSE);5.43 - if( recover != NULL ) {5.44 - // Can be null if there is no recovery necessary5.45 - sh4_translate_run_recovery(recover);5.46 - xlat_flush_cache();5.47 - return TRUE;5.48 - } else {5.49 - xlat_flush_cache();5.50 - return FALSE;5.51 + xlat_recovery_record_t recover = xlat_get_post_recovery(code, pc, FALSE);5.52 + if( recover != NULL ) {5.53 + // Can be null if there is no recovery necessary5.54 + sh4_translate_run_recovery(recover);5.55 + xlat_flush_cache();5.56 + return TRUE;5.57 + } else {5.58 + xlat_flush_cache();5.59 + return FALSE;5.60 + }5.61 }5.62 }
6.1 --- a/src/sh4/xltcache.h Wed Oct 29 23:51:58 2008 +00006.2 +++ b/src/sh4/xltcache.h Thu Oct 30 00:06:49 2008 +00006.3 @@ -142,9 +142,11 @@6.4 * Retrieve the current host address of the running translated code block.6.5 * @return the host PC, or null if there is no currently executing translated6.6 * block (or the stack is corrupted)6.7 - * Note: this method is implemented in host-specific asm.6.8 + * Note: the implementation of this method is host (and calling-convention) specific.6.9 + * @param block_start start of the block the PC should be in6.10 + * @param block_size size of the code block in bytes.6.11 */6.12 -void *xlat_get_native_pc();6.13 +void *xlat_get_native_pc( void *block_start, uint32_t block_size );6.15 /**6.16 * Retrieve the size of the block starting at the specified pointer. If the
.