[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