diff --git a/asm/error.c b/asm/error.c index e5e0a1cc..8e5ec7f3 100644 --- a/asm/error.c +++ b/asm/error.c @@ -46,34 +46,38 @@ * Description of the suppressible warnings for the command line and * the [warning] directive. */ +#define on (WARN_ST_ENABLED) +#define off 0 +#define err (WARN_ST_ENABLED|WARN_ST_ERROR) + const struct warning warnings[WARN_ALL+1] = { - {NULL, NULL, true}, /* must be true - used for unconditional enable */ - {"macro-params", "macro calls with wrong parameter count", true}, - {"macro-selfref", "cyclic macro references", false}, - {"macro-defaults", "macros with more default than optional parameters", true}, - {"orphan-labels", "labels alone on lines without trailing `:'", true}, - {"number-overflow", "numeric constant does not fit", true}, - {"gnu-elf-extensions", "using 8- or 16-bit relocation in ELF32, a GNU extension", false}, - {"float-overflow", "floating point overflow", true}, - {"float-denorm", "floating point denormal", false}, - {"float-underflow", "floating point underflow", false}, - {"float-toolong", "too many digits in floating-point number", true}, - {"user", "%warning directives", true}, - {"lock", "lock prefix on unlockable instructions", true}, - {"hle", "invalid hle prefixes", true}, - {"bnd", "invalid bnd prefixes", true}, - {"zext-reloc", "relocation zero-extended to match output format", true}, - {"ptr", "non-NASM keyword used in other assemblers", true}, - {"bad-pragma", "empty or malformed %pragma", false}, - {"unknown-pragma", "unknown %pragma facility or directive", false}, - {"not-my-pragma", "%pragma not applicable to this compilation", false}, - {"unknown-warning", "unknown warning in -W/-w or warning directive", false}, - {"negative-rep", "regative %rep count", true}, - {"phase", "phase error during stabilization", false}, + {NULL, NULL, on}, /* must be on - used for unconditional enable */ + {"macro-params", "macro calls with wrong parameter count", on}, + {"macro-selfref", "cyclic macro references", off}, + {"macro-defaults", "macros with more default than optional parameters", on}, + {"orphan-labels", "labels alone on lines without trailing `:'", on}, + {"number-overflow", "numeric constant does not fit", on}, + {"gnu-elf-extensions", "using 8- or 16-bit relocation in ELF32, a GNU extension", off}, + {"float-overflow", "floating point overflow", on}, + {"float-denorm", "floating point denormal", off}, + {"float-underflow", "floating point underflow", off}, + {"float-toolong", "too many digits in floating-point number", on}, + {"user", "%warning directives", on}, + {"lock", "lock prefix on unlockable instructions", on}, + {"hle", "invalid hle prefixes", on}, + {"bnd", "invalid bnd prefixes", on}, + {"zext-reloc", "relocation zero-extended to match output format", on}, + {"ptr", "non-NASM keyword used in other assemblers", on}, + {"bad-pragma", "empty or malformed %pragma", off}, + {"unknown-pragma", "unknown %pragma facility or directive", off}, + {"not-my-pragma", "%pragma not applicable to this compilation", off}, + {"unknown-warning", "unknown warning in -W/-w or warning directive", off}, + {"negative-rep", "regative %rep count", on}, + {"phase", "phase error during stabilization", off}, /* THESE ENTRIES SHOULD COME LAST */ - {"other", "any warning not specifially mentioned below", true}, - {"all", "all possible warnings", false} + {"other", "any warning not specifially mentioned below", on}, + {"all", "all possible warnings", off} }; uint8_t warning_state[WARN_ALL];/* Current state */ @@ -120,7 +124,7 @@ fatal_func nasm_assert_failed(const char *file, int line, const char *msg) /* * This is called when processing a -w or -W option, or a warning directive. - * Returns true if if the action was successful. + * Returns on if if the action was successful. */ bool set_warning_status(const char *value) { diff --git a/asm/nasm.c b/asm/nasm.c index bf76fb97..ac3cd1c2 100644 --- a/asm/nasm.c +++ b/asm/nasm.c @@ -1346,10 +1346,8 @@ static void parse_cmdline(int argc, char **argv, int pass) * Initialize all the warnings to their default state, including * warning index 0 used for "always on". */ - for (i = 0; i < WARN_ALL; i++) { - warning_state_init[i] = warning_state[i] = - warnings[i].enabled ? WARN_ST_ENABLED : 0; - } + for (i = 0; i < WARN_ALL; i++) + warning_state_init[i] = warning_state[i] = warnings[i].state; /* * First, process the NASMENV environment variable. @@ -2059,7 +2057,8 @@ static void help(const char xopt) printf(" %-23s %s%s\n", warnings[i].name, warnings[i].help, i == WARN_ALL ? "\n" : - warnings[i].enabled ? " [on]" : " [off]"); + (warnings[i].state & WARN_ST_ERROR) ? " [error]" : + (warnings[i].state & WARN_ST_ENABLED) ? " [on]" : " [off]"); if (xopt == 'f') { printf("valid output formats for -f are" diff --git a/include/error.h b/include/error.h index 1d904849..cd64a497 100644 --- a/include/error.h +++ b/include/error.h @@ -120,17 +120,16 @@ static inline vefunc nasm_set_verror(vefunc ve) #define WARN_ALL (22+2) /* Do not use WARN() here */ #define WARN_OTHER WARN(WARN_ALL-1) /* any noncategorized warning */ -struct warning { - const char *name; - const char *help; - bool enabled; -}; -extern const struct warning warnings[WARN_ALL+1]; - /* This is a bitmask */ #define WARN_ST_ENABLED 1 /* Warning is currently enabled */ #define WARN_ST_ERROR 2 /* Treat this warning as an error */ +struct warning { + const char *name; + const char *help; + uint8_t state; /* Default state for this warning */ +}; +extern const struct warning warnings[WARN_ALL+1]; extern uint8_t warning_state[WARN_ALL]; extern uint8_t warning_state_init[WARN_ALL];