| /* ----------------------------------------------------------------------- * |
| * |
| * Copyright 1996-2020 The NASM Authors - All Rights Reserved |
| * See the file AUTHORS included with the NASM distribution for |
| * the specific copyright holders. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following |
| * conditions are met: |
| * |
| * * Redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer. |
| * * Redistributions in binary form must reproduce the above |
| * 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 |
| * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
| * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
| * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
| * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
| * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
| * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
| * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR |
| * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, |
| * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| * |
| * ----------------------------------------------------------------------- */ |
| |
| /* |
| * Error reporting functions for the assembler |
| */ |
| |
| #ifndef NASM_ERROR_H |
| #define NASM_ERROR_H 1 |
| |
| #include "compiler.h" |
| |
| /* |
| * File pointer for error messages |
| */ |
| extern FILE *error_file; /* Error file descriptor */ |
| |
| /* |
| * Typedef for the severity field |
| */ |
| typedef uint32_t errflags; |
| |
| /* |
| * An error reporting function should look like this. |
| */ |
| void printf_func(2, 3) nasm_error(errflags severity, const char *fmt, ...); |
| void printf_func(1, 2) nasm_listmsg(const char *fmt, ...); |
| void printf_func(2, 3) nasm_listmsgf(errflags flags, const char *fmt, ...); |
| void printf_func(1, 2) nasm_debug(const char *fmt, ...); |
| void printf_func(2, 3) nasm_debugf(errflags flags, const char *fmt, ...); |
| void printf_func(1, 2) nasm_info(const char *fmt, ...); |
| void printf_func(2, 3) nasm_infof(errflags flags, const char *fmt, ...); |
| void printf_func(2, 3) nasm_warn(errflags flags, const char *fmt, ...); |
| void printf_func(1, 2) nasm_nonfatal(const char *fmt, ...); |
| void printf_func(2, 3) nasm_nonfatalf(errflags flags, const char *fmt, ...); |
| fatal_func printf_func(1, 2) nasm_fatal(const char *fmt, ...); |
| fatal_func printf_func(2, 3) nasm_fatalf(errflags flags, const char *fmt, ...); |
| fatal_func printf_func(1, 2) nasm_critical(const char *fmt, ...); |
| fatal_func printf_func(2, 3) nasm_criticalf(errflags flags, const char *fmt, ...); |
| fatal_func printf_func(1, 2) nasm_panic(const char *fmt, ...); |
| 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__); |
| |
| void nasm_verror(errflags severity, const char *fmt, va_list ap); |
| fatal_func nasm_verror_critical(errflags severity, const char *fmt, va_list ap); |
| |
| /* |
| * These are the error severity codes which get passed as the first |
| * argument to an efunc. |
| */ |
| #define ERR_LISTMSG 0x00000000 /* for the listing file only */ |
| #define ERR_DEBUG 0x00000001 /* debugging message */ |
| #define ERR_INFO 0x00000002 /* information for the list file */ |
| #define ERR_WARNING 0x00000003 /* warn only: no further action */ |
| #define ERR_NONFATAL 0x00000004 /* terminate assembly after phase */ |
| #define ERR_FATAL 0x00000005 /* instantly fatal: exit with error */ |
| #define ERR_CRITICAL 0x00000006 /* fatal, but minimize code before exit */ |
| #define ERR_PANIC 0x00000007 /* internal error: panic instantly |
| * and dump core for reference */ |
| #define ERR_MASK 0x00000007 /* mask off the above codes */ |
| #define ERR_UNDEAD 0x00000008 /* skip if we already have errors */ |
| #define ERR_NOFILE 0x00000010 /* don't give source file name/line */ |
| #define ERR_HERE 0x00000020 /* point to a specific source location */ |
| #define ERR_USAGE 0x00000040 /* print a usage message */ |
| #define ERR_PASS1 0x00000080 /* message on pass_first */ |
| #define ERR_PASS2 0x00000100 /* ignore unless on pass_final */ |
| |
| #define ERR_NO_SEVERITY 0x00000200 /* suppress printing severity */ |
| #define ERR_PP_PRECOND 0x00000400 /* for preprocessor use */ |
| #define ERR_PP_LISTMACRO 0x00000800 /* from preproc->error_list_macros() */ |
| #define ERR_HOLD 0x00001000 /* this error/warning can be held */ |
| |
| /* |
| * These codes define specific types of suppressible warning. |
| * They are assumed to occupy the most significant bits of the |
| * severity code. |
| */ |
| #define WARN_SHR 16 /* how far to shift right */ |
| #define WARN_IDX(x) (((errflags)(x)) >> WARN_SHR) |
| #define WARN_MASK ((~(errflags)0) << WARN_SHR) |
| |
| /* This is a bitmask */ |
| #define WARN_ST_ENABLED 1 /* Warning is currently enabled */ |
| #define WARN_ST_ERROR 2 /* Treat this warning as an error */ |
| |
| /* Possible initial state for warnings */ |
| #define WARN_INIT_OFF 0 |
| #define WARN_INIT_ON WARN_ST_ENABLED |
| #define WARN_INIT_ERR (WARN_ST_ENABLED|WARN_ST_ERROR) |
| |
| /* Process a warning option or directive */ |
| bool set_warning_status(const char *value); |
| |
| /* Warning stack management */ |
| void push_warnings(void); |
| void pop_warnings(void); |
| void init_warnings(void); |
| void reset_warnings(void); |
| |
| /* |
| * Tentative error hold for warnings/errors indicated with ERR_HOLD. |
| * |
| * This is a stack; the "hold" argument *must* |
| * match the value returned from nasm_error_hold_push(). |
| * If "issue" is true the errors are committed (or promoted to the next |
| * higher stack level), if false then they are discarded. |
| * |
| * Errors stronger than ERR_NONFATAL cannot be held. |
| */ |
| struct nasm_errhold; |
| typedef struct nasm_errhold *errhold; |
| errhold nasm_error_hold_push(void); |
| void nasm_error_hold_pop(errhold hold, bool issue); |
| |
| /* Should be included from within error.h only */ |
| #include "warnings.h" |
| |
| /* By defining MAX_DEBUG, we can compile out messages entirely */ |
| #ifndef MAX_DEBUG |
| # define MAX_DEBUG (~0U) |
| #endif |
| |
| /* Debug level checks */ |
| static inline bool debug_level(unsigned int level) |
| { |
| extern unsigned int debug_nasm; |
| if (is_constant(level) && level > MAX_DEBUG) |
| return false; |
| return unlikely(level <= debug_nasm); |
| } |
| |
| #endif /* NASM_ERROR_H */ |