From 55fbecee497b7971b9b773fe7136ff953b10e186 Mon Sep 17 00:00:00 2001 From: ISSOtm Date: Thu, 12 Sep 2019 09:57:01 +0200 Subject: [PATCH] Add info about string expansions in error reports This is especially useful when an EQUS expands to another one, to help track them. This is done separately from the file stack as the EQUS stack is separate (which is itself because EQUS are managed *way* differently). --- include/asm/fstack.h | 1 + src/asm/fstack.c | 14 ++++++++ src/asm/main.c | 16 ++++++---- test/asm/equs-recursion.out | 64 +++++++++++++++++++++++++++++++++++++ 4 files changed, 88 insertions(+), 7 deletions(-) diff --git a/include/asm/fstack.h b/include/asm/fstack.h index 98bcbfc7..b63cd78f 100644 --- a/include/asm/fstack.h +++ b/include/asm/fstack.h @@ -43,6 +43,7 @@ void fstk_RunInclude(char *tzFileName); void fstk_RunMacroArg(int32_t s); void fstk_Init(char *s); void fstk_Dump(void); +void fstk_DumpStringExpansions(void); void fstk_AddIncludePath(char *s); uint32_t fstk_RunMacro(char *s); void fstk_RunRept(uint32_t count, int32_t nReptLineNo); diff --git a/src/asm/fstack.c b/src/asm/fstack.c index a4977ef8..0d0dd5b9 100644 --- a/src/asm/fstack.c +++ b/src/asm/fstack.c @@ -262,6 +262,20 @@ void fstk_Dump(void) fprintf(stderr, "%s(%d)", tzCurrentFileName, nLineNo); } +/* + * Dump the string expansion stack to stderr + */ +void fstk_DumpStringExpansions(void) +{ + const struct sStringExpansionPos *pExpansion = pCurrentStringExpansion; + + while (pExpansion) { + fprintf(stderr, "while expanding symbol \"%s\"\n", + pExpansion->tzName); + pExpansion = pExpansion->pParent; + } +} + /* * Extra includepath stuff */ diff --git a/src/asm/main.c b/src/asm/main.c index 5524f4b1..ef24b3d6 100644 --- a/src/asm/main.c +++ b/src/asm/main.c @@ -239,12 +239,13 @@ static void opt_ParseDefines(void) */ void verror(const char *fmt, va_list args) { - fprintf(stderr, "ERROR: "); + fputs("ERROR: ", stderr); fstk_Dump(); - fprintf(stderr, ":\n "); + fputs(":\n ", stderr); vfprintf(stderr, fmt, args); - fprintf(stderr, "\n"); - nErrors += 1; + fputc('\n', stderr); + fstk_DumpStringExpansions(); + nErrors++; } void yyerror(const char *fmt, ...) @@ -276,11 +277,12 @@ void warning(const char *fmt, ...) va_start(args, fmt); - fprintf(stderr, "warning: "); + fputs("warning: ", stderr); fstk_Dump(); - fprintf(stderr, ":\n "); + fputs(":\n ", stderr); vfprintf(stderr, fmt, args); - fprintf(stderr, "\n"); + fputc('\n', stderr); + fstk_DumpStringExpansions(); va_end(args); } diff --git a/test/asm/equs-recursion.out b/test/asm/equs-recursion.out index 71895a5d..c6180ed3 100644 --- a/test/asm/equs-recursion.out +++ b/test/asm/equs-recursion.out @@ -1,2 +1,66 @@ ERROR: equs-recursion.asm(2): Recursion limit (64) exceeded +while expanding symbol "recurse" +while expanding symbol "recurse" +while expanding symbol "recurse" +while expanding symbol "recurse" +while expanding symbol "recurse" +while expanding symbol "recurse" +while expanding symbol "recurse" +while expanding symbol "recurse" +while expanding symbol "recurse" +while expanding symbol "recurse" +while expanding symbol "recurse" +while expanding symbol "recurse" +while expanding symbol "recurse" +while expanding symbol "recurse" +while expanding symbol "recurse" +while expanding symbol "recurse" +while expanding symbol "recurse" +while expanding symbol "recurse" +while expanding symbol "recurse" +while expanding symbol "recurse" +while expanding symbol "recurse" +while expanding symbol "recurse" +while expanding symbol "recurse" +while expanding symbol "recurse" +while expanding symbol "recurse" +while expanding symbol "recurse" +while expanding symbol "recurse" +while expanding symbol "recurse" +while expanding symbol "recurse" +while expanding symbol "recurse" +while expanding symbol "recurse" +while expanding symbol "recurse" +while expanding symbol "recurse" +while expanding symbol "recurse" +while expanding symbol "recurse" +while expanding symbol "recurse" +while expanding symbol "recurse" +while expanding symbol "recurse" +while expanding symbol "recurse" +while expanding symbol "recurse" +while expanding symbol "recurse" +while expanding symbol "recurse" +while expanding symbol "recurse" +while expanding symbol "recurse" +while expanding symbol "recurse" +while expanding symbol "recurse" +while expanding symbol "recurse" +while expanding symbol "recurse" +while expanding symbol "recurse" +while expanding symbol "recurse" +while expanding symbol "recurse" +while expanding symbol "recurse" +while expanding symbol "recurse" +while expanding symbol "recurse" +while expanding symbol "recurse" +while expanding symbol "recurse" +while expanding symbol "recurse" +while expanding symbol "recurse" +while expanding symbol "recurse" +while expanding symbol "recurse" +while expanding symbol "recurse" +while expanding symbol "recurse" +while expanding symbol "recurse" +while expanding symbol "recurse"