[lld] r277703 - [ELF] Linkerscript: remove repeated sections in filter()
Eugene Leviant via llvm-commits
llvm-commits at lists.llvm.org
Thu Aug 4 01:20:24 PDT 2016
Author: evgeny777
Date: Thu Aug 4 03:20:23 2016
New Revision: 277703
URL: http://llvm.org/viewvc/llvm-project?rev=277703&view=rev
Log:
[ELF] Linkerscript: remove repeated sections in filter()
Modified:
lld/trunk/ELF/LinkerScript.cpp
lld/trunk/test/ELF/linkerscript/linkerscript-sections-constraint.s
Modified: lld/trunk/ELF/LinkerScript.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/LinkerScript.cpp?rev=277703&r1=277702&r2=277703&view=diff
==============================================================================
--- lld/trunk/ELF/LinkerScript.cpp (original)
+++ lld/trunk/ELF/LinkerScript.cpp Thu Aug 4 03:20:23 2016
@@ -192,6 +192,11 @@ void LinkerScript<ELFT>::createSections(
filter();
}
+template <class R, class T>
+static inline void removeElementsIf(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 <class ELFT> void LinkerScript<ELFT>::filter() {
// In this loop, we remove output sections if they don't satisfy
@@ -204,19 +209,14 @@ template <class ELFT> void LinkerScript<
if (Cmd->Constraint == ConstraintKind::NoConstraint)
continue;
- auto It = llvm::find_if(*OutputSections, [&](OutputSectionBase<ELFT> *S) {
- return S->getName() == Cmd->Name;
- });
- if (It == OutputSections->end())
- continue;
-
- OutputSectionBase<ELFT> *Sec = *It;
- bool Writable = (Sec->getFlags() & SHF_WRITE);
- bool RO = (Cmd->Constraint == ConstraintKind::ReadOnly);
- bool RW = (Cmd->Constraint == ConstraintKind::ReadWrite);
+ removeElementsIf(*OutputSections, [&](OutputSectionBase<ELFT> *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));
+ });
}
}
Modified: lld/trunk/test/ELF/linkerscript/linkerscript-sections-constraint.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/linkerscript/linkerscript-sections-constraint.s?rev=277703&r1=277702&r2=277703&view=diff
==============================================================================
--- lld/trunk/test/ELF/linkerscript/linkerscript-sections-constraint.s (original)
+++ lld/trunk/test/ELF/linkerscript/linkerscript-sections-constraint.s Thu Aug 4 03:20:23 2016
@@ -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 @@ writable:
.section .readable, "a"
readable:
.long 2
+
+.section .foo.1, "awx"
+ .long 0
+
+.section .foo.2, "aw"
+ .long 0
More information about the llvm-commits
mailing list