diff options
Diffstat (limited to 'include')
-rw-r--r-- | include/asm/x86_64.h | 136 | ||||
-rw-r--r-- | include/ast.h | 24 | ||||
-rw-r--r-- | include/compiler.h | 2 | ||||
-rw-r--r-- | include/nullable.h | 2 | ||||
-rw-r--r-- | include/program.h | 2 | ||||
-rw-r--r-- | include/ssa/ssa.h | 4 | ||||
-rw-r--r-- | include/std/hash_map.h | 2 |
7 files changed, 25 insertions, 147 deletions
diff --git a/include/asm/x86_64.h b/include/asm/x86_64.h deleted file mode 100644 index 92de96b..0000000 --- a/include/asm/x86_64.h +++ /dev/null @@ -1,136 +0,0 @@ -#ifndef AMAL_ASM_X86_64_H -#define AMAL_ASM_X86_64_H - -#include "../std/misc.h" -#include "../std/types.h" - -typedef struct { - void *code; - u8 *code_it; - usize size; -} Asm; - -typedef enum { - EAX, - ECX, - EDX, - EBX, - ESP, - EBP, - ESI, - EDI -} Reg32; - -typedef enum { - RAX, - RCX, - RDX, - RBX, - RSP, - RBP, - RSI, - RDI -} Reg64; - -typedef struct { - Reg64 base; - Reg64 index; - i32 disp; - u8 scale; -} AsmPtr; - -void asm_ptr_init(AsmPtr *self, Reg64 base); -void asm_ptr_init_index(AsmPtr *self, Reg64 base, Reg64 index); -void asm_ptr_init_disp(AsmPtr *self, Reg64 base, i32 disp); -void asm_ptr_init_index_disp(AsmPtr *self, Reg64 base, Reg64 index, i32 disp); - -CHECK_RESULT int asm_init(Asm *self); -void asm_deinit(Asm *self); - -CHECK_RESULT int asm_execute(Asm *self); - -CHECK_RESULT int asm_nop(Asm *self); - - - - - - - - - -CHECK_RESULT int asm_mov_mi(Asm *self, AsmPtr *dst, i32 immediate); -CHECK_RESULT int asm_mov_mr(Asm *self, AsmPtr *dst, Reg64 src); -CHECK_RESULT int asm_mov_rm(Asm *self, Reg64 dst, AsmPtr *src); -CHECK_RESULT int asm_mov_ri(Asm *self, Reg64 dst, i64 immediate); -CHECK_RESULT int asm_mov_rr(Asm *self, Reg64 dst, Reg64 src); - -CHECK_RESULT int asm_add_rr(Asm *self, Reg64 dst, Reg64 src); -CHECK_RESULT int asm_sub_rr(Asm *self, Reg64 dst, Reg64 src); -CHECK_RESULT int asm_imul_rr(Asm *self, Reg64 dst, Reg64 src); - -CHECK_RESULT int asm_pushr(Asm *self, Reg64 reg); -CHECK_RESULT int asm_popr(Asm *self, Reg64 reg); - - - - - - - - - - - - - - -CHECK_RESULT int asm_mov_rm32(Asm *self, Reg32 dst, Reg32 src); -CHECK_RESULT int asm_add_rm32(Asm *self, Reg32 dst, Reg32 src); -CHECK_RESULT int asm_sub_rm32(Asm *self, Reg32 dst, Reg32 src); -CHECK_RESULT int asm_and_rm32(Asm *self, Reg32 dst, Reg32 src); -CHECK_RESULT int asm_or_rm32(Asm *self, Reg32 dst, Reg32 src); -CHECK_RESULT int asm_xor_rm32(Asm *self, Reg32 dst, Reg32 src); -CHECK_RESULT int asm_cmp_rm32(Asm *self, Reg32 dst, Reg32 src); -CHECK_RESULT int asm_add_rm32_imm(Asm *self, Reg32 reg, i32 immediate); -CHECK_RESULT int asm_or_rm32_imm(Asm *self, Reg32 reg, i32 immediate); -CHECK_RESULT int asm_adc_rm32_imm(Asm *self, Reg32 reg, i32 immediate); -CHECK_RESULT int asm_sbb_rm32_imm(Asm *self, Reg32 reg, i32 immediate); -CHECK_RESULT int asm_and_rm32_imm(Asm *self, Reg32 reg, i32 immediate); -CHECK_RESULT int asm_sub_rm32_imm(Asm *self, Reg32 reg, i32 immediate); -CHECK_RESULT int asm_xor_rm32_imm(Asm *self, Reg32 reg, i32 immediate); -CHECK_RESULT int asm_cmp_rm32_imm(Asm *self, Reg32 reg, i32 immediate); -CHECK_RESULT int asm_rol_rm32_imm(Asm *self, Reg32 reg, i8 immediate); -CHECK_RESULT int asm_ror_rm32_imm(Asm *self, Reg32 reg, i8 immediate); -CHECK_RESULT int asm_rcl_rm32_imm(Asm *self, Reg32 reg, i8 immediate); -CHECK_RESULT int asm_rcr_rm32_imm(Asm *self, Reg32 reg, i8 immediate); -CHECK_RESULT int asm_shl_rm32_imm(Asm *self, Reg32 reg, i8 immediate); -CHECK_RESULT int asm_shr_rm32_imm(Asm *self, Reg32 reg, i8 immediate); -CHECK_RESULT int asm_sar_rm32_imm(Asm *self, Reg32 reg, i8 immediate); - -CHECK_RESULT int asm_mov_rm64(Asm *self, Reg64 dst, Reg64 src); -CHECK_RESULT int asm_add_rm64(Asm *self, Reg64 dst, Reg64 src); -CHECK_RESULT int asm_sub_rm64(Asm *self, Reg64 dst, Reg64 src); -CHECK_RESULT int asm_and_rm64(Asm *self, Reg64 dst, Reg64 src); -CHECK_RESULT int asm_or_rm64(Asm *self, Reg64 dst, Reg64 src); -CHECK_RESULT int asm_xor_rm64(Asm *self, Reg64 dst, Reg64 src); -CHECK_RESULT int asm_cmp_rm64(Asm *self, Reg64 dst, Reg64 src); -CHECK_RESULT int asm_add_rm64_imm(Asm *self, Reg64 reg, i32 immediate); -CHECK_RESULT int asm_or_rm64_imm(Asm *self, Reg64 reg, i32 immediate); -CHECK_RESULT int asm_adc_rm64_imm(Asm *self, Reg64 reg, i32 immediate); -CHECK_RESULT int asm_sbb_rm64_imm(Asm *self, Reg64 reg, i32 immediate); -CHECK_RESULT int asm_and_rm64_imm(Asm *self, Reg64 reg, i32 immediate); -CHECK_RESULT int asm_sub_rm64_imm(Asm *self, Reg64 reg, i32 immediate); -CHECK_RESULT int asm_xor_rm64_imm(Asm *self, Reg64 reg, i32 immediate); -CHECK_RESULT int asm_cmp_rm64_imm(Asm *self, Reg64 reg, i32 immediate); -CHECK_RESULT int asm_rol_rm64_imm(Asm *self, Reg64 reg, i8 immediate); -CHECK_RESULT int asm_ror_rm64_imm(Asm *self, Reg64 reg, i8 immediate); -CHECK_RESULT int asm_rcl_rm64_imm(Asm *self, Reg64 reg, i8 immediate); -CHECK_RESULT int asm_rcr_rm64_imm(Asm *self, Reg64 reg, i8 immediate); -CHECK_RESULT int asm_shl_rm64_imm(Asm *self, Reg64 reg, i8 immediate); -CHECK_RESULT int asm_shr_rm64_imm(Asm *self, Reg64 reg, i8 immediate); -CHECK_RESULT int asm_sar_rm64_imm(Asm *self, Reg64 reg, i8 immediate); - -CHECK_RESULT int asm_ret(Asm *self, u16 bytes); - -#endif diff --git a/include/ast.h b/include/ast.h index 9f01b1b..d89d099 100644 --- a/include/ast.h +++ b/include/ast.h @@ -90,7 +90,7 @@ struct Ast { struct Scope { Buffer/*<Ast*>*/ ast_objects; - HashMap/*(key=BufferView, value=Ast<LhsExpr>*)*/ named_objects; + HashMapType(BufferView, Ast*) named_objects; /* Value is always an Ast* with type LhsExpr */ Scope *parent; /* Is null unless the scope is a file scope, in which case this is the parser that owns the scope */ Parser *parser; @@ -144,6 +144,14 @@ typedef struct { } value; } VariableType; +typedef enum { + DECL_FLAG_NONE = 0, + DECL_FLAG_EXTERN = 1 << 0, + DECL_FLAG_EXPORT = 1 << 1, + DECL_FLAG_PUB = 1 << 2, + DECL_FLAG_CONST = 1 << 3 +} DeclFlag; + /* Note: When resolving AST, multiple threads can end up resolving the same expressions at the same time. This is intentional. Instead of using mutex for every expression and locking/unlocking everytime @@ -153,14 +161,17 @@ typedef struct { leading to @ast_resolve running again for the same expression. */ struct LhsExpr { - bool is_extern; - bool is_pub; - bool is_const; + u8 decl_flags; BufferView var_name; VariableType type; - Ast *rhs_expr; + nullable Ast *rhs_expr; }; +#define LHS_EXPR_IS_EXTERN(expr) ((expr)->decl_flags & DECL_FLAG_EXTERN) +#define LHS_EXPR_IS_EXPORT(expr) ((expr)->decl_flags & DECL_FLAG_EXPORT) +#define LHS_EXPR_IS_PUB(expr) ((expr)->decl_flags & DECL_FLAG_PUB) +#define LHS_EXPR_IS_CONST(expr) ((expr)->decl_flags & DECL_FLAG_CONST) + struct AssignmentExpr { Ast *lhs_expr; Ast *rhs_expr; @@ -228,8 +239,9 @@ void function_signature_init(FunctionSignature *self); CHECK_RESULT int funcdecl_init(FunctionDecl *self, FunctionSignature *signature, Scope *parent, ArenaAllocator *allocator); CHECK_RESULT int funccall_init(FunctionCall *self, BufferView name, ArenaAllocator *allocator); CHECK_RESULT int structdecl_init(StructDecl *self, Scope *parent, ArenaAllocator *allocator); +LhsExpr* structdecl_get_field_by_name(StructDecl *self, BufferView field_name); void structfield_init(StructField *self, BufferView name, BufferView type_name); -void lhsexpr_init(LhsExpr *self, bool is_extern, bool is_pub, bool is_const, BufferView var_name); +void lhsexpr_init(LhsExpr *self, DeclFlag decl_flag, BufferView var_name); void assignmentexpr_init(AssignmentExpr *self, Ast *lhs_expr, Ast *rhs_expr); void import_init(Import *self, BufferView path); CHECK_RESULT int string_init(String *self, BufferView str); diff --git a/include/compiler.h b/include/compiler.h index a0ac17a..83dde63 100644 --- a/include/compiler.h +++ b/include/compiler.h @@ -49,7 +49,7 @@ struct amal_compiler { Scope root_scope; Buffer/*<Parser*>*/ parsers; Buffer/*<FileScopeReference*>*/ queued_files; - HashMap/*<BufferView, FileScopeReference*>*/ file_scopes; + HashMapType(BufferView, FileScopeReference*) file_scopes; ParserThreadData *threads; int usable_thread_count; bool started; diff --git a/include/nullable.h b/include/nullable.h index f84100b..f38fb37 100644 --- a/include/nullable.h +++ b/include/nullable.h @@ -4,6 +4,6 @@ struct __nullable_type_dummy{ int _; }; /* Used by static analysis tool to find null-pointer dereference errors */ -#define nullable +#define nullable __attribute__((annotate("nullable"))) #endif diff --git a/include/program.h b/include/program.h index 3fc69fa..a0ed4ed 100644 --- a/include/program.h +++ b/include/program.h @@ -3,7 +3,7 @@ #include "std/buffer.h" #include "bytecode/bytecode.h" -#include "asm/x86_64.h" +#include "../executor/x86_64/asm.h" #define AMAL_PROGRAM_OK 0 #define AMAL_PROGRAM_INVALID_HEADER -1 diff --git a/include/ssa/ssa.h b/include/ssa/ssa.h index 1d4c612..016acc8 100644 --- a/include/ssa/ssa.h +++ b/include/ssa/ssa.h @@ -48,9 +48,9 @@ typedef u16 SsaFuncIndex; typedef struct { Buffer/*instruction data*/ instructions; - HashMap/*<SsaNumber, SsaIntermediateIndex>*/ intermediates_map; + HashMapType(SsaNumber, SsaIntermediateIndex) intermediates_map; Buffer/*SsaNumber*/ intermediates; - HashMap/*<BufferView, SsaStringIndex>*/ strings_map; + HashMapType(BufferView, SsaStringIndex) strings_map; Buffer/*BufferView*/ strings; SsaIntermediateIndex intermediate_counter; SsaStringIndex string_counter; diff --git a/include/std/hash_map.h b/include/std/hash_map.h index b9b90c6..020748b 100644 --- a/include/std/hash_map.h +++ b/include/std/hash_map.h @@ -21,6 +21,8 @@ struct HashMap { HashMapHash hash_func; }; +#define HashMapType(key_type, value_type) __attribute__((annotate(#key_type", "#value_type))) HashMap + CHECK_RESULT int hash_map_init(HashMap *self, ArenaAllocator *allocator, usize value_type_size, HashMapCompare compare_func, HashMapHash hash_func); /* Not thread-safe. |