#ifndef IR_H #define IR_H #include "utils.h" #include "parser.h" struct _ir_node; struct symbol_def { struct _ir_node *node; bool is_lvalue; }; typedef struct { char *key; struct symbol_def *value; } symbol_table; typedef enum { OC_START, OC_ADD, OC_SUB, OC_MUL, OC_DIV, OC_MOD, OC_BAND, OC_BOR, OC_BXOR, OC_NEG, OC_EQ, OC_CONST_INT, OC_CONST_FLOAT, OC_VOID, OC_FRAME_PTR, OC_ADDR, OC_STORE, OC_LOAD, OC_REGION, OC_PHI, OC_IF, OC_PROJ, OC_STOP, OC_RETURN, OC_SCOPE, } opcode; typedef struct _ir_node { opcode code; usize id; struct _ir_node **in; struct _ir_node **out; union { i64 const_int; f64 const_float; symbol_table **symbol_tables; char *start_name; } data; } ir_node; void ir_build(ast_node *ast); #endif