# HG changeset patch # User Mike Pavone # Date 1367703410 25200 # Node ID 7b8a49220e3b5be885bde6404d1b2200d6a12f96 # Parent 44f0bbf57b4fe71533480c5b3f3e7cc2a732a517 Remove deferred address entries from abandoned translations inside z80_retrans_inst diff -r 44f0bbf57b4f -r 7b8a49220e3b x86_backend.c --- a/x86_backend.c Fri May 03 21:22:36 2013 -0700 +++ b/x86_backend.c Sat May 04 14:36:50 2013 -0700 @@ -10,6 +10,15 @@ return new_head; } +void remove_deferred_until(deferred_addr **head_ptr, deferred_addr * remove_to) +{ + for(deferred_addr *cur = *head_ptr; cur && cur != remove_to; cur = *head_ptr) + { + *head_ptr = cur->next; + free(cur); + } +} + void process_deferred(deferred_addr ** head_ptr, void * context, native_addr_func get_native) { deferred_addr * cur = *head_ptr; diff -r 44f0bbf57b4f -r 7b8a49220e3b x86_backend.h --- a/x86_backend.h Fri May 03 21:22:36 2013 -0700 +++ b/x86_backend.h Sat May 04 14:36:50 2013 -0700 @@ -28,6 +28,7 @@ typedef uint8_t * (*native_addr_func)(void * context, uint32_t address); deferred_addr * defer_address(deferred_addr * old_head, uint32_t address, uint8_t *dest); +void remove_deferred_until(deferred_addr **head_ptr, deferred_addr * remove_to); void process_deferred(deferred_addr ** head_ptr, void * context, native_addr_func get_native); #endif //X86_BACKEND_H_ diff -r 44f0bbf57b4f -r 7b8a49220e3b z80_to_x86.c --- a/z80_to_x86.c Fri May 03 21:22:36 2013 -0700 +++ b/z80_to_x86.c Sat May 04 14:36:50 2013 -0700 @@ -1567,10 +1567,12 @@ opts->code_end = dst_end = dst + size; opts->cur_code = dst; } + deferred_addr * orig_deferred = opts->deferred; uint8_t * native_end = translate_z80inst(&instbuf, dst, context, address); if ((native_end - dst) <= orig_size) { uint8_t * native_next = z80_get_native_address(context, address + after-inst); if (native_next && ((native_next == orig_start + orig_size) || (orig_size - (native_end - dst)) > 5)) { + remove_deferred_until(&opts->deferred, orig_deferred); native_end = translate_z80inst(&instbuf, orig_start, context, address); if (native_next == orig_start + orig_size && (native_next-native_end) < 2) { while (native_end < orig_start + orig_size) {