aboutsummaryrefslogtreecommitdiff
path: root/ir.h
diff options
context:
space:
mode:
Diffstat (limited to 'ir.h')
-rw-r--r--ir.h8
1 files changed, 7 insertions, 1 deletions
diff --git a/ir.h b/ir.h
index 213793f..8496a06 100644
--- a/ir.h
+++ b/ir.h
@@ -27,6 +27,7 @@ enum instype {
INS_RETV, // return r1
INS_MOV, // r0 = r1
INS_BRK, // halt
+ INS_HWI, // hwi r1
};
enum condcode {
@@ -37,6 +38,9 @@ enum reftype {
REF_REG, // reg
REF_MEM, // [reg + offset + {0, .data, heap base}[rel]]
REF_IMM, // imm
+ // This can only appear in user-entered asm literals and will be eliminated in the compiler.
+ // It should refer to a symbol that is in scope, otherwise an error will be reported.
+ REF_VARNAME, // name
};
enum refrel {
@@ -61,6 +65,7 @@ struct ref {
int offset;
enum refrel rel;
int imm;
+ const char *name; // should be a return value from ir_str()
};
struct irins {
@@ -86,7 +91,7 @@ void ir_delete(struct ir *ir);
void ir_print(struct ir *ir, FILE *f);
void irins_print(struct irins *ins, FILE *f);
const char* condcode_show(enum condcode condcode);
-void ref_show(struct ref ref, char *dest); // dest must have size at least 40
+const char* ref_show(struct ref ref); // returns pointer to static buffer
const char* ir_str(const char *str); // returns interned string
@@ -113,6 +118,7 @@ const char* gen_label_name(void);
struct ref ref_reg(int reg);
struct ref ref_mem(int reg, int offset, enum refrel rel);
struct ref ref_imm(int imm);
+struct ref ref_varname(const char *name);
struct ref ref_next_register(void);
bool ref_equal(struct ref r1, struct ref r2);