[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