aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorH. Peter Anvin <hpa@zytor.com>2019-08-28 19:02:47 -0700
committerH. Peter Anvin <hpa@zytor.com>2019-08-28 19:02:47 -0700
commita73ccfebcc9f60e6f2234cbf10cf7551279524d3 (patch)
tree33b64566bc2d0d3bd203b5045245aea480937ef8
parent6a4353c4c29274fb2df6ca712fad70b8701c9187 (diff)
downloadnasm-a73ccfebcc9f60e6f2234cbf10cf7551279524d3.tar.gz
nasm-a73ccfebcc9f60e6f2234cbf10cf7551279524d3.tar.xz
nasm-a73ccfebcc9f60e6f2234cbf10cf7551279524d3.zip
error: replace nasm_verror() indirection with preproc callback
Since pp_error_list_macros() was introduced, the only need for pp_verror() is to suppress error messages in certain contexts. Replace this function with a preprocessor callback, preproc->pp_suppress_error(), so we can drop the nasm_verror() function pointer entirely. Signed-off-by: H. Peter Anvin <hpa@zytor.com>
-rw-r--r--asm/error.c6
-rw-r--r--asm/nasm.c12
-rw-r--r--asm/preproc-nop.c7
-rw-r--r--asm/preproc.c46
-rw-r--r--disasm/ndisasm.c20
-rw-r--r--include/error.h10
-rw-r--r--include/nasm.h3
-rw-r--r--rdoff/rdoff.c17
8 files changed, 46 insertions, 75 deletions
diff --git a/asm/error.c b/asm/error.c
index 52f812b8..ffe7a2e5 100644
--- a/asm/error.c
+++ b/asm/error.c
@@ -41,12 +41,6 @@
#include "nasmlib.h"
#include "error.h"
-/*
- * Global error handling function. If we call this before it is
- * initialized, it is a fatal error!
- */
-vefunc nasm_verror = (vefunc)nasm_verror_critical;
-
/* Common function body */
#define nasm_do_error(_sev,_flags) \
va_list ap; \
diff --git a/asm/nasm.c b/asm/nasm.c
index b7a32cb5..07a360b2 100644
--- a/asm/nasm.c
+++ b/asm/nasm.c
@@ -74,7 +74,6 @@ const char *_progname;
static void parse_cmdline(int, char **, int);
static void assemble_file(const char *, struct strlist *);
static bool skip_this_pass(errflags severity);
-static void nasm_verror_asm(errflags severity, const char *fmt, va_list args);
static void usage(void);
static void help(FILE *);
@@ -474,7 +473,6 @@ int main(int argc, char **argv)
{
/* Do these as early as possible */
error_file = stderr;
- nasm_set_verror(nasm_verror_asm);
_progname = argv[0];
if (!_progname || !_progname[0])
_progname = "nasm";
@@ -1774,7 +1772,13 @@ static bool is_suppressed(errflags severity)
if ((severity & ERR_UNDEAD) && terminate_after_phase)
return true;
- return !(warning_state[warn_index(severity)] & WARN_ST_ENABLED);
+ if (!(warning_state[warn_index(severity)] & WARN_ST_ENABLED))
+ return true;
+
+ if (preproc && !(severity & ERR_PP_LISTMACRO))
+ return preproc->suppress_error(severity);
+
+ return false;
}
/**
@@ -1886,7 +1890,7 @@ fatal_func nasm_verror_critical(errflags severity, const char *fmt, va_list args
* @param severity the severity of the warning or error
* @param fmt the printf style format string
*/
-static void nasm_verror_asm(errflags severity, const char *fmt, va_list args)
+void nasm_verror(errflags severity, const char *fmt, va_list args)
{
char msg[1024];
char warnsuf[64];
diff --git a/asm/preproc-nop.c b/asm/preproc-nop.c
index a9a46b0f..a927880c 100644
--- a/asm/preproc-nop.c
+++ b/asm/preproc-nop.c
@@ -182,6 +182,12 @@ static void nop_error_list_macros(errflags severity)
(void)severity;
}
+static bool nop_suppress_error(errflags severity)
+{
+ (void)severity;
+ return false;
+}
+
const struct preproc_ops preproc_nop = {
nop_init,
nop_reset,
@@ -195,4 +201,5 @@ const struct preproc_ops preproc_nop = {
nop_pre_command,
nop_include_path,
nop_error_list_macros,
+ nop_suppress_error
};
diff --git a/asm/preproc.c b/asm/preproc.c
index 694527dc..2f1f767f 100644
--- a/asm/preproc.c
+++ b/asm/preproc.c
@@ -515,8 +515,6 @@ static Token *expand_id(Token * tline);
static Context *get_ctx(const char *name, const char **namep);
static Token *make_tok_num(int64_t val);
static Token *make_tok_qstr(const char *str);
-static void pp_verror(errflags severity, const char *fmt, va_list ap);
-static vefunc real_verror;
static void *new_Block(size_t size);
static void delete_Blocks(void);
static Token *new_Token(Token * next, enum pp_token_type type,
@@ -5543,10 +5541,11 @@ static int expand_mmacro(Token * tline)
}
/*
- * This function adds macro names to error messages, and suppresses
- * them if necessary.
+ * This function decides if an error message should be suppressed.
+ * It will never be called with a severity level of ERR_FATAL or
+ * higher.
*/
-static void pp_verror(errflags severity, const char *fmt, va_list arg)
+static bool pp_suppress_error(errflags severity)
{
/*
* If we're in a dead branch of IF or something like it, ignore the error.
@@ -5555,32 +5554,13 @@ static void pp_verror(errflags severity, const char *fmt, va_list arg)
* %if 0 ... %else trailing garbage ... %endif
* So %else etc should set the ERR_PP_PRECOND flag.
*/
- if ((severity & ERR_MASK) < ERR_FATAL &&
- istk && istk->conds &&
+ if (istk && istk->conds &&
((severity & ERR_PP_PRECOND) ?
istk->conds->state == COND_NEVER :
!emitting(istk->conds->state)))
- return;
-
- /* This doesn't make sense with the macro stack unwinding */
- if (0) {
- int32_t delta = 0;
-
- /* get %macro name */
- if (!(severity & ERR_NOFILE) && istk && istk->mstk.mmac) {
- MMacro *mmac = istk->mstk.mmac;
- char *buf;
+ return true;
- nasm_set_verror(real_verror);
- buf = nasm_vasprintf(fmt, arg);
- nasm_error(severity, "(%s:%"PRId32") %s",
- mmac->name, mmac->lineno - delta, buf);
- nasm_set_verror(pp_verror);
- nasm_free(buf);
- return;
- }
- }
- real_verror(severity, fmt, arg);
+ return false;
}
static Token *
@@ -6014,8 +5994,6 @@ static char *pp_getline(void)
char *line = NULL;
Token *tline;
- real_verror = nasm_set_verror(pp_verror);
-
while (true) {
tline = pp_tokline();
if (tline == &tok_pop) {
@@ -6041,14 +6019,11 @@ static char *pp_getline(void)
nasm_free(buf);
}
- nasm_set_verror(real_verror);
return line;
}
static void pp_cleanup_pass(void)
{
- real_verror = nasm_set_verror(pp_verror);
-
if (defining) {
if (defining->name) {
nasm_nonfatal("end of file while still defining macro `%s'",
@@ -6061,8 +6036,6 @@ static void pp_cleanup_pass(void)
defining = NULL;
}
- nasm_set_verror(real_verror);
-
while (cstk)
ctx_pop();
free_macros();
@@ -6114,8 +6087,6 @@ static void pp_pre_define(char *definition)
Line *l;
char *equals;
- real_verror = nasm_set_verror(pp_verror);
-
equals = strchr(definition, '=');
space = new_Token(NULL, TOK_WHITESPACE, NULL, 0);
def = new_Token(space, TOK_PREPROC_ID, "%define", 0);
@@ -6134,8 +6105,6 @@ static void pp_pre_define(char *definition)
l->first = def;
l->finishes = NULL;
predef = l;
-
- nasm_set_verror(real_verror);
}
static void pp_pre_undefine(char *definition)
@@ -6249,4 +6218,5 @@ const struct preproc_ops nasmpp = {
pp_pre_command,
pp_include_path,
pp_error_list_macros,
+ pp_suppress_error
};
diff --git a/disasm/ndisasm.c b/disasm/ndisasm.c
index 3269c367..f3c23b00 100644
--- a/disasm/ndisasm.c
+++ b/disasm/ndisasm.c
@@ -1,5 +1,5 @@
/* ----------------------------------------------------------------------- *
- *
+ *
* Copyright 1996-2009 The NASM Authors - All Rights Reserved
* See the file AUTHORS included with the NASM distribution for
* the specific copyright holders.
@@ -14,7 +14,7 @@
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
- *
+ *
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
@@ -65,18 +65,19 @@ static const char *help =
static void output_ins(uint64_t, uint8_t *, int, char *);
static void skip(uint32_t dist, FILE * fp);
-fatal_func nasm_verror_critical(errflags severity, const char *fmt, va_list val)
+void nasm_verror(errflags severity, const char *fmt, va_list val)
{
+ severity &= ERR_MASK;
+
vfprintf(stderr, fmt, val);
- exit((severity & ERR_MASK) - ERR_FATAL + 2);
+ if (severity >= ERR_FATAL)
+ exit(severity - ERR_FATAL + 1);
}
-static void ndisasm_verror(errflags severity, const char *fmt, va_list val)
+fatal_func nasm_verror_critical(errflags severity, const char *fmt, va_list val)
{
- if ((severity & ERR_MASK) >= ERR_FATAL)
- nasm_verror_critical(severity, fmt, val);
- else
- vfprintf(stderr, fmt, val);
+ nasm_verror(severity, fmt, val);
+ abort();
}
int main(int argc, char **argv)
@@ -97,7 +98,6 @@ int main(int argc, char **argv)
FILE *fp;
nasm_ctype_init();
- nasm_set_verror(ndisasm_verror);
iflag_clear_all(&prefer);
offset = 0;
diff --git a/include/error.h b/include/error.h
index 07bd5c7d..3bfe30a6 100644
--- a/include/error.h
+++ b/include/error.h
@@ -72,17 +72,9 @@ fatal_func printf_func(2, 3) nasm_panicf(errflags flags, const char *fmt, ...);
fatal_func nasm_panic_from_macro(const char *file, int line);
#define panic() nasm_panic_from_macro(__FILE__, __LINE__);
-typedef void (*vefunc) (errflags severity, const char *fmt, va_list ap);
-extern vefunc nasm_verror;
+void nasm_verror(errflags severity, const char *fmt, va_list ap);
fatal_func nasm_verror_critical(errflags severity, const char *fmt, va_list ap);
-static inline vefunc nasm_set_verror(vefunc ve)
-{
- vefunc old_verror = nasm_verror;
- nasm_verror = ve;
- return old_verror;
-}
-
/*
* These are the error severity codes which get passed as the first
* argument to an efunc.
diff --git a/include/nasm.h b/include/nasm.h
index 9bd42a75..2a207a03 100644
--- a/include/nasm.h
+++ b/include/nasm.h
@@ -391,6 +391,9 @@ struct preproc_ops {
/* Unwind the macro stack when printing an error message */
void (*error_list_macros)(errflags severity);
+
+ /* Return true if an error message should be suppressed */
+ bool (*suppress_error)(errflags severity);
};
extern const struct preproc_ops nasmpp;
diff --git a/rdoff/rdoff.c b/rdoff/rdoff.c
index bdba82ae..77f2b42f 100644
--- a/rdoff/rdoff.c
+++ b/rdoff/rdoff.c
@@ -228,23 +228,24 @@ int rdf_errno = 0;
/* ========================================================================
* Hook for nasm_error() to work
* ======================================================================== */
-fatal_func nasm_verror_critical(errflags severity, const char *fmt, va_list val)
+void nasm_verror(errflags severity, const char *fmt, va_list val)
{
+ severity &= ERR_MASK;
+
vfprintf(stderr, fmt, val);
- exit((severity & ERR_MASK) - ERR_FATAL + 2);
+ if (severity >= ERR_FATAL)
+ exit(severity - ERR_FATAL + 1);
}
-static void rdoff_verror(errflags severity, const char *fmt, va_list val)
+fatal_func nasm_verror_critical(errflags severity, const char *fmt, va_list val)
{
- if ((severity & ERR_MASK) >= ERR_FATAL)
- nasm_verror_critical(severity, fmt, val);
- else
- vfprintf(stderr, fmt, val);
+ nasm_verror(severity, fmt, val);
+ abort();
}
void rdoff_init(void)
{
- nasm_set_verror(rdoff_verror);
+
}
/* ========================================================================