diff options
author | H. Peter Anvin <hpa@zytor.com> | 2020-07-05 15:27:04 -0700 |
---|---|---|
committer | H. Peter Anvin <hpa@zytor.com> | 2020-07-05 15:27:04 -0700 |
commit | 63769c588e2d0ecc49b898c0a5c035cf0d11e78e (patch) | |
tree | ce7859cca6de47fb384238187181071af909add9 /asm/srcfile.h | |
parent | 37c0942409298317aa5206f09250527793b3b593 (diff) | |
parent | 122c5fb75986adc37dfb147cc2a613e3ebc66e80 (diff) | |
download | nasm-63769c588e2d0ecc49b898c0a5c035cf0d11e78e.tar.gz |
Merge remote-tracking branch 'github/nasm-2.15.xx'
Diffstat (limited to 'asm/srcfile.h')
-rw-r--r-- | asm/srcfile.h | 77 |
1 files changed, 64 insertions, 13 deletions
diff --git a/asm/srcfile.h b/asm/srcfile.h index 759ceabf..a26e1e4f 100644 --- a/asm/srcfile.h +++ b/asm/srcfile.h @@ -1,6 +1,6 @@ /* ----------------------------------------------------------------------- * * - * Copyright 1996-2016 The NASM Authors - All Rights Reserved + * Copyright 1996-2020 The NASM Authors - All Rights Reserved * See the file AUTHORS included with the NASM distribution for * the specific copyright holders. * @@ -43,24 +43,31 @@ struct src_location { const char *filename; int32_t lineno; }; -extern struct src_location _src_here; +struct src_location_stack { + struct src_location l; + struct src_location_stack *up, *down; + const void *macro; +}; +extern struct src_location_stack _src_top; +extern struct src_location_stack *_src_bottom; +extern struct src_location_stack *_src_error; void src_init(void); void src_free(void); const char *src_set_fname(const char *newname); static inline const char *src_get_fname(void) { - return _src_here.filename; + return _src_bottom->l.filename; } static inline int32_t src_set_linnum(int32_t newline) { - int32_t oldline = _src_here.lineno; - _src_here.lineno = newline; + int32_t oldline = _src_bottom->l.lineno; + _src_bottom->l.lineno = newline; return oldline; } static inline int32_t src_get_linnum(void) { - return _src_here.lineno; + return _src_bottom->l.lineno; } /* Can be used when there is no need for the old information */ @@ -80,15 +87,16 @@ static inline int32_t src_get(int32_t *xline, const char **xname) { const char *xn = *xname; int32_t xl = *xline; + int32_t line = _src_bottom->l.lineno; - *xline = _src_here.lineno; - *xname = _src_here.filename; + *xline = line; + *xname = _src_bottom->l.filename; /* The return value is expected to be optimized out almost everywhere */ - if (!xn || xn != _src_here.filename) + if (!xn || xn != _src_bottom->l.filename) return -2; else - return _src_here.lineno - xl; + return line - xl; } /* @@ -96,7 +104,39 @@ static inline int32_t src_get(int32_t *xline, const char **xname) */ static inline struct src_location src_where(void) { - return _src_here; + return _src_bottom->l; +} + +/* + * Returns the top-level information as a structure. Use this for panic + * errors, since descent is not possible there. + */ +static inline struct src_location src_where_top(void) +{ + return _src_top.l; +} + +/* + * Returns the appropriate level of the location stack to use for error + * messages. This is the same as the top level except during the descent + * through the macro hierarchy for elucidation; + */ +static inline struct src_location src_where_error(void) +{ + return _src_error->l; +} +static inline const void *src_error_down(void) +{ + if (_src_error->down) { + _src_error = _src_error->down; + return _src_error->macro; + } else { + return NULL; + } +} +static inline void src_error_reset(void) +{ + _src_error = &_src_top; } /* @@ -106,9 +146,20 @@ static inline struct src_location src_where(void) */ static inline struct src_location src_update(struct src_location whence) { - struct src_location old = _src_here; - _src_here = whence; + struct src_location old = _src_bottom->l; + _src_bottom->l = whence; return old; } +/* + * Push/pop macro expansion level. "macroname" must remain constant at + * least until the same macro expansion level is popped. + */ +void src_macro_push(const void *macroname, struct src_location where); +static inline const void *src_macro_current(void) +{ + return _src_bottom->macro; +} +void src_macro_pop(void); + #endif /* ASM_SRCFILE_H */ |