From 7845afcf38358c730d69bc4fc9c484c4a762bfa8 Mon Sep 17 00:00:00 2001 From: Max Wash Date: Mon, 9 Dec 2024 13:29:44 +0000 Subject: [PATCH] asm: add interfaces for a low-level bytecode assembler --- asm/assembler.c | 0 asm/codegen.c | 0 asm/include/ivy/asm/assembler.h | 43 +++++++++++++++++++++++++++++++++ asm/include/ivy/asm/codegen.h | 0 asm/include/ivy/asm/instr.h | 13 ++++++++++ asm/include/ivy/asm/parse.h | 0 asm/parse.c | 0 7 files changed, 56 insertions(+) create mode 100644 asm/assembler.c create mode 100644 asm/codegen.c create mode 100644 asm/include/ivy/asm/assembler.h create mode 100644 asm/include/ivy/asm/codegen.h create mode 100644 asm/include/ivy/asm/instr.h create mode 100644 asm/include/ivy/asm/parse.h create mode 100644 asm/parse.c diff --git a/asm/assembler.c b/asm/assembler.c new file mode 100644 index 0000000..e69de29 diff --git a/asm/codegen.c b/asm/codegen.c new file mode 100644 index 0000000..e69de29 diff --git a/asm/include/ivy/asm/assembler.h b/asm/include/ivy/asm/assembler.h new file mode 100644 index 0000000..1954399 --- /dev/null +++ b/asm/include/ivy/asm/assembler.h @@ -0,0 +1,43 @@ +#ifndef IVY_ASM_ASSEMBLER_H_ +#define IVY_ASM_ASSEMBLER_H_ + +#include +#include + +#define IVY_ASM_INDEX_AUTO (-1) + +struct ivy_selector; +struct ivy_instr; + +struct ivy_assembler; + +enum ivy_assembler_scope_type { + IVY_ASM_SCOPE_NONE = 0, + IVY_ASM_SCOPE_UNIT, + IVY_ASM_SCOPE_CLASS, + IVY_ASM_SCOPE_LAMBDA, + IVY_ASM_SCOPE_MSGH, + IVY_ASM_SCOPE_CONSTPOOL, +}; + +IVY_API enum ivy_static ivy_assembler_create(struct ivy_assembler **as); +IVY_API void ivy_assembler_destroy(struct ivy_assembler *as); + +IVY_API enum ivy_status ivy_assembler_begin_scope( + struct ivy_assembler *as, enum ivy_assembler_scope_type type); +IVY_API enum ivy_status ivy_assembler_end_scope(struct ivy_assembler *as); + +IVY_API enum ivy_status ivy_assembler_put_string( + struct ivy_assembler *as, int index, const char *s); +IVY_API enum ivy_status ivy_assembler_put_ident( + struct ivy_assembler *as, int index, const char *s); +IVY_API enum ivy_status ivy_assembler_put_atom( + struct ivy_assembler *as, int index, const char *s); +IVY_API enum ivy_status ivy_assembler_put_selector( + struct ivy_assembler *as, int index, struct ivy_selector *sel); +IVY_API enum ivy_status ivy_assembler_put_mvar( + struct ivy_assembler *as, int index, const char *name); +IVY_API enum ivy_status ivy_assembler_put_instr( + struct ivy_assembler *as, const struct ivy_instr *i); + +#endif diff --git a/asm/include/ivy/asm/codegen.h b/asm/include/ivy/asm/codegen.h new file mode 100644 index 0000000..e69de29 diff --git a/asm/include/ivy/asm/instr.h b/asm/include/ivy/asm/instr.h new file mode 100644 index 0000000..af9ac31 --- /dev/null +++ b/asm/include/ivy/asm/instr.h @@ -0,0 +1,13 @@ +#ifndef IVY_ASM_INSTR_H_ +#define IVY_ASM_INSTR_H_ + +#include + +struct ivy_instr { + enum ivy_opcode i_op; + long i_a0; + long i_a1; + long i_a2; +}; + +#endif diff --git a/asm/include/ivy/asm/parse.h b/asm/include/ivy/asm/parse.h new file mode 100644 index 0000000..e69de29 diff --git a/asm/parse.c b/asm/parse.c new file mode 100644 index 0000000..e69de29