*/
#ifndef GMQCC_IR_HDR
#define GMQCC_IR_HDR
-
+#include "gmqcc.h"
/* ir_value */
typedef struct
/* arrays will never overlap with temps */
bool unique_life;
+ /* temps living during a CALL must be locked */
+ bool locked;
+ bool callparam;
/* For the temp allocator */
ir_life_entry_t *life;
bool ir_value_set_name(ir_value*, const char *name);
ir_value* ir_value_vector_member(ir_value*, unsigned int member);
-bool GMQCC_WARN vec_ir_value_find(ir_value **vec, ir_value *what, size_t *idx);
+bool GMQCC_WARN vec_ir_value_find(ir_value **vec, const ir_value *what, size_t *idx);
bool GMQCC_WARN ir_value_set_float(ir_value*, float f);
bool GMQCC_WARN ir_value_set_func(ir_value*, int f);
bool GMQCC_WARN vec_ir_instr_find(ir_instr **vec, ir_instr *what, size_t *idx);
-bool GMQCC_WARN ir_instr_op(ir_instr*, int op, ir_value *value, bool writing);
+bool ir_instr_op(ir_instr*, int op, ir_value *value, bool writing);
void ir_instr_dump(ir_instr* in, char *ind, int (*oprintf)(const char*,...));
ir_value* ir_block_create_general_instr(ir_block *self, lex_ctx, const char *label,
int op, ir_value *a, ir_value *b, int outype);
-ir_value* ir_block_create_add(ir_block*, lex_ctx, const char *label, ir_value *l, ir_value *r);
-ir_value* ir_block_create_sub(ir_block*, lex_ctx, const char *label, ir_value *l, ir_value *r);
-ir_value* ir_block_create_mul(ir_block*, lex_ctx, const char *label, ir_value *l, ir_value *r);
-ir_value* ir_block_create_div(ir_block*, lex_ctx, const char *label, ir_value *l, ir_value *r);
ir_instr* ir_block_create_phi(ir_block*, lex_ctx, const char *label, int vtype);
ir_value* ir_phi_value(ir_instr*);
void ir_phi_add(ir_instr*, ir_block *b, ir_value *v);
ir_value **locals;
size_t allocated_locals;
+ size_t globaltemps;
ir_block* first;
ir_block* last;
ht htfields;
ir_value **extparams;
+ ir_value **extparam_protos;
/* the highest func->allocated_locals */
size_t max_locals;
+ size_t max_globaltemps;
+ uint32_t first_common_local;
+ uint32_t first_common_globaltemp;
const char **filenames;
qcint *filestrings;
/* we cache the #IMMEDIATE string here */
- qcint str_immediate;
+ qcint str_immediate;
+ /* there should just be this one nil */
+ ir_value *nil;
} ir_builder;
ir_builder* ir_builder_new(const char *modulename);