Index: ELF/LinkerScript.cpp =================================================================== --- ELF/LinkerScript.cpp +++ ELF/LinkerScript.cpp @@ -190,6 +190,11 @@ filter(); } +template +static inline void removeElements(R &Range, const T &Pred) { + Range.erase(std::remove_if(Range.begin(), Range.end(), Pred), Range.end()); +} + // Process ONLY_IF_RO and ONLY_IF_RW. template void LinkerScript::filter() { // In this loop, we remove output sections if they don't satisfy @@ -202,19 +207,14 @@ if (Cmd->Constraint == ConstraintKind::NoConstraint) continue; - auto It = llvm::find_if(*OutputSections, [&](OutputSectionBase *S) { - return S->getName() == Cmd->Name; - }); - if (It == OutputSections->end()) - continue; - - OutputSectionBase *Sec = *It; - bool Writable = (Sec->getFlags() & SHF_WRITE); - bool RO = (Cmd->Constraint == ConstraintKind::ReadOnly); - bool RW = (Cmd->Constraint == ConstraintKind::ReadWrite); + removeElements(*OutputSections, [&](OutputSectionBase *S) { + bool Writable = (S->getFlags() & SHF_WRITE); + bool RO = (Cmd->Constraint == ConstraintKind::ReadOnly); + bool RW = (Cmd->Constraint == ConstraintKind::ReadWrite); - if ((RO && Writable) || (RW && !Writable)) - OutputSections->erase(It); + return S->getName() == Cmd->Name && + ((RO && Writable) || (RW && !Writable)); + }); } } Index: test/ELF/linkerscript/linkerscript-sections-constraint.s =================================================================== --- test/ELF/linkerscript/linkerscript-sections-constraint.s +++ test/ELF/linkerscript/linkerscript-sections-constraint.s @@ -9,8 +9,8 @@ # BASE: Sections: # BASE-NEXT: Idx Name Size Address Type # BASE-NEXT: 0 00000000 0000000000000000 -# BASE-NEXT: 1 .writable 00000004 0000000000000190 DATA -# BASE-NEXT: 2 .readable 00000004 0000000000000194 DATA +# BASE-NEXT: 1 .writable 00000004 0000000000000200 DATA +# BASE-NEXT: 2 .readable 00000004 0000000000000204 DATA # RUN: echo "SECTIONS { \ # RUN: .writable : ONLY_IF_RO { *(.writable) } \ @@ -22,6 +22,14 @@ # NOSECTIONS-NOT: .writable # NOSECTIONS-NOT: .readable +# RUN: echo "SECTIONS { \ +# RUN: .foo : ONLY_IF_RO { *(.foo.*) }}" > %t.script +# RUN: ld.lld -o %t1 --script %t.script %t +# RUN: llvm-objdump -section-headers %t1 | \ +# RUN: FileCheck -check-prefix=NOSECTIONS2 %s +# NOSECTIONS2: Sections: +# NOSECTIONS2-NOT: .foo + .global _start _start: nop @@ -33,3 +41,9 @@ .section .readable, "a" readable: .long 2 + +.section .foo.1, "awx" + .long 0 + +.section .foo.2, "aw" + .long 0