changeset 282:7b8a49220e3b

Remove deferred address entries from abandoned translations inside z80_retrans_inst
author Mike Pavone <pavone@retrodev.com>
date Sat, 04 May 2013 14:36:50 -0700
parents 44f0bbf57b4f
children 61f5d88ea01a
files x86_backend.c x86_backend.h z80_to_x86.c
diffstat 3 files changed, 12 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- 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;
--- 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_
--- 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) {