summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--elfcpp/ChangeLog10
-rw-r--r--elfcpp/arm.h21
-rw-r--r--gold/ChangeLog20
-rw-r--r--gold/arm.cc80
-rw-r--r--gold/testsuite/Makefile.am36
-rw-r--r--gold/testsuite/Makefile.in42
-rwxr-xr-xgold/testsuite/arm_attr_merge.sh44
-rw-r--r--gold/testsuite/arm_attr_merge_6a.s4
-rw-r--r--gold/testsuite/arm_attr_merge_6b.s3
-rw-r--r--gold/testsuite/arm_attr_merge_7a.s4
-rw-r--r--gold/testsuite/arm_attr_merge_7b.s4
11 files changed, 254 insertions, 14 deletions
diff --git a/elfcpp/ChangeLog b/elfcpp/ChangeLog
index 6f97d25ea1..3240c720b0 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 397d0d0bab..cb85eeb42e 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 5a2aec3812..71bbf2aec2 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 11a0734625..c304d2acfc 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 e77a3ed546..435eeab212 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 7b51717a3b..968d010ab6 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 0000000000..3066f4f101
--- /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 0000000000..df62e5353f
--- /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 0000000000..b06e3e092f
--- /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 0000000000..4f550293fd
--- /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 0000000000..69135b5120
--- /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"