mirror of
https://github.com/gbdev/rgbds.git
synced 2025-11-20 10:12:06 +00:00
Prevent purging referenced symbols
This is an immediate fix for #492, although #342 is needed to implement the desired functionality.
This commit is contained in:
@@ -33,6 +33,7 @@ struct sSymbol {
|
||||
bool isConstant; /* Whether the symbol's value is currently known */
|
||||
bool isExported; /* Whether the symbol is to be exported */
|
||||
bool isBuiltin; /* Whether the symbol is a built-in */
|
||||
bool isReferenced; /* Whether the symbol is referenced in a RPN expr */
|
||||
struct sSymbol *pScope;
|
||||
struct sSymbol *pNext;
|
||||
struct Section *pSection;
|
||||
|
||||
@@ -127,6 +127,7 @@ static struct sSymbol *createsymbol(char const *s)
|
||||
(*ppsym)->isConstant = false;
|
||||
(*ppsym)->isExported = false;
|
||||
(*ppsym)->isBuiltin = false;
|
||||
(*ppsym)->isReferenced = false;
|
||||
(*ppsym)->pScope = NULL;
|
||||
(*ppsym)->pNext = NULL;
|
||||
(*ppsym)->pSection = NULL;
|
||||
@@ -211,6 +212,11 @@ struct sSymbol *sym_FindSymbol(char const *tzName)
|
||||
return findsymbol(tzName, pscope);
|
||||
}
|
||||
|
||||
static inline bool isReferenced(struct sSymbol const *sym)
|
||||
{
|
||||
return sym->isReferenced;
|
||||
}
|
||||
|
||||
/*
|
||||
* Purge a symbol
|
||||
*/
|
||||
@@ -230,6 +236,9 @@ void sym_Purge(char const *tzName)
|
||||
yyerror("'%s' not defined", tzName);
|
||||
} else if ((*ppSym)->isBuiltin) {
|
||||
yyerror("Built-in symbol '%s' cannot be purged", tzName);
|
||||
} else if (isReferenced(*ppSym)) {
|
||||
yyerror("Symbol \"%s\" is referenced and thus cannot be purged",
|
||||
tzName);
|
||||
} else {
|
||||
struct sSymbol *pSym;
|
||||
|
||||
@@ -468,6 +477,7 @@ struct sSymbol *sym_AddReloc(char const *tzSym)
|
||||
else if (sym_IsDefined(nsym))
|
||||
yyerror("'%s' already defined in %s(%d)", tzSym,
|
||||
nsym->tzFileName, nsym->nFileLine);
|
||||
/* If the symbol already exists as a ref, just "take over" it */
|
||||
|
||||
nsym->nValue = nPC;
|
||||
nsym->type = SYM_LABEL;
|
||||
@@ -544,6 +554,7 @@ void sym_Ref(char const *tzSym)
|
||||
nsym = createsymbol(tzSym);
|
||||
nsym->type = SYM_REF;
|
||||
}
|
||||
nsym->isReferenced = true;
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
23
test/asm/purge-ref.asm
Normal file
23
test/asm/purge-ref.asm
Normal file
@@ -0,0 +1,23 @@
|
||||
SECTION "test", ROM0 ; Important: do not purge this!
|
||||
|
||||
dw ref
|
||||
PURGE ref
|
||||
|
||||
OK:
|
||||
PURGE OK
|
||||
|
||||
dw NotOK
|
||||
NotOK:
|
||||
PURGE NotOK
|
||||
|
||||
EvenLessOK:
|
||||
dw EvenLessOK
|
||||
PURGE EvenLessOK
|
||||
|
||||
SECTION "fixed", ROM0[0]
|
||||
|
||||
Maybe:
|
||||
dw Maybe
|
||||
; This is currently fine because the expression above is fully evaluated
|
||||
; above, so it's fine as of now... but changing it might make sense
|
||||
PURGE Maybe
|
||||
7
test/asm/purge-ref.err
Normal file
7
test/asm/purge-ref.err
Normal file
@@ -0,0 +1,7 @@
|
||||
ERROR: purge-ref.asm(4):
|
||||
Symbol "ref" is referenced and thus cannot be purged
|
||||
ERROR: purge-ref.asm(11):
|
||||
Symbol "NotOK" is referenced and thus cannot be purged
|
||||
ERROR: purge-ref.asm(15):
|
||||
Symbol "EvenLessOK" is referenced and thus cannot be purged
|
||||
error: Assembly aborted (3 errors)!
|
||||
0
test/asm/purge-ref.out
Normal file
0
test/asm/purge-ref.out
Normal file
Reference in New Issue
Block a user