summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPeter Smith <peter.smith@linaro.org>2019-06-05 09:31:45 +0000
committerPeter Smith <peter.smith@linaro.org>2019-06-05 09:31:45 +0000
commite12334a0f248bd1579af995fb09157a65500400a (patch)
treec760ee9c0b10bf845b8288f872ec94cbc7f89842
parent6fc4c1cc54ac48acd9af142e4bbcc4e002d53370 (diff)
downloadbcm5719-llvm-e12334a0f248bd1579af995fb09157a65500400a.tar.gz
bcm5719-llvm-e12334a0f248bd1579af995fb09157a65500400a.zip
[ELF] Allow reading of more than one FEATURE_1_AND in same object.
Although many relocatable objects will have a single GNU_PROPERTY_X86_FEATURE_1_AND in the .note.gnu.property section it is permissible to have more than one, and there are tests in ld.bfd that use it. The behavior that ld.bfd follows is to set the feature bit for a relocatable object if any of the GNU_PROPERTY_X86_FEATURE_1_AND have the feature bit set. Differential Revision: https://reviews.llvm.org/D62862 llvm-svn: 362591
-rw-r--r--lld/ELF/InputFiles.cpp12
-rw-r--r--lld/test/ELF/i386-cet.s3
-rw-r--r--lld/test/ELF/x86-property-relocatable.s36
3 files changed, 44 insertions, 7 deletions
diff --git a/lld/ELF/InputFiles.cpp b/lld/ELF/InputFiles.cpp
index e16a07fa1a3..a863894c557 100644
--- a/lld/ELF/InputFiles.cpp
+++ b/lld/ELF/InputFiles.cpp
@@ -772,6 +772,7 @@ static uint32_t readAndFeatures(ObjFile<ELFT> *Obj, ArrayRef<uint8_t> Data) {
using Elf_Nhdr = typename ELFT::Nhdr;
using Elf_Note = typename ELFT::Note;
+ uint32_t FeaturesSet = 0;
while (!Data.empty()) {
// Read one NOTE record.
if (Data.size() < sizeof(Elf_Nhdr))
@@ -797,8 +798,10 @@ static uint32_t readAndFeatures(ObjFile<ELFT> *Obj, ArrayRef<uint8_t> Data) {
uint32_t Size = read32le(Desc.data() + 4);
if (Type == GNU_PROPERTY_X86_FEATURE_1_AND) {
- // We found the field.
- return read32le(Desc.data() + 8);
+ // We found a FEATURE_1_AND field. There may be more than one of these
+ // in a .note.gnu.propery section, for a relocatable object we
+ // accumulate the bits set.
+ FeaturesSet |= read32le(Desc.data() + 8);
}
// On 64-bit, a payload may be followed by a 4-byte padding to make its
@@ -809,12 +812,11 @@ static uint32_t readAndFeatures(ObjFile<ELFT> *Obj, ArrayRef<uint8_t> Data) {
Desc = Desc.slice(Size + 8); // +8 for Type and Size
}
- // Go to next NOTE record if a note section didn't contain
- // X86_FEATURES_1_AND description.
+ // Go to next NOTE record to look for more FEATURE_1_AND descriptions.
Data = Data.slice(Nhdr->getSize());
}
- return 0;
+ return FeaturesSet;
}
template <class ELFT>
diff --git a/lld/test/ELF/i386-cet.s b/lld/test/ELF/i386-cet.s
index 22a52056758..125c7977ee2 100644
--- a/lld/test/ELF/i386-cet.s
+++ b/lld/test/ELF/i386-cet.s
@@ -31,14 +31,13 @@
.section ".note.gnu.property", "a"
.long 4
-.long 0x10
+.long 0xc
.long 0x5
.asciz "GNU"
.long 0xc0000002
.long 4
.long 3
-.long 0
.text
.globl func1
diff --git a/lld/test/ELF/x86-property-relocatable.s b/lld/test/ELF/x86-property-relocatable.s
new file mode 100644
index 00000000000..12b1e73b4ba
--- /dev/null
+++ b/lld/test/ELF/x86-property-relocatable.s
@@ -0,0 +1,36 @@
+# REQUIRES: x86
+# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o
+# RUN: ld.lld -r %t.o -o %t2.o
+# RUN: llvm-readelf -n %t2.o | FileCheck -match-full-lines %s
+
+## Test that .note.gnu.property is passed through -r, and that we can handle
+## more than one FEATURE_AND in the same object file. This is logically the
+## same as if the features were combined in a single FEATURE_AND as the rule
+## states that the bit in the output pr_data field if it is set in all
+.text
+ret
+
+.section ".note.gnu.property", "a"
+.p2align 3
+.long 4
+.long 0x10
+.long 0x5
+.asciz "GNU"
+
+.long 0xc0000002 // GNU_PROPERTY_X86_FEATURE_1_AND
+.long 4
+.long 1 // GNU_PROPERTY_X86_FEATURE_1_IBT
+.long 0
+
+.long 4
+.long 0x10
+.long 0x5
+.asciz "GNU"
+.long 0xc0000002 // GNU_PROPERTY_X86_FEATURE_1_AND
+.long 4
+.long 2 // GNU_PROPERTY_X86_FEATURE_1_SHSTK
+.long 0
+
+# CHECK: Owner Data size Description
+# CHECK-NEXT: GNU 0x00000010 NT_GNU_PROPERTY_TYPE_0 (property note)
+# CHECK-NEXT: Properties: x86 feature: IBT, SHSTK
OpenPOWER on IntegriCloud