about summary refs log tree commit diff stats
path: root/src/libtools/myalign32.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libtools/myalign32.c')
-rwxr-xr-xsrc/libtools/myalign32.c77
1 files changed, 77 insertions, 0 deletions
diff --git a/src/libtools/myalign32.c b/src/libtools/myalign32.c
index 0ce60bfc..c3228714 100755
--- a/src/libtools/myalign32.c
+++ b/src/libtools/myalign32.c
@@ -6,6 +6,7 @@
 #include <sys/epoll.h>
 #include <fts.h>
 #include <sys/socket.h>
+#include <obstack.h>
 
 #include "x64emu.h"
 #include "emu/x64emu_private.h"
@@ -1614,3 +1615,79 @@ void convert_regext_to_64(void* d, void* s)
     dst->re_nsub = from_ulong(src->re_nsub);
     dst->flags = src->flags;
 }
+
+void* inplace_obstack_chunk_shrink(void* a)
+{
+    if(a) {
+        struct my_obstack_chunk_32_t* dst = a;
+        struct _obstack_chunk* src = a;
+        dst->limit = to_ptrv(src->limit);
+        dst->prev = to_ptrv(src->prev);
+        memcpy(dst->contents, src->contents, sizeof(dst->contents));
+    }
+    return a;
+}
+void* inplace_obstack_chunk_enlarge(void* a)
+{
+    if(a) {
+        struct my_obstack_chunk_32_t* src = a;
+        struct _obstack_chunk* dst = a;
+        memcpy(dst->contents, src->contents, sizeof(dst->contents));
+        dst->prev = from_ptrv(src->prev);
+        dst->limit = from_ptrv(src->limit);
+    }
+    return a;
+}
+
+void convert_obstack_to_32(void* d, void* s)
+{
+    if(!d || !s) return;
+    struct my_obstack_32_t* dst = d;
+    struct obstack *src = s;
+    // chunks
+    struct _obstack_chunk* chunk = src->chunk;
+    while(chunk) {
+        struct _obstack_chunk* prev = chunk->prev;
+        inplace_obstack_chunk_shrink(chunk);
+        chunk = prev;
+    }
+    // struture
+    dst->chunk_size = to_long(src->chunk_size);
+    dst->chunk = to_ptrv(src->chunk);
+    dst->object_base = to_ptrv(src->object_base);
+    dst->next_free = to_ptrv(src->next_free);
+    dst->chunk_limit = to_ptrv(src->chunk_limit);
+    dst->temp.tempptr = to_ptrv(src->temp.tempptr);
+    dst->chunkfun = to_ptrv(src->chunkfun);
+    dst->freefun = to_ptrv(src->freefun);
+    dst->extra_arg = to_ptrv(src->extra_arg);
+    dst->use_extra_arg = src->use_extra_arg;
+    dst->maybe_empty_object = src->maybe_empty_object;
+    dst->alloc_failed = src->alloc_failed;
+}
+void convert_obstack_to_64(void* d, void* s)
+{
+    if(!d || !s) return;
+    struct my_obstack_32_t* src = s;
+    struct obstack *dst = d;
+    // struture
+    dst->alloc_failed = src->alloc_failed;
+    dst->maybe_empty_object = src->maybe_empty_object;
+    dst->use_extra_arg = src->use_extra_arg;
+    dst->extra_arg = from_ptrv(src->extra_arg);
+    dst->freefun = from_ptrv(src->freefun);
+    dst->chunkfun = from_ptrv(src->chunkfun);
+    dst->temp.tempptr = from_ptrv(src->temp.tempptr);
+    dst->chunk_limit = from_ptrv(src->chunk_limit);
+    dst->next_free = from_ptrv(src->next_free);
+    dst->object_base = from_ptrv(src->object_base);
+    dst->chunk = from_ptrv(src->chunk);
+    dst->chunk_size = from_long(src->chunk_size);
+    // chunks
+    struct _obstack_chunk* chunk = dst->chunk;
+    while(chunk) {
+        struct _obstack_chunk* prev = chunk->prev;
+        inplace_obstack_chunk_enlarge(chunk);
+        chunk = prev;
+    }
+}