From: Doug Kwan Date: Fri, 3 Feb 2012 20:01:01 +0000 (+0000) Subject: 2012-02-03 Doug Kwan X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=2c175ebc7499ac7cfae6679f7b1ecbf43e822772;p=binutils-gdb.git 2012-02-03 Doug Kwan * arm.cc (Arm_relocate_functions::abs8, Arm_relocate_functions::abs16): Use Bits::has_signed_unsigned_overflow32. (Arm_relocate_functions::thm_abs8): Correct range of overflow check. * reloc.h (Bits class): Change minimum number of bits from 0 to 1 in assertions. --- diff --git a/gold/ChangeLog b/gold/ChangeLog index 249346ec18e..6c5078e7374 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,3 +1,13 @@ +2012-02-03 Doug Kwan + + * arm.cc (Arm_relocate_functions::abs8, + Arm_relocate_functions::abs16): Use + Bits::has_signed_unsigned_overflow32. + (Arm_relocate_functions::thm_abs8): Correct range of + overflow check. + * reloc.h (Bits class): Change minimum number of bits from 0 to 1 + in assertions. + 2012-02-02 Doug Kwan * arm.cc (Reloc_stub::stub_type_for_reloc): Use PIC stubs in all diff --git a/gold/arm.cc b/gold/arm.cc index ec80d674e55..bc704ccbcb4 100644 --- a/gold/arm.cc +++ b/gold/arm.cc @@ -3183,8 +3183,7 @@ class Arm_relocate_functions : public Relocate_functions<32, big_endian> elfcpp::Swap<8, big_endian>::writeval(wv, val); // R_ARM_ABS8 permits signed or unsigned results. - int signed_x = static_cast(x); - return ((signed_x < -128 || signed_x > 255) + return (Bits<8>::has_signed_unsigned_overflow32(x) ? This::STATUS_OVERFLOW : This::STATUS_OKAY); } @@ -3203,10 +3202,7 @@ class Arm_relocate_functions : public Relocate_functions<32, big_endian> Reltype x = psymval->value(object, addend); val = Bits<32>::bit_select32(val, x << 6, 0x7e0U); elfcpp::Swap<16, big_endian>::writeval(wv, val); - - // R_ARM_ABS16 permits signed or unsigned results. - int signed_x = static_cast(x); - return ((signed_x < -32768 || signed_x > 65535) + return (Bits<5>::has_overflow32(x) ? This::STATUS_OVERFLOW : This::STATUS_OKAY); } @@ -3245,8 +3241,7 @@ class Arm_relocate_functions : public Relocate_functions<32, big_endian> elfcpp::Swap_unaligned<16, big_endian>::writeval(view, val); // R_ARM_ABS16 permits signed or unsigned results. - int signed_x = static_cast(x); - return ((signed_x < -32768 || signed_x > 65536) + return (Bits<16>::has_signed_unsigned_overflow32(x) ? This::STATUS_OVERFLOW : This::STATUS_OKAY); } diff --git a/gold/reloc.h b/gold/reloc.h index 973adb07a12..ec448acc152 100644 --- a/gold/reloc.h +++ b/gold/reloc.h @@ -724,11 +724,11 @@ class Bits { public: // Sign extend an n-bit unsigned integer stored in a uint32_t into - // an int32_t. BITS must be between 0 and 32. + // an int32_t. BITS must be between 1 and 32. static inline int32_t sign_extend32(uint32_t val) { - gold_assert(bits >= 0 && bits <= 32); + gold_assert(bits > 0 && bits <= 32); if (bits == 32) return static_cast(val); uint32_t mask = (~static_cast(0)) >> (32 - bits); @@ -745,7 +745,7 @@ class Bits static inline bool has_overflow32(uint32_t val) { - gold_assert(bits >= 0 && bits <= 32); + gold_assert(bits > 0 && bits <= 32); if (bits == 32) return false; int32_t max = (1 << (bits - 1)) - 1; @@ -761,7 +761,7 @@ class Bits static inline bool has_signed_unsigned_overflow32(uint32_t val) { - gold_assert(bits >= 0 && bits <= 32); + gold_assert(bits > 0 && bits <= 32); if (bits == 32) return false; int32_t max = static_cast((1U << bits) - 1); @@ -778,11 +778,11 @@ class Bits { return (a & ~mask) | (b & mask); } // Sign extend an n-bit unsigned integer stored in a uint64_t into - // an int64_t. BITS must be between 0 and 64. + // an int64_t. BITS must be between 1 and 64. static inline int64_t sign_extend(uint64_t val) { - gold_assert(bits >= 0 && bits <= 64); + gold_assert(bits > 0 && bits <= 64); if (bits == 64) return static_cast(val); uint64_t mask = (~static_cast(0)) >> (64 - bits); @@ -799,7 +799,7 @@ class Bits static inline bool has_overflow(uint64_t val) { - gold_assert(bits >= 0 && bits <= 64); + gold_assert(bits > 0 && bits <= 64); if (bits == 64) return false; int64_t max = (static_cast(1) << (bits - 1)) - 1; @@ -815,7 +815,7 @@ class Bits static inline bool has_signed_unsigned_overflow64(uint64_t val) { - gold_assert(bits >= 0 && bits <= 64); + gold_assert(bits > 0 && bits <= 64); if (bits == 64) return false; int64_t max = static_cast((static_cast(1) << bits) - 1);