X-Git-Url: https://git.xonotic.org/?p=xonotic%2Fgmqcc.git;a=blobdiff_plain;f=ir.h;h=dac16a39b4d492f22bbd5f59c3738d6cf243b1a4;hp=05b7447d2e2daa391553b4400bae360f8a3a20ec;hb=69b55ccc03b56af1f6c05eb45866ab198307487f;hpb=d4483bfda63dac509144741c1f0e11d68d989b66 diff --git a/ir.h b/ir.h index 05b7447..dac16a3 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; @@ -171,9 +172,9 @@ 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; struct ir_function_s *owner; @@ -271,11 +272,16 @@ 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_MASK_NO_OVERLAP (IR_FLAG_HAS_ARRAYS | IR_FLAG_HAS_UNINITIALIZED) +#define IR_FLAG_INCLUDE_DEF (1<<4) +#define IR_FLAG_MASK_NO_OVERLAP (IR_FLAG_HAS_ARRAYS | IR_FLAG_HAS_UNINITIALIZED) +#define IR_FLAG_MASK_NO_LOCAL_TEMPS (IR_FLAG_HAS_ARRAYS | IR_FLAG_HAS_UNINITIALIZED) ir_function* ir_function_new(struct ir_builder_s *owner, int returntype); void ir_function_delete(ir_function*); @@ -322,7 +328,10 @@ typedef struct ir_builder_s 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); @@ -338,12 +347,19 @@ 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); +ir_value* ir_builder_get_va_count(ir_builder*); + +bool ir_builder_generate(code_t *, 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(qcfloat)) ? 1 : -1 ]; + +/* + * This code assumes 32 bit floats while generating binary + * Blub: don't use extern here, it's annoying and shows up in nm + * for some reason :P + */ +typedef int static_assert_is_32bit_float [(sizeof(int32_t) == 4)?1:-1]; +typedef int static_assert_is_32bit_integer[(sizeof(qcfloat) == 4)?1:-1]; #endif