#endif
/* Builds vector type (usefull for inside structures) */
+#define VECTOR_SNAP(X,Y) X ## Y
+#define VECTOR_FILL(X,Y) VECTOR_SNAP(X,Y)
#define VECTOR_TYPE(T,N) \
T* N##_data = NULL; \
long N##_elements = 0; \
elements--; \
while (N##_add(*++elements) != -1 && len--); \
return N##_elements; \
- }
+ } \
+ typedef char VECTOR_FILL(extra_semicolon_,__COUNTER__)
/* Builds a full vector inspot */
#define VECTOR_MAKE(T,N) \
VECTOR_TYPE(T,N); \
union {
int16_t s1; /* signed */
uint16_t u1; /* unsigned */
- };
+ } o1;
/* operand 2 */
union {
int16_t s2; /* signed */
uint16_t u2; /* unsigned */
- };
+ } o2;
/* operand 3 */
union {
int16_t s3; /* signed */
uint16_t u3; /* unsigned */
- };
+ } o3;
/*
* This is the same as the structure in darkplaces
//======================================================================
#define MEM_VECTOR_PROTO(Towner, Tmem, mem) \
bool GMQCC_WARN Towner##_##mem##_add(Towner*, Tmem); \
- bool GMQCC_WARN Towner##_##mem##_remove(Towner*, size_t);
+ bool GMQCC_WARN Towner##_##mem##_remove(Towner*, size_t)
#define MEM_VECTOR_PROTO_ALL(Towner, Tmem, mem) \
- MEM_VECTOR_PROTO(Towner, Tmem, mem) \
+ MEM_VECTOR_PROTO(Towner, Tmem, mem); \
bool GMQCC_WARN Towner##_##mem##_find(Towner*, Tmem, size_t*); \
- void Towner##_##mem##_clear(Towner*);
+ void Towner##_##mem##_clear(Towner*)
#define MEM_VECTOR_MAKE(Twhat, name) \
Twhat *name; \
* A shallow copy of a lex_file to remember where which ast node
* came from.
*/
-typedef struct lex_ctx {
+typedef struct {
const char *file;
- size_t line;
+ size_t line;
} lex_ctx;
#endif
void ir_value_delete(ir_value*);
void ir_value_set_name(ir_value*, const char *name);
-MEM_VECTOR_PROTO_ALL(ir_value, struct ir_instr_s*, reads)
-MEM_VECTOR_PROTO_ALL(ir_value, struct ir_instr_s*, writes)
+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);
#if 0
/*bool ir_value_set_pointer_v(ir_value*, ir_value* p); */
/*bool ir_value_set_pointer_i(ir_value*, int i); */
-MEM_VECTOR_PROTO(ir_value, ir_life_entry_t, life)
+MEM_VECTOR_PROTO(ir_value, ir_life_entry_t, life);
/* merge an instruction into the life-range */
/* returns false if the lifepoint was already known */
bool ir_value_life_merge(ir_value*, size_t);
ir_instr* ir_instr_new(struct ir_block_s *owner, int opcode);
void ir_instr_delete(ir_instr*);
-MEM_VECTOR_PROTO(ir_value, ir_phi_entry_t, phi)
+MEM_VECTOR_PROTO(ir_value, ir_phi_entry_t, phi);
bool GMQCC_WARN 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*,...));
bool ir_block_set_label(ir_block*, const char *label);
-MEM_VECTOR_PROTO(ir_block, ir_instr*, instr)
-MEM_VECTOR_PROTO_ALL(ir_block, ir_block*, exits)
-MEM_VECTOR_PROTO_ALL(ir_block, ir_block*, entries)
+MEM_VECTOR_PROTO(ir_block, ir_instr*, instr);
+MEM_VECTOR_PROTO_ALL(ir_block, ir_block*, exits);
+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);
bool GMQCC_WARN ir_block_create_jump(ir_block*, ir_block *to);
bool GMQCC_WARN ir_block_create_goto(ir_block*, ir_block *to);
-MEM_VECTOR_PROTO_ALL(ir_block, ir_value*, living)
+MEM_VECTOR_PROTO_ALL(ir_block, ir_value*, living);
void ir_block_dump(ir_block*, char *ind, int (*oprintf)(const char*,...));
bool GMQCC_WARN ir_function_collect_value(ir_function*, ir_value *value);
bool ir_function_set_name(ir_function*, const char *name);
-MEM_VECTOR_PROTO(ir_function, int, params)
-MEM_VECTOR_PROTO(ir_function, ir_block*, blocks)
+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);
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_function*, functions);
+MEM_VECTOR_PROTO(ir_builder, ir_value*, globals);
ir_function* ir_builder_get_function(ir_builder*, const char *fun);
ir_function* ir_builder_create_function(ir_builder*, const char *name);