summaryrefslogtreecommitdiff
path: root/backend.c
diff options
context:
space:
mode:
authorMike Pavone <pavone@retrodev.com>2014-02-24 00:50:15 -0800
committerMike Pavone <pavone@retrodev.com>2014-02-24 00:50:15 -0800
commitfcf5fcfccb16b87e69b3ce9dd8dc74dbbaf426db (patch)
tree01c95b47e2f9427f86b49379702c0bbb86e992a2 /backend.c
parent543c2656175b2832c1279452872962499d492c7a (diff)
Rename x86_backend.h and x86_backend.c to backend.h and backend.c respectively
Diffstat (limited to 'backend.c')
-rw-r--r--backend.c53
1 files changed, 53 insertions, 0 deletions
diff --git a/backend.c b/backend.c
new file mode 100644
index 0000000..8062145
--- /dev/null
+++ b/backend.c
@@ -0,0 +1,53 @@
+/*
+ Copyright 2013 Michael Pavone
+ This file is part of BlastEm.
+ BlastEm is free software distributed under the terms of the GNU General Public License version 3 or greater. See COPYING for full license text.
+*/
+#include "backend.h"
+#include <stdlib.h>
+
+deferred_addr * defer_address(deferred_addr * old_head, uint32_t address, uint8_t *dest)
+{
+ deferred_addr * new_head = malloc(sizeof(deferred_addr));
+ new_head->next = old_head;
+ new_head->address = address & 0xFFFFFF;
+ new_head->dest = dest;
+ 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;
+ deferred_addr **last_next = head_ptr;
+ while(cur)
+ {
+ uint8_t * native = get_native(context, cur->address);//get_native_address(opts->native_code_map, cur->address);
+ if (native) {
+ int32_t disp = native - (cur->dest + 4);
+ uint8_t * out = cur->dest;
+ *(out++) = disp;
+ disp >>= 8;
+ *(out++) = disp;
+ disp >>= 8;
+ *(out++) = disp;
+ disp >>= 8;
+ *out = disp;
+ *last_next = cur->next;
+ free(cur);
+ cur = *last_next;
+ } else {
+ last_next = &(cur->next);
+ cur = cur->next;
+ }
+ }
+}
+