ref: 02fe73d1f38b702b7a94a8b4934eb9e829eb4278
parent: 74f43d4e094d6ed6048d784a9275f0a7a26a7097
author: ISSOtm <[email protected]>
date: Thu Sep 19 11:06:48 EDT 2019
Make `BANK("Section")` known at assembling time when possible If the target section is in the current file and its bank is known, this means this value is known prior to linking.
--- a/src/asm/rpn.c
+++ b/src/asm/rpn.c
@@ -182,17 +182,25 @@
return;
}
- if (!sym_isConstant(tzSym)) {
+ if (sym_isConstant(tzSym)) {
+ yyerror("BANK argument must be a relocatable identifier");
+ } else {
rpn_Init(expr);
sym_Ref(tzSym);
- expr->isReloc = 1;
pushbyte(expr, RPN_BANK_SYM);
- while (*tzSym)
- pushbyte(expr, *tzSym++);
+ for (unsigned int i = 0; tzSym[i]; i++)
+ pushbyte(expr, tzSym[i]);
pushbyte(expr, 0);
expr->nRPNPatchSize += 5;
- } else {
- yyerror("BANK argument must be a relocatable identifier");
+
+ /* If the symbol didn't exist, `sym_Ref` created it */
+ struct sSymbol *pSymbol = sym_FindSymbol(tzSym);
+
+ if (pSymbol->pSection && pSymbol->pSection->nBank != -1)
+ /* Symbol's section is known and bank's fixed */
+ expr->nVal = pSymbol->pSection->nBank;
+ else
+ expr->isReloc = 1;
}
}
@@ -200,11 +208,16 @@
{
rpn_Init(expr);
- /*
- * This symbol is not really relocatable, but this makes the assembler
- * write this expression as a RPN patch to the object file.
- */
- expr->isReloc = 1;
+ struct Section *pSection = out_FindSectionByName(tzSectionName);
+
+ if (pSection && pSection->nBank != -1)
+ expr->nVal = pSection->nBank;
+ else
+ /*
+ * This is not really relocatable, but this makes the assembler
+ * write this expression as a RPN patch to the object file.
+ */
+ expr->isReloc = 1;
pushbyte(expr, RPN_BANK_SECT);
expr->nRPNPatchSize++;