diff options
author | Alan Modra <amodra@bigpond.net.au> | 2010-02-21 22:24:02 +0000 |
---|---|---|
committer | Alan Modra <amodra@bigpond.net.au> | 2010-02-21 22:24:02 +0000 |
commit | 74eefc9e97e985e1dddd63ad44937231a4c42358 (patch) | |
tree | 2a586102d1c7b31d79fd6120efee76e92474dfe6 /bfd/reloc.c | |
parent | 3a64a5e1883c91d070a6306f00b695909c1c1c87 (diff) | |
download | binutils-redhat-74eefc9e97e985e1dddd63ad44937231a4c42358.tar.gz |
* reloc.c (bfd_check_overflow): When forming addrmask, shift
fieldmask left by rightshift.
(_bfd_relocate_contents): Likewise. Use rightshift addrmask in all
overflow checks.
Diffstat (limited to 'bfd/reloc.c')
-rw-r--r-- | bfd/reloc.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/bfd/reloc.c b/bfd/reloc.c index dca56d98b7..02496625ef 100644 --- a/bfd/reloc.c +++ b/bfd/reloc.c @@ -1,6 +1,6 @@ /* BFD support for handling relocation entries. Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, - 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 + 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. Written by Cygnus Support. @@ -504,7 +504,7 @@ bfd_check_overflow (enum complain_overflow how, overflow check. */ fieldmask = N_ONES (bitsize); signmask = ~fieldmask; - addrmask = N_ONES (addrsize) | fieldmask; + addrmask = N_ONES (addrsize) | (fieldmask << rightshift); a = (relocation & addrmask) >> rightshift;; switch (how) @@ -1434,9 +1434,11 @@ _bfd_relocate_contents (reloc_howto_type *howto, See also bfd_check_overflow. */ fieldmask = N_ONES (howto->bitsize); signmask = ~fieldmask; - addrmask = N_ONES (bfd_arch_bits_per_address (input_bfd)) | fieldmask; + addrmask = (N_ONES (bfd_arch_bits_per_address (input_bfd)) + | (fieldmask << rightshift)); a = (relocation & addrmask) >> rightshift; b = (x & howto->src_mask & addrmask) >> bitpos; + addrmask >>= rightshift; switch (howto->complain_on_overflow) { @@ -1454,7 +1456,7 @@ _bfd_relocate_contents (reloc_howto_type *howto, field. Note that when bfd_vma is 32 bits, a 32-bit reloc can't overflow, which is exactly what we want. */ ss = a & signmask; - if (ss != 0 && ss != ((addrmask >> rightshift) & signmask)) + if (ss != 0 && ss != (addrmask & signmask)) flag = bfd_reloc_overflow; /* We only need this next bit of code if the sign bit of B @@ -2023,6 +2025,10 @@ ENUMX BFD_RELOC_SPU_PPU64 ENUMX BFD_RELOC_SPU_ADD_PIC +ENUMX + BFD_RELOC_SPU_PIC18 +ENUMX + BFD_RELOC_SPU_STUB ENUMDOC SPU Relocations. |