From aab2c17756ee5bef0ea5783a460a0990450b3bd5 Mon Sep 17 00:00:00 2001 From: Vladimir Radosavljevic Date: Wed, 15 Mar 2017 16:49:16 -0700 Subject: [PATCH] Mips: Fix TLS LDM GOT entry. gold/ * mips.cc (Mips_got_entry::hash()): Shift addend to reduce possibility of collisions. (Mips_got_entry::equals): Fix case for GOT_TLS_LDM entries. --- gold/ChangeLog | 7 +++++++ gold/mips.cc | 16 +++++++++------- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/gold/ChangeLog b/gold/ChangeLog index d490468e48..d8d67e10a3 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,3 +1,10 @@ +2017-03-15 Vladimir Radosavljevic + + * 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 * mips.cc (Mips_relobj::merge_processor_specific_data_): New data diff --git a/gold/mips.cc b/gold/mips.cc index 4cf3364bda..4fc160bbe9 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* 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.