diff options
author | Doug Kwan <dougkwan@google.com> | 2009-10-21 08:08:41 +0000 |
---|---|---|
committer | Doug Kwan <dougkwan@google.com> | 2009-10-21 08:08:41 +0000 |
commit | b569affa9479c13908aebdb320d6bcb296bb4bf4 (patch) | |
tree | 4133041f66be0dcd020cd40768593f4ae0b39bd1 /gold/gold.h | |
parent | 550e3caf22e336e594c2d3f4eb1596e85ecf13d7 (diff) | |
download | gdb-b569affa9479c13908aebdb320d6bcb296bb4bf4.zip gdb-b569affa9479c13908aebdb320d6bcb296bb4bf4.tar.gz gdb-b569affa9479c13908aebdb320d6bcb296bb4bf4.tar.bz2 |
2009-10-21 Doug Kwan <dougkwan@google.com>
* arm.cc: Update copyright comments.
(Target_arm): New forward class template declaration.
(Arm_address): New type.
(ARM_MAX_FWD_BRANCH_OFFSET, ARM_MAX_BWD_BRANCH_OFFSET,
THM_MAX_FWD_BRANCH_OFFSET, THM_MAX_BWD_BRANCH_OFFSET,
THM2_MAX_FWD_BRANCH_OFFSET, THM2_MAX_BWD_BRANCH_OFFSET): New
constants.
(Insn_template): Same.
(DEF_STUBS): New macro.
(Stub_type): New enum type.
(Stub_template): New class definition.
(Stub): Same.
(Reloc_stub): Same.
(Stub_factory): Same.
(Target_arm::Target_arm): Initialize may_use_blx_ and
should_force_pic_veneer_.
(Target_arm::may_use_blx, Target_arm::set_may_use_blx,
Target_arm::should_force_pic_veneer,
Target_arm::set_should_force_pic_veneer, Target_arm::using_thumb2,
Target_arm::using_thumb_only, Target_arm:;default_target): New
method defintions.
(Target_arm::may_use_blx_, Target_arm::should_force_pic_veneer_):
New data member declarations.
(Insn_template::size, Insn_template::alignment): New method defintions.
(Stub_template::Stub_template): New method definition.
(Reloc_stub::Key::name, Reloc_stub::stub_type_for_reloc,
Reloc_stub::do_fixed_endian_write, Reloc_stub::do_write): Same.
(Stub_factory::Stub_factory): New method definition.
* gold.h (string_hash): New template.
* output.h (Input_section_specifier::hash_value): Use
gold::string_hash.
(Input_section_specifier::string_hash): Remove.
* stringpool.cc (Stringpool_template::string_hash): Use
gold::string_hash.
Diffstat (limited to 'gold/gold.h')
-rw-r--r-- | gold/gold.h | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/gold/gold.h b/gold/gold.h index 3f514cd..dc5a1c1 100644 --- a/gold/gold.h +++ b/gold/gold.h @@ -349,6 +349,43 @@ is_prefix_of(const char* prefix, const char* str) return strncmp(prefix, str, strlen(prefix)) == 0; } +// We sometimes need to hash strings. Ideally we should use std::tr1::hash or +// __gnu_cxx::hash on some systems but there is no guarantee that either +// one is available. For portability, we define simple string hash functions. + +template<typename Char_type> +inline size_t +string_hash(const Char_type* s, size_t length) +{ + // This is the hash function used by the dynamic linker for + // DT_GNU_HASH entries. I compared this to a Fowler/Noll/Vo hash + // for a C++ program with 385,775 global symbols. This hash + // function was very slightly worse. However, it is much faster to + // compute. Overall wall clock time was a win. + const unsigned char* p = reinterpret_cast<const unsigned char*>(s); + size_t h = 5381; + for (size_t i = 0; i < length * sizeof(Char_type); ++i) + h = h * 33 + *p++; + return h; +} + +// Same as above except we expect the string to be zero terminated. + +template<typename Char_type> +inline size_t +string_hash(const Char_type* s) +{ + const unsigned char* p = reinterpret_cast<const unsigned char*>(s); + size_t h = 5381; + for (size_t i = 0; s[i] != 0; ++i) + { + for (size_t j = 0; j < sizeof(Char_type); j++) + h = h * 33 + *p++; + } + + return h; +} + } // End namespace gold. #endif // !defined(GOLD_GOLD_H) |