mirror of
https://github.com/gbdev/rgbds.git
synced 2025-11-20 18:22:07 +00:00
Report attempts to assign a SDCC area in a way inconsistent with its data
This actually avoids breaking the (segfaulting) invariant that a section whose type "has data" has as many bytes of `->data` as its `->size`.
This commit is contained in:
@@ -594,10 +594,29 @@ static void placeSection(std::string const &name, bool isOptional) {
|
|||||||
assume(section->offset == 0);
|
assume(section->offset == 0);
|
||||||
// Check that the linker script doesn't contradict what the code says.
|
// Check that the linker script doesn't contradict what the code says.
|
||||||
if (section->type == SECTTYPE_INVALID) {
|
if (section->type == SECTTYPE_INVALID) {
|
||||||
|
// A section that has data must get assigned a type that requires data.
|
||||||
|
if (!sect_HasData(activeType) && !section->data.empty()) {
|
||||||
|
scriptError(
|
||||||
|
context,
|
||||||
|
"\"%s\" is specified to be a %s section, but it contains data",
|
||||||
|
name.c_str(),
|
||||||
|
typeInfo.name.c_str()
|
||||||
|
);
|
||||||
|
} else if (sect_HasData(activeType) && section->data.empty() && section->size != 0) {
|
||||||
|
// A section that lacks data can only be assigned to a type that requires data
|
||||||
|
// if it's empty.
|
||||||
|
scriptError(
|
||||||
|
context,
|
||||||
|
"\"%s\" is specified to be a %s section, but it doesn't contain data",
|
||||||
|
name.c_str(),
|
||||||
|
typeInfo.name.c_str()
|
||||||
|
);
|
||||||
|
} else {
|
||||||
// SDCC areas don't have a type assigned yet, so the linker script is used to give them one.
|
// SDCC areas don't have a type assigned yet, so the linker script is used to give them one.
|
||||||
for (Section *fragment = section; fragment; fragment = fragment->nextu.get()) {
|
for (Section *fragment = section; fragment; fragment = fragment->nextu.get()) {
|
||||||
fragment->type = activeType;
|
fragment->type = activeType;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
} else if (section->type != activeType) {
|
} else if (section->type != activeType) {
|
||||||
scriptError(
|
scriptError(
|
||||||
context,
|
context,
|
||||||
|
|||||||
Reference in New Issue
Block a user