# ifdef true
# undef true
# endif /*! true */
-# define false (0)
-# define true (1)
+# define false (unsigned)(0)
+# define true (unsigned)(1)
# ifdef __STDC_VERSION__
# if __STDC_VERSION__ < 199901L && __GNUC__ < 3
typedef int bool;
/*=========================== code.c ================================*/
/*===================================================================*/
-/* TODO: cleanup */
/* Note: if you change the order, fix type_sizeof in ir.c */
enum {
TYPE_VOID ,
VINSTR_NRCALL
};
+/* TODO: elide */
+extern const char *util_instr_str[VINSTR_END];
+
/* uhh? */
typedef float qcfloat;
typedef int32_t qcint;
void code_push_statement(code_t *, prog_section_statement *stmt, int linenum);
void code_pop_statement (code_t *);
+/*
+ * A shallow copy of a lex_file to remember where which ast node
+ * came from.
+ */
typedef struct {
const char *file;
size_t line;
extern size_t compile_Werrors;
extern size_t compile_warnings;
-void /********/ compile_error (lex_ctx ctx, /*LVL_ERROR*/ const char *msg, ...);
-void /********/ vcompile_error (lex_ctx ctx, /*LVL_ERROR*/ const char *msg, va_list ap);
-bool GMQCC_WARN compile_warning (lex_ctx ctx, int warntype, const char *fmt, ...);
-bool GMQCC_WARN vcompile_warning(lex_ctx ctx, int warntype, const char *fmt, va_list ap);
+void /********/ compile_error (lex_ctx ctx, /*LVL_ERROR*/ const char *msg, ...);
+void /********/ vcompile_error (lex_ctx ctx, /*LVL_ERROR*/ const char *msg, va_list ap);
+bool GMQCC_WARN compile_warning (lex_ctx ctx, int warntype, const char *fmt, ...);
+bool GMQCC_WARN vcompile_warning(lex_ctx ctx, int warntype, const char *fmt, va_list ap);
void compile_show_werrors(void);
-/*===================================================================*/
-/*========================= assembler.c =============================*/
-/*===================================================================*/
-/* TODO: remove this ... */
-static const struct {
- const char *m; /* menomic */
- const size_t o; /* operands */
- const size_t l; /* menomic len */
-} asm_instr[] = {
- { "DONE" , 1, 4 },
- { "MUL_F" , 3, 5 },
- { "MUL_V" , 3, 5 },
- { "MUL_FV" , 3, 6 },
- { "MUL_VF" , 3, 6 },
- { "DIV" , 0, 3 },
- { "ADD_F" , 3, 5 },
- { "ADD_V" , 3, 5 },
- { "SUB_F" , 3, 5 },
- { "SUB_V" , 3, 5 },
- { "EQ_F" , 0, 4 },
- { "EQ_V" , 0, 4 },
- { "EQ_S" , 0, 4 },
- { "EQ_E" , 0, 4 },
- { "EQ_FNC" , 0, 6 },
- { "NE_F" , 0, 4 },
- { "NE_V" , 0, 4 },
- { "NE_S" , 0, 4 },
- { "NE_E" , 0, 4 },
- { "NE_FNC" , 0, 6 },
- { "LE" , 0, 2 },
- { "GE" , 0, 2 },
- { "LT" , 0, 2 },
- { "GT" , 0, 2 },
- { "FIELD_F" , 0, 7 },
- { "FIELD_V" , 0, 7 },
- { "FIELD_S" , 0, 7 },
- { "FIELD_ENT" , 0, 9 },
- { "FIELD_FLD" , 0, 9 },
- { "FIELD_FNC" , 0, 9 },
- { "ADDRESS" , 0, 7 },
- { "STORE_F" , 0, 7 },
- { "STORE_V" , 0, 7 },
- { "STORE_S" , 0, 7 },
- { "STORE_ENT" , 0, 9 },
- { "STORE_FLD" , 0, 9 },
- { "STORE_FNC" , 0, 9 },
- { "STOREP_F" , 0, 8 },
- { "STOREP_V" , 0, 8 },
- { "STOREP_S" , 0, 8 },
- { "STOREP_ENT", 0, 10},
- { "STOREP_FLD", 0, 10},
- { "STOREP_FNC", 0, 10},
- { "RETURN" , 0, 6 },
- { "NOT_F" , 0, 5 },
- { "NOT_V" , 0, 5 },
- { "NOT_S" , 0, 5 },
- { "NOT_ENT" , 0, 7 },
- { "NOT_FNC" , 0, 7 },
- { "IF" , 0, 2 },
- { "IFNOT" , 0, 5 },
- { "CALL0" , 1, 5 },
- { "CALL1" , 2, 5 },
- { "CALL2" , 3, 5 },
- { "CALL3" , 4, 5 },
- { "CALL4" , 5, 5 },
- { "CALL5" , 6, 5 },
- { "CALL6" , 7, 5 },
- { "CALL7" , 8, 5 },
- { "CALL8" , 9, 5 },
- { "STATE" , 0, 5 },
- { "GOTO" , 0, 4 },
- { "AND" , 0, 3 },
- { "OR" , 0, 2 },
- { "BITAND" , 0, 6 },
- { "BITOR" , 0, 5 },
-
- { "END" , 0, 3 } /* virtual assembler instruction */
-};
/*===================================================================*/
/*============================= ir.c ================================*/
/*===================================================================*/
void opts_backup_non_Werror_all(void);
void opts_restore_non_Werror_all(void);
+
enum {
# define GMQCC_TYPE_FLAGS
# define GMQCC_DEFINE_FLAG(X) X,
# include "opts.def"
COUNT_FLAGS
};
-static const opts_flag_def opts_flag_list[] = {
-# define GMQCC_TYPE_FLAGS
-# define GMQCC_DEFINE_FLAG(X) { #X, LONGBIT(X) },
-# include "opts.def"
- { NULL, LONGBIT(0) }
-};
enum {
# define GMQCC_TYPE_WARNS
# include "opts.def"
COUNT_WARNINGS
};
-static const opts_flag_def opts_warn_list[] = {
-# define GMQCC_TYPE_WARNS
-# define GMQCC_DEFINE_FLAG(X) { #X, LONGBIT(WARN_##X) },
-# include "opts.def"
- { NULL, LONGBIT(0) }
-};
enum {
# define GMQCC_TYPE_OPTIMIZATIONS
# include "opts.def"
COUNT_OPTIMIZATIONS
};
-static const opts_flag_def opts_opt_list[] = {
-# define GMQCC_TYPE_OPTIMIZATIONS
-# define GMQCC_DEFINE_FLAG(NAME, MIN_O) { #NAME, LONGBIT(OPTIM_##NAME) },
-# include "opts.def"
- { NULL, LONGBIT(0) }
-};
-static const unsigned int opts_opt_oflag[] = {
-# define GMQCC_TYPE_OPTIMIZATIONS
-# define GMQCC_DEFINE_FLAG(NAME, MIN_O) MIN_O,
-# include "opts.def"
- 0
-};
enum {
# define GMQCC_TYPE_OPTIONS
OPTION_COUNT
};
-extern unsigned int opts_optimizationcount[COUNT_OPTIMIZATIONS];
+extern const opts_flag_def opts_flag_list[COUNT_FLAGS+1];
+extern const opts_flag_def opts_warn_list[COUNT_WARNINGS+1];
+extern const opts_flag_def opts_opt_list[COUNT_OPTIMIZATIONS+1];
+extern const unsigned int opts_opt_oflag[COUNT_OPTIMIZATIONS+1];
+extern unsigned int opts_optimizationcount[COUNT_OPTIMIZATIONS];
/* other options: */
typedef enum {