[lld] r282099 - Implement ONLY_IF_RO/ONLY_IF_RW like bfd.

Rafael Espindola via llvm-commits llvm-commits at lists.llvm.org
Wed Sep 21 11:33:44 PDT 2016


Author: rafael
Date: Wed Sep 21 13:33:44 2016
New Revision: 282099

URL: http://llvm.org/viewvc/llvm-project?rev=282099&view=rev
Log:
Implement ONLY_IF_RO/ONLY_IF_RW like bfd.

The actual logic is to keep the output section if the output section
would have been ro/rw.

This is both simpler and more practical, as the intention is linker
scripts is to always keep of of a pair of ONLY_IF_RO/ONLY_IF_RW.

Added:
    lld/trunk/test/ELF/linkerscript/sections-constraint5.s
Modified:
    lld/trunk/ELF/LinkerScript.cpp

Modified: lld/trunk/ELF/LinkerScript.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/LinkerScript.cpp?rev=282099&r1=282098&r2=282099&view=diff
==============================================================================
--- lld/trunk/ELF/LinkerScript.cpp (original)
+++ lld/trunk/ELF/LinkerScript.cpp Wed Sep 21 13:33:44 2016
@@ -138,22 +138,17 @@ getComparator(SortSectionPolicy K) {
   }
 }
 
-static bool checkConstraint(uint64_t Flags, ConstraintKind Kind) {
-  bool RO = (Kind == ConstraintKind::ReadOnly);
-  bool RW = (Kind == ConstraintKind::ReadWrite);
-  bool Writable = Flags & SHF_WRITE;
-  return !(RO && Writable) && !(RW && !Writable);
-}
-
 template <class ELFT>
 static bool matchConstraints(ArrayRef<InputSectionBase<ELFT> *> Sections,
                              ConstraintKind Kind) {
   if (Kind == ConstraintKind::NoConstraint)
     return true;
-  return llvm::all_of(Sections, [=](InputSectionData *Sec2) {
+  bool IsRW = llvm::any_of(Sections, [=](InputSectionData *Sec2) {
     auto *Sec = static_cast<InputSectionBase<ELFT> *>(Sec2);
-    return checkConstraint(Sec->getSectionHdr()->sh_flags, Kind);
+    return Sec->getSectionHdr()->sh_flags & SHF_WRITE;
   });
+  return (IsRW && Kind == ConstraintKind::ReadWrite) ||
+         (!IsRW && Kind == ConstraintKind::ReadOnly);
 }
 
 static void sortSections(InputSectionData **Begin, InputSectionData **End,

Added: lld/trunk/test/ELF/linkerscript/sections-constraint5.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/linkerscript/sections-constraint5.s?rev=282099&view=auto
==============================================================================
--- lld/trunk/test/ELF/linkerscript/sections-constraint5.s (added)
+++ lld/trunk/test/ELF/linkerscript/sections-constraint5.s Wed Sep 21 13:33:44 2016
@@ -0,0 +1,32 @@
+# REQUIRES: x86
+# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o
+# RUN: echo "SECTIONS { \
+# RUN:         bar : ONLY_IF_RO { sym1 = .; *(foo*) } \
+# RUN:         bar : ONLY_IF_RW { sym2 = .; *(foo*) } \
+# RUN:       }" > %t.script
+
+# RUN: ld.lld -o %t -T %t.script %t.o
+# RUN: llvm-readobj -s -t %t | FileCheck %s
+
+# CHECK: Sections [
+# CHECK:      Name: bar
+# CHECK-NEXT: Type: SHT_PROGBITS
+# CHECK-NEXT: Flags [
+# CHECK-NEXT:   SHF_ALLOC
+# CHECK-NEXT:   SHF_WRITE
+# CHECK-NEXT: ]
+# CHECK-NEXT: Address:
+# CHECK-NEXT: Offset:
+# CHECK-NEXT: Size: 2
+
+# CHECK: Symbols [
+# CHECK-NOT: sym1
+# CHECK:     sym2
+# CHECK-NOT: sym1
+
+.section foo1,"a"
+.byte 0
+
+.section foo2,"aw"
+.byte 0
+




More information about the llvm-commits mailing list