Fail-safe treat 16-bit alignment as a fixed address even in RGBLINK

RGBASM does this itself, so should not output sections with 16-bit
alignment, but an invalid object file could otherwise cause
`getPlacement` to infinitely loop.
This commit is contained in:
Rangi
2026-07-15 22:46:57 -04:00
parent 5aa7067876
commit b0948566bb
2 changed files with 13 additions and 0 deletions
+2
View File
@@ -144,6 +144,8 @@ static std::optional<size_t> getPlacement(Section const &section, MemoryLocation
location.address = section.org;
} else if (section.isAlignFixed) {
// Move to next aligned location
// We have previously ensured alignment to 15 or fewer bits, so this will progress
assume(section.alignMask < (1 << 16) - 1);
// Move back to alignment boundary
location.address -= section.alignOfs;
// Ensure we're there (e.g. on first check)
+11
View File
@@ -321,6 +321,17 @@ static void doSanityChecks(Section &section) {
);
}
}
// An alignment of 16 is impossible to output from RGBASM, since it's treated as
// fixing the address, but is still satisfiable. A fixed address different from the
// alignment offset would not be, but we checked for that already above.
if (section.isAlignFixed && section.alignMask == (1 << 16) - 1) {
assume(!section.isAddressFixed || section.org == section.alignOfs);
section.isAddressFixed = true;
section.org = section.alignOfs;
section.isAlignFixed = false;
section.alignMask = section.alignOfs = 0;
}
}
void sect_DoSanityChecks() {