summaryrefslogtreecommitdiff
path: root/asm/srcfile.h
diff options
context:
space:
mode:
Diffstat (limited to 'asm/srcfile.h')
-rw-r--r--asm/srcfile.h77
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 */