mirror of
https://github.com/gbdev/rgbds.git
synced 2025-11-20 18:22:07 +00:00
Move all common error checks together inside mergeSections
This commit is contained in:
@@ -127,10 +127,27 @@ static void checkFragmentCompat(Section &target, Section &other) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void mergeSections(Section &target, std::unique_ptr<Section> &&other, SectionModifier mod) {
|
static void mergeSections(Section &target, std::unique_ptr<Section> &&other) {
|
||||||
// Common checks
|
if (target.modifier != other->modifier) {
|
||||||
|
fprintf(
|
||||||
if (target.type != other->type) {
|
stderr,
|
||||||
|
"error: Section \"%s\" is defined as %s at ",
|
||||||
|
target.name.c_str(),
|
||||||
|
sectionModNames[target.modifier]
|
||||||
|
);
|
||||||
|
target.src->dump(target.lineNo);
|
||||||
|
fprintf(stderr, ", but as %s at ", sectionModNames[other->modifier]);
|
||||||
|
other->src->dump(other->lineNo);
|
||||||
|
putc('\n', stderr);
|
||||||
|
exit(1);
|
||||||
|
} else if (other->modifier == SECTION_NORMAL) {
|
||||||
|
fprintf(stderr, "error: Section \"%s\" is defined at ", target.name.c_str());
|
||||||
|
target.src->dump(target.lineNo);
|
||||||
|
fputs(", but also at ", stderr);
|
||||||
|
other->src->dump(other->lineNo);
|
||||||
|
putc('\n', stderr);
|
||||||
|
exit(1);
|
||||||
|
} else if (target.type != other->type) {
|
||||||
fprintf(
|
fprintf(
|
||||||
stderr,
|
stderr,
|
||||||
"error: Section \"%s\" is defined with type %s at ",
|
"error: Section \"%s\" is defined with type %s at ",
|
||||||
@@ -163,7 +180,7 @@ static void mergeSections(Section &target, std::unique_ptr<Section> &&other, Sec
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (mod) {
|
switch (other->modifier) {
|
||||||
case SECTION_UNION:
|
case SECTION_UNION:
|
||||||
checkSectUnionCompat(target, *other);
|
checkSectUnionCompat(target, *other);
|
||||||
if (other->size > target.size)
|
if (other->size > target.size)
|
||||||
@@ -173,8 +190,6 @@ static void mergeSections(Section &target, std::unique_ptr<Section> &&other, Sec
|
|||||||
case SECTION_FRAGMENT:
|
case SECTION_FRAGMENT:
|
||||||
checkFragmentCompat(target, *other);
|
checkFragmentCompat(target, *other);
|
||||||
// Append `other` to `target`
|
// Append `other` to `target`
|
||||||
// Note that the order in which fragments are stored in the `nextu` list does not
|
|
||||||
// really matter, only that offsets are properly computed
|
|
||||||
other->offset = target.size;
|
other->offset = target.size;
|
||||||
target.size += other->size;
|
target.size += other->size;
|
||||||
// Normally we'd check that `sect_HasData`, but SDCC areas may be `_INVALID` here
|
// Normally we'd check that `sect_HasData`, but SDCC areas may be `_INVALID` here
|
||||||
@@ -192,35 +207,16 @@ static void mergeSections(Section &target, std::unique_ptr<Section> &&other, Sec
|
|||||||
unreachable_();
|
unreachable_();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Note that the order in which fragments are stored in the `nextu` list does not
|
||||||
|
// really matter, only that offsets were properly computed above
|
||||||
other->nextu = std::move(target.nextu);
|
other->nextu = std::move(target.nextu);
|
||||||
target.nextu = std::move(other);
|
target.nextu = std::move(other);
|
||||||
}
|
}
|
||||||
|
|
||||||
void sect_AddSection(std::unique_ptr<Section> &§ion) {
|
void sect_AddSection(std::unique_ptr<Section> &§ion) {
|
||||||
// Check if the section already exists
|
// Check if the section already exists
|
||||||
if (Section *other = sect_GetSection(section->name); other) {
|
if (Section *target = sect_GetSection(section->name); target) {
|
||||||
if (section->modifier != other->modifier) {
|
mergeSections(*target, std::move(section));
|
||||||
fprintf(
|
|
||||||
stderr,
|
|
||||||
"error: Section \"%s\" is defined as %s at ",
|
|
||||||
section->name.c_str(),
|
|
||||||
sectionModNames[section->modifier]
|
|
||||||
);
|
|
||||||
section->src->dump(section->lineNo);
|
|
||||||
fprintf(stderr, ", but as %s at ", sectionModNames[other->modifier]);
|
|
||||||
other->src->dump(other->lineNo);
|
|
||||||
putc('\n', stderr);
|
|
||||||
exit(1);
|
|
||||||
} else if (section->modifier == SECTION_NORMAL) {
|
|
||||||
fprintf(stderr, "error: Section \"%s\" is defined at ", section->name.c_str());
|
|
||||||
section->src->dump(section->lineNo);
|
|
||||||
fputs(", but also at ", stderr);
|
|
||||||
other->src->dump(other->lineNo);
|
|
||||||
putc('\n', stderr);
|
|
||||||
exit(1);
|
|
||||||
} else {
|
|
||||||
mergeSections(*other, std::move(section), section->modifier);
|
|
||||||
}
|
|
||||||
} else if (section->modifier == SECTION_UNION && sect_HasData(section->type)) {
|
} else if (section->modifier == SECTION_UNION && sect_HasData(section->type)) {
|
||||||
errx(
|
errx(
|
||||||
"Section \"%s\" is of type %s, which cannot be unionized",
|
"Section \"%s\" is of type %s, which cannot be unionized",
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
error: Section "Same" is defined at section-normal/same-name/b.asm(1), but also at section-normal/same-name/a.asm(1)
|
error: Section "Same" is defined at section-normal/same-name/a.asm(1), but also at section-normal/same-name/b.asm(1)
|
||||||
|
|||||||
Reference in New Issue
Block a user