From f172adee24203c701cf5c08ad47bcb5169299c0a Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Thu, 11 Jun 2020 09:02:52 -0500 Subject: [PATCH] Lots of changes --- .gitignore | 2 + Makefile | 18 +-- include/bh.h | 362 ++++++++++++++------------------------------- include/onyxmsgs.h | 1 + include/onyxwasm.h | 220 +++++++++++++++++++++++++++ onyx | Bin 103344 -> 114752 bytes progs/minimal.onyx | 12 +- src/onyx.c | 20 +-- src/onyxmsgs.c | 1 + src/onyxparser.c | 24 +-- src/onyxwasm.c | 31 +++- 11 files changed, 394 insertions(+), 297 deletions(-) diff --git a/.gitignore b/.gitignore index cd217661..f9efa124 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ **/*.o *.o tags +test.c +test diff --git a/Makefile b/Makefile index c1561f1d..32e6043f 100644 --- a/Makefile +++ b/Makefile @@ -1,23 +1,23 @@ OBJ_FILES=\ - src/onyxlex.o \ - src/onyxparser.o \ - src/onyxmsgs.o \ - src/onyxutils.o \ - src/onyxwasm.o \ - src/onyx.o + build/onyxlex.o \ + build/onyxparser.o \ + build/onyxmsgs.o \ + build/onyxutils.o \ + build/onyxwasm.o \ + build/onyx.o CC=gcc INCLUDES=-I./include LIBS= FLAGS=-g -%.o: %.c include/bh.h +build/%.o: src/%.c include/bh.h $(CC) $(FLAGS) -c $< -o $@ $(INCLUDES) onyx: $(OBJ_FILES) - $(CC) $(FLAGS) $? -o $@ $(LIBS) + $(CC) $(FLAGS) $(OBJ_FILES) -o $@ $(LIBS) clean: rm $(OBJ_FILES) 2>&1 >/dev/null -all: onyx clean +all: onyx diff --git a/include/bh.h b/include/bh.h index 92461df0..dc8a93a3 100644 --- a/include/bh.h +++ b/include/bh.h @@ -9,22 +9,21 @@ #include #include #include // TODO: Replace with needed functions +#include #include //------------------------------------------------------------------------------------- // Better types //------------------------------------------------------------------------------------- -typedef unsigned char u8; -typedef unsigned short u16; -typedef unsigned int u32; -typedef unsigned long u64; -typedef unsigned long long u128; -typedef signed char i8; -typedef signed short i16; -typedef signed int i32; -typedef signed long i64; -typedef signed long long i128; -typedef unsigned long isize; +typedef uint8_t u8; +typedef uint16_t u16; +typedef uint32_t u32; +typedef uint64_t u64; +typedef int8_t i8; +typedef int16_t i16; +typedef int32_t i32; +typedef int64_t i64; +typedef int64_t isize; typedef i32 b32; typedef void* ptr; @@ -50,14 +49,40 @@ typedef void* ptr; //------------------------------------------------------------------------------------- // Better character functions //------------------------------------------------------------------------------------- -b32 char_is_alpha(const char a); -b32 char_is_num(const char a); -b32 char_is_alphanum(const char a); -b32 char_is_whitespace(const char a); -b32 char_in_range(const char lo, const char hi, const char a); -char charset_contains(const char* charset, char ch); -i64 chars_match(char* ptr1, char* ptr2); +inline b32 char_is_alpha(const char a) { + return ('a' <= a && a <= 'z') || ('A' <= a && a <= 'Z'); +} + +inline char charset_contains(const char* charset, char ch) { + while (*charset) { + if (*charset == ch) return ch; + charset++; + } + + return 0; +} + +inline b32 char_is_num(const char a) { + return ('0' <= a && a <= '9'); +} + +inline b32 char_is_alphanum(const char a) { + return char_is_alpha(a) || char_is_num(a); +} + +inline b32 char_is_whitespace(const char a) { + return charset_contains(" \t\r\n", a); +} +inline b32 char_in_range(const char lo, const char hi, const char a) { + return lo <= a <= hi; +} + +inline i64 chars_match(char* ptr1, char* ptr2) { + i64 len = 0; + while (*ptr2 != '\0' && *ptr1 == *ptr2) ptr1++, ptr2++, len++; + return *ptr2 == '\0' ? len : 0; +} @@ -87,7 +112,8 @@ i64 chars_match(char* ptr1, char* ptr2); #define BH_BIT(x) (1 << (x)) #define BH_MASK_SET(var, set, mask) ((set) ? (var) |= (mask) : (var) &= ~(mask)) - +#define fori(var, lo, hi) for (i64 var = (lo); var <= (hi); var++) +#define forll(T, var, start, step) for (T* var = (start); var != NULL; var = var->step) @@ -163,6 +189,9 @@ BH_ALLOCATOR_PROC(bh_arena_allocator_proc); + + + // SCRATCH ALLOCATOR typedef struct bh_scratch { bh_allocator backing; @@ -181,64 +210,6 @@ BH_ALLOCATOR_PROC(bh_scratch_allocator_proc); -//------------------------------------------------------------------------------------- -// Better strings -//------------------------------------------------------------------------------------- -#ifndef BH_NO_STRING - -typedef struct bh__string { - u64 length; - u64 capacity; -} bh__string; - -typedef char bh_string; - -#define bh__stringhead(x) (((bh__string *)(x)) - 1) - -#define bh_string_new(x) _Generic((x), \ - unsigned long: bh_string_new_cap, \ - unsigned int: bh_string_new_cap, \ - int: bh_string_new_cap, \ - long: bh_string_new_cap, \ - const char*: bh_string_new_str, \ - char*: bh_string_new_str)(x) - -#define bh_string_append(str1, str2) _Generic((str2), \ - bh_string*: bh_string_append_bh_string, \ - char*: bh_string_append_cstr, \ - const char*: bh_string_append_cstr)(str1, str2) - -#define bh_string_replace_at(dest, src, offset) _Generic((src), \ - bh_string*: bh_string_replace_at_bh_string, \ - char*: bh_string_replace_at_cstr, \ - const char*: bh_string_replace_at_cstr)(dest, src, offset) - -#define bh_string_insert_at(dest, src, offset) _Generic((src), \ - bh_string*: bh_string_insert_at_bh_string, \ - char*: bh_string_insert_at_cstr, \ - const char*: bh_string_insert_at_cstr)(dest, src, offset) - -bh_string bh_string_new_cap(unsigned long cap); -bh_string bh_string_new_str(const char* cstr); -b32 bh_string_delete(bh_string* str); -b32 bh_string_ensure_capacity(bh_string* str, u64 cap); -void bh_string_append_bh_string(bh_string* str1, bh_string* str2); -void bh_string_append_cstr(bh_string* str1, const char* str2); -void bh_string_replace_at_bh_string(bh_string* dest, bh_string* src, u64 offset); -void bh_string_replace_at_cstr(bh_string* dest, const char* src, u64 offset); -void bh_string_insert_at_bh_string(bh_string* dest, bh_string* src, u64 offset); -void bh_string_insert_at_cstr(bh_string* dest, const char* src, u64 offset); -void bh_string_trim_end(bh_string* str, const char* charset); -void bh_string_trim_begin(bh_string* str, const char* charset); -void bh_string_trim_end_space(bh_string* str); -// TEMP -void bh_string_print(bh_string* str); - -#endif - - - - @@ -359,6 +330,8 @@ isize bh_fprintf(bh_file* f, char const *fmt, ...); isize bh_fprintf_va(bh_file* f, char const *fmt, va_list va); char* bh_bprintf(char const *fmt, ...); char* bh_bprintf_va(char const *fmt, va_list va); +char* bh_aprintf(bh_allocator alloc, const char* fmt, ...); +char* bh_aprintf_va(bh_allocator alloc, const char* fmt, va_list va); isize bh_snprintf(char *str, isize n, char const *fmt, ...); isize bh_snprintf_va(char *str, isize n, char const *fmt, va_list va); @@ -483,6 +456,8 @@ typedef struct bh__arr { #define bh_arr_deleten(arr, i, n) (bh__arr_deleten((void **) &(arr), sizeof(*(arr)), i, n)) #define bh_arr_fastdelete(arr, i) (arr[i] = arr[--bh__arrhead(arr)->length]) +#define bh_arr_each(T, var, arr) for (T* var = (arr); !bh_arr_end((arr), var); var++) + b32 bh__arr_grow(bh_allocator alloc, void** arr, i32 elemsize, i32 cap); b32 bh__arr_shrink(void** arr, i32 elemsize, i32 cap); b32 bh__arr_free(void **arr); @@ -543,6 +518,7 @@ typedef struct bh__hash { #define bh_hash_has(T, tab, key) (assert(sizeof(T) == sizeof(*(tab))), (bh__hash_has((bh__hash *) tab, sizeof(T), key))) #define bh_hash_get(T, tab, key) (assert(sizeof(T) == sizeof(*(tab))), (*((T *) bh__hash_get((bh__hash *) tab, sizeof(T), key)))) #define bh_hash_delete(T, tab, key) (assert(sizeof(T) == sizeof(*(tab))), bh__hash_delete((bh__hash *) tab, sizeof(T), key)) + #define bh_hash_clear(tab) (bh__hash_clear((bh__hash *) tab)) #define bh_hash_iter_setup(T, tab) (assert(sizeof(T) == sizeof(*(tab))), bh__hash_iter_setup((bh__hash *) tab, sizeof(T))) #define bh_hash_iter_key(it) ((char *)(bh_pointer_add(it.entry, it.elemsize + sizeof(u16)))) @@ -554,34 +530,41 @@ typedef struct bh__hash { #define bh_hash_has(T, tab, key) (bh__hash_has((bh__hash *) tab, sizeof(T), key)) #define bh_hash_get(T, tab, key) (*((T *) bh__hash_get((bh__hash *) tab, sizeof(T), key))) #define bh_hash_delete(T, tab, key) (bh__hash_delete((bh__hash *) tab, sizeof(T), key)) + #define bh_hash_clear(tab) (bh__hash_clear((bh__hash *) tab)) #define bh_hash_iter_setup(T, tab) (bh__hash_iter_setup((bh__hash *) tab, sizeof(T))) #define bh_hash_iter_key(it) ((char *)(bh_pointer_add(it.entry, it.elemsize + sizeof(u16)))) #define bh_hash_iter_value(T, it) (*(T *)it.entry) #endif +#define bh_hash_each_start(T, table) { \ + bh_hash_iterator it = bh_hash_iter_setup(T, (table)); \ + while (bh_hash_iter_next(&it)) { \ + const char* key = bh_hash_iter_key(it); \ + T value = bh_hash_iter_value(T, it); +#define bh_hash_each_end } } + b32 bh__hash_init(bh_allocator allocator, bh__hash **table, i32 hash_size); b32 bh__hash_free(bh__hash **table); ptr bh__hash_put(bh__hash *table, i32 elemsize, char *key); b32 bh__hash_has(bh__hash *table, i32 elemsize, char *key); ptr bh__hash_get(bh__hash *table, i32 elemsize, char *key); void bh__hash_delete(bh__hash *table, i32 elemsize, char *key); +void bh__hash_clear(bh__hash *table); bh_hash_iterator bh__hash_iter_setup(bh__hash *table, i32 elemsize); b32 bh_hash_iter_next(bh_hash_iterator* it); #endif -#ifdef BH_DEFINE -#undef BH_DEFINE - - - - +//------------------------------------------------------------------------------- +// OTHER COMMON DATA STRUCTURES +//------------------------------------------------------------------------------- +#ifndef BH_NO_DATASTRUCTURES @@ -598,6 +581,7 @@ b32 bh_hash_iter_next(bh_hash_iterator* it); +#endif // BH_NO_DATASTRUCTURES @@ -613,6 +597,8 @@ b32 bh_hash_iter_next(bh_hash_iterator* it); +#ifdef BH_DEFINE +#undef BH_DEFINE //------------------------------------------------------------------------------------- // IMPLEMENTATIONS //------------------------------------------------------------------------------------- @@ -620,40 +606,15 @@ b32 bh_hash_iter_next(bh_hash_iterator* it); //------------------------------------------------------------------------------------- // CHAR FUNCTIONS //------------------------------------------------------------------------------------- -b32 char_is_alpha(const char a) { - return ('a' <= a && a <= 'z') || ('A' <= a && a <= 'Z'); -} - -b32 char_is_num(const char a) { - return ('0' <= a && a <= '9'); -} - -b32 char_is_alphanum(const char a) { - return char_is_alpha(a) || char_is_num(a); -} - -b32 char_is_whitespace(const char a) { - return charset_contains(" \t\r\n", a); -} - -b32 char_in_range(const char lo, const char hi, const char a) { - return lo <= a <= hi; -} - -char charset_contains(const char* charset, char ch) { - while (*charset) { - if (*charset == ch) return ch; - charset++; - } +extern inline b32 char_is_alpha(const char a); +extern inline b32 char_is_num(const char a); +extern inline b32 char_is_alphanum(const char a); +extern inline char charset_contains(const char* charset, char ch); +extern inline b32 char_is_whitespace(const char a); +extern inline b32 char_in_range(const char lo, const char hi, const char a); +extern inline i64 chars_match(char* ptr1, char* ptr2); - return 0; -} -i64 chars_match(char* ptr1, char* ptr2) { - i64 len = 0; - while (*ptr2 != '\0' && *ptr1 == *ptr2) ptr1++, ptr2++, len++; - return *ptr2 == '\0' ? len : 0; -} @@ -664,8 +625,6 @@ i64 chars_match(char* ptr1, char* ptr2) { //------------------------------------------------------------------------------------- // CUSTOM ALLOCATORS IMPLEMENTATION //------------------------------------------------------------------------------------- - - ptr bh_alloc(bh_allocator a, isize size) { return bh_alloc_aligned(a, size, 16); } @@ -689,7 +648,6 @@ void bh_free(bh_allocator a, ptr data) { // HEAP ALLOCATOR IMPLEMENTATION - bh_allocator bh_heap_allocator(void) { return (bh_allocator) { .proc = bh_heap_allocator_proc, @@ -866,140 +824,6 @@ BH_ALLOCATOR_PROC(bh_scratch_allocator_proc) { } -//------------------------------------------------------------------------------------- -// STRING IMPLEMENTATION (BROKEN) -//------------------------------------------------------------------------------------- -#ifndef BH_NO_STRING - -bh_string* bh_string_new_cap(unsigned long cap) { - bh__string* str; - str = (bh__string*) malloc(sizeof(*str) + sizeof(char) * cap + 1); - str[0] = 0; - return str + 1; -} - -bh_string* bh_string_new_str(const char* cstr) { - const i32 len = strlen(cstr); - bh__string* str; - i32 i; - - str = malloc(sizeof(*str) + sizeof(char) * len + 1); - char* data = (char*) (str + 1); - for (i = 0; i < len; i++) { - data[i] = cstr[i]; - } - - data[len] = 0; // Always null terminate the string - - str->length = len; - str->capacity = len; - return str + 1; -} - -b32 bh_string_delete(bh_string** str) { - bh__string* strptr = bh__stringhead(*str); - free(strptr); - str->length = 0; - str->capacity = 0; - return 1; -} - -b32 bh_string_grow(bh_string** str, u64 cap) { - bh__string* strptr = bh__stringhead(*str); - if (strptr->capacity >= cap) return 1; - - void* p; - p = realloc(strptr, sizeof(*strptr) + sizeof(char) * cap + 1); - - strptr->capacity = cap; - - return 1; -} - -void bh_string_append_bh_string(bh_string** str1, bh_string** str2) { - if (!bh_string_ensure_capacity(str1, str1->length + str2->length)) return; - - //TODO: Replace with custom memory management - memcpy(str1->data + str1->length, str2->data, str2->length); - str1->length += str2->length; -} - -void bh_string_append_cstr(bh_string* str1, const char* str2) { - const i32 str2len = strlen(str2); - if (!bh_string_ensure_capacity(str1, str1->length + str2len)) return; - - //TODO: Replace with custom memory management - memcpy(str1->data + str1->length, str2, str2len); - str1->length += str2len; -} - -void bh_string_replace_at_bh_string(bh_string* dest, bh_string* src, u64 offset) { - if (offset > dest->length) return; - if (!bh_string_ensure_capacity(dest, offset + src->length)) return; - - memcpy(dest->data + offset, src->data, src->length); - if (offset + src->length > dest->length) - dest->length = offset + src->length; -} - -void bh_string_replace_at_cstr(bh_string* dest, const char* src, u64 offset) { - if (offset > dest->length) return; - const i32 srclen = strlen(src); - if (!bh_string_ensure_capacity(dest, offset + srclen)) return; - - memcpy(dest->data + offset, src, srclen); - if (offset + srclen > dest->length) - dest->length = offset + srclen; -} - -void bh_string_insert_at_bh_string(bh_string* dest, bh_string* src, u64 offset) { - if (!bh_string_ensure_capacity(dest, dest->length + src->length)) return; - - memmove(dest->data + offset + src->length, dest->data + offset, dest->length + src->length - offset); - memcpy(dest->data + offset, src->data, src->length); - dest->length += src->length; -} - -void bh_string_insert_at_cstr(bh_string* dest, const char* src, u64 offset) { - const i32 srclen = strlen(src); - if (!bh_string_ensure_capacity(dest, dest->length + srclen)) return; - - // TODO: Use something better. This copies to a seperate buffer first - memmove(dest->data + offset + srclen, dest->data + offset, dest->length + srclen - offset); - memcpy(dest->data + offset, src, srclen); - dest->length += srclen; -} - - -void bh_string_trim_end(bh_string* str, const char* charset) { - while (charset_contains(charset, str->data[str->length - 1])) - str->length--; -} - -void bh_string_trim_begin(bh_string* str, const char* charset) { - u32 off = 0, i; - while (charset_contains(charset, str->data[off])) off++; - - if (off == 0) return; - - for (i = 0; i < str->length - off; i++) { - str->data[i] = str->data[i + off]; - } - - str->length -= off; -} - -void bh_string_trim_end_space(bh_string* str) { - bh_string_trim_end(str, " \t\n\r"); -} - -// TEMP -void bh_string_print(bh_string* str) { - write(STDOUT_FILENO, str->data, str->length); -} - -#endif // ifndef BH_NO_STRING - @@ -1258,9 +1082,9 @@ isize bh_fprintf(bh_file* f, char const *fmt, ...) { } isize bh_fprintf_va(bh_file* f, char const *fmt, va_list va) { - static char buf[4096]; - isize len = bh_snprintf_va(buf, sizeof(buf), fmt, va); - bh_file_write(f, buf, len - 1); + static char buffer[4096]; + isize len = bh_snprintf_va(buffer, sizeof(buffer), fmt, va); + bh_file_write(f, buffer, len - 1); return len; } @@ -1279,6 +1103,24 @@ char* bh_bprintf_va(char const *fmt, va_list va) { return buffer; } +char* bh_aprintf(bh_allocator alloc, const char* fmt, ...) { + char* res; + va_list va; + va_start(va, fmt); + res = bh_aprintf_va(alloc, fmt, va); + va_end(va); + return res; +} + +char* bh_aprintf_va(bh_allocator alloc, const char* fmt, va_list va) { + static char buffer[4096]; + isize len = bh_snprintf_va(buffer, sizeof(buffer), fmt, va); + char* res = bh_alloc(alloc, len); + memcpy(res, buffer, len); + res[len - 1] = 0; + return res; +} + isize bh_snprintf(char *str, isize n, char const *fmt, ...) { isize res; va_list va; @@ -1751,6 +1593,16 @@ found_matching: (*(u64 *) arrptr)--; } +void bh__hash_clear(bh__hash *table) { + for (i32 i = 0; i < table->hash_size; i++) { + if (table->arrs[i] != NULL) { + // NOTE: Set length property to 0 + *((u64 *) table->arrs[i]) = 0; + bh_arr_set_length(table->arrs[i], 0); + } + } +} + bh_hash_iterator bh__hash_iter_setup(bh__hash *table, i32 elemsize) { elemsize += (elemsize & 1); diff --git a/include/onyxmsgs.h b/include/onyxmsgs.h index 6c6a19e8..b1d0f50d 100644 --- a/include/onyxmsgs.h +++ b/include/onyxmsgs.h @@ -18,6 +18,7 @@ typedef enum OnyxMessageType { ONYX_MESSAGE_TYPE_FUNCTION_REDEFINITION, ONYX_MESSAGE_TYPE_BINOP_MISMATCH_TYPE, ONYX_MESSAGE_TYPE_ASSIGNMENT_TYPE_MISMATCH, + ONYX_MESSAGE_TYPE_EXPECTED_EXPRESSION, ONYX_MESSAGE_TYPE_COUNT, } OnyxMessageType; diff --git a/include/onyxwasm.h b/include/onyxwasm.h index feebeddd..7c0d6d90 100644 --- a/include/onyxwasm.h +++ b/include/onyxwasm.h @@ -22,8 +22,225 @@ typedef struct WasmFuncType { } WasmFuncType; +typedef enum WasmInstructionType { + WI_UNREACHABLE = 0x00, + WI_NOP = 0x01, + + // NOTE: Control flow + WI_BLOCK_START = 0x02, + WI_BLOCK_END = 0x0B, // NOTE: These ends are not unique + WI_LOOP_START = 0x03, + WI_LOOP_END = 0x0B, + WI_IF_START = 0x04, + WI_ELSE = 0x05, + WI_IF_END = 0x0B, + WI_JUMP = 0x0C, + WI_COND_JUMP = 0x0D, + WI_JUMP_TABLE = 0x0E, + WI_RETURN = 0x0F, + WI_CALL = 0x10, + WI_CALL_INDIRECT = 0x11, + + // NOTE: Parametric instructions + WI_DROP = 0x1A, + WI_SELECT = 0x1B, + + // NOTE: Variable instructions + WI_LOCAL_GET = 0x20, + WI_LOCAL_SET = 0x21, + WI_LOCAL_TEE = 0x22, + WI_GLOBAL_GET = 0x23, + WI_GLOBAL_SET = 0x24, + + // NOTE: Memory instructions + WI_I32_LOAD = 0x28, + WI_I64_LOAD = 0x29, + WI_F32_LOAD = 0x2A, + WI_F64_LOAD = 0x2B, + WI_I32_LOAD_8_S = 0x2C, + WI_I32_LOAD_8_U = 0x2D, + WI_I32_LOAD_16_S = 0x2E, + WI_I32_LOAD_16_U = 0x2F, + WI_I64_LOAD_8_S = 0x30, + WI_I64_LOAD_8_U = 0x31, + WI_I64_LOAD_16_S = 0x32, + WI_I64_LOAD_16_U = 0x33, + WI_I64_LOAD_32_S = 0x34, + WI_I64_LOAD_32_U = 0x35, + WI_I32_STORE = 0x36, + WI_I64_STORE = 0x37, + WI_F32_STORE = 0x38, + WI_F64_STORE = 0x39, + WI_I32_STORE_8 = 0x3A, + WI_I32_STORE_16 = 0x3B, + WI_I64_STORE_8 = 0x3C, + WI_I64_STORE_16 = 0x3D, + WI_I64_STORE_32 = 0x3E, + WI_MEMORY_SIZE = 0x3F, + WI_MEMORY_GROW = 0x40, + + // NOTE: Numeric Instructions + WI_I32_CONST = 0x41, + WI_I64_CONST = 0x42, + WI_F32_CONST = 0x43, + WI_F64_CONST = 0x44, + + WI_I32_EQZ = 0x45, // NOTE: Autoincremented from here + WI_I32_EQ, + WI_I32_NE, + WI_I32_LT_S, + WI_I32_LT_U, + WI_I32_GT_S, + WI_I32_GT_U, + WI_I32_LE_S, + WI_I32_LE_U, + WI_I32_GE_S, + WI_I32_GE_U, + + WI_I64_EQZ, + WI_I64_EQ, + WI_I64_NE, + WI_I64_LT_S, + WI_I64_LT_U, + WI_I64_GT_S, + WI_I64_GT_U, + WI_I64_LE_S, + WI_I64_LE_U, + WI_I64_GE_S, + WI_I64_GE_U, + + WI_F32_EQ, + WI_F32_NE, + WI_F32_LT, + WI_F32_GT, + WI_F32_LE, + WI_F32_GE, + + WI_F64_EQ, + WI_F64_NE, + WI_F64_LT, + WI_F64_GT, + WI_F64_LE, + WI_F64_GE, + + WI_I32_CLZ, + WI_I32_CTZ, + WI_I32_POPCNT, + WI_I32_ADD, + WI_I32_SUB, + WI_I32_MUL, + WI_I32_DIV_S, + WI_I32_DIV_U, + WI_I32_REM_S, + WI_I32_REM_U, + WI_I32_AND, + WI_I32_OR, + WI_I32_XOR, + WI_I32_SHL, + WI_I32_SHR_S, + WI_I32_SHR_U, + WI_I32_ROTL, + WI_I32_ROTR, + + WI_I64_CLZ, + WI_I64_CTZ, + WI_I64_POPCNT, + WI_I64_ADD, + WI_I64_SUB, + WI_I64_MUL, + WI_I64_DIV_S, + WI_I64_DIV_U, + WI_I64_REM_S, + WI_I64_REM_U, + WI_I64_AND, + WI_I64_OR, + WI_I64_XOR, + WI_I64_SHL, + WI_I64_SHR_S, + WI_I64_SHR_U, + WI_I64_ROTL, + WI_I64_ROTR, + + WI_F32_ABS, + WI_F32_NEG, + WI_F32_CEIL, + WI_F32_FLOOR, + WI_F32_TRUNC, + WI_F32_NEAREST, + WI_F32_SQRT, + WI_F32_ADD, + WI_F32_SUB, + WI_F32_MUL, + WI_F32_DIV, + WI_F32_MIN, + WI_F32_MAX, + WI_F32_COPYSIGN, + + WI_F64_ABS, + WI_F64_NEG, + WI_F64_CEIL, + WI_F64_FLOOR, + WI_F64_TRUNC, + WI_F64_NEAREST, + WI_F64_SQRT, + WI_F64_ADD, + WI_F64_SUB, + WI_F64_MUL, + WI_F64_DIV, + WI_F64_MIN, + WI_F64_MAX, + WI_F64_COPYSIGN, + + WI_I32_FROM_I64 = 0xA7, + WI_I32_FROM_F32_S = 0xA8, + WI_I32_FROM_F32_U = 0xA9, + WI_I32_FROM_F64_S = 0xAA, + WI_I32_FROM_F64_U = 0xAB, + + WI_I64_FROM_I32_S = 0xAC, + WI_I64_FROM_I32_U = 0xAD, + WI_I64_FROM_F32_S = 0xAE, + WI_I64_FROM_F32_U = 0xAF, + WI_I64_FROM_F64_S = 0xB0, + WI_I64_FROM_F64_U = 0xB1, + + WI_F32_FROM_I32_S = 0xB2, + WI_F32_FROM_I32_U = 0xB3, + WI_F32_FROM_I64_S = 0xB4, + WI_F32_FROM_I64_U = 0xB5, + WI_F32_FROM_F64 = 0xB6, + + WI_F64_FROM_I32_S = 0xB7, + WI_F64_FROM_I32_U = 0xB8, + WI_F64_FROM_I64_S = 0xB9, + WI_F64_FROM_I64_U = 0xBA, + WI_F64_FROM_F32 = 0xBB, + + WI_I32_REINTERPRET_F32 = 0xBC, + WI_I64_REINTERPRET_F64 = 0xBD, + WI_F32_REINTERPRET_I32 = 0xBE, + WI_F64_REINTERPRET_I64 = 0xBF, +} WasmInstructionType; + +typedef union { + struct { + u32 i1, i2; + }; + i64 l; + float f; + double d; + ptr p; +} WasmInstructionData; + +typedef struct WasmInstruction { + WasmInstructionType type; + WasmInstructionData data; +} WasmInstruction; + + typedef struct WasmFunc { i32 type_idx; + bh_arr(WasmInstruction) code; } WasmFunc; typedef enum WasmExportKind { @@ -41,6 +258,9 @@ typedef struct WasmExport { typedef struct OnyxWasmModule { bh_allocator allocator; + // NOTE: Mapping to local indicies currently in scope. + bh_hash(i32) local_map; + // NOTE: Used internally as a map from strings that represent function types, // 0x7f 0x7f : 0x7f ( (i32, i32) -> i32 ) // to the function type index if it has been created. diff --git a/onyx b/onyx index 06d26eb9bcc8f97ada3f63de7a387f4880be23ff..6effde6758ecb7c3e7c9778864efb32b9e3bbddb 100755 GIT binary patch literal 114752 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 literal 103344 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 SpKSU6)4K)phERr3()#avNsoj8 diff --git a/progs/minimal.onyx b/progs/minimal.onyx index 3b3499fe..b03f1a58 100644 --- a/progs/minimal.onyx +++ b/progs/minimal.onyx @@ -3,20 +3,14 @@ export add :: proc (a i32, b i32) -> i32 { return a + b; } -export foo :: proc () -> i32 { +export foo :: proc (foo i32, bar i32) -> i32 { return 10 as i32; } export mul :: proc (a i32, b i32) -> i64 { // Typechecked - c: const = a - b; - - // Don't love this syntax, but it's easy to parse so whatever - // Inferred type, but constant - // a and b are both i32, so i32 + i32 is i32 so d is i32 - d: const = a + b; - - e: i32 = 10 as i32; + c :: a - b; + d :: a + b; return (c * d) as i64; } diff --git a/src/onyx.c b/src/onyx.c index 731688bb..f986faca 100644 --- a/src/onyx.c +++ b/src/onyx.c @@ -29,7 +29,7 @@ int main(int argc, char *argv[]) { #if 0 bh_printf("There are %d tokens (Allocated space for %d tokens)\n", bh_arr_length(token_arr), bh_arr_capacity(token_arr)); - for (OnyxToken* it = token_arr; !bh_arr_end(token_arr, it); it++) { + bh_arr_each(OnyxToken, it, token_arr) { onyx_token_null_toggle(*it); bh_printf("%s (%s:%l:%l)\n", onyx_get_token_type_name(it->type), it->pos.filename, it->pos.line, it->pos.column); onyx_token_null_toggle(*it); @@ -66,13 +66,9 @@ int main(int argc, char *argv[]) { // NOTE: Ensure type table made correctly bh_printf("Type map:\n"); - bh_hash_iterator type_map_it = bh_hash_iter_setup(i32, wasm_mod.type_map); - while (bh_hash_iter_next(&type_map_it)) { - const char* key = bh_hash_iter_key(type_map_it); - i32 value = bh_hash_iter_value(i32, type_map_it); - + bh_hash_each_start(i32, wasm_mod.type_map); bh_printf("%s -> %d\n", key, value); - } + bh_hash_each_end; bh_printf("Type list:\n"); WasmFuncType** func_type = wasm_mod.functypes; @@ -91,18 +87,14 @@ int main(int argc, char *argv[]) { // NOTE: Ensure the export table was built correctly bh_printf("Function types:\n"); - for (WasmFunc* func_it = wasm_mod.funcs; !bh_arr_end(wasm_mod.funcs, func_it); func_it++) { + bh_arr_each(WasmFunc, func_it, wasm_mod.funcs) { bh_printf("%d\n", func_it->type_idx); } bh_printf("Exports:\n"); - bh_hash_iterator export_it = bh_hash_iter_setup(WasmExport, wasm_mod.exports); - while (bh_hash_iter_next(&export_it)) { - const char* key = bh_hash_iter_key(export_it); - WasmExport value = bh_hash_iter_value(WasmExport, export_it); - + bh_hash_each_start(WasmExport, wasm_mod.exports); bh_printf("%s: %d %d\n", key, value.kind, value.idx); - } + bh_hash_each_end; #endif diff --git a/src/onyxmsgs.c b/src/onyxmsgs.c index a2e55512..a5f0c7d8 100644 --- a/src/onyxmsgs.c +++ b/src/onyxmsgs.c @@ -11,6 +11,7 @@ static const char* msg_formats[] = { "redefinition of function '%s'", "mismatched types for binary operator, '%s', '%s'", "mismatched types on assignment, '%s', '%s'", + "expected expression, got '%s'", }; void onyx_message_add(OnyxMessages* msgs, OnyxMessageType type, OnyxFilePos pos, ...) { diff --git a/src/onyxparser.c b/src/onyxparser.c index 0fbfc267..02454cef 100644 --- a/src/onyxparser.c +++ b/src/onyxparser.c @@ -324,13 +324,6 @@ static b32 parse_symbol_statement(OnyxParser* parser, OnyxAstNode** ret) { { parser_next_token(parser); OnyxTypeInfo* type = &builtin_types[ONYX_TYPE_INFO_KIND_UNKNOWN]; - u32 flags = ONYX_AST_FLAG_LVAL; - - // NOTE: var: const ... - if (parser->curr_token->type == TOKEN_TYPE_KEYWORD_CONST) { - parser_next_token(parser); - flags |= ONYX_AST_FLAG_CONST; - } // NOTE: var: type if (parser->curr_token->type == TOKEN_TYPE_SYMBOL) { @@ -340,16 +333,29 @@ static b32 parse_symbol_statement(OnyxParser* parser, OnyxAstNode** ret) { OnyxAstNodeLocal* local = (OnyxAstNodeLocal*) onyx_ast_node_new(parser->allocator, ONYX_AST_NODE_KIND_LOCAL); local->token = symbol; local->type = type; - local->flags |= flags; + local->flags |= ONYX_AST_FLAG_LVAL; insert_identifier(parser, (OnyxAstNode *) local, 1); - if (parser->curr_token->type == TOKEN_TYPE_SYM_EQUALS) { + if (parser->curr_token->type == TOKEN_TYPE_SYM_EQUALS || parser->curr_token->type == TOKEN_TYPE_SYM_COLON) { + if (parser->curr_token->type == TOKEN_TYPE_SYM_COLON) { + local->flags |= ONYX_AST_FLAG_CONST; + } + OnyxAstNode* assignment = onyx_ast_node_new(parser->allocator, ONYX_AST_NODE_KIND_ASSIGNMENT); assignment->token = parser->curr_token; parser_next_token(parser); OnyxAstNode* expr = parse_expression(parser); + if (expr == NULL) { + onyx_token_null_toggle(*parser->curr_token); + onyx_message_add(parser->msgs, + ONYX_MESSAGE_TYPE_EXPECTED_EXPRESSION, + assignment->token->pos, + parser->curr_token->token); + onyx_token_null_toggle(*parser->curr_token); + return 1; + } assignment->right = expr; assignment->left = (OnyxAstNode*) local; diff --git a/src/onyxwasm.c b/src/onyxwasm.c index 11226d43..0fcfa6a0 100644 --- a/src/onyxwasm.c +++ b/src/onyxwasm.c @@ -69,7 +69,8 @@ static void process_function_definition(OnyxWasmModule* mod, OnyxAstNodeFuncDef* } WasmFunc wasm_func = { - .type_idx = type_idx + .type_idx = type_idx, + .code = NULL, }; bh_arr_push(mod->funcs, wasm_func); i32 func_idx = mod->next_func_idx++; @@ -85,6 +86,33 @@ static void process_function_definition(OnyxWasmModule* mod, OnyxAstNodeFuncDef* onyx_token_null_toggle(*fd->token); } + + // If there is no body then don't process the code + if (fd->body == NULL) return; + + // NOTE: Generate the local map + i32 localidx = 0; + forll (OnyxAstNodeParam, param, fd->params, next) { + onyx_token_null_toggle(*param->token); + bh_hash_put(i32, mod->local_map, param->token->token, localidx++); + onyx_token_null_toggle(*param->token); + } + + forll (OnyxAstNodeLocal, local, fd->body->scope->last_local, prev_local) { + onyx_token_null_toggle(*local->token); + bh_hash_put(i32, mod->local_map, local->token->token, localidx++); + onyx_token_null_toggle(*local->token); + } + + bh_printf("\nLocals for function: %b\n", fd->token->token, fd->token->length); + bh_hash_each_start(i32, mod->local_map); + bh_printf("\t%s -> %d\n", key, value); + bh_hash_each_end; + + // Generate code + + // NOTE: Clear the local map on exit of generating this function + bh_hash_clear(mod->local_map); } OnyxWasmModule onyx_wasm_generate_module(bh_allocator alloc, OnyxAstNode* program) { @@ -104,6 +132,7 @@ OnyxWasmModule onyx_wasm_generate_module(bh_allocator alloc, OnyxAstNode* progra bh_arr_new(alloc, module.functypes, 4); bh_arr_new(alloc, module.funcs, 4); + bh_hash_init(bh_heap_allocator(), module.local_map, 61); bh_hash_init(bh_heap_allocator(), module.type_map, 61); bh_hash_init(bh_heap_allocator(), module.exports, 61); -- 2.25.1