diff options
-rw-r--r-- | gold/ChangeLog | 7 | ||||
-rw-r--r-- | gold/mips.cc | 16 |
2 files changed, 16 insertions, 7 deletions
diff --git a/gold/ChangeLog b/gold/ChangeLog index d490468..d8d67e1 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,5 +1,12 @@ 2017-03-15 Vladimir Radosavljevic <Vladimir.Radosavljevic@imgtec.com> + * mips.cc (Mips_got_entry::hash()): Shift addend to reduce + possibility of collisions. + (Mips_got_entry::equals): Fix case for GOT_TLS_LDM + entries. + +2017-03-15 Vladimir Radosavljevic <Vladimir.Radosavljevic@imgtec.com> + * mips.cc (Mips_relobj::merge_processor_specific_data_): New data member. (Mips_relobj::merge_processor_specific_data): New method. diff --git a/gold/mips.cc b/gold/mips.cc index 4cf3364..4fc160b 100644 --- a/gold/mips.cc +++ b/gold/mips.cc @@ -474,22 +474,24 @@ class Mips_got_entry ? this->d.object->name().c_str() : this->d.sym->name()); size_t addend = this->addend_; - return name_hash_value ^ this->symndx_ ^ addend; + return name_hash_value ^ this->symndx_ ^ (addend << 16); } // Return whether this entry is equal to OTHER. bool equals(Mips_got_entry<size, big_endian>* other) const { + if (this->symndx_ != other->symndx_ + || this->tls_type_ != other->tls_type_) + return false; + if (this->tls_type_ == GOT_TLS_LDM) return true; - return ((this->tls_type_ == other->tls_type_) - && (this->symndx_ == other->symndx_) - && ((this->symndx_ != -1U) - ? (this->d.object == other->d.object) - : (this->d.sym == other->d.sym)) - && (this->addend_ == other->addend_)); + return (((this->symndx_ != -1U) + ? (this->d.object == other->d.object) + : (this->d.sym == other->d.sym)) + && (this->addend_ == other->addend_)); } // Return input object that needs this GOT entry. |