From 277a7ae7cb9fcdbd0583cc0a3742028a8a047ba1 Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Sat, 13 Jun 2020 20:16:18 -0500 Subject: [PATCH] Starting to output a binary for real. Added LEB128 encodings --- .gitignore | 1 + include/bh.h | 72 ++++++++++++++++++++++++++++++++++++++++++--- include/onyxwasm.h | 1 + onyx | Bin 127192 -> 128608 bytes src/onyx.c | 4 +++ src/onyxwasm.c | 18 ++++++++++++ 6 files changed, 92 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index f9efa124..8ca5336c 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ tags test.c test +*.wasm diff --git a/include/bh.h b/include/bh.h index 9424690c..a0a33c90 100644 --- a/include/bh.h +++ b/include/bh.h @@ -101,6 +101,20 @@ inline i64 chars_match(char* ptr1, char* ptr2) { + + +//------------------------------------------------------------------------------------- +// Conversion functions +//------------------------------------------------------------------------------------- + +// Converts an unsigned integer to the unsigned LEB128 format +u8* uint_to_uleb128(u64 n, i32* output_length); +u8* int_to_leb128(i64 n, i32* output_length); + + + + + //------------------------------------------------------------------------------------- // Helpful macros //------------------------------------------------------------------------------------- @@ -414,7 +428,7 @@ void* bh__debug_realloc(void* ptr, size_t size, const char* file, u64 line) { typedef struct bh_buffer { bh_allocator allocator; i32 length, capacity; - ptr data; + u8* data; } bh_buffer; #ifndef BH_BUFFER_GROW_FORMULA @@ -423,8 +437,9 @@ typedef struct bh_buffer { void bh_buffer_init(bh_buffer* buffer, bh_allocator alloc, i32 length); void bh_buffer_grow(bh_buffer* buffer, i32 length); -void bh_buffer_append(bh_buffer* buffer, ptr data, i32 length); +void bh_buffer_append(bh_buffer* buffer, const void * data, i32 length); void bh_buffer_concat(bh_buffer* buffer, bh_buffer other); +void bh_buffer_write_byte(bh_buffer* buffer, u8 byte); @@ -863,6 +878,51 @@ BH_ALLOCATOR_PROC(bh_scratch_allocator_proc) { +//------------------------------------------------------------------------------------- +// CONVERSION FUNCTIONS IMPLEMENTATION +//------------------------------------------------------------------------------------- +u8* uint_to_uleb128(u64 n, i32* output_length) { + static u8 buffer[16]; + + *output_length = 0; + u8* output = buffer; + u8 byte; + do { + byte = n & 0x7f; + n >>= 7; + if (n != 0) byte |= (1 << 7); + *output++ = byte; + (*output_length)++; + } while (n != 0); + + return buffer; +} + + +// Converts a signed integer to the signed LEB128 format +u8* int_to_leb128(i64 n, i32* output_length) { + static u8 buffer[16]; + + *output_length = 0; + u8* output = buffer; + b32 more = 1; + + i32 size = 64; + + u8 byte; + do { + byte = n & 0x7f; + n >>= 7; + + more = !(((n == 0) && (byte & 0x40) == 0) || ((n == -1) && (byte & 0x40) != 0)); + if (more) + byte |= 0x80; + *output++ = byte; + (*output_length)++; + } while (more); + + return buffer; +} @@ -1353,14 +1413,14 @@ void bh_buffer_grow(bh_buffer* buffer, i32 length) { buffer->data = new_data; } -void bh_buffer_append(bh_buffer* buffer, ptr data, i32 length) { +void bh_buffer_append(bh_buffer* buffer, const void * data, i32 length) { if (buffer == NULL) return; if (buffer->length + length > buffer->capacity) { bh_buffer_grow(buffer, buffer->length + length); } - memcpy(bh_pointer_add(buffer->data, buffer->length), data, length); + memcpy(buffer->data + buffer->length, data, length); buffer->length += length; } @@ -1368,6 +1428,10 @@ void bh_buffer_concat(bh_buffer* buffer, bh_buffer other) { bh_buffer_append(buffer, other.data, other.length); } +void bh_buffer_write_byte(bh_buffer* buffer, u8 byte) { + bh_buffer_grow(buffer, buffer->length + 1); + buffer->data[buffer->length++] = byte; +} diff --git a/include/onyxwasm.h b/include/onyxwasm.h index 7c0d6d90..17f35599 100644 --- a/include/onyxwasm.h +++ b/include/onyxwasm.h @@ -277,5 +277,6 @@ typedef struct OnyxWasmModule { OnyxWasmModule onyx_wasm_generate_module(bh_allocator alloc, OnyxAstNode* program); void onyx_wasm_module_free(OnyxWasmModule* module); +void onyx_wasm_module_write_to_file(OnyxWasmModule* module, bh_file file); #endif diff --git a/onyx b/onyx index 552631e52fb05489e67e55946bd09f677b6a05eb..ad0674531f06f9a329c80daa897e65112079d6a3 100755 GIT binary patch delta 30476 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 delta 27565 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 diff --git a/src/onyx.c b/src/onyx.c index 73eef378..5e4ec5b7 100644 --- a/src/onyx.c +++ b/src/onyx.c @@ -97,6 +97,10 @@ int main(int argc, char *argv[]) { bh_hash_each_end; #endif + bh_file out_file; + bh_file_create(&out_file, "out.wasm"); + onyx_wasm_module_write_to_file(&wasm_mod, out_file); + bh_file_close(&out_file); onyx_wasm_module_free(&wasm_mod); main_exit: // NOTE: Cleanup, since C doesn't have defer diff --git a/src/onyxwasm.c b/src/onyxwasm.c index a410d635..ccf87dff 100644 --- a/src/onyxwasm.c +++ b/src/onyxwasm.c @@ -544,3 +544,21 @@ void onyx_wasm_module_free(OnyxWasmModule* module) { bh_hash_free(module->type_map); bh_hash_free(module->exports); } + +static const u8 WASM_MAGIC_STRING[] = { 0x00, 0x61, 0x73, 0x6D }; +static const u8 WASM_VERSION[] = { 0x01, 0x00, 0x00, 0x00 }; + +void onyx_wasm_module_write_to_file(OnyxWasmModule* module, bh_file file) { + bh_buffer master_buffer; + bh_buffer_init(&master_buffer, bh_heap_allocator(), 128); + bh_buffer_append(&master_buffer, WASM_MAGIC_STRING, 4); + bh_buffer_append(&master_buffer, WASM_VERSION, 4); + + + + + + + + bh_file_write(&file, master_buffer.data, master_buffer.length); +} -- 2.25.1