int vtype;
int store;
lex_ctx context;
+ /* even the IR knows the subtype of a field */
+ int fieldtype;
MEM_VECTOR_MAKE(struct ir_instr_s*, reads);
MEM_VECTOR_MAKE(struct ir_instr_s*, writes);
vector vvec;
char *vstring;
struct ir_value_s *vpointer;
+ struct ir_function_s *vfunc;
} constval;
+ struct {
+ int32_t globaladdr;
+ int32_t name;
+ /* filled by the local-allocator */
+ int32_t local;
+ } code;
+
/* For the temp allocator */
MEM_VECTOR_MAKE(ir_life_entry_t, life);
} ir_value;
/* merge an instruction into the life-range */
/* returns false if the lifepoint was already known */
bool ir_value_life_merge(ir_value*, size_t);
+bool ir_value_life_merge_into(ir_value*, const ir_value*);
/* check if a value lives at a specific point */
bool ir_value_lives(ir_value*, size_t);
/* check if the life-range of 2 values overlaps */
-bool ir_values_overlap(ir_value*, ir_value*);
+bool ir_values_overlap(const ir_value*, const ir_value*);
void ir_value_dump(ir_value*, int (*oprintf)(const char*,...));
void ir_value_dump_life(ir_value *self, int (*oprintf)(const char*,...));
size_t run_id;
struct ir_function_s *owner;
+
+ bool generated;
+ size_t code_start;
} ir_block;
ir_block* ir_block_new(struct ir_function_s *owner, const char *label);
ir_value* ir_block_create_fieldaddress(ir_block*, const char *label, ir_value *entity, ir_value *field);
+/* This is to create an instruction of the form
+ * <outtype>%label := opcode a, b
+ */
+ir_value* ir_block_create_general_instr(ir_block *self, const char *label,
+ int op, ir_value *a, ir_value *b, int outype);
+
ir_value* ir_block_create_add(ir_block*, const char *label, ir_value *l, ir_value *r);
ir_value* ir_block_create_sub(ir_block*, const char *label, ir_value *l, ir_value *r);
ir_value* ir_block_create_mul(ir_block*, const char *label, ir_value *l, ir_value *r);
/* locally defined variables */
MEM_VECTOR_MAKE(ir_value*, locals);
+ size_t allocated_locals;
+
ir_block* first;
ir_block* last;
ir_value* ir_builder_get_global(ir_builder*, const char *fun);
ir_value* ir_builder_create_global(ir_builder*, const char *name, int vtype);
+bool ir_builder_generate(ir_builder *self, const char *filename);
+
void ir_builder_dump(ir_builder*, int (*oprintf)(const char*, ...));
+/* This code assumes 32 bit floats while generating binary */
+extern int check_int_and_float_size
+[ (sizeof(int32_t) == sizeof(( (ir_value*)(NULL) )->constval.vvec.x)) ? 1 : -1 ];
+
#endif