/** * @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 #include #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