X-Git-Url: https://git.xonotic.org/?p=xonotic%2Fgmqcc.git;a=blobdiff_plain;f=ir.h;h=c2c94a1771d0f2b54c40cb83e41fb0df55d0a08b;hp=d07dbf0bb0f17ea5f7e66ea2f74ac3c727b8daf9;hb=2a4ea74a975b0d5bcea1fcc96711115bb34373d8;hpb=88a643784094eec609322e7cb574cf12d5223a0e diff --git a/ir.h b/ir.h index d07dbf0..c2c94a1 100644 --- a/ir.h +++ b/ir.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2012 + * Copyright (C) 2012, 2013 * Wolfgang Bumiller * * Permission is hereby granted, free of charge, to any person obtaining a copy of @@ -22,7 +22,7 @@ */ #ifndef GMQCC_IR_HDR #define GMQCC_IR_HDR - +#include "gmqcc.h" /* ir_value */ typedef struct @@ -44,6 +44,7 @@ typedef struct ir_value_s { int outtype; /* 'const' vs 'var' qualifier */ int cvq; + uint32_t flags; struct ir_instr_s **reads; struct ir_instr_s **writes; @@ -77,6 +78,9 @@ typedef struct ir_value_s { /* 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; @@ -94,7 +98,7 @@ void ir_value_delete(ir_value*); 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); @@ -151,7 +155,7 @@ void ir_instr_delete(ir_instr*); 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*,...)); @@ -168,6 +172,7 @@ typedef struct ir_block_s ir_value **living; /* For the temp-allocation */ + size_t entry_id; size_t eid; bool is_return; size_t run_id; @@ -202,10 +207,6 @@ ir_value* ir_block_create_fieldaddress(ir_block*, lex_ctx, const char *label, ir 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); @@ -253,6 +254,7 @@ typedef struct ir_function_s ir_value **locals; size_t allocated_locals; + size_t globaltemps; ir_block* first; ir_block* last; @@ -271,10 +273,14 @@ typedef struct ir_function_s size_t run_id; struct ir_builder_s *owner; + + /* vararg support: */ + size_t max_varargs; } ir_function; #define IR_FLAG_HAS_ARRAYS (1<<1) #define IR_FLAG_HAS_UNINITIALIZED (1<<2) #define IR_FLAG_HAS_GOTO (1<<3) +#define IR_FLAG_INCLUDE_DEF (1<<4) #define IR_FLAG_MASK_NO_OVERLAP (IR_FLAG_HAS_ARRAYS | IR_FLAG_HAS_UNINITIALIZED) ir_function* ir_function_new(struct ir_builder_s *owner, int returntype); @@ -311,14 +317,21 @@ typedef struct ir_builder_s 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_value *reserved_va_count; } ir_builder; ir_builder* ir_builder_new(const char *modulename); @@ -334,6 +347,8 @@ 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); +ir_value* ir_builder_get_va_count(ir_builder*); + bool ir_builder_generate(ir_builder *self, const char *filename); void ir_builder_dump(ir_builder*, int (*oprintf)(const char*, ...));