From 554778da5b66c0ba87342f50eaa43afe08e75b8a Mon Sep 17 00:00:00 2001 From: Sylvie <35663410+Rangi42@users.noreply.github.com> Date: Tue, 19 Mar 2024 16:01:45 -0400 Subject: [PATCH] Built-in symbols are "", not "" (#1362) --- src/asm/fstack.cpp | 5 ++- src/asm/output.cpp | 32 ++++++----------- src/asm/symbol.cpp | 64 +++++++++++++--------------------- test/asm/builtin-overwrite.err | 40 ++++++++++----------- test/asm/rs-overwrite.asm | 26 ++++++++++++++ test/asm/rs-overwrite.err | 11 ++++++ test/asm/rs-overwrite.out | 9 +++++ 7 files changed, 103 insertions(+), 84 deletions(-) create mode 100644 test/asm/rs-overwrite.asm create mode 100644 test/asm/rs-overwrite.err create mode 100644 test/asm/rs-overwrite.out diff --git a/src/asm/fstack.cpp b/src/asm/fstack.cpp index adea9ca4..079416c8 100644 --- a/src/asm/fstack.cpp +++ b/src/asm/fstack.cpp @@ -101,10 +101,9 @@ FileStackNode *fstk_GetFileStack() { FileStackNode *topNode = contextStack.top().fileInfo; // Mark node and all of its parents as referenced if not already so they don't get freed - for (FileStackNode *node = topNode; node && !node->referenced; node = node->parent) { + for (FileStackNode *node = topNode; node && !node->referenced; node = node->parent) node->referenced = true; - node->ID = -1; - } + return topNode; } diff --git a/src/asm/output.cpp b/src/asm/output.cpp index 58d58dca..da0d77fa 100644 --- a/src/asm/output.cpp +++ b/src/asm/output.cpp @@ -143,18 +143,13 @@ static void writesymbol(Symbol const &sym, FILE *file) { } } -static void registerSymbol(Symbol &sym) { - sym.ID = objectSymbols.size(); - objectSymbols.push_back(&sym); - out_RegisterNode(sym.src); -} - -// Returns a symbol's ID within the object file -// If the symbol does not have one, one is assigned by registering the symbol -static uint32_t getSymbolID(Symbol &sym) { - if (sym.ID == (uint32_t)-1 && !sym_IsPC(&sym)) - registerSymbol(sym); - return sym.ID; +static void registerUnregisteredSymbol(Symbol &sym) { + // Check for `sym.src`, to skip any built-in symbol from rgbasm + if (sym.src && sym.ID == (uint32_t)-1 && !sym_IsPC(&sym)) { + sym.ID = objectSymbols.size(); // Set the symbol's ID within the object file + objectSymbols.push_back(&sym); + out_RegisterNode(sym.src); + } } static void writerpn(std::vector &rpnexpr, std::vector const &rpn) { @@ -193,7 +188,8 @@ static void writerpn(std::vector &rpnexpr, std::vector const & value = sym_GetConstantValue(symName); } else { rpnexpr[rpnptr++] = RPN_SYM; - value = getSymbolID(*sym); + registerUnregisteredSymbol(*sym); // Ensure that `sym->ID` is set + value = sym->ID; } rpnexpr[rpnptr++] = value & 0xFF; @@ -213,7 +209,8 @@ static void writerpn(std::vector &rpnexpr, std::vector const & // The symbol name is always written expanded sym = sym_FindExactSymbol(symName); - value = getSymbolID(*sym); + registerUnregisteredSymbol(*sym); // Ensure that `sym->ID` is set + value = sym->ID; rpnexpr[rpnptr++] = RPN_BANK_SYM; rpnexpr[rpnptr++] = value & 0xFF; @@ -323,13 +320,6 @@ static void writeFileStackNode(FileStackNode const &node, FILE *file) { } } -static void registerUnregisteredSymbol(Symbol &sym) { - // Check for symbol->src, to skip any built-in symbol from rgbasm - if (sym.src && sym.ID == (uint32_t)-1) { - registerSymbol(sym); - } -} - // Write an objectfile void out_WriteObject() { FILE *file; diff --git a/src/asm/symbol.cpp b/src/asm/symbol.cpp index 44a50f71..7b85f07c 100644 --- a/src/asm/symbol.cpp +++ b/src/asm/symbol.cpp @@ -62,7 +62,6 @@ static int32_t CallbackPC() { int32_t Symbol::getValue() const { assert(std::holds_alternative(data) || std::holds_alternative(data)); if (int32_t const *value = std::get_if(&data); value) { - // TODO: do not use section's org directly return type == SYM_LABEL ? *value + getSection()->org : *value; } return getOutputValue(); @@ -90,25 +89,23 @@ std::string *Symbol::getEqus() const { } static void dumpFilename(Symbol const &sym) { - if (sym.src) + if (sym.src) { sym.src->dump(sym.fileLine); - else if (sym.fileLine == 0) - fputs("", stderr); - else - fputs("", stderr); -} - -// Set a symbol's definition filename and line -static void setSymbolFilename(Symbol &sym) { - sym.src = fstk_GetFileStack(); // This is `nullptr` for built-ins - sym.fileLine = sym.src ? lexer_GetLineNo() : 0; // This is 1 for built-ins + putc('\n', stderr); + } else if (sym.isBuiltin) { + fputs("\n", stderr); + } else { + fputs("\n", stderr); + } } // Update a symbol's definition filename and line static void updateSymbolFilename(Symbol &sym) { FileStackNode *oldSrc = sym.src; - setSymbolFilename(sym); + sym.src = fstk_GetFileStack(); + sym.fileLine = sym.src ? lexer_GetLineNo() : 0; + // If the old node was referenced, ensure the new one is if (oldSrc && oldSrc->referenced && oldSrc->ID != (uint32_t)-1) out_RegisterNode(sym.src); @@ -116,14 +113,15 @@ static void updateSymbolFilename(Symbol &sym) { } // Create a new symbol by name -static Symbol &createsymbol(std::string const &symName) { +static Symbol &createSymbol(std::string const &symName) { Symbol &sym = symbols[symName]; sym.name = symName; sym.isExported = false; sym.isBuiltin = false; sym.section = nullptr; - setSymbolFilename(sym); + sym.src = fstk_GetFileStack(); + sym.fileLine = sym.src ? lexer_GetLineNo() : 0; sym.ID = -1; return sym; @@ -256,17 +254,15 @@ static Symbol *createNonrelocSymbol(std::string const &symName, bool numeric) { Symbol *sym = sym_FindExactSymbol(symName); if (!sym) { - sym = &createsymbol(symName); + sym = &createSymbol(symName); } else if (sym->isDefined()) { error("'%s' already defined at ", symName.c_str()); dumpFilename(*sym); - putc('\n', stderr); return nullptr; // Don't allow overriding the symbol, that'd be bad! } else if (!numeric) { // The symbol has already been referenced, but it's not allowed error("'%s' already referenced at ", symName.c_str()); dumpFilename(*sym); - putc('\n', stderr); return nullptr; // Don't allow overriding the symbol, that'd be bad! } @@ -295,7 +291,6 @@ Symbol *sym_RedefEqu(std::string const &symName, int32_t value) { if (sym->isDefined() && sym->type != SYM_EQU) { error("'%s' already defined as non-EQU at ", symName.c_str()); dumpFilename(*sym); - putc('\n', stderr); return nullptr; } else if (sym->isBuiltin) { error("Built-in symbol '%s' cannot be redefined\n", symName.c_str()); @@ -343,7 +338,6 @@ Symbol *sym_RedefString(std::string const &symName, char const *value) { else error("'%s' already referenced at ", symName.c_str()); dumpFilename(*sym); - putc('\n', stderr); return nullptr; } else if (sym->isBuiltin) { error("Built-in symbol '%s' cannot be redefined\n", symName.c_str()); @@ -363,7 +357,7 @@ Symbol *sym_AddVar(std::string const &symName, int32_t value) { Symbol *sym = sym_FindExactSymbol(symName); if (!sym) { - sym = &createsymbol(symName); + sym = &createSymbol(symName); } else if (sym->isDefined() && sym->type != SYM_VAR) { error( "'%s' already defined as %s at ", @@ -371,7 +365,6 @@ Symbol *sym_AddVar(std::string const &symName, int32_t value) { sym->type == SYM_LABEL ? "label" : "constant" ); dumpFilename(*sym); - putc('\n', stderr); return sym; } else { updateSymbolFilename(*sym); @@ -393,11 +386,10 @@ static Symbol *addLabel(std::string const &symName) { Symbol *sym = sym_FindExactSymbol(symName); if (!sym) { - sym = &createsymbol(symName); + sym = &createSymbol(symName); } else if (sym->isDefined()) { error("'%s' already defined at ", symName.c_str()); dumpFilename(*sym); - putc('\n', stderr); return nullptr; } else { updateSymbolFilename(*sym); @@ -528,8 +520,8 @@ Symbol *sym_AddMacro(std::string const &symName, int32_t defLineNo, char const * sym->type = SYM_MACRO; sym->data = macro; - setSymbolFilename(*sym); // TODO: is this really necessary? - // The symbol is created at the line after the `endm`, + sym->src = fstk_GetFileStack(); + // The symbol is created at the line after the `ENDM`, // override this with the actual definition line sym->fileLine = defLineNo; @@ -547,9 +539,9 @@ Symbol *sym_Ref(std::string const &symName) { fatalerror("Local label reference '%s' in main scope\n", symName.c_str()); std::string fullName = *labelScope + symName; - sym = &createsymbol(fullName); + sym = &createSymbol(fullName); } else { - sym = &createsymbol(symName); + sym = &createSymbol(symName); } sym->type = SYM_REF; @@ -563,25 +555,17 @@ void sym_SetExportAll(bool set) { exportAll = set; } -static Symbol *createBuiltinSymbol(std::string const &symName) { - Symbol *sym = &createsymbol(symName); - - sym->isBuiltin = true; - sym->src = nullptr; - sym->fileLine = 1; // This is 0 for CLI-defined symbols - - return sym; -} - // Initialize the symboltable void sym_Init(time_t now) { - PCSymbol = createBuiltinSymbol("@"s); + PCSymbol = &createSymbol("@"s); PCSymbol->type = SYM_LABEL; PCSymbol->data = CallbackPC; + PCSymbol->isBuiltin = true; - _NARGSymbol = createBuiltinSymbol("_NARG"s); + _NARGSymbol = &createSymbol("_NARG"s); _NARGSymbol->type = SYM_EQU; _NARGSymbol->data = Callback_NARG; + _NARGSymbol->isBuiltin = true; _RSSymbol = sym_AddVar("_RS"s, 0); _RSSymbol->isBuiltin = true; diff --git a/test/asm/builtin-overwrite.err b/test/asm/builtin-overwrite.err index 1f77abd3..95d90465 100644 --- a/test/asm/builtin-overwrite.err +++ b/test/asm/builtin-overwrite.err @@ -3,53 +3,53 @@ error: builtin-overwrite.asm(36) -> builtin-overwrite.asm::tickle(5): error: builtin-overwrite.asm(36) -> builtin-overwrite.asm::tickle(6): Built-in symbol '__UTC_YEAR__' cannot be purged error: builtin-overwrite.asm(36) -> builtin-overwrite.asm::tickle(9): - '__UTC_YEAR__' already defined at + '__UTC_YEAR__' already defined at error: builtin-overwrite.asm(36) -> builtin-overwrite.asm::tickle(10): - '__UTC_YEAR__' already defined at + '__UTC_YEAR__' already defined at error: builtin-overwrite.asm(36) -> builtin-overwrite.asm::tickle(13): - '__UTC_YEAR__' already defined as constant at + '__UTC_YEAR__' already defined as constant at error: builtin-overwrite.asm(36) -> builtin-overwrite.asm::tickle(14): - '__UTC_YEAR__' already defined as constant at + '__UTC_YEAR__' already defined as constant at error: builtin-overwrite.asm(36) -> builtin-overwrite.asm::tickle(17): - '__UTC_YEAR__' already defined at + '__UTC_YEAR__' already defined at error: builtin-overwrite.asm(36) -> builtin-overwrite.asm::tickle(18): - '__UTC_YEAR__' already defined at + '__UTC_YEAR__' already defined at error: builtin-overwrite.asm(36) -> builtin-overwrite.asm::tickle(21): - '__UTC_YEAR__' already defined as constant at + '__UTC_YEAR__' already defined as constant at error: builtin-overwrite.asm(36) -> builtin-overwrite.asm::tickle(22): - '__UTC_YEAR__' already defined as constant at + '__UTC_YEAR__' already defined as constant at error: builtin-overwrite.asm(36) -> builtin-overwrite.asm::tickle(25): Built-in symbol '__UTC_YEAR__' cannot be redefined error: builtin-overwrite.asm(36) -> builtin-overwrite.asm::tickle(26): Built-in symbol '__UTC_YEAR__' cannot be redefined error: builtin-overwrite.asm(36) -> builtin-overwrite.asm::tickle(29): - '__UTC_YEAR__' already defined as non-EQUS at + '__UTC_YEAR__' already defined as non-EQUS at error: builtin-overwrite.asm(36) -> builtin-overwrite.asm::tickle(30): - '__UTC_YEAR__' already defined as non-EQUS at + '__UTC_YEAR__' already defined as non-EQUS at error: builtin-overwrite.asm(37) -> builtin-overwrite.asm::tickle(5): Built-in symbol '__ISO_8601_UTC__' cannot be purged error: builtin-overwrite.asm(37) -> builtin-overwrite.asm::tickle(6): Built-in symbol '__ISO_8601_UTC__' cannot be purged error: builtin-overwrite.asm(37) -> builtin-overwrite.asm::tickle(9): - '__ISO_8601_UTC__' already defined at + '__ISO_8601_UTC__' already defined at error: builtin-overwrite.asm(37) -> builtin-overwrite.asm::tickle(10): - '__ISO_8601_UTC__' already defined at + '__ISO_8601_UTC__' already defined at error: builtin-overwrite.asm(37) -> builtin-overwrite.asm::tickle(13): - '__ISO_8601_UTC__' already defined as constant at + '__ISO_8601_UTC__' already defined as constant at error: builtin-overwrite.asm(37) -> builtin-overwrite.asm::tickle(14): - '__ISO_8601_UTC__' already defined as constant at + '__ISO_8601_UTC__' already defined as constant at error: builtin-overwrite.asm(37) -> builtin-overwrite.asm::tickle(17): - '__ISO_8601_UTC__' already defined at + '__ISO_8601_UTC__' already defined at error: builtin-overwrite.asm(37) -> builtin-overwrite.asm::tickle(18): - '__ISO_8601_UTC__' already defined at + '__ISO_8601_UTC__' already defined at error: builtin-overwrite.asm(37) -> builtin-overwrite.asm::tickle(21): - '__ISO_8601_UTC__' already defined as constant at + '__ISO_8601_UTC__' already defined as constant at error: builtin-overwrite.asm(37) -> builtin-overwrite.asm::tickle(22): - '__ISO_8601_UTC__' already defined as constant at + '__ISO_8601_UTC__' already defined as constant at error: builtin-overwrite.asm(37) -> builtin-overwrite.asm::tickle(25): - '__ISO_8601_UTC__' already defined as non-EQU at + '__ISO_8601_UTC__' already defined as non-EQU at error: builtin-overwrite.asm(37) -> builtin-overwrite.asm::tickle(26): - '__ISO_8601_UTC__' already defined as non-EQU at + '__ISO_8601_UTC__' already defined as non-EQU at error: builtin-overwrite.asm(37) -> builtin-overwrite.asm::tickle(29): Built-in symbol '__ISO_8601_UTC__' cannot be redefined error: builtin-overwrite.asm(37) -> builtin-overwrite.asm::tickle(30): diff --git a/test/asm/rs-overwrite.asm b/test/asm/rs-overwrite.asm new file mode 100644 index 00000000..d2ca51b5 --- /dev/null +++ b/test/asm/rs-overwrite.asm @@ -0,0 +1,26 @@ +PURGE _RS +PRINTLN _RS + +DEF _RS EQU 1 +PRINTLN _RS + +DEF _RS = 2 ; this works +PRINTLN _RS + +DEF _RS EQUS "3" +PRINTLN _RS + +REDEF _RS = 4 ; this works +PRINTLN _RS + +REDEF _RS EQU 5 +PRINTLN _RS + +REDEF _RS EQUS "6" +PRINTLN _RS + +RSSET 7 ; this works +PRINTLN _RS + +RSRESET +PRINTLN _RS diff --git a/test/asm/rs-overwrite.err b/test/asm/rs-overwrite.err new file mode 100644 index 00000000..a5abba1c --- /dev/null +++ b/test/asm/rs-overwrite.err @@ -0,0 +1,11 @@ +error: rs-overwrite.asm(1): + Built-in symbol '_RS' cannot be purged +error: rs-overwrite.asm(4): + '_RS' already defined at +error: rs-overwrite.asm(10): + '_RS' already defined at rs-overwrite.asm(7) +error: rs-overwrite.asm(16): + '_RS' already defined as non-EQU at rs-overwrite.asm(13) +error: rs-overwrite.asm(19): + '_RS' already defined as non-EQUS at rs-overwrite.asm(13) +error: Assembly aborted (5 errors)! diff --git a/test/asm/rs-overwrite.out b/test/asm/rs-overwrite.out new file mode 100644 index 00000000..083adb5b --- /dev/null +++ b/test/asm/rs-overwrite.out @@ -0,0 +1,9 @@ +$0 +$0 +$2 +$2 +$4 +$4 +$4 +$7 +$0