/*
- * Copyright (C) 2012, 2013
+ * Copyright (C) 2012, 2013, 2014
* Wolfgang Bumiller
* Dale Weiler
*
#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.
*/
typedef struct ast_label_s ast_label;
typedef struct ast_goto_s ast_goto;
typedef struct ast_argpipe_s ast_argpipe;
-typedef struct ast_intrinsic_s ast_intrinsic;
+
+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 */
TYPE_ast_switch, /* 18 */
TYPE_ast_label, /* 19 */
TYPE_ast_goto, /* 20 */
- TYPE_ast_argpipe, /* 21 */
- TYPE_ast_intrinsic /* 22 */
+ TYPE_ast_argpipe /* 21 */
};
#define ast_istype(x, t) ( ((ast_node*)x)->nodetype == (TYPE_##t) )
/* 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
*/
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
*
* 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;
/* 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);
ast_expression *left;
ast_expression *right;
ast_binary_ref refs;
-
+ bool right_first;
};
ast_binary* ast_binary_new(lex_ctx_t ctx,
int op,
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;
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