diff --git a/Makefile b/Makefile index cecb0a6e..84d16256 100644 --- a/Makefile +++ b/Makefile @@ -198,7 +198,7 @@ develop: -fsanitize=unreachable -fsanitize=vla-bound \ -fsanitize=signed-integer-overflow -fsanitize=bounds \ -fsanitize=object-size -fsanitize=bool -fsanitize=enum \ - -fsanitize=alignment -fsanitize=null -DDEVELOP" CFLAGS="-g -O0" + -fsanitize=alignment -fsanitize=null -DDEVELOP" CFLAGS="-ggdb3 -O0" # Targets for the project maintainer to easily create Windows exes. # This is not for Windows users! diff --git a/include/asm/util.h b/include/asm/util.h index d0c12bfb..ca2e43e0 100644 --- a/include/asm/util.h +++ b/include/asm/util.h @@ -12,7 +12,7 @@ #include uint32_t calchash(const char *s); -char const *print(char c); +char const *print(int c); size_t readUTF8Char(uint8_t *dest, char const *src); #endif /* RGBDS_UTIL_H */ diff --git a/src/asm/fstack.c b/src/asm/fstack.c index 3e02c936..65cee70f 100644 --- a/src/asm/fstack.c +++ b/src/asm/fstack.c @@ -26,7 +26,7 @@ struct Context { struct Context *child; struct LexerState *lexerState; uint32_t uniqueID; - char *fileName; + char const *fileName; uint32_t lineNo; /* Line number at which the context was EXITED */ struct Symbol const *macro; uint32_t nbReptIters; /* If zero, this isn't a REPT block */ @@ -149,14 +149,12 @@ bool yywrap(void) contextDepth--; lexer_DeleteState(contextStack->child->lexerState); - /* If at top level (= not in macro or in REPT), free the file name */ - if (!contextStack->macro && contextStack->reptIters == 0) - free(contextStack->child->fileName); /* Free the entry and make its parent the current entry */ free(contextStack->child); contextStack->child = NULL; lexer_SetState(contextStack->lexerState); + macro_SetUniqueID(contextStack->uniqueID); return false; } @@ -197,7 +195,7 @@ void fstk_RunInclude(char const *path) /* We're back at top-level, so most things are reset */ contextStack->uniqueID = 0; macro_SetUniqueID(0); - contextStack->fileName = fullPath; + contextStack->fileName = lexer_GetFileName(); contextStack->macro = NULL; contextStack->nbReptIters = 0; } @@ -217,8 +215,9 @@ void fstk_RunMacro(char *macroName, struct MacroArgs *args) macro_UseNewArgs(args); newContext(0); + /* Line minus 1 because buffer begins with a newline */ contextStack->lexerState = lexer_OpenFileView(macro->macro, - macro->macroSize, macro->fileLine); + macro->macroSize, macro->fileLine - 1); if (!contextStack->lexerState) fatalerror("Failed to set up lexer for macro invocation\n"); lexer_SetStateAtEOL(contextStack->lexerState); @@ -311,7 +310,7 @@ void fstk_Init(char *mainPath, uint32_t maxRecursionDepth) lexer_SetState(topLevelContext->lexerState); topLevelContext->uniqueID = 0; macro_SetUniqueID(0); - topLevelContext->fileName = mainPath; + topLevelContext->fileName = lexer_GetFileName(); topLevelContext->macro = NULL; topLevelContext->nbReptIters = 0; topLevelContext->reptDepth = 0; diff --git a/src/asm/lexer.c b/src/asm/lexer.c index 027aaf6e..54bc0adb 100644 --- a/src/asm/lexer.c +++ b/src/asm/lexer.c @@ -272,7 +272,6 @@ struct LexerState { char *captureBuf; /* Buffer to send the captured text to if non-NULL */ size_t captureCapacity; /* Size of the buffer above */ - size_t expansionDistance; /* Distance already considered for expansions */ bool expandStrings; struct Expansion *expansions; size_t expansionOfs; /* Offset into the current top-level expansion (negative = before) */ @@ -290,7 +289,6 @@ static void initState(struct LexerState *state) state->capturing = false; state->captureBuf = NULL; - state->expansionDistance = 0; state->expandStrings = true; state->expansions = NULL; state->expansionOfs = 0; @@ -538,7 +536,31 @@ static struct Expansion *getExpansionAtDistance(size_t *distance) #define LOOKUP_PRE_NEST(exp) #define LOOKUP_POST_NEST(exp) - lookupExpansion(expansion, *distance); + struct Expansion *exp = lexerState->expansions; + + for (;;) { + /* Find the closest expansion whose end is after the target */ + while (exp && exp->totalLen + exp->distance <= *distance) { + *distance -= exp->totalLen - exp->skip; + exp = exp->next; + } + + /* If there is none, or it begins after the target, return the previous level */ + if (!exp || exp->distance > *distance) + break; + + /* We know we are inside of that expansion */ + *distance -= exp->distance; /* Distances are relative to their parent */ + + /* Otherwise, register this expansion and repeat the process */ + LOOKUP_PRE_NEST(exp); + expansion = exp; + if (!exp->firstChild) /* If there are no children, this is it */ + break; + exp = exp->firstChild; + + LOOKUP_POST_NEST(exp); + } #undef LOOKUP_PRE_NEST #undef LOOKUP_POST_NEST @@ -553,7 +575,7 @@ static void beginExpansion(size_t distance, uint8_t skip, struct Expansion *parent = NULL; unsigned int depth = 0; -#define LOOKUP_PRE_NEST(exp) (exp)->totalLen += size +#define LOOKUP_PRE_NEST(exp) (exp)->totalLen += size - skip #define LOOKUP_POST_NEST(exp) do { \ if (name && ++depth >= nMaxRecursionDepth) \ fatalerror("Recursion limit (%u) exceeded\n", nMaxRecursionDepth); \ @@ -604,6 +626,8 @@ static char const *expandMacroArg(char name, size_t distance) if (name == '@') str = macro_GetUniqueIDStr(); + else if (name == '0') + fatalerror("Invalid macro argument '\\0'\n"); else str = macro_GetArg(name - '0'); if (!str) @@ -624,11 +648,11 @@ static int peekInternal(uint8_t distance) struct Expansion const *expansion = getExpansionAtDistance(&ofs); if (expansion) { - assert(distance < expansion->len); + assert(ofs < expansion->len); return expansion->contents[ofs]; } - distance = ofs - lexerState->expansionOfs; + distance = ofs; if (lexerState->isMmapped) { if (lexerState->offset + distance >= lexerState->size) @@ -681,20 +705,17 @@ static int peek(uint8_t distance) { int c = peekInternal(distance); - if (distance >= lexerState->expansionDistance) { - /* If not capturing and character is a backslash, check for a macro arg */ - if (!lexerState->capturing && c == '\\') { - distance++; - c = peekInternal(distance); - if (c == '@' || (c >= '1' && c <= '9')) { - /* Expand the argument and return its first character */ - c = expandMacroArg(c, distance - 1)[0]; - /* WARNING: this assumes macro args can't be empty!! */ - } else { - c = '\\'; - } + /* If not capturing and character is a backslash, check for a macro arg */ + if (!lexerState->capturing && c == '\\') { + distance++; + c = peekInternal(distance); + if (c == '@' || (c >= '0' && c <= '9')) { + /* Expand the argument and return its first character */ + c = expandMacroArg(c, distance - 1)[0]; + /* WARNING: this assumes macro args can't be empty!! */ + } else { + c = '\\'; } - lexerState->expansionDistance = distance + 1; /* Do not consider again */ } return c; } @@ -713,8 +734,6 @@ static void shiftChars(uint8_t distance) } } - lexerState->expansionDistance -= distance; - /* FIXME: this may not be too great, as only the top level is considered... */ /* @@ -830,6 +849,35 @@ static void discardComment(void) } } +/* Function to read a line continuation */ + +static bool isWhitespace(int c) +{ + return c == ' ' || c == '\t'; +} + +static void readLineContinuation(void) +{ + for (;;) { + int c = peek(0); + + if (isWhitespace(c)) { + shiftChars(1); + } else if (c == '\r' || c == '\n') { + shiftChars(1); + if (!lexerState->expansions + || lexerState->expansions->distance) { + lexerState->lineNo++; + } + return; + } else { + error("Begun line continuation, but encountered character %s\n", + print(c)); + return; + } + } +} + /* Functions to lex numbers of various radixes */ static void readNumber(int radix, int32_t baseValue) @@ -1190,6 +1238,13 @@ static void readString(void) shiftChars(1); break; + case ' ': + case '\r': + case '\n': + shiftChars(1); /* Shift the backslash */ + readLineContinuation(); + continue; + case EOF: /* Can't really print that one */ error("Illegal character escape at end of input\n"); c = '\\'; @@ -1477,15 +1532,11 @@ static int yylex_NORMAL(void) } } -static bool isWhitespace(int c) -{ - return c == ' ' || c == '\t'; -} - static int yylex_RAW(void) { /* This is essentially a modified `readString` */ size_t i = 0; + bool insideString = false; /* Trim left of string... */ while (isWhitespace(peek(0))) @@ -1495,15 +1546,23 @@ static int yylex_RAW(void) int c = peek(0); switch (c) { - case ',': - shiftChars(1); + case '"': + insideString = !insideString; + /* Other than that, just process quotes normally */ + break; + + case ';': /* Comments inside macro args */ + if (insideString) + break; + do { + shiftChars(1); + c = peek(0); + } while (c != EOF && c != '\r' && c != '\n'); /* fallthrough */ + case ',': case '\r': - case '\n': /* Do not shift these! */ + case '\n': case EOF: - /* Empty macro args break their expansion, so prevent that */ - if (i == 0) - return c; if (i == sizeof(yylval.tzString)) { i--; warning(WARNING_LONG_STR, "Macro argument too long\n"); @@ -1511,6 +1570,11 @@ static int yylex_RAW(void) /* Trim whitespace */ while (i && isWhitespace(yylval.tzString[i - 1])) i--; + /* Empty macro args break their expansion, so prevent that */ + if (i == 0) { + shiftChars(1); + return c == EOF ? 0 : c; + } yylval.tzString[i] = '\0'; return T_STRING; @@ -1518,31 +1582,21 @@ static int yylex_RAW(void) c = peek(1); switch (c) { case ',': - case '\\': /* Return that character unchanged */ - case '"': - case '{': - case '}': - shiftChars(1); - break; - case 'n': - c = '\n'; - shiftChars(1); - break; - case 'r': - c = '\r'; - shiftChars(1); - break; - case 't': - c = '\t'; shiftChars(1); break; + case ' ': + case '\r': + case '\n': + shiftChars(1); /* Shift the backslash */ + readLineContinuation(); + continue; + case EOF: /* Can't really print that one */ error("Illegal character escape at end of input\n"); c = '\\'; break; - default: - error("Illegal character escape '%s'\n", print(c)); + default: /* Pass the rest as-is */ c = '\\'; break; } @@ -1622,16 +1676,16 @@ static int yylex_SKIP_TO_ENDC(void) int yylex(void) { restart: + if (lexerState->atLineStart && lexerStateEOL) { + lexer_SetState(lexerStateEOL); + lexerStateEOL = NULL; + } if (lexerState->atLineStart) { /* Newlines read within an expansion should not increase the line count */ if (!lexerState->expansions || lexerState->expansions->distance) { lexerState->lineNo++; lexerState->colNo = 0; } - if (lexerStateEOL) { - lexer_SetState(lexerStateEOL); - lexerStateEOL = NULL; - } } static int (* const lexerModeFuncs[])(void) = { @@ -1693,6 +1747,7 @@ void lexer_CaptureRept(char **capture, size_t *size) */ assert(lexerState->atLineStart); for (;;) { + lexerState->lineNo++; /* We're at line start, so attempt to match a `REPT` or `ENDR` token */ do { /* Discard initial whitespace */ c = nextChar(); @@ -1720,7 +1775,6 @@ void lexer_CaptureRept(char **capture, size_t *size) level--; } } - lexerState->lineNo++; /* Just consume characters until EOL or EOF */ for (;;) { diff --git a/src/asm/util.c b/src/asm/util.c index ed5836c1..9af73ec0 100644 --- a/src/asm/util.c +++ b/src/asm/util.c @@ -28,10 +28,13 @@ uint32_t calchash(const char *s) return hash; } -char const *print(char c) +char const *print(int c) { static char buf[5]; /* '\xNN' + '\0' */ + if (c == EOF) + return "EOF"; + if (isprint(c)) { buf[0] = c; buf[1] = '\0'; diff --git a/test/asm/assert.err b/test/asm/assert.err index e4ef868d..8ce4402f 100644 --- a/test/asm/assert.err +++ b/test/asm/assert.err @@ -6,5 +6,5 @@ ERROR: assert.asm(18): Expected constant expression: 'FloatingBase' is not constant at assembly time ERROR: assert.asm(18): Assertion failed -ERROR: assert.asm(21): +FATAL: assert.asm(21): Assertion failed diff --git a/test/asm/divzero-instr.err b/test/asm/divzero-instr.err index e1e0e3e2..6a7ed04c 100644 --- a/test/asm/divzero-instr.err +++ b/test/asm/divzero-instr.err @@ -1,2 +1,2 @@ -ERROR: divzero-instr.asm(2): +FATAL: divzero-instr.asm(2): Division by zero diff --git a/test/asm/divzero-section-bank.err b/test/asm/divzero-section-bank.err index b382e48f..31044dc0 100644 --- a/test/asm/divzero-section-bank.err +++ b/test/asm/divzero-section-bank.err @@ -1,2 +1,2 @@ -ERROR: divzero-section-bank.asm(1): +FATAL: divzero-section-bank.asm(1): Division by zero diff --git a/test/asm/equs-newline.err b/test/asm/equs-newline.err index 620f8631..04ceb7be 100644 --- a/test/asm/equs-newline.err +++ b/test/asm/equs-newline.err @@ -1,8 +1,7 @@ -warning: test/asm/equs-newline.asm(2): [-Wuser] +warning: equs-newline.asm(3): [-Wuser] First while expanding symbol "ACT" -warning: test/asm/equs-newline.asm(3): [-Wuser] +warning: equs-newline.asm(3): [-Wuser] Second -while expanding symbol "ACT" -warning: test/asm/equs-newline.asm(4): [-Wuser] +warning: equs-newline.asm(4): [-Wuser] Third diff --git a/test/asm/equs-purge.err b/test/asm/equs-purge.err index 6d834761..c42c2bac 100644 --- a/test/asm/equs-purge.err +++ b/test/asm/equs-purge.err @@ -1,3 +1,3 @@ -warning: test/asm/equs-purge.asm(0): [-Wuser] +warning: equs-purge.asm(2): [-Wuser] Crash? while expanding symbol "BYE" diff --git a/test/asm/equs-recursion.err b/test/asm/equs-recursion.err index c6180ed3..002d0490 100644 --- a/test/asm/equs-recursion.err +++ b/test/asm/equs-recursion.err @@ -1,4 +1,4 @@ -ERROR: equs-recursion.asm(2): +FATAL: equs-recursion.asm(2): Recursion limit (64) exceeded while expanding symbol "recurse" while expanding symbol "recurse" @@ -64,3 +64,4 @@ while expanding symbol "recurse" while expanding symbol "recurse" while expanding symbol "recurse" while expanding symbol "recurse" +while expanding symbol "recurse" diff --git a/test/asm/garbage_char.asm b/test/asm/garbage_char.asm index ca5f132c..29e181eb 100644 --- a/test/asm/garbage_char.asm +++ b/test/asm/garbage_char.asm @@ -1 +1 @@ -xÿ \ No newline at end of file +ÿ diff --git a/test/asm/garbage_char.err b/test/asm/garbage_char.err index b2a30cb7..7f51a3e4 100644 --- a/test/asm/garbage_char.err +++ b/test/asm/garbage_char.err @@ -1,2 +1,3 @@ ERROR: garbage_char.asm(1): - Found garbage character: 0xFF + Unknown character 0xFF +error: Assembly aborted (1 errors)! diff --git a/test/asm/if@-no-sect.asm b/test/asm/if@-no-sect.asm index 7c6072d9..5ea733f7 100644 --- a/test/asm/if@-no-sect.asm +++ b/test/asm/if@-no-sect.asm @@ -1,2 +1,2 @@ -if {@} +if "{@}" endc diff --git a/test/asm/include-recursion.err b/test/asm/include-recursion.err index 8a256e6b..1d598df3 100644 --- a/test/asm/include-recursion.err +++ b/test/asm/include-recursion.err @@ -1,2 +1,2 @@ -ERROR: include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1): +FATAL: include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1) -> include-recursion.asm(1): Recursion limit (64) exceeded diff --git a/test/asm/line-continuation-rept.asm b/test/asm/line-continuation-rept.asm index 90a354ad..e62fddef 100644 --- a/test/asm/line-continuation-rept.asm +++ b/test/asm/line-continuation-rept.asm @@ -2,7 +2,9 @@ m: MACRO ENDM REPT 1 - m ENDR + m +ENDR REPT 1 - m \ ENDR + m \ +ENDR diff --git a/test/asm/line-continuation-whitespace.asm b/test/asm/line-continuation-whitespace.asm index 43b1fa33..52b6b465 100644 --- a/test/asm/line-continuation-whitespace.asm +++ b/test/asm/line-continuation-whitespace.asm @@ -2,6 +2,7 @@ ; file doesn't cause a segfault. bar: MACRO + WARN "" ENDM -foo: bar baz\ +foo: bar baz\ diff --git a/test/asm/load-overflow.err b/test/asm/load-overflow.err index be3e50b9..68bcfc5a 100644 --- a/test/asm/load-overflow.err +++ b/test/asm/load-overflow.err @@ -1,2 +1,2 @@ -ERROR: load-overflow.asm(4): +FATAL: load-overflow.asm(4): Section 'Overflow' grew too big (max size = 0x8000 bytes, reached 0x8001). diff --git a/test/asm/local-purge.err b/test/asm/local-purge.err index 4fb44b6e..3daacd32 100644 --- a/test/asm/local-purge.err +++ b/test/asm/local-purge.err @@ -1,3 +1,3 @@ ERROR: local-purge.asm(8): - '.loc' not defined + Interpolated symbol ".loc" does not exist error: Assembly aborted (1 errors)! diff --git a/test/asm/local-ref-without-parent.err b/test/asm/local-ref-without-parent.err index fd784ef3..d332bdf9 100644 --- a/test/asm/local-ref-without-parent.err +++ b/test/asm/local-ref-without-parent.err @@ -1,2 +1,2 @@ -ERROR: local-ref-without-parent.asm(3): +FATAL: local-ref-without-parent.asm(3): Local label reference '.test' in main scope diff --git a/test/asm/macro-line-no.asm b/test/asm/macro-line-no.asm new file mode 100644 index 00000000..89adebbb --- /dev/null +++ b/test/asm/macro-line-no.asm @@ -0,0 +1,8 @@ + +WARN "Line 2" +m: macro + WARN "Line 4" +endm +WARN "Line 6" + m +WARN "Line 8" diff --git a/test/asm/macro-line-no.err b/test/asm/macro-line-no.err new file mode 100644 index 00000000..947639e5 --- /dev/null +++ b/test/asm/macro-line-no.err @@ -0,0 +1,8 @@ +warning: macro-line-no.asm(2): [-Wuser] + Line 2 +warning: macro-line-no.asm(6): [-Wuser] + Line 6 +warning: macro-line-no.asm(7) -> macro-line-no.asm::m(4): [-Wuser] + Line 4 +warning: macro-line-no.asm(8): [-Wuser] + Line 8 diff --git a/test/asm/macro-line-no.out b/test/asm/macro-line-no.out new file mode 100644 index 00000000..e69de29b diff --git a/test/asm/macro-recursion.err b/test/asm/macro-recursion.err index e69c4c5f..d515ed61 100644 --- a/test/asm/macro-recursion.err +++ b/test/asm/macro-recursion.err @@ -1,2 +1,2 @@ -ERROR: macro-recursion.asm(4) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2): +FATAL: macro-recursion.asm(4) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2) -> macro-recursion.asm::recurse(2): Recursion limit (64) exceeded diff --git a/test/asm/nested-brackets.err b/test/asm/nested-brackets.err index b3e00643..24035a4f 100644 --- a/test/asm/nested-brackets.err +++ b/test/asm/nested-brackets.err @@ -1,2 +1,3 @@ ERROR: nested-brackets.asm(5): Missing } +error: Assembly aborted (1 errors)! diff --git a/test/asm/nested-brackets.out b/test/asm/nested-brackets.out index d86bac9d..bcaba862 100644 --- a/test/asm/nested-brackets.out +++ b/test/asm/nested-brackets.out @@ -1 +1,2 @@ OK +OK \ No newline at end of file diff --git a/test/asm/null-in-macro.asm b/test/asm/null-in-macro.asm index c9f87a3d..944922e8 100644 Binary files a/test/asm/null-in-macro.asm and b/test/asm/null-in-macro.asm differ diff --git a/test/asm/null-in-macro.err b/test/asm/null-in-macro.err index 90943ee0..4c11181a 100644 --- a/test/asm/null-in-macro.err +++ b/test/asm/null-in-macro.err @@ -1,2 +1,3 @@ -ERROR: null-in-macro.asm(2): - Found null character +ERROR: null-in-macro.asm(4) -> null-in-macro.asm::foo(2): + Unknown character 0x00 +error: Assembly aborted (1 errors)! diff --git a/test/asm/pops-no-pushed-sections.err b/test/asm/pops-no-pushed-sections.err index 4f8c06c1..7dfcea48 100644 --- a/test/asm/pops-no-pushed-sections.err +++ b/test/asm/pops-no-pushed-sections.err @@ -1,2 +1,2 @@ -ERROR: pops-no-pushed-sections.asm(1): +FATAL: pops-no-pushed-sections.asm(1): No entries in the section stack diff --git a/test/asm/pops-restore-no-section.err b/test/asm/pops-restore-no-section.err index 4eac4442..c00efd30 100644 --- a/test/asm/pops-restore-no-section.err +++ b/test/asm/pops-restore-no-section.err @@ -1,4 +1,4 @@ ERROR: pops-restore-no-section.asm(9): Label "DisallowedContent" created outside of a SECTION -ERROR: pops-restore-no-section.asm(10): +FATAL: pops-restore-no-section.asm(10): Code generation before SECTION directive diff --git a/test/asm/remote-local-noexist.err b/test/asm/remote-local-noexist.err index f1fbac28..3193664b 100644 --- a/test/asm/remote-local-noexist.err +++ b/test/asm/remote-local-noexist.err @@ -1,2 +1,2 @@ -ERROR: remote-local-noexist.asm(7): +FATAL: remote-local-noexist.asm(7): 'Parent.child.fail' is a nonsensical reference to a nested local symbol diff --git a/test/asm/rept-shift.err b/test/asm/rept-shift.err index 531d3cd3..30fd3490 100644 --- a/test/asm/rept-shift.err +++ b/test/asm/rept-shift.err @@ -1,2 +1,2 @@ -ERROR: rept-shift.asm(17) -> rept-shift.asm::m(14): +FATAL: rept-shift.asm(17) -> rept-shift.asm::m(14): Macro argument '\1' not defined diff --git a/test/asm/section-union.err b/test/asm/section-union.err index e50f5ceb..c0c2921f 100644 --- a/test/asm/section-union.err +++ b/test/asm/section-union.err @@ -6,5 +6,5 @@ ERROR: section-union.asm(37): Section "test" already declared as fixed at $c000 ERROR: section-union.asm(37): Section "test" already declared as aligned to 256 bytes -ERROR: section-union.asm(37): +FATAL: section-union.asm(37): Cannot create section "test" (3 errors) diff --git a/test/asm/sym-collision.err b/test/asm/sym-collision.err index 53a25652..29a82c43 100644 --- a/test/asm/sym-collision.err +++ b/test/asm/sym-collision.err @@ -1,3 +1,3 @@ ERROR: sym-collision.asm(26): - 'dork' not defined + Interpolated symbol "dork" does not exist error: Assembly aborted (1 errors)! diff --git a/test/asm/sym-collision.out b/test/asm/sym-collision.out index 5f7cb010..cab13a55 100644 --- a/test/asm/sym-collision.out +++ b/test/asm/sym-collision.out @@ -1,7 +1,7 @@ aqfj: $FE00 cxje: $FE01 dgsd: $FE02 -dork: $0 +dork: lxok: $FE04 psgp: $FE05 sfly: $FE06 diff --git a/test/asm/symbol-invalid-macro-arg.err b/test/asm/symbol-invalid-macro-arg.err index ff94c3c2..2e03eab6 100644 --- a/test/asm/symbol-invalid-macro-arg.err +++ b/test/asm/symbol-invalid-macro-arg.err @@ -1,2 +1,2 @@ -ERROR: symbol-invalid-macro-arg.asm(1): - Invalid macro argument '\0' in symbol +FATAL: symbol-invalid-macro-arg.asm(1): + Invalid macro argument '\0' diff --git a/test/asm/test.sh b/test/asm/test.sh index a4ad6a23..678bb0db 100755 --- a/test/asm/test.sh +++ b/test/asm/test.sh @@ -12,6 +12,7 @@ rc=0 bold=$(tput bold) resbold=$(tput sgr0) red=$(tput setaf 1) +green=$(tput setaf 2) rescolors=$(tput op) tryDiff () { diff -u --strip-trailing-cr $1 $2 || (echo "${bold}${red}${i%.asm}${variant}.$3 mismatch!${rescolors}${resbold}"; false) @@ -36,6 +37,7 @@ fi for i in *.asm; do for variant in '' '.pipe'; do + echo -e "${bold}${green}${i%.asm}${variant}...${rescolors}${resbold}" if [ -z "$variant" ]; then ../../rgbasm -Weverything -o $o $i > $output 2> $errput desired_output=${i%.asm}.out @@ -59,8 +61,8 @@ for i in *.asm; do # Escape regex metacharacters subst="$(printf '%s\n' "$i" | sed 's:[][\/.^$*]:\\&:g')" # Replace the file name with a dash to match changed output - sed "s/$subst/-/g" ${i%.asm}.out > $desired_output - sed "s/$subst/-/g" ${i%.asm}.err > $desired_errput + sed "s/$subst//g" ${i%.asm}.out > $desired_output + sed "s/$subst//g" ${i%.asm}.err > $desired_errput fi tryDiff $desired_output $output out diff --git a/test/asm/unique-id.err b/test/asm/unique-id.err index a39a3fa8..9c5fdd47 100644 --- a/test/asm/unique-id.err +++ b/test/asm/unique-id.err @@ -1,19 +1,19 @@ warning: unique-id.asm(12) -> unique-id.asm::m(4): [-Wuser] - _0 -warning: unique-id.asm(12) -> unique-id.asm::m(5) -> unique-id.asm::m::REPT~1(6): [-Wuser] _1 -warning: unique-id.asm(12) -> unique-id.asm::m(5) -> unique-id.asm::m::REPT~2(6): [-Wuser] +warning: unique-id.asm(12) -> unique-id.asm::m(5) -> unique-id.asm::m::REPT~1(6): [-Wuser] _2 +warning: unique-id.asm(12) -> unique-id.asm::m(5) -> unique-id.asm::m::REPT~2(6): [-Wuser] + _3 warning: unique-id.asm(12) -> unique-id.asm::m(8): [-Wuser] - _0 + _1 warning: unique-id.asm(14) -> unique-id.asm::m(4): [-Wuser] - _3 -warning: unique-id.asm(14) -> unique-id.asm::m(5) -> unique-id.asm::m::REPT~1(6): [-Wuser] _4 -warning: unique-id.asm(14) -> unique-id.asm::m(5) -> unique-id.asm::m::REPT~2(6): [-Wuser] +warning: unique-id.asm(14) -> unique-id.asm::m(5) -> unique-id.asm::m::REPT~1(6): [-Wuser] _5 +warning: unique-id.asm(14) -> unique-id.asm::m(5) -> unique-id.asm::m::REPT~2(6): [-Wuser] + _6 warning: unique-id.asm(14) -> unique-id.asm::m(8): [-Wuser] - _3 -ERROR: unique-id.asm(15): + _4 +FATAL: unique-id.asm(15): Macro argument '\@' not defined while expanding symbol "print"