source: patches/binutils-2.19-branch_update-1.patch@ d0bedea

clfs-1.2 clfs-2.1 clfs-3.0.0-systemd clfs-3.0.0-sysvinit systemd sysvinit
Last change on this file since d0bedea was c3f01f3, checked in by Jim Gifford <clfs@…>, 16 years ago

Updated to Binutils 2.19

  • Property mode set to 100644
File size: 37.2 KB
  • bfd/ChangeLog

    Submitted By: Jim Gifford (jim at linuxfromscratch dot org)
    Date: 12-21-2008
    Initial Package Version: 2.19
    Origin: Upstream
    Upstream Status: Applied
    Description: This is a branch update for binutils-2.19, and should be
                 rechecked periodically.
    
    diff -Naur binutils-2.19.orig/bfd/ChangeLog binutils-2.19/bfd/ChangeLog
    old new  
     12008-11-20  Alan Modra  <amodra@bigpond.net.au>
     2
     3        * elf32-ppc.c (allocate_dynrelocs): Always use tlsld_got for
     4        TLS_LD even when symbol is used with other TLS reloc types.
     5        (ppc_elf_relocate_section): Bypass symbol checks when using tlsld_got.
     6        Leave addend zero on LD DTPMOD dynamic reloc.
     7
     82008-11-17  Eric B. Weddington  <eric.weddington@atmel.com>
     9
     10        PR 7022
     11        * elf32-avr.c (bfd_elf_avr_final_write_processing):
     12        Add missing break statements.
     13
     142008-10-28  Tristan Gingold  <gingold@adacore.com>
     15
     16        * configure.in: Bump version to 2.19.0
     17        * Makefile.am (RELEASE): Unset.
     18        * configure, Makefile.in: Regenerated.
     19
    1202008-10-16  Tristan Gingold  <gingold@adacore.com>
    221
    322        * configure.in: Bump version to 2.19
  • bfd/Makefile.in

    diff -Naur binutils-2.19.orig/bfd/Makefile.in binutils-2.19/bfd/Makefile.in
    old new  
    271271ACLOCAL_AMFLAGS = -I . -I .. -I ../config
    272272
    273273# Uncomment the following line when doing a release.
    274 RELEASE = y
     274RELEASE=y
    275275INCDIR = $(srcdir)/../include
    276276CSEARCH = -I. -I$(srcdir) -I$(INCDIR)
    277277MKDEP = gcc -MM
  • bfd/configure

    diff -Naur binutils-2.19.orig/bfd/configure binutils-2.19/bfd/configure
    old new  
    30323032
    30333033# Define the identity of the package.
    30343034 PACKAGE=bfd
    3035  VERSION=2.19
     3035 VERSION=2.19.0
    30363036
    30373037
    30383038cat >>confdefs.h <<_ACEOF
  • bfd/configure.in

    diff -Naur binutils-2.19.orig/bfd/configure.in binutils-2.19/bfd/configure.in
    old new  
    88AC_CANONICAL_TARGET
    99AC_ISC_POSIX
    1010
    11 AM_INIT_AUTOMAKE(bfd, 2.19)
     11AM_INIT_AUTOMAKE(bfd, 2.19.0)
    1212
    1313dnl These must be called before LT_INIT, because it may want
    1414dnl to call AC_CHECK_PROG.
  • bfd/elf32-avr.c

    diff -Naur binutils-2.19.orig/bfd/elf32-avr.c binutils-2.19/bfd/elf32-avr.c
    old new  
    12981298
    12991299    case bfd_mach_avr25:
    13001300      val = E_AVR_MACH_AVR25;
     1301      break;
    13011302
    13021303    case bfd_mach_avr3:
    13031304      val = E_AVR_MACH_AVR3;
     
    13051306
    13061307    case bfd_mach_avr31:
    13071308      val = E_AVR_MACH_AVR31;
     1309      break;
    13081310
    13091311    case bfd_mach_avr35:
    13101312      val = E_AVR_MACH_AVR35;
     1313      break;
    13111314
    13121315    case bfd_mach_avr4:
    13131316      val = E_AVR_MACH_AVR4;
  • bfd/elf32-ppc.c

    diff -Naur binutils-2.19.orig/bfd/elf32-ppc.c binutils-2.19/bfd/elf32-ppc.c
    old new  
    49974997  eh = (struct ppc_elf_link_hash_entry *) h;
    49984998  if (eh->elf.got.refcount > 0)
    49994999    {
     5000      bfd_boolean dyn;
     5001      unsigned int need;
     5002
    50005003      /* Make sure this symbol is output as a dynamic symbol.  */
    50015004      if (eh->elf.dynindx == -1
    50025005          && !eh->elf.forced_local
     
    50065009            return FALSE;
    50075010        }
    50085011
    5009       if (eh->tls_mask == (TLS_TLS | TLS_LD)
    5010           && !eh->elf.def_dynamic)
    5011         {
    5012           /* If just an LD reloc, we'll just use htab->tlsld_got.offset.  */
    5013           htab->tlsld_got.refcount += 1;
    5014           eh->elf.got.offset = (bfd_vma) -1;
    5015         }
    5016       else
     5012      need = 0;
     5013      if ((eh->tls_mask & TLS_TLS) != 0)
    50175014        {
    5018           bfd_boolean dyn;
    5019           unsigned int need = 0;
    5020           if ((eh->tls_mask & TLS_TLS) != 0)
     5015          if ((eh->tls_mask & TLS_LD) != 0)
    50215016            {
    5022               if ((eh->tls_mask & TLS_LD) != 0)
    5023                 need += 8;
    5024               if ((eh->tls_mask & TLS_GD) != 0)
     5017              if (!eh->elf.def_dynamic)
     5018                /* We'll just use htab->tlsld_got.offset.  This should
     5019                   always be the case.  It's a little odd if we have
     5020                   a local dynamic reloc against a non-local symbol.  */
     5021                htab->tlsld_got.refcount += 1;
     5022              else
    50255023                need += 8;
    5026               if ((eh->tls_mask & (TLS_TPREL | TLS_TPRELGD)) != 0)
    5027                 need += 4;
    5028               if ((eh->tls_mask & TLS_DTPREL) != 0)
    5029                 need += 4;
    50305024            }
    5031           else
     5025          if ((eh->tls_mask & TLS_GD) != 0)
     5026            need += 8;
     5027          if ((eh->tls_mask & (TLS_TPREL | TLS_TPRELGD)) != 0)
     5028            need += 4;
     5029          if ((eh->tls_mask & TLS_DTPREL) != 0)
    50325030            need += 4;
     5031        }
     5032      else
     5033        need += 4;
     5034      if (need == 0)
     5035        eh->elf.got.offset = (bfd_vma) -1;
     5036      else
     5037        {
    50335038          eh->elf.got.offset = allocate_got (htab, need);
    50345039          dyn = htab->elf.dynamic_sections_created;
    50355040          if ((info->shared
     
    50395044            {
    50405045              /* All the entries we allocated need relocs.
    50415046                 Except LD only needs one.  */
    5042               if ((eh->tls_mask & TLS_LD) != 0)
     5047              if ((eh->tls_mask & TLS_LD) != 0
     5048                  && eh->elf.def_dynamic)
    50435049                need -= 4;
    50445050              htab->relgot->size += need * (sizeof (Elf32_External_Rela) / 4);
    50455051            }
     
    52755281      for (; local_got < end_local_got; ++local_got, ++lgot_masks)
    52765282        if (*local_got > 0)
    52775283          {
    5278             if (*lgot_masks == (TLS_TLS | TLS_LD))
     5284            unsigned int need = 0;
     5285            if ((*lgot_masks & TLS_TLS) != 0)
    52795286              {
    5280                 /* If just an LD reloc, we'll just use
    5281                    htab->tlsld_got.offset.  */
    5282                 htab->tlsld_got.refcount += 1;
    5283                 *local_got = (bfd_vma) -1;
     5287                if ((*lgot_masks & TLS_GD) != 0)
     5288                  need += 8;
     5289                if ((*lgot_masks & TLS_LD) != 0)
     5290                  htab->tlsld_got.refcount += 1;
     5291                if ((*lgot_masks & (TLS_TPREL | TLS_TPRELGD)) != 0)
     5292                  need += 4;
     5293                if ((*lgot_masks & TLS_DTPREL) != 0)
     5294                  need += 4;
    52845295              }
    52855296            else
     5297              need += 4;
     5298            if (need == 0)
     5299              *local_got = (bfd_vma) -1;
     5300            else
    52865301              {
    5287                 unsigned int need = 0;
    5288                 if ((*lgot_masks & TLS_TLS) != 0)
    5289                   {
    5290                     if ((*lgot_masks & TLS_GD) != 0)
    5291                       need += 8;
    5292                     if ((*lgot_masks & (TLS_TPREL | TLS_TPRELGD)) != 0)
    5293                       need += 4;
    5294                     if ((*lgot_masks & TLS_DTPREL) != 0)
    5295                       need += 4;
    5296                   }
    5297                 else
    5298                   need += 4;
    52995302                *local_got = allocate_got (htab, need);
    53005303                if (info->shared)
    53015304                  htab->relgot->size += (need
     
    65606563
    65616564                    /* Generate relocs for the dynamic linker.  */
    65626565                    if ((info->shared || indx != 0)
    6563                         && (h == NULL
     6566                        && (offp == &htab->tlsld_got.offset
     6567                            || h == NULL
    65646568                            || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
    65656569                            || h->root.type != bfd_link_hash_undefweak))
    65666570                      {
     
    65916595                          outrel.r_info = ELF32_R_INFO (indx, R_PPC_RELATIVE);
    65926596                        else
    65936597                          outrel.r_info = ELF32_R_INFO (indx, R_PPC_GLOB_DAT);
    6594                         if (indx == 0)
     6598                        if (indx == 0 && tls_ty != (TLS_TLS | TLS_LD))
    65956599                          {
    65966600                            outrel.r_addend += relocation;
    65976601                            if (tls_ty & (TLS_GD | TLS_DTPREL | TLS_TPREL))
  • bfd/version.h

    diff -Naur binutils-2.19.orig/bfd/version.h binutils-2.19/bfd/version.h
    old new  
    1 #define BFD_VERSION_DATE 20081016
     1#define BFD_VERSION_DATE 20081220
    22#define BFD_VERSION @bfd_version@
    33#define BFD_VERSION_STRING  @bfd_version_package@ @bfd_version_string@
    44#define REPORT_BUGS_TO @report_bugs_to@
  • binutils/ChangeLog

    diff -Naur binutils-2.19.orig/binutils/ChangeLog binutils-2.19/binutils/ChangeLog
    old new  
     12008-12-01  Nick Clifton  <nickc@redhat.com>
     2
     3        PR 7044
     4        * dlltool.c (run): Use formatting string to avoid compile time
     5        warning.
     6        (gen_exp_file): Check return value from fread.
     7        * windmc.c (main): Check return value from fread.
     8
    192008-09-25  Richard Henderson  <rth@redhat.com>
    210
    311        * dwarf.c (size_of_encoded_value, get_encoded_value): Move up.
  • binutils/dlltool.c

    diff -Naur binutils-2.19.orig/binutils/dlltool.c binutils-2.19/binutils/dlltool.c
    old new  
    12061206
    12071207  if (pid == -1)
    12081208    {
    1209       inform (strerror (errno));
     1209      inform ("%s", strerror (errno));
    12101210
    12111211      fatal (errmsg_fmt, errmsg_arg);
    12121212    }
     
    19921992      numbytes = ftell (base_file);
    19931993      fseek (base_file, 0, SEEK_SET);
    19941994      copy = xmalloc (numbytes);
    1995       fread (copy, 1, numbytes, base_file);
     1995      if (fread (copy, 1, numbytes, base_file) < numbytes)
     1996        fatal (_("failed to read the number of entries from base file"));
    19961997      num_entries = numbytes / sizeof (long);
    19971998
    1998 
    19991999      fprintf (f, "\t.section\t.reloc\n");
    20002000      if (num_entries)
    20012001        {
  • binutils/windmc.c

    diff -Naur binutils-2.19.orig/binutils/windmc.c binutils-2.19/binutils/windmc.c
    old new  
    11551155    fseek (fp, 0, SEEK_SET);
    11561156    buff = malloc (flen + 3);
    11571157    memset (buff, 0, flen + 3);
    1158     fread (buff, 1, flen, fp);
     1158    if (fread (buff, 1, flen, fp) < flen)
     1159      fatal (_("unable to read contents of %s"), input_filename);
    11591160    fclose (fp);
    11601161    if (mcset_text_in_is_unicode != 1)
    11611162      {
  • configure.ac

    diff -Naur binutils-2.19.orig/configure.ac binutils-2.19/configure.ac
    old new  
    166166# binutils, gas and ld appear in that order because it makes sense to run
    167167# "make check" in that particular order.
    168168# If --enable-gold is used, "gold" will replace "ld".
    169 host_tools="byacc flex bison binutils gas ld fixincludes gcc sid sim gdb make patch prms send-pr gprof etc expect dejagnu ash bash bzip2 m4 autoconf automake libtool diff rcs fileutils shellutils time textutils wdiff find uudecode hello tar gzip indent recode release sed utils guile perl gawk findutils gettext zip fastjar gnattools"
     169host_tools="texinfo byacc flex bison binutils gas ld fixincludes gcc sid sim gdb make patch prms send-pr gprof etc expect dejagnu ash bash bzip2 m4 autoconf automake libtool diff rcs fileutils shellutils time textutils wdiff find uudecode hello tar gzip indent recode release sed utils guile perl gawk findutils gettext zip fastjar gnattools"
    170170
    171171# libgcj represents the runtime libraries only used by gcj.
    172172libgcj="target-libffi \
  • ld/ChangeLog

    diff -Naur binutils-2.19.orig/ld/ChangeLog binutils-2.19/ld/ChangeLog
    old new  
     12008-11-14  Alan Modra  <amodra@bigpond.net.au>
     2
     3        * Makefile.am (spu_ovl.o_c): Add missing line continuations.
     4        * Makefile.in: Regenerate.
     5
    162008-10-05  Alan Modra  <amodra@bigpond.net.au>
    27
    38        PR 6943
  • ld/Makefile.am

    diff -Naur binutils-2.19.orig/ld/Makefile.am binutils-2.19/ld/Makefile.am
    old new  
    758758$(srcdir)/emultempl/spu_ovl.o_c: @MAINT@ $(srcdir)/emultempl/spu_ovl.S
    759759        if ../gas/as-new --version \
    760760                | grep 'target.*spu' >/dev/null 2>/dev/null; then \
    761           cpp -DOVLY_IRQ_SAVE $(srcdir)/emultempl/spu_ovl.S spu_ovl.s
     761          cpp -DOVLY_IRQ_SAVE $(srcdir)/emultempl/spu_ovl.S spu_ovl.s; \
    762762          ../gas/as-new -o spu_ovl.o spu_ovl.s; \
    763           ../binutils/bin2c <spu_ovl.o >$@
     763          ../binutils/bin2c <spu_ovl.o >$@; \
    764764        fi
    765765eelf32_i860.c: $(srcdir)/emulparams/elf32_i860.sh \
    766766  $(ELF_GEN_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
  • ld/Makefile.in

    diff -Naur binutils-2.19.orig/ld/Makefile.in binutils-2.19/ld/Makefile.in
    old new  
    15881588$(srcdir)/emultempl/spu_ovl.o_c: @MAINT@ $(srcdir)/emultempl/spu_ovl.S
    15891589        if ../gas/as-new --version \
    15901590                | grep 'target.*spu' >/dev/null 2>/dev/null; then \
    1591           cpp -DOVLY_IRQ_SAVE $(srcdir)/emultempl/spu_ovl.S spu_ovl.s
     1591          cpp -DOVLY_IRQ_SAVE $(srcdir)/emultempl/spu_ovl.S spu_ovl.s; \
    15921592          ../gas/as-new -o spu_ovl.o spu_ovl.s; \
    1593           ../binutils/bin2c <spu_ovl.o >$@
     1593          ../binutils/bin2c <spu_ovl.o >$@; \
    15941594        fi
    15951595eelf32_i860.c: $(srcdir)/emulparams/elf32_i860.sh \
    15961596  $(ELF_GEN_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
  • opcodes/ChangeLog

    diff -Naur binutils-2.19.orig/opcodes/ChangeLog binutils-2.19/opcodes/ChangeLog
    old new  
     12008-11-27  Alan Modra  <amodra@bigpond.net.au>
     2
     3        * ppc-opc.c (extract_sprg): Correct operand range check.
     4
     52008-11-26  Andreas Schwab  <schwab@suse.de>
     6
     7        * m68k-dis.c (NEXTBYTE, NEXTWORD, NEXTLONG, NEXTULONG, NEXTSINGLE)
     8        (NEXTDOUBLE, NEXTEXTEND, NEXTPACKED): Fix error handling.
     9        (save_printer, save_print_address): Remove.
     10        (fetch_data): Don't use them.
     11        (match_insn_m68k): Always restore printing functions.
     12        (print_insn_m68k): Don't save/restore printing functions.
     13
     142008-11-25  Nick Clifton  <nickc@redhat.com>
     15
     16        * m68k-dis.c: Rewrite to remove use of setjmp/longjmp.
     17
    1182008-09-29  Nick Clifton  <nickc@redhat.com>
    219
    320        * po/vi.po: Updated Vietnamese translation.
  • opcodes/m68k-dis.c

    diff -Naur binutils-2.19.orig/opcodes/m68k-dis.c binutils-2.19/opcodes/m68k-dis.c
    old new  
    6060#endif
    6161
    6262/* Get a 1 byte signed integer.  */
    63 #define NEXTBYTE(p)  (p += 2, FETCH_DATA (info, p), COERCE_SIGNED_CHAR(p[-1]))
     63#define NEXTBYTE(p, val)                        \
     64  do                                            \
     65    {                                           \
     66      p += 2;                                   \
     67      if (!FETCH_DATA (info, p))                \
     68        return -3;                              \
     69      val = COERCE_SIGNED_CHAR (p[-1]);         \
     70    }                                           \
     71  while (0)
    6472
    6573/* Get a 2 byte signed integer.  */
    6674#define COERCE16(x) ((int) (((x) ^ 0x8000) - 0x8000))
    67 #define NEXTWORD(p)  \
    68   (p += 2, FETCH_DATA (info, p), \
    69    COERCE16 ((p[-2] << 8) + p[-1]))
     75
     76#define NEXTWORD(p, val, ret_val)               \
     77  do                                            \
     78    {                                           \
     79      p += 2;                                   \
     80      if (!FETCH_DATA (info, p))                \
     81        return ret_val;                         \
     82      val = COERCE16 ((p[-2] << 8) + p[-1]);    \
     83    }                                           \
     84  while (0)                                             
    7085
    7186/* Get a 4 byte signed integer.  */
    7287#define COERCE32(x) ((bfd_signed_vma) ((x) ^ 0x80000000) - 0x80000000)
    73 #define NEXTLONG(p)  \
    74   (p += 4, FETCH_DATA (info, p), \
    75    (COERCE32 ((((((p[-4] << 8) + p[-3]) << 8) + p[-2]) << 8) + p[-1])))
     88
     89#define NEXTLONG(p, val, ret_val)                                       \
     90  do                                                                    \
     91    {                                                                   \
     92      p += 4;                                                           \
     93      if (!FETCH_DATA (info, p))                                        \
     94        return ret_val;                                                 \
     95      val = COERCE32 ((((((p[-4] << 8) + p[-3]) << 8) + p[-2]) << 8) + p[-1]); \
     96    }                                                                   \
     97  while (0)
    7698
    7799/* Get a 4 byte unsigned integer.  */
    78 #define NEXTULONG(p)  \
    79   (p += 4, FETCH_DATA (info, p), \
    80    (unsigned int) ((((((p[-4] << 8) + p[-3]) << 8) + p[-2]) << 8) + p[-1]))
     100#define NEXTULONG(p, val)                                               \
     101  do                                                                    \
     102    {                                                                   \
     103      p += 4;                                                           \
     104      if (!FETCH_DATA (info, p))                                        \
     105        return -3;                                                      \
     106      val = (unsigned int) ((((((p[-4] << 8) + p[-3]) << 8) + p[-2]) << 8) + p[-1]); \
     107    }                                                                   \
     108  while (0)
    81109
    82110/* Get a single precision float.  */
    83 #define NEXTSINGLE(val, p) \
    84   (p += 4, FETCH_DATA (info, p), \
    85    floatformat_to_double (&floatformat_ieee_single_big, (char *) p - 4, &val))
     111#define NEXTSINGLE(val, p)                                      \
     112  do                                                            \
     113    {                                                           \
     114      p += 4;                                                   \
     115      if (!FETCH_DATA (info, p))                                \
     116        return -3;                                              \
     117      floatformat_to_double (& floatformat_ieee_single_big,     \
     118                             (char *) p - 4, & val);            \
     119    }                                                           \
     120  while (0)
    86121
    87122/* Get a double precision float.  */
    88 #define NEXTDOUBLE(val, p) \
    89   (p += 8, FETCH_DATA (info, p), \
    90    floatformat_to_double (&floatformat_ieee_double_big, (char *) p - 8, &val))
     123#define NEXTDOUBLE(val, p)                                      \
     124  do                                                            \
     125    {                                                           \
     126      p += 8;                                                   \
     127      if (!FETCH_DATA (info, p))                                \
     128        return -3;                                              \
     129      floatformat_to_double (& floatformat_ieee_double_big,     \
     130                             (char *) p - 8, & val);            \
     131    }                                                           \
     132  while (0)
    91133
    92134/* Get an extended precision float.  */
    93 #define NEXTEXTEND(val, p) \
    94   (p += 12, FETCH_DATA (info, p), \
    95    floatformat_to_double (&floatformat_m68881_ext, (char *) p - 12, &val))
     135#define NEXTEXTEND(val, p)                              \
     136  do                                                    \
     137    {                                                   \
     138      p += 12;                                          \
     139      if (!FETCH_DATA (info, p))                        \
     140        return -3;                                      \
     141      floatformat_to_double (& floatformat_m68881_ext,  \
     142                             (char *) p - 12, & val);   \
     143    }                                                   \
     144  while (0)
    96145
    97146/* Need a function to convert from packed to double
    98147   precision.   Actually, it's easier to print a
    99148   packed number than a double anyway, so maybe
    100149   there should be a special case to handle this... */
    101 #define NEXTPACKED(p) \
    102   (p += 12, FETCH_DATA (info, p), 0.0)
     150#define NEXTPACKED(p, val)                      \
     151  do                                            \
     152    {                                           \
     153      p += 12;                                  \
     154      if (!FETCH_DATA (info, p))                \
     155        return -3;                              \
     156      val = 0.0;                                \
     157    }                                           \
     158  while (0)
     159
    103160
    104161
    105162/* Maximum length of an instruction.  */
  • opcodes/ppc-opc.c

     #define MAXLEN 22
    @@ -112,12 +169,10 @@
       bfd_byte *max_fetched;
       bfd_byte the_buffer[MAXLEN];
       bfd_vma insn_start;
    -  jmp_buf bailout;
     };
     
     /* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive)
    -   to ADDR (exclusive) are valid.  Returns 1 for success, longjmps
    -   on error.  */
    +   to ADDR (exclusive) are valid.  Returns 1 for success, 0 on error.  */
     #define FETCH_DATA(info, addr) \
       ((addr) <= ((struct private *) (info->private_data))->max_fetched \
        ? 1 : fetch_data ((info), (addr)))
    @@ -136,7 +191,7 @@
       if (status != 0)
         {
           (*info->memory_error_func) (status, start, info);
    -      longjmp (priv->bailout, 1);
    +      return 0;
         }
       else
         priv->max_fetched = addr;
    @@ -161,7 +216,8 @@
     /* Fetch BITS bits from a position in the instruction specified by CODE.
        CODE is a "place to put an argument", or 'x' for a destination
        that is a general address (mode and register).
    -   BUFFER contains the instruction.  */
    +   BUFFER contains the instruction.
    +   Returns -1 on failure.  */
     
     static int
     fetch_arg (unsigned char *buffer,
    @@ -216,64 +272,75 @@
           break;
     
         case 'k':
    -      FETCH_DATA (info, buffer + 3);
    +      if (! FETCH_DATA (info, buffer + 3))
    +	return -1;
           val = (buffer[3] >> 4);
           break;
     
         case 'C':
    -      FETCH_DATA (info, buffer + 3);
    +      if (! FETCH_DATA (info, buffer + 3))
    +	return -1;
           val = buffer[3];
           break;
     
         case '1':
    -      FETCH_DATA (info, buffer + 3);
    +      if (! FETCH_DATA (info, buffer + 3))
    +	return -1;
           val = (buffer[2] << 8) + buffer[3];
           val >>= 12;
           break;
     
         case '2':
    -      FETCH_DATA (info, buffer + 3);
    +      if (! FETCH_DATA (info, buffer + 3))
    +	return -1;
           val = (buffer[2] << 8) + buffer[3];
           val >>= 6;
           break;
     
         case '3':
         case 'j':
    -      FETCH_DATA (info, buffer + 3);
    +      if (! FETCH_DATA (info, buffer + 3))
    +	return -1;
           val = (buffer[2] << 8) + buffer[3];
           break;
     
         case '4':
    -      FETCH_DATA (info, buffer + 5);
    +      if (! FETCH_DATA (info, buffer + 5))
    +	return -1;
           val = (buffer[4] << 8) + buffer[5];
           val >>= 12;
           break;
     
         case '5':
    -      FETCH_DATA (info, buffer + 5);
    +      if (! FETCH_DATA (info, buffer + 5))
    +	return -1;
           val = (buffer[4] << 8) + buffer[5];
           val >>= 6;
           break;
     
         case '6':
    -      FETCH_DATA (info, buffer + 5);
    +      if (! FETCH_DATA (info, buffer + 5))
    +	return -1;
           val = (buffer[4] << 8) + buffer[5];
           break;
     
         case '7':
    -      FETCH_DATA (info, buffer + 3);
    +      if (! FETCH_DATA (info, buffer + 3))
    +	return -1;
           val = (buffer[2] << 8) + buffer[3];
           val >>= 7;
           break;
     
         case '8':
    -      FETCH_DATA (info, buffer + 3);
    +      if (! FETCH_DATA (info, buffer + 3))
    +	return -1;
           val = (buffer[2] << 8) + buffer[3];
           val >>= 10;
           break;
     
         case '9':
    -      FETCH_DATA (info, buffer + 3);
    +      if (! FETCH_DATA (info, buffer + 3))
    +	return -1;
           val = (buffer[2] << 8) + buffer[3];
           val >>= 5;
           break;
    @@ -283,7 +350,8 @@
           break;
     
         case 'E':
    -      FETCH_DATA (info, buffer + 3);
    +      if (! FETCH_DATA (info, buffer + 3))
    +	return -1;
           val = (buffer[2] >> 1);
           break;
     
    @@ -450,7 +518,8 @@
     
     /* Print an indexed argument.  The base register is BASEREG (-1 for pc).
        P points to extension word, in buffer.
    -   ADDR is the nominal core address of that extension word.  */
    +   ADDR is the nominal core address of that extension word.
    +   Returns NULL upon error.  */
     
     static unsigned char *
     print_indexed (int basereg,
    @@ -465,7 +534,7 @@
       char buf[40];
       char vmabuf[50];
     
    -  word = NEXTWORD (p);
    +  NEXTWORD (p, word, NULL);
     
       /* Generate the text for the index register.
          Where this will be output is not yet determined.  */
    @@ -503,10 +572,10 @@
       switch ((word >> 4) & 3)
         {
         case 2:
    -      base_disp = NEXTWORD (p);
    +      NEXTWORD (p, base_disp, NULL);
           break;
         case 3:
    -      base_disp = NEXTLONG (p);
    +      NEXTLONG (p, base_disp, NULL);
         }
       if (basereg == -1)
         base_disp += addr;
    @@ -526,10 +595,10 @@
       switch (word & 3)
         {
         case 2:
    -      outer_disp = NEXTWORD (p);
    +      NEXTWORD (p, outer_disp, NULL);
           break;
         case 3:
    -      outer_disp = NEXTLONG (p);
    +      NEXTLONG (p, outer_disp, NULL);
         }
     
       print_base (basereg, base_disp, info);
    @@ -547,9 +616,18 @@
       return p;
     }
     
    +#define FETCH_ARG(size, val)				\
    +  do							\
    +    {							\
    +      val = fetch_arg (buffer, place, size, info);	\
    +      if (val < 0)					\
    +	return -3;					\
    +    }							\
    +  while (0)
    +
     /* Returns number of bytes "eaten" by the operand, or
        return -1 if an invalid operand was found, or -2 if
    -   an opcode tabe error was found.
    +   an opcode tabe error was found or -3 to simply abort.
        ADDR is the pc for this arg to be relative to.  */
     
     static int
    @@ -575,23 +653,21 @@
         case 'c':		/* Cache identifier.  */
           {
             static char *const cacheFieldName[] = { "nc", "dc", "ic", "bc" };
    -        val = fetch_arg (buffer, place, 2, info);
    -        (*info->fprintf_func) (info->stream, cacheFieldName[val]);
    +        FETCH_ARG (2, val);
    +	(*info->fprintf_func) (info->stream, cacheFieldName[val]);
             break;
           }
     
         case 'a':		/* Address register indirect only. Cf. case '+'.  */
           {
    -        (*info->fprintf_func)
    -	  (info->stream,
    -	   "%s@",
    -	   reg_names[fetch_arg (buffer, place, 3, info) + 8]);
    +	FETCH_ARG (3, val);
    +	(*info->fprintf_func) (info->stream, "%s@", reg_names[val + 8]);
             break;
           }
     
         case '_':		/* 32-bit absolute address for move16.  */
           {
    -        uval = NEXTULONG (p);
    +        NEXTULONG (p, uval);
     	(*info->print_address_func) (uval, info);
             break;
           }
    @@ -643,7 +719,7 @@
     	     /* Fido added these.  */
                  {"%cac", 0xffe}, {"%mbo", 0xfff}};
     
    -	val = fetch_arg (buffer, place, 12, info);
    +	FETCH_ARG (12, val);
     	for (regno = sizeof names / sizeof names[0] - 1; regno >= 0; regno--)
     	  if (names[regno].value == val)
     	    {
    @@ -656,7 +732,7 @@
           break;
     
         case 'Q':
    -      val = fetch_arg (buffer, place, 3, info);
    +      FETCH_ARG (3, val);
           /* 0 means 8, except for the bkpt instruction... */
           if (val == 0 && d[1] != 's')
     	val = 8;
    @@ -664,7 +740,7 @@
           break;
     
         case 'x':
    -      val = fetch_arg (buffer, place, 3, info);
    +      FETCH_ARG (3, val);
           /* 0 means -1.  */
           if (val == 0)
     	val = -1;
    @@ -672,12 +748,12 @@
           break;
     
         case 'j':
    -      val = fetch_arg (buffer, place, 3, info);
    +      FETCH_ARG (3, val);
           (*info->fprintf_func) (info->stream, "#%d", val+1);
           break;
     
         case 'K':
    -      val = fetch_arg (buffer, place, 9, info);
    +      FETCH_ARG (9, val);
           (*info->fprintf_func) (info->stream, "#%d", val);
           break;
     
    @@ -685,12 +761,13 @@
           if (place == 'h')
     	{
     	  static char *const scalefactor_name[] = { "<<", ">>" };
    -	  val = fetch_arg (buffer, place, 1, info);
    +
    +	  FETCH_ARG (1, val);
     	  (*info->fprintf_func) (info->stream, scalefactor_name[val]);
     	}
           else
     	{
    -	  val = fetch_arg (buffer, place, 8, info);
    +	  FETCH_ARG (8, val);
     	  if (val & 0x80)
     	    val = val - 0x100;
     	  (*info->fprintf_func) (info->stream, "#%d", val);
    @@ -698,29 +775,27 @@
           break;
     
         case 'T':
    -      val = fetch_arg (buffer, place, 4, info);
    +      FETCH_ARG (4, val);
           (*info->fprintf_func) (info->stream, "#%d", val);
           break;
     
         case 'D':
    -      (*info->fprintf_func) (info->stream, "%s",
    -			     reg_names[fetch_arg (buffer, place, 3, info)]);
    +      FETCH_ARG (3, val);
    +      (*info->fprintf_func) (info->stream, "%s", reg_names[val]);
           break;
     
         case 'A':
    -      (*info->fprintf_func)
    -	(info->stream, "%s",
    -	 reg_names[fetch_arg (buffer, place, 3, info) + 010]);
    +      FETCH_ARG (3, val);
    +      (*info->fprintf_func) (info->stream, "%s", reg_names[val + 010]);
           break;
     
         case 'R':
    -      (*info->fprintf_func)
    -	(info->stream, "%s",
    -	 reg_names[fetch_arg (buffer, place, 4, info)]);
    +      FETCH_ARG (4, val);
    +      (*info->fprintf_func) (info->stream, "%s", reg_names[val]);
           break;
     
         case 'r':
    -      regno = fetch_arg (buffer, place, 4, info);
    +      FETCH_ARG (4, regno);
           if (regno > 7)
     	(*info->fprintf_func) (info->stream, "%s@", reg_names[regno]);
           else
    @@ -728,13 +803,12 @@
           break;
     
         case 'F':
    -      (*info->fprintf_func)
    -	(info->stream, "%%fp%d",
    -	 fetch_arg (buffer, place, 3, info));
    +      FETCH_ARG (3, val);
    +      (*info->fprintf_func) (info->stream, "%%fp%d", val);
           break;
     
         case 'O':
    -      val = fetch_arg (buffer, place, 6, info);
    +      FETCH_ARG (6, val);
           if (val & 0x20)
     	(*info->fprintf_func) (info->stream, "%s", reg_names[val & 7]);
           else
    @@ -742,78 +816,78 @@
           break;
     
         case '+':
    -      (*info->fprintf_func)
    -	(info->stream, "%s@+",
    -	 reg_names[fetch_arg (buffer, place, 3, info) + 8]);
    +      FETCH_ARG (3, val);
    +      (*info->fprintf_func) (info->stream, "%s@+", reg_names[val + 8]);
           break;
     
         case '-':
    -      (*info->fprintf_func)
    -	(info->stream, "%s@-",
    -	 reg_names[fetch_arg (buffer, place, 3, info) + 8]);
    +      FETCH_ARG (3, val);
    +      (*info->fprintf_func) (info->stream, "%s@-", reg_names[val + 8]);
           break;
     
         case 'k':
           if (place == 'k')
    -	(*info->fprintf_func)
    -	  (info->stream, "{%s}",
    -	   reg_names[fetch_arg (buffer, place, 3, info)]);
    +	{
    +	  FETCH_ARG (3, val);
    +	  (*info->fprintf_func) (info->stream, "{%s}", reg_names[val]);
    +	}
           else if (place == 'C')
     	{
    -	  val = fetch_arg (buffer, place, 7, info);
    +	  FETCH_ARG (7, val);
     	  if (val > 63)		/* This is a signed constant.  */
     	    val -= 128;
     	  (*info->fprintf_func) (info->stream, "{#%d}", val);
     	}
           else
    -	return -2;
    +	return -1;
           break;
     
         case '#':
         case '^':
           p1 = buffer + (*d == '#' ? 2 : 4);
           if (place == 's')
    -	val = fetch_arg (buffer, place, 4, info);
    +	FETCH_ARG (4, val);
           else if (place == 'C')
    -	val = fetch_arg (buffer, place, 7, info);
    +	FETCH_ARG (7, val);
           else if (place == '8')
    -	val = fetch_arg (buffer, place, 3, info);
    +	FETCH_ARG (3, val);
           else if (place == '3')
    -	val = fetch_arg (buffer, place, 8, info);
    +	FETCH_ARG (8, val);
           else if (place == 'b')
    -	val = NEXTBYTE (p1);
    +	NEXTBYTE (p1, val);
           else if (place == 'w' || place == 'W')
    -	val = NEXTWORD (p1);
    +	NEXTWORD (p1, val, -3);
           else if (place == 'l')
    -	val = NEXTLONG (p1);
    +	NEXTLONG (p1, val, -3);
           else
     	return -2;
    +
           (*info->fprintf_func) (info->stream, "#%d", val);
           break;
     
         case 'B':
           if (place == 'b')
    -	disp = NEXTBYTE (p);
    +	NEXTBYTE (p, disp);
           else if (place == 'B')
     	disp = COERCE_SIGNED_CHAR (buffer[1]);
           else if (place == 'w' || place == 'W')
    -	disp = NEXTWORD (p);
    +	NEXTWORD (p, disp, -3);
           else if (place == 'l' || place == 'L' || place == 'C')
    -	disp = NEXTLONG (p);
    +	NEXTLONG (p, disp, -3);
           else if (place == 'g')
     	{
    -	  disp = NEXTBYTE (buffer);
    +	  NEXTBYTE (buffer, disp);
     	  if (disp == 0)
    -	    disp = NEXTWORD (p);
    +	    NEXTWORD (p, disp, -3);
     	  else if (disp == -1)
    -	    disp = NEXTLONG (p);
    +	    NEXTLONG (p, disp, -3);
     	}
           else if (place == 'c')
     	{
     	  if (buffer[1] & 0x40)		/* If bit six is one, long offset.  */
    -	    disp = NEXTLONG (p);
    +	    NEXTLONG (p, disp, -3);
     	  else
    -	    disp = NEXTWORD (p);
    +	    NEXTWORD (p, disp, -3);
     	}
           else
     	return -2;
    @@ -822,29 +896,32 @@
           break;
     
         case 'd':
    -      val = NEXTWORD (p);
    -      (*info->fprintf_func)
    -	(info->stream, "%s@(%d)",
    -	 reg_names[fetch_arg (buffer, place, 3, info) + 8], val);
    -      break;
    +      {
    +	int val1;
    +
    +	NEXTWORD (p, val, -3);
    +	FETCH_ARG (3, val1);
    +	(*info->fprintf_func) (info->stream, "%s@(%d)", reg_names[val1 + 8], val);
    +	break;
    +      }
     
         case 's':
    -      (*info->fprintf_func) (info->stream, "%s",
    -			     fpcr_names[fetch_arg (buffer, place, 3, info)]);
    +      FETCH_ARG (3, val);
    +      (*info->fprintf_func) (info->stream, "%s", fpcr_names[val]);
           break;
     
         case 'e':
    -      val = fetch_arg(buffer, place, 2, info);
    +      FETCH_ARG (2, val);
           (*info->fprintf_func) (info->stream, "%%acc%d", val);
           break;
     
         case 'g':
    -      val = fetch_arg(buffer, place, 1, info);
    -      (*info->fprintf_func) (info->stream, "%%accext%s", val==0 ? "01" : "23");
    +      FETCH_ARG (1, val);
    +      (*info->fprintf_func) (info->stream, "%%accext%s", val == 0 ? "01" : "23");
           break;
     
         case 'i':
    -      val = fetch_arg(buffer, place, 2, info);
    +      FETCH_ARG (2, val);
           if (val == 1)
     	(*info->fprintf_func) (info->stream, "<<");
           else if (val == 3)
    @@ -856,7 +933,8 @@
         case 'I':
           /* Get coprocessor ID... */
           val = fetch_arg (buffer, 'd', 3, info);
    -
    +      if (val < 0)
    +	return -3;
           if (val != 1)				/* Unusual coprocessor ID?  */
     	(*info->fprintf_func) (info->stream, "(cpid=%d) ", val);
           break;
    @@ -888,10 +966,16 @@
           if (place == 'd')
     	{
     	  val = fetch_arg (buffer, 'x', 6, info);
    +	  if (val < 0)
    +	    return -3;
     	  val = ((val & 7) << 3) + ((val >> 3) & 7);
     	}
           else
    -	val = fetch_arg (buffer, 's', 6, info);
    +	{
    +	  val = fetch_arg (buffer, 's', 6, info);
    +	  if (val < 0)
    +	    return -3;
    +	}
     
           /* If the <ea> is invalid for *d, then reject this match.  */
           if (!m68k_valid_ea (*d, val))
    @@ -923,29 +1007,31 @@
     	  break;
     
     	case 5:
    -	  val = NEXTWORD (p);
    +	  NEXTWORD (p, val, -3);
     	  (*info->fprintf_func) (info->stream, "%s@(%d)", regname, val);
     	  break;
     
     	case 6:
     	  p = print_indexed (regno, p, addr, info);
    +	  if (p == NULL)
    +	    return -3;
     	  break;
     
     	case 7:
     	  switch (val & 7)
     	    {
     	    case 0:
    -	      val = NEXTWORD (p);
    +	      NEXTWORD (p, val, -3);
     	      (*info->print_address_func) (val, info);
     	      break;
     
     	    case 1:
    -	      uval = NEXTULONG (p);
    +	      NEXTULONG (p, uval);
     	      (*info->print_address_func) (uval, info);
     	      break;
     
     	    case 2:
    -	      val = NEXTWORD (p);
    +	      NEXTWORD (p, val, -3);
     	      (*info->fprintf_func) (info->stream, "%%pc@(");
     	      (*info->print_address_func) (addr + val, info);
     	      (*info->fprintf_func) (info->stream, ")");
    @@ -953,6 +1039,8 @@
     
     	    case 3:
     	      p = print_indexed (-1, p, addr, info);
    +	      if (p == NULL)
    +		return -3;
     	      break;
     
     	    case 4:
    @@ -960,17 +1048,17 @@
     	      switch (place)
     	      {
     		case 'b':
    -		  val = NEXTBYTE (p);
    +		  NEXTBYTE (p, val);
     		  flt_p = 0;
     		  break;
     
     		case 'w':
    -		  val = NEXTWORD (p);
    +		  NEXTWORD (p, val, -3);
     		  flt_p = 0;
     		  break;
     
     		case 'l':
    -		  val = NEXTLONG (p);
    +		  NEXTLONG (p, val, -3);
     		  flt_p = 0;
     		  break;
     
    @@ -987,7 +1075,7 @@
     		  break;
     
     		case 'p':
    -		  flval = NEXTPACKED (p);
    +		  NEXTPACKED (p, flval);
     		  break;
     
     		default:
    @@ -1009,7 +1097,7 @@
     	 mask bit and if set, add a '&' to the arg.  */
           if (place == '/')
     	{
    -	  val = fetch_arg (buffer, place, 1, info);
    +	  FETCH_ARG (1, val);
     	  if (val)
     	    info->fprintf_func (info->stream, "&");
     	}
    @@ -1021,7 +1109,7 @@
     	  {
     	    char doneany;
     	    p1 = buffer + 2;
    -	    val = NEXTWORD (p1);
    +	    NEXTWORD (p1, val, -3);
     	    /* Move the pointer ahead if this point is farther ahead
     	       than the last.  */
     	    p = p1 > p ? p1 : p;
    @@ -1062,7 +1150,8 @@
     	  {
     	    /* `fmovem' insn.  */
     	    char doneany;
    -	    val = fetch_arg (buffer, place, 8, info);
    +
    +	    FETCH_ARG (8, val);
     	    if (val == 0)
     	      {
     		(*info->fprintf_func) (info->stream, "#0");
    @@ -1096,10 +1185,9 @@
     	  }
     	else if (place == '8')
     	  {
    +	    FETCH_ARG (3, val);
     	    /* fmoveml for FP status registers.  */
    -	    (*info->fprintf_func) (info->stream, "%s",
    -				   fpcr_names[fetch_arg (buffer, place, 3,
    -							 info)]);
    +	    (*info->fprintf_func) (info->stream, "%s", fpcr_names[val]);
     	  }
     	else
     	  return -2;
    @@ -1115,9 +1203,10 @@
         case '2':
         case '3':
           {
    -	int val = fetch_arg (buffer, place, 5, info);
    +	int val;
     	char *name = 0;
     
    +	FETCH_ARG (5, val);
     	switch (val)
     	  {
     	  case 2: name = "%tt0"; break;
    @@ -1152,8 +1241,9 @@
     
         case 'f':
           {
    -	int fc = fetch_arg (buffer, place, 5, info);
    +	int fc;
     
    +	FETCH_ARG (5, fc);
     	if (fc == 1)
     	  (*info->fprintf_func) (info->stream, "%%dfc");
     	else if (fc == 0)
    @@ -1170,8 +1260,9 @@
     
         case 't':
           {
    -	int level = fetch_arg (buffer, place, 3, info);
    +	int level;
     
    +	FETCH_ARG (3, level);
     	(*info->fprintf_func) (info->stream, "%d", level);
           }
           break;
    @@ -1179,8 +1270,9 @@
         case 'u':
           {
     	short is_upper = 0;
    -	int reg = fetch_arg (buffer, place, 5, info);
    +	int reg;
     
    +	FETCH_ARG (5, reg);
     	if (reg & 0x10)
     	  {
     	    is_upper = 1;
    @@ -1303,7 +1395,7 @@
     
           if (eaten >= 0)
     	p += eaten;
    -      else if (eaten == -1)
    +      else if (eaten == -1 || eaten == -3)
     	{
     	  info->fprintf_func = save_printer;
     	  info->print_address_func = save_print_address;
    @@ -1318,7 +1410,7 @@
     	  info->fprintf_func (info->stream,
     			      /* xgettext:c-format */
     			      _("<internal error in opcode table: %s %s>\n"),
    -			      best->name,  best->args);
    +			      best->name, best->args);
     	  return 2;
     	}
         }
    @@ -1439,6 +1531,8 @@
     		  if (d[0] == 's' && d[1] == '8')
     		    {
     		      val = fetch_arg (buffer, d[1], 3, info);
    +		      if (val < 0)
    +			return 0;
     		      if ((val & (val - 1)) != 0)
     			break;
     		    }
    @@ -1479,13 +1573,7 @@
     
       bfd_byte *buffer = priv.the_buffer;
     
    -  /* Save these printing functions in case we need to restore them
    -     later.  */
    -  fprintf_ftype save_printer = info->fprintf_func;
    -  void (* save_print_address) (bfd_vma, struct disassemble_info *)
    -    = info->print_address_func;
    -
    -  info->private_data = (PTR) &priv;
    +  info->private_data = & priv;
       /* Tell objdump to use two bytes per chunk
          and six bytes per line for displaying raw data.  */
       info->bytes_per_chunk = 2;
    @@ -1494,49 +1582,23 @@
       priv.max_fetched = priv.the_buffer;
       priv.insn_start = memaddr;
     
    -  if (setjmp (priv.bailout) != 0)
    -    {
    -      /* longjmp may be called while these printing functions are
    -	 temporarily replaced with dummy functions.  Restore them
    -	 before we leave.
    -
    -	 Admittedly, this save-and-restore operation is somewhat ugly
    -	 in that we are exposing the fact that match_insn_m68k
    -	 temporarily replaces insn->fprintf_func and
    -	 insn->print_address_func.  Perhaps, a real fix is to report a
    -	 FETCH_DATA failure with a return value of some sort, without
    -	 using setjmp/longjmp.  A better fix may be to teach the m68k
    -	 disassembler do its job without temporarily replacing
    -	 insn->fprintf_func and insn->print_address_func, but that's a
    -	 task for another day.  */
    -      info->fprintf_func = save_printer;
    -      info->print_address_func = save_print_address;
    -
    -      /* Error return.  */
    -      return -1;
    -    }
    -
       arch_mask = bfd_m68k_mach_to_features (info->mach);
       if (!arch_mask)
         {
           /* First try printing an m680x0 instruction.  Try printing a Coldfire
     	 one if that fails.  */
           val = m68k_scan_mask (memaddr, info, m68k_mask);
    -      if (val)
    -	return val;
    -
    -      val = m68k_scan_mask (memaddr, info, mcf_mask);
    -      if (val)
    -	return val;
    +      if (val == 0)
    +	val = m68k_scan_mask (memaddr, info, mcf_mask);
         }
       else
         {
           val = m68k_scan_mask (memaddr, info, arch_mask);
    -      if (val)
    -	return val;
         }
     
    -  /* Handle undefined instructions.  */
    -  info->fprintf_func (info->stream, "0%o", (buffer[0] << 8) + buffer[1]);
    -  return 2;
    +  if (val == 0)
    +    /* Handle undefined instructions.  */
    +    info->fprintf_func (info->stream, "0%o", (buffer[0] << 8) + buffer[1]);
    +
    +  return val ? val : 2;
     }
    diff -Naur binutils-2.19.orig/opcodes/ppc-opc.c binutils-2.19/opcodes/ppc-opc.c
    old new  
    12811281
    12821282  /* mfsprg can use 260..263 and 272..279.  mtsprg only uses spr 272..279
    12831283     If not BOOKE or 405, then both use only 272..275.  */
    1284   if (val <= 3
    1285       || (val < 0x10 && (insn & 0x100) != 0)
    1286       || (val - 0x10 > 3
    1287           && (dialect & (PPC_OPCODE_BOOKE | PPC_OPCODE_403)) == 0))
     1284  if ((val - 0x10 > 3 && (dialect & (PPC_OPCODE_BOOKE | PPC_OPCODE_405)) == 0)
     1285      || (val - 0x10 > 7 && (insn & 0x100) != 0)
     1286      || val <= 3
     1287      || (val & 8) != 0)
    12881288    *invalid = 1;
    12891289  return val & 7;
    12901290}
Note: See TracBrowser for help on using the repository browser.