summaryrefslogtreecommitdiff
path: root/bfd/reloc.c
diff options
context:
space:
mode:
authorAlan Modra <amodra@bigpond.net.au>2010-02-21 22:24:02 +0000
committerAlan Modra <amodra@bigpond.net.au>2010-02-21 22:24:02 +0000
commit74eefc9e97e985e1dddd63ad44937231a4c42358 (patch)
tree2a586102d1c7b31d79fd6120efee76e92474dfe6 /bfd/reloc.c
parent3a64a5e1883c91d070a6306f00b695909c1c1c87 (diff)
downloadbinutils-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.c14
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.