diff options
| author | 0x221E <0x221E@0xinfinity.dev> | 2026-04-12 16:24:06 +0200 |
|---|---|---|
| committer | 0x221E <0x221E@0xinfinity.dev> | 2026-04-12 16:24:06 +0200 |
| commit | 4946ca67cf04845737f0f7f70b5ed27bcfe9a18b (patch) | |
| tree | e0ce4c11f5b81828da7680143ea444003dd355b3 /src/irm.h | |
Diffstat (limited to 'src/irm.h')
| -rw-r--r-- | src/irm.h | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/src/irm.h b/src/irm.h new file mode 100644 index 0000000..d9342f3 --- /dev/null +++ b/src/irm.h @@ -0,0 +1,58 @@ +/** + * @file ir_machine.h + * @description A very basic intermediate representation storage. + * + * @note All intermediate reps are sizeof uint8_t + */ + +#ifndef IRMACHINE_H +#define IRMACHINE_H + +#include <stddef.h> +#include <stdint.h> + +#include "sv.h" +#include "symtab.h" + +// STMT +#define VAR_DECL (uint64_t)0x10000000 +#define VAR_ASSIGN (uint64_t)0x01000000 + +// SYM +#define SYM (uint64_t)0x00100000 + +#define NUMBER64 (uint64_t)0 +#define VAR_DECL_QWORD VAR_DECL | (uint64_t)0x1 +#define VAR_DECL_DWORD VAR_DECL | (uint64_t)0x2 +#define VAR_DECL_WORD VAR_DECL | (uint64_t)0x3 +#define VAR_DECL_BYTE VAR_DECL | (uint64_t)0x4 +#define STMT_DONE (uint64_t)5 +#define SYM_VAR (uint64_t)6 +#define SYM_FUNC (uint64_t)7 + +enum irm_state { + IRM_PANIC, + IRM_GRACEFUL +}; + +struct irm { + uint64_t *storage; // performance, easier to manage. + size_t size; + size_t curr_pos; + enum irm_state state; + struct symbol_table symtab; + size_t stackdepth; + size_t scopedepth; +}; + +void irm_init(struct irm *irm); +void irm_panic(struct irm *irm); +void irm_stmt_enter_scope(struct irm *irm); +void irm_stmt_leave_scope(struct irm *irm); +void irm_stmt_done(struct irm *irm); +void irm_push(struct irm *irm, uint64_t type); +void irm_push_64v(struct irm *irm, uint64_t type, uint64_t value); +void irm_push_lookup_sym(struct irm *irm, uint64_t type, struct string_view sym); +void irm_push_sym(struct irm *irm, uint64_t type, struct string_view sym); + +#endif |
