[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:46:20 PDT 2016
This revision was automatically updated to reflect the committed changes.
Closed by commit rL278561: [ELF] - Linkerscript: fix VA value assigned to sections when using constraints. (authored by grimar).
Changed prior to commit:
https://reviews.llvm.org/D23451?vs=67901&id=67905#toc
Repository:
rL LLVM
https://reviews.llvm.org/D23451
Files:
lld/trunk/ELF/LinkerScript.cpp
lld/trunk/test/ELF/linkerscript/linkerscript-multi-sections-constraint.s
Index: lld/trunk/test/ELF/linkerscript/linkerscript-multi-sections-constraint.s
===================================================================
--- lld/trunk/test/ELF/linkerscript/linkerscript-multi-sections-constraint.s
+++ lld/trunk/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: lld/trunk/ELF/LinkerScript.cpp
===================================================================
--- lld/trunk/ELF/LinkerScript.cpp
+++ lld/trunk/ELF/LinkerScript.cpp
@@ -215,14 +215,20 @@
}
}
+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) {
- 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);
+ if (Kind == ConstraintKind::NoConstraint)
+ return true;
+ return llvm::all_of(Sections, [=](InputSectionBase<ELFT> *Sec) {
+ return checkConstraint(Sec->getSectionHdr()->sh_flags, Kind);
});
}
@@ -330,6 +336,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(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 +382,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.67905.patch
Type: text/x-patch
Size: 3381 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160812/d29c64f1/attachment.bin>
More information about the llvm-commits
mailing list