This is the mail archive of the binutils-cvs@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] [bfd][arm] Don't assert on suspicious build attributes in input file


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=4ec192e6abe86319b9e9af6f2ae4cf0614b1e2b3

commit 4ec192e6abe86319b9e9af6f2ae4cf0614b1e2b3
Author: Richard Earnshaw <Richard.Earnshaw@arm.com>
Date:   Thu Jun 8 15:11:44 2017 +0100

    [bfd][arm] Don't assert on suspicious build attributes in input file
    
    It's generally a bad idea to use assertions to validate our idea of
    what an input file looks like.  We need to be as liberal as possible
    in what we accept with respect to standards and conservative with what
    we produce.
    
    Currently, if gcc is used to produce an assembler file which contains
    only data, but the FPU is set to fpv4-sp-d16 and mfloat-abi=hard, then
    the following attributes will be set in the output:
    
            .cpu arm7tdmi
            .eabi_attribute 27, 1   @ Tag_ABI_HardFP_use
            .eabi_attribute 28, 1   @ Tag_ABI_VFP_args
            .eabi_attribute 20, 1   @ Tag_ABI_FP_denormal
            .eabi_attribute 21, 1   @ Tag_ABI_FP_exceptions
            .eabi_attribute 23, 3   @ Tag_ABI_FP_number_model
            .eabi_attribute 24, 1   @ Tag_ABI_align8_needed
            .eabi_attribute 25, 1   @ Tag_ABI_align8_preserved
            .eabi_attribute 26, 2   @ Tag_ABI_enum_size
            .eabi_attribute 30, 6   @ Tag_ABI_optimization_goals
            .eabi_attribute 34, 0   @ Tag_CPU_unaligned_access
            .eabi_attribute 18, 4   @ Tag_ABI_PCS_wchar_t
    
    There is then no .fpu directive to cause Tag_FP_arch to be set,
    because there are no functions containing code in the object file.  If
    this object file is assembled by hand, but without -mfpu on the
    invocation of the assembler, then the build attributes produced will
    trigger an assertion during linking.
    
    Thinking about the build attributes, the combination of a
    single-precision only implementation of no floating-point architecture
    is still no floating-point architecture.  Hence the assertion on the
    input BFD in the linker makes no real sense.
    
    We should, however, be more conservative in what we generate, so I've
    left the assertion on the output bfd in place; I don't think we can
    trigger it with this change since we never merge the problematic tags
    from a perversely generated input file.
    
    	* elf32-arm.c (elf32_arm_merge_eabi_attributes): Remove assertion
    	that the input bfd has Tag_FP_ARCH non-zero if Tag_ABI_HardFP_use
    	is non-zero.  Add clarifying comments.

Diff:
---
 bfd/ChangeLog   |  6 ++++++
 bfd/elf32-arm.c | 11 ++++++++++-
 2 files changed, 16 insertions(+), 1 deletion(-)

diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index a543349..65e7dae 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,9 @@
+2017-06-08  Richard Earnshaw  <rearnsha@arm.com>
+
+	* elf32-arm.c (elf32_arm_merge_eabi_attributes): Remove assertion
+	that the input bfd has Tag_FP_ARCH non-zero if Tag_ABI_HardFP_use
+	is non-zero.  Add clarifying comments.
+
 2017-06-08  H.J. Lu  <hongjiu.lu@intel.com>
 
 	* elf32-i386.c (elf_i386_check_relocs): Set local IFUNC symbol
diff --git a/bfd/elf32-arm.c b/bfd/elf32-arm.c
index 9cd34ca..3bfe312 100644
--- a/bfd/elf32-arm.c
+++ b/bfd/elf32-arm.c
@@ -13825,6 +13825,9 @@ elf32_arm_merge_eabi_attributes (bfd *ibfd, struct bfd_link_info *info)
 		 follow the requirement of the input.  */
 	      if (out_attr[i].i == 0)
 		{
+		  /* This assert is still reasonable, we shouldn't
+		     produce the suspicious build attribute
+		     combination (See below for in_attr).  */
 		  BFD_ASSERT (out_attr[Tag_ABI_HardFP_use].i == 0);
 		  out_attr[i].i = in_attr[i].i;
 		  out_attr[Tag_ABI_HardFP_use].i
@@ -13835,7 +13838,13 @@ elf32_arm_merge_eabi_attributes (bfd *ibfd, struct bfd_link_info *info)
 		 nothing.  */
 	      else if (in_attr[i].i == 0)
 		{
-		  BFD_ASSERT (in_attr[Tag_ABI_HardFP_use].i == 0);
+		  /* We used to assert that Tag_ABI_HardFP_use was
+		     zero here, but we should never assert when
+		     consuming an object file that has suspicious
+		     build attributes.  The single precision variant
+		     of 'no FP architecture' is still 'no FP
+		     architecture', so we just ignore the tag in this
+		     case.  */
 		  break;
 		}


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]