X-Git-Url: https://git.xonotic.org/?p=xonotic%2Fgmqcc.git;a=blobdiff_plain;f=ir.h;h=1059c6ed9c1753f5d15f7613b4f4fc6030ae47f4;hp=c93971eac4e357e70d15860881845127b070977e;hb=b2315777d1106a8ae6652acfc0507ac2fd510fc5;hpb=c1ea9cc40905daf4a61e43a17135e961721aa549 diff --git a/ir.h b/ir.h index c93971e..1059c6e 100644 --- a/ir.h +++ b/ir.h @@ -62,12 +62,20 @@ typedef struct ir_value_s { int32_t name; /* filled by the local-allocator */ int32_t local; + /* added for members */ + int32_t addroffset; } code; + /* for acessing vectors */ + struct ir_value_s *members[3]; + struct ir_value_s *memberof; + /* For the temp allocator */ MEM_VECTOR_MAKE(ir_life_entry_t, life); } ir_value; +int32_t ir_value_code_addr(const ir_value*); + /* ir_value can be a variable, or created by an operation */ ir_value* ir_value_var(const char *name, int st, int vtype); /* if a result of an operation: the function should store @@ -75,17 +83,20 @@ ir_value* ir_value_var(const char *name, int st, int vtype); */ ir_value* ir_value_out(struct ir_function_s *owner, const char *name, int st, int vtype); void ir_value_delete(ir_value*); -void ir_value_set_name(ir_value*, const char *name); +bool ir_value_set_name(ir_value*, const char *name); +ir_value* ir_value_vector_member(ir_value*, unsigned int member); MEM_VECTOR_PROTO_ALL(ir_value, struct ir_instr_s*, reads); MEM_VECTOR_PROTO_ALL(ir_value, struct ir_instr_s*, writes); bool GMQCC_WARN ir_value_set_float(ir_value*, float f); +bool GMQCC_WARN ir_value_set_func(ir_value*, int f); #if 0 bool GMQCC_WARN ir_value_set_int(ir_value*, int i); #endif bool GMQCC_WARN ir_value_set_string(ir_value*, const char *s); bool GMQCC_WARN ir_value_set_vector(ir_value*, vector v); +bool GMQCC_WARN ir_value_set_field(ir_value*, ir_value *fld); /*bool ir_value_set_pointer_v(ir_value*, ir_value* p); */ /*bool ir_value_set_pointer_i(ir_value*, int i); */ @@ -100,7 +111,7 @@ bool ir_value_lives(ir_value*, size_t); 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*,...)); +void ir_value_dump_life(const ir_value *self, int (*oprintf)(const char*,...)); /* A vector of IR values */ typedef struct { @@ -176,6 +187,8 @@ MEM_VECTOR_PROTO_ALL(ir_block, ir_block*, entries); ir_value* ir_block_create_binop(ir_block*, const char *label, int op, ir_value *left, ir_value *right); +ir_value* ir_block_create_unary(ir_block*, const char *label, int op, + ir_value *operand); bool GMQCC_WARN ir_block_create_store_op(ir_block*, int op, ir_value *target, ir_value *what); bool GMQCC_WARN ir_block_create_store(ir_block*, ir_value *target, ir_value *what); bool GMQCC_WARN ir_block_create_storep(ir_block*, ir_value *target, ir_value *what); @@ -228,6 +241,10 @@ typedef struct ir_function_s MEM_VECTOR_MAKE(int, params); MEM_VECTOR_MAKE(ir_block*, blocks); + int builtin; + + ir_value *value; + /* values generated from operations * which might get optimized away, so anything * in there needs to be deleted in the dtor. @@ -244,6 +261,14 @@ typedef struct ir_function_s lex_ctx context; + /* for prototypes - first we generate all the + * globals, and we remember teh function-defs + * so we can later fill in the entry pos + * + * remember the ID: + */ + qcint code_function_def; + /* for temp allocation */ size_t run_id; @@ -260,7 +285,7 @@ MEM_VECTOR_PROTO(ir_function, int, params); MEM_VECTOR_PROTO(ir_function, ir_block*, blocks); ir_value* ir_function_get_local(ir_function *self, const char *name); -ir_value* ir_function_create_local(ir_function *self, const char *name, int vtype); +ir_value* ir_function_create_local(ir_function *self, const char *name, int vtype, bool param); bool GMQCC_WARN ir_function_finalize(ir_function*); /* @@ -279,6 +304,12 @@ typedef struct ir_builder_s char *name; MEM_VECTOR_MAKE(ir_function*, functions); MEM_VECTOR_MAKE(ir_value*, globals); + MEM_VECTOR_MAKE(ir_value*, fields); + + MEM_VECTOR_MAKE(const char*, filenames); + MEM_VECTOR_MAKE(qcint, filestrings); + /* we cache the #IMMEDIATE string here */ + qcint str_immediate; } ir_builder; ir_builder* ir_builder_new(const char *modulename); @@ -287,13 +318,18 @@ void ir_builder_delete(ir_builder*); bool ir_builder_set_name(ir_builder *self, const char *name); MEM_VECTOR_PROTO(ir_builder, ir_function*, functions); -MEM_VECTOR_PROTO(ir_builder, ir_value*, globals); +MEM_VECTOR_PROTO(ir_builder, ir_value*, globals); +MEM_VECTOR_PROTO(ir_builder, ir_value*, fields); +MEM_VECTOR_PROTO(ir_builder, const char*, filenames); +MEM_VECTOR_PROTO(ir_builder, qcint, filestrings); ir_function* ir_builder_get_function(ir_builder*, const char *fun); ir_function* ir_builder_create_function(ir_builder*, const char *name, int outtype); ir_value* ir_builder_get_global(ir_builder*, const char *fun); ir_value* ir_builder_create_global(ir_builder*, const char *name, int vtype); +ir_value* ir_builder_get_field(ir_builder*, const char *fun); +ir_value* ir_builder_create_field(ir_builder*, const char *name, int vtype); bool ir_builder_generate(ir_builder *self, const char *filename); @@ -301,6 +337,6 @@ 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 ]; +[ (sizeof(int32_t) == sizeof(qcfloat)) ? 1 : -1 ]; #endif