diff options
author | Doug Kwan <dougkwan@google.com> | 2010-05-13 02:41:15 +0000 |
---|---|---|
committer | Doug Kwan <dougkwan@google.com> | 2010-05-13 02:41:15 +0000 |
commit | da59ad79a2bab290cca29440b8b1d7981aa2b983 (patch) | |
tree | 69474e22226b02e09ee1e7fbb6bb4a7ff3227ac5 | |
parent | 235f101c07d43aac6a5fcc167680ea691c9ee92a (diff) | |
download | binutils-da59ad79a2bab290cca29440b8b1d7981aa2b983.zip binutils-da59ad79a2bab290cca29440b8b1d7981aa2b983.tar.gz binutils-da59ad79a2bab290cca29440b8b1d7981aa2b983.tar.bz2 |
2010-05-12 Doug Kwan <dougkwan@google.com>
elfcpp/ChangeLog
* arm.h (Tag_FP_arch, Tag_ABI_align_needed, Tag_ABI_align_preserved,
Tag_FP_HP_extension, Tag_MPextension_use_legacy): Rename from
existing tags.
(Tag_undefined40, Tag_undefined41, Tag_MPextension_use,
Tag_undefined43): New tags.
(Targ_VFP_arch, Tag_ABI_align8_needed, TAG_ABI_align8_preserved,
Tag_VFP_HP_extension): Define aliases for backward compatiblity.
gold/ChangeLog
* arm.cc (Target_arm::do_finalize_sections): Create an empty
attributes section only if there no attributes section after merging.
(Target_arm::merge_object_attributes): Move value of
Tag_MPextension_use_legacy to that of Tag_MPextension_use.
Handle Tag_DIV_use and Tag_MPextension_use_legacy.
* testsuite/Makefile.am (check_SCRIPTS): Add arm_attr_merge.sh
(check_DATA): Add arm_attr_merge_6.stdout, arm_attr_merge_6r_stdout
and arm_attr_merge_7.stdout.
(arm_attr_merge_6.stdout, arm_attr_merge_6 arm_attr_merge_6a.o
arm_attr_merge_6b.o, arm_attr_merge_6r.stdout, arm_attr_merge_6r,
arm_attr_merge_7.stdout, arm_attr_merge_7, arm_attr_merge_7a.o,
arm_attr_merge_7b.o): New rules.
(MOSTLYCLEANFILES): Add arm_attr_merge_6, arm_attr_merge_6r and
arm_attr_merge_7
* testsuite/Makefile.in: Regenerate.
* testsuite/arm_attr_merge.sh: New file.
* testsuite/arm_attr_merge_[67][ab].s: Same.
-rw-r--r-- | elfcpp/ChangeLog | 10 | ||||
-rw-r--r-- | elfcpp/arm.h | 21 | ||||
-rw-r--r-- | gold/ChangeLog | 20 | ||||
-rw-r--r-- | gold/arm.cc | 80 | ||||
-rw-r--r-- | gold/testsuite/Makefile.am | 36 | ||||
-rw-r--r-- | gold/testsuite/Makefile.in | 42 | ||||
-rwxr-xr-x | gold/testsuite/arm_attr_merge.sh | 44 | ||||
-rw-r--r-- | gold/testsuite/arm_attr_merge_6a.s | 4 | ||||
-rw-r--r-- | gold/testsuite/arm_attr_merge_6b.s | 3 | ||||
-rw-r--r-- | gold/testsuite/arm_attr_merge_7a.s | 4 | ||||
-rw-r--r-- | gold/testsuite/arm_attr_merge_7b.s | 4 |
11 files changed, 254 insertions, 14 deletions
diff --git a/elfcpp/ChangeLog b/elfcpp/ChangeLog index 6f97d25..3240c72 100644 --- a/elfcpp/ChangeLog +++ b/elfcpp/ChangeLog @@ -1,3 +1,13 @@ +2010-05-12 Doug Kwan <dougkwan@google.com> + + * arm.h (Tag_FP_arch, Tag_ABI_align_needed, Tag_ABI_align_preserved, + Tag_FP_HP_extension, Tag_MPextension_use_legacy): Rename from + existing tags. + (Tag_undefined40, Tag_undefined41, Tag_MPextension_use, + Tag_undefined43): New tags. + (Targ_VFP_arch, Tag_ABI_align8_needed, TAG_ABI_align8_preserved, + Tag_VFP_HP_extension): Define aliases for backward compatiblity. + 2010-03-05 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> * elfcpp.h (VER_FLG_INFO): Define. diff --git a/elfcpp/arm.h b/elfcpp/arm.h index 397d0d0..cb85eeb 100644 --- a/elfcpp/arm.h +++ b/elfcpp/arm.h @@ -255,7 +255,7 @@ enum Tag_CPU_arch_profile = 7, Tag_ARM_ISA_use = 8, Tag_THUMB_ISA_use = 9, - Tag_VFP_arch = 10, + Tag_FP_arch = 10, Tag_WMMX_arch = 11, Tag_Advanced_SIMD_arch = 12, Tag_PCS_config = 13, @@ -269,8 +269,8 @@ enum Tag_ABI_FP_exceptions = 21, Tag_ABI_FP_user_exceptions = 22, Tag_ABI_FP_number_model = 23, - Tag_ABI_align8_needed = 24, - Tag_ABI_align8_preserved = 25, + Tag_ABI_align_needed = 24, + Tag_ABI_align_preserved = 25, Tag_ABI_enum_size = 26, Tag_ABI_HardFP_use = 27, Tag_ABI_VFP_args = 28, @@ -281,17 +281,28 @@ enum Tag_undefined33 = 33, Tag_CPU_unaligned_access = 34, Tag_undefined35 = 35, - Tag_VFP_HP_extension = 36, + Tag_FP_HP_extension = 36, Tag_undefined37 = 37, Tag_ABI_FP_16bit_format = 38, Tag_undefined39 = 39, + Tag_undefined40 = 40, + Tag_undefined41 = 41, + Tag_MPextension_use = 42, + Tag_undefined43 = 43, + Tag_DIV_use = 44, Tag_nodefaults = 64, Tag_also_compatible_with = 65, Tag_T2EE_use = 66, Tag_conformance = 67, Tag_Virtualization_use = 68, Tag_undefined69 = 69, - Tag_MPextension_use = 70 + Tag_MPextension_use_legacy = 70, + + // The following tags are legacy names for other tags. + Tag_VFP_arch = Tag_FP_arch, + Tag_ABI_align8_needed = Tag_ABI_align_needed, + Tag_ABI_align8_preserved = Tag_ABI_align_preserved, + Tag_VFP_HP_extension = Tag_FP_HP_extension }; // Values for Tag_ABI_PCS_R9_use. diff --git a/gold/ChangeLog b/gold/ChangeLog index 5a2aec3..71bbf2a 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,3 +1,23 @@ +2010-05-12 Doug Kwan <dougkwan@google.com> + + * arm.cc (Target_arm::do_finalize_sections): Create an empty + attributes section only if there no attributes section after merging. + (Target_arm::merge_object_attributes): Move value of + Tag_MPextension_use_legacy to that of Tag_MPextension_use. + Handle Tag_DIV_use and Tag_MPextension_use_legacy. + * testsuite/Makefile.am (check_SCRIPTS): Add arm_attr_merge.sh + (check_DATA): Add arm_attr_merge_6.stdout, arm_attr_merge_6r_stdout + and arm_attr_merge_7.stdout. + (arm_attr_merge_6.stdout, arm_attr_merge_6 arm_attr_merge_6a.o + arm_attr_merge_6b.o, arm_attr_merge_6r.stdout, arm_attr_merge_6r, + arm_attr_merge_7.stdout, arm_attr_merge_7, arm_attr_merge_7a.o, + arm_attr_merge_7b.o): New rules. + (MOSTLYCLEANFILES): Add arm_attr_merge_6, arm_attr_merge_6r and + arm_attr_merge_7 + * testsuite/Makefile.in: Regenerate. + * testsuite/arm_attr_merge.sh: New file. + * testsuite/arm_attr_merge_[67][ab].s: Same. + 2010-05-05 Nick Clifton <nickc@redhat.com> * po/es.po: Updated Spanish translation. diff --git a/gold/arm.cc b/gold/arm.cc index 11a0734..c304d2a 100644 --- a/gold/arm.cc +++ b/gold/arm.cc @@ -7998,11 +7998,6 @@ Target_arm<big_endian>::do_finalize_sections( const Input_objects* input_objects, Symbol_table* symtab) { - // Create an empty uninitialized attribute section if we still don't have it - // at this moment. - if (this->attributes_section_data_ == NULL) - this->attributes_section_data_ = new Attributes_section_data(NULL, 0); - // Merge processor-specific flags. for (Input_objects::Relobj_iterator p = input_objects->relobj_begin(); p != input_objects->relobj_end(); @@ -8033,6 +8028,12 @@ Target_arm<big_endian>::do_finalize_sections( arm_dynobj->attributes_section_data()); } + // Create an empty uninitialized attribute section if we still don't have it + // at this moment. This happens if there is no attributes sections in all + // inputs. + if (this->attributes_section_data_ == NULL) + this->attributes_section_data_ = new Attributes_section_data(NULL, 0); + // Check BLX use. const Object_attribute* cpu_arch_attr = this->get_aeabi_object_attribute(elfcpp::Tag_CPU_arch); @@ -9427,13 +9428,35 @@ Target_arm<big_endian>::merge_object_attributes( return; // If output has no object attributes, just copy. + const int vendor = Object_attribute::OBJ_ATTR_PROC; if (this->attributes_section_data_ == NULL) { this->attributes_section_data_ = new Attributes_section_data(*pasd); + Object_attribute* out_attr = + this->attributes_section_data_->known_attributes(vendor); + + // We do not output objects with Tag_MPextension_use_legacy - we move + // the attribute's value to Tag_MPextension_use. */ + if (out_attr[elfcpp::Tag_MPextension_use_legacy].int_value() != 0) + { + if (out_attr[elfcpp::Tag_MPextension_use].int_value() != 0 + && out_attr[elfcpp::Tag_MPextension_use_legacy].int_value() + != out_attr[elfcpp::Tag_MPextension_use].int_value()) + { + gold_error(_("%s has both the current and legacy " + "Tag_MPextension_use attributes"), + name); + } + + out_attr[elfcpp::Tag_MPextension_use] = + out_attr[elfcpp::Tag_MPextension_use_legacy]; + out_attr[elfcpp::Tag_MPextension_use_legacy].set_type(0); + out_attr[elfcpp::Tag_MPextension_use_legacy].set_int_value(0); + } + return; } - const int vendor = Object_attribute::OBJ_ATTR_PROC; const Object_attribute* in_attr = pasd->known_attributes(vendor); Object_attribute* out_attr = this->attributes_section_data_->known_attributes(vendor); @@ -9759,6 +9782,51 @@ Target_arm<big_endian>::merge_object_attributes( out_attr[i].set_int_value(in_attr[i].int_value()); break; + case elfcpp::Tag_DIV_use: + // This tag is set to zero if we can use UDIV and SDIV in Thumb + // mode on a v7-M or v7-R CPU; to one if we can not use UDIV or + // SDIV at all; and to two if we can use UDIV or SDIV on a v7-A + // CPU. We will merge as follows: If the input attribute's value + // is one then the output attribute's value remains unchanged. If + // the input attribute's value is zero or two then if the output + // attribute's value is one the output value is set to the input + // value, otherwise the output value must be the same as the + // inputs. */ + if (in_attr[i].int_value() != 1 && out_attr[i].int_value() != 1) + { + if (in_attr[i].int_value() != out_attr[i].int_value()) + { + gold_error(_("DIV usage mismatch between %s and output"), + name); + } + } + + if (in_attr[i].int_value() != 1) + out_attr[i].set_int_value(in_attr[i].int_value()); + + break; + + case elfcpp::Tag_MPextension_use_legacy: + // We don't output objects with Tag_MPextension_use_legacy - we + // move the value to Tag_MPextension_use. + if (in_attr[i].int_value() != 0 + && in_attr[elfcpp::Tag_MPextension_use].int_value() != 0) + { + if (in_attr[elfcpp::Tag_MPextension_use].int_value() + != in_attr[i].int_value()) + { + gold_error(_("%s has has both the current and legacy " + "Tag_MPextension_use attributes"), + name); + } + } + + if (in_attr[i].int_value() + > out_attr[elfcpp::Tag_MPextension_use].int_value()) + out_attr[elfcpp::Tag_MPextension_use] = in_attr[i]; + + break; + case elfcpp::Tag_nodefaults: // This tag is set if it exists, but the value is unused (and is // typically zero). We don't actually need to do anything here - diff --git a/gold/testsuite/Makefile.am b/gold/testsuite/Makefile.am index e77a3ed..435eeab 100644 --- a/gold/testsuite/Makefile.am +++ b/gold/testsuite/Makefile.am @@ -1666,4 +1666,40 @@ arm_no_fix_v4bx: arm_fix_v4bx.o ../ld-new MOSTLYCLEANFILES += arm_fix_v4bx arm_fix_v4bx_interworking arm_no_fix_v4bx +check_SCRIPTS += arm_attr_merge.sh +check_DATA += arm_attr_merge_6.stdout arm_attr_merge_6r.stdout \ + arm_attr_merge_7.stdout + +arm_attr_merge_6.stdout: arm_attr_merge_6 + $(TEST_READELF) -A $< > $@ + +arm_attr_merge_6: arm_attr_merge_6a.o arm_attr_merge_6b.o + ../ld-new -o $@ arm_attr_merge_6a.o arm_attr_merge_6b.o + +arm_attr_merge_6a.o: arm_attr_merge_6a.s + $(TEST_AS) -o $@ $< + +arm_attr_merge_6b.o: arm_attr_merge_6b.s + $(TEST_AS) -o $@ $< + +arm_attr_merge_6r.stdout: arm_attr_merge_6r + $(TEST_READELF) -A $< > $@ + +arm_attr_merge_6r: arm_attr_merge_6b.o arm_attr_merge_6a.o + ../ld-new -o $@ arm_attr_merge_6b.o arm_attr_merge_6a.o + +arm_attr_merge_7.stdout: arm_attr_merge_7 + $(TEST_READELF) -A $< > $@ + +arm_attr_merge_7: arm_attr_merge_7a.o arm_attr_merge_7b.o + ../ld-new -o $@ arm_attr_merge_7a.o arm_attr_merge_7b.o + +arm_attr_merge_7a.o: arm_attr_merge_7a.s + $(TEST_AS) -o $@ $< + +arm_attr_merge_7b.o: arm_attr_merge_7b.s + $(TEST_AS) -o $@ $< + +MOSTLYCLEANFILES += arm_attr_merge_6 arm_attr_merge_6r arm_attr_merge_7 + endif DEFAULT_TARGET_ARM diff --git a/gold/testsuite/Makefile.in b/gold/testsuite/Makefile.in index 7b51717..968d010 100644 --- a/gold/testsuite/Makefile.in +++ b/gold/testsuite/Makefile.in @@ -344,7 +344,7 @@ check_PROGRAMS = object_unittest$(EXEEXT) binary_unittest$(EXEEXT) \ @DEFAULT_TARGET_ARM_TRUE@am__append_38 = arm_abs_global.sh \ @DEFAULT_TARGET_ARM_TRUE@ arm_branch_in_range.sh \ -@DEFAULT_TARGET_ARM_TRUE@ arm_fix_v4bx.sh +@DEFAULT_TARGET_ARM_TRUE@ arm_fix_v4bx.sh arm_attr_merge.sh @DEFAULT_TARGET_ARM_TRUE@am__append_39 = arm_abs_global.stdout \ @DEFAULT_TARGET_ARM_TRUE@ arm_bl_in_range.stdout \ @DEFAULT_TARGET_ARM_TRUE@ arm_bl_out_of_range.stdout \ @@ -358,7 +358,10 @@ check_PROGRAMS = object_unittest$(EXEEXT) binary_unittest$(EXEEXT) \ @DEFAULT_TARGET_ARM_TRUE@ thumb2_blx_out_of_range.stdout \ @DEFAULT_TARGET_ARM_TRUE@ arm_fix_v4bx.stdout \ @DEFAULT_TARGET_ARM_TRUE@ arm_fix_v4bx_interworking.stdout \ -@DEFAULT_TARGET_ARM_TRUE@ arm_no_fix_v4bx.stdout +@DEFAULT_TARGET_ARM_TRUE@ arm_no_fix_v4bx.stdout \ +@DEFAULT_TARGET_ARM_TRUE@ arm_attr_merge_6.stdout \ +@DEFAULT_TARGET_ARM_TRUE@ arm_attr_merge_6r.stdout \ +@DEFAULT_TARGET_ARM_TRUE@ arm_attr_merge_7.stdout @DEFAULT_TARGET_ARM_TRUE@am__append_40 = arm_abs_global \ @DEFAULT_TARGET_ARM_TRUE@ arm_bl_in_range arm_bl_out_of_range \ @DEFAULT_TARGET_ARM_TRUE@ thumb_bl_in_range \ @@ -370,7 +373,8 @@ check_PROGRAMS = object_unittest$(EXEEXT) binary_unittest$(EXEEXT) \ @DEFAULT_TARGET_ARM_TRUE@ thumb2_blx_in_range \ @DEFAULT_TARGET_ARM_TRUE@ thumb2_blx_out_of_range arm_fix_v4bx \ @DEFAULT_TARGET_ARM_TRUE@ arm_fix_v4bx_interworking \ -@DEFAULT_TARGET_ARM_TRUE@ arm_no_fix_v4bx +@DEFAULT_TARGET_ARM_TRUE@ arm_no_fix_v4bx arm_attr_merge_6 \ +@DEFAULT_TARGET_ARM_TRUE@ arm_attr_merge_6r arm_attr_merge_7 subdir = testsuite DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 @@ -1244,7 +1248,9 @@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ +install_as_default = @install_as_default@ install_sh = @install_sh@ +installed_linker = @installed_linker@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ @@ -3284,6 +3290,36 @@ uninstall-am: @DEFAULT_TARGET_ARM_TRUE@arm_no_fix_v4bx: arm_fix_v4bx.o ../ld-new @DEFAULT_TARGET_ARM_TRUE@ ../ld-new -o $@ $< +@DEFAULT_TARGET_ARM_TRUE@arm_attr_merge_6.stdout: arm_attr_merge_6 +@DEFAULT_TARGET_ARM_TRUE@ $(TEST_READELF) -A $< > $@ + +@DEFAULT_TARGET_ARM_TRUE@arm_attr_merge_6: arm_attr_merge_6a.o arm_attr_merge_6b.o +@DEFAULT_TARGET_ARM_TRUE@ ../ld-new -o $@ arm_attr_merge_6a.o arm_attr_merge_6b.o + +@DEFAULT_TARGET_ARM_TRUE@arm_attr_merge_6a.o: arm_attr_merge_6a.s +@DEFAULT_TARGET_ARM_TRUE@ $(TEST_AS) -o $@ $< + +@DEFAULT_TARGET_ARM_TRUE@arm_attr_merge_6b.o: arm_attr_merge_6b.s +@DEFAULT_TARGET_ARM_TRUE@ $(TEST_AS) -o $@ $< + +@DEFAULT_TARGET_ARM_TRUE@arm_attr_merge_6r.stdout: arm_attr_merge_6r +@DEFAULT_TARGET_ARM_TRUE@ $(TEST_READELF) -A $< > $@ + +@DEFAULT_TARGET_ARM_TRUE@arm_attr_merge_6r: arm_attr_merge_6b.o arm_attr_merge_6a.o +@DEFAULT_TARGET_ARM_TRUE@ ../ld-new -o $@ arm_attr_merge_6b.o arm_attr_merge_6a.o + +@DEFAULT_TARGET_ARM_TRUE@arm_attr_merge_7.stdout: arm_attr_merge_7 +@DEFAULT_TARGET_ARM_TRUE@ $(TEST_READELF) -A $< > $@ + +@DEFAULT_TARGET_ARM_TRUE@arm_attr_merge_7: arm_attr_merge_7a.o arm_attr_merge_7b.o +@DEFAULT_TARGET_ARM_TRUE@ ../ld-new -o $@ arm_attr_merge_7a.o arm_attr_merge_7b.o + +@DEFAULT_TARGET_ARM_TRUE@arm_attr_merge_7a.o: arm_attr_merge_7a.s +@DEFAULT_TARGET_ARM_TRUE@ $(TEST_AS) -o $@ $< + +@DEFAULT_TARGET_ARM_TRUE@arm_attr_merge_7b.o: arm_attr_merge_7b.s +@DEFAULT_TARGET_ARM_TRUE@ $(TEST_AS) -o $@ $< + # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: diff --git a/gold/testsuite/arm_attr_merge.sh b/gold/testsuite/arm_attr_merge.sh new file mode 100755 index 0000000..3066f4f --- /dev/null +++ b/gold/testsuite/arm_attr_merge.sh @@ -0,0 +1,44 @@ +#!/bin/sh + +# arm_attr_merge.sh -- test ARM attributes merging. + +# Copyright 2010 Free Software Foundation, Inc. +# Written by Doug Kwan <dougkwan@google.com> + +# This file is part of gold. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, +# MA 02110-1301, USA. + +# This file goes with the assembler source files arm_attr_merge*.s + +check() +{ + file=$1 + pattern=$2 + found=`grep "$pattern" $file` + if test -z "$found"; then + echo "pattern \"$pattern\" not found in file $file." + exit 1 + fi +} + +# This is a bit crude. + +check arm_attr_merge_6.stdout "Tag_MPextension_use: Allowed" +check arm_attr_merge_6r.stdout "Tag_MPextension_use: Allowed" +check arm_attr_merge_7.stdout "Tag_MPextension_use: Allowed" + +exit 0 diff --git a/gold/testsuite/arm_attr_merge_6a.s b/gold/testsuite/arm_attr_merge_6a.s new file mode 100644 index 0000000..df62e53 --- /dev/null +++ b/gold/testsuite/arm_attr_merge_6a.s @@ -0,0 +1,4 @@ + .cpu cortex-a9 + .fpu softvfp + .eabi_attribute 70, 1 + .file "arm_attr_merge_6a.s" diff --git a/gold/testsuite/arm_attr_merge_6b.s b/gold/testsuite/arm_attr_merge_6b.s new file mode 100644 index 0000000..b06e3e0 --- /dev/null +++ b/gold/testsuite/arm_attr_merge_6b.s @@ -0,0 +1,3 @@ + .cpu cortex-a9 + .fpu softvfp + .file "arm_attr_merge_6b.s" diff --git a/gold/testsuite/arm_attr_merge_7a.s b/gold/testsuite/arm_attr_merge_7a.s new file mode 100644 index 0000000..4f55029 --- /dev/null +++ b/gold/testsuite/arm_attr_merge_7a.s @@ -0,0 +1,4 @@ + .cpu cortex-a9 + .fpu softvfp + .eabi_attribute 70, 1 + .file "arm_attr_merge_7a.s" diff --git a/gold/testsuite/arm_attr_merge_7b.s b/gold/testsuite/arm_attr_merge_7b.s new file mode 100644 index 0000000..69135b5 --- /dev/null +++ b/gold/testsuite/arm_attr_merge_7b.s @@ -0,0 +1,4 @@ + .cpu cortex-a9 + .fpu softvfp + .eabi_attribute Tag_MPextension_use, 1 + .file "arm_attr_merge_7b.s" |