X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=gmqcc.h;h=234aaa9cfb28edbf36a4c7facd14a9ad977e274d;hb=199540e6ca70f1157406396fd0643ded97f9fbb2;hp=5f39634528e375f1b01ddcbc07c643bfb007281e;hpb=4b3e2571af85da0990d88434e0cf2613e1baf734;p=xonotic%2Fgmqcc.git diff --git a/gmqcc.h b/gmqcc.h index 5f39634..234aaa9 100644 --- a/gmqcc.h +++ b/gmqcc.h @@ -116,7 +116,7 @@ * I suspect it also has just __inline of some sort, but our use * of inline is correct (not guessed), WE WANT IT TO BE INLINE */ -#elseif defined(_MSC_VER) +#elif defined(_MSC_VER) # define GMQCC_INLINE __forceinline #else # define GMQCC_INLINE @@ -134,65 +134,54 @@ # define GMQCC_NORETURN #endif -/* - * stdint.h and inttypes.h -less subset - * for systems that don't have it, which we must - * assume is all systems. (int8_t not required) - */ -#if CHAR_MIN == -128 - typedef unsigned char uint8_t; /* same as below */ -#elif SCHAR_MIN == -128 - typedef unsigned char uint8_t; /* same as above */ -#endif -#if SHRT_MAX == 0x7FFF - typedef short int16_t; - typedef unsigned short uint16_t; -#elif INT_MAX == 0x7FFF - typedef int int16_t; - typedef unsigned int uint16_t; -#endif -#if INT_MAX == 0x7FFFFFFF - typedef int int32_t; - typedef unsigned int uint32_t; -#elif LONG_MAX == 0x7FFFFFFF - typedef long int32_t; - typedef unsigned long uint32_t; -#endif - - -#if defined(__GNUC__) || defined (__CLANG__) - typedef int int64_t __attribute__((__mode__(__DI__))); - typedef unsigned int uint64_t __attribute__((__mode__(__DI__))); -#elif defined(_MSC_VER) - typedef __int64 int64_t; - typedef unsigned __int64 uint64_t; -#else - /* - * Incorrectly size the types so static assertions below will - * fail. There is no valid way to get a 64bit type at this point - * without making assumptions of too many things. - */ - typedef struct { char _fail : 0; } int64_t; - typedef struct { char _fail : 0; } uint64_t; -#endif -#ifdef _LP64 /* long pointer == 64 */ - typedef unsigned long uintptr_t; - typedef long intptr_t; +/* no stdint.h in < C99 */ +#if __STDC_VERSION__ < 199901L +# if CHAR_MIN == -128 + typedef unsigned char uint8_t; /* same as below */ +# elif SCHAR_MIN == -128 + typedef unsigned char uint8_t; /* same as above */ +# endif +# if SHRT_MAX == 0x7FFF + typedef short int16_t; + typedef unsigned short uint16_t; +# elif INT_MAX == 0x7FFF + typedef int int16_t; + typedef unsigned int uint16_t; +# endif +# if INT_MAX == 0x7FFFFFFF + typedef int int32_t; + typedef unsigned int uint32_t; +# elif LONG_MAX == 0x7FFFFFFF + typedef long int32_t; + typedef unsigned long uint32_t; +# endif + +# if defined(__GNUC__) || defined (__CLANG__) + typedef int int64_t __attribute__((__mode__(__DI__))); + typedef unsigned int uint64_t __attribute__((__mode__(__DI__))); +# elif defined(_MSC_VER) + typedef __int64 int64_t; + typedef unsigned __int64 uint64_t; +# else + /* + * Incorrectly size the types so static assertions below will + * fail. There is no valid way to get a 64bit type at this point + * without making assumptions of too many things. + */ + typedef struct { char _fail : 0; } int64_t; + typedef struct { char _fail : 0; } uint64_t; +# endif + /* Ensure type sizes are correct: */ + typedef char uint8_size_is_correct [sizeof(uint8_t) == 1?1:-1]; + typedef char uint16_size_is_correct [sizeof(uint16_t) == 2?1:-1]; + typedef char uint32_size_is_correct [sizeof(uint32_t) == 4?1:-1]; + typedef char uint64_size_is_correct [sizeof(uint64_t) == 8?1:-1]; + typedef char int16_size_if_correct [sizeof(int16_t) == 2?1:-1]; + typedef char int32_size_is_correct [sizeof(int32_t) == 4?1:-1]; + typedef char int64_size_is_correct [sizeof(int64_t) >= 8?1:-1]; #else - typedef unsigned int uintptr_t; - typedef int intptr_t; +# include #endif -/* Ensure type sizes are correct: */ -typedef char uint8_size_is_correct [sizeof(uint8_t) == 1?1:-1]; -typedef char uint16_size_is_correct [sizeof(uint16_t) == 2?1:-1]; -typedef char uint32_size_is_correct [sizeof(uint32_t) == 4?1:-1]; -typedef char uint64_size_is_correct [sizeof(uint64_t) == 8?1:-1]; -typedef char int16_size_if_correct [sizeof(int16_t) == 2?1:-1]; -typedef char int32_size_is_correct [sizeof(int32_t) == 4?1:-1]; -typedef char int64_size_is_correct [sizeof(int64_t) >= 8?1:-1]; -/* intptr_t / uintptr_t correct size check */ -typedef char uintptr_size_is_correct[sizeof(intptr_t) == sizeof(int*)?1:-1]; -typedef char intptr_size_is_correct [sizeof(uintptr_t)== sizeof(int*)?1:-1]; /*===================================================================*/ /*=========================== util.c ================================*/ @@ -546,7 +535,12 @@ enum { */ VINSTR_PHI, VINSTR_JUMP, - VINSTR_COND + VINSTR_COND, + /* A never returning CALL. + * Creating this causes IR blocks to be marked as 'final'. + * No-Return-Call + */ + VINSTR_NRCALL }; extern prog_section_statement *code_statements; @@ -573,6 +567,7 @@ qcint code_alloc_field (size_t qcsize); /* this function is used to keep statements and linenumbers together */ void code_push_statement(prog_section_statement *stmt, int linenum); +void code_pop_statement(); /* * A shallow copy of a lex_file to remember where which ast node @@ -882,6 +877,7 @@ bool opts_setoptim(const char *, bool); void opts_init (const char *, int, size_t); void opts_set (uint32_t *, size_t, bool); void opts_setoptimlevel(unsigned int); +void opts_ini_init (const char *); enum { # define GMQCC_TYPE_FLAGS