X-Git-Url: https://git.xonotic.org/?p=xonotic%2Fgmqcc.git;a=blobdiff_plain;f=ast.h;h=964e16eabd9968be216e07498b06f4c95fbaa34f;hp=9b7e5587f9cd6e11912cd439b9be72e4c290490a;hb=9d89a059aa6d2a03d3a08de4db295e08e45458d9;hpb=988b4b49606724ef4275a25d8ea95fdc2792ee51 diff --git a/ast.h b/ast.h index 9b7e558..964e16e 100644 --- a/ast.h +++ b/ast.h @@ -1,30 +1,9 @@ -/* - * Copyright (C) 2012, 2013 - * Wolfgang Bumiller - * Dale Weiler - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is furnished to do - * so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ #ifndef GMQCC_AST_HDR #define GMQCC_AST_HDR #include "ir.h" +typedef uint16_t ast_flag_t; + /* Note: I will not be using a _t suffix for the * "main" ast node types for now. */ @@ -52,6 +31,41 @@ typedef struct ast_switch_s ast_switch; typedef struct ast_label_s ast_label; typedef struct ast_goto_s ast_goto; typedef struct ast_argpipe_s ast_argpipe; +typedef struct ast_state_s ast_state; + +enum { + AST_FLAG_VARIADIC = 1 << 0, + AST_FLAG_NORETURN = 1 << 1, + AST_FLAG_INLINE = 1 << 2, + AST_FLAG_INITIALIZED = 1 << 3, + AST_FLAG_DEPRECATED = 1 << 4, + AST_FLAG_INCLUDE_DEF = 1 << 5, + AST_FLAG_IS_VARARG = 1 << 6, + AST_FLAG_ALIAS = 1 << 7, + AST_FLAG_ERASEABLE = 1 << 8, + AST_FLAG_ACCUMULATE = 1 << 9, + + /* An array declared as [] + * so that the size is taken from the initializer + */ + AST_FLAG_ARRAY_INIT = 1 << 10, + + AST_FLAG_FINAL_DECL = 1 << 11, + + /* Several coverage options + * AST_FLAG_COVERAGE means there was an explicit [[coverage]] attribute, + * which will overwrite the default set via the commandline switches. + * BLOCK_COVERAGE inserts coverage() calls into every basic block. + * In the future there might be more options like tracking variable access + * by creating get/set wrapper functions. + */ + AST_FLAG_COVERAGE = 1 << 12, + AST_FLAG_BLOCK_COVERAGE = 1 << 13, + + AST_FLAG_LAST, + AST_FLAG_TYPE_MASK = (AST_FLAG_VARIADIC | AST_FLAG_NORETURN), + AST_FLAG_COVERAGE_MASK = (AST_FLAG_BLOCK_COVERAGE) +}; enum { TYPE_ast_node, /* 0 */ @@ -75,7 +89,8 @@ enum { TYPE_ast_switch, /* 18 */ TYPE_ast_label, /* 19 */ TYPE_ast_goto, /* 20 */ - TYPE_ast_argpipe /* 21 */ + TYPE_ast_argpipe, /* 21 */ + TYPE_ast_state /* 22 */ }; #define ast_istype(x, t) ( ((ast_node*)x)->nodetype == (TYPE_##t) ) @@ -134,7 +149,7 @@ struct ast_expression_common /* arrays get a member-count */ size_t count; ast_value* *params; - uint32_t flags; + ast_flag_t flags; /* void foo(string...) gets varparam set as a restriction * for variadic parameters */ @@ -147,18 +162,6 @@ struct ast_expression_common ir_value *outl; ir_value *outr; }; -#define AST_FLAG_VARIADIC (1<<0) -#define AST_FLAG_NORETURN (1<<1) -#define AST_FLAG_INLINE (1<<2) -#define AST_FLAG_INITIALIZED (1<<3) -#define AST_FLAG_DEPRECATED (1<<4) -#define AST_FLAG_INCLUDE_DEF (1<<5) -#define AST_FLAG_IS_VARARG (1<<6) -#define AST_FLAG_ALIAS (1<<7) -/* An array declared as [] - * so that the size is taken from the initializer */ -#define AST_FLAG_ARRAY_INIT (1<<8) -#define AST_FLAG_TYPE_MASK (AST_FLAG_VARIADIC | AST_FLAG_NORETURN) /* Value * @@ -168,7 +171,7 @@ struct ast_expression_common * is like creating a 'float foo', foo serving as the type's name. */ typedef union { - double vfloat; + qcfloat_t vfloat; int vint; vec3_t vvec; const char *vstring; @@ -190,6 +193,7 @@ struct ast_value_s bool isfield; /* this declares a field */ bool isimm; /* an immediate, not just const */ bool hasvalue; + bool inexact; /* inexact coming from folded expression */ basic_value_t constval; /* for TYPE_ARRAY we have an optional vector * of constants when an initializer list @@ -207,6 +211,9 @@ struct ast_value_s /* ONLY for arrays in progs version up to 6 */ ast_value *setter; ast_value *getter; + + + bool intrinsic; /* true if associated with intrinsic */ }; ast_value* ast_value_new(lex_ctx_t ctx, const char *name, int qctype); @@ -552,6 +559,19 @@ struct ast_goto_s ast_goto* ast_goto_new(lex_ctx_t ctx, const char *name); void ast_goto_set_label(ast_goto*, ast_label*); +/* STATE node + * + * For frame/think state updates: void foo() [framenum, nextthink] {} + */ +struct ast_state_s +{ + ast_expression expression; + ast_expression *framenum; + ast_expression *nextthink; +}; +ast_state* ast_state_new(lex_ctx_t ctx, ast_expression *frame, ast_expression *think); +void ast_state_delete(ast_state*); + /* CALL node * * Contains an ast_expression as target, rather than an ast_function/value. @@ -610,20 +630,19 @@ struct ast_function_s int builtin; + /* list of used-up names for statics without the count suffix */ + char **static_names; + /* number of static variables, by convention this includes the + * ones without the count-suffix - remember this when dealing + * with savegames. uint instead of size_t as %zu in printf is + * C99, so no windows support. */ + unsigned int static_count; + ir_function *ir_func; ir_block *curblock; ir_block **breakblocks; ir_block **continueblocks; -#if 0 - /* In order for early-out logic not to go over - * excessive jumps, we remember their target - * blocks... - */ - ir_block *iftrue; - ir_block *iffalse; -#endif - size_t labelcount; /* in order for thread safety - for the optional * channel abesed multithreading... keeping a buffer @@ -649,4 +668,11 @@ const char* ast_function_label(ast_function*, const char *prefix); bool ast_function_codegen(ast_function *self, ir_builder *builder); bool ast_generate_accessors(ast_value *asvalue, ir_builder *ir); +/* + * If the condition creates a situation where this becomes -1 size it means there are + * more AST_FLAGs than the type ast_flag_t is capable of holding. So either eliminate + * the AST flag count or change the ast_flag_t typedef to a type large enough to accomodate + * all the flags. + */ +typedef int static_assert_is_ast_flag_safe [((AST_FLAG_LAST) <= (ast_flag_t)(-1)) ? 1 : -1]; #endif