diff options
author | Doug Kwan <dougkwan@google.com> | 2010-02-04 03:32:18 +0000 |
---|---|---|
committer | Doug Kwan <dougkwan@google.com> | 2010-02-04 03:32:18 +0000 |
commit | 5c57f1be7b46ac95e44467c234e034e9e0389589 (patch) | |
tree | 9935fb1705ce73ee89c1e2c979ebbd68c77c18be /gold/arm-reloc-property.cc | |
parent | 2876f0394e5680a2b0669be872baead90ba01942 (diff) | |
download | fsf-binutils-gdb-5c57f1be7b46ac95e44467c234e034e9e0389589.zip fsf-binutils-gdb-5c57f1be7b46ac95e44467c234e034e9e0389589.tar.gz fsf-binutils-gdb-5c57f1be7b46ac95e44467c234e034e9e0389589.tar.bz2 |
2010-02-03 Doug Kwan <dougkwan@google.com>
* arm-reloc-property.cc
(Arm_reloc_property_table::reloc_name_in_error_message): New method
definition.
* arm-reloc-property.h
(Arm_reloc_property_table::get_implemented_static_reloc_property):
New method definition.
(Arm_reloc_property_table::reloc_name_in_error_message): New method
declaration.
* arm-reloc.def (THM_MOVT_ABS, THM_MOVT_PREL, THM_MOVT_BREL): Change
overflow to N.
(GOT_PREL): Change implemented to Y.
* arm.cc (Target_arm::reloc_uses_thumb_bit): Remove method.
(Target_arm::Relocate::reloc_needs_sym_origin): Remove method.
(Arm_relocate_functions::movw_abs_nc): Remove method.
(Arm_relocate_functions::movt_abs): Ditto.
(Arm_relocate_functions::thm_movw_abs_nc): Ditto.
(Arm_relocate_functions::thm_movt_abs): Ditto.
(Arm_relocate_functions::movw_rel_nc): Ditto.
(Arm_relocate_functions::movw_rel): Ditto.
(Arm_relocate_functions::movt_rel): Ditto.
(Arm_relocate_functions:thm_movw_rel_nc): Ditto.
(Arm_relocate_functions:thm_movw_rel): Ditto.
(Arm_relocate_functions:thm_movt_rel): Ditto.
(Arm_relocate_functions::movw, Arm_relocate_functions::movt,
(Arm_relocate_functions::thm_movw, Arm_relocate_functions::thm_movt):
New method definitions.
(Arm_relocation_functions::arm_grp_alu): Add assertion for group index.
(Arm_relocation_functions::arm_grp_ldr): Ditto.
(Arm_relocation_functions::arm_grp_ldrs): Ditto.
(Arm_relocation_functions::arm_grp_ldc): Ditto.
(Target_arm::Relocate::relocate): Check for non-static or
unimplemented relocation code and exit early. Change calls to
Target_arm::reloc_uses_thumb_bit and
Target_arm::Reloc::reloc_needs_sym_origin to use relocation property
instead. Refactor code to handle similar relocations to increase
code sharing. Remove check for unsupported relocation code in switch
statement.
(Target_arm::Relocatable_size_for_reloc::get_size_for_reloc): Use
relocation property table to find out size. Change error message to
print out the name of a relocation code instead of the numeric value.
(Target_arm::scan_reloc_for_stub): Use relocation property table
instead of calling Target_arm::reloc_uses_thumb_bit().
Diffstat (limited to 'gold/arm-reloc-property.cc')
-rw-r--r-- | gold/arm-reloc-property.cc | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/gold/arm-reloc-property.cc b/gold/arm-reloc-property.cc index ae93c47..ab37263 100644 --- a/gold/arm-reloc-property.cc +++ b/gold/arm-reloc-property.cc @@ -284,4 +284,47 @@ Arm_reloc_property_table::Arm_reloc_property_table() #undef RD } +// Return a string describing a relocation code that fails to get a +// relocation property in get_implemented_static_reloc_property(). + +std::string +Arm_reloc_property_table::reloc_name_in_error_message(unsigned int code) +{ + gold_assert(code < Property_table_size); + + const Arm_reloc_property* arp = this->table_[code]; + + if (arp == NULL) + { + char buffer[100]; + sprintf(buffer, _("invalid reloc %u"), code); + return std::string(buffer); + } + + // gold only implements static relocation codes. + Arm_reloc_property::Reloc_type reloc_type = arp->reloc_type(); + gold_assert(reloc_type == Arm_reloc_property::RT_STATIC + || !arp->is_implemented()); + + const char* prefix = NULL; + switch (reloc_type) + { + case Arm_reloc_property::RT_STATIC: + prefix = arp->is_implemented() ? _("reloc ") : _("unimplemented reloc "); + break; + case Arm_reloc_property::RT_DYNAMIC: + prefix = _("dynamic reloc "); + break; + case Arm_reloc_property::RT_PRIVATE: + prefix = _("private reloc "); + break; + case Arm_reloc_property::RT_OBSOLETE: + prefix = _("obsolete reloc "); + break; + default: + gold_unreachable(); + } + return std::string(prefix) + arp->name(); +} + } // End namespace gold. |