diff options
Diffstat (limited to 'include')
-rw-r--r-- | include/ast.h | 3 | ||||
-rw-r--r-- | include/compiler.h | 1 | ||||
-rw-r--r-- | include/ssa/ssa.h | 56 | ||||
-rw-r--r-- | include/std/buffer.h | 2 | ||||
-rw-r--r-- | include/std/hash_map.h | 8 |
5 files changed, 65 insertions, 5 deletions
diff --git a/include/ast.h b/include/ast.h index 3eb7bb6..497488f 100644 --- a/include/ast.h +++ b/include/ast.h @@ -131,6 +131,9 @@ void binop_init(Binop *self); CHECK_RESULT int scope_init(Scope *self, ScopedAllocator *allocator); CHECK_RESULT int scope_add_child(Scope *self, Ast *child); +/* longjump to compiler env on failure */ void scope_resolve(Scope *self, AstCompilerContext *context); +/* longjump to compiler env on failure */ +void scope_generate_ssa(Scope *self, AstCompilerContext *context); #endif diff --git a/include/compiler.h b/include/compiler.h index d7314cc..4e24f11 100644 --- a/include/compiler.h +++ b/include/compiler.h @@ -22,6 +22,7 @@ struct amal_compiler { bool started; amal_mutex mutex; int resolve_ast_index; + int generate_ssa_index; }; CHECK_RESULT int amal_compiler_init(amal_compiler *self); diff --git a/include/ssa/ssa.h b/include/ssa/ssa.h new file mode 100644 index 0000000..e5bd86b --- /dev/null +++ b/include/ssa/ssa.h @@ -0,0 +1,56 @@ +#ifndef AMALGAM_SSA_H +#define AMALGAM_SSA_H + +#include "../std/buffer.h" +#include "../std/hash_map.h" +#include "../std/defs.h" + +typedef enum { + SSA_ASSIGN_INTER, + SSA_ASSIGN_REG, + SSA_ADD, + SSA_SUB, + SSA_MUL, + SSA_DIV, + SSA_FUNC_START, + SSA_FUNC_END, + SSA_PUSH, + SSA_CALL +} SsaInstructionType; + +typedef enum { + SSA_NUMBER_TYPE_INTEGER, + SSA_NUMBER_TYPE_FLOAT +} SsaNumberType; + +typedef struct { + i64 value; + SsaNumberType type; +} SsaNumber; + +typedef u16 SsaRegister; +typedef u16 SsaIntermediateIndex; +typedef u32 SsaFuncIndex; + +typedef struct { + Buffer/*instruction data*/ instructions; + HashMap/*<SsaNumberType, IntermediateIndex>*/ intermediates; + SsaIntermediateIndex intermediate_counter; + SsaRegister reg_counter; + SsaFuncIndex func_counter; +} Ssa; + +/* None of these functions are thread-safe */ +SsaNumber create_ssa_number(i64 value, SsaNumberType type); + +CHECK_RESULT int ssa_init(Ssa *self, ScopedAllocator *allocator); +CHECK_RESULT int ssa_get_unique_reg(Ssa *self, SsaRegister *result); +CHECK_RESULT int ssa_ins_assign_inter(Ssa *self, SsaRegister dest, SsaNumber number); +CHECK_RESULT int ssa_ins_assign_reg(Ssa *self, SsaRegister dest, SsaRegister src); +CHECK_RESULT int ssa_ins_binop(Ssa *self, SsaInstructionType binop_type, SsaRegister lhs, SsaRegister rhs, SsaRegister *result); +CHECK_RESULT int ssa_ins_func_start(Ssa *self, u8 num_args, SsaFuncIndex *result); +CHECK_RESULT int ssa_ins_func_end(Ssa *self); +CHECK_RESULT int ssa_ins_push(Ssa *self, SsaRegister reg); +CHECK_RESULT int ssa_ins_call(Ssa *self, SsaFuncIndex func, SsaRegister *result); + +#endif diff --git a/include/std/buffer.h b/include/std/buffer.h index 688f18a..c961b6e 100644 --- a/include/std/buffer.h +++ b/include/std/buffer.h @@ -3,6 +3,7 @@ #include "types.h" #include "misc.h" +#include "defs.h" #define BUFFER_OK 0 #define BUFFER_ALLOC_FAIL -1 @@ -13,7 +14,6 @@ typedef struct { usize capacity; } Buffer; -struct ScopedAllocator; CHECK_RESULT int buffer_init(Buffer *self, struct ScopedAllocator *allocator); /* @data can be NULL */ diff --git a/include/std/hash_map.h b/include/std/hash_map.h index c36ecc4..97b0745 100644 --- a/include/std/hash_map.h +++ b/include/std/hash_map.h @@ -15,21 +15,21 @@ typedef usize(*HashMapHash)(const u8 *data, usize size); struct HashMap { ScopedAllocator *allocator; /* borrowed */ Buffer/*HashMapBucket*/ buckets; - usize type_size; + usize value_type_size; usize num_elements; HashMapCompare compare_func; HashMapHash hash_func; }; -CHECK_RESULT int hash_map_init(HashMap *self, ScopedAllocator *allocator, usize type_size, HashMapCompare compare_func, HashMapHash hash_func); +CHECK_RESULT int hash_map_init(HashMap *self, ScopedAllocator *allocator, usize value_type_size, HashMapCompare compare_func, HashMapHash hash_func); /* Not thread-safe. -Expected @value size to be @self->type_size. +Expected @value size to be @self->value_type_size. */ CHECK_RESULT int hash_map_insert(HashMap *self, BufferView key, void *value); /* Thread-safe unless @hash_map_insert is used in another thread at the same time. -Expected @value size to be @self->type_size. +Expected @value size to be @self->value_type_size. */ CHECK_RESULT bool hash_map_get(HashMap *self, BufferView key, void *value); |