Built-in symbols are "<builtin>", not "<command-line>" (#1362)

This commit is contained in:
Sylvie
2024-03-19 16:01:45 -04:00
committed by GitHub
parent fec2266dd8
commit 554778da5b
7 changed files with 103 additions and 84 deletions

View File

@@ -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;
}

View File

@@ -143,18 +143,13 @@ static void writesymbol(Symbol const &sym, FILE *file) {
}
}
static void registerSymbol(Symbol &sym) {
sym.ID = objectSymbols.size();
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);
}
// 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 writerpn(std::vector<uint8_t> &rpnexpr, std::vector<uint8_t> const &rpn) {
@@ -193,7 +188,8 @@ static void writerpn(std::vector<uint8_t> &rpnexpr, std::vector<uint8_t> 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<uint8_t> &rpnexpr, std::vector<uint8_t> 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;

View File

@@ -62,7 +62,6 @@ static int32_t CallbackPC() {
int32_t Symbol::getValue() const {
assert(std::holds_alternative<int32_t>(data) || std::holds_alternative<int32_t (*)()>(data));
if (int32_t const *value = std::get_if<int32_t>(&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("<command-line>", stderr);
else
fputs("<builtin>", 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("<builtin>\n", stderr);
} else {
fputs("<command-line>\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;

View File

@@ -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 <command-line>
'__UTC_YEAR__' already defined at <builtin>
error: builtin-overwrite.asm(36) -> builtin-overwrite.asm::tickle(10):
'__UTC_YEAR__' already defined at <command-line>
'__UTC_YEAR__' already defined at <builtin>
error: builtin-overwrite.asm(36) -> builtin-overwrite.asm::tickle(13):
'__UTC_YEAR__' already defined as constant at <command-line>
'__UTC_YEAR__' already defined as constant at <builtin>
error: builtin-overwrite.asm(36) -> builtin-overwrite.asm::tickle(14):
'__UTC_YEAR__' already defined as constant at <command-line>
'__UTC_YEAR__' already defined as constant at <builtin>
error: builtin-overwrite.asm(36) -> builtin-overwrite.asm::tickle(17):
'__UTC_YEAR__' already defined at <command-line>
'__UTC_YEAR__' already defined at <builtin>
error: builtin-overwrite.asm(36) -> builtin-overwrite.asm::tickle(18):
'__UTC_YEAR__' already defined at <command-line>
'__UTC_YEAR__' already defined at <builtin>
error: builtin-overwrite.asm(36) -> builtin-overwrite.asm::tickle(21):
'__UTC_YEAR__' already defined as constant at <command-line>
'__UTC_YEAR__' already defined as constant at <builtin>
error: builtin-overwrite.asm(36) -> builtin-overwrite.asm::tickle(22):
'__UTC_YEAR__' already defined as constant at <command-line>
'__UTC_YEAR__' already defined as constant at <builtin>
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 <command-line>
'__UTC_YEAR__' already defined as non-EQUS at <builtin>
error: builtin-overwrite.asm(36) -> builtin-overwrite.asm::tickle(30):
'__UTC_YEAR__' already defined as non-EQUS at <command-line>
'__UTC_YEAR__' already defined as non-EQUS at <builtin>
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 <command-line>
'__ISO_8601_UTC__' already defined at <builtin>
error: builtin-overwrite.asm(37) -> builtin-overwrite.asm::tickle(10):
'__ISO_8601_UTC__' already defined at <command-line>
'__ISO_8601_UTC__' already defined at <builtin>
error: builtin-overwrite.asm(37) -> builtin-overwrite.asm::tickle(13):
'__ISO_8601_UTC__' already defined as constant at <command-line>
'__ISO_8601_UTC__' already defined as constant at <builtin>
error: builtin-overwrite.asm(37) -> builtin-overwrite.asm::tickle(14):
'__ISO_8601_UTC__' already defined as constant at <command-line>
'__ISO_8601_UTC__' already defined as constant at <builtin>
error: builtin-overwrite.asm(37) -> builtin-overwrite.asm::tickle(17):
'__ISO_8601_UTC__' already defined at <command-line>
'__ISO_8601_UTC__' already defined at <builtin>
error: builtin-overwrite.asm(37) -> builtin-overwrite.asm::tickle(18):
'__ISO_8601_UTC__' already defined at <command-line>
'__ISO_8601_UTC__' already defined at <builtin>
error: builtin-overwrite.asm(37) -> builtin-overwrite.asm::tickle(21):
'__ISO_8601_UTC__' already defined as constant at <command-line>
'__ISO_8601_UTC__' already defined as constant at <builtin>
error: builtin-overwrite.asm(37) -> builtin-overwrite.asm::tickle(22):
'__ISO_8601_UTC__' already defined as constant at <command-line>
'__ISO_8601_UTC__' already defined as constant at <builtin>
error: builtin-overwrite.asm(37) -> builtin-overwrite.asm::tickle(25):
'__ISO_8601_UTC__' already defined as non-EQU at <command-line>
'__ISO_8601_UTC__' already defined as non-EQU at <builtin>
error: builtin-overwrite.asm(37) -> builtin-overwrite.asm::tickle(26):
'__ISO_8601_UTC__' already defined as non-EQU at <command-line>
'__ISO_8601_UTC__' already defined as non-EQU at <builtin>
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):

26
test/asm/rs-overwrite.asm Normal file
View File

@@ -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

11
test/asm/rs-overwrite.err Normal file
View File

@@ -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 <builtin>
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)!

View File

@@ -0,0 +1,9 @@
$0
$0
$2
$2
$4
$4
$4
$7
$0