x86: Merge X86_ISA_1_USED/X86_ISA_1_NEEDED properties
authorH.J. Lu <hjl.tools@gmail.com>
Fri, 12 May 2017 15:07:21 +0000 (08:07 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Fri, 12 May 2017 15:07:43 +0000 (08:07 -0700)
If there are more than GNU property note in an input, we should merge
X86_ISA_1_USED and X86_ISA_1_NEEDED properties.

bfd/

* elf32-i386.c (elf_i386_parse_gnu_properties): Merge
GNU_PROPERTY_X86_ISA_1_USED and GNU_PROPERTY_X86_ISA_1_NEEDED
properties.
* elf64-x86-64.c (elf_x86_64_parse_gnu_properties): Likewise.

ld/

* testsuite/ld-i386/i386.exp: Run property-x86-3.
* testsuite/ld-x86-64/x86-64.exp: Likewise.
* testsuite/ld-i386/property-x86-3.d: New file.
* testsuite/ld-i386/property-x86-3.s: Likewise.
* testsuite/ld-x86-64/property-x86-3.d: Likewise.
* testsuite/ld-x86-64/property-x86-3.s: Likewise.

bfd/ChangeLog
bfd/elf32-i386.c
bfd/elf64-x86-64.c
ld/ChangeLog
ld/testsuite/ld-i386/i386.exp
ld/testsuite/ld-i386/property-x86-3.d [new file with mode: 0644]
ld/testsuite/ld-i386/property-x86-3.s [new file with mode: 0644]
ld/testsuite/ld-x86-64/property-x86-3.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/property-x86-3.s [new file with mode: 0644]
ld/testsuite/ld-x86-64/x86-64.exp

index 9128808e579dbbfdf0dfd5021eb3aec177de381b..bd7356cc6a53f675b611d79403499d2a92334aba 100644 (file)
@@ -1,3 +1,10 @@
+2017-05-12  H.J. Lu  <hongjiu.lu@intel.com>
+
+       * elf32-i386.c (elf_i386_parse_gnu_properties): Merge
+       GNU_PROPERTY_X86_ISA_1_USED and GNU_PROPERTY_X86_ISA_1_NEEDED
+       properties.
+       * elf64-x86-64.c (elf_x86_64_parse_gnu_properties): Likewise.
+
 2017-05-11  H.J. Lu  <hongjiu.lu@intel.com>
 
        * elf64-x86-64.c (elf_x86_64_link_hash_entry): Rename plt_bnd
index 6f59fb75d6634b982322535de9dd6f1d4b721f80..513e2968400f1dd84be79869449b2d3c68fee5d7 100644 (file)
@@ -6362,7 +6362,8 @@ elf_i386_parse_gnu_properties (bfd *abfd, unsigned int type,
          return property_corrupt;
        }
       prop = _bfd_elf_get_property (abfd, type, datasz);
-      prop->u.number = bfd_h_get_32 (abfd, ptr);
+      /* Combine properties of the same type.  */
+      prop->u.number |= bfd_h_get_32 (abfd, ptr);
       prop->pr_kind = property_number;
       break;
 
index c77725dd80e8c19692fa7243fe037852cef6a49d..1b9337944e2e9038eacc1ebd25bd953bcecc8d25 100644 (file)
@@ -7003,7 +7003,8 @@ elf_x86_64_parse_gnu_properties (bfd *abfd, unsigned int type,
          return property_corrupt;
        }
       prop = _bfd_elf_get_property (abfd, type, datasz);
-      prop->u.number = bfd_h_get_32 (abfd, ptr);
+      /* Combine properties of the same type.  */
+      prop->u.number |= bfd_h_get_32 (abfd, ptr);
       prop->pr_kind = property_number;
       break;
 
index 92ebbf7f0a9c341774471e71fe4bb4c064ee1747..7e22adfc2e7d92dff1da455806404c273525e919 100644 (file)
@@ -1,3 +1,12 @@
+2017-05-12  H.J. Lu  <hongjiu.lu@intel.com>
+
+       * testsuite/ld-i386/i386.exp: Run property-x86-3.
+       * testsuite/ld-x86-64/x86-64.exp: Likewise.
+       * testsuite/ld-i386/property-x86-3.d: New file.
+       * testsuite/ld-i386/property-x86-3.s: Likewise.
+       * testsuite/ld-x86-64/property-x86-3.d: Likewise.
+       * testsuite/ld-x86-64/property-x86-3.s: Likewise.
+
 2017-05-11  H.J. Lu  <hongjiu.lu@intel.com>
 
        * emulparams/elf_x86_64.sh (TINY_READONLY_SECTION): Replace
index 5cb741f2d89f787e01a4a79278a16fcb29d8308b..0118f245c450bbe5b0e2576223cd16a8d22e2bb6 100644 (file)
@@ -417,6 +417,7 @@ run_dump_test "pr20253-4b"
 run_dump_test "pr20253-4c"
 run_dump_test "pr20253-5"
 run_dump_test "pr20515"
+run_dump_test "property-x86-3"
 
 if { !([istarget "i?86-*-linux*"]
        || [istarget "i?86-*-gnu*"]
diff --git a/ld/testsuite/ld-i386/property-x86-3.d b/ld/testsuite/ld-i386/property-x86-3.d
new file mode 100644 (file)
index 0000000..19c6699
--- /dev/null
@@ -0,0 +1,9 @@
+#as: --32
+#ld: -shared -m elf_i386
+#readelf: -n
+
+Displaying notes found in: .note.gnu.property
+  Owner                 Data size      Description
+  GNU                  0x00000018      NT_GNU_PROPERTY_TYPE_0
+      Properties: x86 ISA used: i486, 586, SSE2, SSE3
+       x86 ISA needed: 586, SSE, SSE3, SSE4_1
diff --git a/ld/testsuite/ld-i386/property-x86-3.s b/ld/testsuite/ld-i386/property-x86-3.s
new file mode 100644 (file)
index 0000000..a6fd830
--- /dev/null
@@ -0,0 +1,51 @@
+       .section ".note.gnu.property", "a"
+       .p2align 2
+       .long 1f - 0f           /* name length.  */
+       .long 3f - 1f           /* data length.  */
+       /* NT_GNU_PROPERTY_TYPE_0 */
+       .long 5                 /* note type.  */
+0:
+       .asciz "GNU"            /* vendor name.  */
+1:
+       .p2align 2
+       /* GNU_PROPERTY_X86_ISA_1_USED */
+       .long 0xc0000000        /* pr_type.  */
+       .long 5f - 4f           /* pr_datasz.  */
+4:
+       .long 0x3
+5:
+       .p2align 2
+       /* GNU_PROPERTY_X86_ISA_1_NEEDED */
+       .long 0xc0000001        /* pr_type.  */
+       .long 5f - 4f           /* pr_datasz.  */
+4:
+       .long 0xa
+5:
+       .p2align 2
+3:
+
+       .section ".note.gnu.property", "a"
+       .p2align 2
+       .long 1f - 0f           /* name length.  */
+       .long 3f - 1f           /* data length.  */
+       /* NT_GNU_PROPERTY_TYPE_0 */
+       .long 5                 /* note type.  */
+0:
+       .asciz "GNU"            /* vendor name.  */
+1:
+       .p2align 2
+       /* GNU_PROPERTY_X86_ISA_1_USED */
+       .long 0xc0000000        /* pr_type.  */
+       .long 5f - 4f           /* pr_datasz.  */
+4:
+       .long 0x30
+5:
+       .p2align 2
+       /* GNU_PROPERTY_X86_ISA_1_NEEDED */
+       .long 0xc0000001        /* pr_type.  */
+       .long 5f - 4f           /* pr_datasz.  */
+4:
+       .long 0xa0
+5:
+       .p2align 2
+3:
diff --git a/ld/testsuite/ld-x86-64/property-x86-3.d b/ld/testsuite/ld-x86-64/property-x86-3.d
new file mode 100644 (file)
index 0000000..1e0348c
--- /dev/null
@@ -0,0 +1,9 @@
+#as: --64
+#ld: -shared -m elf_x86_64
+#readelf: -n
+
+Displaying notes found in: .note.gnu.property
+  Owner                 Data size      Description
+  GNU                  0x00000020      NT_GNU_PROPERTY_TYPE_0
+      Properties: x86 ISA used: 586, SSE, SSE3, SSE4_1
+       x86 ISA needed: i486, 586, SSE2, SSE3
diff --git a/ld/testsuite/ld-x86-64/property-x86-3.s b/ld/testsuite/ld-x86-64/property-x86-3.s
new file mode 100644 (file)
index 0000000..e87ac81
--- /dev/null
@@ -0,0 +1,51 @@
+       .section ".note.gnu.property", "a"
+       .p2align 3
+       .long 1f - 0f           /* name length.  */
+       .long 3f - 1f           /* data length.  */
+       /* NT_GNU_PROPERTY_TYPE_0 */
+       .long 5                 /* note type.  */
+0:
+       .asciz "GNU"            /* vendor name.  */
+1:
+       .p2align 3
+       /* GNU_PROPERTY_X86_ISA_1_USED */
+       .long 0xc0000000        /* pr_type.  */
+       .long 5f - 4f           /* pr_datasz.  */
+4:
+       .long 0xa
+5:
+       .p2align 3
+       /* GNU_PROPERTY_X86_ISA_1_NEEDED */
+       .long 0xc0000001        /* pr_type.  */
+       .long 5f - 4f           /* pr_datasz.  */
+4:
+       .long 0x3
+5:
+       .p2align 3
+3:
+
+       .section ".note.gnu.property", "a"
+       .p2align 3
+       .long 1f - 0f           /* name length.  */
+       .long 3f - 1f           /* data length.  */
+       /* NT_GNU_PROPERTY_TYPE_0 */
+       .long 5                 /* note type.  */
+0:
+       .asciz "GNU"            /* vendor name.  */
+1:
+       .p2align 3
+       /* GNU_PROPERTY_X86_ISA_1_USED */
+       .long 0xc0000000        /* pr_type.  */
+       .long 5f - 4f           /* pr_datasz.  */
+4:
+       .long 0xa0
+5:
+       .p2align 3
+       /* GNU_PROPERTY_X86_ISA_1_NEEDED */
+       .long 0xc0000001        /* pr_type.  */
+       .long 5f - 4f           /* pr_datasz.  */
+4:
+       .long 0x30
+5:
+       .p2align 3
+3:
index 61032aa30aee17db9f5a56bb3f4f3079b5987b0a..05125df6b270392d02e8b43ba84750ec168a6580 100644 (file)
@@ -329,6 +329,7 @@ run_dump_test "pr19807-2e"
 run_dump_test "pr19969"
 run_dump_test "pr20093-1"
 run_dump_test "pr20093-2"
+run_dump_test "property-x86-3"
 
 if { ![istarget "x86_64-*-linux*"] && ![istarget "x86_64-*-nacl*"]} {
     return