diff options
Diffstat (limited to 'tools/wasm_compile.c')
-rw-r--r-- | tools/wasm_compile.c | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/tools/wasm_compile.c b/tools/wasm_compile.c new file mode 100644 index 0000000..64988c8 --- /dev/null +++ b/tools/wasm_compile.c @@ -0,0 +1,72 @@ +#include "wasm_compile.h" + +void print_instructions(uint32_t count, uint16_t instructions[count]) +{ + uint32_t i; + char binary[17]; + uint16_t instruction; + int j; + + binary[16] = '\0'; + + for (i = 0; i < count; i++) { + instruction = instructions[i]; + j = 16; + + while (j--) { + binary[j] = (instruction & 1) ? '1' : '0'; + instruction >>= 1; + } + + puts(binary); + } +} + +int main(int argc, char **argv) +{ + FILE *handle = NULL; + struct module *module = NULL; + uint16_t *translated_instructions = NULL; + char retval = -1; + + if (argc < 2) { + PRERR("Please provide name of the file to parse on the command line\n"); + goto fail; + } + + handle = fopen(argv[1], "r"); + + if (!handle) { + PRERR("Couldn't open '%s'\n", argv[1]); + goto fail; + } + + module = parse_module(handle); + + if (!module) + goto fail; + + translated_instructions = calloc(1, CODE_TOP_ADDR); + + if (!translated_instructions) { + PRERR(MSG_ALLOC_FAIL(CODE_TOP_ADDR)); + goto fail; + } + + if (assemble(CODE_TOP_ADDR / 2, translated_instructions, module)) + goto fail; + + print_instructions(CODE_TOP_ADDR / 2, translated_instructions); + + retval = 0; + +fail: + if (handle) + fclose(handle); + + free_module(module); + + free(translated_instructions); + + return retval; +} |