Previously filtering that was used worked incorrectly.
For example for next script it would just remove both sections completely:
SECTIONS {
. = 0x1000;
.aaa : ONLY_IF_RW { *(.aaa.*) }
. = 0x2000;
.aaa : ONLY_IF_RO { *(.aaa.*) }
}
Patch fixes above issues and adds testcase showing the issue. Testcase is a subset of
FreeBSD script which has:
.eh_frame : ONLY_IF_RO { KEEP (*(.eh_frame)) }
...
.eh_frame : ONLY_IF_RW { KEEP (*(.eh_frame)) }As a side result of a change, behavior of these commands is looks to be equal with ld now.
Hoist RO and RW because they are actually constants.
bool RO = (Kind == ConstraintKind::ReadOnly); bool RW = (Kind == ConstraintKind:: ReadWriter); return !llvm::any_of(Sections, [=](InputSectionBase<ELFT> *Sec) { bool Writable = ...; return (RO && Writable) || (RW && !Writable); });