about summary refs log tree commit diff stats
path: root/src/libtools/myalign32.c
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-12-20 11:04:13 +0100
committerptitSeb <sebastien.chev@gmail.com>2024-12-20 11:04:28 +0100
commite2ce483e0de62484f762e4e85b194fc4f228de44 (patch)
tree67dcb0b27192a6fc0d403bd33ab5a3db06555658 /src/libtools/myalign32.c
parent41b31dc58d035e20b00fbc62977ec67277f2ef34 (diff)
downloadbox64-e2ce483e0de62484f762e4e85b194fc4f228de44.tar.gz
box64-e2ce483e0de62484f762e4e85b194fc4f228de44.zip
[BOX32][WRAPPER] Improved obstack handling
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;
+    }
+}