diff options
author | Mike Pavone <pavone@retrodev.com> | 2014-02-24 00:50:15 -0800 |
---|---|---|
committer | Mike Pavone <pavone@retrodev.com> | 2014-02-24 00:50:15 -0800 |
commit | fcf5fcfccb16b87e69b3ce9dd8dc74dbbaf426db (patch) | |
tree | 01c95b47e2f9427f86b49379702c0bbb86e992a2 /backend.c | |
parent | 543c2656175b2832c1279452872962499d492c7a (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.c | 53 |
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; + } + } +} + |