diff options
author | Doug Kwan <dougkwan@google.com> | 2010-02-27 00:36:49 +0000 |
---|---|---|
committer | Doug Kwan <dougkwan@google.com> | 2010-02-27 00:36:49 +0000 |
commit | 2fd9ae7a1d02f2c5660a36a870285ce5b85fdc7a (patch) | |
tree | f8b2d000f9c4fa183398d9620b7841ce4e0bd8c5 /gold/arm.cc | |
parent | 505c014f5573a9a38c0818e63745e6b2bb8f8a13 (diff) | |
download | gdb-2fd9ae7a1d02f2c5660a36a870285ce5b85fdc7a.zip gdb-2fd9ae7a1d02f2c5660a36a870285ce5b85fdc7a.tar.gz gdb-2fd9ae7a1d02f2c5660a36a870285ce5b85fdc7a.tar.bz2 |
2010-02-26 Doug Kwan <dougkwan@google.com>
* arm.cc (Target_arm::scan_reloc_for_stub): Move code handling
R_ARM_V4BX to Target_arm::scan_reloc_section_for_stubs.
(Target_arm::scan_reloc_section_for_stubs): Instead of calling
scan_reloc_for_stub, do all processing of R_ARM_V4BX here.
* options.cc (General_options::General_options): Initialize member
fix_v4bx_.
* testsuite/Makefile.am (check_SCRIPTS): Add arm_fix_v4bx.sh
(check_DATA): Add arm_fix_v4bx.stdout, arm_fix_v4bx_interworking.stdout
and rm_no_fix_v4bx.stdout
(arm_fix_v4bx.stdout, arm_fix_v4bx, arm_fix_v4bx.o,
arm_fix_v4bx_interworking.stdout, arm_fix_v4bx_interworking,
arm_no_fix_v4bx.stdout, arm_no_fix_v4bx): New make rules.
(MOSTLYCLEANFILES): Add arm_fix_v4bx, arm_fix_v4bx_interworking
and arm_no_fix_v4bx.
* Makefile.in: Regenerate.
* testsuite/arm_fix_v4bx.s: New file.
* testsuite/arm_fix_v4bx.sh: Ditto.
Diffstat (limited to 'gold/arm.cc')
-rw-r--r-- | gold/arm.cc | 59 |
1 files changed, 28 insertions, 31 deletions
diff --git a/gold/arm.cc b/gold/arm.cc index 136fed6..dde2d08 100644 --- a/gold/arm.cc +++ b/gold/arm.cc @@ -9880,30 +9880,6 @@ Target_arm<big_endian>::scan_reloc_for_stub( const Arm_relobj<big_endian>* arm_relobj = Arm_relobj<big_endian>::as_arm_relobj(relinfo->object); - if (r_type == elfcpp::R_ARM_V4BX) - { - const uint32_t reg = (addend & 0xf); - if (this->fix_v4bx() == General_options::FIX_V4BX_INTERWORKING - && reg < 0xf) - { - // Try looking up an existing stub from a stub table. - Stub_table<big_endian>* stub_table = - arm_relobj->stub_table(relinfo->data_shndx); - gold_assert(stub_table != NULL); - - if (stub_table->find_arm_v4bx_stub(reg) == NULL) - { - // create a new stub and add it to stub table. - Arm_v4bx_stub* stub = - this->stub_factory().make_arm_v4bx_stub(reg); - gold_assert(stub != NULL); - stub_table->add_arm_v4bx_stub(stub); - } - } - - return; - } - bool target_is_thumb; Symbol_value<32> symval; if (gsym != NULL) @@ -10094,15 +10070,36 @@ Target_arm<big_endian>::scan_reloc_section_for_stubs( continue; } + // Create a v4bx stub if --fix-v4bx-interworking is used. if (r_type == elfcpp::R_ARM_V4BX) { - // Get the BX instruction. - typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype; - const Valtype* wv = reinterpret_cast<const Valtype*>(view + offset); - elfcpp::Elf_types<32>::Elf_Swxword insn = - elfcpp::Swap<32, big_endian>::readval(wv); - this->scan_reloc_for_stub(relinfo, r_type, NULL, 0, NULL, - insn, NULL); + if (this->fix_v4bx() == General_options::FIX_V4BX_INTERWORKING) + { + // Get the BX instruction. + typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype; + const Valtype* wv = + reinterpret_cast<const Valtype*>(view + offset); + elfcpp::Elf_types<32>::Elf_Swxword insn = + elfcpp::Swap<32, big_endian>::readval(wv); + const uint32_t reg = (insn & 0xf); + + if (reg < 0xf) + { + // Try looking up an existing stub from a stub table. + Stub_table<big_endian>* stub_table = + arm_object->stub_table(relinfo->data_shndx); + gold_assert(stub_table != NULL); + + if (stub_table->find_arm_v4bx_stub(reg) == NULL) + { + // create a new stub and add it to stub table. + Arm_v4bx_stub* stub = + this->stub_factory().make_arm_v4bx_stub(reg); + gold_assert(stub != NULL); + stub_table->add_arm_v4bx_stub(stub); + } + } + } continue; } |