[PATCH] D23451: [ELF] - Linkerscript: fix VA value assigned to sections when using constraints.

George Rimar via llvm-commits llvm-commits at lists.llvm.org
Fri Aug 12 13:38:08 PDT 2016


grimar updated this revision to Diff 67901.
grimar added a comment.

- Simplified.


https://reviews.llvm.org/D23451

Files:
  ELF/LinkerScript.cpp
  test/ELF/linkerscript/linkerscript-multi-sections-constraint.s

Index: test/ELF/linkerscript/linkerscript-multi-sections-constraint.s
===================================================================
--- test/ELF/linkerscript/linkerscript-multi-sections-constraint.s
+++ test/ELF/linkerscript/linkerscript-multi-sections-constraint.s
@@ -15,6 +15,21 @@
 # CHECK-NEXT:   4 .shstrtab     00000026 0000000000000000
 # CHECK-NEXT:   5 .strtab       00000008 0000000000000000
 
+# RUN: echo "SECTIONS { \
+# RUN:  . = 0x1000; .aaa : ONLY_IF_RW { *(.aaa.*) } \
+# RUN:  . = 0x2000; .aaa : ONLY_IF_RO { *(.aaa.*) } } " > %t2.script
+# RUN: ld.lld -o %t2 --script %t2.script %t
+# RUN: llvm-objdump -section-headers %t2 | FileCheck %s --check-prefix=REV
+
+# REV:      Sections:
+# REV-NEXT: Idx Name          Size      Address          Type
+# REV-NEXT:   0               00000000 0000000000000000
+# REV-NEXT:   1 .aaa          00000010 0000000000001000 DATA
+# REV-NEXT:   2 .text         00000001 0000000000002000 TEXT DATA
+# REV-NEXT:   3 .symtab       00000030 0000000000000000
+# REV-NEXT:   4 .shstrtab     00000026 0000000000000000
+# REV-NEXT:   5 .strtab       00000008 0000000000000000
+
 .global _start
 _start:
  nop
Index: ELF/LinkerScript.cpp
===================================================================
--- ELF/LinkerScript.cpp
+++ ELF/LinkerScript.cpp
@@ -216,13 +216,20 @@
 }
 
 template <class ELFT>
-static bool matchConstraints(ArrayRef<InputSectionBase<ELFT> *> Sections,
-                             ConstraintKind Kind) {
+static bool checkConstraint(typename ELFT::uint Flags, ConstraintKind Kind) {
   bool RO = (Kind == ConstraintKind::ReadOnly);
   bool RW = (Kind == ConstraintKind::ReadWrite);
-  return !llvm::any_of(Sections, [=](InputSectionBase<ELFT> *Sec) {
-    bool Writable = Sec->getSectionHdr()->sh_flags & SHF_WRITE;
-    return (RO && Writable) || (RW && !Writable);
+  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, [=](InputSectionBase<ELFT> *Sec) {
+    return checkConstraint<ELFT>(Sec->getSectionHdr()->sh_flags, Kind);
   });
 }
 
@@ -330,6 +337,19 @@
   }
 }
 
+template <class ELFT>
+static OutputSectionBase<ELFT> *
+findSection(OutputSectionCommand &Cmd,
+            ArrayRef<OutputSectionBase<ELFT> *> Sections) {
+  for (OutputSectionBase<ELFT> *Sec : Sections) {
+    if (Sec->getName() != Cmd.Name)
+      continue;
+    if (checkConstraint<ELFT>(Sec->getFlags(), Cmd.Constraint))
+      return Sec;
+  }
+  return nullptr;
+}
+
 template <class ELFT> void LinkerScript<ELFT>::assignAddresses() {
   // Orphan sections are sections present in the input files which
   // are not explicitly placed into the output file by the linker script.
@@ -363,12 +383,9 @@
     }
 
     auto *Cmd = cast<OutputSectionCommand>(Base.get());
-    auto I = llvm::find_if(*OutputSections, [&](OutputSectionBase<ELFT> *S) {
-      return S->getName() == Cmd->Name;
-    });
-    if (I == OutputSections->end())
+    OutputSectionBase<ELFT> *Sec = findSection<ELFT>(*Cmd, *OutputSections);
+    if (!Sec)
       continue;
-    OutputSectionBase<ELFT> *Sec = *I;
 
     if (Cmd->AddrExpr)
       Dot = Cmd->AddrExpr(Dot);


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D23451.67901.patch
Type: text/x-patch
Size: 3391 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160812/9b7106bf/attachment.bin>


More information about the llvm-commits mailing list