summaryrefslogtreecommitdiff
path: root/src/irm.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/irm.h')
-rw-r--r--src/irm.h58
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