From a63ee571d00ede27cb1adf3ef74d3650d79225e2 Mon Sep 17 00:00:00 2001 From: Tristan Gingold Date: Mon, 21 Nov 2011 09:32:17 +0000 Subject: Merge of CVSROOT: /cvs/src Module name: src Changes by: dougkwan@sourceware.org 2011-11-10 00:41:53 Modified files: gold : ChangeLog arm.cc reloc.h target-reloc.h gold/testsuite : Makefile.am Makefile.in arm_unaligned_reloc.sh Log message: 2011-11-09 Doug Kwan PR gold/13362 * arm.cc (Arm_scan_relocatable_relocs::Default_scan_relocatable_relocs): Use unaligned 4-byte relocs for static 32-bit data as required by EABI. * reloc.h (Relocatable_relocs::Reloc_strategy): New enum RELOC_ADJUST_FOR_SECTION_4_UNALIGNED. (Relocate_functions::rel_unaligned): New. (Relocate_functions::rel32_unaligned): New. * target-reloc.h (relocate_for_relocatable): Add code to handle RELOC_ADJUST_FOR_SECTION_4_UNALIGNED. * testsuite/Makefile.am (arm_unaligned_reloc_r.stdout, arm_unaligned_reloc_r): New targets. * testsuite/Makefile.in: Regenerate. * arm_unaligned_reloc.sh: Check unaligned relocs in relocatable linking. --- gold/arm.cc | 5 +++-- gold/reloc.h | 23 +++++++++++++++++++++++ gold/target-reloc.h | 7 +++++++ gold/testsuite/Makefile.am | 10 ++++++++-- gold/testsuite/Makefile.in | 8 ++++++++ gold/testsuite/arm_unaligned_reloc.sh | 7 +++++++ 6 files changed, 56 insertions(+), 4 deletions(-) diff --git a/gold/arm.cc b/gold/arm.cc index 200c3713101..a17469b2c9f 100644 --- a/gold/arm.cc +++ b/gold/arm.cc @@ -2075,7 +2075,8 @@ class Arm_scan_relocatable_relocs : case elfcpp::R_ARM_TARGET1: case elfcpp::R_ARM_TARGET2: gold_unreachable(); - // Relocations that write full 32 bits. + // Relocations that write full 32 bits and + // have alignment of 1. case elfcpp::R_ARM_ABS32: case elfcpp::R_ARM_REL32: case elfcpp::R_ARM_SBREL32: @@ -2093,7 +2094,7 @@ class Arm_scan_relocatable_relocs : case elfcpp::R_ARM_TLS_LDO32: case elfcpp::R_ARM_TLS_IE32: case elfcpp::R_ARM_TLS_LE32: - return Relocatable_relocs::RELOC_ADJUST_FOR_SECTION_4; + return Relocatable_relocs::RELOC_ADJUST_FOR_SECTION_4_UNALIGNED; default: // For all other static relocations, return RELOC_SPECIAL. return Relocatable_relocs::RELOC_SPECIAL; diff --git a/gold/reloc.h b/gold/reloc.h index 3a33c9b01ba..fefcb3f1e28 100644 --- a/gold/reloc.h +++ b/gold/reloc.h @@ -247,6 +247,8 @@ class Relocatable_relocs RELOC_ADJUST_FOR_SECTION_2, RELOC_ADJUST_FOR_SECTION_4, RELOC_ADJUST_FOR_SECTION_8, + // Like RELOC_ADJUST_FOR_SECTION_4 but for unaligned relocs. + RELOC_ADJUST_FOR_SECTION_4_UNALIGNED, // Discard the input reloc--process it completely when relocating // the data section contents. RELOC_DISCARD, @@ -347,6 +349,20 @@ private: elfcpp::Swap::writeval(wv, x); } + // Like the above but for relocs at unaligned addresses. + template + static inline void + rel_unaligned(unsigned char* view, + const Sized_relobj_file* object, + const Symbol_value* psymval) + { + typedef typename elfcpp::Swap_unaligned::Valtype + Valtype; + Valtype x = elfcpp::Swap_unaligned::readval(view); + x = psymval->value(object, x); + elfcpp::Swap_unaligned::writeval(view, x); + } + // Do a simple relocation with the addend in the relocation. // VALSIZE is the size of the value. template @@ -558,6 +574,13 @@ public: const Symbol_value* psymval) { This::template rel<32>(view, object, psymval); } + // Like above but for relocs at unaligned addresses. + static inline void + rel32_unaligned(unsigned char* view, + const Sized_relobj_file* object, + const Symbol_value* psymval) + { This::template rel_unaligned<32>(view, object, psymval); } + // Do an 32-bit RELA relocation with the addend in the relocation. static inline void rela32(unsigned char* view, elfcpp::Elf_Word value, elfcpp::Elf_Word addend) diff --git a/gold/target-reloc.h b/gold/target-reloc.h index 832c5d6db7d..464a3fa896c 100644 --- a/gold/target-reloc.h +++ b/gold/target-reloc.h @@ -669,6 +669,7 @@ relocate_for_relocatable( case Relocatable_relocs::RELOC_ADJUST_FOR_SECTION_2: case Relocatable_relocs::RELOC_ADJUST_FOR_SECTION_4: case Relocatable_relocs::RELOC_ADJUST_FOR_SECTION_8: + case Relocatable_relocs::RELOC_ADJUST_FOR_SECTION_4_UNALIGNED: { // We are adjusting a section symbol. We need to find // the symbol table index of the section symbol for @@ -790,6 +791,12 @@ relocate_for_relocatable( psymval); break; + case Relocatable_relocs::RELOC_ADJUST_FOR_SECTION_4_UNALIGNED: + Relocate_functions::rel32_unaligned(padd, + object, + psymval); + break; + default: gold_unreachable(); } diff --git a/gold/testsuite/Makefile.am b/gold/testsuite/Makefile.am index 617905940ce..9b8605bbc45 100644 --- a/gold/testsuite/Makefile.am +++ b/gold/testsuite/Makefile.am @@ -2507,18 +2507,24 @@ pr12826_2.o: pr12826_2.s $(TEST_AS) -o $@ $< check_SCRIPTS += arm_unaligned_reloc.sh -check_DATA += arm_unaligned_reloc.stdout +check_DATA += arm_unaligned_reloc.stdout arm_unaligned_reloc_r.stdout arm_unaligned_reloc.stdout: arm_unaligned_reloc $(TEST_OBJDUMP) -D $< > $@ +arm_unaligned_reloc_r.stdout: arm_unaligned_reloc_r + $(TEST_OBJDUMP) -Dr $< > $@ + arm_unaligned_reloc: arm_unaligned_reloc.o ../ld-new ../ld-new -o $@ $< +arm_unaligned_reloc_r: arm_unaligned_reloc.o ../ld-new + ../ld-new -r -o $@ $< + arm_unaligned_reloc.o: arm_unaligned_reloc.s $(TEST_AS) -o $@ $< -MOSTLYCLEANFILES += arm_unaligned_reloc +MOSTLYCLEANFILES += arm_unaligned_reloc arm_unaligned_reloc_r # Check ARM to ARM farcall veneers diff --git a/gold/testsuite/Makefile.in b/gold/testsuite/Makefile.in index 2f8ed01645f..67149fbb9e7 100644 --- a/gold/testsuite/Makefile.in +++ b/gold/testsuite/Makefile.in @@ -566,6 +566,7 @@ check_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) \ @DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_exidx_test.stdout \ @DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ pr12826.stdout \ @DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_unaligned_reloc.stdout \ +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_unaligned_reloc_r.stdout \ @DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_farcall_arm_arm.stdout \ @DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_farcall_arm_thumb.stdout \ @DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_farcall_arm_thumb_5t.stdout \ @@ -608,6 +609,7 @@ check_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) \ @DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_cortex_a8_local \ @DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_cortex_a8_local_reloc \ @DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_unaligned_reloc \ +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_unaligned_reloc_r \ @DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_farcall_arm_arm \ @DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_farcall_arm_thumb \ @DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ arm_farcall_arm_thumb_5t \ @@ -5457,9 +5459,15 @@ uninstall-am: @DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@arm_unaligned_reloc.stdout: arm_unaligned_reloc @DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ $(TEST_OBJDUMP) -D $< > $@ +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@arm_unaligned_reloc_r.stdout: arm_unaligned_reloc_r +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ $(TEST_OBJDUMP) -Dr $< > $@ + @DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@arm_unaligned_reloc: arm_unaligned_reloc.o ../ld-new @DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ ../ld-new -o $@ $< +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@arm_unaligned_reloc_r: arm_unaligned_reloc.o ../ld-new +@DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ ../ld-new -r -o $@ $< + @DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@arm_unaligned_reloc.o: arm_unaligned_reloc.s @DEFAULT_TARGET_ARM_TRUE@@NATIVE_OR_CROSS_LINKER_TRUE@ $(TEST_AS) -o $@ $< diff --git a/gold/testsuite/arm_unaligned_reloc.sh b/gold/testsuite/arm_unaligned_reloc.sh index 496ee280ffc..39a5a110c6b 100755 --- a/gold/testsuite/arm_unaligned_reloc.sh +++ b/gold/testsuite/arm_unaligned_reloc.sh @@ -47,4 +47,11 @@ check arm_unaligned_reloc.stdout "^ a005: ffffeffb .*$" check arm_unaligned_reloc.stdout "^0000a009 :" check arm_unaligned_reloc.stdout "^ a009: 00009000 .*$" +check arm_unaligned_reloc_r.stdout "^ 1: 00000000 .*$" +check arm_unaligned_reloc_r.stdout "^[ ]*1: R_ARM_ABS32 .data.0$" +check arm_unaligned_reloc_r.stdout "^ 5: 00000000 .*$" +check arm_unaligned_reloc_r.stdout "^[ ]*5: R_ARM_REL32 .data.0$" +check arm_unaligned_reloc_r.stdout "^ 9: 00000000 .*$" +check arm_unaligned_reloc_r.stdout "^[ ]*9: R_ARM_ABS16 .data.0$" + exit 0 -- cgit v1.2.1