+2015-02-26  Terry Guo  <terry.guo@arm.com>
+
+       * elf32-arm.c (elf32_arm_merge_eabi_attributes): Update how we
+       merge Tag_ABI_HardFP_use.
+
 2015-02-26  Alan Modra  <amodra@gmail.com>
 
        * elf32-ppc.c (ppc_elf_adjust_dynamic_symbol): Heed -z nocopyreloc.
 
              /* Tag_ABI_HardFP_use is handled along with Tag_FP_arch since
                 the meaning of Tag_ABI_HardFP_use depends on Tag_FP_arch
                 when it's 0.  It might mean absence of FP hardware if
-                Tag_FP_arch is zero, otherwise it is effectively SP + DP.  */
+                Tag_FP_arch is zero.  */
 
 #define VFP_VERSION_COUNT 9
              static const struct
                }
 
              /* Both the input and the output have nonzero Tag_FP_arch.
-                So Tag_ABI_HardFP_use is (SP & DP) when it's zero.  */
+                So Tag_ABI_HardFP_use is implied by Tag_FP_arch when it's zero.  */
 
              /* If both the input and the output have zero Tag_ABI_HardFP_use,
                 do nothing.  */
                  && out_attr[Tag_ABI_HardFP_use].i == 0)
                ;
              /* If the input and the output have different Tag_ABI_HardFP_use,
-                the combination of them is 3 (SP & DP).  */
+                the combination of them is 0 (implied by Tag_FP_arch).  */
              else if (in_attr[Tag_ABI_HardFP_use].i
                       != out_attr[Tag_ABI_HardFP_use].i)
-               out_attr[Tag_ABI_HardFP_use].i = 3;
+               out_attr[Tag_ABI_HardFP_use].i = 0;
 
              /* Now we can handle Tag_FP_arch.  */
 
 
+2015-02-26  Terry Guo  <terry.guo@arm.com>
+
+       * readelf.c (arm_attr_tag_ABI_HardFP_use): Update how we
+       display it.
+
 2015-02-25  Andrew Burgess  <andrew.burgess@embecosm.com>
 
        * objcopy.c (init_section_add): New function.
 
 static const char * arm_attr_tag_ABI_enum_size[] =
   {"Unused", "small", "int", "forced to int"};
 static const char * arm_attr_tag_ABI_HardFP_use[] =
-  {"As Tag_FP_arch", "SP only", "DP only", "SP and DP"};
+  {"As Tag_FP_arch", "SP only", "Reserved", "Deprecated"};
 static const char * arm_attr_tag_ABI_VFP_args[] =
   {"AAPCS", "VFP registers", "custom", "compatible"};
 static const char * arm_attr_tag_ABI_WMMX_args[] =
 
--- /dev/null
+# name: EABI attribute Tag_ABI_HardFP_use with value 0
+# source: attr-abi-hardfp-use-0.s
+# as:
+# readelf: -A
+# This test is only valid on EABI based ports.
+# target: *-*-*eabi* *-*-nacl*
+
+Attribute Section: aeabi
+File Attributes
+  Tag_CPU_name: "Cortex-M7"
+  Tag_CPU_arch: v7E-M
+  Tag_CPU_arch_profile: Microcontroller
+  Tag_THUMB_ISA_use: Thumb-2
+  Tag_FP_arch: FPv5/FP-D16 for ARMv8
 
--- /dev/null
+.cpu cortex-m7
+.fpu fpv5-d16
+.eabi_attribute 27, 0
 
--- /dev/null
+# name: EABI attribute Tag_ABI_HardFP_use with value 1
+# source: attr-abi-hardfp-use-1.s
+# as:
+# readelf: -A
+# This test is only valid on EABI based ports.
+# target: *-*-*eabi* *-*-nacl*
+
+Attribute Section: aeabi
+File Attributes
+  Tag_CPU_name: "Cortex-M7"
+  Tag_CPU_arch: v7E-M
+  Tag_CPU_arch_profile: Microcontroller
+  Tag_THUMB_ISA_use: Thumb-2
+  Tag_FP_arch: FPv5/FP-D16 for ARMv8
+  Tag_ABI_HardFP_use: SP only
 
--- /dev/null
+.cpu cortex-m7
+.fpu fpv5-sp-d16
+.eabi_attribute 27, 1
 
--- /dev/null
+# name: EABI attribute Tag_ABI_HardFP_use with value 2
+# source: attr-abi-hardfp-use-2.s
+# as:
+# readelf: -A
+# This test is only valid on EABI based ports.
+# target: *-*-*eabi* *-*-nacl*
+
+Attribute Section: aeabi
+File Attributes
+  Tag_CPU_name: "Cortex-M7"
+  Tag_CPU_arch: v7E-M
+  Tag_CPU_arch_profile: Microcontroller
+  Tag_THUMB_ISA_use: Thumb-2
+  Tag_FP_arch: FPv5/FP-D16 for ARMv8
+  Tag_ABI_HardFP_use: Reserved
 
--- /dev/null
+.cpu cortex-m7
+.fpu fpv5-d16
+.eabi_attribute 27, 2
 
--- /dev/null
+# name: EABI attribute Tag_ABI_HardFP_use with value 3
+# source: attr-abi-hardfp-use-3.s
+# as:
+# readelf: -A
+# This test is only valid on EABI based ports.
+# target: *-*-*eabi* *-*-nacl*
+
+Attribute Section: aeabi
+File Attributes
+  Tag_CPU_name: "Cortex-M7"
+  Tag_CPU_arch: v7E-M
+  Tag_CPU_arch_profile: Microcontroller
+  Tag_THUMB_ISA_use: Thumb-2
+  Tag_FP_arch: FPv5/FP-D16 for ARMv8
+  Tag_ABI_HardFP_use: Deprecated
 
--- /dev/null
+.cpu cortex-m7
+.fpu fpv5-d16
+.eabi_attribute 27, 3
 
+2015-02-26  Terry Guo  <terry.guo@arm.com>
+
+       * ld-arm/attr-merge-3.attr: Remove Tag_ABI_HardFP_use.
+       * ld-arm/attr-merge-vfp-10.d: Likewise.
+       * ld-arm/attr-merge-vfp-10r.d: Likewise.
+       * ld-arm/attr-merge-vfp-12.d: Likewise.
+       * ld-arm/attr-merge-vfp-12r.d: Likewise.
+       * ld-arm/attr-merge-vfp-13.d: Likewise.
+       * ld-arm/attr-merge-vfp-13r.d: Likewise.
+       * ld-arm/attr-merge-vfp-14.d: Likewise.
+       * ld-arm/attr-merge-vfp-14r.d: Likewise.
+       * ld-arm/attr-merge-vfp-6.d: Likewise.
+       * ld-arm/attr-merge-vfp-6r.d: Likewise.
+       * ld-arm/attr-merge-vfp-7.d: Likewise.
+       * ld-arm/attr-merge-vfp-7r.d: Likewise.
+       * ld-arm/attr-merge-vfp-8.d: Likewise.
+       * ld-arm/attr-merge-vfp-8r.d: Likewise.
+
 2015-02-25  Andrew Burgess  <andrew.burgess@embecosm.com>
 
        * ld-avr/avr-prop-1.d: New file.
 
 run_dump_test "attr-merge-incompatible"
 run_dump_test "attr-merge-arch-2"
 run_dump_test "attr-merge-nosection-1"
+run_dump_test "attr-merge-hardfp-use-1"
+run_dump_test "attr-merge-hardfp-use-2"
 run_dump_test "unresolved-1"
 if { ![istarget "arm*-*-nacl*"] } {
     run_dump_test "unresolved-1-dyn"
 
   Tag_ABI_align_needed: 8-byte
   Tag_ABI_align_preserved: 8-byte, except leaf SP
   Tag_ABI_enum_size: small
-  Tag_ABI_HardFP_use: SP and DP
   Tag_ABI_VFP_args: VFP registers
   Tag_CPU_unaligned_access: v6
   Tag_FP_HP_extension: Allowed
 
--- /dev/null
+#source: attr-merge-hardfp-use-1a.s
+#source: attr-merge-hardfp-use-1b.s
+#as:
+#ld: -e main
+#readelf: -A
+# This test is only valid on ELF based ports.
+# not-target: *-*-*coff *-*-pe *-*-wince *-*-*aout* *-*-netbsd *-*-riscix*
+
+Attribute Section: aeabi
+File Attributes
+  Tag_CPU_name: "Cortex-M4"
+  Tag_CPU_arch: v7E-M
+  Tag_CPU_arch_profile: Microcontroller
+  Tag_THUMB_ISA_use: Thumb-2
+  Tag_FP_arch: FPv5/FP-D16 for ARMv8
 
--- /dev/null
+        .syntax unified
+        .cpu cortex-m4
+        .fpu fpv4-sp-d16
+        .thumb
+        .text
+        .align  2
+        .global foo
+        .thumb
+        .thumb_func
+        .type   foo, %function
+foo:
+       bx lr
 
--- /dev/null
+       .thumb
+       .syntax unified
+       .cpu cortex-m7
+       .fpu fpv5-d16
+       .eabi_attribute 27, 3
+        .text
+        .align  2
+        .global main
+        .thumb
+        .thumb_func
+        .type   main, %function
+
+
+
+main:
+       bl foo
 
--- /dev/null
+#source: attr-merge-hardfp-use-2a.s
+#source: attr-merge-hardfp-use-2b.s
+#as:
+#ld: -e main
+#readelf: -A
+# This test is only valid on ELF based ports.
+# not-target: *-*-*coff *-*-pe *-*-wince *-*-*aout* *-*-netbsd *-*-riscix*
+
+Attribute Section: aeabi
+File Attributes
+  Tag_CPU_name: "Cortex-M4"
+  Tag_CPU_arch: v7E-M
+  Tag_CPU_arch_profile: Microcontroller
+  Tag_THUMB_ISA_use: Thumb-2
+  Tag_FP_arch: FPv5/FP-D16 for ARMv8
 
--- /dev/null
+        .syntax unified
+        .cpu cortex-m4
+        .fpu fpv4-sp-d16
+        .thumb
+        .text
+        .align  2
+        .global foo
+        .thumb
+        .thumb_func
+        .type   foo, %function
+foo:
+       bx lr
 
--- /dev/null
+       .thumb
+       .syntax unified
+       .cpu cortex-m7
+       .fpu fpv5-d16
+       .eabi_attribute 27, 2
+        .text
+        .align  2
+        .global main
+        .thumb
+        .thumb_func
+        .type   main, %function
+
+main:
+       bl foo
 
   Tag_ARM_ISA_use: Yes
   Tag_THUMB_ISA_use: Thumb-1
   Tag_FP_arch: FPv5/FP-D16 for ARMv8
-  Tag_ABI_HardFP_use: SP and DP
 
   Tag_ARM_ISA_use: Yes
   Tag_THUMB_ISA_use: Thumb-1
   Tag_FP_arch: FPv5/FP-D16 for ARMv8
-  Tag_ABI_HardFP_use: SP and DP
 
   Tag_ARM_ISA_use: Yes
   Tag_THUMB_ISA_use: Thumb-1
   Tag_FP_arch: FP for ARMv8
-  Tag_ABI_HardFP_use: SP and DP
 
   Tag_ARM_ISA_use: Yes
   Tag_THUMB_ISA_use: Thumb-1
   Tag_FP_arch: FP for ARMv8
-  Tag_ABI_HardFP_use: SP and DP
 
   Tag_ARM_ISA_use: Yes
   Tag_THUMB_ISA_use: Thumb-1
   Tag_FP_arch: FP for ARMv8
-  Tag_ABI_HardFP_use: SP and DP
 
   Tag_ARM_ISA_use: Yes
   Tag_THUMB_ISA_use: Thumb-1
   Tag_FP_arch: FP for ARMv8
-  Tag_ABI_HardFP_use: SP and DP
 
   Tag_ARM_ISA_use: Yes
   Tag_THUMB_ISA_use: Thumb-1
   Tag_FP_arch: FP for ARMv8
-  Tag_ABI_HardFP_use: SP and DP
 
   Tag_ARM_ISA_use: Yes
   Tag_THUMB_ISA_use: Thumb-1
   Tag_FP_arch: FP for ARMv8
-  Tag_ABI_HardFP_use: SP and DP
 
   Tag_ARM_ISA_use: Yes
   Tag_THUMB_ISA_use: Thumb-1
   Tag_FP_arch: VFPv3
-  Tag_ABI_HardFP_use: SP and DP
 
   Tag_ARM_ISA_use: Yes
   Tag_THUMB_ISA_use: Thumb-1
   Tag_FP_arch: VFPv3
-  Tag_ABI_HardFP_use: SP and DP
 
   Tag_ARM_ISA_use: Yes
   Tag_THUMB_ISA_use: Thumb-1
   Tag_FP_arch: FP for ARMv8
-  Tag_ABI_HardFP_use: SP and DP
 
   Tag_ARM_ISA_use: Yes
   Tag_THUMB_ISA_use: Thumb-1
   Tag_FP_arch: FP for ARMv8
-  Tag_ABI_HardFP_use: SP and DP
 
   Tag_ARM_ISA_use: Yes
   Tag_THUMB_ISA_use: Thumb-1
   Tag_FP_arch: FPv5/FP-D16 for ARMv8
-  Tag_ABI_HardFP_use: SP and DP
 
   Tag_ARM_ISA_use: Yes
   Tag_THUMB_ISA_use: Thumb-1
   Tag_FP_arch: FPv5/FP-D16 for ARMv8
-  Tag_ABI_HardFP_use: SP and DP