Add PDP-11 support
authorNick Clifton <nickc@redhat.com>
Sun, 18 Feb 2001 23:33:11 +0000 (23:33 +0000)
committerNick Clifton <nickc@redhat.com>
Sun, 18 Feb 2001 23:33:11 +0000 (23:33 +0000)
55 files changed:
bfd/ChangeLog
bfd/Makefile.am
bfd/Makefile.in
bfd/aout-target.h
bfd/archures.c
bfd/bfd-in2.h
bfd/config.bfd
bfd/configure
bfd/configure.in
bfd/cpu-pdp11.c [new file with mode: 0644]
bfd/libaout.h
bfd/libbfd.h
bfd/pdp11.c [new file with mode: 0644]
bfd/po/POTFILES.in
bfd/po/bfd.pot
bfd/reloc.c
bfd/targets.c
binutils/NEWS
binutils/po/binutils.pot
binutils/testsuite/binutils-all/readelf.wi
gas/ChangeLog
gas/Makefile.am
gas/Makefile.in
gas/config/tc-pdp11.c [new file with mode: 0644]
gas/config/tc-pdp11.h [new file with mode: 0644]
gas/configure
gas/configure.in
gas/doc/Makefile.am
gas/doc/Makefile.in
gas/doc/all.texi
gas/doc/as.texinfo
gas/doc/c-pdp11.texi [new file with mode: 0644]
gas/po/POTFILES.in
gas/po/gas.pot
gprof/po/gprof.pot
include/ChangeLog
include/dis-asm.h
include/opcode/ChangeLog
include/opcode/pdp11.h [new file with mode: 0644]
ld/ChangeLog
ld/Makefile.am
ld/Makefile.in
ld/configure.tgt
ld/emulparams/pdp11.sh [new file with mode: 0644]
ld/po/ld.pot
opcodes/ChangeLog
opcodes/Makefile.am
opcodes/Makefile.in
opcodes/configure
opcodes/configure.in
opcodes/disassemble.c
opcodes/pdp11-dis.c [new file with mode: 0644]
opcodes/pdp11-opc.c [new file with mode: 0644]
opcodes/po/POTFILES.in
opcodes/po/opcodes.pot

index ec272d347cbd961ceb68063af948691833a6a65d..018d7e8740385aae5d34bf6805b607ef43e54ace 100644 (file)
@@ -1,3 +1,24 @@
+2001-02-18  lars brinkhoff  <lars@nocrew.org>
+
+       * Makefile.am: Add PDP-11 a.out target.
+       * config.bfd: Likewise.
+       * configure.in: Likewise.
+       * targets.c: Likewise.
+       * archures.c: Likewise.
+       * bfd-in2.h: Likewise.  Add PDP-11 relocations.
+       * libbfd.h: Add PDP-11 relocations.
+       * reloc.c: Likewise.
+       * cpu-pdp11.c: New file.
+       * pdp11.c: New file.
+
+       * libaout.h (GET_WORD) [ARCH_SIZE==16]: Define.
+       (GET_SWORD) [ARCH_SIZE==16]: Likewise.
+       (GET_SWORD) [ARCH_SIZE==16]: Likewise.
+       (PUT_WORD) [ARCH_SIZE==16]: Likewise.
+       (GET_MAGIC): New macro.
+       (PUT_MAGIC): Likewise.
+       * aout-target.h (MY(object_p)): Use GET_MAGIC to read magic word.
+
 2001-02-18  Jim Kingdon  <jkingdon@engr.sgi.com>
 
        * irix-core.c (irix_core_core_file_p): Set the architecture (GDB
index 7183954497ed35a616023b1b97070a2e287a87fd..9446bc3e2c0eb5ef8fa73b44b704f0c334884fca 100644 (file)
@@ -69,6 +69,7 @@ ALL_MACHINES = \
        cpu-mcore.lo \
        cpu-mips.lo \
        cpu-ns32k.lo \
+       cpu-pdp11.lo \
        cpu-pj.lo \
        cpu-powerpc.lo \
        cpu-rs6000.lo \
@@ -112,6 +113,7 @@ ALL_MACHINES_CFILES = \
        cpu-mcore.c \
        cpu-mips.c \
        cpu-ns32k.c \
+       cpu-pdp11.c \
        cpu-pj.c \
        cpu-powerpc.c \
        cpu-rs6000.c \
@@ -239,6 +241,7 @@ BFD32_BACKENDS = \
        ns32knetbsd.lo \
        oasys.lo \
        pc532-mach.lo \
+       pdp11.lo \
        pe-arm.lo \
        pei-arm.lo \
        pe-i386.lo \
@@ -377,6 +380,7 @@ BFD32_BACKENDS_CFILES = \
        ns32knetbsd.c \
        oasys.c \
        pc532-mach.c \
+       pdp11.c \
        pe-arm.c \
        pei-arm.c \
        pe-i386.c \
@@ -781,6 +785,7 @@ cpu-m10300.lo: cpu-m10300.c $(INCDIR)/filenames.h
 cpu-mcore.lo: cpu-mcore.c $(INCDIR)/filenames.h
 cpu-mips.lo: cpu-mips.c $(INCDIR)/filenames.h
 cpu-ns32k.lo: cpu-ns32k.c $(INCDIR)/filenames.h ns32k.h
+cpu-pdp11.lo: cpu-pdp11.c $(INCDIR)/filenames.h
 cpu-pj.lo: cpu-pj.c $(INCDIR)/filenames.h
 cpu-powerpc.lo: cpu-powerpc.c $(INCDIR)/filenames.h
 cpu-rs6000.lo: cpu-rs6000.c $(INCDIR)/filenames.h
@@ -1161,6 +1166,9 @@ oasys.lo: oasys.c $(INCDIR)/filenames.h $(INCDIR)/oasys.h \
 pc532-mach.lo: pc532-mach.c $(INCDIR)/filenames.h libaout.h \
   $(INCDIR)/bfdlink.h $(INCDIR)/aout/aout64.h aout-target.h \
   $(INCDIR)/aout/stab_gnu.h $(INCDIR)/aout/stab.def $(INCDIR)/aout/ar.h
+pdp11.lo: pdp11.c libaout.h $(INCDIR)/bfdlink.h \
+  aout-target.h $(INCDIR)/aout/aout64.h $(INCDIR)/aout/stab_gnu.h \
+  $(INCDIR)/aout/stab.def $(INCDIR)/aout/ar.h
 pe-arm.lo: pe-arm.c $(INCDIR)/filenames.h coff-arm.c \
   $(INCDIR)/coff/arm.h $(INCDIR)/coff/internal.h $(INCDIR)/coff/pe.h \
   libcoff.h $(INCDIR)/bfdlink.h coffcode.h peicode.h \
index 90c79aa135b5897810ce0aa51956739dabcad656..37bf089d91389eaa601b4cd88b6ac80ec141ccb8 100644 (file)
@@ -190,6 +190,7 @@ ALL_MACHINES = \
        cpu-mcore.lo \
        cpu-mips.lo \
        cpu-ns32k.lo \
+       cpu-pdp11.lo \
        cpu-pj.lo \
        cpu-powerpc.lo \
        cpu-rs6000.lo \
@@ -234,6 +235,7 @@ ALL_MACHINES_CFILES = \
        cpu-mcore.c \
        cpu-mips.c \
        cpu-ns32k.c \
+       cpu-pdp11.c \
        cpu-pj.c \
        cpu-powerpc.c \
        cpu-rs6000.c \
@@ -362,6 +364,7 @@ BFD32_BACKENDS = \
        ns32knetbsd.lo \
        oasys.lo \
        pc532-mach.lo \
+       pdp11.lo \
        pe-arm.lo \
        pei-arm.lo \
        pe-i386.lo \
@@ -501,6 +504,7 @@ BFD32_BACKENDS_CFILES = \
        ns32knetbsd.c \
        oasys.c \
        pc532-mach.c \
+       pdp11.c \
        pe-arm.c \
        pei-arm.c \
        pe-i386.c \
@@ -1320,6 +1324,7 @@ cpu-m10300.lo: cpu-m10300.c $(INCDIR)/filenames.h
 cpu-mcore.lo: cpu-mcore.c $(INCDIR)/filenames.h
 cpu-mips.lo: cpu-mips.c $(INCDIR)/filenames.h
 cpu-ns32k.lo: cpu-ns32k.c $(INCDIR)/filenames.h ns32k.h
+cpu-pdp11.lo: cpu-pdp11.c $(INCDIR)/filenames.h
 cpu-pj.lo: cpu-pj.c $(INCDIR)/filenames.h
 cpu-powerpc.lo: cpu-powerpc.c $(INCDIR)/filenames.h
 cpu-rs6000.lo: cpu-rs6000.c $(INCDIR)/filenames.h
@@ -1700,6 +1705,9 @@ oasys.lo: oasys.c $(INCDIR)/filenames.h $(INCDIR)/oasys.h \
 pc532-mach.lo: pc532-mach.c $(INCDIR)/filenames.h libaout.h \
   $(INCDIR)/bfdlink.h $(INCDIR)/aout/aout64.h aout-target.h \
   $(INCDIR)/aout/stab_gnu.h $(INCDIR)/aout/stab.def $(INCDIR)/aout/ar.h
+pdp11.lo: pdp11.c libaout.h $(INCDIR)/bfdlink.h \
+  aout-target.h $(INCDIR)/aout/aout64.h $(INCDIR)/aout/stab_gnu.h \
+  $(INCDIR)/aout/stab.def $(INCDIR)/aout/ar.h
 pe-arm.lo: pe-arm.c $(INCDIR)/filenames.h coff-arm.c \
   $(INCDIR)/coff/arm.h $(INCDIR)/coff/internal.h $(INCDIR)/coff/pe.h \
   libcoff.h $(INCDIR)/bfdlink.h coffcode.h peicode.h \
index 1902cdfa55698052224726aa37a791ad907b8512..a27c11be2d662b31eb66283beba2427fa68d08ed 100644 (file)
@@ -156,7 +156,7 @@ MY(object_p) (abfd)
 #ifdef SWAP_MAGIC
   exec.a_info = SWAP_MAGIC (exec_bytes.e_info);
 #else
-  exec.a_info = bfd_h_get_32 (abfd, exec_bytes.e_info);
+  exec.a_info = GET_MAGIC (abfd, exec_bytes.e_info);
 #endif /* SWAP_MAGIC */
 
   if (N_BADMAG (exec)) return 0;
index b15de5227f8f82f1ceb9d6a906588abb45824936..7ca1c0692636a746b49a325bd42e8c316ada075d 100644 (file)
@@ -155,6 +155,7 @@ DESCRIPTION
 .#define bfd_mach_h8300   1
 .#define bfd_mach_h8300h  2
 .#define bfd_mach_h8300s  3
+.  bfd_arch_pdp11,     {* DEC PDP-11 *}
 .  bfd_arch_powerpc,   {* PowerPC *}
 .#define bfd_mach_ppc          0
 .#define bfd_mach_ppc_403      403
@@ -308,6 +309,7 @@ extern const bfd_arch_info_type bfd_m88k_arch;
 extern const bfd_arch_info_type bfd_mips_arch;
 extern const bfd_arch_info_type bfd_mn10200_arch;
 extern const bfd_arch_info_type bfd_mn10300_arch;
+extern const bfd_arch_info_type bfd_pdp11_arch;
 extern const bfd_arch_info_type bfd_powerpc_arch;
 extern const bfd_arch_info_type bfd_rs6000_arch;
 extern const bfd_arch_info_type bfd_pj_arch;
@@ -354,6 +356,7 @@ static const bfd_arch_info_type * const bfd_archures_list[] = {
   &bfd_mips_arch,
   &bfd_mn10200_arch,
   &bfd_mn10300_arch,
+  &bfd_pdp11_arch,
   &bfd_powerpc_arch,
   &bfd_rs6000_arch,
   &bfd_sh_arch,
index db4576d99d1940a85c4afdf307b6311c89f74264..46240ec1b577089e3bb8353c1923da8c44cbc1b2 100644 (file)
@@ -1424,6 +1424,7 @@ enum bfd_architecture
 #define bfd_mach_h8300   1
 #define bfd_mach_h8300h  2
 #define bfd_mach_h8300s  3
+  bfd_arch_pdp11,     /* DEC PDP-11 */
   bfd_arch_powerpc,   /* PowerPC */
 #define bfd_mach_ppc           0
 #define bfd_mach_ppc_403       403
@@ -2088,6 +2089,10 @@ to compensate for the borrow when the low bits are added. */
   BFD_RELOC_NS32K_DISP_16_PCREL,
   BFD_RELOC_NS32K_DISP_32_PCREL,
 
+/* PDP11 relocations */
+  BFD_RELOC_PDP11_DISP_8_PCREL,
+  BFD_RELOC_PDP11_DISP_6_PCREL,
+
 /* Picojava relocs.  Not all of these appear in object files. */
   BFD_RELOC_PJ_CODE_HI16,
   BFD_RELOC_PJ_CODE_LO16,
index f45e8392536bbccc7ca7f277aaab7632c42e7937..b7e1376c21c8bcb407e248cbca33cffab704a1d4 100644 (file)
@@ -44,6 +44,7 @@ m6812*|m68hc12*) targ_archs="bfd_m68hc12_arch bfd_m68hc11_arch" ;;
 m68*)  targ_archs=bfd_m68k_arch ;;
 m88*)  targ_archs=bfd_m88k_arch ;;
 mips*) targ_archs=bfd_mips_arch ;;
+pdp11*)        targ_archs=bfd_pdp11_arch ;;
 pj*)   targ_archs="bfd_pj_arch bfd_i386_arch";;
 powerpc*) targ_archs="bfd_rs6000_arch bfd_powerpc_arch" ;;
 s390*)  targ_archs=bfd_s390_arch ;;
@@ -680,6 +681,11 @@ case "${targ}" in
     targ_underscore=yes
     ;;
 
+  pdp11-*-*)
+    targ_defvec=pdp11_aout_vec
+    targ_underscore=yes
+    ;;
+
   pj-*-*)
     targ_defvec=bfd_elf32_pj_vec
     targ_selvecs="bfd_elf32_pj_vec bfd_elf32_pjl_vec"
index 16959815270aef11fa96838d9cf21b0d280593d8..4f6ddb3178606a837a1a2159bbdd051399e31bad 100755 (executable)
@@ -6061,6 +6061,7 @@ do
     nlm32_powerpc_vec)         tb="$tb nlm32-ppc.lo nlm32.lo nlm.lo" ;;
     pc532netbsd_vec)           tb="$tb ns32knetbsd.lo aout-ns32k.lo" ;;
     pc532machaout_vec)         tb="$tb pc532-mach.lo aout-ns32k.lo" ;;
+    pdp11_aout_vec)            tb="$tb pdp11.lo" ;;
     pmac_xcoff_vec)            tb="$tb coff-pmac.lo xcofflink.lo" ;;
     rs6000coff_vec)            tb="$tb coff-rs6000.lo xcofflink.lo" ;;
     bfd_powerpc_pe_vec)         tb="$tb pe-ppc.lo peigen.lo cofflink.lo" ;;  
@@ -6182,17 +6183,17 @@ for ac_hdr in unistd.h
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:6186: checking for $ac_hdr" >&5
+echo "configure:6187: checking for $ac_hdr" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 6191 "configure"
+#line 6192 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:6196: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:6197: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -6221,12 +6222,12 @@ done
 for ac_func in getpagesize
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:6225: checking for $ac_func" >&5
+echo "configure:6226: checking for $ac_func" >&5
 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 6230 "configure"
+#line 6231 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -6249,7 +6250,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:6253: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6254: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -6274,7 +6275,7 @@ fi
 done
 
 echo $ac_n "checking for working mmap""... $ac_c" 1>&6
-echo "configure:6278: checking for working mmap" >&5
+echo "configure:6279: checking for working mmap" >&5
 if eval "test \"`echo '$''{'ac_cv_func_mmap_fixed_mapped'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -6282,7 +6283,7 @@ else
   ac_cv_func_mmap_fixed_mapped=no
 else
   cat > conftest.$ac_ext <<EOF
-#line 6286 "configure"
+#line 6287 "configure"
 #include "confdefs.h"
 
 /* Thanks to Mike Haertel and Jim Avera for this test.
@@ -6422,7 +6423,7 @@ main()
 }
 
 EOF
-if { (eval echo configure:6426: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:6427: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   ac_cv_func_mmap_fixed_mapped=yes
 else
@@ -6447,12 +6448,12 @@ fi
 for ac_func in madvise mprotect
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:6451: checking for $ac_func" >&5
+echo "configure:6452: checking for $ac_func" >&5
 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 6456 "configure"
+#line 6457 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -6475,7 +6476,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:6479: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6480: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
index 3ced576157a2cc39d410880ec0aa20f740d73623..118a7067edbe6e3f7a526d1f0e6f85ae03096aaa 100644 (file)
@@ -610,6 +610,7 @@ do
     nlm32_powerpc_vec)         tb="$tb nlm32-ppc.lo nlm32.lo nlm.lo" ;;
     pc532netbsd_vec)           tb="$tb ns32knetbsd.lo aout-ns32k.lo" ;;
     pc532machaout_vec)         tb="$tb pc532-mach.lo aout-ns32k.lo" ;;
+    pdp11_aout_vec)            tb="$tb pdp11.lo" ;;
     pmac_xcoff_vec)            tb="$tb coff-pmac.lo xcofflink.lo" ;;
     rs6000coff_vec)            tb="$tb coff-rs6000.lo xcofflink.lo" ;;
     bfd_powerpc_pe_vec)         tb="$tb pe-ppc.lo peigen.lo cofflink.lo" ;;  
diff --git a/bfd/cpu-pdp11.c b/bfd/cpu-pdp11.c
new file mode 100644 (file)
index 0000000..6d8971c
--- /dev/null
@@ -0,0 +1,39 @@
+/* BFD back-end for PDP-11 support.
+   Copyright (C) 2001 Free Software Foundation, Inc.
+
+This file is part of BFD, the Binary File Descriptor library.
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+
+#include "bfd.h"
+#include "sysdep.h"
+#include "libbfd.h"
+
+const bfd_arch_info_type bfd_pdp11_arch =
+  {
+    16,        /* 16 bits in a word */
+    16,        /* 16 bits in an address */
+    8, /* 8 bits in a byte */
+    bfd_arch_pdp11,
+    0, /* only 1 machine */
+    "pdp11",
+    "pdp11",
+    1,         /* aligment = 16 bit */
+    true, /* the one and only */
+    bfd_default_compatible, 
+    bfd_default_scan ,
+    0,
+  };
+
index 1682428cb1d968ccba48db66ed957e4acaae0aa2..818b10c95e8e7c136a749c5e150140bf6a964b27 100644 (file)
@@ -33,22 +33,39 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 #if ARCH_SIZE==64
 #define GET_WORD bfd_h_get_64
 #define GET_SWORD bfd_h_get_signed_64
+#define GET_MAGIC bfd_h_get_32
 #define PUT_WORD bfd_h_put_64
+#define PUT_MAGIC bfd_h_put_32
 #ifndef NAME
 #define NAME(x,y) CAT3(x,_64_,y)
 #endif
 #define JNAME(x) CAT(x,_64)
 #define BYTES_IN_WORD 8
+#else
+#if ARCH_SIZE==16
+#define GET_WORD bfd_h_get_16
+#define GET_SWORD bfd_h_get_signed_16
+#define GET_MAGIC bfd_h_get_16
+#define PUT_WORD bfd_h_put_16
+#define PUT_MAGIC bfd_h_put_16
+#ifndef NAME
+#define NAME(x,y) CAT3(x,_16_,y)
+#endif
+#define JNAME(x) CAT(x,_16)
+#define BYTES_IN_WORD 2
 #else /* ARCH_SIZE == 32 */
 #define GET_WORD bfd_h_get_32
 #define GET_SWORD bfd_h_get_signed_32
+#define GET_MAGIC bfd_h_get_32
 #define PUT_WORD bfd_h_put_32
+#define PUT_MAGIC bfd_h_put_32
 #ifndef NAME
 #define NAME(x,y) CAT3(x,_32_,y)
 #endif
 #define JNAME(x) CAT(x,_32)
 #define BYTES_IN_WORD 4
 #endif /* ARCH_SIZE==32 */
+#endif /* ARCH_SIZE==64 */
 
 /* Declare at file level, since used in parameter lists, which have
    weird scope.  */
@@ -567,6 +584,8 @@ NAME(aout,bfd_free_cached_info) PARAMS ((bfd *));
 
 /* A.out uses the generic versions of these routines... */
 
+#define        aout_16_get_section_contents    _bfd_generic_get_section_contents
+
 #define        aout_32_get_section_contents    _bfd_generic_get_section_contents
 
 #define        aout_64_get_section_contents    _bfd_generic_get_section_contents
index 7fee07940d86d8e6fec8a0a607d043286b4eab98..4ed1e76e679bee83cb64754428733437790083af 100644 (file)
@@ -735,6 +735,8 @@ static const char *const bfd_reloc_code_real_names[] = { "@@uninitialized@@",
   "BFD_RELOC_NS32K_DISP_8_PCREL",
   "BFD_RELOC_NS32K_DISP_16_PCREL",
   "BFD_RELOC_NS32K_DISP_32_PCREL",
+  "BFD_RELOC_PDP11_DISP_8_PCREL",
+  "BFD_RELOC_PDP11_DISP_6_PCREL",
   "BFD_RELOC_PJ_CODE_HI16",
   "BFD_RELOC_PJ_CODE_LO16",
   "BFD_RELOC_PJ_CODE_DIR16",
diff --git a/bfd/pdp11.c b/bfd/pdp11.c
new file mode 100644 (file)
index 0000000..4f7e460
--- /dev/null
@@ -0,0 +1,5022 @@
+/* BFD back-end for PDP-11 a.out binaries.
+   Copyright (C) 2001 Free Software Foundation, Inc.
+
+This file is part of BFD, the Binary File Descriptor library.
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+/* BFD backend for PDP-11, running 2.11BSD in particular.
+
+   This file was hacked up by looking hard at the existing vaxnetbsd
+   back end and the header files in 2.11BSD.
+
+   TODO
+   * support for V7 file formats
+   * support for overlay object files (see 2.11 a.out(5))
+   * support for old and very old archives
+   (see 2.11 ar(5), historical section)
+   
+   Search for TODO to find other areas needing more work.  */
+
+#define        BYTES_IN_WORD   2
+#define        BYTES_IN_LONG   4
+#define ARCH_SIZE      16
+#undef TARGET_IS_BIG_ENDIAN_P
+
+#define        TARGET_PAGE_SIZE        1024
+#define        SEGMENT__SIZE   TARGET_PAGE_SIZE
+
+#define        DEFAULT_ARCH    bfd_arch_pdp11
+#define        DEFAULT_MID     M_PDP11
+
+#define MY(OP) CAT(pdp11_aout_,OP)
+/* This needs to start with a.out so GDB knows it is an a.out variant.  */
+#define TARGETNAME "a.out-pdp11"
+
+/* This is the normal load address for executables.  */
+#define TEXT_START_ADDR                0
+
+/* The header is not included in the text segment.  */
+#define N_HEADER_IN_TEXT(x)    0
+
+/* There are no shared libraries.  */
+#define N_SHARED_LIB(x)        0
+
+/* There is no flags field.  */
+#define N_FLAGS(exec)          0
+
+#define N_SET_FLAGS(exec, flags) do { } while (0)
+#define N_BADMAG(x) (((x).a_info != OMAGIC) && \
+                     ((x).a_info != NMAGIC) && \
+                     ((x).a_info != A_MAGIC3) && \
+                     ((x).a_info != A_MAGIC4) && \
+                     ((x).a_info != A_MAGIC5) && \
+                     ((x).a_info != A_MAGIC6))
+
+#include "bfd.h"
+
+#define external_exec pdp11_external_exec
+struct pdp11_external_exec
+  {
+    bfd_byte e_info[2];        /* magic number                         */
+    bfd_byte e_text[2];        /* length of text section in bytes      */
+    bfd_byte e_data[2];        /* length of data section in bytes      */
+    bfd_byte e_bss[2]; /* length of bss area in bytes          */
+    bfd_byte e_syms[2];        /* length of symbol table in bytes      */
+    bfd_byte e_entry[2];       /* start address                        */
+    bfd_byte e_unused[2];      /* not used                             */
+    bfd_byte e_flag[2];        /* relocation info stripped             */
+    bfd_byte e_relocatable; /* ugly hack */
+  };
+
+#define        EXEC_BYTES_SIZE (8 * 2)
+
+#define        A_MAGIC1        OMAGIC
+#define OMAGIC         0407    /* ...object file or impure executable.  */
+#define        A_MAGIC2        NMAGIC
+#define NMAGIC         0410    /* pure executable.  */
+#define ZMAGIC         0413    /* demand-paged executable.  */
+#define        A_MAGIC3        0411    /* separated I&D */
+#define        A_MAGIC4        0405    /* overlay */
+#define        A_MAGIC5        0430    /* auto-overlay (nonseparate) */
+#define        A_MAGIC6        0431    /* auto-overlay (separate) */
+#define QMAGIC         0
+#define BMAGIC         0
+
+#define A_FLAG_RELOC_STRIPPED  0x0001
+
+#define external_nlist pdp11_external_nlist
+struct pdp11_external_nlist
+  {
+    bfd_byte e_unused[2];      /* unused */
+    bfd_byte e_strx[2];                /* index into string table of name */
+    bfd_byte e_type[1];                /* type of symbol */
+    bfd_byte e_ovly[1];                /* overlay number */
+    bfd_byte e_value[2];       /* value of symbol */
+  };
+
+#define        EXTERNAL_NLIST_SIZE     8
+
+#define N_TXTOFF(x)    (EXEC_BYTES_SIZE)
+#define N_DATOFF(x)    (N_TXTOFF(x) + (x).a_text)
+#define N_TRELOFF(x)   (N_DATOFF(x) + (x).a_data)
+#define N_DRELOFF(x)   (N_TRELOFF(x) + (x).a_trsize)
+#define N_SYMOFF(x)    (N_DRELOFF(x) + (x).a_drsize)
+#define N_STROFF(x)    (N_SYMOFF(x) + (x).a_syms)
+
+#define WRITE_HEADERS(abfd, execp) pdp11_aout_write_headers (abfd, execp)
+
+#include "sysdep.h"
+#include "libbfd.h"
+#include "libaout.h"
+
+#define SWAP_MAGIC(ext) bfd_getl16 (ext)
+
+#define MY_entry_is_text_address 1
+
+#define MY_write_object_contents MY(write_object_contents)
+static boolean MY(write_object_contents) PARAMS ((bfd *abfd));
+#define MY_text_includes_header 1
+
+bfd_vma                bfd_getp32         PARAMS ((const bfd_byte *));
+bfd_signed_vma bfd_getp_signed_32 PARAMS ((const bfd_byte *));
+void           bfd_putp32         PARAMS ((bfd_vma, bfd_byte *));
+
+#define MY_BFD_TARGET
+
+#include "aout-target.h"
+
+const bfd_target MY(vec) =
+{
+  TARGETNAME,          /* name */
+  bfd_target_aout_flavour,
+  BFD_ENDIAN_LITTLE,           /* target byte order (little) */
+  BFD_ENDIAN_LITTLE,           /* target headers byte order (little) */
+  (HAS_RELOC | EXEC_P |                /* object flags */
+   HAS_LINENO | HAS_DEBUG |
+   HAS_SYMS | HAS_LOCALS | WP_TEXT),
+  (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_CODE | SEC_DATA),
+  MY_symbol_leading_char,
+  AR_PAD_CHAR,                 /* ar_pad_char */
+  15,                          /* ar_max_namelen */
+  bfd_getl64, bfd_getl_signed_64, bfd_putl64,
+     bfd_getp32, bfd_getp_signed_32, bfd_putp32,
+     bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* data */
+  bfd_getl64, bfd_getl_signed_64, bfd_putl64,
+     bfd_getp32, bfd_getp_signed_32, bfd_putp32,
+     bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* hdrs */
+    {_bfd_dummy_target, MY_object_p, /* bfd_check_format */
+       bfd_generic_archive_p, MY_core_file_p},
+    {bfd_false, MY_mkobject,   /* bfd_set_format */
+       _bfd_generic_mkarchive, bfd_false},
+    {bfd_false, MY_write_object_contents, /* bfd_write_contents */
+       _bfd_write_archive_contents, bfd_false},
+
+     BFD_JUMP_TABLE_GENERIC (MY),
+     BFD_JUMP_TABLE_COPY (MY),
+     BFD_JUMP_TABLE_CORE (MY),
+     BFD_JUMP_TABLE_ARCHIVE (MY),
+     BFD_JUMP_TABLE_SYMBOLS (MY),
+     BFD_JUMP_TABLE_RELOCS (MY),
+     BFD_JUMP_TABLE_WRITE (MY),
+     BFD_JUMP_TABLE_LINK (MY),
+     BFD_JUMP_TABLE_DYNAMIC (MY),
+
+  /* Alternative_target */
+  NULL,
+  
+  (PTR) MY_backend_data,
+};
+
+/* start of modified aoutx.h */
+/* BFD semi-generic back-end for a.out binaries.
+   Copyright 1990, 91, 92, 93, 94, 95, 96, 97, 1998
+   Free Software Foundation, Inc.
+   Written by Cygnus Support.
+
+This file is part of BFD, the Binary File Descriptor library.
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+
+/*
+SECTION
+       a.out backends
+
+
+DESCRIPTION
+
+       BFD supports a number of different flavours of a.out format,
+       though the major differences are only the sizes of the
+       structures on disk, and the shape of the relocation
+       information.
+
+       The support is split into a basic support file @file{aoutx.h}
+       and other files which derive functions from the base. One
+       derivation file is @file{aoutf1.h} (for a.out flavour 1), and
+       adds to the basic a.out functions support for sun3, sun4, 386
+       and 29k a.out files, to create a target jump vector for a
+       specific target.
+
+       This information is further split out into more specific files
+       for each machine, including @file{sunos.c} for sun3 and sun4,
+       @file{newsos3.c} for the Sony NEWS, and @file{demo64.c} for a
+       demonstration of a 64 bit a.out format.
+
+       The base file @file{aoutx.h} defines general mechanisms for
+       reading and writing records to and from disk and various
+       other methods which BFD requires. It is included by
+       @file{aout32.c} and @file{aout64.c} to form the names
+       <<aout_32_swap_exec_header_in>>, <<aout_64_swap_exec_header_in>>, etc.
+
+       As an example, this is what goes on to make the back end for a
+       sun4, from @file{aout32.c}:
+
+|      #define ARCH_SIZE 32
+|      #include "aoutx.h"
+
+       Which exports names:
+
+|      ...
+|      aout_32_canonicalize_reloc
+|      aout_32_find_nearest_line
+|      aout_32_get_lineno
+|      aout_32_get_reloc_upper_bound
+|      ...
+
+       from @file{sunos.c}:
+
+|      #define TARGET_NAME "a.out-sunos-big"
+|      #define VECNAME    sunos_big_vec
+|      #include "aoutf1.h"
+
+       requires all the names from @file{aout32.c}, and produces the jump vector
+
+|      sunos_big_vec
+
+       The file @file{host-aout.c} is a special case.  It is for a large set
+       of hosts that use ``more or less standard'' a.out files, and
+       for which cross-debugging is not interesting.  It uses the
+       standard 32-bit a.out support routines, but determines the
+       file offsets and addresses of the text, data, and BSS
+       sections, the machine architecture and machine type, and the
+       entry point address, in a host-dependent manner.  Once these
+       values have been determined, generic code is used to handle
+       the  object file.
+
+       When porting it to run on a new system, you must supply:
+
+|        HOST_PAGE_SIZE
+|        HOST_SEGMENT_SIZE
+|        HOST_MACHINE_ARCH       (optional)
+|        HOST_MACHINE_MACHINE    (optional)
+|        HOST_TEXT_START_ADDR
+|        HOST_STACK_END_ADDR
+
+       in the file @file{../include/sys/h-@var{XXX}.h} (for your host).  These
+       values, plus the structures and macros defined in @file{a.out.h} on
+       your host system, will produce a BFD target that will access
+       ordinary a.out files on your host. To configure a new machine
+       to use @file{host-aout.c}, specify:
+
+|      TDEFAULTS = -DDEFAULT_VECTOR=host_aout_big_vec
+|      TDEPFILES= host-aout.o trad-core.o
+
+       in the @file{config/@var{XXX}.mt} file, and modify @file{configure.in}
+       to use the
+       @file{@var{XXX}.mt} file (by setting "<<bfd_target=XXX>>") when your
+       configuration is selected.
+
+*/
+
+/* Some assumptions:
+   * Any BFD with D_PAGED set is ZMAGIC, and vice versa.
+     Doesn't matter what the setting of WP_TEXT is on output, but it'll
+     get set on input.
+   * Any BFD with D_PAGED clear and WP_TEXT set is NMAGIC.
+   * Any BFD with both flags clear is OMAGIC.
+   (Just want to make these explicit, so the conditions tested in this
+   file make sense if you're more familiar with a.out than with BFD.)  */
+
+#define KEEPIT udata.i
+
+#include <string.h>            /* For strchr and friends */
+#include <ctype.h>
+#include "bfd.h"
+#include "sysdep.h"
+#include "bfdlink.h"
+
+#include "libaout.h"
+/*#include "libbfd.h"*/
+#include "aout/aout64.h"
+#include "aout/stab_gnu.h"
+#include "aout/ar.h"
+
+#undef N_TYPE
+#undef N_UNDF
+#undef N_ABS
+#undef N_TEXT
+#undef N_DATA
+#undef N_BSS
+#undef N_REG
+#undef N_FN
+#undef N_EXT
+#define N_TYPE         0x1f    /* type mask */
+#define N_UNDF         0x00    /* undefined */
+#define N_ABS          0x01    /* absolute */
+#define N_TEXT         0x02    /* text segment */
+#define N_DATA         0x03    /* data segment */
+#define N_BSS          0x04    /* bss segment */
+#define N_REG          0x14    /* register symbol */
+#define N_FN           0x1f    /* file name */
+
+#define N_EXT          0x20    /* external flag */
+
+#define RELOC_SIZE 2
+
+struct pdp11_aout_reloc_external
+{
+  bfd_byte e_reloc_entry[2];
+};
+
+#define RELFLG         0x0001  /* pc-relative flag */
+#define RTYPE          0x000e  /* type mask */
+#define RIDXMASK       0xfff0  /* index mask */
+
+#define RABS           0x00    /* absolute */
+#define RTEXT          0x02    /* text */
+#define RDATA          0x04    /* data */
+#define RBSS           0x06    /* bss */
+#define REXT           0x08    /* external */
+
+#define RINDEX(x)      (((x) & 0xfff0) >> 4)
+
+static boolean aout_get_external_symbols PARAMS ((bfd *));
+static boolean translate_from_native_sym_flags
+  PARAMS ((bfd *, aout_symbol_type *));
+static boolean translate_to_native_sym_flags
+  PARAMS ((bfd *, asymbol *, struct external_nlist *));
+static void adjust_o_magic PARAMS ((bfd *, struct internal_exec *));
+static void adjust_z_magic PARAMS ((bfd *, struct internal_exec *));
+static void adjust_n_magic PARAMS ((bfd *, struct internal_exec *));
+
+/*
+SUBSECTION
+       Relocations
+
+DESCRIPTION
+       The file @file{aoutx.h} provides for both the @emph{standard}
+       and @emph{extended} forms of a.out relocation records.
+
+       The standard records contain only an
+       address, a symbol index, and a type field. The extended records
+       (used on 29ks and sparcs) also have a full integer for an
+       addend.
+
+*/
+
+#ifndef MY_final_link_relocate
+#define MY_final_link_relocate _bfd_final_link_relocate
+#endif
+
+#ifndef MY_relocate_contents
+#define MY_relocate_contents _bfd_relocate_contents
+#endif
+
+reloc_howto_type howto_table_pdp11[] =
+{
+  /* type              rs size bsz  pcrel bitpos ovrf                     sf name     part_inpl readmask  setmask    pcdone */
+HOWTO( 0,             0,  1,  16,  false, 0, complain_overflow_signed,0,"16",  true, 0x0000ffff,0x0000ffff, false),
+HOWTO( 1,             0,  1,  16,  true,  0, complain_overflow_signed,0,"DISP16",      true, 0x0000ffff,0x0000ffff, false),
+};
+
+#define TABLE_SIZE(TABLE)      (sizeof(TABLE)/sizeof(TABLE[0]))
+
+reloc_howto_type *
+NAME(aout,reloc_type_lookup) (abfd,code)
+     bfd * abfd ATTRIBUTE_UNUSED;
+     bfd_reloc_code_real_type code;
+{
+  switch (code)
+    {
+    case BFD_RELOC_16:
+      return &howto_table_pdp11[0];
+    case BFD_RELOC_16_PCREL:
+      return &howto_table_pdp11[1];
+    default:
+      return (reloc_howto_type *)NULL;
+    }
+}
+
+static int
+pdp11_aout_write_headers (abfd, execp)
+     bfd *abfd;
+     struct internal_exec *execp;
+{
+  struct external_exec exec_bytes;
+  bfd_size_type text_size;
+  file_ptr text_end;
+
+  if (adata(abfd).magic == undecided_magic)
+    NAME(aout,adjust_sizes_and_vmas) (abfd, &text_size, &text_end);
+
+  execp->a_syms = bfd_get_symcount (abfd) * EXTERNAL_NLIST_SIZE;
+  execp->a_entry = bfd_get_start_address (abfd);
+
+  if (obj_textsec (abfd)->reloc_count > 0 ||
+      obj_datasec (abfd)->reloc_count > 0)
+    {
+      execp->a_trsize = execp->a_text;
+      execp->a_drsize = execp->a_data;
+    }
+  else
+    {
+      execp->a_trsize = 0;
+      execp->a_drsize = 0;
+    }
+
+  NAME(aout,swap_exec_header_out) (abfd, execp, &exec_bytes);
+
+  if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)
+    return false;
+
+  if (bfd_write ((PTR) &exec_bytes, 1, EXEC_BYTES_SIZE, abfd)
+      != EXEC_BYTES_SIZE)
+    return false;
+
+  /* Now write out reloc info, followed by syms and strings */
+
+  if (bfd_get_outsymbols (abfd) != (asymbol **) NULL
+      && bfd_get_symcount (abfd) != 0)
+    {
+      if (bfd_seek (abfd, (file_ptr)(N_SYMOFF(*execp)), SEEK_SET) != 0)
+       return false;
+
+      if (! NAME(aout,write_syms)(abfd)) return false;
+    }
+
+  if (obj_textsec (abfd)->reloc_count > 0 ||
+      obj_datasec (abfd)->reloc_count > 0)
+    {
+      if (bfd_seek (abfd, (file_ptr)(N_TRELOFF(*execp)), SEEK_SET) != 0)
+       return false;
+      if (!NAME(aout,squirt_out_relocs) (abfd, obj_textsec (abfd)))
+       return false;
+
+      if (bfd_seek (abfd, (file_ptr)(N_DRELOFF(*execp)), SEEK_SET) != 0)
+       return false;
+      if (!NAME(aout,squirt_out_relocs)(abfd, obj_datasec (abfd)))
+       return false;
+    }
+
+  return true;
+}                                                                            
+
+/* Write an object file.
+   Section contents have already been written.  We write the
+   file header, symbols, and relocation.  */
+
+static boolean
+MY(write_object_contents) (abfd)
+     bfd *abfd;
+{
+  struct internal_exec *execp = exec_hdr (abfd);
+
+  /* We must make certain that the magic number has been set.  This
+     will normally have been done by set_section_contents, but only if
+     there actually are some section contents.  */
+  if (! abfd->output_has_begun)
+    {
+      bfd_size_type text_size;
+      file_ptr text_end;
+
+      NAME(aout,adjust_sizes_and_vmas) (abfd, &text_size, &text_end);
+    }
+
+  obj_reloc_entry_size (abfd) = RELOC_SIZE;
+
+  return WRITE_HEADERS(abfd, execp);
+}
+
+/*
+SUBSECTION
+       Internal entry points
+
+DESCRIPTION
+       @file{aoutx.h} exports several routines for accessing the
+       contents of an a.out file, which are gathered and exported in
+       turn by various format specific files (eg sunos.c).
+
+*/
+
+/*
+FUNCTION
+        aout_@var{size}_swap_exec_header_in
+
+SYNOPSIS
+       void aout_@var{size}_swap_exec_header_in,
+           (bfd *abfd,
+            struct external_exec *raw_bytes,
+            struct internal_exec *execp);
+
+DESCRIPTION
+       Swap the information in an executable header @var{raw_bytes} taken
+       from a raw byte stream memory image into the internal exec header
+       structure @var{execp}.
+*/
+
+#ifndef NAME_swap_exec_header_in
+void
+NAME(aout,swap_exec_header_in) (abfd, raw_bytes, execp)
+     bfd *abfd;
+     struct external_exec *raw_bytes;
+     struct internal_exec *execp;
+{
+  struct external_exec *bytes = (struct external_exec *)raw_bytes;
+
+  /* The internal_exec structure has some fields that are unused in this
+     configuration (IE for i960), so ensure that all such uninitialized
+     fields are zero'd out.  There are places where two of these structs
+     are memcmp'd, and thus the contents do matter. */
+  memset ((PTR) execp, 0, sizeof (struct internal_exec));
+  /* Now fill in fields in the execp, from the bytes in the raw data.  */
+  execp->a_info   = GET_MAGIC (abfd, bytes->e_info);
+  execp->a_text   = GET_WORD (abfd, bytes->e_text);
+  execp->a_data   = GET_WORD (abfd, bytes->e_data);
+  execp->a_bss    = GET_WORD (abfd, bytes->e_bss);
+  execp->a_syms   = GET_WORD (abfd, bytes->e_syms);
+  execp->a_entry  = GET_WORD (abfd, bytes->e_entry);
+
+  if (GET_WORD (abfd, bytes->e_flag) & A_FLAG_RELOC_STRIPPED)
+    {
+      execp->a_trsize = 0;
+      execp->a_drsize = 0;
+    }
+  else
+    {
+      execp->a_trsize = execp->a_text;
+      execp->a_drsize = execp->a_data;
+    }
+}
+#define NAME_swap_exec_header_in NAME(aout,swap_exec_header_in)
+#endif
+
+/*
+FUNCTION
+       aout_@var{size}_swap_exec_header_out
+
+SYNOPSIS
+       void aout_@var{size}_swap_exec_header_out
+         (bfd *abfd,
+          struct internal_exec *execp,
+          struct external_exec *raw_bytes);
+
+DESCRIPTION
+       Swap the information in an internal exec header structure
+       @var{execp} into the buffer @var{raw_bytes} ready for writing to disk.
+*/
+void
+NAME(aout,swap_exec_header_out) (abfd, execp, raw_bytes)
+     bfd *abfd;
+     struct internal_exec *execp;
+     struct external_exec *raw_bytes;
+{
+  struct external_exec *bytes = (struct external_exec *)raw_bytes;
+
+  /* Now fill in fields in the raw data, from the fields in the exec struct. */
+  PUT_MAGIC (abfd, execp->a_info,              bytes->e_info);
+  PUT_WORD (abfd, execp->a_text,               bytes->e_text);
+  PUT_WORD (abfd, execp->a_data,               bytes->e_data);
+  PUT_WORD (abfd, execp->a_bss,                        bytes->e_bss);
+  PUT_WORD (abfd, execp->a_syms,               bytes->e_syms);
+  PUT_WORD (abfd, execp->a_entry,              bytes->e_entry);
+  PUT_WORD (abfd, 0,                           bytes->e_unused);
+
+  if ((execp->a_trsize == 0 || execp->a_text == 0) &&
+      (execp->a_drsize == 0 || execp->a_data == 0))
+    PUT_WORD (abfd, A_FLAG_RELOC_STRIPPED,     bytes->e_flag);
+  else if (execp->a_trsize == execp->a_text &&
+          execp->a_drsize == execp->a_data)
+    PUT_WORD (abfd, 0,                         bytes->e_flag);
+  else
+    {
+      /* TODO: print a proper warning message */
+      fprintf (stderr, "BFD:%s:%d: internal error\n", __FILE__, __LINE__);
+      PUT_WORD (abfd, 0,                       bytes->e_flag);
+    }
+}
+
+/* Make all the section for an a.out file.  */
+
+boolean
+NAME(aout,make_sections) (abfd)
+     bfd *abfd;
+{
+  if (obj_textsec (abfd) == (asection *) NULL
+      && bfd_make_section (abfd, ".text") == (asection *) NULL)
+    return false;
+  if (obj_datasec (abfd) == (asection *) NULL
+      && bfd_make_section (abfd, ".data") == (asection *) NULL)
+    return false;
+  if (obj_bsssec (abfd) == (asection *) NULL
+      && bfd_make_section (abfd, ".bss") == (asection *) NULL)
+    return false;
+  return true;
+}
+
+/*
+FUNCTION
+       aout_@var{size}_some_aout_object_p
+
+SYNOPSIS
+       const bfd_target *aout_@var{size}_some_aout_object_p
+        (bfd *abfd,
+         const bfd_target *(*callback_to_real_object_p)());
+
+DESCRIPTION
+       Some a.out variant thinks that the file open in @var{abfd}
+       checking is an a.out file.  Do some more checking, and set up
+       for access if it really is.  Call back to the calling
+       environment's "finish up" function just before returning, to
+       handle any last-minute setup.
+*/
+
+const bfd_target *
+NAME(aout,some_aout_object_p) (abfd, execp, callback_to_real_object_p)
+     bfd *abfd;
+     struct internal_exec *execp;
+     const bfd_target *(*callback_to_real_object_p) PARAMS ((bfd *));
+{
+  struct aout_data_struct *rawptr, *oldrawptr;
+  const bfd_target *result;
+
+  rawptr = (struct aout_data_struct  *) bfd_zalloc (abfd, sizeof (struct aout_data_struct ));
+  if (rawptr == NULL)
+    return 0;
+
+  oldrawptr = abfd->tdata.aout_data;
+  abfd->tdata.aout_data = rawptr;
+
+  /* Copy the contents of the old tdata struct.
+     In particular, we want the subformat, since for hpux it was set in
+     hp300hpux.c:swap_exec_header_in and will be used in
+     hp300hpux.c:callback.  */
+  if (oldrawptr != NULL)
+    *abfd->tdata.aout_data = *oldrawptr;
+
+  abfd->tdata.aout_data->a.hdr = &rawptr->e;
+  *(abfd->tdata.aout_data->a.hdr) = *execp;    /* Copy in the internal_exec struct */
+  execp = abfd->tdata.aout_data->a.hdr;
+
+  /* Set the file flags */
+  abfd->flags = BFD_NO_FLAGS;
+  if (execp->a_drsize || execp->a_trsize)
+    abfd->flags |= HAS_RELOC;
+  /* Setting of EXEC_P has been deferred to the bottom of this function */
+  if (execp->a_syms)
+    abfd->flags |= HAS_LINENO | HAS_DEBUG | HAS_SYMS | HAS_LOCALS;
+  if (N_DYNAMIC(*execp))
+    abfd->flags |= DYNAMIC;
+
+  if (N_MAGIC (*execp) == ZMAGIC)
+    {
+      abfd->flags |= D_PAGED | WP_TEXT;
+      adata (abfd).magic = z_magic;
+    }
+  else if (N_MAGIC (*execp) == QMAGIC)
+    {
+      abfd->flags |= D_PAGED | WP_TEXT;
+      adata (abfd).magic = z_magic;
+      adata (abfd).subformat = q_magic_format;
+    }
+  else if (N_MAGIC (*execp) == NMAGIC)
+    {
+      abfd->flags |= WP_TEXT;
+      adata (abfd).magic = n_magic;
+    }
+  else if (N_MAGIC (*execp) == OMAGIC
+          || N_MAGIC (*execp) == BMAGIC)
+    adata (abfd).magic = o_magic;
+  else
+    {
+      /* Should have been checked with N_BADMAG before this routine
+        was called.  */
+      abort ();
+    }
+
+  bfd_get_start_address (abfd) = execp->a_entry;
+
+  obj_aout_symbols (abfd) = (aout_symbol_type *)NULL;
+  bfd_get_symcount (abfd) = execp->a_syms / sizeof (struct external_nlist);
+
+  /* The default relocation entry size is that of traditional V7 Unix.  */
+  obj_reloc_entry_size (abfd) = RELOC_SIZE;
+
+  /* The default symbol entry size is that of traditional Unix. */
+  obj_symbol_entry_size (abfd) = EXTERNAL_NLIST_SIZE;
+
+#ifdef USE_MMAP
+  bfd_init_window (&obj_aout_sym_window (abfd));
+  bfd_init_window (&obj_aout_string_window (abfd));
+#endif
+  obj_aout_external_syms (abfd) = NULL;
+  obj_aout_external_strings (abfd) = NULL;
+  obj_aout_sym_hashes (abfd) = NULL;
+
+  if (! NAME(aout,make_sections) (abfd))
+    return NULL;
+
+  obj_datasec (abfd)->_raw_size = execp->a_data;
+  obj_bsssec (abfd)->_raw_size = execp->a_bss;
+
+  obj_textsec (abfd)->flags =
+    (execp->a_trsize != 0
+     ? (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS | SEC_RELOC)
+     : (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS));
+  obj_datasec (abfd)->flags =
+    (execp->a_drsize != 0
+     ? (SEC_ALLOC | SEC_LOAD | SEC_DATA | SEC_HAS_CONTENTS | SEC_RELOC)
+     : (SEC_ALLOC | SEC_LOAD | SEC_DATA | SEC_HAS_CONTENTS));
+  obj_bsssec (abfd)->flags = SEC_ALLOC;
+
+#ifdef THIS_IS_ONLY_DOCUMENTATION
+  /* The common code can't fill in these things because they depend
+     on either the start address of the text segment, the rounding
+     up of virtual addresses between segments, or the starting file
+     position of the text segment -- all of which varies among different
+     versions of a.out.  */
+
+  /* Call back to the format-dependent code to fill in the rest of the
+     fields and do any further cleanup.  Things that should be filled
+     in by the callback:  */
+
+  struct exec *execp = exec_hdr (abfd);
+
+  obj_textsec (abfd)->size = N_TXTSIZE(*execp);
+  obj_textsec (abfd)->raw_size = N_TXTSIZE(*execp);
+  /* data and bss are already filled in since they're so standard */
+
+  /* The virtual memory addresses of the sections */
+  obj_textsec (abfd)->vma = N_TXTADDR(*execp);
+  obj_datasec (abfd)->vma = N_DATADDR(*execp);
+  obj_bsssec  (abfd)->vma = N_BSSADDR(*execp);
+
+  /* The file offsets of the sections */
+  obj_textsec (abfd)->filepos = N_TXTOFF(*execp);
+  obj_datasec (abfd)->filepos = N_DATOFF(*execp);
+
+  /* The file offsets of the relocation info */
+  obj_textsec (abfd)->rel_filepos = N_TRELOFF(*execp);
+  obj_datasec (abfd)->rel_filepos = N_DRELOFF(*execp);
+
+  /* The file offsets of the string table and symbol table.  */
+  obj_str_filepos (abfd) = N_STROFF (*execp);
+  obj_sym_filepos (abfd) = N_SYMOFF (*execp);
+
+  /* Determine the architecture and machine type of the object file.  */
+  abfd->obj_arch = bfd_arch_obscure;
+
+  adata(abfd)->page_size = TARGET_PAGE_SIZE;
+  adata(abfd)->segment_size = SEGMENT_SIZE;
+  adata(abfd)->exec_bytes_size = EXEC_BYTES_SIZE;
+
+  return abfd->xvec;
+
+  /* The architecture is encoded in various ways in various a.out variants,
+     or is not encoded at all in some of them.  The relocation size depends
+     on the architecture and the a.out variant.  Finally, the return value
+     is the bfd_target vector in use.  If an error occurs, return zero and
+     set bfd_error to the appropriate error code.
+
+     Formats such as b.out, which have additional fields in the a.out
+     header, should cope with them in this callback as well.  */
+#endif                         /* DOCUMENTATION */
+
+  result = (*callback_to_real_object_p)(abfd);
+
+  /* Now that the segment addresses have been worked out, take a better
+     guess at whether the file is executable.  If the entry point
+     is within the text segment, assume it is.  (This makes files
+     executable even if their entry point address is 0, as long as
+     their text starts at zero.).
+
+     This test had to be changed to deal with systems where the text segment
+     runs at a different location than the default.  The problem is that the
+     entry address can appear to be outside the text segment, thus causing an
+     erroneous conclusion that the file isn't executable.
+
+     To fix this, we now accept any non-zero entry point as an indication of
+     executability.  This will work most of the time, since only the linker
+     sets the entry point, and that is likely to be non-zero for most systems. */
+
+  if (execp->a_entry != 0
+      || (execp->a_entry >= obj_textsec(abfd)->vma
+         && execp->a_entry < obj_textsec(abfd)->vma + obj_textsec(abfd)->_raw_size))
+    abfd->flags |= EXEC_P;
+#ifdef STAT_FOR_EXEC
+  else
+    {
+      struct stat stat_buf;
+
+      /* The original heuristic doesn't work in some important cases.
+        The a.out file has no information about the text start
+        address.  For files (like kernels) linked to non-standard
+        addresses (ld -Ttext nnn) the entry point may not be between
+        the default text start (obj_textsec(abfd)->vma) and
+        (obj_textsec(abfd)->vma) + text size.  This is not just a mach
+        issue.  Many kernels are loaded at non standard addresses.  */
+      if (abfd->iostream != NULL
+         && (abfd->flags & BFD_IN_MEMORY) == 0
+         && (fstat(fileno((FILE *) (abfd->iostream)), &stat_buf) == 0)
+         && ((stat_buf.st_mode & 0111) != 0))
+       abfd->flags |= EXEC_P;
+    }
+#endif /* STAT_FOR_EXEC */
+
+  if (result)
+    {
+#if 0 /* These should be set correctly anyways.  */
+      abfd->sections = obj_textsec (abfd);
+      obj_textsec (abfd)->next = obj_datasec (abfd);
+      obj_datasec (abfd)->next = obj_bsssec (abfd);
+#endif
+    }
+  else
+    {
+      free (rawptr);
+      abfd->tdata.aout_data = oldrawptr;
+    }
+  return result;
+}
+
+/*
+FUNCTION
+       aout_@var{size}_mkobject
+
+SYNOPSIS
+       boolean aout_@var{size}_mkobject, (bfd *abfd);
+
+DESCRIPTION
+       Initialize BFD @var{abfd} for use with a.out files.
+*/
+
+boolean
+NAME(aout,mkobject) (abfd)
+     bfd *abfd;
+{
+  struct aout_data_struct  *rawptr;
+
+  bfd_set_error (bfd_error_system_call);
+
+  /* Use an intermediate variable for clarity */
+  rawptr = (struct aout_data_struct *)bfd_zalloc (abfd, sizeof (struct aout_data_struct ));
+
+  if (rawptr == NULL)
+    return false;
+
+  abfd->tdata.aout_data = rawptr;
+  exec_hdr (abfd) = &(rawptr->e);
+
+  obj_textsec (abfd) = (asection *)NULL;
+  obj_datasec (abfd) = (asection *)NULL;
+  obj_bsssec (abfd) = (asection *)NULL;
+
+  return true;
+}
+
+
+/*
+FUNCTION
+       aout_@var{size}_machine_type
+
+SYNOPSIS
+       enum machine_type  aout_@var{size}_machine_type
+        (enum bfd_architecture arch,
+         unsigned long machine));
+
+DESCRIPTION
+       Keep track of machine architecture and machine type for
+       a.out's. Return the <<machine_type>> for a particular
+       architecture and machine, or <<M_UNKNOWN>> if that exact architecture
+       and machine can't be represented in a.out format.
+
+       If the architecture is understood, machine type 0 (default)
+       is always understood.
+*/
+
+enum machine_type
+NAME(aout,machine_type) (arch, machine, unknown)
+     enum bfd_architecture arch;
+     unsigned long machine;
+     boolean *unknown;
+{
+  enum machine_type arch_flags;
+
+  arch_flags = M_UNKNOWN;
+  *unknown = true;
+
+  switch (arch)
+    {
+    case bfd_arch_sparc:
+      if (machine == 0
+         || machine == bfd_mach_sparc
+         || machine == bfd_mach_sparc_sparclite
+         || machine == bfd_mach_sparc_v9)
+       arch_flags = M_SPARC;
+      else if (machine == bfd_mach_sparc_sparclet)
+       arch_flags = M_SPARCLET;
+      break;
+
+    case bfd_arch_m68k:
+      switch (machine)
+       {
+       case 0:               arch_flags = M_68010; break;
+       case bfd_mach_m68000: arch_flags = M_UNKNOWN; *unknown = false; break;
+       case bfd_mach_m68010: arch_flags = M_68010; break;
+       case bfd_mach_m68020: arch_flags = M_68020; break;
+       default:              arch_flags = M_UNKNOWN; break;
+       }
+      break;
+
+    case bfd_arch_i386:
+      if (machine == 0)        arch_flags = M_386;
+      break;
+
+    case bfd_arch_a29k:
+      if (machine == 0)        arch_flags = M_29K;
+      break;
+
+    case bfd_arch_arm:
+      if (machine == 0)        arch_flags = M_ARM;
+      break;
+
+    case bfd_arch_mips:
+      switch (machine)
+       {
+       case 0:
+       case 2000:
+       case bfd_mach_mips3000:
+          arch_flags = M_MIPS1;
+         break;
+       case bfd_mach_mips4000: /* mips3 */
+       case bfd_mach_mips4400:
+       case bfd_mach_mips8000: /* mips4 */
+       case bfd_mach_mips6000: /* real mips2: */
+          arch_flags = M_MIPS2;
+         break;
+       default:
+         arch_flags = M_UNKNOWN;
+         break;
+       }
+      break;
+
+    case bfd_arch_ns32k:
+      switch (machine)
+       {
+       case 0:                 arch_flags = M_NS32532; break;
+       case 32032:             arch_flags = M_NS32032; break;
+       case 32532:             arch_flags = M_NS32532; break;
+       default:                arch_flags = M_UNKNOWN; break;
+       }
+      break;
+
+    case bfd_arch_pdp11:
+      /* TODO: arch_flags = M_PDP11; */
+      *unknown = false;
+      break;
+
+    case bfd_arch_vax:
+      *unknown = false;
+      break;
+    default:
+      arch_flags = M_UNKNOWN;
+    }
+
+  if (arch_flags != M_UNKNOWN)
+    *unknown = false;
+
+  return arch_flags;
+}
+
+
+/*
+FUNCTION
+       aout_@var{size}_set_arch_mach
+
+SYNOPSIS
+       boolean aout_@var{size}_set_arch_mach,
+        (bfd *,
+         enum bfd_architecture arch,
+         unsigned long machine));
+
+DESCRIPTION
+       Set the architecture and the machine of the BFD @var{abfd} to the
+       values @var{arch} and @var{machine}.  Verify that @var{abfd}'s format
+       can support the architecture required.
+*/
+
+boolean
+NAME(aout,set_arch_mach) (abfd, arch, machine)
+     bfd *abfd;
+     enum bfd_architecture arch;
+     unsigned long machine;
+{
+  if (! bfd_default_set_arch_mach (abfd, arch, machine))
+    return false;
+
+  if (arch != bfd_arch_unknown)
+    {
+      boolean unknown;
+
+      NAME(aout,machine_type) (arch, machine, &unknown);
+      if (unknown)
+       return false;
+    }
+
+  obj_reloc_entry_size (abfd) = RELOC_SIZE;
+
+  return (*aout_backend_info(abfd)->set_sizes) (abfd);
+}
+
+static void
+adjust_o_magic (abfd, execp)
+     bfd *abfd;
+     struct internal_exec *execp;
+{
+  file_ptr pos = adata (abfd).exec_bytes_size;
+  bfd_vma vma = 0;
+  int pad = 0;
+
+  /* Text.  */
+  obj_textsec (abfd)->filepos = pos;
+  if (! obj_textsec (abfd)->user_set_vma)
+    obj_textsec (abfd)->vma = vma;
+  else
+    vma = obj_textsec (abfd)->vma;
+
+  pos += obj_textsec (abfd)->_raw_size;
+  vma += obj_textsec (abfd)->_raw_size;
+
+  /* Data.  */
+  if (!obj_datasec (abfd)->user_set_vma)
+    {
+#if 0      /* ?? Does alignment in the file image really matter? */
+      pad = align_power (vma, obj_datasec (abfd)->alignment_power) - vma;
+#endif
+      obj_textsec (abfd)->_raw_size += pad;
+      pos += pad;
+      vma += pad;
+      obj_datasec (abfd)->vma = vma;
+    }
+  else
+    vma = obj_datasec (abfd)->vma;
+  obj_datasec (abfd)->filepos = pos;
+  pos += obj_datasec (abfd)->_raw_size;
+  vma += obj_datasec (abfd)->_raw_size;
+
+  /* BSS.  */
+  if (! obj_bsssec (abfd)->user_set_vma)
+    {
+#if 0
+      pad = align_power (vma, obj_bsssec (abfd)->alignment_power) - vma;
+#endif
+      obj_datasec (abfd)->_raw_size += pad;
+      pos += pad;
+      vma += pad;
+      obj_bsssec (abfd)->vma = vma;
+    }
+  else
+    {
+      /* The VMA of the .bss section is set by the the VMA of the
+         .data section plus the size of the .data section.  We may
+         need to add padding bytes to make this true.  */
+      pad = obj_bsssec (abfd)->vma - vma;
+      if (pad > 0)
+       {
+         obj_datasec (abfd)->_raw_size += pad;
+         pos += pad;
+       }
+    }
+  obj_bsssec (abfd)->filepos = pos;
+
+  /* Fix up the exec header.  */
+  execp->a_text = obj_textsec (abfd)->_raw_size;
+  execp->a_data = obj_datasec (abfd)->_raw_size;
+  execp->a_bss  = obj_bsssec (abfd)->_raw_size;
+  N_SET_MAGIC (*execp, OMAGIC);
+}
+
+static void
+adjust_z_magic (abfd, execp)
+     bfd *abfd;
+     struct internal_exec *execp;
+{
+  bfd_size_type data_pad, text_pad;
+  file_ptr text_end;
+  CONST struct aout_backend_data *abdp;
+  int ztih;                    /* Nonzero if text includes exec header.  */
+  
+  abdp = aout_backend_info (abfd);
+
+  /* Text.  */
+  ztih = (abdp != NULL
+         && (abdp->text_includes_header
+             || obj_aout_subformat (abfd) == q_magic_format));
+  obj_textsec(abfd)->filepos = (ztih
+                               ? adata(abfd).exec_bytes_size
+                               : adata(abfd).zmagic_disk_block_size);
+  if (! obj_textsec(abfd)->user_set_vma)
+    {
+      /* ?? Do we really need to check for relocs here?  */
+      obj_textsec(abfd)->vma = ((abfd->flags & HAS_RELOC)
+                               ? 0
+                               : (ztih
+                                  ? (abdp->default_text_vma
+                                     + adata (abfd).exec_bytes_size)
+                                  : abdp->default_text_vma));
+      text_pad = 0;
+    }
+  else
+    {
+      /* The .text section is being loaded at an unusual address.  We
+         may need to pad it such that the .data section starts at a page
+         boundary.  */
+      if (ztih)
+       text_pad = ((obj_textsec (abfd)->filepos - obj_textsec (abfd)->vma)
+                   & (adata (abfd).page_size - 1));
+      else
+       text_pad = ((- obj_textsec (abfd)->vma)
+                   & (adata (abfd).page_size - 1));
+    }
+
+  /* Find start of data.  */
+  if (ztih)
+    {
+      text_end = obj_textsec (abfd)->filepos + obj_textsec (abfd)->_raw_size;
+      text_pad += BFD_ALIGN (text_end, adata (abfd).page_size) - text_end;
+    }
+  else
+    {
+      /* Note that if page_size == zmagic_disk_block_size, then
+        filepos == page_size, and this case is the same as the ztih
+        case.  */
+      text_end = obj_textsec (abfd)->_raw_size;
+      text_pad += BFD_ALIGN (text_end, adata (abfd).page_size) - text_end;
+      text_end += obj_textsec (abfd)->filepos;
+    }
+
+  obj_textsec (abfd)->_raw_size += text_pad;
+  text_end += text_pad;
+
+  /* Data.  */
+  if (!obj_datasec(abfd)->user_set_vma)
+    {
+      bfd_vma vma;
+      vma = obj_textsec(abfd)->vma + obj_textsec(abfd)->_raw_size;
+      obj_datasec(abfd)->vma = BFD_ALIGN (vma, adata(abfd).segment_size);
+    }
+  if (abdp && abdp->zmagic_mapped_contiguous)
+    {
+      text_pad = (obj_datasec(abfd)->vma
+                 - obj_textsec(abfd)->vma
+                 - obj_textsec(abfd)->_raw_size);
+      obj_textsec(abfd)->_raw_size += text_pad;
+    }
+  obj_datasec (abfd)->filepos = (obj_textsec (abfd)->filepos
+                               + obj_textsec (abfd)->_raw_size);
+  
+  /* Fix up exec header while we're at it.  */
+  execp->a_text = obj_textsec(abfd)->_raw_size;
+  if (ztih && (!abdp || (abdp && !abdp->exec_header_not_counted)))
+    execp->a_text += adata(abfd).exec_bytes_size;
+  if (obj_aout_subformat (abfd) == q_magic_format)
+    N_SET_MAGIC (*execp, QMAGIC);
+  else
+    N_SET_MAGIC (*execp, ZMAGIC);
+
+  /* Spec says data section should be rounded up to page boundary.  */
+  obj_datasec(abfd)->_raw_size
+    = align_power (obj_datasec(abfd)->_raw_size,
+                  obj_bsssec(abfd)->alignment_power);
+  execp->a_data = BFD_ALIGN (obj_datasec(abfd)->_raw_size,
+                            adata(abfd).page_size);
+  data_pad = execp->a_data - obj_datasec(abfd)->_raw_size;
+
+  /* BSS.  */
+  if (!obj_bsssec(abfd)->user_set_vma)
+    obj_bsssec(abfd)->vma = (obj_datasec(abfd)->vma
+                            + obj_datasec(abfd)->_raw_size);
+  /* If the BSS immediately follows the data section and extra space
+     in the page is left after the data section, fudge data
+     in the header so that the bss section looks smaller by that
+     amount.  We'll start the bss section there, and lie to the OS.
+     (Note that a linker script, as well as the above assignment,
+     could have explicitly set the BSS vma to immediately follow
+     the data section.)  */
+  if (align_power (obj_bsssec(abfd)->vma, obj_bsssec(abfd)->alignment_power)
+      == obj_datasec(abfd)->vma + obj_datasec(abfd)->_raw_size)
+    execp->a_bss = (data_pad > obj_bsssec(abfd)->_raw_size) ? 0 :
+      obj_bsssec(abfd)->_raw_size - data_pad;
+  else
+    execp->a_bss = obj_bsssec(abfd)->_raw_size;
+}
+
+static void
+adjust_n_magic (abfd, execp)
+     bfd *abfd;
+     struct internal_exec *execp;
+{
+  file_ptr pos = adata(abfd).exec_bytes_size;
+  bfd_vma vma = 0;
+  int pad;
+  
+  /* Text.  */
+  obj_textsec(abfd)->filepos = pos;
+  if (!obj_textsec(abfd)->user_set_vma)
+    obj_textsec(abfd)->vma = vma;
+  else
+    vma = obj_textsec(abfd)->vma;
+  pos += obj_textsec(abfd)->_raw_size;
+  vma += obj_textsec(abfd)->_raw_size;
+
+  /* Data.  */
+  obj_datasec(abfd)->filepos = pos;
+  if (!obj_datasec(abfd)->user_set_vma)
+    obj_datasec(abfd)->vma = BFD_ALIGN (vma, adata(abfd).segment_size);
+  vma = obj_datasec(abfd)->vma;
+  
+  /* Since BSS follows data immediately, see if it needs alignment.  */
+  vma += obj_datasec(abfd)->_raw_size;
+  pad = align_power (vma, obj_bsssec(abfd)->alignment_power) - vma;
+  obj_datasec(abfd)->_raw_size += pad;
+  pos += obj_datasec(abfd)->_raw_size;
+
+  /* BSS.  */
+  if (!obj_bsssec(abfd)->user_set_vma)
+    obj_bsssec(abfd)->vma = vma;
+  else
+    vma = obj_bsssec(abfd)->vma;
+
+  /* Fix up exec header.  */
+  execp->a_text = obj_textsec(abfd)->_raw_size;
+  execp->a_data = obj_datasec(abfd)->_raw_size;
+  execp->a_bss = obj_bsssec(abfd)->_raw_size;
+  N_SET_MAGIC (*execp, NMAGIC);
+}
+
+boolean
+NAME(aout,adjust_sizes_and_vmas) (abfd, text_size, text_end)
+     bfd *abfd;
+     bfd_size_type *text_size;
+     file_ptr * text_end ATTRIBUTE_UNUSED;
+{
+  struct internal_exec *execp = exec_hdr (abfd);
+
+  if (! NAME(aout,make_sections) (abfd))
+    return false;
+
+  if (adata(abfd).magic != undecided_magic)
+    return true;
+
+  obj_textsec(abfd)->_raw_size =
+    align_power(obj_textsec(abfd)->_raw_size,
+               obj_textsec(abfd)->alignment_power);
+
+  *text_size = obj_textsec (abfd)->_raw_size;
+  /* Rule (heuristic) for when to pad to a new page.  Note that there
+     are (at least) two ways demand-paged (ZMAGIC) files have been
+     handled.  Most Berkeley-based systems start the text segment at
+     (TARGET_PAGE_SIZE).  However, newer versions of SUNOS start the text
+     segment right after the exec header; the latter is counted in the
+     text segment size, and is paged in by the kernel with the rest of
+     the text. */
+
+  /* This perhaps isn't the right way to do this, but made it simpler for me
+     to understand enough to implement it.  Better would probably be to go
+     right from BFD flags to alignment/positioning characteristics.  But the
+     old code was sloppy enough about handling the flags, and had enough
+     other magic, that it was a little hard for me to understand.  I think
+     I understand it better now, but I haven't time to do the cleanup this
+     minute.  */
+
+  if (abfd->flags & WP_TEXT)
+    adata(abfd).magic = n_magic;
+  else
+    adata(abfd).magic = o_magic;
+
+#ifdef BFD_AOUT_DEBUG /* requires gcc2 */
+#if __GNUC__ >= 2
+  fprintf (stderr, "%s text=<%x,%x,%x> data=<%x,%x,%x> bss=<%x,%x,%x>\n",
+          ({ char *str;
+             switch (adata(abfd).magic) {
+             case n_magic: str = "NMAGIC"; break;
+             case o_magic: str = "OMAGIC"; break;
+             case z_magic: str = "ZMAGIC"; break;
+             default: abort ();
+             }
+             str;
+           }),
+          obj_textsec(abfd)->vma, obj_textsec(abfd)->_raw_size,
+               obj_textsec(abfd)->alignment_power,
+          obj_datasec(abfd)->vma, obj_datasec(abfd)->_raw_size,
+               obj_datasec(abfd)->alignment_power,
+          obj_bsssec(abfd)->vma, obj_bsssec(abfd)->_raw_size,
+               obj_bsssec(abfd)->alignment_power);
+#endif
+#endif
+
+  switch (adata(abfd).magic)
+    {
+    case o_magic:
+      adjust_o_magic (abfd, execp);
+      break;
+    case z_magic:
+      adjust_z_magic (abfd, execp);
+      break;
+    case n_magic:
+      adjust_n_magic (abfd, execp);
+      break;
+    default:
+      abort ();
+    }
+
+#ifdef BFD_AOUT_DEBUG
+  fprintf (stderr, "       text=<%x,%x,%x> data=<%x,%x,%x> bss=<%x,%x>\n",
+          obj_textsec(abfd)->vma, obj_textsec(abfd)->_raw_size,
+               obj_textsec(abfd)->filepos,
+          obj_datasec(abfd)->vma, obj_datasec(abfd)->_raw_size,
+               obj_datasec(abfd)->filepos,
+          obj_bsssec(abfd)->vma, obj_bsssec(abfd)->_raw_size);
+#endif
+
+  return true;
+}
+
+/*
+FUNCTION
+       aout_@var{size}_new_section_hook
+
+SYNOPSIS
+        boolean aout_@var{size}_new_section_hook,
+          (bfd *abfd,
+           asection *newsect));
+
+DESCRIPTION
+       Called by the BFD in response to a @code{bfd_make_section}
+       request.
+*/
+boolean
+NAME(aout,new_section_hook) (abfd, newsect)
+     bfd *abfd;
+     asection *newsect;
+{
+  /* align to double at least */
+  newsect->alignment_power = bfd_get_arch_info(abfd)->section_align_power;
+
+
+  if (bfd_get_format (abfd) == bfd_object)
+    {
+      if (obj_textsec (abfd) == NULL
+         && ! strcmp (newsect->name, ".text"))
+       {
+         obj_textsec(abfd)= newsect;
+         newsect->target_index = N_TEXT;
+         return true;
+       }
+
+    if (obj_datasec (abfd) == NULL
+       && ! strcmp (newsect->name, ".data"))
+      {
+       obj_datasec (abfd) = newsect;
+       newsect->target_index = N_DATA;
+       return true;
+      }
+
+    if (obj_bsssec (abfd) == NULL
+       && !strcmp (newsect->name, ".bss"))
+      {
+       obj_bsssec (abfd) = newsect;
+       newsect->target_index = N_BSS;
+       return true;
+      }
+  }
+
+  /* We allow more than three sections internally */
+  return true;
+}
+
+boolean
+NAME(aout,set_section_contents) (abfd, section, location, offset, count)
+     bfd *abfd;
+     sec_ptr section;
+     PTR location;
+     file_ptr offset;
+     bfd_size_type count;
+{
+  file_ptr text_end;
+  bfd_size_type text_size;
+
+  if (! abfd->output_has_begun)
+    {
+      if (! NAME(aout,adjust_sizes_and_vmas) (abfd, &text_size, &text_end))
+       return false;
+    }
+
+  if (section == obj_bsssec (abfd))
+    {
+      bfd_set_error (bfd_error_no_contents);
+      return false;
+    }
+
+  if (section != obj_textsec (abfd)
+      && section != obj_datasec (abfd))
+    {
+      (*_bfd_error_handler)
+       ("%s: can not represent section `%s' in a.out object file format",
+        bfd_get_filename (abfd), bfd_get_section_name (abfd, section));
+      bfd_set_error (bfd_error_nonrepresentable_section);
+      return false;
+    }
+
+  if (count != 0)
+    {
+      if (bfd_seek (abfd, section->filepos + offset, SEEK_SET) != 0
+         || bfd_write (location, 1, count, abfd) != count)
+       return false;
+    }
+
+  return true;
+}
+\f
+/* Read the external symbols from an a.out file.  */
+
+static boolean
+aout_get_external_symbols (abfd)
+     bfd *abfd;
+{
+  if (obj_aout_external_syms (abfd) == (struct external_nlist *) NULL)
+    {
+      bfd_size_type count;
+      struct external_nlist *syms;
+
+      count = exec_hdr (abfd)->a_syms / EXTERNAL_NLIST_SIZE;
+
+#ifdef USE_MMAP
+      if (bfd_get_file_window (abfd,
+                              obj_sym_filepos (abfd), exec_hdr (abfd)->a_syms,
+                              &obj_aout_sym_window (abfd), true) == false)
+       return false;
+      syms = (struct external_nlist *) obj_aout_sym_window (abfd).data;
+#else
+      /* We allocate using malloc to make the values easy to free
+        later on.  If we put them on the objalloc it might not be
+        possible to free them.  */
+      syms = ((struct external_nlist *)
+             bfd_malloc ((size_t) count * EXTERNAL_NLIST_SIZE));
+      if (syms == (struct external_nlist *) NULL && count != 0)
+       return false;
+
+      if (bfd_seek (abfd, obj_sym_filepos (abfd), SEEK_SET) != 0
+         || (bfd_read (syms, 1, exec_hdr (abfd)->a_syms, abfd)
+             != exec_hdr (abfd)->a_syms))
+       {
+         free (syms);
+         return false;
+       }
+#endif
+
+      obj_aout_external_syms (abfd) = syms;
+      obj_aout_external_sym_count (abfd) = count;
+    }
+      
+  if (obj_aout_external_strings (abfd) == NULL
+      && exec_hdr (abfd)->a_syms != 0)
+    {
+      unsigned char string_chars[BYTES_IN_LONG];
+      bfd_size_type stringsize;
+      char *strings;
+
+      /* Get the size of the strings.  */
+      if (bfd_seek (abfd, obj_str_filepos (abfd), SEEK_SET) != 0
+         || (bfd_read ((PTR) string_chars, BYTES_IN_LONG, 1, abfd) !=
+             BYTES_IN_LONG))
+       return false;
+      stringsize = bfd_h_get_32 (abfd, string_chars);
+
+#ifdef USE_MMAP
+      if (bfd_get_file_window (abfd, obj_str_filepos (abfd), stringsize,
+                              &obj_aout_string_window (abfd), true) == false)
+       return false;
+      strings = (char *) obj_aout_string_window (abfd).data;
+#else
+      strings = (char *) bfd_malloc ((size_t) stringsize + 1);
+      if (strings == NULL)
+       return false;
+
+      /* Skip space for the string count in the buffer for convenience
+        when using indexes.  */
+      if (bfd_read (strings + 4, 1, stringsize - 4, abfd) != stringsize - 4)
+       {
+         free (strings);
+         return false;
+       }
+#endif
+
+      /* Ensure that a zero index yields an empty string.  */
+      strings[0] = '\0';
+
+      strings[stringsize - 1] = 0;
+
+      obj_aout_external_strings (abfd) = strings;
+      obj_aout_external_string_size (abfd) = stringsize;
+    }
+
+  return true;
+}
+
+/* Translate an a.out symbol into a BFD symbol.  The desc, other, type
+   and symbol->value fields of CACHE_PTR will be set from the a.out
+   nlist structure.  This function is responsible for setting
+   symbol->flags and symbol->section, and adjusting symbol->value.  */
+
+static boolean
+translate_from_native_sym_flags (abfd, cache_ptr)
+     bfd *abfd;
+     aout_symbol_type *cache_ptr;
+{
+  flagword visible;
+
+  if (cache_ptr->type == N_FN)
+    {
+      asection *sec;
+
+      /* This is a debugging symbol.  */
+
+      cache_ptr->symbol.flags = BSF_DEBUGGING;
+
+      /* Work out the symbol section.  */
+      switch (cache_ptr->type & N_TYPE)
+       {
+       case N_TEXT:
+       case N_FN:
+         sec = obj_textsec (abfd);
+         break;
+       case N_DATA:
+         sec = obj_datasec (abfd);
+         break;
+       case N_BSS:
+         sec = obj_bsssec (abfd);
+         break;
+       default:
+       case N_ABS:
+         sec = bfd_abs_section_ptr;
+         break;
+       }
+
+      cache_ptr->symbol.section = sec;
+      cache_ptr->symbol.value -= sec->vma;
+
+      return true;
+    }
+
+  /* Get the default visibility.  This does not apply to all types, so
+     we just hold it in a local variable to use if wanted.  */
+  if ((cache_ptr->type & N_EXT) == 0)
+    visible = BSF_LOCAL;
+  else
+    visible = BSF_GLOBAL;
+
+  switch (cache_ptr->type)
+    {
+    default:
+    case N_ABS: case N_ABS | N_EXT:
+      cache_ptr->symbol.section = bfd_abs_section_ptr;
+      cache_ptr->symbol.flags = visible;
+      break;
+
+    case N_UNDF | N_EXT:
+      if (cache_ptr->symbol.value != 0)
+       {
+         /* This is a common symbol.  */
+         cache_ptr->symbol.flags = BSF_GLOBAL;
+         cache_ptr->symbol.section = bfd_com_section_ptr;
+       }
+      else
+       {
+         cache_ptr->symbol.flags = 0;
+         cache_ptr->symbol.section = bfd_und_section_ptr;
+       }
+      break;
+
+    case N_TEXT: case N_TEXT | N_EXT:
+      cache_ptr->symbol.section = obj_textsec (abfd);
+      cache_ptr->symbol.value -= cache_ptr->symbol.section->vma;
+      cache_ptr->symbol.flags = visible;
+      break;
+
+    case N_DATA: case N_DATA | N_EXT:
+      cache_ptr->symbol.section = obj_datasec (abfd);
+      cache_ptr->symbol.value -= cache_ptr->symbol.section->vma;
+      cache_ptr->symbol.flags = visible;
+      break;
+
+    case N_BSS: case N_BSS | N_EXT:
+      cache_ptr->symbol.section = obj_bsssec (abfd);
+      cache_ptr->symbol.value -= cache_ptr->symbol.section->vma;
+      cache_ptr->symbol.flags = visible;
+      break;
+    }
+
+  return true;
+}
+
+/* Set the fields of SYM_POINTER according to CACHE_PTR.  */
+
+static boolean
+translate_to_native_sym_flags (abfd, cache_ptr, sym_pointer)
+     bfd *abfd;
+     asymbol *cache_ptr;
+     struct external_nlist *sym_pointer;
+{
+  bfd_vma value = cache_ptr->value;
+  asection *sec;
+  bfd_vma off;
+
+  /* Mask out any existing type bits in case copying from one section
+     to another.  */
+  sym_pointer->e_type[0] &= ~N_TYPE;
+
+  sec = bfd_get_section (cache_ptr);
+  off = 0;
+
+  if (sec == NULL)
+    {
+      /* This case occurs, e.g., for the *DEBUG* section of a COFF
+        file.  */
+      (*_bfd_error_handler)
+       ("%s: can not represent section for symbol `%s' in a.out object file format",
+        bfd_get_filename (abfd), 
+        cache_ptr->name != NULL ? cache_ptr->name : "*unknown*");
+      bfd_set_error (bfd_error_nonrepresentable_section);
+      return false;
+    }
+
+  if (sec->output_section != NULL)
+    {
+      off = sec->output_offset;
+      sec = sec->output_section;
+    }
+
+  if (bfd_is_abs_section (sec))
+    sym_pointer->e_type[0] |= N_ABS;
+  else if (sec == obj_textsec (abfd))
+    sym_pointer->e_type[0] |= N_TEXT;
+  else if (sec == obj_datasec (abfd))
+    sym_pointer->e_type[0] |= N_DATA;
+  else if (sec == obj_bsssec (abfd))
+    sym_pointer->e_type[0] |= N_BSS;
+  else if (bfd_is_und_section (sec))
+    sym_pointer->e_type[0] = N_UNDF | N_EXT;
+  else if (bfd_is_com_section (sec))
+    sym_pointer->e_type[0] = N_UNDF | N_EXT;
+  else
+    {
+      (*_bfd_error_handler)
+       ("%s: can not represent section `%s' in a.out object file format",
+        bfd_get_filename (abfd), bfd_get_section_name (abfd, sec));
+      bfd_set_error (bfd_error_nonrepresentable_section);
+      return false;
+    }
+
+  /* Turn the symbol from section relative to absolute again */
+  value += sec->vma + off;
+
+  if ((cache_ptr->flags & BSF_DEBUGGING) != 0)
+    sym_pointer->e_type[0] = ((aout_symbol_type *) cache_ptr)->type;
+  else if ((cache_ptr->flags & BSF_GLOBAL) != 0)
+    sym_pointer->e_type[0] |= N_EXT;
+
+#if 0
+  if ((cache_ptr->flags & BSF_CONSTRUCTOR) != 0)
+    {
+      int type = ((aout_symbol_type *) cache_ptr)->type;
+
+
+      switch (type)
+       {
+       case N_ABS:     type = N_SETA; break;
+       case N_TEXT:    type = N_SETT; break;
+       case N_DATA:    type = N_SETD; break;
+       case N_BSS:     type = N_SETB; break;
+       }
+      sym_pointer->e_type[0] = type;
+    }
+#endif
+
+#if 0
+  if ((cache_ptr->flags & BSF_WEAK) != 0)
+    {
+      int type;
+
+      switch (sym_pointer->e_type[0] & N_TYPE)
+       {
+       default:
+       case N_ABS:     type = N_WEAKA; break;
+       case N_TEXT:    type = N_WEAKT; break;
+       case N_DATA:    type = N_WEAKD; break;
+       case N_BSS:     type = N_WEAKB; break;
+       case N_UNDF:    type = N_WEAKU; break;
+       }
+      sym_pointer->e_type[0] = type;
+    }
+#endif
+
+  PUT_WORD(abfd, value, sym_pointer->e_value);
+
+  return true;
+}
+\f
+/* Native-level interface to symbols. */
+
+asymbol *
+NAME(aout,make_empty_symbol) (abfd)
+     bfd *abfd;
+{
+  aout_symbol_type  *new =
+    (aout_symbol_type *)bfd_zalloc (abfd, sizeof (aout_symbol_type));
+  if (!new)
+    return NULL;
+  new->symbol.the_bfd = abfd;
+
+  return &new->symbol;
+}
+
+/* Translate a set of internal symbols into external symbols.  */
+
+boolean
+NAME(aout,translate_symbol_table) (abfd, in, ext, count, str, strsize, dynamic)
+     bfd *abfd;
+     aout_symbol_type *in;
+     struct external_nlist *ext;
+     bfd_size_type count;
+     char *str;
+     bfd_size_type strsize;
+     boolean dynamic;
+{
+  struct external_nlist *ext_end;
+
+  ext_end = ext + count;
+  for (; ext < ext_end; ext++, in++)
+    {
+      bfd_vma x;
+
+      x = GET_WORD (abfd, ext->e_strx);
+      in->symbol.the_bfd = abfd;
+
+      /* For the normal symbols, the zero index points at the number
+        of bytes in the string table but is to be interpreted as the
+        null string.  For the dynamic symbols, the number of bytes in
+        the string table is stored in the __DYNAMIC structure and the
+        zero index points at an actual string.  */
+      if (x == 0 && ! dynamic)
+       in->symbol.name = "";
+      else if (x < strsize)
+       in->symbol.name = str + x;
+      else
+       return false;
+
+      in->symbol.value = GET_SWORD (abfd,  ext->e_value);
+      /* TODO: is 0 a safe value here? */
+      in->desc = 0;
+      in->other = 0;
+      in->type = bfd_h_get_8 (abfd,  ext->e_type);
+      in->symbol.udata.p = NULL;
+
+      if (! translate_from_native_sym_flags (abfd, in))
+       return false;
+
+      if (dynamic)
+       in->symbol.flags |= BSF_DYNAMIC;
+    }
+
+  return true;
+}
+
+/* We read the symbols into a buffer, which is discarded when this
+   function exits.  We read the strings into a buffer large enough to
+   hold them all plus all the cached symbol entries. */
+
+boolean
+NAME(aout,slurp_symbol_table) (abfd)
+     bfd *abfd;
+{
+  struct external_nlist *old_external_syms;
+  aout_symbol_type *cached;
+  size_t cached_size;
+
+  /* If there's no work to be done, don't do any */
+  if (obj_aout_symbols (abfd) != (aout_symbol_type *) NULL)
+    return true;
+
+  old_external_syms = obj_aout_external_syms (abfd);
+
+  if (! aout_get_external_symbols (abfd))
+    return false;
+
+  cached_size = (obj_aout_external_sym_count (abfd)
+                * sizeof (aout_symbol_type));
+  cached = (aout_symbol_type *) bfd_malloc (cached_size);
+  if (cached == NULL && cached_size != 0)
+    return false;
+  if (cached_size != 0)
+    memset (cached, 0, cached_size);
+
+  /* Convert from external symbol information to internal.  */
+  if (! (NAME(aout,translate_symbol_table)
+        (abfd, cached,
+         obj_aout_external_syms (abfd),
+         obj_aout_external_sym_count (abfd),
+         obj_aout_external_strings (abfd),
+         obj_aout_external_string_size (abfd),
+         false)))
+    {
+      free (cached);
+      return false;
+    }
+
+  bfd_get_symcount (abfd) = obj_aout_external_sym_count (abfd);
+
+  obj_aout_symbols (abfd) = cached;
+
+  /* It is very likely that anybody who calls this function will not
+     want the external symbol information, so if it was allocated
+     because of our call to aout_get_external_symbols, we free it up
+     right away to save space.  */
+  if (old_external_syms == (struct external_nlist *) NULL
+      && obj_aout_external_syms (abfd) != (struct external_nlist *) NULL)
+    {
+#ifdef USE_MMAP
+      bfd_free_window (&obj_aout_sym_window (abfd));
+#else
+      free (obj_aout_external_syms (abfd));
+#endif
+      obj_aout_external_syms (abfd) = NULL;
+    }
+
+  return true;
+}
+\f
+/* We use a hash table when writing out symbols so that we only write
+   out a particular string once.  This helps particularly when the
+   linker writes out stabs debugging entries, because each different
+   contributing object file tends to have many duplicate stabs
+   strings.
+
+   This hash table code breaks dbx on SunOS 4.1.3, so we don't do it
+   if BFD_TRADITIONAL_FORMAT is set.  */
+
+static bfd_size_type add_to_stringtab
+  PARAMS ((bfd *, struct bfd_strtab_hash *, const char *, boolean));
+static boolean emit_stringtab PARAMS ((bfd *, struct bfd_strtab_hash *));
+
+/* Get the index of a string in a strtab, adding it if it is not
+   already present.  */
+
+static INLINE bfd_size_type
+add_to_stringtab (abfd, tab, str, copy)
+     bfd *abfd;
+     struct bfd_strtab_hash *tab;
+     const char *str;
+     boolean copy;
+{
+  boolean hash;
+  bfd_size_type index;
+
+  /* An index of 0 always means the empty string.  */
+  if (str == 0 || *str == '\0')
+    return 0;
+
+  /* Don't hash if BFD_TRADITIONAL_FORMAT is set, because SunOS dbx
+     doesn't understand a hashed string table.  */
+  hash = true;
+  if ((abfd->flags & BFD_TRADITIONAL_FORMAT) != 0)
+    hash = false;
+
+  index = _bfd_stringtab_add (tab, str, hash, copy);
+
+  if (index != (bfd_size_type) -1)
+    {
+      /* Add BYTES_IN_LONG to the return value to account for the
+        space taken up by the string table size.  */
+      index += BYTES_IN_LONG;
+    }
+
+  return index;
+}
+
+/* Write out a strtab.  ABFD is already at the right location in the
+   file.  */
+
+static boolean
+emit_stringtab (abfd, tab)
+     register bfd *abfd;
+     struct bfd_strtab_hash *tab;
+{
+  bfd_byte buffer[BYTES_IN_LONG];
+
+  /* The string table starts with the size.  */
+  bfd_h_put_32 (abfd, _bfd_stringtab_size (tab) + BYTES_IN_LONG, buffer);
+  if (bfd_write ((PTR) buffer, 1, BYTES_IN_LONG, abfd) != BYTES_IN_LONG)
+    return false;
+
+  return _bfd_stringtab_emit (abfd, tab);
+}
+\f
+boolean
+NAME(aout,write_syms) (abfd)
+     bfd *abfd;
+{
+  unsigned int count ;
+  asymbol **generic = bfd_get_outsymbols (abfd);
+  struct bfd_strtab_hash *strtab;
+
+  strtab = _bfd_stringtab_init ();
+  if (strtab == NULL)
+    return false;
+
+  for (count = 0; count < bfd_get_symcount (abfd); count++)
+    {
+      asymbol *g = generic[count];
+      bfd_size_type indx;
+      struct external_nlist nsp;
+
+      PUT_WORD (abfd, 0, (bfd_byte *)nsp.e_unused);
+
+      indx = add_to_stringtab (abfd, strtab, g->name, false);
+      if (indx == (bfd_size_type) -1)
+       goto error_return;
+      PUT_WORD (abfd, indx, (bfd_byte *) nsp.e_strx);
+
+      if (bfd_asymbol_flavour(g) == abfd->xvec->flavour)
+       bfd_h_put_8 (abfd, aout_symbol(g)->type,  nsp.e_type);
+      else
+       bfd_h_put_8 (abfd, 0, nsp.e_type);
+
+      if (! translate_to_native_sym_flags (abfd, g, &nsp))
+       goto error_return;
+
+      bfd_h_put_8 (abfd, 0, nsp.e_ovly);
+
+      if (bfd_write((PTR)&nsp,1,EXTERNAL_NLIST_SIZE, abfd)
+         != EXTERNAL_NLIST_SIZE)
+       goto error_return;
+
+      /* NB: `KEEPIT' currently overlays `udata.p', so set this only
+        here, at the end.  */
+      g->KEEPIT = count;
+    }
+
+  if (! emit_stringtab (abfd, strtab))
+    goto error_return;
+
+  _bfd_stringtab_free (strtab);
+
+  return true;
+
+error_return:
+  _bfd_stringtab_free (strtab);
+  return false;
+}
+
+\f
+long
+NAME(aout,get_symtab) (abfd, location)
+     bfd *abfd;
+     asymbol **location;
+{
+    unsigned int counter = 0;
+    aout_symbol_type *symbase;
+
+    if (!NAME(aout,slurp_symbol_table)(abfd))
+      return -1;
+
+    for (symbase = obj_aout_symbols(abfd); counter++ < bfd_get_symcount (abfd);)
+      *(location++) = (asymbol *)( symbase++);
+    *location++ =0;
+    return bfd_get_symcount (abfd);
+}
+
+\f
+/* Standard reloc stuff */
+
+/* Extended stuff */
+/* Output extended relocation information to a file in target byte order. */
+
+void
+pdp11_aout_swap_reloc_out (abfd, g, natptr)
+     bfd *abfd;
+     arelent *g;
+     register struct pdp11_aout_reloc_external *natptr;
+{
+  int r_index;
+  int r_pcrel;
+  int reloc_entry;
+  int r_type;
+  asymbol *sym = *(g->sym_ptr_ptr);
+  asection *output_section = sym->section->output_section;
+
+  if (g->addend != 0)
+    fprintf (stderr, "BFD: can't do this reloc addend stuff\n");
+
+  r_pcrel = g->howto->pc_relative;
+
+  if (bfd_is_abs_section (output_section))
+    r_type = RABS;
+  else if (output_section == obj_textsec (abfd))
+    r_type = RTEXT;
+  else if (output_section == obj_datasec (abfd))
+    r_type = RDATA;
+  else if (output_section == obj_bsssec (abfd))
+    r_type = RBSS;
+  else if (bfd_is_und_section (output_section))
+    r_type = REXT;
+  else if (bfd_is_com_section (output_section))
+    r_type = REXT;
+  else
+    r_type = -1;
+
+  BFD_ASSERT (r_type != -1);
+
+  if (r_type == RABS)
+    r_index = 0;
+  else
+    r_index = (*(g->sym_ptr_ptr))->KEEPIT;
+
+#if 0
+  if (bfd_is_abs_section (bfd_get_section (sym)))
+    {
+      r_extern = 0;
+      r_index = N_ABS;
+      r_type = RABS;
+    }
+  else if ((sym->flags & BSF_SECTION_SYM) == 0)
+    {
+      if (bfd_is_und_section (bfd_get_section (sym))
+         || (sym->flags & BSF_GLOBAL) != 0)
+       r_extern = 1;
+      else
+       r_extern = 0;
+      r_index = (*(g->sym_ptr_ptr))->KEEPIT;
+    }
+  else
+    {
+      /* Just an ordinary section */
+      r_extern = 0;
+      r_index = output_section->target_index;
+    }
+#endif
+
+  reloc_entry = r_index << 4 | r_type | r_pcrel;
+
+  PUT_WORD (abfd, reloc_entry, natptr->e_reloc_entry);
+}
+
+/* BFD deals internally with all things based from the section they're
+   in. so, something in 10 bytes into a text section  with a base of
+   50 would have a symbol (.text+10) and know .text vma was 50.
+
+   Aout keeps all it's symbols based from zero, so the symbol would
+   contain 60. This macro subs the base of each section from the value
+   to give the true offset from the section */
+
+
+#define MOVE_ADDRESS(ad)                                                       \
+  if (r_extern)                                                        \
+    {                                                                  \
+      /* Undefined symbol.  */                                         \
+      cache_ptr->sym_ptr_ptr = symbols + r_index;                      \
+      cache_ptr->addend = ad;                                          \
+    }                                                                  \
+  else                                                                 \
+    {                                                                  \
+      /* Defined, section relative. replace symbol with pointer to     \
+        symbol which points to section.  */                            \
+      switch (r_index)                                                 \
+       {                                                               \
+       case N_TEXT:                                                    \
+       case N_TEXT | N_EXT:                                            \
+         cache_ptr->sym_ptr_ptr  = obj_textsec (abfd)->symbol_ptr_ptr; \
+         cache_ptr->addend = ad  - su->textsec->vma;                   \
+         break;                                                        \
+       case N_DATA:                                                    \
+       case N_DATA | N_EXT:                                            \
+         cache_ptr->sym_ptr_ptr  = obj_datasec (abfd)->symbol_ptr_ptr; \
+         cache_ptr->addend = ad - su->datasec->vma;                    \
+         break;                                                        \
+       case N_BSS:                                                     \
+       case N_BSS | N_EXT:                                             \
+         cache_ptr->sym_ptr_ptr  = obj_bsssec (abfd)->symbol_ptr_ptr;  \
+         cache_ptr->addend = ad - su->bsssec->vma;                     \
+         break;                                                        \
+       default:                                                        \
+       case N_ABS:                                                     \
+       case N_ABS | N_EXT:                                             \
+         cache_ptr->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr; \
+         cache_ptr->addend = ad;                                       \
+         break;                                                        \
+       }                                                               \
+    }                                                                  
+
+void
+pdp11_aout_swap_reloc_in (abfd, bytes, cache_ptr, offset,
+                         symbols, symcount)
+     bfd *abfd;
+     struct pdp11_aout_reloc_external *bytes;
+     arelent *cache_ptr;
+     bfd_size_type offset;
+     asymbol **symbols;
+     bfd_size_type symcount;
+{
+  struct aoutdata *su = &(abfd->tdata.aout_data->a);
+  unsigned int r_index;
+  int reloc_entry;
+  int r_extern;
+  int r_pcrel;
+
+  reloc_entry = GET_WORD (abfd, (PTR)bytes);
+
+  r_pcrel = reloc_entry & RELFLG;
+
+  cache_ptr->address = offset;
+  cache_ptr->howto = howto_table_pdp11 + (r_pcrel ? 1 : 0);
+
+  if ((reloc_entry & RTYPE) == RABS)
+    r_index = N_ABS;
+  else
+    r_index = RINDEX (reloc_entry);
+
+  /* r_extern reflects whether the symbol the reloc is against is
+     local or global.  */
+  r_extern = (reloc_entry & RTYPE) == REXT;
+
+  if (r_extern && r_index > symcount)
+    {
+      /* We could arrange to return an error, but it might be useful
+         to see the file even if it is bad.  */
+      r_extern = 0;
+      r_index = N_ABS;
+    }
+
+  MOVE_ADDRESS(0);
+}
+
+/* Read and swap the relocs for a section.  */
+
+boolean
+NAME(aout,slurp_reloc_table) (abfd, asect, symbols)
+     bfd *abfd;
+     sec_ptr asect;
+     asymbol **symbols;
+{
+  struct pdp11_aout_reloc_external *rptr;
+  unsigned int count;
+  bfd_size_type reloc_size;
+  PTR relocs;
+  arelent *reloc_cache;
+  size_t each_size;
+  unsigned int counter = 0;
+  arelent *cache_ptr;
+
+  if (asect->relocation)
+    return true;
+
+  if (asect->flags & SEC_CONSTRUCTOR)
+    return true;
+
+  if (asect == obj_datasec (abfd))
+    reloc_size = exec_hdr(abfd)->a_drsize;
+  else if (asect == obj_textsec (abfd))
+    reloc_size = exec_hdr(abfd)->a_trsize;
+  else if (asect == obj_bsssec (abfd))
+    reloc_size = 0;
+  else
+    {
+      bfd_set_error (bfd_error_invalid_operation);
+      return false;
+    }
+
+  if (bfd_seek (abfd, asect->rel_filepos, SEEK_SET) != 0)
+    return false;
+
+  each_size = obj_reloc_entry_size (abfd);
+
+  relocs = bfd_malloc ((size_t) reloc_size);
+  if (relocs == NULL && reloc_size != 0)
+    return false;
+
+  if (bfd_read (relocs, 1, reloc_size, abfd) != reloc_size)
+    {
+      free (relocs);
+      return false;
+    }
+
+  count = reloc_size / each_size;
+
+  /* Count the number of NON-ZERO relocs, this is the count we want. */
+  {
+    unsigned int real_count = 0;
+
+    for (counter = 0; counter < count; counter++)
+      {
+       int x;
+
+       x = GET_WORD (abfd, relocs + each_size * counter);
+       if (x != 0)
+         real_count++;
+      }
+
+    count = real_count;
+  }
+
+  reloc_cache = (arelent *) bfd_malloc ((size_t) (count * sizeof (arelent)));
+  if (reloc_cache == NULL && count != 0)
+    return false;
+  memset (reloc_cache, 0, count * sizeof (arelent));
+
+  cache_ptr = reloc_cache;
+
+  rptr = (struct pdp11_aout_reloc_external *) relocs;
+  for (counter = 0;
+       counter < count;
+       counter++, ((char *)rptr) += RELOC_SIZE, cache_ptr++)
+    {
+      while (GET_WORD (abfd, (PTR)rptr) == 0)
+       {
+         rptr =
+           (struct pdp11_aout_reloc_external *)
+           ((char *)rptr + RELOC_SIZE);
+         if ((char *)rptr >= (char *)relocs + reloc_size)
+           goto done;
+       }
+
+      pdp11_aout_swap_reloc_in (abfd, rptr, cache_ptr,
+                               (char *)rptr - (char *)relocs,
+                                   symbols, bfd_get_symcount (abfd));
+    }
+ done:
+  /* Just in case, if rptr >= relocs + reloc_size should happen
+     too early. */
+  BFD_ASSERT (counter == count);
+
+  free (relocs);
+
+  asect->relocation = reloc_cache;
+  asect->reloc_count = cache_ptr - reloc_cache;
+
+  return true;
+}
+
+/* Write out a relocation section into an object file.  */
+
+boolean
+NAME(aout,squirt_out_relocs) (abfd, section)
+     bfd *abfd;
+     asection *section;
+{
+  arelent **generic;
+  unsigned char *native;
+  unsigned int count = section->reloc_count;
+  size_t natsize;
+
+#if 0
+  /* If we're writing an .o file, we must write
+     relocation information, even if there is none. */
+  if ((count == 0 || section->orelocation == NULL) &&
+      <writing_executable>)
+    return true;
+#endif
+
+  natsize = bfd_get_section_size_before_reloc (section);
+  native = (unsigned char *) bfd_zalloc (abfd, natsize);
+  if (!native)
+    return false;
+
+  memset ((PTR)native, 0, natsize);
+
+  generic = section->orelocation;
+  if (generic != NULL)
+    {
+      while (count > 0)
+       {
+         struct pdp11_aout_reloc_external *r;
+
+         r = (struct pdp11_aout_reloc_external *)
+           (native + (*generic)->address);
+         pdp11_aout_swap_reloc_out (abfd, *generic, r);
+         count--;
+         generic++;
+       }
+    }
+
+  if (bfd_write ((PTR) native, 1, natsize, abfd) != natsize)
+    {
+      bfd_release(abfd, native);
+      return false;
+    }
+
+  bfd_release (abfd, native);
+
+  return true;
+}
+
+/* This is stupid.  This function should be a boolean predicate */
+long
+NAME(aout,canonicalize_reloc) (abfd, section, relptr, symbols)
+     bfd *abfd;
+     sec_ptr section;
+     arelent **relptr;
+     asymbol **symbols;
+{
+  arelent *tblptr = section->relocation;
+  unsigned int count;
+
+  if (section == obj_bsssec (abfd))
+    {
+      *relptr = NULL;
+      return 0;
+    }
+
+  if (!(tblptr || NAME(aout,slurp_reloc_table)(abfd, section, symbols)))
+    return -1;
+
+  if (section->flags & SEC_CONSTRUCTOR)
+    {
+      arelent_chain *chain = section->constructor_chain;
+
+      for (count = 0; count < section->reloc_count; count ++)
+       {
+         *relptr ++ = &chain->relent;
+         chain = chain->next;
+       }
+    }
+  else
+    {
+      tblptr = section->relocation;
+
+      for (count = 0; count++ < section->reloc_count;)
+       *relptr++ = tblptr++;
+    }
+
+  *relptr = 0;
+
+  return section->reloc_count;
+}
+
+long
+NAME(aout,get_reloc_upper_bound) (abfd, asect)
+     bfd *abfd;
+     sec_ptr asect;
+{
+  if (bfd_get_format (abfd) != bfd_object)
+    {
+      bfd_set_error (bfd_error_invalid_operation);
+      return -1;
+    }
+
+  if (asect->flags & SEC_CONSTRUCTOR) 
+    return (sizeof (arelent *) * (asect->reloc_count+1));
+
+  if (asect == obj_datasec (abfd))
+    return (sizeof (arelent *)
+           * ((exec_hdr(abfd)->a_drsize / obj_reloc_entry_size (abfd))
+              + 1));
+
+  if (asect == obj_textsec (abfd))
+    return (sizeof (arelent *)
+           * ((exec_hdr(abfd)->a_trsize / obj_reloc_entry_size (abfd))
+              + 1));
+
+  /* TODO: why are there two if statements for obj_bsssec()? */
+
+  if (asect == obj_bsssec (abfd))
+    return sizeof (arelent *);
+
+  if (asect == obj_bsssec (abfd))
+    return 0;
+
+  bfd_set_error (bfd_error_invalid_operation);
+  return -1;
+}
+
+\f
+long
+NAME(aout,get_symtab_upper_bound) (abfd)
+     bfd *abfd;
+{
+  if (!NAME(aout,slurp_symbol_table)(abfd))
+    return -1;
+
+  return (bfd_get_symcount (abfd) + 1) * (sizeof (aout_symbol_type *));
+}
+
+alent *
+NAME(aout,get_lineno) (abfd, symbol)
+     bfd * abfd ATTRIBUTE_UNUSED;
+     asymbol * symbol ATTRIBUTE_UNUSED;
+{
+  return (alent *)NULL;
+}
+
+void
+NAME(aout,get_symbol_info) (abfd, symbol, ret)
+     bfd * abfd ATTRIBUTE_UNUSED;
+     asymbol *symbol;
+     symbol_info *ret;
+{
+  bfd_symbol_info (symbol, ret);
+
+  if (ret->type == '?')
+    {
+      int type_code = aout_symbol(symbol)->type & 0xff;
+      const char *stab_name = bfd_get_stab_name (type_code);
+      static char buf[10];
+
+      if (stab_name == NULL)
+       {
+         sprintf(buf, "(%d)", type_code);
+         stab_name = buf;
+       }
+      ret->type = '-';
+      ret->stab_type = type_code;
+      ret->stab_other = (unsigned)(aout_symbol(symbol)->other & 0xff);
+      ret->stab_desc = (unsigned)(aout_symbol(symbol)->desc & 0xffff);
+      ret->stab_name = stab_name;
+    }
+}
+
+/*ARGSUSED*/
+void
+NAME(aout,print_symbol) (abfd, afile, symbol, how)
+     bfd * abfd ATTRIBUTE_UNUSED;
+     PTR afile;
+     asymbol *symbol;
+     bfd_print_symbol_type how;
+{
+  FILE *file = (FILE *)afile;
+
+  switch (how)
+    {
+    case bfd_print_symbol_name:
+      if (symbol->name)
+       fprintf(file,"%s", symbol->name);
+      break;
+    case bfd_print_symbol_more:
+      fprintf(file,"%4x %2x %2x",(unsigned)(aout_symbol(symbol)->desc & 0xffff),
+             (unsigned)(aout_symbol(symbol)->other & 0xff),
+             (unsigned)(aout_symbol(symbol)->type));
+      break;
+    case bfd_print_symbol_all:
+      {
+       CONST char *section_name = symbol->section->name;
+
+       bfd_print_symbol_vandf ((PTR)file,symbol);
+
+       fprintf (file," %-5s %04x %02x %02x",
+                section_name,
+                (unsigned)(aout_symbol(symbol)->desc & 0xffff),
+                (unsigned)(aout_symbol(symbol)->other & 0xff),
+                (unsigned)(aout_symbol(symbol)->type  & 0xff));
+       if (symbol->name)
+         fprintf(file," %s", symbol->name);
+      }
+      break;
+    }
+}
+
+/* If we don't have to allocate more than 1MB to hold the generic
+   symbols, we use the generic minisymbol method: it's faster, since
+   it only translates the symbols once, not multiple times.  */
+#define MINISYM_THRESHOLD (1000000 / sizeof (asymbol))
+
+/* Read minisymbols.  For minisymbols, we use the unmodified a.out
+   symbols.  The minisymbol_to_symbol function translates these into
+   BFD asymbol structures.  */
+
+long
+NAME(aout,read_minisymbols) (abfd, dynamic, minisymsp, sizep)
+     bfd *abfd;
+     boolean dynamic;
+     PTR *minisymsp;
+     unsigned int *sizep;
+{
+  if (dynamic)
+    {
+      /* We could handle the dynamic symbols here as well, but it's
+         easier to hand them off.  */
+      return _bfd_generic_read_minisymbols (abfd, dynamic, minisymsp, sizep);
+    }
+
+  if (! aout_get_external_symbols (abfd))
+    return -1;
+
+  if (obj_aout_external_sym_count (abfd) < MINISYM_THRESHOLD)
+    return _bfd_generic_read_minisymbols (abfd, dynamic, minisymsp, sizep);
+
+  *minisymsp = (PTR) obj_aout_external_syms (abfd);
+
+  /* By passing the external symbols back from this routine, we are
+     giving up control over the memory block.  Clear
+     obj_aout_external_syms, so that we do not try to free it
+     ourselves.  */
+  obj_aout_external_syms (abfd) = NULL;
+
+  *sizep = EXTERNAL_NLIST_SIZE;
+  return obj_aout_external_sym_count (abfd);
+}
+
+/* Convert a minisymbol to a BFD asymbol.  A minisymbol is just an
+   unmodified a.out symbol.  The SYM argument is a structure returned
+   by bfd_make_empty_symbol, which we fill in here.  */
+
+asymbol *
+NAME(aout,minisymbol_to_symbol) (abfd, dynamic, minisym, sym)
+     bfd *abfd;
+     boolean dynamic;
+     const PTR minisym;
+     asymbol *sym;
+{
+  if (dynamic
+      || obj_aout_external_sym_count (abfd) < MINISYM_THRESHOLD)
+    return _bfd_generic_minisymbol_to_symbol (abfd, dynamic, minisym, sym);
+
+  memset (sym, 0, sizeof (aout_symbol_type));
+
+  /* We call translate_symbol_table to translate a single symbol.  */
+  if (! (NAME(aout,translate_symbol_table)
+        (abfd,
+         (aout_symbol_type *) sym,
+         (struct external_nlist *) minisym,
+         (bfd_size_type) 1,
+         obj_aout_external_strings (abfd),
+         obj_aout_external_string_size (abfd),
+         false)))
+    return NULL;
+
+  return sym;
+}
+
+/*
+ provided a BFD, a section and an offset into the section, calculate
+ and return the name of the source file and the line nearest to the
+ wanted location.
+*/
+
+boolean
+NAME(aout,find_nearest_line)
+     (abfd, section, symbols, offset, filename_ptr, functionname_ptr, line_ptr)
+     bfd *abfd;
+     asection *section;
+     asymbol **symbols;
+     bfd_vma offset;
+     CONST char **filename_ptr;
+     CONST char **functionname_ptr;
+     unsigned int *line_ptr;
+{
+  /* Run down the file looking for the filename, function and linenumber */
+  asymbol **p;
+  CONST char *directory_name = NULL;
+  CONST char *main_file_name = NULL;
+  CONST char *current_file_name = NULL;
+  CONST char *line_file_name = NULL; /* Value of current_file_name at line number. */
+  bfd_vma low_line_vma = 0;
+  bfd_vma low_func_vma = 0;
+  asymbol *func = 0;
+  size_t filelen, funclen;
+  char *buf;
+
+  *filename_ptr = abfd->filename;
+  *functionname_ptr = 0;
+  *line_ptr = 0;
+
+  if (symbols != (asymbol **)NULL)
+    {
+      for (p = symbols; *p; p++)
+       {
+         aout_symbol_type  *q = (aout_symbol_type *)(*p);
+       next:
+         switch (q->type)
+           {
+           case N_TEXT:
+             /* If this looks like a file name symbol, and it comes after
+                the line number we have found so far, but before the
+                offset, then we have probably not found the right line
+                number.  */
+             if (q->symbol.value <= offset
+                 && ((q->symbol.value > low_line_vma
+                      && (line_file_name != NULL
+                          || *line_ptr != 0))
+                     || (q->symbol.value > low_func_vma
+                         && func != NULL)))
+               {
+                 const char * symname;
+
+                 symname = q->symbol.name;
+                 if (strcmp (symname + strlen (symname) - 2, ".o") == 0)
+                   {
+                     if (q->symbol.value > low_line_vma)
+                       {
+                         *line_ptr = 0;
+                         line_file_name = NULL;
+                       }
+                     if (q->symbol.value > low_func_vma)
+                       func = NULL;
+                   }
+               }
+             break;
+
+           case N_SO:
+             /* If this symbol is less than the offset, but greater than
+                the line number we have found so far, then we have not
+                found the right line number.  */
+             if (q->symbol.value <= offset)
+               {
+                 if (q->symbol.value > low_line_vma)
+                   {
+                     *line_ptr = 0;
+                     line_file_name = NULL;
+                   }
+                 if (q->symbol.value > low_func_vma)
+                   func = NULL;
+               }
+
+             main_file_name = current_file_name = q->symbol.name;
+             /* Look ahead to next symbol to check if that too is an N_SO. */
+             p++;
+             if (*p == NULL)
+               break;
+             q = (aout_symbol_type *)(*p);
+             if (q->type != (int)N_SO)
+               goto next;
+
+             /* Found a second N_SO  First is directory; second is filename. */
+             directory_name = current_file_name;
+             main_file_name = current_file_name = q->symbol.name;
+             if (obj_textsec(abfd) != section)
+               goto done;
+             break;
+           case N_SOL:
+             current_file_name = q->symbol.name;
+             break;
+
+           case N_SLINE:
+           case N_DSLINE:
+           case N_BSLINE:
+             /* We'll keep this if it resolves nearer than the one we have
+                already.  */
+             if (q->symbol.value >= low_line_vma
+                 && q->symbol.value <= offset)
+               {
+                 *line_ptr = q->desc;
+                 low_line_vma = q->symbol.value;
+                 line_file_name = current_file_name;
+               }
+             break;
+
+           case N_FUN:
+             {
+               /* We'll keep this if it is nearer than the one we have already */
+               if (q->symbol.value >= low_func_vma &&
+                   q->symbol.value <= offset)
+                 {
+                   low_func_vma = q->symbol.value;
+                   func = (asymbol *)q;
+                 }
+               else if (q->symbol.value > offset)
+                 goto done;
+             }
+             break;
+           }
+       }
+    }
+
+ done:
+  if (*line_ptr != 0)
+    main_file_name = line_file_name;
+
+  if (main_file_name == NULL
+      || main_file_name[0] == '/'
+      || directory_name == NULL)
+    filelen = 0;
+  else
+    filelen = strlen (directory_name) + strlen (main_file_name);
+  if (func == NULL)
+    funclen = 0;
+  else
+    funclen = strlen (bfd_asymbol_name (func));
+
+  if (adata (abfd).line_buf != NULL)
+    free (adata (abfd).line_buf);
+  if (filelen + funclen == 0)
+    adata (abfd).line_buf = buf = NULL;
+  else
+    {
+      buf = (char *) bfd_malloc (filelen + funclen + 3);
+      adata (abfd).line_buf = buf;
+      if (buf == NULL)
+       return false;
+    }
+
+  if (main_file_name != NULL)
+    {
+      if (main_file_name[0] == '/' || directory_name == NULL)
+       *filename_ptr = main_file_name;
+      else
+       {
+         sprintf (buf, "%s%s", directory_name, main_file_name);
+         *filename_ptr = buf;
+         buf += filelen + 1;
+       }
+    }
+
+  if (func)
+    {
+      const char *function = func->name;
+      char *p;
+
+      /* The caller expects a symbol name.  We actually have a
+        function name, without the leading underscore.  Put the
+        underscore back in, so that the caller gets a symbol name.  */
+      if (bfd_get_symbol_leading_char (abfd) == '\0')
+       strcpy (buf, function);
+      else
+       {
+         buf[0] = bfd_get_symbol_leading_char (abfd);
+         strcpy (buf + 1, function);
+       }
+
+      /* Have to remove : stuff.  */
+      p = strchr (buf, ':');
+      if (p != NULL)
+       *p = '\0';
+      *functionname_ptr = buf;
+    }
+
+  return true;
+}
+
+int
+NAME(aout,sizeof_headers) (abfd, execable)
+     bfd *abfd;
+     boolean execable ATTRIBUTE_UNUSED;
+{
+  return adata(abfd).exec_bytes_size;
+}
+
+/* Free all information we have cached for this BFD.  We can always
+   read it again later if we need it.  */
+
+boolean
+NAME(aout,bfd_free_cached_info) (abfd)
+     bfd *abfd;
+{
+  asection *o;
+
+  if (bfd_get_format (abfd) != bfd_object)
+    return true;
+
+#define BFCI_FREE(x) if (x != NULL) { free (x); x = NULL; }
+  BFCI_FREE (obj_aout_symbols (abfd));
+#ifdef USE_MMAP
+  obj_aout_external_syms (abfd) = 0;
+  bfd_free_window (&obj_aout_sym_window (abfd));
+  bfd_free_window (&obj_aout_string_window (abfd));
+  obj_aout_external_strings (abfd) = 0;
+#else
+  BFCI_FREE (obj_aout_external_syms (abfd));
+  BFCI_FREE (obj_aout_external_strings (abfd));
+#endif
+  for (o = abfd->sections; o != (asection *) NULL; o = o->next)
+    BFCI_FREE (o->relocation);
+#undef BFCI_FREE
+
+  return true;
+}
+\f
+/* a.out link code.  */
+
+static boolean aout_link_add_object_symbols
+  PARAMS ((bfd *, struct bfd_link_info *));
+static boolean aout_link_check_archive_element
+  PARAMS ((bfd *, struct bfd_link_info *, boolean *));
+static boolean aout_link_free_symbols PARAMS ((bfd *));
+static boolean aout_link_check_ar_symbols
+  PARAMS ((bfd *, struct bfd_link_info *, boolean *pneeded));
+static boolean aout_link_add_symbols
+  PARAMS ((bfd *, struct bfd_link_info *));
+
+/* Routine to create an entry in an a.out link hash table.  */
+
+struct bfd_hash_entry *
+NAME(aout,link_hash_newfunc) (entry, table, string)
+     struct bfd_hash_entry *entry;
+     struct bfd_hash_table *table;
+     const char *string;
+{
+  struct aout_link_hash_entry *ret = (struct aout_link_hash_entry *) entry;
+
+  /* Allocate the structure if it has not already been allocated by a
+     subclass.  */
+  if (ret == (struct aout_link_hash_entry *) NULL)
+    ret = ((struct aout_link_hash_entry *)
+          bfd_hash_allocate (table, sizeof (struct aout_link_hash_entry)));
+  if (ret == (struct aout_link_hash_entry *) NULL)
+    return (struct bfd_hash_entry *) ret;
+
+  /* Call the allocation method of the superclass.  */
+  ret = ((struct aout_link_hash_entry *)
+        _bfd_link_hash_newfunc ((struct bfd_hash_entry *) ret,
+                                table, string));
+  if (ret)
+    {
+      /* Set local fields.  */
+      ret->written = false;
+      ret->indx = -1;
+    }
+
+  return (struct bfd_hash_entry *) ret;
+}
+
+/* Initialize an a.out link hash table.  */
+
+boolean
+NAME(aout,link_hash_table_init) (table, abfd, newfunc)
+     struct aout_link_hash_table *table;
+     bfd *abfd;
+     struct bfd_hash_entry *(*newfunc) PARAMS ((struct bfd_hash_entry *,
+                                               struct bfd_hash_table *,
+                                               const char *));
+{
+  return _bfd_link_hash_table_init (&table->root, abfd, newfunc);
+}
+
+/* Create an a.out link hash table.  */
+
+struct bfd_link_hash_table *
+NAME(aout,link_hash_table_create) (abfd)
+     bfd *abfd;
+{
+  struct aout_link_hash_table *ret;
+
+  ret = ((struct aout_link_hash_table *)
+        bfd_alloc (abfd, sizeof (struct aout_link_hash_table)));
+  if (ret == NULL)
+    return (struct bfd_link_hash_table *) NULL;
+  if (! NAME(aout,link_hash_table_init) (ret, abfd,
+                                        NAME(aout,link_hash_newfunc)))
+    {
+      free (ret);
+      return (struct bfd_link_hash_table *) NULL;
+    }
+  return &ret->root;
+}
+
+/* Given an a.out BFD, add symbols to the global hash table as
+   appropriate.  */
+
+boolean
+NAME(aout,link_add_symbols) (abfd, info)
+     bfd *abfd;
+     struct bfd_link_info *info;
+{
+  switch (bfd_get_format (abfd))
+    {
+    case bfd_object:
+      return aout_link_add_object_symbols (abfd, info);
+    case bfd_archive:
+      return _bfd_generic_link_add_archive_symbols
+       (abfd, info, aout_link_check_archive_element);
+    default:
+      bfd_set_error (bfd_error_wrong_format);
+      return false;
+    }
+}
+
+/* Add symbols from an a.out object file.  */
+
+static boolean
+aout_link_add_object_symbols (abfd, info)
+     bfd *abfd;
+     struct bfd_link_info *info;
+{
+  if (! aout_get_external_symbols (abfd))
+    return false;
+  if (! aout_link_add_symbols (abfd, info))
+    return false;
+  if (! info->keep_memory)
+    {
+      if (! aout_link_free_symbols (abfd))
+       return false;
+    }
+  return true;
+}
+
+/* Check a single archive element to see if we need to include it in
+   the link.  *PNEEDED is set according to whether this element is
+   needed in the link or not.  This is called from
+   _bfd_generic_link_add_archive_symbols.  */
+
+static boolean
+aout_link_check_archive_element (abfd, info, pneeded)
+     bfd *abfd;
+     struct bfd_link_info *info;
+     boolean *pneeded;
+{
+  if (! aout_get_external_symbols (abfd))
+    return false;
+
+  if (! aout_link_check_ar_symbols (abfd, info, pneeded))
+    return false;
+
+  if (*pneeded)
+    {
+      if (! aout_link_add_symbols (abfd, info))
+       return false;
+    }
+
+  if (! info->keep_memory || ! *pneeded)
+    {
+      if (! aout_link_free_symbols (abfd))
+       return false;
+    }
+
+  return true;
+}
+
+/* Free up the internal symbols read from an a.out file.  */
+
+static boolean
+aout_link_free_symbols (abfd)
+     bfd *abfd;
+{
+  if (obj_aout_external_syms (abfd) != (struct external_nlist *) NULL)
+    {
+#ifdef USE_MMAP
+      bfd_free_window (&obj_aout_sym_window (abfd));
+#else
+      free ((PTR) obj_aout_external_syms (abfd));
+#endif
+      obj_aout_external_syms (abfd) = (struct external_nlist *) NULL;
+    }
+  if (obj_aout_external_strings (abfd) != (char *) NULL)
+    {
+#ifdef USE_MMAP
+      bfd_free_window (&obj_aout_string_window (abfd));
+#else
+      free ((PTR) obj_aout_external_strings (abfd));
+#endif
+      obj_aout_external_strings (abfd) = (char *) NULL;
+    }
+  return true;
+}
+
+/* Look through the internal symbols to see if this object file should
+   be included in the link.  We should include this object file if it
+   defines any symbols which are currently undefined.  If this object
+   file defines a common symbol, then we may adjust the size of the
+   known symbol but we do not include the object file in the link
+   (unless there is some other reason to include it).  */
+
+static boolean
+aout_link_check_ar_symbols (abfd, info, pneeded)
+     bfd *abfd;
+     struct bfd_link_info *info;
+     boolean *pneeded;
+{
+  register struct external_nlist *p;
+  struct external_nlist *pend;
+  char *strings;
+
+  *pneeded = false;
+
+  /* Look through all the symbols.  */
+  p = obj_aout_external_syms (abfd);
+  pend = p + obj_aout_external_sym_count (abfd);
+  strings = obj_aout_external_strings (abfd);
+  for (; p < pend; p++)
+    {
+      int type = bfd_h_get_8 (abfd, p->e_type);
+      const char *name;
+      struct bfd_link_hash_entry *h;
+
+      /* Ignore symbols that are not externally visible.  This is an
+        optimization only, as we check the type more thoroughly
+        below.  */
+      if ((type & N_EXT) == 0
+         || type == N_FN)
+       continue;
+
+      name = strings + GET_WORD (abfd, p->e_strx);
+      h = bfd_link_hash_lookup (info->hash, name, false, false, true);
+
+      /* We are only interested in symbols that are currently
+        undefined or common.  */
+      if (h == (struct bfd_link_hash_entry *) NULL
+         || (h->type != bfd_link_hash_undefined
+             && h->type != bfd_link_hash_common))
+       continue;
+
+      if (type == (N_TEXT | N_EXT)
+         || type == (N_DATA | N_EXT)
+         || type == (N_BSS | N_EXT)
+         || type == (N_ABS | N_EXT))
+       {
+         /* This object file defines this symbol.  We must link it
+            in.  This is true regardless of whether the current
+            definition of the symbol is undefined or common.  If the
+            current definition is common, we have a case in which we
+            have already seen an object file including
+                int a;
+            and this object file from the archive includes
+                int a = 5;
+            In such a case we must include this object file.
+
+            FIXME: The SunOS 4.1.3 linker will pull in the archive
+            element if the symbol is defined in the .data section,
+            but not if it is defined in the .text section.  That
+            seems a bit crazy to me, and I haven't implemented it.
+            However, it might be correct.  */
+         if (! (*info->callbacks->add_archive_element) (info, abfd, name))
+           return false;
+         *pneeded = true;
+         return true;
+       }
+
+      if (type == (N_UNDF | N_EXT))
+       {
+         bfd_vma value;
+
+         value = GET_WORD (abfd, p->e_value);
+         if (value != 0)
+           {
+             /* This symbol is common in the object from the archive
+                file.  */
+             if (h->type == bfd_link_hash_undefined)
+               {
+                 bfd *symbfd;
+                 unsigned int power;
+
+                 symbfd = h->u.undef.abfd;
+                 if (symbfd == (bfd *) NULL)
+                   {
+                     /* This symbol was created as undefined from
+                        outside BFD.  We assume that we should link
+                        in the object file.  This is done for the -u
+                        option in the linker.  */
+                     if (! (*info->callbacks->add_archive_element) (info,
+                                                                    abfd,
+                                                                    name))
+                       return false;
+                     *pneeded = true;
+                     return true;
+                   }
+                 /* Turn the current link symbol into a common
+                    symbol.  It is already on the undefs list.  */
+                 h->type = bfd_link_hash_common;
+                 h->u.c.p = ((struct bfd_link_hash_common_entry *)
+                             bfd_hash_allocate (&info->hash->table,
+                                 sizeof (struct bfd_link_hash_common_entry)));
+                 if (h->u.c.p == NULL)
+                   return false;
+
+                 h->u.c.size = value;
+
+                 /* FIXME: This isn't quite right.  The maximum
+                    alignment of a common symbol should be set by the
+                    architecture of the output file, not of the input
+                    file.  */
+                 power = bfd_log2 (value);
+                 if (power > bfd_get_arch_info (abfd)->section_align_power)
+                   power = bfd_get_arch_info (abfd)->section_align_power;
+                 h->u.c.p->alignment_power = power;
+
+                 h->u.c.p->section = bfd_make_section_old_way (symbfd,
+                                                               "COMMON");
+               }
+             else
+               {
+                 /* Adjust the size of the common symbol if
+                    necessary.  */
+                 if (value > h->u.c.size)
+                   h->u.c.size = value;
+               }
+           }
+       }
+    }
+
+  /* We do not need this object file.  */
+  return true;
+}
+
+/* Add all symbols from an object file to the hash table.  */
+
+static boolean
+aout_link_add_symbols (abfd, info)
+     bfd *abfd;
+     struct bfd_link_info *info;
+{
+  boolean (*add_one_symbol) PARAMS ((struct bfd_link_info *, bfd *,
+                                    const char *, flagword, asection *,
+                                    bfd_vma, const char *, boolean,
+                                    boolean,
+                                    struct bfd_link_hash_entry **));
+  struct external_nlist *syms;
+  bfd_size_type sym_count;
+  char *strings;
+  boolean copy;
+  struct aout_link_hash_entry **sym_hash;
+  register struct external_nlist *p;
+  struct external_nlist *pend;
+
+  syms = obj_aout_external_syms (abfd);
+  sym_count = obj_aout_external_sym_count (abfd);
+  strings = obj_aout_external_strings (abfd);
+  if (info->keep_memory)
+    copy = false;
+  else
+    copy = true;
+
+  if (aout_backend_info (abfd)->add_dynamic_symbols != NULL)
+    {
+      if (! ((*aout_backend_info (abfd)->add_dynamic_symbols)
+            (abfd, info, &syms, &sym_count, &strings)))
+       return false;
+    }
+
+  /* We keep a list of the linker hash table entries that correspond
+     to particular symbols.  We could just look them up in the hash
+     table, but keeping the list is more efficient.  Perhaps this
+     should be conditional on info->keep_memory.  */
+  sym_hash = ((struct aout_link_hash_entry **)
+             bfd_alloc (abfd,
+                        ((size_t) sym_count
+                         * sizeof (struct aout_link_hash_entry *))));
+  if (sym_hash == NULL && sym_count != 0)
+    return false;
+  obj_aout_sym_hashes (abfd) = sym_hash;
+
+  add_one_symbol = aout_backend_info (abfd)->add_one_symbol;
+  if (add_one_symbol == NULL)
+    add_one_symbol = _bfd_generic_link_add_one_symbol;
+
+  p = syms;
+  pend = p + sym_count;
+  for (; p < pend; p++, sym_hash++)
+    {
+      int type;
+      const char *name;
+      bfd_vma value;
+      asection *section;
+      flagword flags;
+      const char *string;
+
+      *sym_hash = NULL;
+
+      type = bfd_h_get_8 (abfd, p->e_type);
+
+#if 0 /* not supported in PDP-11 a.out */
+      /* Ignore debugging symbols.  */
+      if ((type & N_STAB) != 0)
+       continue;
+#endif
+
+      name = strings + GET_WORD (abfd, p->e_strx);
+      value = GET_WORD (abfd, p->e_value);
+      flags = BSF_GLOBAL;
+      string = NULL;
+      switch (type)
+       {
+       default:
+         abort ();
+
+       case N_UNDF:
+       case N_ABS:
+       case N_TEXT:
+       case N_DATA:
+       case N_BSS:
+       case N_REG:
+       case N_FN:
+         /* Ignore symbols that are not externally visible.  */
+         continue;
+
+       case N_UNDF | N_EXT:
+         if (value == 0)
+           {
+             section = bfd_und_section_ptr;
+             flags = 0;
+           }
+         else
+           section = bfd_com_section_ptr;
+         break;
+       case N_ABS | N_EXT:
+         section = bfd_abs_section_ptr;
+         break;
+       case N_TEXT | N_EXT:
+         section = obj_textsec (abfd);
+         value -= bfd_get_section_vma (abfd, section);
+         break;
+       case N_DATA | N_EXT:
+         /* Treat N_SETV symbols as N_DATA symbol; see comment in
+            translate_from_native_sym_flags.  */
+         section = obj_datasec (abfd);
+         value -= bfd_get_section_vma (abfd, section);
+         break;
+       case N_BSS | N_EXT:
+         section = obj_bsssec (abfd);
+         value -= bfd_get_section_vma (abfd, section);
+         break;
+       }
+
+      if (! ((*add_one_symbol)
+            (info, abfd, name, flags, section, value, string, copy, false,
+             (struct bfd_link_hash_entry **) sym_hash)))
+       return false;
+
+      /* Restrict the maximum alignment of a common symbol based on
+        the architecture, since a.out has no way to represent
+        alignment requirements of a section in a .o file.  FIXME:
+        This isn't quite right: it should use the architecture of the
+        output file, not the input files.  */
+      if ((*sym_hash)->root.type == bfd_link_hash_common
+         && ((*sym_hash)->root.u.c.p->alignment_power >
+             bfd_get_arch_info (abfd)->section_align_power))
+       (*sym_hash)->root.u.c.p->alignment_power =
+         bfd_get_arch_info (abfd)->section_align_power;
+
+      /* If this is a set symbol, and we are not building sets, then
+        it is possible for the hash entry to not have been set.  In
+        such a case, treat the symbol as not globally defined.  */
+      if ((*sym_hash)->root.type == bfd_link_hash_new)
+       {
+         BFD_ASSERT ((flags & BSF_CONSTRUCTOR) != 0);
+         *sym_hash = NULL;
+       }
+    }
+
+  return true;
+}
+\f
+/* A hash table used for header files with N_BINCL entries.  */
+
+struct aout_link_includes_table
+{
+  struct bfd_hash_table root;
+};
+
+/* A linked list of totals that we have found for a particular header
+   file.  */
+
+struct aout_link_includes_totals
+{
+  struct aout_link_includes_totals *next;
+  bfd_vma total;
+};
+
+/* An entry in the header file hash table.  */
+
+struct aout_link_includes_entry
+{
+  struct bfd_hash_entry root;
+  /* List of totals we have found for this file.  */
+  struct aout_link_includes_totals *totals;
+};
+
+/* Look up an entry in an the header file hash table.  */
+
+#define aout_link_includes_lookup(table, string, create, copy) \
+  ((struct aout_link_includes_entry *) \
+   bfd_hash_lookup (&(table)->root, (string), (create), (copy)))
+
+/* During the final link step we need to pass around a bunch of
+   information, so we do it in an instance of this structure.  */
+
+struct aout_final_link_info
+{
+  /* General link information.  */
+  struct bfd_link_info *info;
+  /* Output bfd.  */
+  bfd *output_bfd;
+  /* Reloc file positions.  */
+  file_ptr treloff, dreloff;
+  /* File position of symbols.  */
+  file_ptr symoff;
+  /* String table.  */
+  struct bfd_strtab_hash *strtab;
+  /* Header file hash table.  */
+  struct aout_link_includes_table includes;
+  /* A buffer large enough to hold the contents of any section.  */
+  bfd_byte *contents;
+  /* A buffer large enough to hold the relocs of any section.  */
+  PTR relocs;
+  /* A buffer large enough to hold the symbol map of any input BFD.  */
+  int *symbol_map;
+  /* A buffer large enough to hold output symbols of any input BFD.  */
+  struct external_nlist *output_syms;
+};
+
+static struct bfd_hash_entry *aout_link_includes_newfunc
+  PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *));
+static boolean aout_link_input_bfd
+  PARAMS ((struct aout_final_link_info *, bfd *input_bfd));
+static boolean aout_link_write_symbols
+  PARAMS ((struct aout_final_link_info *, bfd *input_bfd));
+static boolean aout_link_write_other_symbol
+  PARAMS ((struct aout_link_hash_entry *, PTR));
+static boolean aout_link_input_section
+  PARAMS ((struct aout_final_link_info *, bfd *input_bfd,
+          asection *input_section, file_ptr *reloff_ptr,
+          bfd_size_type rel_size));
+static INLINE asection *aout_reloc_type_to_section
+  PARAMS ((bfd *, int));
+static boolean aout_link_reloc_link_order
+  PARAMS ((struct aout_final_link_info *, asection *,
+          struct bfd_link_order *));
+static boolean pdp11_aout_link_input_section
+  PARAMS ((struct aout_final_link_info *finfo,
+          bfd *input_bfd,
+          asection *input_section,
+          struct pdp11_aout_reloc_external *relocs,
+          bfd_size_type rel_size,
+          bfd_byte *contents));
+
+/* The function to create a new entry in the header file hash table.  */
+
+static struct bfd_hash_entry *
+aout_link_includes_newfunc (entry, table, string)
+     struct bfd_hash_entry *entry;
+     struct bfd_hash_table *table;
+     const char *string;
+{
+  struct aout_link_includes_entry *ret =
+    (struct aout_link_includes_entry *) entry;
+
+  /* Allocate the structure if it has not already been allocated by a
+     subclass.  */
+  if (ret == (struct aout_link_includes_entry *) NULL)
+    ret = ((struct aout_link_includes_entry *)
+          bfd_hash_allocate (table,
+                             sizeof (struct aout_link_includes_entry)));
+  if (ret == (struct aout_link_includes_entry *) NULL)
+    return (struct bfd_hash_entry *) ret;
+
+  /* Call the allocation method of the superclass.  */
+  ret = ((struct aout_link_includes_entry *)
+        bfd_hash_newfunc ((struct bfd_hash_entry *) ret, table, string));
+  if (ret)
+    {
+      /* Set local fields.  */
+      ret->totals = NULL;
+    }
+
+  return (struct bfd_hash_entry *) ret;
+}
+
+/* Do the final link step.  This is called on the output BFD.  The
+   INFO structure should point to a list of BFDs linked through the
+   link_next field which can be used to find each BFD which takes part
+   in the output.  Also, each section in ABFD should point to a list
+   of bfd_link_order structures which list all the input sections for
+   the output section.  */
+
+boolean
+NAME(aout,final_link) (abfd, info, callback)
+     bfd *abfd;
+     struct bfd_link_info *info;
+     void (*callback) PARAMS ((bfd *, file_ptr *, file_ptr *, file_ptr *));
+{
+  struct aout_final_link_info aout_info;
+  boolean includes_hash_initialized = false;
+  register bfd *sub;
+  bfd_size_type trsize, drsize;
+  size_t max_contents_size;
+  size_t max_relocs_size;
+  size_t max_sym_count;
+  bfd_size_type text_size;
+  file_ptr text_end;
+  register struct bfd_link_order *p;
+  asection *o;
+  boolean have_link_order_relocs;
+
+  if (info->shared)
+    abfd->flags |= DYNAMIC;
+
+  aout_info.info = info;
+  aout_info.output_bfd = abfd;
+  aout_info.contents = NULL;
+  aout_info.relocs = NULL;
+  aout_info.symbol_map = NULL;
+  aout_info.output_syms = NULL;
+
+  if (! bfd_hash_table_init_n (&aout_info.includes.root,
+                              aout_link_includes_newfunc,
+                              251))
+    goto error_return;
+  includes_hash_initialized = true;
+
+  /* Figure out the largest section size.  Also, if generating
+     relocateable output, count the relocs.  */
+  trsize = 0;
+  drsize = 0;
+  max_contents_size = 0;
+  max_relocs_size = 0;
+  max_sym_count = 0;
+  for (sub = info->input_bfds; sub != NULL; sub = sub->link_next)
+    {
+      size_t sz;
+
+      if (info->relocateable)
+       {
+         if (bfd_get_flavour (sub) == bfd_target_aout_flavour)
+           {
+             trsize += exec_hdr (sub)->a_trsize;
+             drsize += exec_hdr (sub)->a_drsize;
+           }
+         else
+           {
+             /* FIXME: We need to identify the .text and .data sections
+                and call get_reloc_upper_bound and canonicalize_reloc to
+                work out the number of relocs needed, and then multiply
+                by the reloc size.  */
+             (*_bfd_error_handler)
+               ("%s: relocateable link from %s to %s not supported",
+                bfd_get_filename (abfd),
+                sub->xvec->name, abfd->xvec->name);
+             bfd_set_error (bfd_error_invalid_operation);
+             goto error_return;
+           }
+       }
+
+      if (bfd_get_flavour (sub) == bfd_target_aout_flavour)
+       {
+         sz = bfd_section_size (sub, obj_textsec (sub));
+         if (sz > max_contents_size)
+           max_contents_size = sz;
+         sz = bfd_section_size (sub, obj_datasec (sub));
+         if (sz > max_contents_size)
+           max_contents_size = sz;
+
+         sz = exec_hdr (sub)->a_trsize;
+         if (sz > max_relocs_size)
+           max_relocs_size = sz;
+         sz = exec_hdr (sub)->a_drsize;
+         if (sz > max_relocs_size)
+           max_relocs_size = sz;
+
+         sz = obj_aout_external_sym_count (sub);
+         if (sz > max_sym_count)
+           max_sym_count = sz;
+       }
+    }
+
+  if (info->relocateable)
+    {
+      if (obj_textsec (abfd) != (asection *) NULL)
+       trsize += (_bfd_count_link_order_relocs (obj_textsec (abfd)
+                                                ->link_order_head)
+                  * obj_reloc_entry_size (abfd));
+      if (obj_datasec (abfd) != (asection *) NULL)
+       drsize += (_bfd_count_link_order_relocs (obj_datasec (abfd)
+                                                ->link_order_head)
+                  * obj_reloc_entry_size (abfd));
+    }
+
+  exec_hdr (abfd)->a_trsize = trsize;
+  exec_hdr (abfd)->a_drsize = drsize;
+
+  exec_hdr (abfd)->a_entry = bfd_get_start_address (abfd);
+
+  /* Adjust the section sizes and vmas according to the magic number.
+     This sets a_text, a_data and a_bss in the exec_hdr and sets the
+     filepos for each section.  */
+  if (! NAME(aout,adjust_sizes_and_vmas) (abfd, &text_size, &text_end))
+    goto error_return;
+
+  /* The relocation and symbol file positions differ among a.out
+     targets.  We are passed a callback routine from the backend
+     specific code to handle this.
+     FIXME: At this point we do not know how much space the symbol
+     table will require.  This will not work for any (nonstandard)
+     a.out target that needs to know the symbol table size before it
+     can compute the relocation file positions.  This may or may not
+     be the case for the hp300hpux target, for example.  */
+  (*callback) (abfd, &aout_info.treloff, &aout_info.dreloff,
+              &aout_info.symoff);
+  obj_textsec (abfd)->rel_filepos = aout_info.treloff;
+  obj_datasec (abfd)->rel_filepos = aout_info.dreloff;
+  obj_sym_filepos (abfd) = aout_info.symoff;
+
+  /* We keep a count of the symbols as we output them.  */
+  obj_aout_external_sym_count (abfd) = 0;
+
+  /* We accumulate the string table as we write out the symbols.  */
+  aout_info.strtab = _bfd_stringtab_init ();
+  if (aout_info.strtab == NULL)
+    goto error_return;
+
+  /* Allocate buffers to hold section contents and relocs.  */
+  aout_info.contents = (bfd_byte *) bfd_malloc (max_contents_size);
+  aout_info.relocs = (PTR) bfd_malloc (max_relocs_size);
+  aout_info.symbol_map = (int *) bfd_malloc (max_sym_count * sizeof (int *));
+  aout_info.output_syms = ((struct external_nlist *)
+                          bfd_malloc ((max_sym_count + 1)
+                                      * sizeof (struct external_nlist)));
+  if ((aout_info.contents == NULL && max_contents_size != 0)
+      || (aout_info.relocs == NULL && max_relocs_size != 0)
+      || (aout_info.symbol_map == NULL && max_sym_count != 0)
+      || aout_info.output_syms == NULL)
+    goto error_return;
+
+  /* If we have a symbol named __DYNAMIC, force it out now.  This is
+     required by SunOS.  Doing this here rather than in sunos.c is a
+     hack, but it's easier than exporting everything which would be
+     needed.  */
+  {
+    struct aout_link_hash_entry *h;
+
+    h = aout_link_hash_lookup (aout_hash_table (info), "__DYNAMIC",
+                              false, false, false);
+    if (h != NULL)
+      aout_link_write_other_symbol (h, &aout_info);
+  }
+
+  /* The most time efficient way to do the link would be to read all
+     the input object files into memory and then sort out the
+     information into the output file.  Unfortunately, that will
+     probably use too much memory.  Another method would be to step
+     through everything that composes the text section and write it
+     out, and then everything that composes the data section and write
+     it out, and then write out the relocs, and then write out the
+     symbols.  Unfortunately, that requires reading stuff from each
+     input file several times, and we will not be able to keep all the
+     input files open simultaneously, and reopening them will be slow.
+
+     What we do is basically process one input file at a time.  We do
+     everything we need to do with an input file once--copy over the
+     section contents, handle the relocation information, and write
+     out the symbols--and then we throw away the information we read
+     from it.  This approach requires a lot of lseeks of the output
+     file, which is unfortunate but still faster than reopening a lot
+     of files.
+
+     We use the output_has_begun field of the input BFDs to see
+     whether we have already handled it.  */
+  for (sub = info->input_bfds; sub != (bfd *) NULL; sub = sub->link_next)
+    sub->output_has_begun = false;
+
+  /* Mark all sections which are to be included in the link.  This
+     will normally be every section.  We need to do this so that we
+     can identify any sections which the linker has decided to not
+     include.  */
+  for (o = abfd->sections; o != NULL; o = o->next)
+    {
+      for (p = o->link_order_head; p != NULL; p = p->next)
+       {
+         if (p->type == bfd_indirect_link_order)
+           p->u.indirect.section->linker_mark = true;
+       }
+    }
+
+  have_link_order_relocs = false;
+  for (o = abfd->sections; o != (asection *) NULL; o = o->next)
+    {
+      for (p = o->link_order_head;
+          p != (struct bfd_link_order *) NULL;
+          p = p->next)
+       {
+         if (p->type == bfd_indirect_link_order
+             && (bfd_get_flavour (p->u.indirect.section->owner)
+                 == bfd_target_aout_flavour))
+           {
+             bfd *input_bfd;
+
+             input_bfd = p->u.indirect.section->owner;
+             if (! input_bfd->output_has_begun)
+               {
+                 if (! aout_link_input_bfd (&aout_info, input_bfd))
+                   goto error_return;
+                 input_bfd->output_has_begun = true;
+               }
+           }
+         else if (p->type == bfd_section_reloc_link_order
+                  || p->type == bfd_symbol_reloc_link_order)
+           {
+             /* These are handled below.  */
+             have_link_order_relocs = true;
+           }
+         else
+           {
+             if (! _bfd_default_link_order (abfd, info, o, p))
+               goto error_return;
+           }
+       }
+    }
+
+  /* Write out any symbols that we have not already written out.  */
+  aout_link_hash_traverse (aout_hash_table (info),
+                          aout_link_write_other_symbol,
+                          (PTR) &aout_info);
+
+  /* Now handle any relocs we were asked to create by the linker.
+     These did not come from any input file.  We must do these after
+     we have written out all the symbols, so that we know the symbol
+     indices to use.  */
+  if (have_link_order_relocs)
+    {
+      for (o = abfd->sections; o != (asection *) NULL; o = o->next)
+       {
+         for (p = o->link_order_head;
+              p != (struct bfd_link_order *) NULL;
+              p = p->next)
+           {
+             if (p->type == bfd_section_reloc_link_order
+                 || p->type == bfd_symbol_reloc_link_order)
+               {
+                 if (! aout_link_reloc_link_order (&aout_info, o, p))
+                   goto error_return;
+               }
+           }
+       }
+    }
+
+  if (aout_info.contents != NULL)
+    {
+      free (aout_info.contents);
+      aout_info.contents = NULL;
+    }
+  if (aout_info.relocs != NULL)
+    {
+      free (aout_info.relocs);
+      aout_info.relocs = NULL;
+    }
+  if (aout_info.symbol_map != NULL)
+    {
+      free (aout_info.symbol_map);
+      aout_info.symbol_map = NULL;
+    }
+  if (aout_info.output_syms != NULL)
+    {
+      free (aout_info.output_syms);
+      aout_info.output_syms = NULL;
+    }
+  if (includes_hash_initialized)
+    {
+      bfd_hash_table_free (&aout_info.includes.root);
+      includes_hash_initialized = false;
+    }
+
+  /* Finish up any dynamic linking we may be doing.  */
+  if (aout_backend_info (abfd)->finish_dynamic_link != NULL)
+    {
+      if (! (*aout_backend_info (abfd)->finish_dynamic_link) (abfd, info))
+       goto error_return;
+    }
+
+  /* Update the header information.  */
+  abfd->symcount = obj_aout_external_sym_count (abfd);
+  exec_hdr (abfd)->a_syms = abfd->symcount * EXTERNAL_NLIST_SIZE;
+  obj_str_filepos (abfd) = obj_sym_filepos (abfd) + exec_hdr (abfd)->a_syms;
+  obj_textsec (abfd)->reloc_count =
+    exec_hdr (abfd)->a_trsize / obj_reloc_entry_size (abfd);
+  obj_datasec (abfd)->reloc_count =
+    exec_hdr (abfd)->a_drsize / obj_reloc_entry_size (abfd);
+
+  /* Write out the string table, unless there are no symbols.  */
+  if (abfd->symcount > 0)
+    {
+      if (bfd_seek (abfd, obj_str_filepos (abfd), SEEK_SET) != 0
+         || ! emit_stringtab (abfd, aout_info.strtab))
+       goto error_return;
+    }
+  else if (obj_textsec (abfd)->reloc_count == 0
+          && obj_datasec (abfd)->reloc_count == 0)
+    {
+      bfd_byte b;
+
+      b = 0;
+      if (bfd_seek (abfd,
+                   (obj_datasec (abfd)->filepos
+                    + exec_hdr (abfd)->a_data
+                    - 1),
+                   SEEK_SET) != 0
+         || bfd_write (&b, 1, 1, abfd) != 1)
+       goto error_return;
+    }
+
+  return true;
+
+ error_return:
+  if (aout_info.contents != NULL)
+    free (aout_info.contents);
+  if (aout_info.relocs != NULL)
+    free (aout_info.relocs);
+  if (aout_info.symbol_map != NULL)
+    free (aout_info.symbol_map);
+  if (aout_info.output_syms != NULL)
+    free (aout_info.output_syms);
+  if (includes_hash_initialized)
+    bfd_hash_table_free (&aout_info.includes.root);
+  return false;
+}
+
+/* Link an a.out input BFD into the output file.  */
+
+static boolean
+aout_link_input_bfd (finfo, input_bfd)
+     struct aout_final_link_info *finfo;
+     bfd *input_bfd;
+{
+  bfd_size_type sym_count;
+
+  BFD_ASSERT (bfd_get_format (input_bfd) == bfd_object);
+
+  /* If this is a dynamic object, it may need special handling.  */
+  if ((input_bfd->flags & DYNAMIC) != 0
+      && aout_backend_info (input_bfd)->link_dynamic_object != NULL)
+    {
+      return ((*aout_backend_info (input_bfd)->link_dynamic_object)
+             (finfo->info, input_bfd));
+    }
+
+  /* Get the symbols.  We probably have them already, unless
+     finfo->info->keep_memory is false.  */
+  if (! aout_get_external_symbols (input_bfd))
+    return false;
+
+  sym_count = obj_aout_external_sym_count (input_bfd);
+
+  /* Write out the symbols and get a map of the new indices.  The map
+     is placed into finfo->symbol_map.  */
+  if (! aout_link_write_symbols (finfo, input_bfd))
+    return false;
+
+  /* Relocate and write out the sections.  These functions use the
+     symbol map created by aout_link_write_symbols.  The linker_mark
+     field will be set if these sections are to be included in the
+     link, which will normally be the case.  */
+  if (obj_textsec (input_bfd)->linker_mark)
+    {
+      if (! aout_link_input_section (finfo, input_bfd,
+                                    obj_textsec (input_bfd),
+                                    &finfo->treloff,
+                                    exec_hdr (input_bfd)->a_trsize))
+       return false;
+    }
+  if (obj_datasec (input_bfd)->linker_mark)
+    {
+      if (! aout_link_input_section (finfo, input_bfd,
+                                    obj_datasec (input_bfd),
+                                    &finfo->dreloff,
+                                    exec_hdr (input_bfd)->a_drsize))
+       return false;
+    }
+
+  /* If we are not keeping memory, we don't need the symbols any
+     longer.  We still need them if we are keeping memory, because the
+     strings in the hash table point into them.  */
+  if (! finfo->info->keep_memory)
+    {
+      if (! aout_link_free_symbols (input_bfd))
+       return false;
+    }
+
+  return true;
+}
+
+/* Adjust and write out the symbols for an a.out file.  Set the new
+   symbol indices into a symbol_map.  */
+
+static boolean
+aout_link_write_symbols (finfo, input_bfd)
+     struct aout_final_link_info *finfo;
+     bfd *input_bfd;
+{
+  bfd *output_bfd;
+  bfd_size_type sym_count;
+  char *strings;
+  enum bfd_link_strip strip;
+  enum bfd_link_discard discard;
+  struct external_nlist *outsym;
+  bfd_size_type strtab_index;
+  register struct external_nlist *sym;
+  struct external_nlist *sym_end;
+  struct aout_link_hash_entry **sym_hash;
+  int *symbol_map;
+  boolean pass;
+  boolean skip_next;
+
+  output_bfd = finfo->output_bfd;
+  sym_count = obj_aout_external_sym_count (input_bfd);
+  strings = obj_aout_external_strings (input_bfd);
+  strip = finfo->info->strip;
+  discard = finfo->info->discard;
+  outsym = finfo->output_syms;
+
+  /* First write out a symbol for this object file, unless we are
+     discarding such symbols.  */
+  if (strip != strip_all
+      && (strip != strip_some
+         || bfd_hash_lookup (finfo->info->keep_hash, input_bfd->filename,
+                             false, false) != NULL)
+      && discard != discard_all)
+    {
+      bfd_h_put_8 (output_bfd, N_TEXT, outsym->e_type);
+      strtab_index = add_to_stringtab (output_bfd, finfo->strtab,
+                                      input_bfd->filename, false);
+      if (strtab_index == (bfd_size_type) -1)
+       return false;
+      PUT_WORD (output_bfd, strtab_index, outsym->e_strx);
+      PUT_WORD (output_bfd,
+               (bfd_get_section_vma (output_bfd,
+                                     obj_textsec (input_bfd)->output_section)
+                + obj_textsec (input_bfd)->output_offset),
+               outsym->e_value);
+      ++obj_aout_external_sym_count (output_bfd);
+      ++outsym;
+    }
+
+  pass = false;
+  skip_next = false;
+  sym = obj_aout_external_syms (input_bfd);
+  sym_end = sym + sym_count;
+  sym_hash = obj_aout_sym_hashes (input_bfd);
+  symbol_map = finfo->symbol_map;
+  memset (symbol_map, 0, sym_count * sizeof *symbol_map);
+  for (; sym < sym_end; sym++, sym_hash++, symbol_map++)
+    {
+      const char *name;
+      int type;
+      struct aout_link_hash_entry *h;
+      boolean skip;
+      asection *symsec;
+      bfd_vma val = 0;
+      boolean copy;
+
+      /* We set *symbol_map to 0 above for all symbols.  If it has
+         already been set to -1 for this symbol, it means that we are
+         discarding it because it appears in a duplicate header file.
+         See the N_BINCL code below.  */
+      if (*symbol_map == -1)
+       continue;
+
+      /* Initialize *symbol_map to -1, which means that the symbol was
+         not copied into the output file.  We will change it later if
+         we do copy the symbol over.  */
+      *symbol_map = -1;
+
+      type = bfd_h_get_8 (input_bfd, sym->e_type);
+      name = strings + GET_WORD (input_bfd, sym->e_strx);
+
+      h = NULL;
+
+      if (pass)
+       {
+         /* Pass this symbol through.  It is the target of an
+            indirect or warning symbol.  */
+         val = GET_WORD (input_bfd, sym->e_value);
+         pass = false;
+       }
+      else if (skip_next)
+       {
+         /* Skip this symbol, which is the target of an indirect
+            symbol that we have changed to no longer be an indirect
+            symbol.  */
+         skip_next = false;
+         continue;
+       }
+      else
+       {
+         struct aout_link_hash_entry *hresolve;
+
+         /* We have saved the hash table entry for this symbol, if
+            there is one.  Note that we could just look it up again
+            in the hash table, provided we first check that it is an
+            external symbol. */
+         h = *sym_hash;
+
+         /* Use the name from the hash table, in case the symbol was
+             wrapped.  */
+         if (h != NULL)
+           name = h->root.root.string;
+
+         /* If this is an indirect or warning symbol, then change
+            hresolve to the base symbol.  We also change *sym_hash so
+            that the relocation routines relocate against the real
+            symbol.  */
+         hresolve = h;
+         if (h != (struct aout_link_hash_entry *) NULL
+             && (h->root.type == bfd_link_hash_indirect
+                 || h->root.type == bfd_link_hash_warning))
+           {
+             hresolve = (struct aout_link_hash_entry *) h->root.u.i.link;
+             while (hresolve->root.type == bfd_link_hash_indirect
+                    || hresolve->root.type == bfd_link_hash_warning)
+               hresolve = ((struct aout_link_hash_entry *)
+                           hresolve->root.u.i.link);
+             *sym_hash = hresolve;
+           }
+
+         /* If the symbol has already been written out, skip it.  */
+         if (h != (struct aout_link_hash_entry *) NULL
+             && h->root.type != bfd_link_hash_warning
+             && h->written)
+           {
+             if ((type & N_TYPE) == N_INDR
+                 || type == N_WARNING)
+               skip_next = true;
+             *symbol_map = h->indx;
+             continue;
+           }
+
+         /* See if we are stripping this symbol.  */
+         skip = false;
+         switch (strip)
+           {
+           case strip_none:
+             break;
+           case strip_debugger:
+             if ((type & N_STAB) != 0)
+               skip = true;
+             break;
+           case strip_some:
+             if (bfd_hash_lookup (finfo->info->keep_hash, name, false, false)
+                 == NULL)
+               skip = true;
+             break;
+           case strip_all:
+             skip = true;
+             break;
+           }
+         if (skip)
+           {
+             if (h != (struct aout_link_hash_entry *) NULL)
+               h->written = true;
+             continue;
+           }
+
+         /* Get the value of the symbol.  */
+         if ((type & N_TYPE) == N_TEXT
+             || type == N_WEAKT)
+           symsec = obj_textsec (input_bfd);
+         else if ((type & N_TYPE) == N_DATA
+                  || type == N_WEAKD)
+           symsec = obj_datasec (input_bfd);
+         else if ((type & N_TYPE) == N_BSS
+                  || type == N_WEAKB)
+           symsec = obj_bsssec (input_bfd);
+         else if ((type & N_TYPE) == N_ABS
+                  || type == N_WEAKA)
+           symsec = bfd_abs_section_ptr;
+         else if (((type & N_TYPE) == N_INDR
+                   && (hresolve == (struct aout_link_hash_entry *) NULL
+                       || (hresolve->root.type != bfd_link_hash_defined
+                           && hresolve->root.type != bfd_link_hash_defweak
+                           && hresolve->root.type != bfd_link_hash_common)))
+                  || type == N_WARNING)
+           {
+             /* Pass the next symbol through unchanged.  The
+                condition above for indirect symbols is so that if
+                the indirect symbol was defined, we output it with
+                the correct definition so the debugger will
+                understand it.  */
+             pass = true;
+             val = GET_WORD (input_bfd, sym->e_value);
+             symsec = NULL;
+           }
+         else if ((type & N_STAB) != 0)
+           {
+             val = GET_WORD (input_bfd, sym->e_value);
+             symsec = NULL;
+           }
+         else
+           {
+             /* If we get here with an indirect symbol, it means that
+                we are outputting it with a real definition.  In such
+                a case we do not want to output the next symbol,
+                which is the target of the indirection.  */
+             if ((type & N_TYPE) == N_INDR)
+               skip_next = true;
+
+             symsec = NULL;
+
+             /* We need to get the value from the hash table.  We use
+                hresolve so that if we have defined an indirect
+                symbol we output the final definition.  */
+             if (h == (struct aout_link_hash_entry *) NULL)
+               {
+                 switch (type & N_TYPE)
+                   {
+                   case N_SETT:
+                     symsec = obj_textsec (input_bfd);
+                     break;
+                   case N_SETD:
+                     symsec = obj_datasec (input_bfd);
+                     break;
+                   case N_SETB:
+                     symsec = obj_bsssec (input_bfd);
+                     break;
+                   case N_SETA:
+                     symsec = bfd_abs_section_ptr;
+                     break;
+                   default:
+                     val = 0;
+                     break;
+                   }
+               }
+             else if (hresolve->root.type == bfd_link_hash_defined
+                      || hresolve->root.type == bfd_link_hash_defweak)
+               {
+                 asection *input_section;
+                 asection *output_section;
+
+                 /* This case usually means a common symbol which was
+                    turned into a defined symbol.  */
+                 input_section = hresolve->root.u.def.section;
+                 output_section = input_section->output_section;
+                 BFD_ASSERT (bfd_is_abs_section (output_section)
+                             || output_section->owner == output_bfd);
+                 val = (hresolve->root.u.def.value
+                        + bfd_get_section_vma (output_bfd, output_section)
+                        + input_section->output_offset);
+
+                 /* Get the correct type based on the section.  If
+                    this is a constructed set, force it to be
+                    globally visible.  */
+                 if (type == N_SETT
+                     || type == N_SETD
+                     || type == N_SETB
+                     || type == N_SETA)
+                   type |= N_EXT;
+
+                 type &=~ N_TYPE;
+
+                 if (output_section == obj_textsec (output_bfd))
+                   type |= (hresolve->root.type == bfd_link_hash_defined
+                            ? N_TEXT
+                            : N_WEAKT);
+                 else if (output_section == obj_datasec (output_bfd))
+                   type |= (hresolve->root.type == bfd_link_hash_defined
+                            ? N_DATA
+                            : N_WEAKD);
+                 else if (output_section == obj_bsssec (output_bfd))
+                   type |= (hresolve->root.type == bfd_link_hash_defined
+                            ? N_BSS
+                            : N_WEAKB);
+                 else
+                   type |= (hresolve->root.type == bfd_link_hash_defined
+                            ? N_ABS
+                            : N_WEAKA);
+               }
+             else if (hresolve->root.type == bfd_link_hash_common)
+               val = hresolve->root.u.c.size;
+             else if (hresolve->root.type == bfd_link_hash_undefweak)
+               {
+                 val = 0;
+                 type = N_WEAKU;
+               }
+             else
+               val = 0;
+           }
+         if (symsec != (asection *) NULL)
+           val = (symsec->output_section->vma
+                  + symsec->output_offset
+                  + (GET_WORD (input_bfd, sym->e_value)
+                     - symsec->vma));
+
+         /* If this is a global symbol set the written flag, and if
+            it is a local symbol see if we should discard it.  */
+         if (h != (struct aout_link_hash_entry *) NULL)
+           {
+             h->written = true;
+             h->indx = obj_aout_external_sym_count (output_bfd);
+           }
+         else if ((type & N_TYPE) != N_SETT
+                  && (type & N_TYPE) != N_SETD
+                  && (type & N_TYPE) != N_SETB
+                  && (type & N_TYPE) != N_SETA)
+           {
+             switch (discard)
+               {
+               case discard_none:
+                 break;
+               case discard_l:
+                 if ((type & N_STAB) == 0
+                     && bfd_is_local_label_name (input_bfd, name))
+                   skip = true;
+                 break;
+               case discard_all:
+                 skip = true;
+                 break;
+               }
+             if (skip)
+               {
+                 pass = false;
+                 continue;
+               }
+           }
+
+         /* An N_BINCL symbol indicates the start of the stabs
+            entries for a header file.  We need to scan ahead to the
+            next N_EINCL symbol, ignoring nesting, adding up all the
+            characters in the symbol names, not including the file
+            numbers in types (the first number after an open
+            parenthesis).  */
+         if (type == N_BINCL)
+           {
+             struct external_nlist *incl_sym;
+             int nest;
+             struct aout_link_includes_entry *incl_entry;
+             struct aout_link_includes_totals *t;
+
+             val = 0;
+             nest = 0;
+             for (incl_sym = sym + 1; incl_sym < sym_end; incl_sym++)
+               {
+                 int incl_type;
+
+                 incl_type = bfd_h_get_8 (input_bfd, incl_sym->e_type);
+                 if (incl_type == N_EINCL)
+                   {
+                     if (nest == 0)
+                       break;
+                     --nest;
+                   }
+                 else if (incl_type == N_BINCL)
+                   ++nest;
+                 else if (nest == 0)
+                   {
+                     const char *s;
+
+                     s = strings + GET_WORD (input_bfd, incl_sym->e_strx);
+                     for (; *s != '\0'; s++)
+                       {
+                         val += *s;
+                         if (*s == '(')
+                           {
+                             /* Skip the file number.  */
+                             ++s;
+                             while (isdigit ((unsigned char) *s))
+                               ++s;
+                             --s;
+                           }
+                       }
+                   }
+               }
+
+             /* If we have already included a header file with the
+                 same value, then replace this one with an N_EXCL
+                 symbol.  */
+             copy = ! finfo->info->keep_memory;
+             incl_entry = aout_link_includes_lookup (&finfo->includes,
+                                                     name, true, copy);
+             if (incl_entry == NULL)
+               return false;
+             for (t = incl_entry->totals; t != NULL; t = t->next)
+               if (t->total == val)
+                 break;
+             if (t == NULL)
+               {
+                 /* This is the first time we have seen this header
+                     file with this set of stabs strings.  */
+                 t = ((struct aout_link_includes_totals *)
+                      bfd_hash_allocate (&finfo->includes.root,
+                                         sizeof *t));
+                 if (t == NULL)
+                   return false;
+                 t->total = val;
+                 t->next = incl_entry->totals;
+                 incl_entry->totals = t;
+               }
+             else
+               {
+                 int *incl_map;
+
+                 /* This is a duplicate header file.  We must change
+                     it to be an N_EXCL entry, and mark all the
+                     included symbols to prevent outputting them.  */
+                 type = N_EXCL;
+
+                 nest = 0;
+                 for (incl_sym = sym + 1, incl_map = symbol_map + 1;
+                      incl_sym < sym_end;
+                      incl_sym++, incl_map++)
+                   {
+                     int incl_type;
+
+                     incl_type = bfd_h_get_8 (input_bfd, incl_sym->e_type);
+                     if (incl_type == N_EINCL)
+                       {
+                         if (nest == 0)
+                           {
+                             *incl_map = -1;
+                             break;
+                           }
+                         --nest;
+                       }
+                     else if (incl_type == N_BINCL)
+                       ++nest;
+                     else if (nest == 0)
+                       *incl_map = -1;
+                   }
+               }
+           }
+       }
+
+      /* Copy this symbol into the list of symbols we are going to
+        write out.  */
+      bfd_h_put_8 (output_bfd, type, outsym->e_type);
+      copy = false;
+      if (! finfo->info->keep_memory)
+       {
+         /* name points into a string table which we are going to
+            free.  If there is a hash table entry, use that string.
+            Otherwise, copy name into memory.  */
+         if (h != (struct aout_link_hash_entry *) NULL)
+           name = h->root.root.string;
+         else
+           copy = true;
+       }
+      strtab_index = add_to_stringtab (output_bfd, finfo->strtab,
+                                      name, copy);
+      if (strtab_index == (bfd_size_type) -1)
+       return false;
+      PUT_WORD (output_bfd, strtab_index, outsym->e_strx);
+      PUT_WORD (output_bfd, val, outsym->e_value);
+      *symbol_map = obj_aout_external_sym_count (output_bfd);
+      ++obj_aout_external_sym_count (output_bfd);
+      ++outsym;
+    }
+
+  /* Write out the output symbols we have just constructed.  */
+  if (outsym > finfo->output_syms)
+    {
+      bfd_size_type outsym_count;
+
+      if (bfd_seek (output_bfd, finfo->symoff, SEEK_SET) != 0)
+       return false;
+      outsym_count = outsym - finfo->output_syms;
+      if (bfd_write ((PTR) finfo->output_syms,
+                    (bfd_size_type) EXTERNAL_NLIST_SIZE,
+                    (bfd_size_type) outsym_count, output_bfd)
+         != outsym_count * EXTERNAL_NLIST_SIZE)
+       return false;
+      finfo->symoff += outsym_count * EXTERNAL_NLIST_SIZE;
+    }
+
+  return true;
+}
+
+/* Write out a symbol that was not associated with an a.out input
+   object.  */
+
+static boolean
+aout_link_write_other_symbol (h, data)
+     struct aout_link_hash_entry *h;
+     PTR data;
+{
+  struct aout_final_link_info *finfo = (struct aout_final_link_info *) data;
+  bfd *output_bfd;
+  int type;
+  bfd_vma val;
+  struct external_nlist outsym;
+  bfd_size_type indx;
+
+  output_bfd = finfo->output_bfd;
+
+  if (aout_backend_info (output_bfd)->write_dynamic_symbol != NULL)
+    {
+      if (! ((*aout_backend_info (output_bfd)->write_dynamic_symbol)
+            (output_bfd, finfo->info, h)))
+       {
+         /* FIXME: No way to handle errors.  */
+         abort ();
+       }
+    }
+
+  if (h->written)
+    return true;
+
+  h->written = true;
+
+  /* An indx of -2 means the symbol must be written.  */
+  if (h->indx != -2
+      && (finfo->info->strip == strip_all
+         || (finfo->info->strip == strip_some
+             && bfd_hash_lookup (finfo->info->keep_hash, h->root.root.string,
+                                 false, false) == NULL)))
+    return true;
+
+  switch (h->root.type)
+    {
+    default:
+      abort ();
+      /* Avoid variable not initialized warnings.  */
+      return true;
+    case bfd_link_hash_new:
+      /* This can happen for set symbols when sets are not being
+         built.  */
+      return true;
+    case bfd_link_hash_undefined:
+      type = N_UNDF | N_EXT;
+      val = 0;
+      break;
+    case bfd_link_hash_defined:
+    case bfd_link_hash_defweak:
+      {
+       asection *sec;
+
+       sec = h->root.u.def.section->output_section;
+       BFD_ASSERT (bfd_is_abs_section (sec)
+                   || sec->owner == output_bfd);
+       if (sec == obj_textsec (output_bfd))
+         type = h->root.type == bfd_link_hash_defined ? N_TEXT : N_WEAKT;
+       else if (sec == obj_datasec (output_bfd))
+         type = h->root.type == bfd_link_hash_defined ? N_DATA : N_WEAKD;
+       else if (sec == obj_bsssec (output_bfd))
+         type = h->root.type == bfd_link_hash_defined ? N_BSS : N_WEAKB;
+       else
+         type = h->root.type == bfd_link_hash_defined ? N_ABS : N_WEAKA;
+       type |= N_EXT;
+       val = (h->root.u.def.value
+              + sec->vma
+              + h->root.u.def.section->output_offset);
+      }
+      break;
+    case bfd_link_hash_common:
+      type = N_UNDF | N_EXT;
+      val = h->root.u.c.size;
+      break;
+    case bfd_link_hash_undefweak:
+      type = N_WEAKU;
+      val = 0;
+    case bfd_link_hash_indirect:
+    case bfd_link_hash_warning:
+      /* FIXME: Ignore these for now.  The circumstances under which
+        they should be written out are not clear to me.  */
+      return true;
+    }
+
+  bfd_h_put_8 (output_bfd, type, outsym.e_type);
+  indx = add_to_stringtab (output_bfd, finfo->strtab, h->root.root.string,
+                          false);
+  if (indx == (bfd_size_type) -1)
+    {
+      /* FIXME: No way to handle errors.  */
+      abort ();
+    }
+  PUT_WORD (output_bfd, indx, outsym.e_strx);
+  PUT_WORD (output_bfd, val, outsym.e_value);
+
+  if (bfd_seek (output_bfd, finfo->symoff, SEEK_SET) != 0
+      || bfd_write ((PTR) &outsym, (bfd_size_type) EXTERNAL_NLIST_SIZE,
+                   (bfd_size_type) 1, output_bfd) != EXTERNAL_NLIST_SIZE)
+    {
+      /* FIXME: No way to handle errors.  */
+      abort ();
+    }
+
+  finfo->symoff += EXTERNAL_NLIST_SIZE;
+  h->indx = obj_aout_external_sym_count (output_bfd);
+  ++obj_aout_external_sym_count (output_bfd);
+
+  return true;
+}
+
+/* Link an a.out section into the output file.  */
+
+static boolean
+aout_link_input_section (finfo, input_bfd, input_section, reloff_ptr,
+                        rel_size)
+     struct aout_final_link_info *finfo;
+     bfd *input_bfd;
+     asection *input_section;
+     file_ptr *reloff_ptr;
+     bfd_size_type rel_size;
+{
+  bfd_size_type input_size;
+  PTR relocs;
+
+  /* Get the section contents.  */
+  input_size = bfd_section_size (input_bfd, input_section);
+  if (! bfd_get_section_contents (input_bfd, input_section,
+                                 (PTR) finfo->contents,
+                                 (file_ptr) 0, input_size))
+    return false;
+
+  /* Read in the relocs if we haven't already done it.  */
+  if (aout_section_data (input_section) != NULL
+      && aout_section_data (input_section)->relocs != NULL)
+    relocs = aout_section_data (input_section)->relocs;
+  else
+    {
+      relocs = finfo->relocs;
+      if (rel_size > 0)
+       {
+         if (bfd_seek (input_bfd, input_section->rel_filepos, SEEK_SET) != 0
+             || bfd_read (relocs, 1, rel_size, input_bfd) != rel_size)
+           return false;
+       }
+    }
+
+  /* Relocate the section contents.  */
+  if (! pdp11_aout_link_input_section (finfo, input_bfd, input_section,
+                                      (struct pdp11_aout_reloc_external *) relocs,
+                                      rel_size, finfo->contents))
+    return false;
+
+  /* Write out the section contents.  */
+  if (! bfd_set_section_contents (finfo->output_bfd,
+                                 input_section->output_section,
+                                 (PTR) finfo->contents,
+                                 input_section->output_offset,
+                                 input_size))
+    return false;
+
+  /* If we are producing relocateable output, the relocs were
+     modified, and we now write them out.  */
+  if (finfo->info->relocateable && rel_size > 0)
+    {
+      if (bfd_seek (finfo->output_bfd, *reloff_ptr, SEEK_SET) != 0)
+       return false;
+      if (bfd_write (relocs, (bfd_size_type) 1, rel_size, finfo->output_bfd)
+         != rel_size)
+       return false;
+      *reloff_ptr += rel_size;
+
+      /* Assert that the relocs have not run into the symbols, and
+        that if these are the text relocs they have not run into the
+        data relocs.  */
+      BFD_ASSERT (*reloff_ptr <= obj_sym_filepos (finfo->output_bfd)
+                 && (reloff_ptr != &finfo->treloff
+                     || (*reloff_ptr
+                         <= obj_datasec (finfo->output_bfd)->rel_filepos)));
+    }
+
+  return true;
+}
+
+/* Get the section corresponding to a reloc index.  */
+
+static INLINE asection *
+aout_reloc_type_to_section (abfd, type)
+     bfd *abfd;
+     int type;
+{
+  switch (type)
+    {
+    case RTEXT:
+      return obj_textsec (abfd);
+    case RDATA:
+      return obj_datasec (abfd);
+    case RBSS:
+      return obj_bsssec (abfd);
+    case RABS:
+      return bfd_abs_section_ptr;
+    case REXT:
+      return bfd_und_section_ptr;
+    default:
+      abort ();
+    }
+}
+
+static boolean
+pdp11_aout_link_input_section (finfo, input_bfd, input_section, relocs,
+                              rel_size, contents)
+     struct aout_final_link_info *finfo;
+     bfd *input_bfd;
+     asection *input_section;
+     struct pdp11_aout_reloc_external *relocs;
+     bfd_size_type rel_size;
+     bfd_byte *contents;
+{
+  boolean (*check_dynamic_reloc) PARAMS ((struct bfd_link_info *,
+                                         bfd *, asection *,
+                                         struct aout_link_hash_entry *,
+                                         PTR, bfd_byte *, boolean *,
+                                         bfd_vma *));
+  bfd *output_bfd;
+  boolean relocateable;
+  struct external_nlist *syms;
+  char *strings;
+  struct aout_link_hash_entry **sym_hashes;
+  int *symbol_map;
+  bfd_size_type reloc_count;
+  register struct pdp11_aout_reloc_external *rel;
+  struct pdp11_aout_reloc_external *rel_end;
+
+  output_bfd = finfo->output_bfd;
+  check_dynamic_reloc = aout_backend_info (output_bfd)->check_dynamic_reloc;
+
+  BFD_ASSERT (obj_reloc_entry_size (input_bfd) == RELOC_SIZE);
+  BFD_ASSERT (input_bfd->xvec->header_byteorder
+             == output_bfd->xvec->header_byteorder);
+
+  relocateable = finfo->info->relocateable;
+  syms = obj_aout_external_syms (input_bfd);
+  strings = obj_aout_external_strings (input_bfd);
+  sym_hashes = obj_aout_sym_hashes (input_bfd);
+  symbol_map = finfo->symbol_map;
+
+  reloc_count = rel_size / RELOC_SIZE;
+  rel = relocs;
+  rel_end = (struct pdp11_aout_reloc_external *)(((char *)rel) + rel_size);
+  for (; rel < rel_end; ((char *)rel) += RELOC_SIZE)
+    {
+      bfd_vma r_addr;
+      int r_index;
+      int r_type;
+      int r_pcrel;
+      int r_extern;
+      reloc_howto_type *howto;
+      struct aout_link_hash_entry *h = NULL;
+      bfd_vma relocation;
+      bfd_reloc_status_type r;
+      int reloc_entry;
+
+      reloc_entry = GET_WORD (input_bfd, (PTR)rel);
+      if (reloc_entry == 0)
+       continue;
+
+      {
+       unsigned int howto_idx;
+
+       r_index = (reloc_entry & RIDXMASK) >> 4;
+       r_type = reloc_entry & RTYPE;
+       r_pcrel = reloc_entry & RELFLG;
+       r_addr = (char *)rel - (char *)relocs;
+
+       r_extern = (r_type == REXT);
+
+       howto_idx = r_pcrel;
+       BFD_ASSERT (howto_idx < TABLE_SIZE (howto_table_pdp11));
+       howto = howto_table_pdp11 + howto_idx;
+      }
+
+      if (relocateable)
+       {
+         /* We are generating a relocateable output file, and must
+            modify the reloc accordingly.  */
+         if (r_extern)
+           {
+             /* If we know the symbol this relocation is against,
+                convert it into a relocation against a section.  This
+                is what the native linker does.  */
+             h = sym_hashes[r_index];
+             if (h != (struct aout_link_hash_entry *) NULL
+                 && (h->root.type == bfd_link_hash_defined
+                     || h->root.type == bfd_link_hash_defweak))
+               {
+                 asection *output_section;
+
+                 /* Compute a new r_index.  */
+                 output_section = h->root.u.def.section->output_section;
+                 if (output_section == obj_textsec (output_bfd))
+                   r_type = N_TEXT;
+                 else if (output_section == obj_datasec (output_bfd))
+                   r_type = N_DATA;
+                 else if (output_section == obj_bsssec (output_bfd))
+                   r_type = N_BSS;
+                 else
+                   r_type = N_ABS;
+
+                 /* Add the symbol value and the section VMA to the
+                    addend stored in the contents.  */
+                 relocation = (h->root.u.def.value
+                               + output_section->vma
+                               + h->root.u.def.section->output_offset);
+               }
+             else
+               {
+                 /* We must change r_index according to the symbol
+                    map.  */
+                 r_index = symbol_map[r_index];
+
+                 if (r_index == -1)
+                   {
+                     if (h != NULL)
+                       {
+                         /* We decided to strip this symbol, but it
+                             turns out that we can't.  Note that we
+                             lose the other and desc information here.
+                             I don't think that will ever matter for a
+                             global symbol.  */
+                         if (h->indx < 0)
+                           {
+                             h->indx = -2;
+                             h->written = false;
+                             if (! aout_link_write_other_symbol (h,
+                                                                 (PTR) finfo))
+                               return false;
+                           }
+                         r_index = h->indx;
+                       }
+                     else
+                       {
+                         const char *name;
+
+                         name = strings + GET_WORD (input_bfd,
+                                                    syms[r_index].e_strx);
+                         if (! ((*finfo->info->callbacks->unattached_reloc)
+                                (finfo->info, name, input_bfd, input_section,
+                                 r_addr)))
+                           return false;
+                         r_index = 0;
+                       }
+                   }
+
+                 relocation = 0;
+               }
+
+             /* Write out the new r_index value.  */
+             reloc_entry = GET_WORD (input_bfd, rel->e_reloc_entry);
+             reloc_entry &= RIDXMASK;
+             reloc_entry |= r_index << 4;
+             PUT_WORD (input_bfd, reloc_entry, rel->e_reloc_entry);
+           }
+         else
+           {
+             asection *section;
+
+             /* This is a relocation against a section.  We must
+                adjust by the amount that the section moved.  */
+             section = aout_reloc_type_to_section (input_bfd, r_type);
+             relocation = (section->output_section->vma
+                           + section->output_offset
+                           - section->vma);
+           }
+
+         /* Change the address of the relocation.  */
+#if 0
+         PUT_WORD (output_bfd,
+                   r_addr + input_section->output_offset,
+                   rel->r_address);
+#else
+fprintf (stderr, "TODO: change the address of the relocation\n");
+#endif
+
+         /* Adjust a PC relative relocation by removing the reference
+            to the original address in the section and including the
+            reference to the new address.  */
+         if (r_pcrel)
+           relocation -= (input_section->output_section->vma
+                          + input_section->output_offset
+                          - input_section->vma);
+
+#ifdef MY_relocatable_reloc
+         MY_relocatable_reloc (howto, output_bfd, rel, relocation, r_addr);
+#endif
+
+         if (relocation == 0)
+           r = bfd_reloc_ok;
+         else
+           r = MY_relocate_contents (howto,
+                                     input_bfd, relocation,
+                                     contents + r_addr);
+       }
+      else
+       {
+         boolean hundef;
+
+         /* We are generating an executable, and must do a full
+            relocation.  */
+         hundef = false;
+         if (r_extern)
+           {
+             h = sym_hashes[r_index];
+
+             if (h != (struct aout_link_hash_entry *) NULL
+                 && (h->root.type == bfd_link_hash_defined
+                     || h->root.type == bfd_link_hash_defweak))
+               {
+                 relocation = (h->root.u.def.value
+                               + h->root.u.def.section->output_section->vma
+                               + h->root.u.def.section->output_offset);
+               }
+             else if (h != (struct aout_link_hash_entry *) NULL
+                      && h->root.type == bfd_link_hash_undefweak)
+               relocation = 0;
+             else
+               {
+                 hundef = true;
+                 relocation = 0;
+               }
+           }
+         else
+           {
+             asection *section;
+
+             section = aout_reloc_type_to_section (input_bfd, r_type);
+             relocation = (section->output_section->vma
+                           + section->output_offset
+                           - section->vma);
+             if (r_pcrel)
+               relocation += input_section->vma;
+           }
+
+         if (check_dynamic_reloc != NULL)
+           {
+             boolean skip;
+
+             if (! ((*check_dynamic_reloc)
+                    (finfo->info, input_bfd, input_section, h,
+                     (PTR) rel, contents, &skip, &relocation)))
+               return false;
+             if (skip)
+               continue;
+           }
+
+         /* Now warn if a global symbol is undefined.  We could not
+             do this earlier, because check_dynamic_reloc might want
+             to skip this reloc.  */
+         if (hundef && ! finfo->info->shared)
+           {
+             const char *name;
+
+             if (h != NULL)
+               name = h->root.root.string;
+             else
+               name = strings + GET_WORD (input_bfd, syms[r_index].e_strx);
+             if (! ((*finfo->info->callbacks->undefined_symbol)
+                    (finfo->info, name, input_bfd, input_section,
+                     r_addr, true)))
+               return false;
+           }
+
+         r = MY_final_link_relocate (howto,
+                                     input_bfd, input_section,
+                                     contents, r_addr, relocation,
+                                     (bfd_vma) 0);
+       }
+
+      if (r != bfd_reloc_ok)
+       {
+         switch (r)
+           {
+           default:
+           case bfd_reloc_outofrange:
+             abort ();
+           case bfd_reloc_overflow:
+             {
+               const char *name;
+
+               if (h != NULL)
+                 name = h->root.root.string;
+               else if (r_extern)
+                 name = strings + GET_WORD (input_bfd,
+                                            syms[r_index].e_strx);
+               else
+                 {
+                   asection *s;
+
+                   s = aout_reloc_type_to_section (input_bfd, r_type);
+                   name = bfd_section_name (input_bfd, s);
+                 }
+               if (! ((*finfo->info->callbacks->reloc_overflow)
+                      (finfo->info, name, howto->name,
+                       (bfd_vma) 0, input_bfd, input_section, r_addr)))
+                 return false;
+             }
+             break;
+           }
+       }
+    }
+
+  return true;
+}
+
+/* Handle a link order which is supposed to generate a reloc.  */
+
+static boolean
+aout_link_reloc_link_order (finfo, o, p)
+     struct aout_final_link_info *finfo;
+     asection *o;
+     struct bfd_link_order *p;
+{
+  struct bfd_link_order_reloc *pr;
+  int r_index;
+  int r_extern;
+  reloc_howto_type *howto;
+  file_ptr *reloff_ptr;
+  struct reloc_std_external srel;
+  PTR rel_ptr;
+
+  pr = p->u.reloc.p;
+
+  if (p->type == bfd_section_reloc_link_order)
+    {
+      r_extern = 0;
+      if (bfd_is_abs_section (pr->u.section))
+       r_index = N_ABS | N_EXT;
+      else
+       {
+         BFD_ASSERT (pr->u.section->owner == finfo->output_bfd);
+         r_index = pr->u.section->target_index;
+       }
+    }
+  else
+    {
+      struct aout_link_hash_entry *h;
+
+      BFD_ASSERT (p->type == bfd_symbol_reloc_link_order);
+      r_extern = 1;
+      h = ((struct aout_link_hash_entry *)
+          bfd_wrapped_link_hash_lookup (finfo->output_bfd, finfo->info,
+                                        pr->u.name, false, false, true));
+      if (h != (struct aout_link_hash_entry *) NULL
+         && h->indx >= 0)
+       r_index = h->indx;
+      else if (h != NULL)
+       {
+         /* We decided to strip this symbol, but it turns out that we
+            can't.  Note that we lose the other and desc information
+            here.  I don't think that will ever matter for a global
+            symbol.  */
+         h->indx = -2;
+         h->written = false;
+         if (! aout_link_write_other_symbol (h, (PTR) finfo))
+           return false;
+         r_index = h->indx;
+       }
+      else
+       {
+         if (! ((*finfo->info->callbacks->unattached_reloc)
+                (finfo->info, pr->u.name, (bfd *) NULL,
+                 (asection *) NULL, (bfd_vma) 0)))
+           return false;
+         r_index = 0;
+       }
+    }
+
+  howto = bfd_reloc_type_lookup (finfo->output_bfd, pr->reloc);
+  if (howto == 0)
+    {
+      bfd_set_error (bfd_error_bad_value);
+      return false;
+    }
+
+  if (o == obj_textsec (finfo->output_bfd))
+    reloff_ptr = &finfo->treloff;
+  else if (o == obj_datasec (finfo->output_bfd))
+    reloff_ptr = &finfo->dreloff;
+  else
+    abort ();
+
+#ifdef MY_put_reloc
+  MY_put_reloc(finfo->output_bfd, r_extern, r_index, p->offset, howto,
+              &srel);
+#else
+  {
+    int r_pcrel;
+    int r_baserel;
+    int r_jmptable;
+    int r_relative;
+    int r_length;
+
+    fprintf (stderr, "TODO: line %d in bfd/pdp11.c\n", __LINE__);
+
+    r_pcrel = howto->pc_relative;
+    r_baserel = (howto->type & 8) != 0;
+    r_jmptable = (howto->type & 16) != 0;
+    r_relative = (howto->type & 32) != 0;
+    r_length = howto->size;
+
+    PUT_WORD (finfo->output_bfd, p->offset, srel.r_address);
+    if (bfd_header_big_endian (finfo->output_bfd))
+      {
+       srel.r_index[0] = r_index >> 16;
+       srel.r_index[1] = r_index >> 8;
+       srel.r_index[2] = r_index;
+       srel.r_type[0] =
+         ((r_extern ?     RELOC_STD_BITS_EXTERN_BIG : 0)
+          | (r_pcrel ?    RELOC_STD_BITS_PCREL_BIG : 0)
+          | (r_baserel ?  RELOC_STD_BITS_BASEREL_BIG : 0)
+          | (r_jmptable ? RELOC_STD_BITS_JMPTABLE_BIG : 0)
+          | (r_relative ? RELOC_STD_BITS_RELATIVE_BIG : 0)
+          | (r_length <<  RELOC_STD_BITS_LENGTH_SH_BIG));
+      }
+    else
+      {
+       srel.r_index[2] = r_index >> 16;
+       srel.r_index[1] = r_index >> 8;
+       srel.r_index[0] = r_index;
+       srel.r_type[0] =
+         ((r_extern ?     RELOC_STD_BITS_EXTERN_LITTLE : 0)
+          | (r_pcrel ?    RELOC_STD_BITS_PCREL_LITTLE : 0)
+          | (r_baserel ?  RELOC_STD_BITS_BASEREL_LITTLE : 0)
+          | (r_jmptable ? RELOC_STD_BITS_JMPTABLE_LITTLE : 0)
+          | (r_relative ? RELOC_STD_BITS_RELATIVE_LITTLE : 0)
+          | (r_length <<  RELOC_STD_BITS_LENGTH_SH_LITTLE));
+      }
+  }
+#endif
+  rel_ptr = (PTR) &srel;
+
+  /* We have to write the addend into the object file, since
+     standard a.out relocs are in place.  It would be more
+     reliable if we had the current contents of the file here,
+     rather than assuming zeroes, but we can't read the file since
+     it was opened using bfd_openw.  */
+  if (pr->addend != 0)
+    {
+      bfd_size_type size;
+      bfd_reloc_status_type r;
+      bfd_byte *buf;
+      boolean ok;
+
+      size = bfd_get_reloc_size (howto);
+      buf = (bfd_byte *) bfd_zmalloc (size);
+      if (buf == (bfd_byte *) NULL)
+       return false;
+      r = MY_relocate_contents (howto, finfo->output_bfd,
+                               pr->addend, buf);
+      switch (r)
+       {
+       case bfd_reloc_ok:
+         break;
+       default:
+       case bfd_reloc_outofrange:
+         abort ();
+       case bfd_reloc_overflow:
+         if (! ((*finfo->info->callbacks->reloc_overflow)
+                (finfo->info,
+                 (p->type == bfd_section_reloc_link_order
+                  ? bfd_section_name (finfo->output_bfd,
+                                      pr->u.section)
+                  : pr->u.name),
+                 howto->name, pr->addend, (bfd *) NULL,
+                 (asection *) NULL, (bfd_vma) 0)))
+           {
+             free (buf);
+             return false;
+           }
+         break;
+       }
+      ok = bfd_set_section_contents (finfo->output_bfd, o,
+                                    (PTR) buf,
+                                    (file_ptr) p->offset,
+                                    size);
+      free (buf);
+      if (! ok)
+       return false;
+    }
+
+  if (bfd_seek (finfo->output_bfd, *reloff_ptr, SEEK_SET) != 0
+      || (bfd_write (rel_ptr, (bfd_size_type) 1,
+                    obj_reloc_entry_size (finfo->output_bfd),
+                    finfo->output_bfd)
+         != obj_reloc_entry_size (finfo->output_bfd)))
+    return false;
+
+  *reloff_ptr += obj_reloc_entry_size (finfo->output_bfd);
+
+  /* Assert that the relocs have not run into the symbols, and that n
+     the text relocs have not run into the data relocs.  */
+  BFD_ASSERT (*reloff_ptr <= obj_sym_filepos (finfo->output_bfd)
+             && (reloff_ptr != &finfo->treloff
+                 || (*reloff_ptr
+                     <= obj_datasec (finfo->output_bfd)->rel_filepos)));
+
+  return true;
+}
+/* end of modified aoutx.h */
+
+bfd_vma
+bfd_getp32 (addr)
+     const bfd_byte *addr;
+{
+  return (((((bfd_vma)addr[1] << 8) | addr[0]) << 8)
+         | addr[3]) << 8 | addr[2];
+}
+
+#define COERCE32(x) (((bfd_signed_vma) (x) ^ 0x80000000) - 0x80000000)
+
+bfd_signed_vma
+bfd_getp_signed_32 (addr)
+     const bfd_byte *addr;
+{
+  return COERCE32((((((bfd_vma)addr[1] << 8) | addr[0]) << 8)
+                  | addr[3]) << 8 | addr[2]);
+}
+
+void
+bfd_putp32 (data, addr)
+     bfd_vma data;
+     bfd_byte *addr;
+{
+  addr[0] = (bfd_byte)(data >> 16);
+  addr[1] = (bfd_byte)(data >> 24);
+  addr[2] = (bfd_byte)data;
+  addr[3] = (bfd_byte)(data >>  8);
+}
index 1d2231582d3998b6035d4d5301ef7cd128b734bf..a0d42e6ac2a7e37c5e50c743ef1726838510b7f9 100644 (file)
@@ -82,6 +82,7 @@ cpu-m88k.c
 cpu-mcore.c
 cpu-mips.c
 cpu-ns32k.c
+cpu-pdp11.c
 cpu-pj.c
 cpu-powerpc.c
 cpu-rs6000.c
@@ -213,6 +214,7 @@ oasys.c
 opncls.c
 osf-core.c
 pc532-mach.c
+pdp11.c
 pe-arm.c
 pe-i386.c
 pei-arm.c
index 8f39e0741399df387e2d746af856bad8c60a217b..8965d05b86053a0ed311b4c38faa89ccae9bcb03 100644 (file)
@@ -6,7 +6,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
-"POT-Creation-Date: 2001-02-18 14:28-0800\n"
+"POT-Creation-Date: 2001-02-18 15:14-0800\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -1337,6 +1337,11 @@ msgstr ""
 msgid "%s: could not find output section %s for input section %s"
 msgstr ""
 
+#: elflink.h:5559
+#, c-format
+msgid "%s: invalid section symbol index 0x%x (%s) ingored"
+msgstr ""
+
 #: i386linux.c:450 m68klinux.c:454 sparclinux.c:452
 #, c-format
 msgid "Output file requires shared library `%s'\n"
@@ -1614,29 +1619,29 @@ msgstr ""
 msgid "Object module NOT error-free !\n"
 msgstr ""
 
-#: vms-misc.c:540
+#: vms-misc.c:536
 #, c-format
 msgid "Stack overflow (%d) in _bfd_vms_push"
 msgstr ""
 
-#: vms-misc.c:558
+#: vms-misc.c:554
 msgid "Stack underflow in _bfd_vms_pop"
 msgstr ""
 
-#: vms-misc.c:916
+#: vms-misc.c:910
 msgid "_bfd_vms_output_counted called with zero bytes"
 msgstr ""
 
-#: vms-misc.c:921
+#: vms-misc.c:915
 msgid "_bfd_vms_output_counted called with too many bytes"
 msgstr ""
 
-#: vms-misc.c:1052
+#: vms-misc.c:1046
 #, c-format
 msgid "Symbol %s replaced by %s\n"
 msgstr ""
 
-#: vms-misc.c:1114
+#: vms-misc.c:1108
 #, c-format
 msgid "failed to enter %s"
 msgstr ""
index 9d4516302d374e02e9086be1bf0ff3d35c3a958a..07cf691f5806de8187373dfccc7eb2ed22290c8b 100644 (file)
@@ -2107,6 +2107,13 @@ ENUMX
 ENUMDOC
   ns32k relocations
 
+ENUM
+  BFD_RELOC_PDP11_DISP_8_PCREL
+ENUMX
+  BFD_RELOC_PDP11_DISP_6_PCREL
+ENUMDOC
+  PDP11 relocations
+
 ENUM
   BFD_RELOC_PJ_CODE_HI16
 ENUMX
index 70b262db7438f695f151e4eac8e4984ce452b6e5..a712efdbdb7dac5c857b7af61d46c380d29deca7 100644 (file)
@@ -624,6 +624,7 @@ extern const bfd_target nlm32_sparc_vec;
 extern const bfd_target oasys_vec;
 extern const bfd_target pc532machaout_vec;
 extern const bfd_target pc532netbsd_vec;
+extern const bfd_target pdp11_aout_vec;
 extern const bfd_target pmac_xcoff_vec;
 extern const bfd_target ppcboot_vec;
 extern const bfd_target riscix_vec;
@@ -884,6 +885,7 @@ static const bfd_target * const _bfd_target_vector[] = {
        &oasys_vec,
 #endif
        &pc532machaout_vec,
+       &pdp11_aout_vec,
 #if 0
        /* We have no way of distinguishing these from other a.out variants */
        &aout_arm_big_vec,
index 62f858f59b7a0420eb6a77d7038d8f3d2e458a52..12369e90a7c0ab36febb444b5579a37a74fa5d72 100644 (file)
@@ -1,5 +1,7 @@
 -*- text -*-
 
+* Support for PDP-11 by Lars Brinkhoff.
+
 * Add support for ARM v5t and v5te architectures and Intel's XScale ARM
   extenstions.
 
index 7508823d0bd6383fc5ed7da109ef073286dd4a01..d1cc8be1d8948d37bc8a8032b56c038e3e2fda3f 100644 (file)
@@ -6,7 +6,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
-"POT-Creation-Date: 2001-02-09 16:01-0800\n"
+"POT-Creation-Date: 2001-02-18 11:44-0800\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -23,7 +23,7 @@ msgid ""
 msgstr ""
 
 #: addr2line.c:83 ar.c:288 nlmconv.c:1119 objcopy.c:373 objcopy.c:405
-#: readelf.c:1973 size.c:91 strings.c:530 windres.c:737
+#: readelf.c:1976 size.c:91 strings.c:530 windres.c:737
 #, c-format
 msgid "Report bugs to %s\n"
 msgstr ""
@@ -2068,942 +2068,942 @@ msgstr ""
 msgid "<string table index %3ld>"
 msgstr ""
 
-#: readelf.c:1191
+#: readelf.c:1194
 #, c-format
 msgid "Processor Specific: %lx"
 msgstr ""
 
-#: readelf.c:1210
+#: readelf.c:1213
 #, c-format
 msgid "Operating System specific: %lx"
 msgstr ""
 
-#: readelf.c:1213 readelf.c:1755
+#: readelf.c:1216 readelf.c:1758
 #, c-format
 msgid "<unknown>: %lx"
 msgstr ""
 
-#: readelf.c:1227
+#: readelf.c:1230
 msgid "NONE (None)"
 msgstr ""
 
-#: readelf.c:1228
+#: readelf.c:1231
 msgid "REL (Relocatable file)"
 msgstr ""
 
-#: readelf.c:1229
+#: readelf.c:1232
 msgid "EXEC (Executable file)"
 msgstr ""
 
-#: readelf.c:1230
+#: readelf.c:1233
 msgid "DYN (Shared object file)"
 msgstr ""
 
-#: readelf.c:1231
+#: readelf.c:1234
 msgid "CORE (Core file)"
 msgstr ""
 
-#: readelf.c:1235
+#: readelf.c:1238
 #, c-format
 msgid "Processor Specific: (%x)"
 msgstr ""
 
-#: readelf.c:1237
+#: readelf.c:1240
 #, c-format
 msgid "OS Specific: (%x)"
 msgstr ""
 
-#: readelf.c:1239 readelf.c:1326 readelf.c:1906
+#: readelf.c:1242 readelf.c:1329 readelf.c:1909
 #, c-format
 msgid "<unknown>: %x"
 msgstr ""
 
-#: readelf.c:1252
+#: readelf.c:1255
 msgid "None"
 msgstr ""
 
-#: readelf.c:1945
+#: readelf.c:1948
 msgid "Usage: readelf {options} elf-file(s)\n"
 msgstr ""
 
-#: readelf.c:1946
+#: readelf.c:1949
 msgid "  Options are:\n"
 msgstr ""
 
-#: readelf.c:1947
+#: readelf.c:1950
 msgid "  -a or --all               Equivalent to: -h -l -S -s -r -d -V -A -I\n"
 msgstr ""
 
-#: readelf.c:1948
+#: readelf.c:1951
 msgid "  -h or --file-header       Display the ELF file header\n"
 msgstr ""
 
-#: readelf.c:1949
+#: readelf.c:1952
 msgid "  -l or --program-headers or --segments\n"
 msgstr ""
 
-#: readelf.c:1950
+#: readelf.c:1953
 msgid "                            Display the program headers\n"
 msgstr ""
 
-#: readelf.c:1951
+#: readelf.c:1954
 msgid "  -S or --section-headers or --sections\n"
 msgstr ""
 
-#: readelf.c:1952
+#: readelf.c:1955
 msgid "                            Display the sections' header\n"
 msgstr ""
 
-#: readelf.c:1953
+#: readelf.c:1956
 msgid "  -e or --headers           Equivalent to: -h -l -S\n"
 msgstr ""
 
-#: readelf.c:1954
+#: readelf.c:1957
 msgid "  -s or --syms or --symbols Display the symbol table\n"
 msgstr ""
 
-#: readelf.c:1955
+#: readelf.c:1958
 msgid "  -n or --notes             Display the core notes (if present)\n"
 msgstr ""
 
-#: readelf.c:1956
+#: readelf.c:1959
 msgid "  -r or --relocs            Display the relocations (if present)\n"
 msgstr ""
 
-#: readelf.c:1957
+#: readelf.c:1960
 msgid "  -u or --unwind            Display the unwind info (if present)\n"
 msgstr ""
 
-#: readelf.c:1958
+#: readelf.c:1961
 msgid "  -d or --dynamic           Display the dynamic segment (if present)\n"
 msgstr ""
 
-#: readelf.c:1959
+#: readelf.c:1962
 msgid "  -V or --version-info      Display the version sections (if present)\n"
 msgstr ""
 
-#: readelf.c:1960
+#: readelf.c:1963
 msgid ""
 "  -A or --arch-specific     Display architecture specific information (if "
 "any).\n"
 msgstr ""
 
-#: readelf.c:1961
+#: readelf.c:1964
 msgid ""
 "  -D or --use-dynamic       Use the dynamic section info when displaying "
 "symbols\n"
 msgstr ""
 
-#: readelf.c:1962
+#: readelf.c:1965
 msgid "  -x <number> or --hex-dump=<number>\n"
 msgstr ""
 
-#: readelf.c:1963
+#: readelf.c:1966
 msgid "                            Dump the contents of section <number>\n"
 msgstr ""
 
-#: readelf.c:1964
+#: readelf.c:1967
 msgid ""
 "  -w[liaprf] or --debug-dump[=line,=info,=abbrev,=pubnames,=ranges,=frames]\n"
 msgstr ""
 
-#: readelf.c:1965
+#: readelf.c:1968
 msgid ""
 "                            Display the contents of DWARF2 debug sections\n"
 msgstr ""
 
-#: readelf.c:1967
+#: readelf.c:1970
 msgid "  -i <number> or --instruction-dump=<number>\n"
 msgstr ""
 
-#: readelf.c:1968
+#: readelf.c:1971
 msgid ""
 "                            Disassemble the contents of section <number>\n"
 msgstr ""
 
-#: readelf.c:1970
+#: readelf.c:1973
 msgid "  -I or --histogram         Display histogram of bucket list lengths\n"
 msgstr ""
 
-#: readelf.c:1971
+#: readelf.c:1974
 msgid "  -v or --version           Display the version number of readelf\n"
 msgstr ""
 
-#: readelf.c:1972
+#: readelf.c:1975
 msgid "  -H or --help              Display this information\n"
 msgstr ""
 
-#: readelf.c:1990
+#: readelf.c:1993
 msgid "Out of memory allocating dump request table."
 msgstr ""
 
-#: readelf.c:2134
+#: readelf.c:2137
 #, c-format
 msgid "Unrecognised debug option '%s'\n"
 msgstr ""
 
-#: readelf.c:2159
+#: readelf.c:2162
 #, c-format
 msgid "Invalid option '-%c'\n"
 msgstr ""
 
-#: readelf.c:2172
+#: readelf.c:2175
 msgid "Nothing to do.\n"
 msgstr ""
 
-#: readelf.c:2185 readelf.c:2202 readelf.c:4199
+#: readelf.c:2188 readelf.c:2205 readelf.c:4201
 msgid "none"
 msgstr ""
 
-#: readelf.c:2186
+#: readelf.c:2189
 msgid "ELF32"
 msgstr ""
 
-#: readelf.c:2187
+#: readelf.c:2190
 msgid "ELF64"
 msgstr ""
 
-#: readelf.c:2189 readelf.c:2206 readelf.c:2234
+#: readelf.c:2192 readelf.c:2209 readelf.c:2237
 #, c-format
 msgid "<unknown: %x>"
 msgstr ""
 
-#: readelf.c:2203
+#: readelf.c:2206
 msgid "2's complement, little endian"
 msgstr ""
 
-#: readelf.c:2204
+#: readelf.c:2207
 msgid "2's complement, big endian"
 msgstr ""
 
-#: readelf.c:2219
+#: readelf.c:2222
 msgid "UNIX - System V"
 msgstr ""
 
-#: readelf.c:2220
+#: readelf.c:2223
 msgid "UNIX - HP-UX"
 msgstr ""
 
-#: readelf.c:2221
+#: readelf.c:2224
 msgid "UNIX - NetBSD"
 msgstr ""
 
-#: readelf.c:2222
+#: readelf.c:2225
 msgid "UNIX - Linux"
 msgstr ""
 
-#: readelf.c:2223
+#: readelf.c:2226
 msgid "GNU/Hurd"
 msgstr ""
 
-#: readelf.c:2224
+#: readelf.c:2227
 msgid "UNIX - Solaris"
 msgstr ""
 
-#: readelf.c:2225
+#: readelf.c:2228
 msgid "UNIX - AIX"
 msgstr ""
 
-#: readelf.c:2226
+#: readelf.c:2229
 msgid "UNIX - IRIX"
 msgstr ""
 
-#: readelf.c:2227
+#: readelf.c:2230
 msgid "UNIX - FreeBSD"
 msgstr ""
 
-#: readelf.c:2228
+#: readelf.c:2231
 msgid "UNIX - TRU64"
 msgstr ""
 
-#: readelf.c:2229
+#: readelf.c:2232
 msgid "Novell - Modesto"
 msgstr ""
 
-#: readelf.c:2230
+#: readelf.c:2233
 msgid "UNIX - OpenBSD"
 msgstr ""
 
-#: readelf.c:2231
+#: readelf.c:2234
 msgid "Standalone App"
 msgstr ""
 
-#: readelf.c:2232
+#: readelf.c:2235
 msgid "ARM"
 msgstr ""
 
-#: readelf.c:2249
+#: readelf.c:2252
 msgid "Not an ELF file - it has the wrong magic bytes at the start\n"
 msgstr ""
 
-#: readelf.c:2257
+#: readelf.c:2260
 msgid "ELF Header:\n"
 msgstr ""
 
-#: readelf.c:2258
+#: readelf.c:2261
 msgid "  Magic:   "
 msgstr ""
 
-#: readelf.c:2262
+#: readelf.c:2265
 #, c-format
 msgid "  Class:                             %s\n"
 msgstr ""
 
-#: readelf.c:2264
+#: readelf.c:2267
 #, c-format
 msgid "  Data:                              %s\n"
 msgstr ""
 
-#: readelf.c:2266
+#: readelf.c:2269
 #, c-format
 msgid "  Version:                           %d %s\n"
 msgstr ""
 
-#: readelf.c:2273
+#: readelf.c:2276
 #, c-format
 msgid "  OS/ABI:                            %s\n"
 msgstr ""
 
-#: readelf.c:2275
+#: readelf.c:2278
 #, c-format
 msgid "  ABI Version:                       %d\n"
 msgstr ""
 
-#: readelf.c:2277
+#: readelf.c:2280
 #, c-format
 msgid "  Type:                              %s\n"
 msgstr ""
 
-#: readelf.c:2279
+#: readelf.c:2282
 #, c-format
 msgid "  Machine:                           %s\n"
 msgstr ""
 
-#: readelf.c:2281
+#: readelf.c:2284
 #, c-format
 msgid "  Version:                           0x%lx\n"
 msgstr ""
 
-#: readelf.c:2284
+#: readelf.c:2287
 msgid "  Entry point address:               "
 msgstr ""
 
-#: readelf.c:2286
+#: readelf.c:2289
 msgid ""
 "\n"
 "  Start of program headers:          "
 msgstr ""
 
-#: readelf.c:2288
+#: readelf.c:2291
 msgid ""
 " (bytes into file)\n"
 "  Start of section headers:          "
 msgstr ""
 
-#: readelf.c:2290
+#: readelf.c:2293
 msgid " (bytes into file)\n"
 msgstr ""
 
-#: readelf.c:2292
+#: readelf.c:2295
 #, c-format
 msgid "  Flags:                             0x%lx%s\n"
 msgstr ""
 
-#: readelf.c:2295
+#: readelf.c:2298
 #, c-format
 msgid "  Size of this header:               %ld (bytes)\n"
 msgstr ""
 
-#: readelf.c:2297
+#: readelf.c:2300
 #, c-format
 msgid "  Size of program headers:           %ld (bytes)\n"
 msgstr ""
 
-#: readelf.c:2299
+#: readelf.c:2302
 #, c-format
 msgid "  Number of program headers:         %ld\n"
 msgstr ""
 
-#: readelf.c:2301
+#: readelf.c:2304
 #, c-format
 msgid "  Size of section headers:           %ld (bytes)\n"
 msgstr ""
 
-#: readelf.c:2303
+#: readelf.c:2306
 #, c-format
 msgid "  Number of section headers:         %ld\n"
 msgstr ""
 
-#: readelf.c:2305
+#: readelf.c:2308
 #, c-format
 msgid "  Section header string table index: %ld\n"
 msgstr ""
 
-#: readelf.c:2390
+#: readelf.c:2393
 msgid ""
 "\n"
 "There are no program headers in this file.\n"
 msgstr ""
 
-#: readelf.c:2396
+#: readelf.c:2399
 #, c-format
 msgid ""
 "\n"
 "Elf file type is %s\n"
 msgstr ""
 
-#: readelf.c:2397
+#: readelf.c:2400
 msgid "Entry point "
 msgstr ""
 
-#: readelf.c:2399
+#: readelf.c:2402
 #, c-format
 msgid ""
 "\n"
 "There are %d program headers, starting at offset "
 msgstr ""
 
-#: readelf.c:2410 readelf.c:2586 readelf.c:2628 readelf.c:2671 readelf.c:2712
-#: readelf.c:3592 readelf.c:3633 readelf.c:3809 readelf.c:4730 readelf.c:4744
-#: readelf.c:8115 readelf.c:8155
+#: readelf.c:2413 readelf.c:2589 readelf.c:2631 readelf.c:2674 readelf.c:2715
+#: readelf.c:3594 readelf.c:3635 readelf.c:3811 readelf.c:4732 readelf.c:4746
+#: readelf.c:8117 readelf.c:8157
 msgid "Out of memory\n"
 msgstr ""
 
-#: readelf.c:2428
+#: readelf.c:2431
 #, c-format
 msgid ""
 "\n"
 "Program Header%s:\n"
 msgstr ""
 
-#: readelf.c:2432
+#: readelf.c:2435
 msgid ""
 "  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align\n"
 msgstr ""
 
-#: readelf.c:2436
+#: readelf.c:2439
 msgid "  Type           Offset             VirtAddr           PhysAddr\n"
 msgstr ""
 
-#: readelf.c:2438
+#: readelf.c:2441
 msgid "                 FileSiz            MemSiz              Flags  Align\n"
 msgstr ""
 
-#: readelf.c:2496
+#: readelf.c:2499
 msgid "more than one dynamic segment\n"
 msgstr ""
 
-#: readelf.c:2504
+#: readelf.c:2507
 msgid "Unable to find program interpreter name\n"
 msgstr ""
 
-#: readelf.c:2511
+#: readelf.c:2514
 #, c-format
 msgid ""
 "\n"
 "      [Requesting program interpreter: %s]"
 msgstr ""
 
-#: readelf.c:2529
+#: readelf.c:2532
 msgid ""
 "\n"
 " Section to Segment mapping:\n"
 msgstr ""
 
-#: readelf.c:2530
+#: readelf.c:2533
 msgid "  Segment Sections...\n"
 msgstr ""
 
-#: readelf.c:2794
+#: readelf.c:2797
 msgid ""
 "\n"
 "There are no sections in this file.\n"
 msgstr ""
 
-#: readelf.c:2800
+#: readelf.c:2803
 #, c-format
 msgid "There are %d section headers, starting at offset 0x%lx:\n"
 msgstr ""
 
-#: readelf.c:2838
+#: readelf.c:2841
 msgid "File contains multiple dynamic symbol tables\n"
 msgstr ""
 
-#: readelf.c:2851
+#: readelf.c:2854
 msgid "File contains multiple dynamic string tables\n"
 msgstr ""
 
-#: readelf.c:2885
+#: readelf.c:2888
 #, c-format
 msgid ""
 "\n"
 "Section Header%s:\n"
 msgstr ""
 
-#: readelf.c:2889
+#: readelf.c:2892
 msgid ""
 "  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk "
 "Inf Al\n"
 msgstr ""
 
-#: readelf.c:2892
+#: readelf.c:2895
 msgid "  [Nr] Name              Type             Address           Offset\n"
 msgstr ""
 
-#: readelf.c:2893
+#: readelf.c:2896
 msgid "       Size              EntSize          Flags  Link  Info  Align\n"
 msgstr ""
 
-#: readelf.c:2940
+#: readelf.c:2943
 msgid "Key to Flags:\n"
 msgstr ""
 
-#: readelf.c:2941
+#: readelf.c:2944
 msgid "  W (write), A (alloc), X (execute), M (merge), S (strings)\n"
 msgstr ""
 
-#: readelf.c:2942
+#: readelf.c:2945
 msgid "  I (info), L (link order), G (group), x (unknown)\n"
 msgstr ""
 
-#: readelf.c:2943
+#: readelf.c:2946
 msgid ""
 "  O (extra OS processing required) o (OS specific), p (processor specific)\n"
 msgstr ""
 
-#: readelf.c:3001
+#: readelf.c:3004
 #, c-format
 msgid ""
 "\n"
 "Relocation section at offset 0x%lx contains %ld bytes:\n"
 msgstr ""
 
-#: readelf.c:3008
+#: readelf.c:3011
 msgid ""
 "\n"
 "There are no dynamic relocations in this file.\n"
 msgstr ""
 
-#: readelf.c:3036
+#: readelf.c:3039
 msgid ""
 "\n"
 "Relocation section "
 msgstr ""
 
-#: readelf.c:3043 readelf.c:3414
+#: readelf.c:3046 readelf.c:3417
 #, c-format
 msgid " at offset 0x%lx contains %lu entries:\n"
 msgstr ""
 
-#: readelf.c:3071
+#: readelf.c:3074
 msgid ""
 "\n"
 "There are no relocations in this file.\n"
 msgstr ""
 
-#: readelf.c:3315 readelf.c:3327
+#: readelf.c:3318 readelf.c:3330
 #, c-format
 msgid "Skipping unexpected symbol type %u"
 msgstr ""
 
-#: readelf.c:3335
+#: readelf.c:3338
 #, c-format
 msgid "Skipping unexpected relocation type %s"
 msgstr ""
 
-#: readelf.c:3407
+#: readelf.c:3410
 msgid ""
 "\n"
 "Unwind section "
 msgstr ""
 
-#: readelf.c:3423
+#: readelf.c:3426
 msgid ""
 "\n"
 "There are no unwind sections in this file.\n"
 msgstr ""
 
-#: readelf.c:3686
+#: readelf.c:3688
 msgid ""
 "\n"
 "There is no dynamic segment in this file.\n"
 msgstr ""
 
-#: readelf.c:3720
+#: readelf.c:3722
 msgid "Unable to seek to end of file!"
 msgstr ""
 
-#: readelf.c:3729
+#: readelf.c:3731
 msgid "Unable to determine the number of symbols to load\n"
 msgstr ""
 
-#: readelf.c:3759
+#: readelf.c:3761
 msgid "Unable to seek to end of file\n"
 msgstr ""
 
-#: readelf.c:3765
+#: readelf.c:3767
 msgid "Unable to determine the length of the dynamic string table\n"
 msgstr ""
 
-#: readelf.c:3826
+#: readelf.c:3828
 #, c-format
 msgid ""
 "\n"
 "Dynamic segment at offset 0x%x contains %ld entries:\n"
 msgstr ""
 
-#: readelf.c:3829
+#: readelf.c:3831
 msgid "  Tag        Type                         Name/Value\n"
 msgstr ""
 
-#: readelf.c:3865
+#: readelf.c:3867
 msgid "Auxiliary library"
 msgstr ""
 
-#: readelf.c:3869
+#: readelf.c:3871
 msgid "Filter library"
 msgstr ""
 
-#: readelf.c:3873
+#: readelf.c:3875
 msgid "Configuration file"
 msgstr ""
 
-#: readelf.c:3877
+#: readelf.c:3879
 msgid "Dependency audit library"
 msgstr ""
 
-#: readelf.c:3881
+#: readelf.c:3883
 msgid "Audit library"
 msgstr ""
 
-#: readelf.c:3899 readelf.c:3925 readelf.c:3951
+#: readelf.c:3901 readelf.c:3927 readelf.c:3953
 msgid "Flags:"
 msgstr ""
 
-#: readelf.c:3901 readelf.c:3927 readelf.c:3953
+#: readelf.c:3903 readelf.c:3929 readelf.c:3955
 msgid " None\n"
 msgstr ""
 
-#: readelf.c:4072
+#: readelf.c:4074
 #, c-format
 msgid "Shared library: [%s]"
 msgstr ""
 
-#: readelf.c:4075
+#: readelf.c:4077
 msgid " program interpreter"
 msgstr ""
 
-#: readelf.c:4079
+#: readelf.c:4081
 #, c-format
 msgid "Library soname: [%s]"
 msgstr ""
 
-#: readelf.c:4083
+#: readelf.c:4085
 #, c-format
 msgid "Library rpath: [%s]"
 msgstr ""
 
-#: readelf.c:4087
+#: readelf.c:4089
 #, c-format
 msgid "Library runpath: [%s]"
 msgstr ""
 
-#: readelf.c:4148
+#: readelf.c:4150
 #, c-format
 msgid "Not needed object: [%s]\n"
 msgstr ""
 
-#: readelf.c:4245
+#: readelf.c:4247
 #, c-format
 msgid ""
 "\n"
 "Version definition section '%s' contains %ld entries:\n"
 msgstr ""
 
-#: readelf.c:4248
+#: readelf.c:4250
 msgid "  Addr: 0x"
 msgstr ""
 
-#: readelf.c:4250 readelf.c:4438
+#: readelf.c:4252 readelf.c:4440
 #, c-format
 msgid "  Offset: %#08lx  Link: %lx (%s)\n"
 msgstr ""
 
-#: readelf.c:4280
+#: readelf.c:4282
 #, c-format
 msgid "  %#06x: Rev: %d  Flags: %s"
 msgstr ""
 
-#: readelf.c:4283
+#: readelf.c:4285
 #, c-format
 msgid "  Index: %d  Cnt: %d  "
 msgstr ""
 
-#: readelf.c:4294
+#: readelf.c:4296
 #, c-format
 msgid "Name: %s\n"
 msgstr ""
 
-#: readelf.c:4296
+#: readelf.c:4298
 #, c-format
 msgid "Name index: %ld\n"
 msgstr ""
 
-#: readelf.c:4311
+#: readelf.c:4313
 #, c-format
 msgid "  %#06x: Parent %d: %s\n"
 msgstr ""
 
-#: readelf.c:4314
+#: readelf.c:4316
 #, c-format
 msgid "  %#06x: Parent %d, name index: %ld\n"
 msgstr ""
 
-#: readelf.c:4333
+#: readelf.c:4335
 #, c-format
 msgid ""
 "\n"
 "Version needs section '%s' contains %ld entries:\n"
 msgstr ""
 
-#: readelf.c:4336
+#: readelf.c:4338
 msgid " Addr: 0x"
 msgstr ""
 
-#: readelf.c:4338
+#: readelf.c:4340
 #, c-format
 msgid "  Offset: %#08lx  Link to section: %ld (%s)\n"
 msgstr ""
 
-#: readelf.c:4364
+#: readelf.c:4366
 #, c-format
 msgid "  %#06x: Version: %d"
 msgstr ""
 
-#: readelf.c:4367
+#: readelf.c:4369
 #, c-format
 msgid "  File: %s"
 msgstr ""
 
-#: readelf.c:4369
+#: readelf.c:4371
 #, c-format
 msgid "  File: %lx"
 msgstr ""
 
-#: readelf.c:4371
+#: readelf.c:4373
 #, c-format
 msgid "  Cnt: %d\n"
 msgstr ""
 
-#: readelf.c:4389
+#: readelf.c:4391
 #, c-format
 msgid "  %#06x: Name: %s"
 msgstr ""
 
-#: readelf.c:4392
+#: readelf.c:4394
 #, c-format
 msgid "  %#06x: Name index: %lx"
 msgstr ""
 
-#: readelf.c:4395
+#: readelf.c:4397
 #, c-format
 msgid "  Flags: %s  Version: %d\n"
 msgstr ""
 
-#: readelf.c:4433
+#: readelf.c:4435
 #, c-format
 msgid ""
 "\n"
 "Version symbols section '%s' contains %d entries:\n"
 msgstr ""
 
-#: readelf.c:4436
+#: readelf.c:4438
 msgid " Addr: "
 msgstr ""
 
-#: readelf.c:4467
+#: readelf.c:4469
 msgid "   0 (*local*)    "
 msgstr ""
 
-#: readelf.c:4471
+#: readelf.c:4473
 msgid "   1 (*global*)   "
 msgstr ""
 
-#: readelf.c:4605
+#: readelf.c:4607
 msgid ""
 "\n"
 "No version information found in this file.\n"
 msgstr ""
 
-#: readelf.c:4623 readelf.c:4658
+#: readelf.c:4625 readelf.c:4660
 #, c-format
 msgid "<processor specific>: %d"
 msgstr ""
 
-#: readelf.c:4625 readelf.c:4670
+#: readelf.c:4627 readelf.c:4672
 #, c-format
 msgid "<OS specific>: %d"
 msgstr ""
 
-#: readelf.c:4627 readelf.c:4673
+#: readelf.c:4629 readelf.c:4675
 #, c-format
 msgid "<unknown>: %d"
 msgstr ""
 
-#: readelf.c:4736
+#: readelf.c:4738
 msgid "Unable to read in dynamic data\n"
 msgstr ""
 
-#: readelf.c:4778
+#: readelf.c:4780
 msgid "Unable to seek to start of dynamic information"
 msgstr ""
 
-#: readelf.c:4784
+#: readelf.c:4786
 msgid "Failed to read in number of buckets\n"
 msgstr ""
 
-#: readelf.c:4790
+#: readelf.c:4792
 msgid "Failed to read in number of chains\n"
 msgstr ""
 
-#: readelf.c:4810
+#: readelf.c:4812
 msgid ""
 "\n"
 "Symbol table for image:\n"
 msgstr ""
 
-#: readelf.c:4812
+#: readelf.c:4814
 msgid "  Num Buc:    Value  Size   Type   Bind Vis      Ndx Name\n"
 msgstr ""
 
-#: readelf.c:4814
+#: readelf.c:4816
 msgid "  Num Buc:    Value          Size   Type   Bind Vis      Ndx Name\n"
 msgstr ""
 
-#: readelf.c:4858
+#: readelf.c:4860
 #, c-format
 msgid ""
 "\n"
 "Symbol table '%s' contains %lu entries:\n"
 msgstr ""
 
-#: readelf.c:4862
+#: readelf.c:4864
 msgid "   Num:    Value  Size Type    Bind   Vis      Ndx Name\n"
 msgstr ""
 
-#: readelf.c:4864
+#: readelf.c:4866
 msgid "   Num:    Value          Size Type    Bind   Vis      Ndx Name\n"
 msgstr ""
 
-#: readelf.c:4974
+#: readelf.c:4976
 msgid "bad dynamic symbol"
 msgstr ""
 
-#: readelf.c:5034
+#: readelf.c:5036
 msgid ""
 "\n"
 "Dynamic symbol information is not available for displaying symbols.\n"
 msgstr ""
 
-#: readelf.c:5046
+#: readelf.c:5048
 #, c-format
 msgid ""
 "\n"
 "Histogram for bucket list length (total of %d buckets):\n"
 msgstr ""
 
-#: readelf.c:5048
+#: readelf.c:5050
 msgid " Length  Number     %% of total  Coverage\n"
 msgstr ""
 
-#: readelf.c:5053 readelf.c:5072 readelf.c:7797 readelf.c:7990
+#: readelf.c:5055 readelf.c:5074 readelf.c:7799 readelf.c:7992
 msgid "Out of memory"
 msgstr ""
 
-#: readelf.c:5121
+#: readelf.c:5123
 #, c-format
 msgid ""
 "\n"
 "Dynamic info segment at offset 0x%lx contains %d entries:\n"
 msgstr ""
 
-#: readelf.c:5124
+#: readelf.c:5126
 msgid " Num: Name                           BoundTo     Flags\n"
 msgstr ""
 
-#: readelf.c:5172
+#: readelf.c:5174
 #, c-format
 msgid ""
 "\n"
 "Assembly dump of section %s\n"
 msgstr ""
 
-#: readelf.c:5195
+#: readelf.c:5197
 #, c-format
 msgid ""
 "\n"
 "Section '%s' has no data to dump.\n"
 msgstr ""
 
-#: readelf.c:5200
+#: readelf.c:5202
 #, c-format
 msgid ""
 "\n"
 "Hex dump of section '%s':\n"
 msgstr ""
 
-#: readelf.c:5352
+#: readelf.c:5354
 msgid "badly formed extended line op encountered!"
 msgstr ""
 
-#: readelf.c:5359
+#: readelf.c:5361
 #, c-format
 msgid "  Extended opcode %d: "
 msgstr ""
 
-#: readelf.c:5364
+#: readelf.c:5366
 msgid ""
 "End of Sequence\n"
 "\n"
 msgstr ""
 
-#: readelf.c:5370
+#: readelf.c:5372
 #, c-format
 msgid "set Address to 0x%lx\n"
 msgstr ""
 
-#: readelf.c:5375
+#: readelf.c:5377
 msgid "  define new File Table entry\n"
 msgstr ""
 
-#: readelf.c:5376 readelf.c:5498
+#: readelf.c:5378 readelf.c:5500
 msgid "  Entry\tDir\tTime\tSize\tName\n"
 msgstr ""
 
-#: readelf.c:5378
+#: readelf.c:5380
 #, c-format
 msgid "   %d\t"
 msgstr ""
 
-#: readelf.c:5381 readelf.c:5383 readelf.c:5385 readelf.c:5510 readelf.c:5512
-#: readelf.c:5514
+#: readelf.c:5383 readelf.c:5385 readelf.c:5387 readelf.c:5512 readelf.c:5514
+#: readelf.c:5516
 #, c-format
 msgid "%lu\t"
 msgstr ""
 
-#: readelf.c:5386
+#: readelf.c:5388
 #, c-format
 msgid ""
 "%s\n"
 "\n"
 msgstr ""
 
-#: readelf.c:5390
+#: readelf.c:5392
 #, c-format
 msgid "UNKNOWN: length %d\n"
 msgstr ""
 
-#: readelf.c:5416
+#: readelf.c:5418
 #, c-format
 msgid ""
 "\n"
@@ -3011,503 +3011,503 @@ msgid ""
 "\n"
 msgstr ""
 
-#: readelf.c:5428
+#: readelf.c:5430
 msgid "The line info appears to be corrupt - the section is too small\n"
 msgstr ""
 
-#: readelf.c:5436
+#: readelf.c:5438
 msgid "Only DWARF version 2 line info is currently supported.\n"
 msgstr ""
 
-#: readelf.c:5451
+#: readelf.c:5453
 #, c-format
 msgid "  Length:                      %ld\n"
 msgstr ""
 
-#: readelf.c:5452
+#: readelf.c:5454
 #, c-format
 msgid "  DWARF Version:               %d\n"
 msgstr ""
 
-#: readelf.c:5453
+#: readelf.c:5455
 #, c-format
 msgid "  Prolgue Length:              %d\n"
 msgstr ""
 
-#: readelf.c:5454
+#: readelf.c:5456
 #, c-format
 msgid "  Minimum Instruction Length:  %d\n"
 msgstr ""
 
-#: readelf.c:5455
+#: readelf.c:5457
 #, c-format
 msgid "  Initial value of 'is_stmt':  %d\n"
 msgstr ""
 
-#: readelf.c:5456
+#: readelf.c:5458
 #, c-format
 msgid "  Line Base:                   %d\n"
 msgstr ""
 
-#: readelf.c:5457
+#: readelf.c:5459
 #, c-format
 msgid "  Line Range:                  %d\n"
 msgstr ""
 
-#: readelf.c:5458
+#: readelf.c:5460
 #, c-format
 msgid "  Opcode Base:                 %d\n"
 msgstr ""
 
-#: readelf.c:5467
+#: readelf.c:5469
 msgid ""
 "\n"
 " Opcodes:\n"
 msgstr ""
 
-#: readelf.c:5470
+#: readelf.c:5472
 #, c-format
 msgid "  Opcode %d has %d args\n"
 msgstr ""
 
-#: readelf.c:5476
+#: readelf.c:5478
 msgid ""
 "\n"
 " The Directory Table is empty.\n"
 msgstr ""
 
-#: readelf.c:5479
+#: readelf.c:5481
 msgid ""
 "\n"
 " The Directory Table:\n"
 msgstr ""
 
-#: readelf.c:5483
+#: readelf.c:5485
 #, c-format
 msgid "  %s\n"
 msgstr ""
 
-#: readelf.c:5494
+#: readelf.c:5496
 msgid ""
 "\n"
 " The File Name Table is empty.\n"
 msgstr ""
 
-#: readelf.c:5497
+#: readelf.c:5499
 msgid ""
 "\n"
 " The File Name Table:\n"
 msgstr ""
 
-#: readelf.c:5505
+#: readelf.c:5507
 #, c-format
 msgid "  %d\t"
 msgstr ""
 
-#: readelf.c:5516
+#: readelf.c:5518
 #, c-format
 msgid "%s\n"
 msgstr ""
 
 #. Now display the statements.
-#: readelf.c:5524
+#: readelf.c:5526
 msgid ""
 "\n"
 " Line Number Statements:\n"
 msgstr ""
 
-#: readelf.c:5543
+#: readelf.c:5545
 msgid "  Copy\n"
 msgstr ""
 
-#: readelf.c:5550
+#: readelf.c:5552
 #, c-format
 msgid "  Advance PC by %d to %lx\n"
 msgstr ""
 
-#: readelf.c:5558
+#: readelf.c:5560
 #, c-format
 msgid "  Advance Line by %d to %d\n"
 msgstr ""
 
-#: readelf.c:5565
+#: readelf.c:5567
 #, c-format
 msgid "  Set File Name to entry %d in the File Name Table\n"
 msgstr ""
 
-#: readelf.c:5573
+#: readelf.c:5575
 #, c-format
 msgid "  Set column to %d\n"
 msgstr ""
 
-#: readelf.c:5580
+#: readelf.c:5582
 #, c-format
 msgid "  Set is_stmt to %d\n"
 msgstr ""
 
-#: readelf.c:5585
+#: readelf.c:5587
 msgid "  Set basic block\n"
 msgstr ""
 
-#: readelf.c:5593
+#: readelf.c:5595
 #, c-format
 msgid "  Advance PC by constant %d to 0x%lx\n"
 msgstr ""
 
-#: readelf.c:5601
+#: readelf.c:5603
 #, c-format
 msgid "  Advance PC by fixed size amount %d to 0x%lx\n"
 msgstr ""
 
-#: readelf.c:5609
+#: readelf.c:5611
 #, c-format
 msgid "  Special opcode %d: advance Address by %d to 0x%lx"
 msgstr ""
 
-#: readelf.c:5613
+#: readelf.c:5615
 #, c-format
 msgid " and Line by %d to %d\n"
 msgstr ""
 
-#: readelf.c:5636 readelf.c:6065
+#: readelf.c:5638 readelf.c:6067
 #, c-format
 msgid ""
 "Contents of the %s section:\n"
 "\n"
 msgstr ""
 
-#: readelf.c:5659
+#: readelf.c:5661
 msgid "Only DWARF 2 pubnames are currently supported\n"
 msgstr ""
 
-#: readelf.c:5666
+#: readelf.c:5668
 #, c-format
 msgid "  Length:                              %ld\n"
 msgstr ""
 
-#: readelf.c:5668
+#: readelf.c:5670
 #, c-format
 msgid "  Version:                             %d\n"
 msgstr ""
 
-#: readelf.c:5670
+#: readelf.c:5672
 #, c-format
 msgid "  Offset into .debug_info section:     %ld\n"
 msgstr ""
 
-#: readelf.c:5672
+#: readelf.c:5674
 #, c-format
 msgid "  Size of area in .debug_info section: %ld\n"
 msgstr ""
 
-#: readelf.c:5675
+#: readelf.c:5677
 msgid ""
 "\n"
 "    Offset\tName\n"
 msgstr ""
 
-#: readelf.c:5757
+#: readelf.c:5759
 #, c-format
 msgid "Unknown TAG value: %lx"
 msgstr ""
 
-#: readelf.c:5852
+#: readelf.c:5854
 #, c-format
 msgid "Unknown AT value: %lx"
 msgstr ""
 
-#: readelf.c:5889
+#: readelf.c:5891
 #, c-format
 msgid "Unknown FORM value: %lx"
 msgstr ""
 
-#: readelf.c:6071
+#: readelf.c:6073
 msgid "  Number TAG\n"
 msgstr ""
 
-#: readelf.c:6077
+#: readelf.c:6079
 #, c-format
 msgid "   %ld      %s    [%s]\n"
 msgstr ""
 
-#: readelf.c:6080
+#: readelf.c:6082
 msgid "has children"
 msgstr ""
 
-#: readelf.c:6080
+#: readelf.c:6082
 msgid "no children"
 msgstr ""
 
-#: readelf.c:6084
+#: readelf.c:6086
 #, c-format
 msgid "    %-18s %s\n"
 msgstr ""
 
-#: readelf.c:6103
+#: readelf.c:6105
 #, c-format
 msgid " %lu byte block: "
 msgstr ""
 
-#: readelf.c:6410
+#: readelf.c:6412
 msgid "(User defined location op)"
 msgstr ""
 
-#: readelf.c:6412
+#: readelf.c:6414
 msgid "(Unknown location op)"
 msgstr ""
 
-#: readelf.c:6539
+#: readelf.c:6541
 #, c-format
 msgid "Unable to handle FORM: %d"
 msgstr ""
 
-#: readelf.c:6543
+#: readelf.c:6545
 #, c-format
 msgid "Unrecognised form: %d"
 msgstr ""
 
-#: readelf.c:6556
+#: readelf.c:6558
 msgid "(not inlined)"
 msgstr ""
 
-#: readelf.c:6557
+#: readelf.c:6559
 msgid "(inlined)"
 msgstr ""
 
-#: readelf.c:6558
+#: readelf.c:6560
 msgid "(declared as inline but ignored)"
 msgstr ""
 
-#: readelf.c:6559
+#: readelf.c:6561
 msgid "(declared as inline and inlined)"
 msgstr ""
 
-#: readelf.c:6560
+#: readelf.c:6562
 #, c-format
 msgid "  (Unknown inline attribute value: %lx)"
 msgstr ""
 
-#: readelf.c:6689 readelf.c:6815
+#: readelf.c:6691 readelf.c:6817
 #, c-format
 msgid ""
 "The section %s contains:\n"
 "\n"
 msgstr ""
 
-#: readelf.c:6711
+#: readelf.c:6713
 #, c-format
 msgid "  Compilation Unit @ %lx:\n"
 msgstr ""
 
-#: readelf.c:6712
+#: readelf.c:6714
 #, c-format
 msgid "   Length:        %ld\n"
 msgstr ""
 
-#: readelf.c:6713
+#: readelf.c:6715
 #, c-format
 msgid "   Version:       %d\n"
 msgstr ""
 
-#: readelf.c:6714
+#: readelf.c:6716
 #, c-format
 msgid "   Abbrev Offset: %ld\n"
 msgstr ""
 
-#: readelf.c:6715
+#: readelf.c:6717
 #, c-format
 msgid "   Pointer Size:  %d\n"
 msgstr ""
 
-#: readelf.c:6719
+#: readelf.c:6721
 msgid "Only version 2 DWARF debug information is currently supported.\n"
 msgstr ""
 
-#: readelf.c:6741
+#: readelf.c:6743
 msgid "Unable to locate .debug_abbrev section!\n"
 msgstr ""
 
-#: readelf.c:6781
+#: readelf.c:6783
 #, c-format
 msgid "Unable to locate entry %lu in the abbreviation table\n"
 msgstr ""
 
-#: readelf.c:6786
+#: readelf.c:6788
 #, c-format
 msgid " <%d><%x>: Abbrev Number: %lu (%s)\n"
 msgstr ""
 
-#: readelf.c:6836
+#: readelf.c:6838
 msgid "Only DWARF 2 aranges are currently supported.\n"
 msgstr ""
 
-#: readelf.c:6840
+#: readelf.c:6842
 #, c-format
 msgid "  Length:                   %ld\n"
 msgstr ""
 
-#: readelf.c:6841
+#: readelf.c:6843
 #, c-format
 msgid "  Version:                  %d\n"
 msgstr ""
 
-#: readelf.c:6842
+#: readelf.c:6844
 #, c-format
 msgid "  Offset into .debug_info:  %lx\n"
 msgstr ""
 
-#: readelf.c:6843
+#: readelf.c:6845
 #, c-format
 msgid "  Pointer Size:             %d\n"
 msgstr ""
 
-#: readelf.c:6844
+#: readelf.c:6846
 #, c-format
 msgid "  Segment Size:             %d\n"
 msgstr ""
 
-#: readelf.c:6846
+#: readelf.c:6848
 msgid ""
 "\n"
 "    Address  Length\n"
 msgstr ""
 
-#: readelf.c:7008
+#: readelf.c:7010
 #, c-format
 msgid "The section %s contains:\n"
 msgstr ""
 
-#: readelf.c:7483
+#: readelf.c:7485
 #, c-format
 msgid "Displaying the debug contents of section %s is not yet supported.\n"
 msgstr ""
 
-#: readelf.c:7547
+#: readelf.c:7549
 #, c-format
 msgid ""
 "\n"
 "Section '%s' has no debugging data.\n"
 msgstr ""
 
-#: readelf.c:7566
+#: readelf.c:7568
 #, c-format
 msgid "Unrecognised debug section: %s\n"
 msgstr ""
 
-#: readelf.c:7638
+#: readelf.c:7640
 msgid "Some sections were not dumped because they do not exist!\n"
 msgstr ""
 
-#: readelf.c:7821
+#: readelf.c:7823
 #, c-format
 msgid ""
 "\n"
 "Section '%s' contains %d entries:\n"
 msgstr ""
 
-#: readelf.c:7983
+#: readelf.c:7985
 msgid "conflict list with without table"
 msgstr ""
 
-#: readelf.c:8011
+#: readelf.c:8013
 #, c-format
 msgid ""
 "\n"
 "Section '.conflict' contains %d entries:\n"
 msgstr ""
 
-#: readelf.c:8012
+#: readelf.c:8014
 msgid "  Num:    Index       Value  Name"
 msgstr ""
 
-#: readelf.c:8037
+#: readelf.c:8039
 msgid "NT_PRSTATUS (prstatus structure)"
 msgstr ""
 
-#: readelf.c:8038
+#: readelf.c:8040
 msgid "NT_FPREGSET (floating point registers)"
 msgstr ""
 
-#: readelf.c:8039
+#: readelf.c:8041
 msgid "NT_PRPSINFO (prpsinfo structure)"
 msgstr ""
 
-#: readelf.c:8040
+#: readelf.c:8042
 msgid "NT_TASKSTRUCT (task structure)"
 msgstr ""
 
-#: readelf.c:8041
+#: readelf.c:8043
 msgid "NT_PRXFPREG (user_xfpregs structure)"
 msgstr ""
 
-#: readelf.c:8042
+#: readelf.c:8044
 msgid "NT_PSTATUS (pstatus structure)"
 msgstr ""
 
-#: readelf.c:8043
+#: readelf.c:8045
 msgid "NT_FPREGS (floating point registers)"
 msgstr ""
 
-#: readelf.c:8044
+#: readelf.c:8046
 msgid "NT_PSINFO (psinfo structure)"
 msgstr ""
 
-#: readelf.c:8045
+#: readelf.c:8047
 msgid "NT_LWPSTATUS (lwpstatus_t structure)"
 msgstr ""
 
-#: readelf.c:8046
+#: readelf.c:8048
 msgid "NT_LWPSINFO (lwpsinfo_t structure)"
 msgstr ""
 
-#: readelf.c:8047
+#: readelf.c:8049
 msgid "NT_WIN32PSTATUS (win32_pstatus strcuture)"
 msgstr ""
 
-#: readelf.c:8049
+#: readelf.c:8051
 #, c-format
 msgid "Unknown note type: (0x%08x)"
 msgstr ""
 
-#: readelf.c:8087
+#: readelf.c:8089
 #, c-format
 msgid ""
 "\n"
 "Notes at offset 0x%08lx with length 0x%08lx:\n"
 msgstr ""
 
-#: readelf.c:8089
+#: readelf.c:8091
 msgid "  Owner\t\tData size\tDescription\n"
 msgstr ""
 
-#: readelf.c:8200
+#: readelf.c:8202
 msgid "No note segments present in the core file.\n"
 msgstr ""
 
-#: readelf.c:8278
+#: readelf.c:8280
 msgid "This instance of readelf has been built without support for a\n"
 msgstr ""
 
-#: readelf.c:8279
+#: readelf.c:8281
 msgid "64 bit data type and so it cannot read 64 bit ELF files.\n"
 msgstr ""
 
-#: readelf.c:8314
+#: readelf.c:8316
 #, c-format
 msgid "Cannot stat input file %s.\n"
 msgstr ""
 
-#: readelf.c:8321
+#: readelf.c:8323
 #, c-format
 msgid "Input file %s not found.\n"
 msgstr ""
 
-#: readelf.c:8327
+#: readelf.c:8329
 #, c-format
 msgid "%s: Failed to read file header\n"
 msgstr ""
 
-#: readelf.c:8341
+#: readelf.c:8343
 #, c-format
 msgid ""
 "\n"
index 51668a7229a564bd41dec20eaaef69d6996e3aaf..d76e649e224ccd737d52a4d0276ce286baacf109 100644 (file)
@@ -1,6 +1,6 @@
 The section .debug_info contains:
 
-  Compilation Unit:
+  Compilation Unit @ .*:
    Length:        .*
    Version:       2
    Abbrev Offset: 0
index d30ad8ab0ab47e248966fc62da1e85a263b90894..deb17cb0a160221cdc029cf4e74f771b39a16d3e 100644 (file)
@@ -1,3 +1,14 @@
+2001-02-18  lars brinkhoff  <lars@nocrew.org>
+
+       * Makefile.am: Add PDP-11 target.
+       * configure.in: Likewise.
+       * config/tc-pdp11.c: New file.
+       * config/tc-pdp11.h: New file.
+       * doc/Makefile.am: Add PDP-11 documentation.
+       * doc/all.texi: Likewise.
+       * doc/as.texinfo: Likewise.
+       * doc/c-pdp11.texi: New file.
+
 2001-02-16  matthew green  <mrg@redhat.com>
 
        * gas/cgen.c (gas_cgen_md_apply_fix3): Support BFD_RELOC_64.
index f6702b2ae6dd73da3227a8438593ee7f01d19567..84b4317a1a6726d5f6cee411a290848044709e9a 100644 (file)
@@ -63,6 +63,7 @@ CPU_TYPES = \
        mn10200 \
        mn10300 \
        ns32k \
+       pdp11 \
        pj \
        ppc \
        s390 \
@@ -78,7 +79,7 @@ CPU_TYPES = \
        z8k
 
 # Object format types.  This is only used for dependency information.
-# We deliberately omit som, since it does not work as a cross assembler.
+# We deliberately omit some, since it does not work as a cross assembler.
 
 OBJ_FORMATS = \
        aout \
@@ -101,7 +102,7 @@ CPU_OBJ_VALID = \
        case $$o in \
        aout) \
          case $$c in \
-         a29k | arm | cris | i386 | m68k | mips | ns32k | sparc | tahoe | tic30 | vax) \
+         a29k | arm | cris | i386 | m68k | mips | ns32k | pdp11 | sparc | tahoe | tic30 | vax) \
            valid=yes ;; \
          esac ;; \
        bout) \
@@ -245,6 +246,7 @@ TARGET_CPU_CFILES = \
        config/tc-mn10200.c \
        config/tc-mn10300.c \
        config/tc-ns32k.c \
+       config/tc-pdp11.c \
        config/tc-pj.c \
        config/tc-ppc.c \
        config/tc-s390.c \
@@ -286,6 +288,7 @@ TARGET_CPU_HFILES = \
        config/tc-mn10200.h \
        config/tc-mn10300.h \
        config/tc-ns32k.h \
+       config/tc-pdp11.h \
        config/tc-pj.h \
        config/tc-ppc.h \
        config/tc-s390.h \
@@ -1169,6 +1172,9 @@ DEPTC_ns32k_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \
   $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \
   $(INCDIR)/bfdlink.h $(srcdir)/config/tc-ns32k.h $(INCDIR)/opcode/ns32k.h \
   $(INCDIR)/obstack.h
+DEPTC_pdp11_aout = $(srcdir)/config/obj-aout.h $(srcdir)/config/tc-pdp11.h \
+  $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h $(INCDIR)/obstack.h \
+  $(INCDIR)/opcode/pdp11.h
 DEPTC_pj_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-pj.h \
   $(INCDIR)/coff/internal.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h \
   $(INCDIR)/opcode/pj.h
@@ -1500,6 +1506,9 @@ DEPOBJ_ns32k_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \
   $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \
   $(INCDIR)/bfdlink.h $(srcdir)/config/tc-ns32k.h subsegs.h \
   $(INCDIR)/obstack.h $(INCDIR)/aout/aout64.h
+DEPOBJ_pdp11_aout = $(srcdir)/config/obj-aout.h $(srcdir)/config/tc-pdp11.h \
+  $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h $(INCDIR)/aout/aout64.h \
+  $(INCDIR)/obstack.h
 DEPOBJ_pj_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-pj.h \
   $(INCDIR)/coff/internal.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h \
   $(INCDIR)/obstack.h subsegs.h
@@ -1773,6 +1782,8 @@ DEP_ns32k_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-ns32k.h \
 DEP_ns32k_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \
   $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \
   $(INCDIR)/bfdlink.h $(srcdir)/config/tc-ns32k.h
+DEP_pdp11_aout = $(srcdir)/config/obj-aout.h $(srcdir)/config/tc-pdp11.h \
+  $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h
 DEP_pj_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-pj.h \
   $(INCDIR)/coff/internal.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h
 DEP_pj_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \
index 493fb0ac53f2b33cbc19b23a6d6eb3fc3ae573cf..fd9b1e93ace87e1a9e96e70c64b8d5317a5b5c26 100644 (file)
@@ -174,6 +174,7 @@ CPU_TYPES = \
        mn10200 \
        mn10300 \
        ns32k \
+       pdp11 \
        pj \
        ppc \
        s390 \
@@ -190,7 +191,7 @@ CPU_TYPES = \
 
 
 # Object format types.  This is only used for dependency information.
-# We deliberately omit som, since it does not work as a cross assembler.
+# We deliberately omit some, since it does not work as a cross assembler.
 
 OBJ_FORMATS = \
        aout \
@@ -214,7 +215,7 @@ CPU_OBJ_VALID = \
        case $$o in \
        aout) \
          case $$c in \
-         a29k | arm | cris | i386 | m68k | mips | ns32k | sparc | tahoe | tic30 | vax) \
+         a29k | arm | cris | i386 | m68k | mips | ns32k | pdp11 | sparc | tahoe | tic30 | vax) \
            valid=yes ;; \
          esac ;; \
        bout) \
@@ -362,6 +363,7 @@ TARGET_CPU_CFILES = \
        config/tc-mn10200.c \
        config/tc-mn10300.c \
        config/tc-ns32k.c \
+       config/tc-pdp11.c \
        config/tc-pj.c \
        config/tc-ppc.c \
        config/tc-s390.c \
@@ -404,6 +406,7 @@ TARGET_CPU_HFILES = \
        config/tc-mn10200.h \
        config/tc-mn10300.h \
        config/tc-ns32k.h \
+       config/tc-pdp11.h \
        config/tc-pj.h \
        config/tc-ppc.h \
        config/tc-s390.h \
@@ -938,6 +941,10 @@ DEPTC_ns32k_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \
   $(INCDIR)/bfdlink.h $(srcdir)/config/tc-ns32k.h $(INCDIR)/opcode/ns32k.h \
   $(INCDIR)/obstack.h
 
+DEPTC_pdp11_aout = $(srcdir)/config/obj-aout.h $(srcdir)/config/tc-pdp11.h \
+  $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h $(INCDIR)/obstack.h \
+  $(INCDIR)/opcode/pdp11.h
+
 DEPTC_pj_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-pj.h \
   $(INCDIR)/coff/internal.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h \
   $(INCDIR)/opcode/pj.h
@@ -1363,6 +1370,10 @@ DEPOBJ_ns32k_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \
   $(INCDIR)/bfdlink.h $(srcdir)/config/tc-ns32k.h subsegs.h \
   $(INCDIR)/obstack.h $(INCDIR)/aout/aout64.h
 
+DEPOBJ_pdp11_aout = $(srcdir)/config/obj-aout.h $(srcdir)/config/tc-pdp11.h \
+  $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h $(INCDIR)/aout/aout64.h \
+  $(INCDIR)/obstack.h
+
 DEPOBJ_pj_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-pj.h \
   $(INCDIR)/coff/internal.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h \
   $(INCDIR)/obstack.h subsegs.h
@@ -1729,6 +1740,9 @@ DEP_ns32k_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \
   $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \
   $(INCDIR)/bfdlink.h $(srcdir)/config/tc-ns32k.h
 
+DEP_pdp11_aout = $(srcdir)/config/obj-aout.h $(srcdir)/config/tc-pdp11.h \
+  $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h
+
 DEP_pj_coff = $(srcdir)/config/obj-coff.h $(srcdir)/config/tc-pj.h \
   $(INCDIR)/coff/internal.h $(BFDDIR)/libcoff.h $(INCDIR)/bfdlink.h
 
diff --git a/gas/config/tc-pdp11.c b/gas/config/tc-pdp11.c
new file mode 100644 (file)
index 0000000..6935bce
--- /dev/null
@@ -0,0 +1,1618 @@
+/* tc-pdp11.c - pdp11-specific -
+   Copyright (C) 2001 Free Software Foundation, Inc.
+
+   This file is part of GAS, the GNU Assembler.
+
+   GAS is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   GAS is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with GAS; see the file COPYING.  If not, write to
+   the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+
+/*
+  Apparently unused functions:
+    md_convert_frag
+    md_estimate_size_before_relax
+    md_create_short_jump
+    md_create_long_jump
+*/
+
+#include "as.h"
+#include "opcode/pdp11.h"
+
+static int set_option PARAMS ((char *arg));
+static int set_cpu_model PARAMS ((char *arg));
+static int set_machine_model PARAMS ((char *arg));
+
+#define TRUE 1
+#define FALSE 0
+
+/*
+ * A representation for PDP-11 machine code.
+ */
+struct pdp11_code
+{
+  char *error;
+  int code;
+  int additional;      /* is there an additional word? */
+  int word;            /* additional word, if any */
+  struct
+  {
+    bfd_reloc_code_real_type type;
+    expressionS exp;
+    int pc_rel;
+  } reloc;
+};
+
+/*
+ * Instruction set extensions.
+ *
+ * If you change this from an array to something else, please update
+ * the "PDP-11 instruction set extensions" comment in pdp11.h.
+ */
+int pdp11_extension[PDP11_EXT_NUM];
+
+/*
+ * Assembly options.
+ */
+
+#define ASM_OPT_PIC 1
+#define ASM_OPT_NUM 2
+
+int asm_option[ASM_OPT_NUM];
+
+/* These chars start a comment anywhere in a source file (except inside
+   another comment */
+CONST char comment_chars[] = "#/";
+
+/* These chars only start a comment at the beginning of a line. */
+CONST char line_comment_chars[] = "#/";
+
+CONST char line_separator_chars[] = ";";
+
+/* Chars that can be used to separate mant from exp in floating point nums */
+CONST char EXP_CHARS[] = "eE";
+
+/* Chars that mean this number is a floating point constant */
+/* as in 0f123.456 */
+/* or    0H1.234E-12 (see exp chars above) */
+CONST char FLT_CHARS[] = "dDfFgGhH";
+
+void pseudo_even (int);
+void pseudo_bss (int);
+
+CONST pseudo_typeS md_pseudo_table[] =
+{
+  { "bss", pseudo_bss, 0 },
+  { "even", pseudo_even, 0 },
+  { 0, 0, 0 },
+};
+
+
+static void
+init_defaults ()
+{
+  static int first = 1;
+
+  if (first)
+    {
+      set_option ("all-extensions");
+      set_option ("pic");
+      first = 0;
+    }
+}
+
+static struct hash_control *insn_hash = NULL;
+
+void
+md_begin ()
+{
+  int i;
+
+  init_defaults ();
+
+  insn_hash = hash_new ();
+  if (insn_hash == NULL)
+    as_fatal ("Virtual memory exhausted");
+    
+  for (i = 0; i < pdp11_num_opcodes; i++)
+    hash_insert (insn_hash, pdp11_opcodes[i].name, (PTR)(pdp11_opcodes + i));
+  for (i = 0; i < pdp11_num_aliases; i++)
+    hash_insert (insn_hash, pdp11_aliases[i].name, (PTR)(pdp11_aliases + i));
+}
+
+void
+md_number_to_chars (con, value, nbytes)
+     char con[];
+     valueT value;
+     int nbytes;
+{
+  /* On a PDP-11, 0x1234 is stored as "\x12\x34", and
+   * 0x12345678 is stored as "\x56\x78\x12\x34". It's
+   * anyones guess what 0x123456 would be stored like.
+   */
+
+  switch (nbytes)
+    {
+    case 0:
+      break;
+    case 1:
+      con[0] =  value       & 0xff;
+      break;
+    case 2:
+      con[0] =  value       & 0xff;
+      con[1] = (value >>  8) & 0xff;
+      break;
+    case 4:
+      con[0] = (value >> 16) & 0xff;
+      con[1] = (value >> 24) & 0xff;
+      con[2] =  value       & 0xff;
+      con[3] = (value >>  8) & 0xff;
+      break;
+    default:
+      BAD_CASE (nbytes);
+    }            
+}
+
+/* Fix up some data or instructions after we find out the value of a symbol
+   that they reference.  */
+
+int                            /* Knows about order of bytes in address. */
+md_apply_fix (fixP, value)
+     fixS *fixP;
+     valueT *value;
+{
+  valueT code;
+  valueT mask;
+  char *buf;
+  int shift;
+  int size;
+
+  buf = fixP->fx_where + fixP->fx_frag->fr_literal;
+  size = fixP->fx_size;
+  code = md_chars_to_number (buf, size);
+
+  switch (fixP->fx_r_type)
+    {
+    case BFD_RELOC_16:
+    case BFD_RELOC_16_PCREL:
+      mask = 0xffff;
+      shift = 0;
+      break;
+    case BFD_RELOC_PDP11_DISP_8_PCREL:
+      mask = 0x00ff;
+      shift = 1;
+      break;
+    case BFD_RELOC_PDP11_DISP_6_PCREL:
+      mask = 0x003f;
+      shift = 1;
+      break;
+    default:
+      BAD_CASE (fixP->fx_r_type);
+    }
+
+  if (fixP->fx_addsy != NULL)
+    *value += symbol_get_bfdsym (fixP->fx_addsy)->section->vma;
+    /* *value += fixP->fx_addsy->bsym->section->vma; */
+
+  code &= ~mask;
+  code |= (*value >> shift) & mask;
+  number_to_chars_littleendian (buf, code, size);
+  return 0;
+}
+
+long
+md_chars_to_number (con, nbytes)
+     unsigned char con[];      /* Low order byte 1st. */
+     int nbytes;               /* Number of bytes in the input. */
+{
+  /* On a PDP-11, 0x1234 is stored as "\x12\x34", and
+   * 0x12345678 is stored as "\x56\x78\x12\x34". It's
+   * anyones guess what 0x123456 would be stored like.
+   */
+
+  switch (nbytes)
+    {
+    case 0:
+      return 0;
+    case 1:
+      return con[0];
+    case 2:
+      return (con[1] << BITS_PER_CHAR) | con[0];
+    case 4:
+      return
+       (((con[1] << BITS_PER_CHAR) | con[0]) << (2 * BITS_PER_CHAR)) |
+        ((con[3] << BITS_PER_CHAR) | con[2]);
+    default:
+      BAD_CASE (nbytes);
+      return 0;
+    }            
+}
+\f
+static char *
+skip_whitespace (char *str)
+{
+  while (*str == ' ' || *str == '\t')
+    str++;
+  return str;
+}
+
+static char *
+find_whitespace (char *str)
+{
+  while (*str != ' ' && *str != '\t' && *str != 0)
+    str++;
+  return str;
+}
+
+static char
+mklower (char c)
+{
+  if (isupper (c))
+    return tolower (c);
+  return c;
+}
+
+static char *
+parse_reg (char *str, struct pdp11_code *operand)
+{
+  str = skip_whitespace (str);
+  if (mklower (*str) == 'r')
+    {
+      str++;
+      switch (*str)
+       {
+       case '0': case '1': case '2': case '3':
+       case '4': case '5': case '6': case '7':
+         operand->code = *str - '0';
+         str++;
+         break;
+       default:
+         operand->error = "Bad register name";
+         return str - 1;
+       }
+    }
+  else if (strncmp (str, "sp", 2) == 0 ||
+          strncmp (str, "SP", 2) == 0)
+    {
+      operand->code = 6;
+      str += 2;
+    }
+  else if (strncmp (str, "pc", 2) == 0 ||
+          strncmp (str, "PC", 2) == 0)
+    {
+      operand->code = 7;
+      str += 2;
+    }
+  else
+    {
+      operand->error = "Bad register name";
+      return str;
+    }
+
+  return str;
+}
+
+static char *
+parse_ac (char *str, struct pdp11_code *operand)
+{
+  str = skip_whitespace (str);
+  if (strncmp (str, "fr", 2) == 0 ||
+      strncmp (str, "FR", 2) == 0 ||
+      strncmp (str, "ac", 2) == 0 ||
+      strncmp (str, "AC", 2) == 0)
+    {
+      str += 2;
+      switch (*str)
+       {
+       case '0': case '1': case '2': case '3':
+         operand->code = *str - '0';
+         str++;
+         break;
+       default:
+         operand->error = "Bad register name";
+         return str - 2;
+       }
+    }
+  else
+    {
+      operand->error = "Bad register name";
+      return str;
+    }
+
+  return str;
+}
+
+static char *
+parse_expression (char *str, struct pdp11_code *operand)
+{
+  char *save_input_line_pointer;
+  segT seg;
+
+  save_input_line_pointer = input_line_pointer;
+  input_line_pointer = str;
+  seg = expression (&operand->reloc.exp);
+  if (seg == NULL)
+    {
+      input_line_pointer = save_input_line_pointer;
+      operand->error = "Error in expression";
+      return str;
+    }
+
+  str = input_line_pointer;
+  input_line_pointer = save_input_line_pointer;
+
+  operand->reloc.pc_rel = 0;
+
+  if (operand->reloc.exp.X_op == O_constant)
+    {
+      if (*str == '.')
+       str++;
+      else
+       {
+         /* FIXME: buffer overflow! */
+         char buf[100];
+         char *end;
+
+         sprintf (buf, "%ld", operand->reloc.exp.X_add_number);
+         operand->reloc.exp.X_add_number = strtol (buf, &end, 8);
+       }
+    }
+
+  return str;
+}
+
+static char *
+parse_op_no_deferred (char *str, struct pdp11_code *operand)
+{
+  str = skip_whitespace (str);
+
+  switch (*str)
+    {
+    case '(':                          /* (rn) and (rn)+ */
+      str = parse_reg (str + 1, operand);
+      if (operand->error)
+       return str;
+      str = skip_whitespace (str);
+      if (*str != ')')
+       {
+         operand->error = "Missing ')'";
+         return str;
+       }
+      str++;
+      if (*str == '+')
+       {
+         operand->code |= 020;
+         str++;
+       }
+      else
+       {
+         operand->code |= 010;
+       }
+      break;
+
+    case '#':                          /* immediate */
+    case '$': 
+      str = parse_expression (str + 1, operand);
+      if (operand->error)
+       return str;
+      operand->additional = TRUE;
+      operand->word = operand->reloc.exp.X_add_number;
+      switch (operand->reloc.exp.X_op)
+       {
+       case O_constant:
+         break;
+       case O_symbol:
+       case O_add:
+       case O_subtract:
+         operand->reloc.type = BFD_RELOC_16;
+         operand->reloc.pc_rel = 0;
+         break;
+       default:
+         operand->error = "Error in expression";
+         break;
+       }
+      operand->code = 027;
+      break;
+
+    default:                           /* label, d(rn), -(rn) */
+      {
+       char *old = str;
+
+       if (strncmp (str, "-(", 2) == 0)        /* -(rn) */
+         {
+           str = parse_reg (str + 2, operand);
+           if (operand->error)
+             return str;
+           str = skip_whitespace (str);
+           if (*str != ')')
+             {
+               operand->error = "Missing ')'";
+               return str;
+             }
+           operand->code |= 040;
+           str++;
+           break;
+         }
+
+       str = parse_expression (str, operand);
+       if (operand->error)
+         return str;
+
+       str = skip_whitespace (str);
+
+       if (*str != '(')                /* label */
+         {
+           if (operand->reloc.exp.X_op != O_symbol)
+             {
+               operand->error = "Label expected";
+               return old;
+             }
+           operand->code = 067;
+           operand->additional = 1;
+           operand->word = 0;
+           operand->reloc.type = BFD_RELOC_16_PCREL;
+           operand->reloc.pc_rel = 1;
+           break;
+         }
+
+       str++;                          /* d(rn) */
+       str = parse_reg (str, operand);
+       if (operand->error)
+         return str;
+
+       str = skip_whitespace (str);
+
+       if (*str != ')')
+         {
+           operand->error = "Missing ')'";
+           return str;
+         }
+
+       str++;
+       operand->additional = TRUE;
+       operand->code |= 060;
+       switch (operand->reloc.exp.X_op)
+         {
+         case O_symbol:
+           operand->word = 0;
+           operand->reloc.pc_rel = 1;
+           break;
+         case O_constant:
+           if ((operand->code & 7) == 7)
+             {
+               operand->reloc.pc_rel = 1;
+               operand->word = operand->reloc.exp.X_add_number;
+             }
+           else
+             {
+               operand->word = operand->reloc.exp.X_add_number;
+             }
+           break;
+         default:
+           BAD_CASE (operand->reloc.exp.X_op);
+         }
+       break;
+      }
+    }
+
+  return str;
+}
+
+static char *
+parse_op (char *str, struct pdp11_code *operand)
+{
+  str = skip_whitespace (str);
+
+  str = parse_reg (str, operand);
+  if (!operand->error)
+    return str;
+  operand->error = NULL;
+
+  if (*str == '@' || *str == '*')
+    {
+      str = parse_op_no_deferred (str + 1, operand);
+      if (operand->error)
+       return str;
+      operand->code |= 010;
+    }
+  else
+    str = parse_op_no_deferred (str, operand);
+
+  return str;
+}
+
+static char *
+parse_separator (char *str, int *error)
+{
+  str = skip_whitespace (str);
+  *error = (*str != ',');
+  if (!*error)
+    str++;
+  return str;
+}
+
+void
+md_assemble (instruction_string)
+     char *instruction_string;
+{
+  CONST struct pdp11_opcode *op;
+  struct pdp11_code insn, op1, op2;
+  int error;
+  int size;
+  char *err = NULL;
+  char *str;
+  char *p;
+  char c;
+
+  str = skip_whitespace (instruction_string);
+  p = find_whitespace (str);
+  if (p - str == 0)
+    {
+      as_bad ("No instruction found");
+      return;
+    }
+
+  c = *p;
+  *p = '\0';
+  op = (struct pdp11_opcode *)hash_find (insn_hash, str);
+  *p = c;
+  if (op == 0)
+    {
+#if 0
+      op1.error = NULL;
+      op1.additional = FALSE;
+      op1.reloc.type = BFD_RELOC_NONE;
+      op1.code = 0;
+      op1.word = 0;
+      str = parse_expression (str, &op1);
+      if (op1.error)
+       {
+         as_bad (op1.error);
+         return;
+       }
+
+      {
+       char *to = frag_more (2);
+
+       md_number_to_chars (to, op1.code, 2);
+       if (insn.reloc.type != BFD_RELOC_NONE)
+         fix_new_exp (frag_now, to - frag_now->fr_literal, 2,
+                      &insn.reloc.exp, insn.reloc.pc_rel, insn.reloc.type);
+      }
+#else
+      as_warn ("Unknown instruction");
+#endif
+
+      return;
+    }
+
+  if (!pdp11_extension[op->extension])
+    {
+      as_warn ("Unsupported instruction set extension: %s", op->name);
+      return;
+    }
+
+  insn.error = NULL;
+  insn.code = op->opcode;
+  insn.reloc.type = BFD_RELOC_NONE;
+  op1.error = NULL;
+  op1.additional = FALSE;
+  op1.reloc.type = BFD_RELOC_NONE;
+  op2.error = NULL;
+  op2.additional = FALSE;
+  op2.reloc.type = BFD_RELOC_NONE;
+
+  str = p;
+  size = 2;
+
+  switch (op->type)
+    {
+    case PDP11_OPCODE_NO_OPS:
+      str = skip_whitespace (str);
+      if (*str == 0)
+       str = "";
+      break;
+
+    case PDP11_OPCODE_IMM3:
+    case PDP11_OPCODE_IMM6:
+    case PDP11_OPCODE_IMM8:
+      str = skip_whitespace (str);
+      if (*str == '#' || *str == '$')
+       str++;
+      str = parse_expression (str, &op1);
+      if (op1.error)
+       break;
+      switch (op->type)
+       {
+       case PDP11_OPCODE_IMM3:
+         if (op1.code & ~7)
+           {
+             op1.error = "3-bit immediate out of range";
+             break;
+           }
+         break;
+       case PDP11_OPCODE_IMM6:
+         if (op1.code & ~0x3f)
+           {
+             op1.error = "6-bit immediate out of range";
+             break;
+           }
+         break;
+       case PDP11_OPCODE_IMM8:
+         if (op1.code & ~0xff)
+           {
+             op1.error = "8-bit immediate out of range";
+             break;
+           }
+         break;
+       }
+      insn.code |= op1.code;
+      break;
+
+    case PDP11_OPCODE_DISPL:
+      {
+       char *new;
+       new = parse_expression (str, &op1);
+       op1.code = 0;
+       op1.reloc.pc_rel = 1;
+       op1.reloc.type = BFD_RELOC_PDP11_DISP_8_PCREL;
+       if (op1.reloc.exp.X_op != O_symbol)
+         {
+           op1.error = "Symbol expected";
+           break;
+         }
+       if (op1.code & ~0xff)
+         {
+           err = "8-bit displacement out of range";
+           break;
+         }
+       str = new;
+       insn.code |= op1.code;
+       insn.reloc = op1.reloc;
+      }
+      break;
+
+    case PDP11_OPCODE_REG:
+      str = parse_reg (str, &op1);
+      if (op1.error)
+       break;
+      insn.code |= op1.code;
+      break;
+
+    case PDP11_OPCODE_OP:
+      str = parse_op (str, &op1);
+      if (op1.error)
+       break;
+      insn.code |= op1.code;
+      if (op1.additional)
+       size += 2;
+      break;
+
+    case PDP11_OPCODE_REG_OP:
+      str = parse_reg (str, &op2);
+      if (op2.error)
+       break;
+      insn.code |= op2.code << 6;
+      str = parse_separator (str, &error);
+      if (error)
+       {
+         op2.error = "Missing ','";
+         break;
+       }
+      str = parse_op (str, &op1);
+      if (op1.error)
+       break;
+      insn.code |= op1.code;
+      if (op1.additional)
+       size += 2;
+      break;
+
+    case PDP11_OPCODE_REG_OP_REV:
+      str = parse_op (str, &op1);
+      if (op1.error)
+       break;
+      insn.code |= op1.code;
+      if (op1.additional)
+       size += 2;
+      str = parse_separator (str, &error);
+      if (error)
+       {
+         op2.error = "Missing ','";
+         break;
+       }
+      str = parse_reg (str, &op2);
+      if (op2.error)
+       break;
+      insn.code |= op2.code << 6;
+      break;
+
+    case PDP11_OPCODE_AC_OP:
+      str = parse_ac (str, &op2);
+      if (op2.error)
+       break;
+      insn.code |= op2.code << 6;
+      str = parse_separator (str, &error);
+      if (error)
+       {
+         op1.error = "Missing ','";
+         break;
+       }
+      str = parse_op (str, &op1);
+      if (op1.error)
+       break;
+      insn.code |= op1.code;
+      if (op1.additional)
+       size += 2;
+      break;
+
+    case PDP11_OPCODE_OP_OP:
+      str = parse_op (str, &op1);
+      if (op1.error)
+       break;
+      insn.code |= op1.code << 6;
+      if (op1.additional)
+       size += 2;
+      str = parse_separator (str, &error);
+      if (error)
+       {
+         op2.error = "Missing ','";
+         break;
+       }
+      str = parse_op (str, &op2);
+      if (op2.error)
+       break;
+      insn.code |= op2.code;
+      if (op2.additional)
+       size += 2;
+      break;
+
+    case PDP11_OPCODE_REG_DISPL:
+      {
+       char *new;
+       str = parse_reg (str, &op2);
+       if (op2.error)
+         break;
+       insn.code |= op2.code << 6;
+       str = parse_separator (str, &error);
+       if (error)
+         {
+           op1.error = "Missing ','";
+           break;
+         }
+       new = parse_expression (str, &op1);
+       op1.code = 0;
+       op1.reloc.pc_rel = 1;
+       op1.reloc.type = BFD_RELOC_PDP11_DISP_6_PCREL;
+       if (op1.reloc.exp.X_op != O_symbol)
+         {
+           op1.error = "Symbol expected";
+           break;
+         }
+       if (op1.code & ~0x3f)
+         {
+           err = "6-bit displacement out of range";
+           break;
+         }
+       str = new;
+       insn.code |= op1.code;
+       insn.reloc = op1.reloc;
+      }
+      break;
+      
+    default:
+      BAD_CASE (op->type);
+    }
+
+  if (op1.error)
+    err = op1.error;
+  else if (op2.error)
+    err = op2.error;
+  else
+    {
+      str = skip_whitespace (str);
+      if (*str)
+       err = "Too many operands";
+    }
+
+  {
+    char *to = NULL;
+    
+    if (err)
+      {
+       as_bad (err);
+       return;
+      }
+
+    to = frag_more (size);
+
+    md_number_to_chars (to, insn.code, 2);
+    if (insn.reloc.type != BFD_RELOC_NONE)
+      fix_new_exp (frag_now, to - frag_now->fr_literal, 2,
+                  &insn.reloc.exp, insn.reloc.pc_rel, insn.reloc.type);
+    to += 2;
+
+    if (op1.additional)
+      {
+       md_number_to_chars (to, op1.word, 2);
+       if (op1.reloc.type != BFD_RELOC_NONE)
+         fix_new_exp (frag_now, to - frag_now->fr_literal, 2,
+                      &op1.reloc.exp, op1.reloc.pc_rel, op1.reloc.type);
+       to += 2;
+      }
+
+    if (op2.additional)
+      {
+       md_number_to_chars (to, op2.word, 2);
+       if (op2.reloc.type != BFD_RELOC_NONE)
+         fix_new_exp (frag_now, to - frag_now->fr_literal, 2,
+                      &op2.reloc.exp, op2.reloc.pc_rel, op2.reloc.type);
+      }
+  }
+}
+
+int
+md_estimate_size_before_relax (fragP, segment)
+     fragS *fragP ATTRIBUTE_UNUSED;
+     segT segment ATTRIBUTE_UNUSED;
+{
+  return 0;
+}
+
+void
+md_convert_frag (headers, seg, fragP)
+     bfd *headers ATTRIBUTE_UNUSED;
+     segT seg ATTRIBUTE_UNUSED;
+     fragS *fragP ATTRIBUTE_UNUSED;
+{
+}
+
+CONST int md_short_jump_size = 2;
+CONST int md_long_jump_size = 4;
+
+void
+md_create_short_jump (ptr, from_addr, to_addr, frag, to_symbol)
+     char *ptr ATTRIBUTE_UNUSED;
+     addressT from_addr ATTRIBUTE_UNUSED;
+     addressT to_addr ATTRIBUTE_UNUSED;
+     fragS *frag ATTRIBUTE_UNUSED;
+     symbolS *to_symbol ATTRIBUTE_UNUSED;
+{
+}
+
+void
+md_create_long_jump (ptr, from_addr, to_addr, frag, to_symbol)
+     char *ptr ATTRIBUTE_UNUSED;
+     addressT from_addr ATTRIBUTE_UNUSED;
+     addressT to_addr ATTRIBUTE_UNUSED;
+     fragS *frag ATTRIBUTE_UNUSED;
+     symbolS *to_symbol ATTRIBUTE_UNUSED;
+{
+}
+
+static int
+set_option (arg)
+     char *arg;
+{
+  int yes = 1;
+
+  if (strcmp (arg, "all-extensions") == 0 ||
+      strcmp (arg, "all") == 0)
+    {
+      memset (pdp11_extension, ~0, sizeof pdp11_extension);
+      pdp11_extension[PDP11_NONE] = 0;
+      return 1;
+    }
+  else if (strcmp (arg, "no-extensions") == 0)
+    {
+      memset (pdp11_extension, 0, sizeof pdp11_extension);
+      pdp11_extension[PDP11_BASIC] = 1;
+      return 1;
+    }
+
+  if (strncmp (arg, "no-", 3) == 0)
+    {
+      yes = 0;
+      arg += 3;
+    }
+
+  if (strcmp (arg, "cis") == 0)                        /* commersial instructions */
+    pdp11_extension[PDP11_CIS] = yes;
+  else if (strcmp (arg, "csm") == 0)           /* call supervisor mode */
+    pdp11_extension[PDP11_CSM] = yes;
+  else if (strcmp (arg, "eis") == 0)           /* extended instruction set */
+    pdp11_extension[PDP11_EIS] = pdp11_extension[PDP11_LEIS] = yes;
+  else if (strcmp (arg, "fis") == 0 ||         /* KEV11 floating-point */
+          strcmp (arg, "kev11") == 0 ||
+          strcmp (arg, "kev-11") == 0)
+    pdp11_extension[PDP11_FIS] = yes;
+  else if (strcmp (arg, "fpp") == 0 ||         /* FP-11 floating-point */
+          strcmp (arg, "fpu") == 0 ||
+          strcmp (arg, "fp11") == 0 ||
+          strcmp (arg, "fp-11") == 0 ||
+          strcmp (arg, "fpj11") == 0 ||
+          strcmp (arg, "fp-j11") == 0 ||
+          strcmp (arg, "fpj-11") == 0)
+    pdp11_extension[PDP11_FPP] = yes;
+  else if (strcmp (arg, "limited-eis") == 0)   /* limited extended insns */
+    {
+      pdp11_extension[PDP11_LEIS] = yes;
+      if (!pdp11_extension[PDP11_LEIS])
+       pdp11_extension[PDP11_EIS] = 0;
+    }
+  else if (strcmp (arg, "mfpt") == 0)          /* move from processor type */
+    pdp11_extension[PDP11_MFPT] = yes;
+  else if (strncmp (arg, "mproc", 5) == 0 ||   /* multiprocessor insns: */
+          strncmp (arg, "multiproc", 9) == 0 ) /* TSTSET, WRTLCK */
+    pdp11_extension[PDP11_MPROC] = yes;        
+  else if (strcmp (arg, "mxps") == 0)          /* move from/to proc status */
+    pdp11_extension[PDP11_MXPS] = yes;
+  else if (strcmp (arg, "pic") == 0)           /* position-independent code */
+    asm_option[ASM_OPT_PIC] = yes;
+  else if (strcmp (arg, "spl") == 0)           /* set priority level */
+    pdp11_extension[PDP11_SPL] = yes;
+  else if (strcmp (arg, "ucode") == 0 ||       /* microcode instructions: */
+          strcmp (arg, "microcode") == 0)      /* LDUB, MED, XFC */
+    pdp11_extension[PDP11_UCODE] = yes;
+  else
+    return 0;
+
+  return 1;
+}
+
+static int
+set_cpu_model (arg)
+     char *arg;
+{
+  char buf[4];
+  char *model = buf;
+
+  if (arg[0] == 'k')
+    arg++;
+
+  *model++ = *arg++;
+
+  if (strchr ("abdx", model[-1]) == NULL)
+    return 0;
+
+  if (model[-1] == 'd')
+    {
+      if (arg[0] == 'f' ||
+         arg[0] == 'j')
+       model[-1] = *arg++;
+    }
+  else if (model[-1] == 'x')
+    {
+      if (arg[0] == 't')
+       model[-1] = *arg++;
+    }
+
+  if (arg[0] == '-')
+    arg++;
+
+  if (strncmp (arg, "11", 2) != 0)
+    return 0;
+  arg += 2;
+
+  if (arg[0] == '-')
+    {
+      if (*++arg == 0)
+       return 0;
+    }
+
+  /* allow up to two revision letters */
+  if (arg[0] != 0)
+    *model++ = *arg++;
+  if (arg[0] != 0)
+    *model++ = *arg++;
+
+  *model++ = 0;
+
+  set_option ("no-extensions");
+
+  if (strncmp (buf, "a", 1) == 0)              /* KA11 (11/15/20) */
+    return 1; /* no extensions */
+
+  else if (strncmp (buf, "b", 1) == 0)         /* KB11 (11/45/50/55/70) */
+    return set_option ("eis") &&
+           set_option ("spl");
+
+  else if (strncmp (buf, "da", 2) == 0)                /* KD11-A (11/35/40) */
+    return set_option ("limited-eis");
+
+  else if (strncmp (buf, "db", 2) == 0 ||      /* KD11-B (11/05/10) */
+          strncmp (buf, "dd", 2) == 0)         /* KD11-D (11/04) */
+    return 1; /* no extensions */
+
+  else if (strncmp (buf, "de", 2) == 0)                /* KD11-E (11/34) */
+    return set_option ("eis") &&
+           set_option ("mxps");
+
+  else if (strncmp (buf, "df", 2) == 0 ||      /* KD11-F (11/03) */
+          strncmp (buf, "dh", 2) == 0 ||       /* KD11-H (11/03) */
+          strncmp (buf, "dq", 2) == 0)         /* KD11-Q (11/03) */
+    return set_option ("limited-eis") &&
+           set_option ("mxps");
+
+  else if (strncmp (buf, "dk", 2) == 0)                /* KD11-K (11/60) */
+    return set_option ("eis") &&
+           set_option ("mxps") &&
+           set_option ("ucode");
+
+  else if (strncmp (buf, "dz", 2) == 0)                /* KD11-Z (11/44) */
+    return set_option ("csm") &&
+           set_option ("eis") &&
+           set_option ("mfpt") &&
+           set_option ("mxps") &&
+           set_option ("spl");
+
+  else if (strncmp (buf, "f", 1) == 0)         /* F11 (11/23/24) */
+    return set_option ("eis") &&
+           set_option ("mfpt") &&
+           set_option ("mxps");
+
+  else if (strncmp (buf, "j", 1) == 0)         /* J11 (11/53/73/83/84/93/94)*/
+    return set_option ("csm") &&
+           set_option ("eis") &&
+           set_option ("mfpt") &&
+           set_option ("multiproc") &&
+           set_option ("mxps") &&
+           set_option ("spl");
+
+  else if (strncmp (buf, "t", 1) == 0)         /* T11 (11/21) */
+    return set_option ("limited-eis") &&
+           set_option ("mxps");
+
+  else
+    return 0;
+}
+
+static int
+set_machine_model (arg)
+     char *arg;
+{
+  if (strncmp (arg, "pdp-11/", 7) != 0 &&
+      strncmp (arg, "pdp11/", 6) != 0 &&
+      strncmp (arg, "11/", 3) != 0)
+    return 0;
+
+  if (strncmp (arg, "pdp", 3) == 0)
+    arg += 3;
+  if (arg[0] == '-')
+    arg++;
+  if (strncmp (arg, "11/", 3) == 0)
+    arg += 3;
+
+  if (strcmp (arg, "03") == 0)                 /* 11/03 */
+    return set_cpu_model ("kd11f");            /* KD11-F */
+
+  else if (strcmp (arg, "04") == 0)            /* 11/04 */
+    return set_cpu_model ("kd11d");            /* KD11-D */
+
+  else if (strcmp (arg, "05") == 0 ||          /* 11/05 or 11/10 */
+          strcmp (arg, "10") == 0)
+    return set_cpu_model ("kd11b");            /* KD11-B */
+
+  else if (strcmp (arg, "15") == 0 ||          /* 11/15 or 11/20 */
+          strcmp (arg, "20") == 0)
+    return set_cpu_model ("ka11");             /* KA11 */
+
+  else if (strcmp (arg, "21") == 0)            /* 11/21 */
+    return set_cpu_model ("t11");              /* T11 */
+
+  else if (strcmp (arg, "23") == 0 ||          /* 11/23 or 11/24 */
+          strcmp (arg, "24") == 0)
+    return set_cpu_model ("f11");              /* F11 */
+
+  else if (strcmp (arg, "34") == 0 ||          /* 11/34 or 11/34a */
+           strcmp (arg, "34a") == 0)
+    return set_cpu_model ("kd11e");            /* KD11-E */
+
+  else if (strcmp (arg, "35") == 0 ||          /* 11/35 or 11/40 */
+          strcmp (arg, "40") == 0)
+    return set_cpu_model ("kd11da");           /* KD11-A */
+
+  else if (strcmp (arg, "44") == 0)            /* 11/44 */
+    return set_cpu_model ("kd11dz");           /* KD11-Z */
+
+  else if (strcmp (arg, "45") == 0 ||          /* 11/45/50/55/70 */
+          strcmp (arg, "50") == 0 ||
+          strcmp (arg, "55") == 0 ||
+          strcmp (arg, "70") == 0)
+    return set_cpu_model ("kb11");             /* KB11 */
+
+  else if (strcmp (arg, "60") == 0)            /* 11/60 */
+    return set_cpu_model ("kd11k");            /* KD11-K */ /* FPP? */
+
+  else if (strcmp (arg, "53") == 0 ||          /* 11/53/73/83/84/93/94 */
+          strcmp (arg, "73") == 0 ||
+          strcmp (arg, "83") == 0 ||
+          strcmp (arg, "84") == 0 ||
+          strcmp (arg, "93") == 0 ||
+          strcmp (arg, "94") == 0)
+    return set_cpu_model ("j11") &&            /* J11 */
+           set_option ("fpp");                 /* All J11 machines come */
+                                               /* with FPP installed. */
+  else
+    return 0;
+}
+
+CONST char *md_shortopts = "m:";
+
+struct option md_longopts[] =
+{
+#define OPTION_CPU 257
+  { "cpu", required_argument, NULL, OPTION_CPU },
+#define OPTION_MACHINE 258
+  { "machine", required_argument, NULL, OPTION_MACHINE },
+#define OPTION_PIC 259
+  { "pic", no_argument, NULL, OPTION_PIC },
+  { NULL, no_argument, NULL, 0 }
+};
+
+size_t md_longopts_size = sizeof(md_longopts);
+
+/*
+ * md_parse_option
+ *     Invocation line includes a switch not recognized by the base assembler.
+ *     See if it's a processor-specific option.
+ */
+
+int
+md_parse_option (c, arg)
+     int c;
+     char *arg;
+{
+  init_defaults ();
+
+  switch (c)
+    {
+    case 'm':
+      if (set_option (arg))
+       return 1;
+      if (set_cpu_model (arg))
+       return 1;
+      if (set_machine_model (arg))
+       return 1;
+      break;
+
+    case OPTION_CPU:
+      if (set_cpu_model (arg))
+       return 1;
+      break;
+
+    case OPTION_MACHINE:
+      if (set_machine_model (arg))
+       return 1;
+      break;
+
+    case OPTION_PIC:
+      if (set_option ("pic"))
+       return 1;
+      break;
+
+    default:
+      break;
+    }
+
+  as_bad ("unrecognized option `-%c%s'", c, arg ? arg : "");
+
+  return 0;
+}
+
+/*
+One possible way of parsing options.
+
+enum
+{
+  OPTION_CSM,
+  OPTION_CIS,
+  ...
+};
+
+struct
+{
+  CONST char *pattern;
+  int opt;
+  CONST char *description;
+} options;  
+
+static struct options extension_opts[] =
+{
+  { "Ncsm", OPTION_CSM,
+                       "allow (disallow) CSM instruction" },
+  { "Ncis", OPTION_CIS,
+                       "allow (disallow) commersial instruction set" },
+  { "Neis", OPTION_EIS,
+                       "allow (disallow) extended instruction set" },
+  ...
+  { "all-extensions", OPTION_ALL_EXTENSIONS,
+                       "allow all instruction set extensions\n\
+                       (this is the default)" },
+  { "no-extensions", OPTION_NO_EXTENSIONS,
+                       "disallow all instruction set extensions" },
+  { "pic", OPTION_PIC,
+                       "position-independent code" },
+};
+
+static struct options cpu_opts[] =
+{
+  { "Ka_11_*", OPTION_KA11, "KA11 CPU. ..." },
+  { "Kb_11_*", OPTION_KB11, "KB11 CPU. ..." },
+  { "Kd_11_a*", OPTION_KD11A, "KD11-A CPU. ..." },
+  { "Kd_11_b*", OPTION_KD11B, "KD11-B CPU. ..." },
+  { "Kd_11_d*", OPTION_KD11D, "KD11-D CPU. ..." },
+  { "Kd_11_e*", OPTION_KD11E, "KD11-E CPU. ..." },
+  { "Kd_11_f*", OPTION_KD11F, "KD11-F CPU. ..." },
+  { "Kd_11_h*", OPTION_KD11H, "KD11-H CPU. ..." },
+  { "Kd_11_q*", OPTION_KD11Q, "KD11-Q CPU. ..." },
+  { "Kd_11_z*", OPTION_KD11Z, "KD11-Z CPU. ..." },
+  { "Df_11_*", OPTION_F11, "F11 CPU. ..." },
+  { "Dj_11_*", OPTION_J11, "J11 CPU. ..." },
+  { "Dt_11_*", OPTION_T11, "T11 CPU. ..." },
+};
+
+static struct options model_opts[] =
+{
+  { "P03", OPTION_PDP11_03, "same as ..." },
+  { "P04", OPTION_PDP11_04, "same as ..." },
+  { "P05", OPTION_PDP11_05, "same as ..." },
+  { "P10", OPTION_PDP11_10, "same as ..." },
+  { "P15", OPTION_PDP11_15, "same as ..." },
+  { "P20", OPTION_PDP11_20, "same as ..." },
+  { "P21", OPTION_PDP11_21, "same as ..." },
+  { "P24", OPTION_PDP11_24, "same as ..." },
+  { "P34", OPTION_PDP11_34, "same as ..." },
+  { "P34a", OPTION_PDP11_34A, "same as ..." },
+  { "P40", OPTION_PDP11_40, "same as ..." },
+  { "P44", OPTION_PDP11_44, "same as ..." },
+  { "P45", OPTION_PDP11_45, "same as ..." },
+  { "P50", OPTION_PDP11_50, "same as ..." },
+  { "P53", OPTION_PDP11_53, "same as ..." },
+  { "P55", OPTION_PDP11_55, "same as ..." },
+  { "P60", OPTION_PDP11_60, "same as ..." },
+  { "P70", OPTION_PDP11_70, "same as ..." },
+  { "P73", OPTION_PDP11_73, "same as ..." },
+  { "P83", OPTION_PDP11_83, "same as ..." },
+  { "P84", OPTION_PDP11_84, "same as ..." },
+  { "P93", OPTION_PDP11_93, "same as ..." },
+  { "P94", OPTION_PDP11_94, "same as ..." },
+};
+
+struct
+{
+  CONST char *title;
+  struct options *opts;
+  int num;
+} all_opts[] =
+{
+  { "PDP-11 instruction set extentions",
+    extension_opts,
+    sizeof extension_opts / sizeof extension_opts[0] },
+  { "PDP-11 CPU model options", 
+    cpu_opts,
+    sizeof cpu_opts / sizeof cpu_opts[0] },
+  { "PDP-11 machine model options", 
+    model_opts,
+    sizeof model_opts / sizeof model_opts[0] },
+};
+
+int
+parse_match (char *arg, char *pattern)
+{
+  int yes = 1;
+
+  while (*pattern)
+    {
+      switch (*pattern++)
+       {
+       case 'N':
+         if (strncmp (arg, "no-") == 0)
+           {
+             yes = 0;
+             arg += 3;
+           }
+         break;
+
+       case 'K':
+         if (arg[0] == 'k')
+           arg++;
+         break;
+
+       case 'D':
+         if (strncmp (arg, "kd", 2) == 0)
+           arg +=2;
+         break;
+
+       case 'P':
+         if (strncmp (arg, "pdp-11/", 7) == 0)
+           arg += 7;
+         else if (strncmp (arg, "pdp11/", 6) == 0)
+           arg += 6;
+         else if (strncmp (arg, "11/", 3) == 0)
+           arg += 3;
+         break;
+
+       case '_':
+         if (arg[0] == "-")
+           {
+             if (*++arg == 0)
+               return 0;
+           }
+         break;
+
+       case '*':
+         return 1;
+
+       default:
+         if (*arg++ != pattern[-1])
+           return 0;
+       }
+    }
+
+  return arg[0] == 0;
+}
+
+int
+fprint_opt (stream, pattern)
+     FILE *stream;
+     CONST char *pattern;
+{
+  int n;
+
+  while (*pattern)
+    {
+      switch (*pattern++)
+       {
+       case 'N':
+         n += fprintf (stream, "(no-)");
+         break;
+
+       case 'K':
+         n += fprintf (stream, "k");
+         break;
+
+       case 'P':
+         n += fprintf (stream "11/");
+         break;
+
+       case 'D':
+       case '_':
+       case '*':
+         break;
+
+       default:
+         fputc (pattern[-1], stream);
+         n++;
+       }
+    }
+
+  return n;
+}
+
+int
+parse_option (char *arg)
+{
+  int i, j;
+
+  for (i = 0; i < sizeof all_opts / sizeof all_opts[0]; i++)
+    {
+      for (j = 0; j < all_opts[i].num; j++)
+       {
+         if (parse_match (arg, all_opts[i].opts[j].pattern))
+           {
+             set_option (all_opts[i].opts[j].opt);
+             return 1;
+           }
+       }
+    }
+
+  return 0;
+}
+
+static void
+fprint_space (stream, n)
+     FILE *stream;
+     int n;
+{
+  while (n--)
+    fputc (' ', stream);
+}
+
+void
+md_show_usage (stream)
+     FILE *stream;
+{
+  int i, j, n;
+
+  for (i = 0; i < sizeof all_opts / sizeof all_opts[0]; i++)
+    {
+      fprintf (stream "\n%s:\n\n", all_opts[i].title);
+
+      for (j = 0; j < all_opts[i].num; j++)
+       {
+         fprintf (stream, "-m");
+         n = fprintf_opt (stream, all_opts[i].opts[j].pattern);
+         fprint_space (stream, 22 - n);
+         fprintf (stream, "%s\n", all_opts[i].opts[j].description);
+       }
+    }
+}
+*/
+
+void
+md_show_usage (stream)
+     FILE *stream;
+{
+  fprintf (stream, "\
+\n\
+PDP-11 instruction set extentions:\n\
+\n\
+-m(no-)cis             allow (disallow) commersial instruction set\n\
+-m(no-)csm             allow (disallow) CSM instruction\n\
+-m(no-)eis             allow (disallow) full extended instruction set\n\
+-m(no-)fis             allow (disallow) KEV11 floating-point instructions\n\
+-m(no-)fpp             allow (disallow) FP-11 floating-point instructions\n\
+-m(no-)fpu             allow (disallow) FP-11 floating-point instructions\n\
+-m(no-)limited-eis     allow (disallow) limited extended instruction set\n\
+-m(no-)mfpt            allow (disallow) processor type instruction\n\
+-m(no-)multiproc       allow (disallow) multiprocessor instructions\n\
+-m(no-)mxps            allow (disallow) processor status instructions\n\
+-m(no-)spl             allow (disallow) SPL instruction\n\
+-m(no-)ucode           allow (disallow) microcode instructions\n\
+-mall-extensions       allow all instruction set extensions\n\
+                       (this is the default)\n\
+-mno-extentions                disallow all instruction set extensions\n\
+-pic                   generate position-indepenent code\n\
+\n\
+PDP-11 CPU model options:\n\
+\n\
+-mka11*                        KA11 CPU.  base line instruction set only\n\
+-mkb11*                        KB11 CPU.  enable full EIS and SPL\n\
+-mkd11a*               KD11-A CPU.  enable limited EIS\n\
+-mkd11b*               KD11-B CPU.  base line instruction set only\n\
+-mkd11d*               KD11-D CPU.  base line instruction set only\n\
+-mkd11e*               KD11-E CPU.  enable full EIS, MTPS, and MFPS\n\
+-mkd11f*               KD11-F CPU.  enable limited EIS, MTPS, and MFPS\n\
+-mkd11h*               KD11-H CPU.  enable limited EIS, MTPS, and MFPS\n\
+-mkd11q*               KD11-Q CPU.  enable limited EIS, MTPS, and MFPS\n\
+-mkd11k*               KD11-K CPU.  enable full EIS, MTPS, MFPS, LDUB, MED,\n\
+                       XFC, and MFPT\n\
+-mkd11z*               KD11-Z CPU.  enable full EIS, MTPS, MFPS, MFPT, SPL,\n\
+                       and CSM\n\
+-mf11*                 F11 CPU.  enable full EIS, MFPS, MTPS, and MFPT\n\
+-mj11*                 J11 CPU.  enable full EIS, MTPS, MFPS, MFPT, SPL,\n\
+                       CSM, TSTSET, and WRTLCK\n\
+-mt11*                 T11 CPU.  enable limited EIS, MTPS, and MFPS\n\
+\n\
+PDP-11 machine model options:\n\
+\n\
+-m11/03                        same as -mkd11f\n\
+-m11/04                        same as -mkd11d\n\
+-m11/05                        same as -mkd11b\n\
+-m11/10                        same as -mkd11b\n\
+-m11/15                        same as -mka11\n\
+-m11/20                        same as -mka11\n\
+-m11/21                        same as -mt11\n\
+-m11/23                        same as -mf11\n\
+-m11/24                        same as -mf11\n\
+-m11/34                        same as -mkd11e\n\
+-m11/34a               same as -mkd11e -mfpp\n\
+-m11/35                        same as -mkd11a\n\
+-m11/40                        same as -mkd11a\n\
+-m11/44                        same as -mkd11z\n\
+-m11/45                        same as -mkb11\n\
+-m11/50                        same as -mkb11\n\
+-m11/53                        same as -mj11\n\
+-m11/55                        same as -mkb11\n\
+-m11/60                        same as -mkd11k\n\
+-m11/70                        same as -mkb11\n\
+-m11/73                        same as -mj11\n\
+-m11/83                        same as -mj11\n\
+-m11/84                        same as -mj11\n\
+-m11/93                        same as -mj11\n\
+-m11/94                        same as -mj11\n\
+");
+}
+
+symbolS *
+md_undefined_symbol (name)
+     char *name ATTRIBUTE_UNUSED;
+{
+  return 0;
+}
+
+valueT
+md_section_align (segment, size)
+     segT segment ATTRIBUTE_UNUSED;
+     valueT size;
+{
+  return (size + 1) & ~1;
+}
+
+long
+md_pcrel_from (fixP)
+     fixS *fixP;
+{
+  return fixP->fx_frag->fr_address + fixP->fx_where + fixP->fx_size;
+}
+
+/* Translate internal representation of relocation info to BFD target
+   format.  */
+arelent *
+tc_gen_reloc (section, fixp)
+     asection *section ATTRIBUTE_UNUSED;
+     fixS *fixp;
+{
+  arelent *reloc;
+  bfd_reloc_code_real_type code;
+
+  reloc = (arelent *) xmalloc (sizeof (arelent));
+
+  reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
+  *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
+  reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
+
+  /* this is taken account for in md_apply_fix() */
+  reloc->addend = -symbol_get_bfdsym (fixp->fx_addsy)->section->vma;
+
+  switch (fixp->fx_r_type)
+    {
+    case BFD_RELOC_16:
+      if (fixp->fx_pcrel)
+       code = BFD_RELOC_16_PCREL;
+      else
+       code = BFD_RELOC_16;
+      break;
+
+    case BFD_RELOC_16_PCREL:
+      code = BFD_RELOC_16_PCREL;
+      break;
+
+    default:
+      BAD_CASE (fixp->fx_r_type);
+      return NULL;
+    }
+
+  reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
+
+  if (reloc->howto == NULL)
+    {
+      as_bad_where (fixp->fx_file, fixp->fx_line,
+                   "Can not represent %s relocation in this object file format",
+                   bfd_get_reloc_code_name (code));
+      return NULL;
+    }
+
+  return reloc;
+}
+
+void
+pseudo_bss (c)
+     int c ATTRIBUTE_UNUSED;
+{
+  int temp;
+
+  temp = get_absolute_expression ();
+  subseg_set (bss_section, temp);
+  demand_empty_rest_of_line ();
+}
+
+void
+pseudo_even (c)
+     int c ATTRIBUTE_UNUSED;
+{
+  int alignment = 1; /* 2^1 */
+  frag_align (alignment, 0, 1);
+  record_alignment (now_seg, alignment);
+}
+
+/* end of tc-pdp11.c */
diff --git a/gas/config/tc-pdp11.h b/gas/config/tc-pdp11.h
new file mode 100644 (file)
index 0000000..eb2e360
--- /dev/null
@@ -0,0 +1,33 @@
+/* tc-pdp11.h -- Header file for tc-pdp11.c.
+   Copyright (C) 2001 Free Software Foundation, Inc.
+
+   This file is part of GAS, the GNU Assembler.
+
+   GAS is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   GAS is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with GAS; see the file COPYING.  If not, write to the Free
+   Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+   02111-1307, USA. */
+
+#define TC_PDP11 1
+
+#define TARGET_FORMAT "a.out-pdp11"
+#define TARGET_ARCH bfd_arch_pdp11
+#define TARGET_BYTES_BIG_ENDIAN 0
+
+#define LEX_TILDE (LEX_BEGIN_NAME | LEX_NAME)
+
+#define md_operand(x)
+
+long md_chars_to_number PARAMS ((unsigned char *, int));
+
+/* end of tc-pdp11.h */
index a4c792b7c84d9cb3df0db10fd7495656f0f330e5..85504cc44e217cceef681ab691725ec8040d58cb 100755 (executable)
@@ -55,6 +55,7 @@ program_suffix=NONE
 program_transform_name=s,x,x,
 silent=
 site=
+sitefile=
 srcdir=
 target=NONE
 verbose=
@@ -169,6 +170,7 @@ Configuration:
   --help                  print this message
   --no-create             do not create output files
   --quiet, --silent       do not print \`checking...' messages
+  --site-file=FILE        use FILE as the site file
   --version               print the version of autoconf that created configure
 Directory and file names:
   --prefix=PREFIX         install architecture-independent files in PREFIX
@@ -339,6 +341,11 @@ EOF
   -site=* | --site=* | --sit=*)
     site="$ac_optarg" ;;
 
+  -site-file | --site-file | --site-fil | --site-fi | --site-f)
+    ac_prev=sitefile ;;
+  -site-file=* | --site-file=* | --site-fil=* | --site-fi=* | --site-f=*)
+    sitefile="$ac_optarg" ;;
+
   -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
     ac_prev=srcdir ;;
   -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
@@ -504,12 +511,16 @@ fi
 srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`
 
 # Prefer explicitly selected file to automatically selected ones.
-if test -z "$CONFIG_SITE"; then
-  if test "x$prefix" != xNONE; then
-    CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
-  else
-    CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+if test -z "$sitefile"; then
+  if test -z "$CONFIG_SITE"; then
+    if test "x$prefix" != xNONE; then
+      CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+    else
+      CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+    fi
   fi
+else
+  CONFIG_SITE="$sitefile"
 fi
 for ac_site_file in $CONFIG_SITE; do
   if test -r "$ac_site_file"; then
@@ -548,12 +559,12 @@ else
 fi
 
 echo $ac_n "checking for Cygwin environment""... $ac_c" 1>&6
-echo "configure:552: checking for Cygwin environment" >&5
+echo "configure:563: checking for Cygwin environment" >&5
 if eval "test \"`echo '$''{'ac_cv_cygwin'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 557 "configure"
+#line 568 "configure"
 #include "confdefs.h"
 
 int main() {
@@ -564,7 +575,7 @@ int main() {
 return __CYGWIN__;
 ; return 0; }
 EOF
-if { (eval echo configure:568: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:579: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_cygwin=yes
 else
@@ -581,19 +592,19 @@ echo "$ac_t""$ac_cv_cygwin" 1>&6
 CYGWIN=
 test "$ac_cv_cygwin" = yes && CYGWIN=yes
 echo $ac_n "checking for mingw32 environment""... $ac_c" 1>&6
-echo "configure:585: checking for mingw32 environment" >&5
+echo "configure:596: checking for mingw32 environment" >&5
 if eval "test \"`echo '$''{'ac_cv_mingw32'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 590 "configure"
+#line 601 "configure"
 #include "confdefs.h"
 
 int main() {
 return __MINGW32__;
 ; return 0; }
 EOF
-if { (eval echo configure:597: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:608: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_mingw32=yes
 else
@@ -658,7 +669,7 @@ else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; }
 fi
 
 echo $ac_n "checking host system type""... $ac_c" 1>&6
-echo "configure:662: checking host system type" >&5
+echo "configure:673: checking host system type" >&5
 
 host_alias=$host
 case "$host_alias" in
@@ -679,7 +690,7 @@ host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
 echo "$ac_t""$host" 1>&6
 
 echo $ac_n "checking target system type""... $ac_c" 1>&6
-echo "configure:683: checking target system type" >&5
+echo "configure:694: checking target system type" >&5
 
 target_alias=$target
 case "$target_alias" in
@@ -697,7 +708,7 @@ target_os=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
 echo "$ac_t""$target" 1>&6
 
 echo $ac_n "checking build system type""... $ac_c" 1>&6
-echo "configure:701: checking build system type" >&5
+echo "configure:712: checking build system type" >&5
 
 build_alias=$build
 case "$build_alias" in
@@ -721,7 +732,7 @@ test "$host_alias" != "$target_alias" &&
 
 
         echo $ac_n "checking for strerror in -lcposix""... $ac_c" 1>&6
-echo "configure:725: checking for strerror in -lcposix" >&5
+echo "configure:736: checking for strerror in -lcposix" >&5
 ac_lib_var=`echo cposix'_'strerror | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -729,7 +740,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lcposix  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 733 "configure"
+#line 744 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -740,7 +751,7 @@ int main() {
 strerror()
 ; return 0; }
 EOF
-if { (eval echo configure:744: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:755: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -775,7 +786,7 @@ fi
 # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
 # ./install, which can be erroneously created by make from ./install.sh.
 echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
-echo "configure:779: checking for a BSD compatible install" >&5
+echo "configure:790: checking for a BSD compatible install" >&5
 if test -z "$INSTALL"; then
 if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -828,7 +839,7 @@ test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}'
 test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
 
 echo $ac_n "checking whether build environment is sane""... $ac_c" 1>&6
-echo "configure:832: checking whether build environment is sane" >&5
+echo "configure:843: checking whether build environment is sane" >&5
 # Just in case
 sleep 1
 echo timestamp > conftestfile
@@ -885,7 +896,7 @@ test "$program_suffix" != NONE &&
 test "$program_transform_name" = "" && program_transform_name="s,x,x,"
 
 echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
-echo "configure:889: checking whether ${MAKE-make} sets \${MAKE}" >&5
+echo "configure:900: checking whether ${MAKE-make} sets \${MAKE}" >&5
 set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -931,7 +942,7 @@ EOF
 
 missing_dir=`cd $ac_aux_dir && pwd`
 echo $ac_n "checking for working aclocal""... $ac_c" 1>&6
-echo "configure:935: checking for working aclocal" >&5
+echo "configure:946: checking for working aclocal" >&5
 # Run test in a subshell; some versions of sh will print an error if
 # an executable is not found, even if stderr is redirected.
 # Redirect stdin to placate older versions of autoconf.  Sigh.
@@ -944,7 +955,7 @@ else
 fi
 
 echo $ac_n "checking for working autoconf""... $ac_c" 1>&6
-echo "configure:948: checking for working autoconf" >&5
+echo "configure:959: checking for working autoconf" >&5
 # Run test in a subshell; some versions of sh will print an error if
 # an executable is not found, even if stderr is redirected.
 # Redirect stdin to placate older versions of autoconf.  Sigh.
@@ -957,7 +968,7 @@ else
 fi
 
 echo $ac_n "checking for working automake""... $ac_c" 1>&6
-echo "configure:961: checking for working automake" >&5
+echo "configure:972: checking for working automake" >&5
 # Run test in a subshell; some versions of sh will print an error if
 # an executable is not found, even if stderr is redirected.
 # Redirect stdin to placate older versions of autoconf.  Sigh.
@@ -970,7 +981,7 @@ else
 fi
 
 echo $ac_n "checking for working autoheader""... $ac_c" 1>&6
-echo "configure:974: checking for working autoheader" >&5
+echo "configure:985: checking for working autoheader" >&5
 # Run test in a subshell; some versions of sh will print an error if
 # an executable is not found, even if stderr is redirected.
 # Redirect stdin to placate older versions of autoconf.  Sigh.
@@ -983,7 +994,7 @@ else
 fi
 
 echo $ac_n "checking for working makeinfo""... $ac_c" 1>&6
-echo "configure:987: checking for working makeinfo" >&5
+echo "configure:998: checking for working makeinfo" >&5
 # Run test in a subshell; some versions of sh will print an error if
 # an executable is not found, even if stderr is redirected.
 # Redirect stdin to placate older versions of autoconf.  Sigh.
@@ -1069,7 +1080,7 @@ fi
 # Extract the first word of "gcc", so it can be a program name with args.
 set dummy gcc; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1073: checking for $ac_word" >&5
+echo "configure:1084: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1099,7 +1110,7 @@ if test -z "$CC"; then
   # Extract the first word of "cc", so it can be a program name with args.
 set dummy cc; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1103: checking for $ac_word" >&5
+echo "configure:1114: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1150,7 +1161,7 @@ fi
       # Extract the first word of "cl", so it can be a program name with args.
 set dummy cl; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1154: checking for $ac_word" >&5
+echo "configure:1165: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1182,7 +1193,7 @@ fi
 fi
 
 echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
-echo "configure:1186: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
+echo "configure:1197: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
 
 ac_ext=c
 # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
@@ -1193,12 +1204,12 @@ cross_compiling=$ac_cv_prog_cc_cross
 
 cat > conftest.$ac_ext << EOF
 
-#line 1197 "configure"
+#line 1208 "configure"
 #include "confdefs.h"
 
 main(){return(0);}
 EOF
-if { (eval echo configure:1202: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1213: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   ac_cv_prog_cc_works=yes
   # If we can't run a trivial program, we are probably using a cross compiler.
   if (./conftest; exit) 2>/dev/null; then
@@ -1224,12 +1235,12 @@ if test $ac_cv_prog_cc_works = no; then
   { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
 fi
 echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
-echo "configure:1228: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
+echo "configure:1239: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
 echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
 cross_compiling=$ac_cv_prog_cc_cross
 
 echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
-echo "configure:1233: checking whether we are using GNU C" >&5
+echo "configure:1244: checking whether we are using GNU C" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1238,7 +1249,7 @@ else
   yes;
 #endif
 EOF
-if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1242: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1253: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
   ac_cv_prog_gcc=yes
 else
   ac_cv_prog_gcc=no
@@ -1257,7 +1268,7 @@ ac_test_CFLAGS="${CFLAGS+set}"
 ac_save_CFLAGS="$CFLAGS"
 CFLAGS=
 echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
-echo "configure:1261: checking whether ${CC-cc} accepts -g" >&5
+echo "configure:1272: checking whether ${CC-cc} accepts -g" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1300,7 +1311,7 @@ ac_prog=ld
 if test "$ac_cv_prog_gcc" = yes; then
   # Check if gcc -print-prog-name=ld gives a path.
   echo $ac_n "checking for ld used by GCC""... $ac_c" 1>&6
-echo "configure:1304: checking for ld used by GCC" >&5
+echo "configure:1315: checking for ld used by GCC" >&5
   case $host in
   *-*-mingw*)
     # gcc leaves a trailing carriage return which upsets mingw
@@ -1330,10 +1341,10 @@ echo "configure:1304: checking for ld used by GCC" >&5
   esac
 elif test "$with_gnu_ld" = yes; then
   echo $ac_n "checking for GNU ld""... $ac_c" 1>&6
-echo "configure:1334: checking for GNU ld" >&5
+echo "configure:1345: checking for GNU ld" >&5
 else
   echo $ac_n "checking for non-GNU ld""... $ac_c" 1>&6
-echo "configure:1337: checking for non-GNU ld" >&5
+echo "configure:1348: checking for non-GNU ld" >&5
 fi
 if eval "test \"`echo '$''{'ac_cv_path_LD'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -1368,7 +1379,7 @@ else
 fi
 test -z "$LD" && { echo "configure: error: no acceptable ld found in \$PATH" 1>&2; exit 1; }
 echo $ac_n "checking if the linker ($LD) is GNU ld""... $ac_c" 1>&6
-echo "configure:1372: checking if the linker ($LD) is GNU ld" >&5
+echo "configure:1383: checking if the linker ($LD) is GNU ld" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_gnu_ld'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1385,7 +1396,7 @@ with_gnu_ld=$ac_cv_prog_gnu_ld
 
 
 echo $ac_n "checking for $LD option to reload object files""... $ac_c" 1>&6
-echo "configure:1389: checking for $LD option to reload object files" >&5
+echo "configure:1400: checking for $LD option to reload object files" >&5
 if eval "test \"`echo '$''{'lt_cv_ld_reload_flag'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1397,7 +1408,7 @@ reload_flag=$lt_cv_ld_reload_flag
 test -n "$reload_flag" && reload_flag=" $reload_flag"
 
 echo $ac_n "checking for BSD-compatible nm""... $ac_c" 1>&6
-echo "configure:1401: checking for BSD-compatible nm" >&5
+echo "configure:1412: checking for BSD-compatible nm" >&5
 if eval "test \"`echo '$''{'ac_cv_path_NM'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1435,7 +1446,7 @@ NM="$ac_cv_path_NM"
 echo "$ac_t""$NM" 1>&6
 
 echo $ac_n "checking whether ln -s works""... $ac_c" 1>&6
-echo "configure:1439: checking whether ln -s works" >&5
+echo "configure:1450: checking whether ln -s works" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_LN_S'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1456,7 +1467,7 @@ else
 fi
 
 echo $ac_n "checking how to recognise dependant libraries""... $ac_c" 1>&6
-echo "configure:1460: checking how to recognise dependant libraries" >&5
+echo "configure:1471: checking how to recognise dependant libraries" >&5
 if eval "test \"`echo '$''{'lt_cv_deplibs_check_method'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1599,13 +1610,13 @@ file_magic_cmd=$lt_cv_file_magic_cmd
 deplibs_check_method=$lt_cv_deplibs_check_method
 
 echo $ac_n "checking for object suffix""... $ac_c" 1>&6
-echo "configure:1603: checking for object suffix" >&5
+echo "configure:1614: checking for object suffix" >&5
 if eval "test \"`echo '$''{'ac_cv_objext'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   rm -f conftest*
 echo 'int i = 1;' > conftest.$ac_ext
-if { (eval echo configure:1609: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1620: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   for ac_file in conftest.*; do
     case $ac_file in
     *.c) ;;
@@ -1625,7 +1636,7 @@ ac_objext=$ac_cv_objext
 
 
 echo $ac_n "checking for executable suffix""... $ac_c" 1>&6
-echo "configure:1629: checking for executable suffix" >&5
+echo "configure:1640: checking for executable suffix" >&5
 if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1635,10 +1646,10 @@ else
   rm -f conftest*
   echo 'int main () { return 0; }' > conftest.$ac_ext
   ac_cv_exeext=
-  if { (eval echo configure:1639: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
+  if { (eval echo configure:1650: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
     for file in conftest.*; do
       case $file in
-      *.c | *.o | *.obj) ;;
+      *.c | *.o | *.obj | *.ilk | *.pdb) ;;
       *) ac_cv_exeext=`echo $file | sed -e s/conftest//` ;;
       esac
     done
@@ -1668,7 +1679,7 @@ case "$deplibs_check_method" in
 file_magic*)
   if test "$file_magic_cmd" = '$MAGIC_CMD'; then
     echo $ac_n "checking for ${ac_tool_prefix}file""... $ac_c" 1>&6
-echo "configure:1672: checking for ${ac_tool_prefix}file" >&5
+echo "configure:1683: checking for ${ac_tool_prefix}file" >&5
 if eval "test \"`echo '$''{'lt_cv_path_MAGIC_CMD'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1730,7 +1741,7 @@ fi
 if test -z "$lt_cv_path_MAGIC_CMD"; then
   if test -n "$ac_tool_prefix"; then
     echo $ac_n "checking for file""... $ac_c" 1>&6
-echo "configure:1734: checking for file" >&5
+echo "configure:1745: checking for file" >&5
 if eval "test \"`echo '$''{'lt_cv_path_MAGIC_CMD'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1801,7 +1812,7 @@ esac
 # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
 set dummy ${ac_tool_prefix}ranlib; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1805: checking for $ac_word" >&5
+echo "configure:1816: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1833,7 +1844,7 @@ if test -n "$ac_tool_prefix"; then
   # Extract the first word of "ranlib", so it can be a program name with args.
 set dummy ranlib; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1837: checking for $ac_word" >&5
+echo "configure:1848: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1868,7 +1879,7 @@ fi
 # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
 set dummy ${ac_tool_prefix}strip; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1872: checking for $ac_word" >&5
+echo "configure:1883: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_STRIP'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1900,7 +1911,7 @@ if test -n "$ac_tool_prefix"; then
   # Extract the first word of "strip", so it can be a program name with args.
 set dummy strip; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1904: checking for $ac_word" >&5
+echo "configure:1915: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_STRIP'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1967,8 +1978,8 @@ test x"$pic_mode" = xno && libtool_flags="$libtool_flags --prefer-non-pic"
 case "$host" in
 *-*-irix6*)
   # Find out which ABI we are using.
-  echo '#line 1971 "configure"' > conftest.$ac_ext
-  if { (eval echo configure:1972: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  echo '#line 1982 "configure"' > conftest.$ac_ext
+  if { (eval echo configure:1983: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
     case "`/usr/bin/file conftest.o`" in
     *32-bit*)
       LD="${LD-ld} -32"
@@ -1989,7 +2000,7 @@ case "$host" in
   SAVE_CFLAGS="$CFLAGS"
   CFLAGS="$CFLAGS -belf"
   echo $ac_n "checking whether the C compiler needs -belf""... $ac_c" 1>&6
-echo "configure:1993: checking whether the C compiler needs -belf" >&5
+echo "configure:2004: checking whether the C compiler needs -belf" >&5
 if eval "test \"`echo '$''{'lt_cv_cc_needs_belf'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -2002,14 +2013,14 @@ ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$a
 cross_compiling=$ac_cv_prog_cc_cross
 
      cat > conftest.$ac_ext <<EOF
-#line 2006 "configure"
+#line 2017 "configure"
 #include "confdefs.h"
 
 int main() {
 
 ; return 0; }
 EOF
-if { (eval echo configure:2013: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2024: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   lt_cv_cc_needs_belf=yes
 else
@@ -2520,10 +2531,10 @@ EOF
 
       sh-*-linux*)         fmt=elf em=linux ;;
       sh-*-elf*)           fmt=elf ;;
-      sh-*-coff*)           fmt=coff ;;
+      sh-*-coff*)           fmt=coff bfd_gas=yes;;
       sh-*-pe*)             fmt=coff em=pe bfd_gas=yes;;
       sh-*-rtemself*)       fmt=elf ;;
-      sh-*-rtems*)         fmt=coff ;;
+      sh-*-rtems*)         fmt=coff bfd_gas=yes;;
 
       ns32k-pc532-mach* | ns32k-pc532-ux*)    fmt=aout em=pc532mach ;;
       ns32k-pc532-netbsd* | ns32k-pc532-lites*)  fmt=aout em=nbsd532 ;;
@@ -2617,6 +2628,7 @@ EOF
       ia64*-*) bfd_gas=yes ;;
       mips-*)  bfd_gas=yes ;;
       ns32k-*) bfd_gas=yes ;;
+      pdp11-*) bfd_gas=yes ;;
       ppc-*)   bfd_gas=yes ;;
       sparc-*) bfd_gas=yes ;;
       strongarm-*)     bfd_gas=yes ;;
@@ -2795,6 +2807,7 @@ fi
 # is emulated.
 case ${target_cpu} in
   vax | tahoe )        atof=${target_cpu} ;;
+  pdp11)       atof=vax ;;
   *)           atof=ieee ;;
 esac
 
@@ -3083,7 +3096,7 @@ EOF
 # Extract the first word of "gcc", so it can be a program name with args.
 set dummy gcc; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:3087: checking for $ac_word" >&5
+echo "configure:3100: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -3113,7 +3126,7 @@ if test -z "$CC"; then
   # Extract the first word of "cc", so it can be a program name with args.
 set dummy cc; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:3117: checking for $ac_word" >&5
+echo "configure:3130: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -3164,7 +3177,7 @@ fi
       # Extract the first word of "cl", so it can be a program name with args.
 set dummy cl; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:3168: checking for $ac_word" >&5
+echo "configure:3181: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -3196,7 +3209,7 @@ fi
 fi
 
 echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
-echo "configure:3200: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
+echo "configure:3213: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
 
 ac_ext=c
 # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
@@ -3207,12 +3220,12 @@ cross_compiling=$ac_cv_prog_cc_cross
 
 cat > conftest.$ac_ext << EOF
 
-#line 3211 "configure"
+#line 3224 "configure"
 #include "confdefs.h"
 
 main(){return(0);}
 EOF
-if { (eval echo configure:3216: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3229: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   ac_cv_prog_cc_works=yes
   # If we can't run a trivial program, we are probably using a cross compiler.
   if (./conftest; exit) 2>/dev/null; then
@@ -3238,12 +3251,12 @@ if test $ac_cv_prog_cc_works = no; then
   { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
 fi
 echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
-echo "configure:3242: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
+echo "configure:3255: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
 echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
 cross_compiling=$ac_cv_prog_cc_cross
 
 echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
-echo "configure:3247: checking whether we are using GNU C" >&5
+echo "configure:3260: checking whether we are using GNU C" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -3252,7 +3265,7 @@ else
   yes;
 #endif
 EOF
-if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:3256: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:3269: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
   ac_cv_prog_gcc=yes
 else
   ac_cv_prog_gcc=no
@@ -3271,7 +3284,7 @@ ac_test_CFLAGS="${CFLAGS+set}"
 ac_save_CFLAGS="$CFLAGS"
 CFLAGS=
 echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
-echo "configure:3275: checking whether ${CC-cc} accepts -g" >&5
+echo "configure:3288: checking whether ${CC-cc} accepts -g" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -3308,7 +3321,7 @@ do
 # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:3312: checking for $ac_word" >&5
+echo "configure:3325: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_YACC'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -3339,7 +3352,7 @@ done
 test -n "$YACC" || YACC="yacc"
 
 echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
-echo "configure:3343: checking how to run the C preprocessor" >&5
+echo "configure:3356: checking how to run the C preprocessor" >&5
 # On Suns, sometimes $CPP names a directory.
 if test -n "$CPP" && test -d "$CPP"; then
   CPP=
@@ -3354,13 +3367,13 @@ else
   # On the NeXT, cc -E runs the code through the compiler's parser,
   # not just through cpp.
   cat > conftest.$ac_ext <<EOF
-#line 3358 "configure"
+#line 3371 "configure"
 #include "confdefs.h"
 #include <assert.h>
 Syntax Error
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:3364: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:3377: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   :
@@ -3371,13 +3384,13 @@ else
   rm -rf conftest*
   CPP="${CC-cc} -E -traditional-cpp"
   cat > conftest.$ac_ext <<EOF
-#line 3375 "configure"
+#line 3388 "configure"
 #include "confdefs.h"
 #include <assert.h>
 Syntax Error
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:3381: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:3394: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   :
@@ -3388,13 +3401,13 @@ else
   rm -rf conftest*
   CPP="${CC-cc} -nologo -E"
   cat > conftest.$ac_ext <<EOF
-#line 3392 "configure"
+#line 3405 "configure"
 #include "confdefs.h"
 #include <assert.h>
 Syntax Error
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:3398: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:3411: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   :
@@ -3424,7 +3437,7 @@ do
 # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:3428: checking for $ac_word" >&5
+echo "configure:3441: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_LEX'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -3457,7 +3470,7 @@ test -n "$LEX" || LEX=""$missing_dir/missing flex""
 # Extract the first word of "flex", so it can be a program name with args.
 set dummy flex; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:3461: checking for $ac_word" >&5
+echo "configure:3474: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_LEX'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -3491,7 +3504,7 @@ then
   *) ac_lib=l ;;
   esac
   echo $ac_n "checking for yywrap in -l$ac_lib""... $ac_c" 1>&6
-echo "configure:3495: checking for yywrap in -l$ac_lib" >&5
+echo "configure:3508: checking for yywrap in -l$ac_lib" >&5
 ac_lib_var=`echo $ac_lib'_'yywrap | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -3499,7 +3512,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-l$ac_lib  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 3503 "configure"
+#line 3516 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -3510,7 +3523,7 @@ int main() {
 yywrap()
 ; return 0; }
 EOF
-if { (eval echo configure:3514: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3527: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -3533,7 +3546,7 @@ fi
 fi
 
 echo $ac_n "checking lex output file root""... $ac_c" 1>&6
-echo "configure:3537: checking lex output file root" >&5
+echo "configure:3550: checking lex output file root" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_lex_root'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -3554,7 +3567,7 @@ echo "$ac_t""$ac_cv_prog_lex_root" 1>&6
 LEX_OUTPUT_ROOT=$ac_cv_prog_lex_root
 
 echo $ac_n "checking whether yytext is a pointer""... $ac_c" 1>&6
-echo "configure:3558: checking whether yytext is a pointer" >&5
+echo "configure:3571: checking whether yytext is a pointer" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_lex_yytext_pointer'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -3566,14 +3579,14 @@ echo 'extern char *yytext;' >>$LEX_OUTPUT_ROOT.c
 ac_save_LIBS="$LIBS"
 LIBS="$LIBS $LEXLIB"
 cat > conftest.$ac_ext <<EOF
-#line 3570 "configure"
+#line 3583 "configure"
 #include "confdefs.h"
 `cat $LEX_OUTPUT_ROOT.c`
 int main() {
 
 ; return 0; }
 EOF
-if { (eval echo configure:3577: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3590: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   ac_cv_prog_lex_yytext_pointer=yes
 else
@@ -3599,7 +3612,7 @@ ALL_LINGUAS=
 # Extract the first word of "ranlib", so it can be a program name with args.
 set dummy ranlib; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:3603: checking for $ac_word" >&5
+echo "configure:3616: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -3627,12 +3640,12 @@ else
 fi
 
 echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6
-echo "configure:3631: checking for ANSI C header files" >&5
+echo "configure:3644: checking for ANSI C header files" >&5
 if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3636 "configure"
+#line 3649 "configure"
 #include "confdefs.h"
 #include <stdlib.h>
 #include <stdarg.h>
@@ -3640,7 +3653,7 @@ else
 #include <float.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:3644: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:3657: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -3657,7 +3670,7 @@ rm -f conftest*
 if test $ac_cv_header_stdc = yes; then
   # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
 cat > conftest.$ac_ext <<EOF
-#line 3661 "configure"
+#line 3674 "configure"
 #include "confdefs.h"
 #include <string.h>
 EOF
@@ -3675,7 +3688,7 @@ fi
 if test $ac_cv_header_stdc = yes; then
   # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
 cat > conftest.$ac_ext <<EOF
-#line 3679 "configure"
+#line 3692 "configure"
 #include "confdefs.h"
 #include <stdlib.h>
 EOF
@@ -3696,7 +3709,7 @@ if test "$cross_compiling" = yes; then
   :
 else
   cat > conftest.$ac_ext <<EOF
-#line 3700 "configure"
+#line 3713 "configure"
 #include "confdefs.h"
 #include <ctype.h>
 #define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
@@ -3707,7 +3720,7 @@ if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2);
 exit (0); }
 
 EOF
-if { (eval echo configure:3711: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:3724: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   :
 else
@@ -3731,12 +3744,12 @@ EOF
 fi
 
 echo $ac_n "checking for working const""... $ac_c" 1>&6
-echo "configure:3735: checking for working const" >&5
+echo "configure:3748: checking for working const" >&5
 if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3740 "configure"
+#line 3753 "configure"
 #include "confdefs.h"
 
 int main() {
@@ -3785,7 +3798,7 @@ ccp = (char const *const *) p;
 
 ; return 0; }
 EOF
-if { (eval echo configure:3789: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3802: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_c_const=yes
 else
@@ -3806,21 +3819,21 @@ EOF
 fi
 
 echo $ac_n "checking for inline""... $ac_c" 1>&6
-echo "configure:3810: checking for inline" >&5
+echo "configure:3823: checking for inline" >&5
 if eval "test \"`echo '$''{'ac_cv_c_inline'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   ac_cv_c_inline=no
 for ac_kw in inline __inline__ __inline; do
   cat > conftest.$ac_ext <<EOF
-#line 3817 "configure"
+#line 3830 "configure"
 #include "confdefs.h"
 
 int main() {
 } $ac_kw foo() {
 ; return 0; }
 EOF
-if { (eval echo configure:3824: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3837: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_c_inline=$ac_kw; break
 else
@@ -3846,12 +3859,12 @@ EOF
 esac
 
 echo $ac_n "checking for off_t""... $ac_c" 1>&6
-echo "configure:3850: checking for off_t" >&5
+echo "configure:3863: checking for off_t" >&5
 if eval "test \"`echo '$''{'ac_cv_type_off_t'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3855 "configure"
+#line 3868 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #if STDC_HEADERS
@@ -3879,12 +3892,12 @@ EOF
 fi
 
 echo $ac_n "checking for size_t""... $ac_c" 1>&6
-echo "configure:3883: checking for size_t" >&5
+echo "configure:3896: checking for size_t" >&5
 if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3888 "configure"
+#line 3901 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #if STDC_HEADERS
@@ -3914,19 +3927,19 @@ fi
 # The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
 # for constant arguments.  Useless!
 echo $ac_n "checking for working alloca.h""... $ac_c" 1>&6
-echo "configure:3918: checking for working alloca.h" >&5
+echo "configure:3931: checking for working alloca.h" >&5
 if eval "test \"`echo '$''{'ac_cv_header_alloca_h'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3923 "configure"
+#line 3936 "configure"
 #include "confdefs.h"
 #include <alloca.h>
 int main() {
 char *p = alloca(2 * sizeof(int));
 ; return 0; }
 EOF
-if { (eval echo configure:3930: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3943: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   ac_cv_header_alloca_h=yes
 else
@@ -3947,12 +3960,12 @@ EOF
 fi
 
 echo $ac_n "checking for alloca""... $ac_c" 1>&6
-echo "configure:3951: checking for alloca" >&5
+echo "configure:3964: checking for alloca" >&5
 if eval "test \"`echo '$''{'ac_cv_func_alloca_works'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3956 "configure"
+#line 3969 "configure"
 #include "confdefs.h"
 
 #ifdef __GNUC__
@@ -3980,7 +3993,7 @@ int main() {
 char *p = (char *) alloca(1);
 ; return 0; }
 EOF
-if { (eval echo configure:3984: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3997: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   ac_cv_func_alloca_works=yes
 else
@@ -4012,12 +4025,12 @@ EOF
 
 
 echo $ac_n "checking whether alloca needs Cray hooks""... $ac_c" 1>&6
-echo "configure:4016: checking whether alloca needs Cray hooks" >&5
+echo "configure:4029: checking whether alloca needs Cray hooks" >&5
 if eval "test \"`echo '$''{'ac_cv_os_cray'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 4021 "configure"
+#line 4034 "configure"
 #include "confdefs.h"
 #if defined(CRAY) && ! defined(CRAY2)
 webecray
@@ -4042,12 +4055,12 @@ echo "$ac_t""$ac_cv_os_cray" 1>&6
 if test $ac_cv_os_cray = yes; then
 for ac_func in _getb67 GETB67 getb67; do
   echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:4046: checking for $ac_func" >&5
+echo "configure:4059: checking for $ac_func" >&5
 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 4051 "configure"
+#line 4064 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -4070,7 +4083,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:4074: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4087: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -4097,7 +4110,7 @@ done
 fi
 
 echo $ac_n "checking stack direction for C alloca""... $ac_c" 1>&6
-echo "configure:4101: checking stack direction for C alloca" >&5
+echo "configure:4114: checking stack direction for C alloca" >&5
 if eval "test \"`echo '$''{'ac_cv_c_stack_direction'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -4105,7 +4118,7 @@ else
   ac_cv_c_stack_direction=0
 else
   cat > conftest.$ac_ext <<EOF
-#line 4109 "configure"
+#line 4122 "configure"
 #include "confdefs.h"
 find_stack_direction ()
 {
@@ -4124,7 +4137,7 @@ main ()
   exit (find_stack_direction() < 0);
 }
 EOF
-if { (eval echo configure:4128: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:4141: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   ac_cv_c_stack_direction=1
 else
@@ -4149,17 +4162,17 @@ for ac_hdr in unistd.h
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:4153: checking for $ac_hdr" >&5
+echo "configure:4166: checking for $ac_hdr" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 4158 "configure"
+#line 4171 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:4163: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:4176: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -4188,12 +4201,12 @@ done
 for ac_func in getpagesize
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:4192: checking for $ac_func" >&5
+echo "configure:4205: checking for $ac_func" >&5
 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 4197 "configure"
+#line 4210 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -4216,7 +4229,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:4220: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4233: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -4241,7 +4254,7 @@ fi
 done
 
 echo $ac_n "checking for working mmap""... $ac_c" 1>&6
-echo "configure:4245: checking for working mmap" >&5
+echo "configure:4258: checking for working mmap" >&5
 if eval "test \"`echo '$''{'ac_cv_func_mmap_fixed_mapped'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -4249,7 +4262,7 @@ else
   ac_cv_func_mmap_fixed_mapped=no
 else
   cat > conftest.$ac_ext <<EOF
-#line 4253 "configure"
+#line 4266 "configure"
 #include "confdefs.h"
 
 /* Thanks to Mike Haertel and Jim Avera for this test.
@@ -4389,7 +4402,7 @@ main()
 }
 
 EOF
-if { (eval echo configure:4393: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:4406: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   ac_cv_func_mmap_fixed_mapped=yes
 else
@@ -4417,17 +4430,17 @@ unistd.h values.h sys/param.h
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:4421: checking for $ac_hdr" >&5
+echo "configure:4434: checking for $ac_hdr" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 4426 "configure"
+#line 4439 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:4431: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:4444: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -4457,12 +4470,12 @@ done
 __argz_count __argz_stringify __argz_next
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:4461: checking for $ac_func" >&5
+echo "configure:4474: checking for $ac_func" >&5
 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 4466 "configure"
+#line 4479 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -4485,7 +4498,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:4489: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4502: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -4514,12 +4527,12 @@ done
      for ac_func in stpcpy
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:4518: checking for $ac_func" >&5
+echo "configure:4531: checking for $ac_func" >&5
 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 4523 "configure"
+#line 4536 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -4542,7 +4555,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:4546: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4559: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -4576,19 +4589,19 @@ EOF
 
    if test $ac_cv_header_locale_h = yes; then
     echo $ac_n "checking for LC_MESSAGES""... $ac_c" 1>&6
-echo "configure:4580: checking for LC_MESSAGES" >&5
+echo "configure:4593: checking for LC_MESSAGES" >&5
 if eval "test \"`echo '$''{'am_cv_val_LC_MESSAGES'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 4585 "configure"
+#line 4598 "configure"
 #include "confdefs.h"
 #include <locale.h>
 int main() {
 return LC_MESSAGES
 ; return 0; }
 EOF
-if { (eval echo configure:4592: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4605: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   am_cv_val_LC_MESSAGES=yes
 else
@@ -4609,7 +4622,7 @@ EOF
     fi
   fi
    echo $ac_n "checking whether NLS is requested""... $ac_c" 1>&6
-echo "configure:4613: checking whether NLS is requested" >&5
+echo "configure:4626: checking whether NLS is requested" >&5
         # Check whether --enable-nls or --disable-nls was given.
 if test "${enable_nls+set}" = set; then
   enableval="$enable_nls"
@@ -4629,7 +4642,7 @@ fi
 EOF
 
       echo $ac_n "checking whether included gettext is requested""... $ac_c" 1>&6
-echo "configure:4633: checking whether included gettext is requested" >&5
+echo "configure:4646: checking whether included gettext is requested" >&5
       # Check whether --with-included-gettext or --without-included-gettext was given.
 if test "${with_included_gettext+set}" = set; then
   withval="$with_included_gettext"
@@ -4648,17 +4661,17 @@ fi
 
        ac_safe=`echo "libintl.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for libintl.h""... $ac_c" 1>&6
-echo "configure:4652: checking for libintl.h" >&5
+echo "configure:4665: checking for libintl.h" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 4657 "configure"
+#line 4670 "configure"
 #include "confdefs.h"
 #include <libintl.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:4662: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:4675: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -4675,19 +4688,19 @@ fi
 if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
   echo "$ac_t""yes" 1>&6
   echo $ac_n "checking for gettext in libc""... $ac_c" 1>&6
-echo "configure:4679: checking for gettext in libc" >&5
+echo "configure:4692: checking for gettext in libc" >&5
 if eval "test \"`echo '$''{'gt_cv_func_gettext_libc'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 4684 "configure"
+#line 4697 "configure"
 #include "confdefs.h"
 #include <libintl.h>
 int main() {
 return (int) gettext ("")
 ; return 0; }
 EOF
-if { (eval echo configure:4691: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4704: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   gt_cv_func_gettext_libc=yes
 else
@@ -4703,7 +4716,7 @@ echo "$ac_t""$gt_cv_func_gettext_libc" 1>&6
 
           if test "$gt_cv_func_gettext_libc" != "yes"; then
             echo $ac_n "checking for bindtextdomain in -lintl""... $ac_c" 1>&6
-echo "configure:4707: checking for bindtextdomain in -lintl" >&5
+echo "configure:4720: checking for bindtextdomain in -lintl" >&5
 ac_lib_var=`echo intl'_'bindtextdomain | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -4711,7 +4724,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lintl  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 4715 "configure"
+#line 4728 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -4722,7 +4735,7 @@ int main() {
 bindtextdomain()
 ; return 0; }
 EOF
-if { (eval echo configure:4726: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4739: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -4738,19 +4751,19 @@ fi
 if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
   echo "$ac_t""yes" 1>&6
   echo $ac_n "checking for gettext in libintl""... $ac_c" 1>&6
-echo "configure:4742: checking for gettext in libintl" >&5
+echo "configure:4755: checking for gettext in libintl" >&5
 if eval "test \"`echo '$''{'gt_cv_func_gettext_libintl'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 4747 "configure"
+#line 4760 "configure"
 #include "confdefs.h"
 
 int main() {
 return (int) gettext ("")
 ; return 0; }
 EOF
-if { (eval echo configure:4754: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4767: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   gt_cv_func_gettext_libintl=yes
 else
@@ -4778,7 +4791,7 @@ EOF
              # Extract the first word of "msgfmt", so it can be a program name with args.
 set dummy msgfmt; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:4782: checking for $ac_word" >&5
+echo "configure:4795: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_path_MSGFMT'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -4812,12 +4825,12 @@ fi
                for ac_func in dcgettext
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:4816: checking for $ac_func" >&5
+echo "configure:4829: checking for $ac_func" >&5
 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 4821 "configure"
+#line 4834 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -4840,7 +4853,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:4844: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4857: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -4867,7 +4880,7 @@ done
                # Extract the first word of "gmsgfmt", so it can be a program name with args.
 set dummy gmsgfmt; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:4871: checking for $ac_word" >&5
+echo "configure:4884: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_path_GMSGFMT'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -4903,7 +4916,7 @@ fi
                # Extract the first word of "xgettext", so it can be a program name with args.
 set dummy xgettext; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:4907: checking for $ac_word" >&5
+echo "configure:4920: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_path_XGETTEXT'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -4935,7 +4948,7 @@ else
 fi
 
                cat > conftest.$ac_ext <<EOF
-#line 4939 "configure"
+#line 4952 "configure"
 #include "confdefs.h"
 
 int main() {
@@ -4943,7 +4956,7 @@ extern int _nl_msg_cat_cntr;
                               return _nl_msg_cat_cntr
 ; return 0; }
 EOF
-if { (eval echo configure:4947: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4960: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   CATOBJEXT=.gmo
                   DATADIRNAME=share
@@ -4975,7 +4988,7 @@ fi
         # Extract the first word of "msgfmt", so it can be a program name with args.
 set dummy msgfmt; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:4979: checking for $ac_word" >&5
+echo "configure:4992: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_path_MSGFMT'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -5009,7 +5022,7 @@ fi
         # Extract the first word of "gmsgfmt", so it can be a program name with args.
 set dummy gmsgfmt; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:5013: checking for $ac_word" >&5
+echo "configure:5026: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_path_GMSGFMT'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -5045,7 +5058,7 @@ fi
         # Extract the first word of "xgettext", so it can be a program name with args.
 set dummy xgettext; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:5049: checking for $ac_word" >&5
+echo "configure:5062: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_path_XGETTEXT'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -5135,7 +5148,7 @@ fi
        LINGUAS=
      else
        echo $ac_n "checking for catalogs to be installed""... $ac_c" 1>&6
-echo "configure:5139: checking for catalogs to be installed" >&5
+echo "configure:5152: checking for catalogs to be installed" >&5
        NEW_LINGUAS=
        for lang in ${LINGUAS=$ALL_LINGUAS}; do
          case "$ALL_LINGUAS" in
@@ -5163,17 +5176,17 @@ echo "configure:5139: checking for catalogs to be installed" >&5
       if test "$CATOBJEXT" = ".cat"; then
         ac_safe=`echo "linux/version.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for linux/version.h""... $ac_c" 1>&6
-echo "configure:5167: checking for linux/version.h" >&5
+echo "configure:5180: checking for linux/version.h" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 5172 "configure"
+#line 5185 "configure"
 #include "confdefs.h"
 #include <linux/version.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:5177: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:5190: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -5236,7 +5249,7 @@ fi
   
 
 echo $ac_n "checking whether to enable maintainer-specific portions of Makefiles""... $ac_c" 1>&6
-echo "configure:5240: checking whether to enable maintainer-specific portions of Makefiles" >&5
+echo "configure:5253: checking whether to enable maintainer-specific portions of Makefiles" >&5
     # Check whether --enable-maintainer-mode or --disable-maintainer-mode was given.
 if test "${enable_maintainer_mode+set}" = set; then
   enableval="$enable_maintainer_mode"
@@ -5261,7 +5274,7 @@ fi
 
 
 echo $ac_n "checking for executable suffix""... $ac_c" 1>&6
-echo "configure:5265: checking for executable suffix" >&5
+echo "configure:5278: checking for executable suffix" >&5
 if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -5271,10 +5284,10 @@ else
   rm -f conftest*
   echo 'int main () { return 0; }' > conftest.$ac_ext
   ac_cv_exeext=
-  if { (eval echo configure:5275: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
+  if { (eval echo configure:5288: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
     for file in conftest.*; do
       case $file in
-      *.c | *.o | *.obj) ;;
+      *.c | *.o | *.obj | *.ilk | *.pdb) ;;
       *) ac_cv_exeext=`echo $file | sed -e s/conftest//` ;;
       esac
     done
@@ -5296,17 +5309,17 @@ for ac_hdr in string.h stdlib.h memory.h strings.h unistd.h stdarg.h varargs.h e
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:5300: checking for $ac_hdr" >&5
+echo "configure:5313: checking for $ac_hdr" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 5305 "configure"
+#line 5318 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:5310: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:5323: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -5336,7 +5349,7 @@ done
 # Put this here so that autoconf's "cross-compiling" message doesn't confuse
 # people who are not cross-compiling but are compiling cross-assemblers.
 echo $ac_n "checking whether compiling a cross-assembler""... $ac_c" 1>&6
-echo "configure:5340: checking whether compiling a cross-assembler" >&5
+echo "configure:5353: checking whether compiling a cross-assembler" >&5
 if test "${host}" = "${target}"; then
   cross_gas=no
 else
@@ -5351,19 +5364,19 @@ echo "$ac_t""$cross_gas" 1>&6
 # The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
 # for constant arguments.  Useless!
 echo $ac_n "checking for working alloca.h""... $ac_c" 1>&6
-echo "configure:5355: checking for working alloca.h" >&5
+echo "configure:5368: checking for working alloca.h" >&5
 if eval "test \"`echo '$''{'ac_cv_header_alloca_h'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 5360 "configure"
+#line 5373 "configure"
 #include "confdefs.h"
 #include <alloca.h>
 int main() {
 char *p = alloca(2 * sizeof(int));
 ; return 0; }
 EOF
-if { (eval echo configure:5367: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5380: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   ac_cv_header_alloca_h=yes
 else
@@ -5384,12 +5397,12 @@ EOF
 fi
 
 echo $ac_n "checking for alloca""... $ac_c" 1>&6
-echo "configure:5388: checking for alloca" >&5
+echo "configure:5401: checking for alloca" >&5
 if eval "test \"`echo '$''{'ac_cv_func_alloca_works'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 5393 "configure"
+#line 5406 "configure"
 #include "confdefs.h"
 
 #ifdef __GNUC__
@@ -5417,7 +5430,7 @@ int main() {
 char *p = (char *) alloca(1);
 ; return 0; }
 EOF
-if { (eval echo configure:5421: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5434: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   ac_cv_func_alloca_works=yes
 else
@@ -5449,12 +5462,12 @@ EOF
 
 
 echo $ac_n "checking whether alloca needs Cray hooks""... $ac_c" 1>&6
-echo "configure:5453: checking whether alloca needs Cray hooks" >&5
+echo "configure:5466: checking whether alloca needs Cray hooks" >&5
 if eval "test \"`echo '$''{'ac_cv_os_cray'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 5458 "configure"
+#line 5471 "configure"
 #include "confdefs.h"
 #if defined(CRAY) && ! defined(CRAY2)
 webecray
@@ -5479,12 +5492,12 @@ echo "$ac_t""$ac_cv_os_cray" 1>&6
 if test $ac_cv_os_cray = yes; then
 for ac_func in _getb67 GETB67 getb67; do
   echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:5483: checking for $ac_func" >&5
+echo "configure:5496: checking for $ac_func" >&5
 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 5488 "configure"
+#line 5501 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -5507,7 +5520,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:5511: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5524: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -5534,7 +5547,7 @@ done
 fi
 
 echo $ac_n "checking stack direction for C alloca""... $ac_c" 1>&6
-echo "configure:5538: checking stack direction for C alloca" >&5
+echo "configure:5551: checking stack direction for C alloca" >&5
 if eval "test \"`echo '$''{'ac_cv_c_stack_direction'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -5542,7 +5555,7 @@ else
   ac_cv_c_stack_direction=0
 else
   cat > conftest.$ac_ext <<EOF
-#line 5546 "configure"
+#line 5559 "configure"
 #include "confdefs.h"
 find_stack_direction ()
 {
@@ -5561,7 +5574,7 @@ main ()
   exit (find_stack_direction() < 0);
 }
 EOF
-if { (eval echo configure:5565: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:5578: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   ac_cv_c_stack_direction=1
 else
@@ -5583,21 +5596,21 @@ EOF
 fi
 
 echo $ac_n "checking for inline""... $ac_c" 1>&6
-echo "configure:5587: checking for inline" >&5
+echo "configure:5600: checking for inline" >&5
 if eval "test \"`echo '$''{'ac_cv_c_inline'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   ac_cv_c_inline=no
 for ac_kw in inline __inline__ __inline; do
   cat > conftest.$ac_ext <<EOF
-#line 5594 "configure"
+#line 5607 "configure"
 #include "confdefs.h"
 
 int main() {
 } $ac_kw foo() {
 ; return 0; }
 EOF
-if { (eval echo configure:5601: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:5614: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_c_inline=$ac_kw; break
 else
@@ -5627,12 +5640,12 @@ esac
 for ac_func in unlink remove
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:5631: checking for $ac_func" >&5
+echo "configure:5644: checking for $ac_func" >&5
 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 5636 "configure"
+#line 5649 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -5655,7 +5668,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:5659: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5672: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -5684,12 +5697,12 @@ done
 for ac_func in sbrk
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:5688: checking for $ac_func" >&5
+echo "configure:5701: checking for $ac_func" >&5
 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 5693 "configure"
+#line 5706 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -5712,7 +5725,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:5716: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5729: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -5747,7 +5760,7 @@ case "$host" in
   ;;
 *-ncr-sysv4.3*)
   echo $ac_n "checking for _mwvalidcheckl in -lmw""... $ac_c" 1>&6
-echo "configure:5751: checking for _mwvalidcheckl in -lmw" >&5
+echo "configure:5764: checking for _mwvalidcheckl in -lmw" >&5
 ac_lib_var=`echo mw'_'_mwvalidcheckl | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -5755,7 +5768,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lmw  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 5759 "configure"
+#line 5772 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -5766,7 +5779,7 @@ int main() {
 _mwvalidcheckl()
 ; return 0; }
 EOF
-if { (eval echo configure:5770: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5783: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -5787,7 +5800,7 @@ else
 fi
 
   echo $ac_n "checking for main in -lm""... $ac_c" 1>&6
-echo "configure:5791: checking for main in -lm" >&5
+echo "configure:5804: checking for main in -lm" >&5
 ac_lib_var=`echo m'_'main | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -5795,14 +5808,14 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lm  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 5799 "configure"
+#line 5812 "configure"
 #include "confdefs.h"
 
 int main() {
 main()
 ; return 0; }
 EOF
-if { (eval echo configure:5806: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5819: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -5825,7 +5838,7 @@ fi
   ;;
 *)
   echo $ac_n "checking for main in -lm""... $ac_c" 1>&6
-echo "configure:5829: checking for main in -lm" >&5
+echo "configure:5842: checking for main in -lm" >&5
 ac_lib_var=`echo m'_'main | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -5833,14 +5846,14 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lm  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 5837 "configure"
+#line 5850 "configure"
 #include "confdefs.h"
 
 int main() {
 main()
 ; return 0; }
 EOF
-if { (eval echo configure:5844: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5857: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -5871,12 +5884,12 @@ esac
 # enough, but on some of those systems, the assert macro relies on requoting
 # working properly!
 echo $ac_n "checking for working assert macro""... $ac_c" 1>&6
-echo "configure:5875: checking for working assert macro" >&5
+echo "configure:5888: checking for working assert macro" >&5
 if eval "test \"`echo '$''{'gas_cv_assert_ok'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 5880 "configure"
+#line 5893 "configure"
 #include "confdefs.h"
 #include <assert.h>
 #include <stdio.h>
@@ -5892,7 +5905,7 @@ assert (a == b
 
 ; return 0; }
 EOF
-if { (eval echo configure:5896: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5909: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   gas_cv_assert_ok=yes
 else
@@ -5933,12 +5946,12 @@ gas_test_headers="
 "
 
 echo $ac_n "checking whether declaration is required for strstr""... $ac_c" 1>&6
-echo "configure:5937: checking whether declaration is required for strstr" >&5
+echo "configure:5950: checking whether declaration is required for strstr" >&5
 if eval "test \"`echo '$''{'gas_cv_decl_needed_strstr'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 5942 "configure"
+#line 5955 "configure"
 #include "confdefs.h"
 $gas_test_headers
 int main() {
@@ -5949,7 +5962,7 @@ x = (f) strstr;
 
 ; return 0; }
 EOF
-if { (eval echo configure:5953: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5966: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   gas_cv_decl_needed_strstr=no
 else
@@ -5970,12 +5983,12 @@ fi
 
 
 echo $ac_n "checking whether declaration is required for malloc""... $ac_c" 1>&6
-echo "configure:5974: checking whether declaration is required for malloc" >&5
+echo "configure:5987: checking whether declaration is required for malloc" >&5
 if eval "test \"`echo '$''{'gas_cv_decl_needed_malloc'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 5979 "configure"
+#line 5992 "configure"
 #include "confdefs.h"
 $gas_test_headers
 int main() {
@@ -5986,7 +5999,7 @@ x = (f) malloc;
 
 ; return 0; }
 EOF
-if { (eval echo configure:5990: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6003: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   gas_cv_decl_needed_malloc=no
 else
@@ -6007,12 +6020,12 @@ fi
 
 
 echo $ac_n "checking whether declaration is required for free""... $ac_c" 1>&6
-echo "configure:6011: checking whether declaration is required for free" >&5
+echo "configure:6024: checking whether declaration is required for free" >&5
 if eval "test \"`echo '$''{'gas_cv_decl_needed_free'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 6016 "configure"
+#line 6029 "configure"
 #include "confdefs.h"
 $gas_test_headers
 int main() {
@@ -6023,7 +6036,7 @@ x = (f) free;
 
 ; return 0; }
 EOF
-if { (eval echo configure:6027: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6040: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   gas_cv_decl_needed_free=no
 else
@@ -6044,12 +6057,12 @@ fi
 
 
 echo $ac_n "checking whether declaration is required for sbrk""... $ac_c" 1>&6
-echo "configure:6048: checking whether declaration is required for sbrk" >&5
+echo "configure:6061: checking whether declaration is required for sbrk" >&5
 if eval "test \"`echo '$''{'gas_cv_decl_needed_sbrk'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 6053 "configure"
+#line 6066 "configure"
 #include "confdefs.h"
 $gas_test_headers
 int main() {
@@ -6060,7 +6073,7 @@ x = (f) sbrk;
 
 ; return 0; }
 EOF
-if { (eval echo configure:6064: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6077: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   gas_cv_decl_needed_sbrk=no
 else
@@ -6081,12 +6094,12 @@ fi
 
 
 echo $ac_n "checking whether declaration is required for environ""... $ac_c" 1>&6
-echo "configure:6085: checking whether declaration is required for environ" >&5
+echo "configure:6098: checking whether declaration is required for environ" >&5
 if eval "test \"`echo '$''{'gas_cv_decl_needed_environ'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 6090 "configure"
+#line 6103 "configure"
 #include "confdefs.h"
 $gas_test_headers
 int main() {
@@ -6097,7 +6110,7 @@ x = (f) environ;
 
 ; return 0; }
 EOF
-if { (eval echo configure:6101: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6114: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   gas_cv_decl_needed_environ=no
 else
@@ -6121,12 +6134,12 @@ fi
 # for it?
 
 echo $ac_n "checking whether declaration is required for errno""... $ac_c" 1>&6
-echo "configure:6125: checking whether declaration is required for errno" >&5
+echo "configure:6138: checking whether declaration is required for errno" >&5
 if eval "test \"`echo '$''{'gas_cv_decl_needed_errno'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 6130 "configure"
+#line 6143 "configure"
 #include "confdefs.h"
 
 #ifdef HAVE_ERRNO_H
@@ -6141,7 +6154,7 @@ x = (f) errno;
 
 ; return 0; }
 EOF
-if { (eval echo configure:6145: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6158: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   gas_cv_decl_needed_errno=no
 else
index 73305cbd715b11ef0452d2d957f8bfa58876439d..ed37ed3d7b3442e454571ea60de7bec88dd94e42 100644 (file)
@@ -384,10 +384,10 @@ changequote([,])dnl
 
       sh-*-linux*)         fmt=elf em=linux ;;
       sh-*-elf*)           fmt=elf ;;
-      sh-*-coff*)           fmt=coff ;;
+      sh-*-coff*)           fmt=coff bfd_gas=yes;;
       sh-*-pe*)             fmt=coff em=pe bfd_gas=yes;;
       sh-*-rtemself*)       fmt=elf ;;
-      sh-*-rtems*)         fmt=coff ;;
+      sh-*-rtems*)         fmt=coff bfd_gas=yes;;
 
       ns32k-pc532-mach* | ns32k-pc532-ux*)    fmt=aout em=pc532mach ;;
       ns32k-pc532-netbsd* | ns32k-pc532-lites*)  fmt=aout em=nbsd532 ;;
@@ -479,6 +479,7 @@ changequote([,])dnl
       ia64*-*) bfd_gas=yes ;;
       mips-*)  bfd_gas=yes ;;
       ns32k-*) bfd_gas=yes ;;
+      pdp11-*) bfd_gas=yes ;;
       ppc-*)   bfd_gas=yes ;;
       sparc-*) bfd_gas=yes ;;
       strongarm-*)     bfd_gas=yes ;;
@@ -648,6 +649,7 @@ fi
 # is emulated.
 case ${target_cpu} in
   vax | tahoe )        atof=${target_cpu} ;;
+  pdp11)       atof=vax ;;
   *)           atof=ieee ;;
 esac
 
index 60761a4e0b3cc4d6f980fdf417c29ef864e21ec0..95b02b79d9611a282960acdf47fe40964a1bf041 100644 (file)
@@ -32,6 +32,7 @@ CPU_DOCS = \
        c-m68k.texi \
        c-mips.texi \
        c-ns32k.texi \
+       c-pdp11.texi \
        c-pj.texi \
        c-sh.texi \
        c-sparc.texi \
index 5f9b258ca1a0178e9a9e3e85a1bd80daf16cb48a..f328d71af1cf98e69a8a5201256f5184d70c2293 100644 (file)
@@ -142,6 +142,7 @@ CPU_DOCS = \
        c-m68k.texi \
        c-mips.texi \
        c-ns32k.texi \
+       c-pdp11.texi \
        c-pj.texi \
        c-sh.texi \
        c-sparc.texi \
index 22742b45eef2dfbf78475732da1912cacc3174ae..26658c6fd14be03736259f0777c4f5bd51fc9fbd 100644 (file)
@@ -42,6 +42,7 @@
 @set M680X0
 @set MCORE
 @set MIPS
+@set PDP11
 @set PJ
 @set SH
 @set SPARC
index fb80ca5f7ea5d58f1ec3d34c49776e014628c949..dc377b1363bf5063182287fe73f328bb48c14f4c 100644 (file)
@@ -546,6 +546,37 @@ unit coprocessor.  The default is to assume an MMU for 68020 and up.
 @end table
 @end ifset
 
+@ifset PDP11
+
+For details about the PDP-11 machine dependent features options,
+see @ref{PDP-11-Options}.
+
+@table @code
+@item -mpic | -mno-pic
+Generate position-independent (or position-dependent) code.  The
+default is @code{-mpic}.
+
+@item -mall
+@itemx -mall-extensions
+Enable all instruction set extensions.  This is the default.
+
+@item -mno-extensions
+Disable all instruction set extensions.
+
+@item -m@var{extension} | -mno-@var{extension}
+Enable (or disable) a particular instruction set extension.
+
+@item -m@var{cpu}
+Enable the instruction set extensions supported by a particular CPU, and
+disable all other extensions.
+
+@item -m@var{machine}
+Enable the instruction set extensions supported by a particular machine
+model, and disable all other extensions.
+@end table
+
+@end ifset
+
 @ifset PJ
 The following options are available when @value{AS} is configured for
 a picoJava processor.
@@ -1667,6 +1698,9 @@ is considered a comment and is ignored.  The line comment character is
 @ifset I960
 @samp{#} on the i960;
 @end ifset
+@ifset PDP11
+@samp{;} for the PDP-11;
+@end ifset
 @ifset PJ
 @samp{;} for picoJava;
 @end ifset
@@ -5271,6 +5305,9 @@ subject, see the hardware manufacturer's manual.
 @ifset SH
 * SH-Dependent::                Hitachi SH Dependent Features
 @end ifset
+@ifset PDP11
+* PDP-11-Dependent::            PDP-11 Dependent Features
+@end ifset
 @ifset PJ
 * PJ-Dependent::                picoJava Dependent Features
 @end ifset
@@ -5389,6 +5426,10 @@ family.
 @include c-ns32k.texi
 @end ifset
 
+@ifset PDP11
+@include c-pdp11.texi
+@end ifset
+
 @ifset PJ
 @include c-pj.texi
 @end ifset
diff --git a/gas/doc/c-pdp11.texi b/gas/doc/c-pdp11.texi
new file mode 100644 (file)
index 0000000..4ddd9e3
--- /dev/null
@@ -0,0 +1,354 @@
+@c Copyright (C) 2001 Free Software Foundation, Inc.
+@c This is part of the GAS manual.
+@c For copying conditions, see the file as.texinfo.
+@ifset GENERIC
+@page
+@node PDP-11-Dependent
+@chapter PDP-11 Dependent Features
+@end ifset
+@ifclear GENERIC
+@node Machine Dependencies
+@chapter PDP-11 Dependent Features
+@end ifclear
+
+@cindex PDP-11 support
+
+@menu
+* PDP-11-Options::             Options
+* PDP-11-Pseudos::             Assembler Directives
+* PDP-11-Syntax::              DEC Syntax versus BSD Syntax
+* PDP-11-Mnemonics::           Instruction Naming
+* PDP-11-Synthetic::           Synthetic Instructions
+@end menu
+
+@node PDP-11-Options
+@section Options
+
+@cindex options for PDP-11
+
+The PDP-11 version of @code{@value{AS}} has a rich set of machine
+dependent options.
+
+@subsection Code Generation Options
+
+@table @code
+@cindex -mpic
+@cindex -mno-pic
+@item -mpic | -mno-pic
+Generate position-independent (or position-dependent) code.
+
+The default is to generate position-independent code.
+@end table
+
+@subsection Instruction Set Extention Options
+
+These options enables or disables the use of extensions over the base
+line instruction set as introduced by the first PDP-11 CPU: the KA11.
+Most options come in two variants: a @code{-m}@var{extension} that
+enables @var{extension}, and a @code{-mno-}@var{extension} that disables
+@var{extension}.
+
+The default is to enable all extensions.
+
+@table @code
+@cindex -mall
+@cindex -mall-extensions
+@item -mall | -mall-extensions
+Enable all instruction set extensions.
+
+@cindex -mno-extensions
+@item -mno-extensions
+Disable all instruction set extensions.
+
+@cindex -mcis
+@cindex -mno-cis
+@item -mcis | -mno-cis
+Enable (or disable) the use of the commersial instruction set, which
+consists of these instructions: @code{ADDNI}, @code{ADDN}, @code{ADDPI},
+@code{ADDP}, @code{ASHNI}, @code{ASHN}, @code{ASHPI}, @code{ASHP},
+@code{CMPCI}, @code{CMPC}, @code{CMPNI}, @code{CMPN}, @code{CMPPI},
+@code{CMPP}, @code{CVTLNI}, @code{CVTLN}, @code{CVTLPI}, @code{CVTLP},
+@code{CVTNLI}, @code{CVTNL}, @code{CVTNPI}, @code{CVTNP}, @code{CVTPLI},
+@code{CVTPL}, @code{CVTPNI}, @code{CVTPN}, @code{DIVPI}, @code{DIVP},
+@code{L2DR}, @code{L3DR}, @code{LOCCI}, @code{LOCC}, @code{MATCI},
+@code{MATC}, @code{MOVCI}, @code{MOVC}, @code{MOVRCI}, @code{MOVRC},
+@code{MOVTCI}, @code{MOVTC}, @code{MULPI}, @code{MULP}, @code{SCANCI},
+@code{SCANC}, @code{SKPCI}, @code{SKPC}, @code{SPANCI}, @code{SPANC},
+@code{SUBNI}, @code{SUBN}, @code{SUBPI}, and @code{SUBP}.
+
+@cindex -mcsm
+@cindex -mno-csm
+@item -mcsm | -mno-csm
+Enable (or disable) the use of the @code{CSM} instruction.
+
+@cindex -meis
+@cindex -mno-eis
+@item -meis | -mno-eis
+Enable (or disable) the use of the extended instruction set, which
+consists of these instructions: @code{ASHC}, @code{ASH}, @code{DIV},
+@code{MARK}, @code{MUL}, @code{RTT}, @code{SOB} @code{SXT}, and
+@code{XOR}.
+
+@cindex -mfis
+@cindex -mno-fis
+@cindex -mkev11
+@cindex -mkev11
+@cindex -mno-kev11
+@item -mfis | -mkev11
+@itemx -mno-fis | -mno-kev11
+Enable (or diasble) the use of the KEV11 floating-point instructions:
+@code{FADD}, @code{FDIV}, @code{FMUL}, and @code{FSUB}.
+
+@cindex -mfpp
+@cindex -mno-fpp
+@cindex -mfpu
+@cindex -mno-fpu
+@cindex -mfp-11
+@cindex -mno-fp-11
+@item -mfpp | -mfpu | -mfp-11
+@itemx -mno-fpp | -mno-fpu | -mno-fp-11
+Enable (or disable) the use of FP-11 floating-point instructions:
+@code{ABSF}, @code{ADDF}, @code{CFCC}, @code{CLRF}, @code{CMPF},
+@code{DIVF}, @code{LDCFF}, @code{LDCIF}, @code{LDEXP}, @code{LDF},
+@code{LDFPS}, @code{MODF}, @code{MULF}, @code{NEGF}, @code{SETD},
+@code{SETF}, @code{SETI}, @code{SETL}, @code{STCFF}, @code{STCFI},
+@code{STEXP}, @code{STF}, @code{STFPS}, @code{STST}, @code{SUBF}, and
+@code{TSTF}.
+
+@cindex -mlimited-eis
+@cindex -mno-limited-eis
+@item -mlimited-eis | -mno-limited-eis
+Enable (or disable) the use of the limited extended instruction set:
+@code{MARK}, @code{RTT}, @code{SOB}, @code{SXT}, and @code{XOR}.
+
+The -mno-limited-eis options also implies -mno-eis.
+
+@cindex -mmfpt
+@cindex -mno-mfpt
+@item -mmfpt | -mno-mfpt
+Enable (or disable) the use of the @code{MFPT} instruction.
+
+@cindex -mmutiproc
+@cindex -mno-mutiproc
+@item -mmultiproc | -mno-multiproc
+Enable (or disable) the use of multiprocessor instructions: @code{TSTSET} and
+@code{WRTLCK}.
+
+@cindex -mmxps
+@cindex -mno-mxps
+@item -mmxps | -mno-mxps
+Enable (or disable) the use of the @code{MFPS} and @code{MTPS} instructions.
+
+@cindex -mspl
+@cindex -mno-spl
+@item -mspl | -mno-spl
+Enable (or disable) the use of the @code{SPL} instruction.
+
+@cindex -mmicrocode
+@cindex -mno-microcode
+Enable (or disable) the use of the microcode instructions: @code{LDUB},
+@code{MED}, and @code{XFC}.
+@end table
+
+@subsection CPU Model Options
+
+These options enable the instruction set extensions supported by a
+particular CPU, and disables all other extensions.
+
+@table @code
+@cindex -mka11
+@item -mka11
+KA11 CPU.  Base line instruction set only.
+
+@cindex -mkb11
+@item -mkb11
+KB11 CPU.  Enable extended instruction set and @code{SPL}.
+
+@cindex -mkd11a
+@item -mkd11a
+KD11-A CPU.  Enable limited extended instruction set.
+
+@cindex -mkd11b
+@item -mkd11b
+KD11-B CPU.  Base line instruction set only.
+
+@cindex -mkd11d
+@item -mkd11d
+KD11-D CPU.  Base line instruction set only.
+
+@cindex -mkd11e
+@item -mkd11e
+KD11-E CPU.  Enable extended instruction set, @code{MFPS}, and @code{MTPS}.
+
+@cindex -mkd11f
+@cindex -mkd11h
+@cindex -mkd11q
+@item -mkd11f | -mkd11h | -mkd11q
+KD11-F, KD11-H, or KD11-Q CPU.  Enable limited extended instruction set,
+@code{MFPS}, and @code{MTPS}.
+
+@cindex -mkd11k
+@item -mkd11k
+KD11-K CPU.  Enable extended instruction set, @code{LDUB}, @code{MED},
+@code{MFPS}, @code{MFPT}, @code{MTPS}, and @code{XFC}.
+
+@cindex -mkd11z
+@item -mkd11z
+KD11-Z CPU.  Enable extended instruction set, @code{CSM}, @code{MFPS},
+@code{MFPT}, @code{MTPS}, and @code{SPL}.
+
+@cindex -mf11
+@item -mf11
+F11 CPU.  Enable extended instruction set, @code{MFPS}, @code{MFPT}, and
+@code{MTPS}.
+
+@cindex -mj11
+@item -mj11
+J11 CPU.  Enable extended instruction set, @code{CSM}, @code{MFPS},
+@code{MFPT}, @code{MTPS}, @code{SPL}, @code{TSTSET}, and @code{WRTLCK}.
+
+@cindex -mt11
+@item -mt11
+T11 CPU.  Enable limited extended instruction set, @code{MFPS}, and
+@code{MTPS}.
+@end table
+
+@subsection Machine Model Options
+
+These options enable the instruction set extensions supported by a
+particular machine model, and disables all other extensions.
+
+@table @code
+@cindex -m11/03
+@item -m11/03
+Same as @code{-mkd11f}.
+
+@cindex -m11/04
+@item -m11/04
+Same as @code{-mkd11d}.
+
+@cindex -m11/05
+@cindex -m11/10
+@item -m11/05 | -m11/10
+Same as @code{-mkd11b}.
+
+@cindex -m11/15
+@cindex -m11/20
+@item -m11/15 | -m11/20
+Same as @code{-mka11}.
+
+@cindex -m11/21
+@item -m11/21
+Same as @code{-mt11}.
+
+@cindex -m11/23
+@cindex -m11/24
+@item -m11/23 | -m11/24
+Same as @code{-mf11}.
+
+@cindex -m11/34
+@item -m11/34
+Same as @code{-mkd11e}.
+
+@cindex -m11/34a
+@item -m11/34a
+Ame as @code{-mkd11e} @code{-mfpp}.
+
+@cindex -m11/35
+@cindex -m11/40
+@item -m11/35 | -m11/40
+Same as @code{-mkd11a}.
+
+@cindex -m11/44
+@item -m11/44
+Same as @code{-mkd11z}.
+
+@cindex -m11/45
+@cindex -m11/50
+@cindex -m11/55
+@cindex -m11/70
+@item -m11/45 | -m11/50 | -m11/55 | -m11/70
+Same as @code{-mkb11}.
+
+@cindex -m11/53
+@cindex -m11/73
+@cindex -m11/83
+@cindex -m11/84
+@cindex -m11/93
+@cindex -m11/94
+@item -m11/53 | -m11/73 | -m11/83 | -m11/84 | -m11/93 | -m11/94
+Same as @code{-mj11}.
+
+@cindex -m11/60
+@item -m11/60
+Same as @code{-mkd11k}.
+@end table
+
+@node PDP-11-Pseudos
+@section Assembler Directives
+
+The PDP-11 version of @code{@value{AS}} has a few machine
+dependent assembler directives.
+
+@table @code
+@item .bss
+Switch to the @code{bss} section.
+
+@item .even
+Align the location counter to an even number.
+@end table
+
+@node PDP-11-Syntax
+@section PDP-11 Assembly Language Syntax
+
+@cindex PDP-11 syntax
+
+@cindex DEC syntax
+@cindex BSD syntax
+@code{@value{AS}} supports both DEC syntax and BSD syntax.  The only
+difference is that in DEC syntax, a @code{#} character is used to denote
+an immediate constants, while in BSD syntax the character for this
+purpose is @code{$}.
+
+@cindex PDP-11 general-purpose register syntax
+eneral-purpose registers are named @code{r0} through @code{r7}.
+Mnemonic alternatives for @code{r6} and @code{r7} are @code{sp} and
+@code{pc}, respectively.
+
+@cindex PDP-11 floating-point register syntax
+Floating-point registers are named @code{ac0} through @code{ac3}, or
+alternatively @code{fr0} through @code{fr3}.
+
+@cindex PDP-11 comments
+Comments are started with a @code{#} or a @code{/} character, and extend
+to the end of the line.  (FIXME: clash with immediates?)
+
+@node PDP-11-Mnemonics
+@section Instruction Naming
+
+@cindex PDP-11 instruction naming
+
+Some instructions have alternative names.
+
+@table @code
+@item BCC
+@code{BHIS}
+
+@item BCS
+@code{BLO}
+
+@item L2DR
+@code{L2D}
+
+@item L3DR
+@code{L3D}
+
+@item SYS
+@code{TRAP}
+@end table
+
+@node PDP-11-Synthetic
+@section Synthetic Instructions
+
+The @code{JBR} and @code{J}@var{CC} synthetic instructions are not
+supported yet.
index d3d8df9ecc0f3a89a13aefc625c3bd23f77444c0..11518edd202971b0b0308a79edadad401ef62f70 100644 (file)
@@ -92,6 +92,8 @@ config/tc-mn10300.c
 config/tc-mn10300.h
 config/tc-ns32k.c
 config/tc-ns32k.h
+config/tc-pdp11.c
+config/tc-pdp11.h
 config/tc-pj.c
 config/tc-pj.h
 config/tc-ppc.c
index 47a8e964361a69bac60d8c6cc787f98abde5cca5..ff99b2502e84f85e5846cabc5b52a812deb8f850 100644 (file)
@@ -6,7 +6,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
-"POT-Creation-Date: 2001-02-09 16:34-0800\n"
+"POT-Creation-Date: 2001-02-18 15:18-0800\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -632,12 +632,12 @@ msgstr ""
 msgid "No 'bal' entry point for leafproc %s"
 msgstr ""
 
-#: config/obj-coff.c:4255 write.c:2575
+#: config/obj-coff.c:4255 write.c:2589
 #, c-format
 msgid "Negative of non-absolute symbol %s"
 msgstr ""
 
-#: config/obj-coff.c:4276 write.c:2589
+#: config/obj-coff.c:4276 write.c:2603
 msgid "callj to difference of 2 symbols"
 msgstr ""
 
@@ -649,7 +649,7 @@ msgstr ""
 #. This is a COBR instruction.  They have only a 13-bit
 #. displacement and are only to be used for local branches:
 #. flag as error, don't generate relocation.
-#: config/obj-coff.c:4411 config/tc-i960.c:3234 write.c:2733
+#: config/obj-coff.c:4411 config/tc-i960.c:3234 write.c:2747
 msgid "can't use COBR format with external label"
 msgstr ""
 
@@ -658,7 +658,7 @@ msgstr ""
 msgid "Value of %ld too large for field of %d bytes at 0x%lx"
 msgstr ""
 
-#: config/obj-coff.c:4504 write.c:2823
+#: config/obj-coff.c:4504 write.c:2837
 #, c-format
 msgid "Signed .word overflow; switch may be too large; %ld at 0x%lx"
 msgstr ""
@@ -1058,7 +1058,7 @@ msgstr ""
 msgid "syntax error"
 msgstr ""
 
-#: config/tc-alpha.c:1019 config/tc-arm.c:6629 config/tc-h8300.c:1373
+#: config/tc-alpha.c:1019 config/tc-arm.c:6643 config/tc-h8300.c:1373
 #: config/tc-h8500.c:1197 config/tc-hppa.c:3990 config/tc-i860.c:931
 #: config/tc-m68hc11.c:481 config/tc-m68k.c:4189 config/tc-m88k.c:1105
 #: config/tc-ns32k.c:1663 config/tc-sparc.c:2830 config/tc-z8k.c:1324
@@ -1102,7 +1102,7 @@ msgstr ""
 msgid "type %d reloc done?\n"
 msgstr ""
 
-#: config/tc-alpha.c:1374 config/tc-alpha.c:1381 config/tc-mips.c:7356
+#: config/tc-alpha.c:1374 config/tc-alpha.c:1381 config/tc-mips.c:7372
 msgid "Used $at without \".set noat\""
 msgstr ""
 
@@ -1364,7 +1364,7 @@ msgstr ""
 msgid "Chose GP value of %lx\n"
 msgstr ""
 
-#: config/tc-arc.c:1608 config/tc-arm.c:7532
+#: config/tc-arc.c:1608 config/tc-arm.c:7546
 msgid "md_estimate_size_before_relax\n"
 msgstr ""
 
@@ -1400,7 +1400,7 @@ msgstr ""
 msgid "Invalid syntax for .req directive."
 msgstr ""
 
-#: config/tc-arm.c:1506 config/tc-mips.c:9916 read.c:2035
+#: config/tc-arm.c:1506 config/tc-mips.c:9936 read.c:2035
 #, c-format
 msgid "Alignment too large: %d. assumed."
 msgstr ""
@@ -1494,12 +1494,12 @@ msgid "pc may not be used in post-increment"
 msgstr ""
 
 #: config/tc-arm.c:2125 config/tc-arm.c:2578 config/tc-arm.c:3438
-#: config/tc-arm.c:4358
+#: config/tc-arm.c:4372
 msgid "pre-indexed expression expected"
 msgstr ""
 
 #: config/tc-arm.c:2138 config/tc-arm.c:2591 config/tc-arm.c:3449
-#: config/tc-arm.c:4370 config/tc-arm.c:4716
+#: config/tc-arm.c:4384 config/tc-arm.c:4730
 msgid "missing ]"
 msgstr ""
 
@@ -1557,8 +1557,8 @@ msgstr ""
 msgid "Warning: Instruction unpredictable when using r15"
 msgstr ""
 
-#: config/tc-arm.c:3063 config/tc-arm.c:3255 config/tc-arm.c:5503
-#: config/tc-arm.c:5536 config/tc-arm.c:5546
+#: config/tc-arm.c:3063 config/tc-arm.c:3255 config/tc-arm.c:5517
+#: config/tc-arm.c:5550 config/tc-arm.c:5560
 msgid "immediate value out of range"
 msgstr ""
 
@@ -1612,7 +1612,7 @@ msgstr ""
 msgid "Invalid immediate shift"
 msgstr ""
 
-#: config/tc-arm.c:3930 config/tc-arm.c:4400
+#: config/tc-arm.c:3930 config/tc-arm.c:4414
 msgid "Constant expression expected"
 msgstr ""
 
@@ -1640,390 +1640,395 @@ msgstr ""
 msgid "Address expected"
 msgstr ""
 
-#: config/tc-arm.c:4326 config/tc-arm.c:4341 config/tc-arm.c:4379
+#: config/tc-arm.c:4328 config/tc-arm.c:4359
+#, c-format
+msgid "Rn and Rd must be different in %s"
+msgstr ""
+
+#: config/tc-arm.c:4332 config/tc-arm.c:4348 config/tc-arm.c:4393
 #, c-format
 msgid "%s register same as write-back base"
 msgstr ""
 
-#: config/tc-arm.c:4328 config/tc-arm.c:4343 config/tc-arm.c:4381
+#: config/tc-arm.c:4334 config/tc-arm.c:4350 config/tc-arm.c:4395
 msgid "destination"
 msgstr ""
 
-#: config/tc-arm.c:4328 config/tc-arm.c:4343 config/tc-arm.c:4381
+#: config/tc-arm.c:4334 config/tc-arm.c:4350 config/tc-arm.c:4395
 msgid "source"
 msgstr ""
 
-#: config/tc-arm.c:4420
+#: config/tc-arm.c:4434
 msgid "literal pool insertion failed"
 msgstr ""
 
-#: config/tc-arm.c:4459
+#: config/tc-arm.c:4473
 msgid "Pre-increment instruction with translate"
 msgstr ""
 
-#: config/tc-arm.c:4500
+#: config/tc-arm.c:4514
 msgid "Bad range in register list"
 msgstr ""
 
-#: config/tc-arm.c:4508 config/tc-arm.c:4517 config/tc-arm.c:4559
+#: config/tc-arm.c:4522 config/tc-arm.c:4531 config/tc-arm.c:4573
 #, c-format
 msgid "Warning: Duplicated register (r%d) in register list"
 msgstr ""
 
-#: config/tc-arm.c:4520
+#: config/tc-arm.c:4534
 msgid "Warning: Register range not in ascending order"
 msgstr ""
 
-#: config/tc-arm.c:4532
+#: config/tc-arm.c:4546
 msgid "Missing `}'"
 msgstr ""
 
-#: config/tc-arm.c:4548
+#: config/tc-arm.c:4562
 msgid "invalid register mask"
 msgstr ""
 
-#: config/tc-arm.c:4569 config/tc-avr.c:852 config/tc-cris.c:2733
+#: config/tc-arm.c:4583 config/tc-avr.c:852 config/tc-cris.c:2733
 #: config/tc-d10v.c:1560 config/tc-d30v.c:1865 config/tc-mips.c:3230
-#: config/tc-mips.c:4162 config/tc-mips.c:4947 config/tc-mips.c:5493
+#: config/tc-mips.c:4162 config/tc-mips.c:4963 config/tc-mips.c:5509
 #: config/tc-ppc.c:4853 config/tc-v850.c:2385
 msgid "expression too complex"
 msgstr ""
 
-#: config/tc-arm.c:4608
+#: config/tc-arm.c:4622
 msgid "r15 not allowed as base register"
 msgstr ""
 
-#: config/tc-arm.c:4676 config/tc-arm.c:4690
+#: config/tc-arm.c:4690 config/tc-arm.c:4704
 msgid "r15 not allowed in swap"
 msgstr ""
 
-#: config/tc-arm.c:4788
+#: config/tc-arm.c:4802
 msgid "Use of r15 in bx in ARM mode is not really useful"
 msgstr ""
 
-#: config/tc-arm.c:5044 config/tc-v850.c:1959 config/tc-v850.c:1980
+#: config/tc-arm.c:5058 config/tc-v850.c:1959 config/tc-v850.c:1980
 msgid "constant expression expected"
 msgstr ""
 
-#: config/tc-arm.c:5050
+#: config/tc-arm.c:5064
 msgid "Constant value required for number of registers"
 msgstr ""
 
-#: config/tc-arm.c:5058
+#: config/tc-arm.c:5072
 msgid "number of registers must be in the range [1:4]"
 msgstr ""
 
-#: config/tc-arm.c:5119
+#: config/tc-arm.c:5133
 msgid "R15 not allowed as base register with write-back"
 msgstr ""
 
-#: config/tc-arm.c:5367
+#: config/tc-arm.c:5381
 msgid "lo register required"
 msgstr ""
 
-#: config/tc-arm.c:5375
+#: config/tc-arm.c:5389
 msgid "hi register required"
 msgstr ""
 
-#: config/tc-arm.c:5445
+#: config/tc-arm.c:5459
 msgid "dest and source1 must be the same register"
 msgstr ""
 
-#: config/tc-arm.c:5452
+#: config/tc-arm.c:5466
 msgid "subtract valid only on lo regs"
 msgstr ""
 
-#: config/tc-arm.c:5476
+#: config/tc-arm.c:5490
 msgid "invalid Hi register with immediate"
 msgstr ""
 
-#: config/tc-arm.c:5514
+#: config/tc-arm.c:5528
 msgid "invalid immediate value for stack adjust"
 msgstr ""
 
-#: config/tc-arm.c:5525
+#: config/tc-arm.c:5539
 msgid "invalid immediate for address calculation"
 msgstr ""
 
-#: config/tc-arm.c:5612
+#: config/tc-arm.c:5626
 msgid "source1 and dest must be same register"
 msgstr ""
 
-#: config/tc-arm.c:5646
+#: config/tc-arm.c:5660
 msgid "Invalid immediate for shift"
 msgstr ""
 
-#: config/tc-arm.c:5725
+#: config/tc-arm.c:5739
 msgid "only lo regs allowed with immediate"
 msgstr ""
 
-#: config/tc-arm.c:5744
+#: config/tc-arm.c:5758
 msgid "invalid immediate"
 msgstr ""
 
-#: config/tc-arm.c:5798
+#: config/tc-arm.c:5812
 msgid "expected ']'"
 msgstr ""
 
-#: config/tc-arm.c:5865
+#: config/tc-arm.c:5879
 msgid "byte or halfword not valid for base register"
 msgstr ""
 
-#: config/tc-arm.c:5870
+#: config/tc-arm.c:5884
 msgid "R15 based store not allowed"
 msgstr ""
 
-#: config/tc-arm.c:5875
+#: config/tc-arm.c:5889
 msgid "Invalid base register for register offset"
 msgstr ""
 
-#: config/tc-arm.c:5893
+#: config/tc-arm.c:5907
 msgid "invalid offset"
 msgstr ""
 
-#: config/tc-arm.c:5904
+#: config/tc-arm.c:5918
 msgid "invalid base register in load/store"
 msgstr ""
 
-#: config/tc-arm.c:5928
+#: config/tc-arm.c:5942
 msgid "Invalid offset"
 msgstr ""
 
-#: config/tc-arm.c:6003
+#: config/tc-arm.c:6017
 msgid "dest and source1 one must be the same register"
 msgstr ""
 
-#: config/tc-arm.c:6011
+#: config/tc-arm.c:6025
 msgid "Rs and Rd must be different in MUL"
 msgstr ""
 
-#: config/tc-arm.c:6155
+#: config/tc-arm.c:6169
 msgid ""
 "Inserted missing '!': load/store multiple always writes back base register"
 msgstr ""
 
-#: config/tc-arm.c:6171 config/tc-arm.c:6271
+#: config/tc-arm.c:6185 config/tc-arm.c:6285
 msgid "Expression too complex"
 msgstr ""
 
-#: config/tc-arm.c:6177
+#: config/tc-arm.c:6191
 msgid "only lo-regs valid in load/store multiple"
 msgstr ""
 
-#: config/tc-arm.c:6223
+#: config/tc-arm.c:6237
 msgid "Syntax: ldrs[b] Rd, [Rb, Ro]"
 msgstr ""
 
-#: config/tc-arm.c:6287
+#: config/tc-arm.c:6301
 msgid "invalid register list to push/pop instruction"
 msgstr ""
 
-#: config/tc-arm.c:6429 config/tc-cris.c:664
+#: config/tc-arm.c:6443 config/tc-cris.c:664
 msgid "Virtual memory exhausted"
 msgstr ""
 
-#: config/tc-arm.c:6835
+#: config/tc-arm.c:6849
 #, c-format
 msgid "invalid constant (%lx) after fixup"
 msgstr ""
 
-#: config/tc-arm.c:6871
+#: config/tc-arm.c:6885
 #, c-format
 msgid "Unable to compute ADRL instructions for PC offset of 0x%lx"
 msgstr ""
 
-#: config/tc-arm.c:6901
+#: config/tc-arm.c:6915
 #, c-format
 msgid "bad immediate value for offset (%ld)"
 msgstr ""
 
-#: config/tc-arm.c:6923 config/tc-arm.c:6945
+#: config/tc-arm.c:6937 config/tc-arm.c:6959
 msgid "invalid literal constant: pool needs to be closer"
 msgstr ""
 
-#: config/tc-arm.c:6925
+#: config/tc-arm.c:6939
 #, c-format
 msgid "bad immediate value for half-word offset (%ld)"
 msgstr ""
 
-#: config/tc-arm.c:6962
+#: config/tc-arm.c:6976
 msgid "shift expression is too large"
 msgstr ""
 
-#: config/tc-arm.c:6981 config/tc-arm.c:6990
+#: config/tc-arm.c:6995 config/tc-arm.c:7004
 msgid "Invalid swi expression"
 msgstr ""
 
-#: config/tc-arm.c:7000
+#: config/tc-arm.c:7014
 msgid "Invalid expression in load/store multiple"
 msgstr ""
 
-#: config/tc-arm.c:7053
+#: config/tc-arm.c:7067
 msgid "gas can't handle same-section branch dest >= 0x04000000"
 msgstr ""
 
-#: config/tc-arm.c:7062
+#: config/tc-arm.c:7076
 msgid "out of range branch"
 msgstr ""
 
-#: config/tc-arm.c:7095 config/tc-arm.c:7111 config/tc-mips.c:9743
+#: config/tc-arm.c:7109 config/tc-arm.c:7125 config/tc-mips.c:9763
 msgid "Branch out of range"
 msgstr ""
 
-#: config/tc-arm.c:7134
+#: config/tc-arm.c:7148
 msgid "Branch with link out of range"
 msgstr ""
 
-#: config/tc-arm.c:7201
+#: config/tc-arm.c:7215
 msgid "Illegal value for co-processor offset"
 msgstr ""
 
-#: config/tc-arm.c:7225
+#: config/tc-arm.c:7239
 #, c-format
 msgid "Invalid offset, target not word aligned (0x%08X)"
 msgstr ""
 
-#: config/tc-arm.c:7231 config/tc-arm.c:7240 config/tc-arm.c:7247
-#: config/tc-arm.c:7254 config/tc-arm.c:7261
+#: config/tc-arm.c:7245 config/tc-arm.c:7254 config/tc-arm.c:7261
+#: config/tc-arm.c:7268 config/tc-arm.c:7275
 #, c-format
 msgid "Invalid offset, value too big (0x%08lX)"
 msgstr ""
 
-#: config/tc-arm.c:7300
+#: config/tc-arm.c:7314
 msgid "Invalid immediate for stack address calculation"
 msgstr ""
 
-#: config/tc-arm.c:7309
+#: config/tc-arm.c:7323
 #, c-format
 msgid "Invalid immediate for address calculation (value = 0x%08lX)"
 msgstr ""
 
-#: config/tc-arm.c:7319
+#: config/tc-arm.c:7333
 msgid "Invalid 8bit immediate"
 msgstr ""
 
-#: config/tc-arm.c:7327
+#: config/tc-arm.c:7341
 msgid "Invalid 3bit immediate"
 msgstr ""
 
-#: config/tc-arm.c:7343
+#: config/tc-arm.c:7357
 #, c-format
 msgid "Invalid immediate: %ld is too large"
 msgstr ""
 
-#: config/tc-arm.c:7358
+#: config/tc-arm.c:7372
 #, c-format
 msgid "Illegal Thumb shift value: %ld"
 msgstr ""
 
-#: config/tc-arm.c:7372 config/tc-mn10300.c:1961
+#: config/tc-arm.c:7386 config/tc-mn10300.c:1961
 #, c-format
 msgid "Bad relocation fixup type (%d)"
 msgstr ""
 
-#: config/tc-arm.c:7445
+#: config/tc-arm.c:7459
 msgid "Literal referenced across section boundary (Implicit dump?)"
 msgstr ""
 
-#: config/tc-arm.c:7458
+#: config/tc-arm.c:7472
 #, c-format
 msgid "Internal_relocation (type %d) not fixed up (IMMEDIATE)"
 msgstr ""
 
-#: config/tc-arm.c:7464
+#: config/tc-arm.c:7478
 msgid "ADRL used for a symbol not defined in the same file"
 msgstr ""
 
-#: config/tc-arm.c:7469
+#: config/tc-arm.c:7483
 #, c-format
 msgid "Internal_relocation (type %d) not fixed up (OFFSET_IMM)"
 msgstr ""
 
-#: config/tc-arm.c:7490 config/tc-cris.c:2672 config/tc-mcore.c:2109
+#: config/tc-arm.c:7504 config/tc-cris.c:2672 config/tc-mcore.c:2109
 #: config/tc-ns32k.c:2369
 msgid "<unknown>"
 msgstr ""
 
-#: config/tc-arm.c:7493
+#: config/tc-arm.c:7507
 #, c-format
 msgid "Cannot represent %s relocation in this object file format"
 msgstr ""
 
-#: config/tc-arm.c:7514 config/tc-mips.c:11261 config/tc-sh.c:3182
+#: config/tc-arm.c:7528 config/tc-mips.c:11281 config/tc-sh.c:3182
 #, c-format
 msgid "Can not represent %s relocation in this object file format"
 msgstr ""
 
-#: config/tc-arm.c:7611
+#: config/tc-arm.c:7625
 #, c-format
 msgid "No operator -- statement `%s'\n"
 msgstr ""
 
-#: config/tc-arm.c:7629
+#: config/tc-arm.c:7643
 msgid "selected processor does not support this opcode"
 msgstr ""
 
-#: config/tc-arm.c:7675
+#: config/tc-arm.c:7689
 #, c-format
 msgid "Opcode `%s' must have suffix from list: <%s>"
 msgstr ""
 
-#: config/tc-arm.c:7706
+#: config/tc-arm.c:7720
 msgid "Warning: Use of the 'nv' conditional is deprecated\n"
 msgstr ""
 
-#: config/tc-arm.c:7723
+#: config/tc-arm.c:7737
 #, c-format
 msgid "Opcode `%s' is unconditional\n"
 msgstr ""
 
-#: config/tc-arm.c:7747
+#: config/tc-arm.c:7761
 #, c-format
 msgid "Opcode `%s' must have suffix from <%s>\n"
 msgstr ""
 
-#: config/tc-arm.c:7838
+#: config/tc-arm.c:7852
 #, c-format
 msgid "register '%s' does not exist\n"
 msgstr ""
 
-#: config/tc-arm.c:7843
+#: config/tc-arm.c:7857
 #, c-format
 msgid "ignoring redefinition of register alias '%s'"
 msgstr ""
 
-#: config/tc-arm.c:7849
+#: config/tc-arm.c:7863
 #, c-format
 msgid ""
 "ignoring redefinition of register alias '%s' to non-existant register '%s'"
 msgstr ""
 
-#: config/tc-arm.c:7853
+#: config/tc-arm.c:7867
 msgid "ignoring incomplete .req pseuso op"
 msgstr ""
 
-#: config/tc-arm.c:7860
+#: config/tc-arm.c:7874
 #, c-format
 msgid "bad instruction `%s'"
 msgstr ""
 
-#: config/tc-arm.c:8035
+#: config/tc-arm.c:8049
 #, c-format
 msgid "Unrecognised APCS switch -m%s"
 msgstr ""
 
-#: config/tc-arm.c:8192 config/tc-arm.c:8205 config/tc-arm.c:8218
-#: config/tc-arm.c:8231 config/tc-arm.c:8237
+#: config/tc-arm.c:8206 config/tc-arm.c:8219 config/tc-arm.c:8232
+#: config/tc-arm.c:8245 config/tc-arm.c:8251
 #, c-format
 msgid "Invalid architecture variant -m%s"
 msgstr ""
 
-#: config/tc-arm.c:8244
+#: config/tc-arm.c:8258
 #, c-format
 msgid "Invalid processor variant -m%s"
 msgstr ""
 
-#: config/tc-arm.c:8267
+#: config/tc-arm.c:8281
 msgid ""
 " ARM Specific Assembler Options:\n"
 "  -m[arm][<processor name>] select processor variant\n"
@@ -2039,7 +2044,7 @@ msgid ""
 "  -k                        generate PIC code.\n"
 msgstr ""
 
-#: config/tc-arm.c:8279
+#: config/tc-arm.c:8293
 msgid ""
 "  -mapcs-32, -mapcs-26      specify which ARM Procedure Calling Standard to "
 "use\n"
@@ -2048,17 +2053,17 @@ msgid ""
 "  -mapcs-reentrant          the code is position independent/reentrant\n"
 msgstr ""
 
-#: config/tc-arm.c:8286
+#: config/tc-arm.c:8300
 msgid "  -moabi                    support the old ELF ABI\n"
 msgstr ""
 
-#: config/tc-arm.c:8290
+#: config/tc-arm.c:8304
 msgid ""
 "  -EB                       assemble code for a big endian cpu\n"
 "  -EL                       assemble code for a little endian cpu\n"
 msgstr ""
 
-#: config/tc-arm.c:8443
+#: config/tc-arm.c:8457
 #, c-format
 msgid "%s: unexpected function type: %d"
 msgstr ""
@@ -2104,7 +2109,7 @@ msgid "redefinition of mcu type `%s' to `%s'"
 msgstr ""
 
 #: config/tc-avr.c:372 config/tc-d10v.c:313 config/tc-d30v.c:366
-#: config/tc-mips.c:8789 config/tc-mn10200.c:375 config/tc-pj.c:356
+#: config/tc-mips.c:8805 config/tc-mn10200.c:375 config/tc-pj.c:356
 #: config/tc-ppc.c:4518 config/tc-sh.c:2063 config/tc-v850.c:1291
 msgid "bad call to md_atof"
 msgstr ""
@@ -2655,11 +2660,11 @@ msgstr ""
 msgid "Instruction %s not allowed in a delay slot."
 msgstr ""
 
-#: config/tc-fr30.c:380 config/tc-m32r.c:1556
+#: config/tc-fr30.c:381 config/tc-m32r.c:1557
 msgid "Addend to unresolved symbol not on word boundary."
 msgstr ""
 
-#: config/tc-fr30.c:538 config/tc-i960.c:772 config/tc-m32r.c:1864
+#: config/tc-fr30.c:539 config/tc-i960.c:772 config/tc-m32r.c:1866
 msgid "Bad call to md_atof()"
 msgstr ""
 
@@ -2735,7 +2740,7 @@ msgstr ""
 msgid "invalid operands"
 msgstr ""
 
-#: config/tc-h8300.c:1250 config/tc-h8500.c:1104 config/tc-mips.c:7984
+#: config/tc-h8300.c:1250 config/tc-h8500.c:1104 config/tc-mips.c:8000
 #: config/tc-sh.c:1882 config/tc-w65.c:740 config/tc-z8k.c:1205
 msgid "unknown opcode"
 msgstr ""
@@ -3239,347 +3244,356 @@ msgstr ""
 msgid "No memory for symbol name."
 msgstr ""
 
-#: config/tc-i386.c:581
+#: config/tc-i386.c:599
 #, c-format
 msgid "%s shortened to %s"
 msgstr ""
 
-#: config/tc-i386.c:636
+#: config/tc-i386.c:654
 msgid "same type of prefix used twice"
 msgstr ""
 
-#: config/tc-i386.c:654
+#: config/tc-i386.c:672
 msgid "64bit mode not supported on this CPU."
 msgstr ""
 
-#: config/tc-i386.c:658
+#: config/tc-i386.c:676
 msgid "32bit mode not supported on this CPU."
 msgstr ""
 
-#: config/tc-i386.c:691
+#: config/tc-i386.c:709
 msgid "bad argument to syntax directive."
 msgstr ""
 
-#: config/tc-i386.c:734
+#: config/tc-i386.c:753
 #, c-format
 msgid "no such architecture: `%s'"
 msgstr ""
 
-#: config/tc-i386.c:739
+#: config/tc-i386.c:758
 msgid "missing cpu architecture"
 msgstr ""
 
-#: config/tc-i386.c:790 config/tc-i386.c:4492
+#: config/tc-i386.c:772
+#, c-format
+msgid "no such architecture modifier: `%s'"
+msgstr ""
+
+#: config/tc-i386.c:826 config/tc-i386.c:4571
 msgid "Unknown architecture"
 msgstr ""
 
-#: config/tc-i386.c:825 config/tc-i386.c:848 config/tc-m68k.c:3812
+#: config/tc-i386.c:861 config/tc-i386.c:884 config/tc-m68k.c:3812
 #, c-format
 msgid "Internal Error:  Can't hash %s: %s"
 msgstr ""
 
-#: config/tc-i386.c:1101
+#: config/tc-i386.c:1137
 msgid "There are no unsigned pc-relative relocations"
 msgstr ""
 
-#: config/tc-i386.c:1108 config/tc-i386.c:4639
+#: config/tc-i386.c:1144 config/tc-i386.c:4727
 #, c-format
 msgid "can not do %d byte pc-relative relocation"
 msgstr ""
 
-#: config/tc-i386.c:1125
+#: config/tc-i386.c:1161
 #, c-format
 msgid "can not do %s %d byte relocation"
 msgstr ""
 
-#: config/tc-i386.c:1234 config/tc-i386.c:1327
+#: config/tc-i386.c:1271 config/tc-i386.c:1364
 #, c-format
 msgid "no such instruction: `%s'"
 msgstr ""
 
-#: config/tc-i386.c:1243
+#: config/tc-i386.c:1280
 #, c-format
 msgid "invalid character %s in mnemonic"
 msgstr ""
 
-#: config/tc-i386.c:1250
+#: config/tc-i386.c:1287
 msgid "expecting prefix; got nothing"
 msgstr ""
 
-#: config/tc-i386.c:1252
+#: config/tc-i386.c:1289
 msgid "expecting mnemonic; got nothing"
 msgstr ""
 
-#: config/tc-i386.c:1270
+#: config/tc-i386.c:1307
 #, c-format
 msgid "redundant %s prefix"
 msgstr ""
 
-#: config/tc-i386.c:1338
+#: config/tc-i386.c:1375
 #, c-format
 msgid "`%s' is not supported on `%s'"
 msgstr ""
 
-#: config/tc-i386.c:1343
+#: config/tc-i386.c:1380
 msgid "use .code16 to ensure correct addressing mode"
 msgstr ""
 
-#: config/tc-i386.c:1351
+#: config/tc-i386.c:1388
 #, c-format
 msgid "expecting string instruction after `%s'"
 msgstr ""
 
-#: config/tc-i386.c:1372
+#: config/tc-i386.c:1409
 #, c-format
 msgid "invalid character %s before operand %d"
 msgstr ""
 
-#: config/tc-i386.c:1386
+#: config/tc-i386.c:1423
 #, c-format
 msgid "unbalanced parenthesis in operand %d."
 msgstr ""
 
-#: config/tc-i386.c:1389
+#: config/tc-i386.c:1426
 #, c-format
 msgid "unbalanced brackets in operand %d."
 msgstr ""
 
-#: config/tc-i386.c:1398
+#: config/tc-i386.c:1435
 #, c-format
 msgid "invalid character %s in operand %d"
 msgstr ""
 
-#: config/tc-i386.c:1425
+#: config/tc-i386.c:1462
 #, c-format
 msgid "spurious operands; (%d operands/instruction max)"
 msgstr ""
 
-#: config/tc-i386.c:1448
+#: config/tc-i386.c:1485
 msgid "expecting operand after ','; got nothing"
 msgstr ""
 
-#: config/tc-i386.c:1453
+#: config/tc-i386.c:1490
 msgid "expecting operand before ','; got nothing"
 msgstr ""
 
 #. We found no match.
-#: config/tc-i386.c:1801
+#: config/tc-i386.c:1838
 #, c-format
 msgid "suffix or operands invalid for `%s'"
 msgstr ""
 
-#: config/tc-i386.c:1812
+#: config/tc-i386.c:1849
 #, c-format
 msgid "indirect %s without `*'"
 msgstr ""
 
 #. Warn them that a data or address size prefix doesn't
 #. affect assembly of the next line of code.
-#: config/tc-i386.c:1820
+#: config/tc-i386.c:1857
 #, c-format
 msgid "stand-alone `%s' prefix"
 msgstr ""
 
-#: config/tc-i386.c:1856 config/tc-i386.c:1871
+#: config/tc-i386.c:1893 config/tc-i386.c:1908
 msgid "`%s' operand %d must use `%%es' segment"
 msgstr ""
 
-#: config/tc-i386.c:1886
+#: config/tc-i386.c:1923
 msgid "Extended register `%%%s' available only in 64bit mode."
 msgstr ""
 
 #. Prohibit these changes in the 64bit mode, since
 #. the lowering is more complicated.
-#: config/tc-i386.c:1957 config/tc-i386.c:2008 config/tc-i386.c:2023
-#: config/tc-i386.c:2051 config/tc-i386.c:2079
+#: config/tc-i386.c:1994 config/tc-i386.c:2045 config/tc-i386.c:2060
+#: config/tc-i386.c:2088 config/tc-i386.c:2116
 msgid "Incorrect register `%%%s' used with`%c' suffix"
 msgstr ""
 
-#: config/tc-i386.c:1963 config/tc-i386.c:2013 config/tc-i386.c:2084
+#: config/tc-i386.c:2000 config/tc-i386.c:2050 config/tc-i386.c:2121
 msgid "using `%%%s' instead of `%%%s' due to `%c' suffix"
 msgstr ""
 
-#: config/tc-i386.c:1976 config/tc-i386.c:1994 config/tc-i386.c:2038
-#: config/tc-i386.c:2065
+#: config/tc-i386.c:2013 config/tc-i386.c:2031 config/tc-i386.c:2075
+#: config/tc-i386.c:2102
 msgid "`%%%s' not allowed with `%s%c'"
 msgstr ""
 
-#: config/tc-i386.c:2125
+#: config/tc-i386.c:2162
 msgid "no instruction mnemonic suffix given; can't determine immediate size"
 msgstr ""
 
-#: config/tc-i386.c:2151
+#: config/tc-i386.c:2188
 #, c-format
 msgid ""
 "no instruction mnemonic suffix given; can't determine immediate size %x %c"
 msgstr ""
 
-#: config/tc-i386.c:2176
+#: config/tc-i386.c:2213
 msgid ""
 "no instruction mnemonic suffix given and no register operands; can't size "
 "instruction"
 msgstr ""
 
-#: config/tc-i386.c:2224
+#: config/tc-i386.c:2261
 msgid "64bit operations available only in 64bit modes."
 msgstr ""
 
 #. Reversed arguments on faddp, fsubp, etc.
-#: config/tc-i386.c:2292
+#: config/tc-i386.c:2329
 msgid "translating to `%s %%%s,%%%s'"
 msgstr ""
 
 #. Extraneous `l' suffix on fp insn.
-#: config/tc-i386.c:2299
+#: config/tc-i386.c:2336
 msgid "translating to `%s %%%s'"
 msgstr ""
 
-#: config/tc-i386.c:2572
+#: config/tc-i386.c:2609
 msgid "you can't `pop %%cs'"
 msgstr ""
 
 #. UnixWare fsub no args is alias for fsubp, fadd -> faddp, etc.
-#: config/tc-i386.c:2605
+#: config/tc-i386.c:2642
 #, c-format
 msgid "translating to `%sp'"
 msgstr ""
 
-#: config/tc-i386.c:2648
+#: config/tc-i386.c:2685
 msgid ""
 "Can't encode registers '%%%s' in the instruction requiring REX prefix.\n"
 msgstr ""
 
-#: config/tc-i386.c:2700 config/tc-i386.c:2772 config/tc-i386.c:2819
+#: config/tc-i386.c:2732 config/tc-i386.c:2806 config/tc-i386.c:2853
 msgid "skipping prefixes on this instruction"
 msgstr ""
 
-#: config/tc-i386.c:2840
+#: config/tc-i386.c:2874
 msgid "16-bit jump out of range"
 msgstr ""
 
-#: config/tc-i386.c:2849
+#: config/tc-i386.c:2883
 #, c-format
 msgid "can't handle non absolute segment in `%s'"
 msgstr ""
 
-#: config/tc-i386.c:3106
+#: config/tc-i386.c:3140
 msgid "only 1 or 2 immediate operands are allowed"
 msgstr ""
 
-#: config/tc-i386.c:3136 config/tc-i386.c:3374
+#: config/tc-i386.c:3170 config/tc-i386.c:3408
 msgid "GOT relocations not supported in 16 bit mode"
 msgstr ""
 
-#: config/tc-i386.c:3173 config/tc-i386.c:3410
+#: config/tc-i386.c:3207 config/tc-i386.c:3444
 msgid "bad reloc specifier in expression"
 msgstr ""
 
-#: config/tc-i386.c:3191 config/tc-i386.c:3445
+#: config/tc-i386.c:3225 config/tc-i386.c:3482
 #, c-format
 msgid "ignoring junk `%s' after expression"
 msgstr ""
 
 #. Missing or bad expr becomes absolute 0.
-#: config/tc-i386.c:3198
+#: config/tc-i386.c:3232
 #, c-format
 msgid "missing or invalid immediate expression `%s' taken as 0"
 msgstr ""
 
-#: config/tc-i386.c:3229 config/tc-i386.c:3475
+#: config/tc-i386.c:3263 config/tc-i386.c:3512
 #, c-format
 msgid "unimplemented segment %s in operand"
 msgstr ""
 
-#: config/tc-i386.c:3231 config/tc-i386.c:3477
+#: config/tc-i386.c:3265 config/tc-i386.c:3514
 #, c-format
 msgid "unimplemented segment type %d in operand"
 msgstr ""
 
-#: config/tc-i386.c:3273 config/tc-i386.c:5407
+#: config/tc-i386.c:3307 config/tc-i386.c:5495
 #, c-format
 msgid "expecting scale factor of 1, 2, 4, or 8: got `%s'"
 msgstr ""
 
-#: config/tc-i386.c:3279
+#: config/tc-i386.c:3313
 #, c-format
 msgid "scale factor of %d without an index register"
 msgstr ""
 
 #. Missing or bad expr becomes absolute 0.
-#: config/tc-i386.c:3456
+#: config/tc-i386.c:3493
 #, c-format
 msgid "missing or invalid displacement expression `%s' taken as 0"
 msgstr ""
 
-#: config/tc-i386.c:3562
+#: config/tc-i386.c:3599
 #, c-format
 msgid "`%s' is not a valid base/index expression"
 msgstr ""
 
-#: config/tc-i386.c:3566
+#: config/tc-i386.c:3603
 #, c-format
 msgid "`%s' is not a valid %s bit base/index expression"
 msgstr ""
 
-#: config/tc-i386.c:3641
+#: config/tc-i386.c:3678
 #, c-format
 msgid "bad memory operand `%s'"
 msgstr ""
 
-#: config/tc-i386.c:3656
+#: config/tc-i386.c:3693
 #, c-format
 msgid "junk `%s' after register"
 msgstr ""
 
-#: config/tc-i386.c:3665 config/tc-i386.c:3780 config/tc-i386.c:3816
+#: config/tc-i386.c:3702 config/tc-i386.c:3817 config/tc-i386.c:3853
 #, c-format
 msgid "bad register name `%s'"
 msgstr ""
 
-#: config/tc-i386.c:3673
+#: config/tc-i386.c:3710
 msgid "immediate operand illegal with absolute jump"
 msgstr ""
 
-#: config/tc-i386.c:3695
+#: config/tc-i386.c:3732
 #, c-format
 msgid "too many memory references for `%s'"
 msgstr ""
 
-#: config/tc-i386.c:3773
+#: config/tc-i386.c:3810
 #, c-format
 msgid "expecting `,' or `)' after index register in `%s'"
 msgstr ""
 
-#: config/tc-i386.c:3795
+#: config/tc-i386.c:3832
 #, c-format
 msgid "expecting `)' after scale factor in `%s'"
 msgstr ""
 
-#: config/tc-i386.c:3802
+#: config/tc-i386.c:3839
 #, c-format
 msgid "expecting index register or scale factor after `,'; got '%c'"
 msgstr ""
 
-#: config/tc-i386.c:3809
+#: config/tc-i386.c:3846
 #, c-format
 msgid "expecting `,' or `)' after base register in `%s'"
 msgstr ""
 
 #. It's not a memory operand; argh!
-#: config/tc-i386.c:3850
+#: config/tc-i386.c:3887
 #, c-format
 msgid "invalid char %s beginning operand %d `%s'"
 msgstr ""
 
-#: config/tc-i386.c:4288
+#: config/tc-i386.c:4061
+msgid "long jump required"
+msgstr ""
+
+#: config/tc-i386.c:4367
 msgid "Bad call to md_atof ()"
 msgstr ""
 
-#: config/tc-i386.c:4445
+#: config/tc-i386.c:4524
 msgid "No compiled in support for x86_64"
 msgstr ""
 
-#: config/tc-i386.c:4466
+#: config/tc-i386.c:4545
 msgid ""
 "  -Q                      ignored\n"
 "  -V                      print assembler version number\n"
@@ -3588,63 +3602,63 @@ msgid ""
 "  -s                      ignored\n"
 msgstr ""
 
-#: config/tc-i386.c:4473
+#: config/tc-i386.c:4552
 msgid "  -q                      quieten some warnings\n"
 msgstr ""
 
-#: config/tc-i386.c:4532 config/tc-s390.c:1446
+#: config/tc-i386.c:4611 config/tc-s390.c:1446
 msgid "GOT already in symbol table"
 msgstr ""
 
-#: config/tc-i386.c:4653
+#: config/tc-i386.c:4741
 #, c-format
 msgid "can not do %d byte relocation"
 msgstr ""
 
-#: config/tc-i386.c:4713 config/tc-s390.c:1746
+#: config/tc-i386.c:4801 config/tc-s390.c:1746
 #, c-format
 msgid "cannot represent relocation type %s"
 msgstr ""
 
-#: config/tc-i386.c:5009
+#: config/tc-i386.c:5097
 #, c-format
 msgid "too many memory references for '%s'"
 msgstr ""
 
-#: config/tc-i386.c:5172
+#: config/tc-i386.c:5260
 #, c-format
 msgid "Unknown operand modifier `%s'\n"
 msgstr ""
 
-#: config/tc-i386.c:5379
+#: config/tc-i386.c:5467
 #, c-format
 msgid "`%s' is not a valid segment register"
 msgstr ""
 
-#: config/tc-i386.c:5389 config/tc-i386.c:5510
+#: config/tc-i386.c:5477 config/tc-i386.c:5598
 msgid "Register scaling only allowed in memory operands."
 msgstr ""
 
-#: config/tc-i386.c:5420
+#: config/tc-i386.c:5508
 msgid "Too many register references in memory operand.\n"
 msgstr ""
 
-#: config/tc-i386.c:5489
+#: config/tc-i386.c:5577
 #, c-format
 msgid "Syntax error. Expecting a constant. Got `%s'.\n"
 msgstr ""
 
-#: config/tc-i386.c:5559
+#: config/tc-i386.c:5647
 #, c-format
 msgid "Unrecognized token '%s'"
 msgstr ""
 
-#: config/tc-i386.c:5576
+#: config/tc-i386.c:5664
 #, c-format
 msgid "Unexpected token `%s'\n"
 msgstr ""
 
-#: config/tc-i386.c:5720
+#: config/tc-i386.c:5808
 #, c-format
 msgid "Unrecognized token `%s'\n"
 msgstr ""
@@ -3919,92 +3933,92 @@ msgstr ""
 msgid "callj to difference of two symbols"
 msgstr ""
 
-#: config/tc-ia64.c:952
+#: config/tc-ia64.c:988
 msgid "Unwind directive not followed by an instruction."
 msgstr ""
 
-#: config/tc-ia64.c:4094
+#: config/tc-ia64.c:4243
 msgid "Register name expected"
 msgstr ""
 
-#: config/tc-ia64.c:4099 config/tc-ia64.c:4385
+#: config/tc-ia64.c:4248 config/tc-ia64.c:4534
 msgid "Comma expected"
 msgstr ""
 
-#: config/tc-ia64.c:4107
+#: config/tc-ia64.c:4256
 msgid "Register value annotation ignored"
 msgstr ""
 
-#: config/tc-ia64.c:4131
+#: config/tc-ia64.c:4280
 msgid "Directive invalid within a bundle"
 msgstr ""
 
-#: config/tc-ia64.c:4198
+#: config/tc-ia64.c:4347
 msgid "Missing predicate relation type"
 msgstr ""
 
-#: config/tc-ia64.c:4214
+#: config/tc-ia64.c:4363
 msgid "Unrecognized predicate relation type"
 msgstr ""
 
-#: config/tc-ia64.c:4234 config/tc-ia64.c:4259
+#: config/tc-ia64.c:4383 config/tc-ia64.c:4408
 msgid "Predicate register expected"
 msgstr ""
 
-#: config/tc-ia64.c:4246
+#: config/tc-ia64.c:4395
 msgid "Duplicate predicate register ignored"
 msgstr ""
 
-#: config/tc-ia64.c:4268
+#: config/tc-ia64.c:4417
 msgid "Bad register range"
 msgstr ""
 
-#: config/tc-ia64.c:4296
+#: config/tc-ia64.c:4445
 msgid "Predicate source and target required"
 msgstr ""
 
-#: config/tc-ia64.c:4298 config/tc-ia64.c:4310
+#: config/tc-ia64.c:4447 config/tc-ia64.c:4459
 msgid "Use of p0 is not valid in this context"
 msgstr ""
 
-#: config/tc-ia64.c:4305
+#: config/tc-ia64.c:4454
 msgid "At least two PR arguments expected"
 msgstr ""
 
-#: config/tc-ia64.c:4319
+#: config/tc-ia64.c:4468
 msgid "At least one PR argument expected"
 msgstr ""
 
-#: config/tc-ia64.c:4355
+#: config/tc-ia64.c:4504
 #, c-format
 msgid "Inserting \"%s\" into entry hint table failed: %s"
 msgstr ""
 
 #. FIXME -- need 62-bit relocation type
-#: config/tc-ia64.c:4775
+#: config/tc-ia64.c:4924
 msgid "62-bit relocation not yet implemented"
 msgstr ""
 
-#: config/tc-ia64.c:4837
+#: config/tc-ia64.c:4986
 msgid "lower 16 bits of mask ignored"
 msgstr ""
 
-#: config/tc-ia64.c:5337
+#: config/tc-ia64.c:5489
 msgid "Value truncated to 62 bits"
 msgstr ""
 
-#: config/tc-ia64.c:5688
+#: config/tc-ia64.c:5840
 msgid ""
 "Additional NOP may be necessary to workaround Itanium processor A/B step "
 "errata"
 msgstr ""
 
-#: config/tc-ia64.c:5870
+#: config/tc-ia64.c:6022
 #, c-format
 msgid "Unrecognized option '-x%s'"
 msgstr ""
 
-#: config/tc-ia64.c:5898
+#: config/tc-ia64.c:6050
 msgid ""
 "IA-64 options:\n"
 "  -milp32|-milp64|-mlp64|-mp64\tselect data model (default -mlp64)\n"
@@ -4014,33 +4028,33 @@ msgid ""
 "  -xdebug\t\t  debug dependency violation checker\n"
 msgstr ""
 
-#: config/tc-ia64.c:6168 config/tc-mips.c:1014
+#: config/tc-ia64.c:6320 config/tc-mips.c:1014
 msgid "Could not set architecture and machine"
 msgstr ""
 
-#: config/tc-ia64.c:6244
+#: config/tc-ia64.c:6396
 msgid "Explicit stops are ignored in auto mode"
 msgstr ""
 
-#: config/tc-ia64.c:6294
+#: config/tc-ia64.c:6446
 msgid "Found '{' after explicit switch to automatic mode"
 msgstr ""
 
-#: config/tc-ia64.c:6707
+#: config/tc-ia64.c:6859
 #, c-format
 msgid "Unhandled dependency %s for %s (%s), note %d"
 msgstr ""
 
-#: config/tc-ia64.c:7983
+#: config/tc-ia64.c:8135
 #, c-format
 msgid "Unrecognized dependency specifier %d\n"
 msgstr ""
 
-#: config/tc-ia64.c:8774
+#: config/tc-ia64.c:8926
 msgid "Only the first path encountering the conflict is reported"
 msgstr ""
 
-#: config/tc-ia64.c:8777
+#: config/tc-ia64.c:8929
 msgid "This is the location of the conflicting usage"
 msgstr ""
 
@@ -4200,7 +4214,7 @@ msgstr ""
 msgid "Length of .scomm \"%s\" is already %ld. Not changed to %ld."
 msgstr ""
 
-#: config/tc-m32r.c:1786
+#: config/tc-m32r.c:1788
 msgid "Unmatched high/shigh reloc"
 msgstr ""
 
@@ -4546,7 +4560,7 @@ msgstr ""
 msgid "Unable to produce reloc against symbol '%s'"
 msgstr ""
 
-#: config/tc-m68k.c:929 config/tc-mips.c:11242
+#: config/tc-m68k.c:929 config/tc-mips.c:11262
 #, c-format
 msgid "Cannot make %s relocation PC relative"
 msgstr ""
@@ -5221,7 +5235,7 @@ msgstr ""
 msgid "returned from mips_ip(%s) insn_opcode = 0x%x\n"
 msgstr ""
 
-#: config/tc-mips.c:1782 config/tc-mips.c:11374
+#: config/tc-mips.c:1782 config/tc-mips.c:11394
 msgid "extended instruction in delay slot"
 msgstr ""
 
@@ -5251,8 +5265,8 @@ msgstr ""
 msgid "Number larger than 64 bits"
 msgstr ""
 
-#: config/tc-mips.c:3304 config/tc-mips.c:3376 config/tc-mips.c:5055
-#: config/tc-mips.c:5106 config/tc-mips.c:5642 config/tc-mips.c:5705
+#: config/tc-mips.c:3304 config/tc-mips.c:3376 config/tc-mips.c:5071
+#: config/tc-mips.c:5122 config/tc-mips.c:5658 config/tc-mips.c:5721
 msgid "PIC code offset overflow (max 16 signed bits)"
 msgstr ""
 
@@ -5267,8 +5281,8 @@ msgid "Branch likely %s is always false"
 msgstr ""
 
 #: config/tc-mips.c:3627 config/tc-mips.c:3701 config/tc-mips.c:3804
-#: config/tc-mips.c:3859 config/tc-mips.c:6742 config/tc-mips.c:6751
-#: config/tc-mips.c:6759 config/tc-mips.c:6868
+#: config/tc-mips.c:3859 config/tc-mips.c:6758 config/tc-mips.c:6767
+#: config/tc-mips.c:6775 config/tc-mips.c:6884
 msgid "Unsupported large constant"
 msgstr ""
 
@@ -5282,234 +5296,234 @@ msgstr ""
 msgid "Divide by zero."
 msgstr ""
 
-#: config/tc-mips.c:4626
+#: config/tc-mips.c:4642
 msgid "MIPS PIC call to register other than $25"
 msgstr ""
 
-#: config/tc-mips.c:4631 config/tc-mips.c:4743
+#: config/tc-mips.c:4647 config/tc-mips.c:4759
 msgid "No .cprestore pseudo-op used in PIC code"
 msgstr ""
 
-#: config/tc-mips.c:4816 config/tc-mips.c:4905 config/tc-mips.c:5393
-#: config/tc-mips.c:5434 config/tc-mips.c:5452 config/tc-mips.c:6081
+#: config/tc-mips.c:4832 config/tc-mips.c:4921 config/tc-mips.c:5409
+#: config/tc-mips.c:5450 config/tc-mips.c:5468 config/tc-mips.c:6097
 msgid "opcode not supported on this processor"
 msgstr ""
 
-#: config/tc-mips.c:5912 config/tc-mips.c:6636
+#: config/tc-mips.c:5928 config/tc-mips.c:6652
 msgid "Macro used $at after \".set noat\""
 msgstr ""
 
-#: config/tc-mips.c:6052 config/tc-mips.c:6070
+#: config/tc-mips.c:6068 config/tc-mips.c:6086
 msgid "rotate count too large"
 msgstr ""
 
-#: config/tc-mips.c:6121
+#: config/tc-mips.c:6137
 #, c-format
 msgid "Instruction %s: result is always false"
 msgstr ""
 
-#: config/tc-mips.c:6290
+#: config/tc-mips.c:6306
 #, c-format
 msgid "Instruction %s: result is always true"
 msgstr ""
 
-#: config/tc-mips.c:6429 config/tc-mips.c:6456 config/tc-mips.c:6528
-#: config/tc-mips.c:6553
+#: config/tc-mips.c:6445 config/tc-mips.c:6472 config/tc-mips.c:6544
+#: config/tc-mips.c:6569
 msgid "operand overflow"
 msgstr ""
 
 #. FIXME: Check if this is one of the itbl macros, since they
 #. are added dynamically.
-#: config/tc-mips.c:6632
+#: config/tc-mips.c:6648
 #, c-format
 msgid "Macro %s not implemented yet"
 msgstr ""
 
-#: config/tc-mips.c:6902
+#: config/tc-mips.c:6918
 #, c-format
 msgid "internal: bad mips opcode (mask error): %s %s"
 msgstr ""
 
-#: config/tc-mips.c:6958
+#: config/tc-mips.c:6974
 #, c-format
 msgid "internal: bad mips opcode (unknown operand type `%c'): %s %s"
 msgstr ""
 
-#: config/tc-mips.c:6965
+#: config/tc-mips.c:6981
 #, c-format
 msgid "internal: bad mips opcode (bits 0x%lx undefined): %s %s"
 msgstr ""
 
-#: config/tc-mips.c:7073
+#: config/tc-mips.c:7089
 #, c-format
 msgid "opcode not supported on this processor: %s (%s)"
 msgstr ""
 
-#: config/tc-mips.c:7144
+#: config/tc-mips.c:7160
 #, c-format
 msgid "Improper shift amount (%ld)"
 msgstr ""
 
-#: config/tc-mips.c:7170 config/tc-mips.c:8324 config/tc-mips.c:8439
+#: config/tc-mips.c:7186 config/tc-mips.c:8340 config/tc-mips.c:8455
 #, c-format
 msgid "Invalid value for `%s' (%lu)"
 msgstr ""
 
-#: config/tc-mips.c:7188
+#: config/tc-mips.c:7204
 #, c-format
 msgid "Illegal break code (%ld)"
 msgstr ""
 
-#: config/tc-mips.c:7202
+#: config/tc-mips.c:7218
 #, c-format
 msgid "Illegal lower break code (%ld)"
 msgstr ""
 
-#: config/tc-mips.c:7215
+#: config/tc-mips.c:7231
 #, c-format
 msgid "Illegal 20-bit code (%ld)"
 msgstr ""
 
-#: config/tc-mips.c:7227
+#: config/tc-mips.c:7243
 #, c-format
 msgid "Coproccesor code > 25 bits (%ld)"
 msgstr ""
 
-#: config/tc-mips.c:7240
+#: config/tc-mips.c:7256
 #, c-format
 msgid "Illegal 19-bit code (%ld)"
 msgstr ""
 
-#: config/tc-mips.c:7252
+#: config/tc-mips.c:7268
 #, c-format
 msgid "Invalidate performance regster (%ld)"
 msgstr ""
 
-#: config/tc-mips.c:7289
+#: config/tc-mips.c:7305
 #, c-format
 msgid "Invalid register number (%d)"
 msgstr ""
 
-#: config/tc-mips.c:7453
+#: config/tc-mips.c:7469
 #, c-format
 msgid "Invalid float register number (%d)"
 msgstr ""
 
-#: config/tc-mips.c:7463
+#: config/tc-mips.c:7479
 #, c-format
 msgid "Float register should be even, was %d"
 msgstr ""
 
-#: config/tc-mips.c:7514
+#: config/tc-mips.c:7530
 msgid "absolute expression required"
 msgstr ""
 
-#: config/tc-mips.c:7575
+#: config/tc-mips.c:7591
 #, c-format
 msgid "Bad floating point constant: %s"
 msgstr ""
 
-#: config/tc-mips.c:7697
+#: config/tc-mips.c:7713
 msgid "Can't use floating point insn in this section"
 msgstr ""
 
-#: config/tc-mips.c:7751
+#: config/tc-mips.c:7767
 msgid "16 bit expression not in range 0..65535"
 msgstr ""
 
-#: config/tc-mips.c:7788
+#: config/tc-mips.c:7804
 msgid "16 bit expression not in range -32768..32767"
 msgstr ""
 
-#: config/tc-mips.c:7859
+#: config/tc-mips.c:7875
 msgid "lui expression not in range 0..65535"
 msgstr ""
 
-#: config/tc-mips.c:7883
+#: config/tc-mips.c:7899
 #, c-format
 msgid "invalid condition code register $fcc%d"
 msgstr ""
 
-#: config/tc-mips.c:7908
+#: config/tc-mips.c:7924
 msgid "invalid coprocessor sub-selection value (0-7)"
 msgstr ""
 
-#: config/tc-mips.c:7913
+#: config/tc-mips.c:7929
 #, c-format
 msgid "bad char = '%c'\n"
 msgstr ""
 
-#: config/tc-mips.c:7926 config/tc-mips.c:8464
+#: config/tc-mips.c:7942 config/tc-mips.c:8480
 msgid "illegal operands"
 msgstr ""
 
-#: config/tc-mips.c:7993
+#: config/tc-mips.c:8009
 msgid "unrecognized opcode"
 msgstr ""
 
-#: config/tc-mips.c:8102
+#: config/tc-mips.c:8118
 #, c-format
 msgid "invalid register number (%d)"
 msgstr ""
 
-#: config/tc-mips.c:8183
+#: config/tc-mips.c:8199
 msgid "used $at without \".set noat\""
 msgstr ""
 
-#: config/tc-mips.c:8358
+#: config/tc-mips.c:8374
 msgid "can't parse register list"
 msgstr ""
 
-#: config/tc-mips.c:8392 config/tc-mips.c:8422
+#: config/tc-mips.c:8408 config/tc-mips.c:8438
 msgid "invalid register list"
 msgstr ""
 
-#: config/tc-mips.c:8590
+#: config/tc-mips.c:8606
 msgid "extended operand requested but not required"
 msgstr ""
 
-#: config/tc-mips.c:8592
+#: config/tc-mips.c:8608
 msgid "invalid unextended operand value"
 msgstr ""
 
-#: config/tc-mips.c:8620
+#: config/tc-mips.c:8636
 msgid "operand value out of range for instruction"
 msgstr ""
 
-#: config/tc-mips.c:9005
+#: config/tc-mips.c:9021
 #, c-format
 msgid "invalid architecture -mcpu=%s"
 msgstr ""
 
-#: config/tc-mips.c:9054
+#: config/tc-mips.c:9070
 msgid "-G may not be used with embedded PIC code"
 msgstr ""
 
-#: config/tc-mips.c:9066
+#: config/tc-mips.c:9083
 msgid "-call_shared is supported only for ELF format"
 msgstr ""
 
-#: config/tc-mips.c:9072 config/tc-mips.c:10158 config/tc-mips.c:10332
+#: config/tc-mips.c:9089 config/tc-mips.c:10178 config/tc-mips.c:10352
 msgid "-G may not be used with SVR4 PIC code"
 msgstr ""
 
-#: config/tc-mips.c:9081
+#: config/tc-mips.c:9098
 msgid "-non_shared is supported only for ELF format"
 msgstr ""
 
-#: config/tc-mips.c:9097
+#: config/tc-mips.c:9115
 msgid "-G is not supported for this configuration"
 msgstr ""
 
-#: config/tc-mips.c:9102
+#: config/tc-mips.c:9120
 msgid "-G may not be used with SVR4 or embedded PIC code"
 msgstr ""
 
-#: config/tc-mips.c:9126
+#: config/tc-mips.c:9145
 msgid "No compiled in support for 64 bit object file format"
 msgstr ""
 
-#: config/tc-mips.c:9218
+#: config/tc-mips.c:9238
 msgid ""
 "MIPS options:\n"
 "-membedded-pic\t\tgenerate embedded position independent code\n"
@@ -5520,7 +5534,7 @@ msgid ""
 "\t\t\timplicitly with the gp register [default 8]\n"
 msgstr ""
 
-#: config/tc-mips.c:9226
+#: config/tc-mips.c:9246
 msgid ""
 "-mips1\t\t\tgenerate MIPS ISA I instructions\n"
 "-mips2\t\t\tgenerate MIPS ISA II instructions\n"
@@ -5532,20 +5546,20 @@ msgid ""
 "-mcpu=CPU\t\tgenerate code for CPU, where CPU is one of:\n"
 msgstr ""
 
-#: config/tc-mips.c:9257
+#: config/tc-mips.c:9277
 msgid ""
 "-mCPU\t\t\tequivalent to -mcpu=CPU.\n"
 "-no-mCPU\t\tdon't generate code specific to CPU.\n"
 "\t\t\tFor -mCPU and -no-mCPU, CPU must be one of:\n"
 msgstr ""
 
-#: config/tc-mips.c:9270
+#: config/tc-mips.c:9290
 msgid ""
 "-mips16\t\t\tgenerate mips16 instructions\n"
 "-no-mips16\t\tdo not generate mips16 instructions\n"
 msgstr ""
 
-#: config/tc-mips.c:9273
+#: config/tc-mips.c:9293
 msgid ""
 "-O0\t\t\tremove unneeded NOPs, do not swap branches\n"
 "-O\t\t\tremove unneeded NOPs and swap branches\n"
@@ -5554,7 +5568,7 @@ msgid ""
 "--break, --no-trap\tbreak exception on div by 0 and mult overflow\n"
 msgstr ""
 
-#: config/tc-mips.c:9280
+#: config/tc-mips.c:9300
 msgid ""
 "-KPIC, -call_shared\tgenerate SVR4 position independent code\n"
 "-non_shared\t\tdo not generate position independent code\n"
@@ -5563,170 +5577,170 @@ msgid ""
 "-64\t\t\tcreate 64 bit object file\n"
 msgstr ""
 
-#: config/tc-mips.c:9337
+#: config/tc-mips.c:9357
 #, c-format
 msgid "Unsupported reloc size %d"
 msgstr ""
 
-#: config/tc-mips.c:9440
+#: config/tc-mips.c:9460
 msgid "Unmatched %%hi reloc"
 msgstr ""
 
-#: config/tc-mips.c:9563
+#: config/tc-mips.c:9583
 msgid "Invalid PC relative reloc"
 msgstr ""
 
-#: config/tc-mips.c:9673 config/tc-sparc.c:3101 config/tc-sparc.c:3108
+#: config/tc-mips.c:9693 config/tc-sparc.c:3101 config/tc-sparc.c:3108
 #: config/tc-sparc.c:3115 config/tc-sparc.c:3122 config/tc-sparc.c:3129
 #: config/tc-sparc.c:3138 config/tc-sparc.c:3149 config/tc-sparc.c:3175
 #: config/tc-sparc.c:3203 write.c:992 write.c:1056
 msgid "relocation overflow"
 msgstr ""
 
-#: config/tc-mips.c:9689
+#: config/tc-mips.c:9709
 #, c-format
 msgid "Branch to odd address (%lx)"
 msgstr ""
 
-#: config/tc-mips.c:9853
+#: config/tc-mips.c:9873
 #, c-format
 msgid "%08lx  UNDEFINED\n"
 msgstr ""
 
-#: config/tc-mips.c:9919
+#: config/tc-mips.c:9939
 msgid "Alignment negative: 0 assumed."
 msgstr ""
 
-#: config/tc-mips.c:10007
+#: config/tc-mips.c:10027
 msgid "No read only data section in this object file format"
 msgstr ""
 
-#: config/tc-mips.c:10030
+#: config/tc-mips.c:10050
 msgid "Global pointers not supported; recompile -G 0"
 msgstr ""
 
-#: config/tc-mips.c:10116
+#: config/tc-mips.c:10136
 #, c-format
 msgid "%s: no such section"
 msgstr ""
 
-#: config/tc-mips.c:10153
+#: config/tc-mips.c:10173
 #, c-format
 msgid ".option pic%d not supported"
 msgstr ""
 
-#: config/tc-mips.c:10164
+#: config/tc-mips.c:10184
 #, c-format
 msgid "Unrecognized option \"%s\""
 msgstr ""
 
-#: config/tc-mips.c:10227
+#: config/tc-mips.c:10247
 msgid "`noreorder' must be set before `nomacro'"
 msgstr ""
 
-#: config/tc-mips.c:10269
+#: config/tc-mips.c:10289
 msgid "unknown ISA level"
 msgstr ""
 
-#: config/tc-mips.c:10291
+#: config/tc-mips.c:10311
 msgid ".set pop with no .set push"
 msgstr ""
 
-#: config/tc-mips.c:10315
+#: config/tc-mips.c:10335
 #, c-format
 msgid "Tried to set unrecognized symbol: %s\n"
 msgstr ""
 
-#: config/tc-mips.c:10365
+#: config/tc-mips.c:10385
 msgid ".cpload not in noreorder section"
 msgstr ""
 
-#: config/tc-mips.c:10447
+#: config/tc-mips.c:10467
 msgid "Unsupported use of .gpword"
 msgstr ""
 
-#: config/tc-mips.c:10584
+#: config/tc-mips.c:10604
 msgid "expected `$'"
 msgstr ""
 
-#: config/tc-mips.c:10592
+#: config/tc-mips.c:10612
 msgid "Bad register number"
 msgstr ""
 
-#: config/tc-mips.c:10608
+#: config/tc-mips.c:10628
 msgid "Unrecognized register name"
 msgstr ""
 
-#: config/tc-mips.c:10807
+#: config/tc-mips.c:10827
 msgid "unsupported PC relative reference to different section"
 msgstr ""
 
-#: config/tc-mips.c:10916
+#: config/tc-mips.c:10936
 msgid "unsupported relocation"
 msgstr ""
 
-#: config/tc-mips.c:11020
+#: config/tc-mips.c:11040
 msgid "AT used after \".set noat\" or macro used after \".set nomacro\""
 msgstr ""
 
-#: config/tc-mips.c:11083
+#: config/tc-mips.c:11103
 msgid "Double check fx_r_type in tc-mips.c:tc_gen_reloc"
 msgstr ""
 
-#: config/tc-mips.c:11596
+#: config/tc-mips.c:11616
 msgid "missing `.end' at end of assembly"
 msgstr ""
 
-#: config/tc-mips.c:11611
+#: config/tc-mips.c:11631
 msgid "Expected simple number."
 msgstr ""
 
-#: config/tc-mips.c:11637
+#: config/tc-mips.c:11657
 #, c-format
 msgid " *input_line_pointer == '%c' 0x%02x\n"
 msgstr ""
 
-#: config/tc-mips.c:11639
+#: config/tc-mips.c:11659
 msgid "Invalid number"
 msgstr ""
 
-#: config/tc-mips.c:11693
+#: config/tc-mips.c:11713
 msgid ".end not in text section"
 msgstr ""
 
-#: config/tc-mips.c:11697
+#: config/tc-mips.c:11717
 msgid ".end directive without a preceding .ent directive."
 msgstr ""
 
-#: config/tc-mips.c:11706
+#: config/tc-mips.c:11726
 msgid ".end symbol does not match .ent symbol."
 msgstr ""
 
-#: config/tc-mips.c:11709
+#: config/tc-mips.c:11729
 msgid ".end directive missing or unknown symbol"
 msgstr ""
 
-#: config/tc-mips.c:11784
+#: config/tc-mips.c:11804
 msgid ".ent or .aent not in text section."
 msgstr ""
 
-#: config/tc-mips.c:11787
+#: config/tc-mips.c:11807
 msgid "missing `.end'"
 msgstr ""
 
-#: config/tc-mips.c:11820 ecoff.c:3205
+#: config/tc-mips.c:11840 ecoff.c:3205
 msgid ".frame outside of .ent"
 msgstr ""
 
-#: config/tc-mips.c:11831 ecoff.c:3216
+#: config/tc-mips.c:11851 ecoff.c:3216
 msgid "Bad .frame directive"
 msgstr ""
 
-#: config/tc-mips.c:11861
+#: config/tc-mips.c:11881
 msgid ".mask/.fmask outside of .ent"
 msgstr ""
 
-#: config/tc-mips.c:11868
+#: config/tc-mips.c:11888
 msgid "Bad .mask/.fmask directive"
 msgstr ""
 
@@ -8278,31 +8292,31 @@ msgstr ""
 msgid "Bad expression"
 msgstr ""
 
-#: expr.c:1674
+#: expr.c:1677
 msgid "missing operand; zero assumed"
 msgstr ""
 
-#: expr.c:1707
+#: expr.c:1710
 msgid "operation combines symbols in different segments"
 msgstr ""
 
-#: expr.c:1724
+#: expr.c:1727
 msgid "left operand is a bignum; integer 0 assumed"
 msgstr ""
 
-#: expr.c:1726
+#: expr.c:1729
 msgid "left operand is a float; integer 0 assumed"
 msgstr ""
 
-#: expr.c:1735
+#: expr.c:1738
 msgid "right operand is a bignum; integer 0 assumed"
 msgstr ""
 
-#: expr.c:1737
+#: expr.c:1740
 msgid "right operand is a float; integer 0 assumed"
 msgstr ""
 
-#: expr.c:1793 symbols.c:1089
+#: expr.c:1796 symbols.c:1089
 msgid "division by zero"
 msgstr ""
 
@@ -9252,36 +9266,36 @@ msgstr ""
 msgid "local label %s is not defined"
 msgstr ""
 
-#: write.c:2187
+#: write.c:2201
 #, c-format
 msgid "alignment padding (%lu bytes) not a multiple of %ld"
 msgstr ""
 
-#: write.c:2297
+#: write.c:2311
 #, c-format
 msgid ".word %s-%s+%s didn't fit"
 msgstr ""
 
-#: write.c:2378
+#: write.c:2392
 msgid "attempt to .org backwards ignored"
 msgstr ""
 
-#: write.c:2402
+#: write.c:2416
 msgid ".space specifies non-absolute value"
 msgstr ""
 
-#: write.c:2406
+#: write.c:2420
 msgid ".space or .fill with negative value, ignored"
 msgstr ""
 
-#: write.c:2657
+#: write.c:2671
 #, c-format
 msgid ""
 "Subtraction of two symbols in different sections \"%s\" {%s section} - "
 "\"%s\" {%s section} at file address %s."
 msgstr ""
 
-#: write.c:2811
+#: write.c:2825
 #, c-format
 msgid "Value of %s too large for field of %d bytes at %s"
 msgstr ""
index 06b13ebefbbc15f3bc06840c8788e9b679e9ecdc..e159d2a0a9aa39d9d1832022af6afcc28ecacc0d 100644 (file)
@@ -6,7 +6,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
-"POT-Creation-Date: 2000-07-27 16:32-0700\n"
+"POT-Creation-Date: 2001-02-06 18:02-0800\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -33,27 +33,27 @@ msgstr ""
 msgid "[find_call] 0x%lx: bsr"
 msgstr ""
 
-#: basic_blocks.c:123 call_graph.c:86 hist.c:122
+#: basic_blocks.c:125 call_graph.c:86 hist.c:122
 #, c-format
 msgid "%s: %s: unexpected end of file\n"
 msgstr ""
 
-#: basic_blocks.c:198
+#: basic_blocks.c:200
 #, c-format
 msgid "%s: warning: ignoring basic-block exec counts (use -l or --line)\n"
 msgstr ""
 
 #. FIXME: This only works if bfd_vma is unsigned long.
-#: basic_blocks.c:296 basic_blocks.c:306
+#: basic_blocks.c:298 basic_blocks.c:308
 #, c-format
 msgid "%s:%d: (%s:0x%lx) %lu executions\n"
 msgstr ""
 
-#: basic_blocks.c:297 basic_blocks.c:307
+#: basic_blocks.c:299 basic_blocks.c:309
 msgid "<unknown>"
 msgstr ""
 
-#: basic_blocks.c:551
+#: basic_blocks.c:553
 #, c-format
 msgid ""
 "\n"
@@ -64,36 +64,36 @@ msgid ""
 "\n"
 msgstr ""
 
-#: basic_blocks.c:575
+#: basic_blocks.c:577
 msgid ""
 "\n"
 "Execution Summary:\n"
 "\n"
 msgstr ""
 
-#: basic_blocks.c:576
+#: basic_blocks.c:578
 #, c-format
 msgid "%9ld   Executable lines in this file\n"
 msgstr ""
 
-#: basic_blocks.c:578
+#: basic_blocks.c:580
 #, c-format
 msgid "%9ld   Lines executed\n"
 msgstr ""
 
-#: basic_blocks.c:579
+#: basic_blocks.c:581
 #, c-format
 msgid "%9.2f   Percent of the file executed\n"
 msgstr ""
 
-#: basic_blocks.c:583
+#: basic_blocks.c:585
 #, c-format
 msgid ""
 "\n"
 "%9lu   Total number of line executions\n"
 msgstr ""
 
-#: basic_blocks.c:585
+#: basic_blocks.c:587
 #, c-format
 msgid "%9.2f   Average executions per line\n"
 msgstr ""
index fa7af4b5c7c32fbd267ddf3e6bf4528cdc609fa1..11eacd9b28e103ea0d67bb54b25c070b024043c0 100644 (file)
@@ -1,3 +1,7 @@
+2001-02-18  lars brinkhoff  <lars@nocrew.org>
+
+       * dis-asm.h: Add PDP-11 target.
+
 2001-02-09  Martin Schwidefsky  <schwidefsky@de.ibm.com>
 
        * dis-asm.h: Add linux target for S/390.
index 6e3e3b5cd6d3ffd4bfa1131d29b7d5a83e93f003..1cc3fce88025789cf56ddec166547368e4b8994d 100644 (file)
@@ -192,6 +192,7 @@ extern int print_insn_mcore         PARAMS ((bfd_vma, disassemble_info*));
 extern int print_insn_mn10200          PARAMS ((bfd_vma, disassemble_info*));
 extern int print_insn_mn10300          PARAMS ((bfd_vma, disassemble_info*));
 extern int print_insn_ns32k            PARAMS ((bfd_vma, disassemble_info*));
+extern int print_insn_pdp11            PARAMS ((bfd_vma, disassemble_info*));
 extern int print_insn_big_powerpc      PARAMS ((bfd_vma, disassemble_info*));
 extern int print_insn_little_powerpc   PARAMS ((bfd_vma, disassemble_info*));
 extern int print_insn_rs6000           PARAMS ((bfd_vma, disassemble_info*));
index 66c3875d74a6ee84d5db85e8268cc94ce95ea0d4..b4e688844ff9032af23e786f09d6921193db6ea2 100644 (file)
@@ -1,4 +1,8 @@
-Mon Feb 12 17:40:54 CET 2001  Jan Hubicka  <jh@suse.cz>
+2001-02-18  lars brinkhoff  <lars@nocrew.org>
+
+       * pdp11.h: New file.
+
+2001-02-12  Jan Hubicka  <jh@suse.cz>
 
        * i386.h (i386_optab): SSE integer converison instructions have
        64bit versions on x86-64.
@@ -29,7 +33,7 @@ Mon Feb 12 17:40:54 CET 2001  Jan Hubicka  <jh@suse.cz>
        (pa_opcodes): Add entries for missing wide mode ldi,ldo,ldw,stw.
        Remove duplicate "ldw j(s,b),x".  Sort some entries.
 
-Sat Jan 13 09:56:32 MET 2001  Jan Hubicka  <jh@suse.cz>
+2001-01-13  Jan Hubicka  <jh@suse.cz>
 
        * i386.h (i386_optab): Fix pusha and ret templates.
 
@@ -676,7 +680,7 @@ Mon Feb  1 21:09:14 1999  Catherine Moore  <clm@cygnus.com>
        * cgen.h (enum cgen_mode): Add CGEN_MODE_TARGET_MAX, CGEN_MODE_INT,
        CGEN_MODE_UINT.
 
-Sat Jan 16 01:29:25 1999  Jeffrey A Law  (law@cygnus.com)
+1999-01-16  Jeffrey A Law  (law@cygnus.com)
 
        * hppa.h (bv): Fix mask.
 
@@ -1027,7 +1031,7 @@ Mon Feb  2 17:10:38 1998  Steve Haworth  <steve@pm.cse.rmit.EDU.AU>
 
        * tic30.h: New file.
 
-Thu Jan 22 17:54:56 1998  Nick Clifton  <nickc@cygnus.com>
+Jan 22 17:54:56 1998  Nick Clifton  <nickc@cygnus.com>
 
        * cgen.h: Add prototypes for cgen_save_fixups(),
        cgen_restore_fixups(), and cgen_swap_fixups().  Change prototype
diff --git a/include/opcode/pdp11.h b/include/opcode/pdp11.h
new file mode 100644 (file)
index 0000000..891b74f
--- /dev/null
@@ -0,0 +1,78 @@
+/* PDP-11 opcde list.
+   Copyright (C) 2001 Free Software Foundation, Inc.
+
+This file is part of GDB and GAS.
+
+GDB and GAS are free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 1, or (at your option)
+any later version.
+
+GDB and GAS are distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GDB or GAS; see the file COPYING.  If not, write to
+the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+
+/*
+ * PDP-11 opcode types.
+ */
+
+#define PDP11_OPCODE_NO_OPS     0
+#define PDP11_OPCODE_REG        1      /* register */
+#define PDP11_OPCODE_OP                 2      /* generic operand */
+#define PDP11_OPCODE_REG_OP     3      /* register and generic operand */
+#define PDP11_OPCODE_REG_OP_REV         4      /* register and generic operand,
+                                          reversed syntax */
+#define PDP11_OPCODE_AC_OP      5      /* fpu accumulator and generic
+                                          operand */
+#define PDP11_OPCODE_OP_OP      6      /* two generic operands */
+#define PDP11_OPCODE_DISPL      7      /* pc-relative displacement */
+#define PDP11_OPCODE_REG_DISPL  8      /* redister and pc-relative
+                                          displacement */
+#define PDP11_OPCODE_IMM8       9      /* 8-bit immediate */
+#define PDP11_OPCODE_IMM6      10      /* 6-bit immediate */
+#define PDP11_OPCODE_IMM3      11      /* 3-bit immediate */
+#define PDP11_OPCODE_ILLEGAL   12      /* illegal instruction */
+
+/*
+ * PDP-11 instruction set extensions.
+ *
+ * Please keep the numbers low, as they are used as indices into
+ * an array.
+ */
+
+#define PDP11_NONE      0      /* not in instruction set */
+#define PDP11_BASIC     1      /* basic instruction set (11/20 etc) */
+#define PDP11_CSM       2      /* commercial instruction set */
+#define PDP11_CIS       3      /* commercial instruction set */
+#define PDP11_EIS       4      /* extended instruction set (11/45 etc) */
+#define PDP11_FIS       5      /* KEV11 floating-point instructions */
+#define PDP11_FPP       6      /* FP-11 floating-point instructions */
+#define PDP11_LEIS      7      /* limited extended instruction set
+                                  (11/40 etc) */
+#define PDP11_MFPT      8      /* move from processor type */
+#define PDP11_MPROC     9      /* multiprocessor instructions: tstset,
+                                  wrtlck */
+#define PDP11_MXPS     10      /* move from/to processor status */
+#define PDP11_SPL      11      /* set priority level */
+#define PDP11_UCODE    12      /* microcode instructions: ldub, med, xfc */
+#define PDP11_EXT_NUM  13      /* total number of extension types */
+
+struct pdp11_opcode
+{
+  const char *name;
+  int opcode;
+  int mask;
+  int type;
+  int extension;
+};
+
+extern const struct pdp11_opcode pdp11_opcodes[];
+extern const struct pdp11_opcode pdp11_aliases[];
+extern const int pdp11_num_opcodes, pdp11_num_aliases;
+
+/* end of pdp11.h */
index eeb19901ea5ce9e8d88d1b985eba2916d81bbbef..f03253c5df05dcabb49dbd4568fa9611939fdb9a 100644 (file)
@@ -1,3 +1,9 @@
+2001-02-18  lars brinkhoff  <lars@nocrew.org>
+
+       * Makefile.am: Add PDP-11 target.
+       * configure.tgt: Likewise.
+       * emulparams/pdp11.sh: New file.
+
 2001-02-17  David O'Brien  <obrien@FreeBSD.org>
 
        * configure.host: Add a generic FreeBSD configuration entry such that
index daa9761be79e4c14150b0e640a0169be91f7f4e4..a66cefba8e044f859dec7bde95797fa3476bc7f8 100644 (file)
@@ -208,6 +208,7 @@ ALL_EMULATIONS = \
        enews.o \
        ens32knbsd.o \
        epc532macha.o \
+       epdp11.o \
        epjelf.o \
        epjlelf.o \
        eppcmacos.o \
@@ -683,6 +684,9 @@ ens32knbsd.c:       $(srcdir)/emulparams/ns32knbsd.sh \
 epc532macha.c: $(srcdir)/emulparams/pc532macha.sh \
   $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/aout.sc ${GEN_DEPENDS}
        ${GENSCRIPTS} pc532macha "$(tdir_pc532macha)"
+epdp11.c: $(srcdir)/emulparams/pdp11.sh \
+  $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/aout.sc ${GEN_DEPENDS}
+       ${GENSCRIPTS} pdp11 "$(tdir_pdp11)"
 epjelf.c: $(srcdir)/emulparams/pjelf.sh \
   $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
        ${GENSCRIPTS} pjelf "$(tdir_pjelf)"
index 64a910fd8a1772dba8ca6898c48adef3da5c4d1b..2d25ac99c7813c69968b6d3bb904934ed11ed067 100644 (file)
@@ -316,6 +316,7 @@ ALL_EMULATIONS = \
        enews.o \
        ens32knbsd.o \
        epc532macha.o \
+       epdp11.o \
        epjelf.o \
        epjlelf.o \
        eppcmacos.o \
@@ -1397,6 +1398,9 @@ ens32knbsd.c:     $(srcdir)/emulparams/ns32knbsd.sh \
 epc532macha.c: $(srcdir)/emulparams/pc532macha.sh \
   $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/aout.sc ${GEN_DEPENDS}
        ${GENSCRIPTS} pc532macha "$(tdir_pc532macha)"
+epdp11.c: $(srcdir)/emulparams/pdp11.sh \
+  $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/aout.sc ${GEN_DEPENDS}
+       ${GENSCRIPTS} pdp11 "$(tdir_pdp11)"
 epjelf.c: $(srcdir)/emulparams/pjelf.sh \
   $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
        ${GENSCRIPTS} pjelf "$(tdir_pjelf)"
index 92b735f110493640f1529acc5a063f00d9c29458..ea96ab8faa93d1e288730e67e89a1cb70c8ea8d2 100644 (file)
@@ -286,6 +286,7 @@ ns32k-pc532-netbsd* | ns32k-pc532-lites*) targ_emul=ns32knbsd ;;
 powerpc-*-linux-gnu*)  targ_emul=elf32ppclinux;
                        targ_extra_emuls="elf32ppc elf32ppcsim";
                        targ_extra_libpath=elf32ppc ;;
+pdp11-*-*)             targ_emul=pdp11 ;;
 pjl*-*-*)              targ_emul=pjlelf ; targ_extra_emuls="elf_i386" ;;
 pj*-*-*)               targ_emul=pjelf ;;
 powerpc-*-elf* | powerpc-*-eabi* | powerpc-*-sysv* \
diff --git a/ld/emulparams/pdp11.sh b/ld/emulparams/pdp11.sh
new file mode 100644 (file)
index 0000000..aaf955a
--- /dev/null
@@ -0,0 +1,5 @@
+SCRIPT_NAME=aout
+OUTPUT_FORMAT="a.out-pdp11"
+TEXT_START_ADDR=0
+TARGET_PAGE_SIZE=256
+ARCH=pdp11
index bdd5798e2e00082580d4b3da6c0d1082b56c9cee..7d84a72aab7f48911f9e3fe372f8c2ff268cb45c 100644 (file)
@@ -6,7 +6,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
-"POT-Creation-Date: 2001-02-06 18:03-0800\n"
+"POT-Creation-Date: 2001-02-18 11:47-0800\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -373,31 +373,31 @@ msgstr ""
 msgid "%F%S: undefined symbol `%s' referenced in expression\n"
 msgstr ""
 
-#: ldexp.c:600
+#: ldexp.c:601
 msgid "%F%S can not PROVIDE assignment to location counter\n"
 msgstr ""
 
-#: ldexp.c:610
+#: ldexp.c:611
 msgid "%F%S invalid assignment to location counter\n"
 msgstr ""
 
-#: ldexp.c:614
+#: ldexp.c:615
 msgid "%F%S assignment to location counter invalid outside of SECTION\n"
 msgstr ""
 
-#: ldexp.c:624
+#: ldexp.c:625
 msgid "%F%S cannot move location counter backwards (from %V to %V)\n"
 msgstr ""
 
-#: ldexp.c:652
+#: ldexp.c:653
 msgid "%P%F:%s: hash creation failed\n"
 msgstr ""
 
-#: ldexp.c:951
+#: ldexp.c:955
 msgid "%F%S nonconstant expression for %s\n"
 msgstr ""
 
-#: ldexp.c:984
+#: ldexp.c:988
 msgid "%F%S non constant expression for %s\n"
 msgstr ""
 
index 1dc9b40d760dcde3379edb36865950a8cf753d5f..3a15815ef02b6f7737f3d9b8336f61a0497f349c 100644 (file)
@@ -1,3 +1,11 @@
+2001-02-18  lars brinkhoff  <lars@nocrew.org>
+
+        * Makefile.am: Add PDP-11 target.
+        * configure.in: Likewise.
+        * disassemble.c: Likewise.
+        * pdp11-dis.c: New file.
+        * pdp11-opc.c: New file.
+
 2001-02-14  Jim Wilson  <wilson@redhat.com>
 
        * ia64-ic.tbl: Update from Intel.  Add setf to fr-writers.
index 664644eb490661868ec2f434d6cf154e1912c24d..42ff0c3ababacc7c228cfb59098e3de0ffc12950 100644 (file)
@@ -97,6 +97,8 @@ CFILES = \
        m10300-dis.c \
        m10300-opc.c \
        ns32k-dis.c \
+       pdp11-dis.c \
+       pdp11-opc.c \
        pj-dis.c \
        pj-opc.c \
        ppc-dis.c \
@@ -170,11 +172,13 @@ ALL_MACHINES = \
        mips-dis.lo \
        mips-opc.lo \
        mips16-opc.lo \
+       ns32k-dis.lo \
+       pdp11-dis.lo \
+       pdp11-opc.lo \
        pj-dis.lo \
        pj-opc.lo \
        ppc-dis.lo \
        ppc-opc.lo \
-       ns32k-dis.lo \
        s390-dis.lo \
        s390-opc.lo \
        sh-dis.lo \
@@ -486,6 +490,8 @@ m10300-opc.lo: m10300-opc.c sysdep.h config.h $(INCDIR)/ansidecl.h \
 ns32k-dis.lo: ns32k-dis.c $(BFD_H) $(INCDIR)/ansidecl.h \
   sysdep.h config.h $(INCDIR)/dis-asm.h $(INCDIR)/opcode/ns32k.h \
   opintl.h
+pdp11-dis.lo: pdp11-dis.c $(INCDIR)/dis-asm.h $(INCDIR)/opcode/pdp11.h
+pdp11-opc.lo: pdp11-opc.c $(INCDIR)/opcode/pdp11.h
 pj-dis.lo: pj-dis.c sysdep.h config.h $(INCDIR)/ansidecl.h \
   $(INCDIR)/opcode/pj.h $(INCDIR)/dis-asm.h $(BFD_H)
 pj-opc.lo: pj-opc.c sysdep.h config.h $(INCDIR)/ansidecl.h \
index 3d1a759efa2e824f8eeb1f3487dce78197009cea..36c43e45bc5f6eb5a66ab18b54bc327d22f38577 100644 (file)
@@ -208,6 +208,8 @@ CFILES = \
        m10300-dis.c \
        m10300-opc.c \
        ns32k-dis.c \
+       pdp11-dis.c \
+       pdp11-opc.c \
        pj-dis.c \
        pj-opc.c \
        ppc-dis.c \
@@ -282,11 +284,13 @@ ALL_MACHINES = \
        mips-dis.lo \
        mips-opc.lo \
        mips16-opc.lo \
+       ns32k-dis.lo \
+       pdp11-dis.lo \
+       pdp11-opc.lo \
        pj-dis.lo \
        pj-opc.lo \
        ppc-dis.lo \
        ppc-opc.lo \
-       ns32k-dis.lo \
        s390-dis.lo \
        s390-opc.lo \
        sh-dis.lo \
@@ -370,7 +374,7 @@ acinclude.m4 aclocal.m4 config.in configure configure.in
 
 DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
 
-TAR = tar
+TAR = gtar
 GZIP_ENV = --best
 SOURCES = libopcodes.a.c $(libopcodes_la_SOURCES)
 OBJECTS = libopcodes.a.$(OBJEXT) $(libopcodes_la_OBJECTS)
@@ -996,6 +1000,8 @@ m10300-opc.lo: m10300-opc.c sysdep.h config.h $(INCDIR)/ansidecl.h \
 ns32k-dis.lo: ns32k-dis.c $(BFD_H) $(INCDIR)/ansidecl.h \
   sysdep.h config.h $(INCDIR)/dis-asm.h $(INCDIR)/opcode/ns32k.h \
   opintl.h
+pdp11-dis.lo: pdp11-dis.c $(INCDIR)/dis-asm.h $(INCDIR)/opcode/pdp11.h
+pdp11-opc.lo: pdp11-opc.c $(INCDIR)/opcode/pdp11.h
 pj-dis.lo: pj-dis.c sysdep.h config.h $(INCDIR)/ansidecl.h \
   $(INCDIR)/opcode/pj.h $(INCDIR)/dis-asm.h $(BFD_H)
 pj-opc.lo: pj-opc.c sysdep.h config.h $(INCDIR)/ansidecl.h \
index 7d63895bf2bc7b59202a11566e32761d495e355b..6301ad653ff7f6500844d6c6b1f418eed8faab54 100755 (executable)
@@ -4542,6 +4542,7 @@ if test x${all_targets} = xfalse ; then
        bfd_mn10200_arch)       ta="$ta m10200-dis.lo m10200-opc.lo" ;;
        bfd_mn10300_arch)       ta="$ta m10300-dis.lo m10300-opc.lo" ;;
        bfd_ns32k_arch)         ta="$ta ns32k-dis.lo" ;;
+       bfd_pdp11_arch)         ta="$ta pdp11-dis.lo pdp11-opc.lo" ;;
        bfd_pj_arch)            ta="$ta pj-dis.lo pj-opc.lo" ;;
        bfd_powerpc_arch)       ta="$ta ppc-dis.lo ppc-opc.lo" ;;
        bfd_pyramid_arch)       ;;
index 34b947ae618bd51875e44f9e27c826eec73be073..f8030d91c3db28385fc11db3fea4473a2e18f4a8 100644 (file)
@@ -196,6 +196,7 @@ if test x${all_targets} = xfalse ; then
        bfd_mn10200_arch)       ta="$ta m10200-dis.lo m10200-opc.lo" ;;
        bfd_mn10300_arch)       ta="$ta m10300-dis.lo m10300-opc.lo" ;;
        bfd_ns32k_arch)         ta="$ta ns32k-dis.lo" ;;
+       bfd_pdp11_arch)         ta="$ta pdp11-dis.lo pdp11-opc.lo" ;;
        bfd_pj_arch)            ta="$ta pj-dis.lo pj-opc.lo" ;;
        bfd_powerpc_arch)       ta="$ta ppc-dis.lo ppc-opc.lo" ;;
        bfd_pyramid_arch)       ;;
index ce3b6ad89d034cd02b0c4e3641e4765aa6b9706b..b5a1fcaed9544fef271266367deedbe2b280c9a8 100644 (file)
@@ -47,6 +47,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 #define ARCH_mn10200
 #define ARCH_mn10300
 #define ARCH_ns32k
+#define ARCH_pdp11
 #define ARCH_pj
 #define ARCH_powerpc
 #define ARCH_rs6000
@@ -225,6 +226,11 @@ disassembler (abfd)
       disassemble = print_insn_mn10300;
       break;
 #endif
+#ifdef ARCH_pdp11
+    case bfd_arch_pdp11:
+      disassemble = print_insn_pdp11;
+      break;
+#endif
 #ifdef ARCH_pj
     case bfd_arch_pj:
       disassemble = print_insn_pj;
diff --git a/opcodes/pdp11-dis.c b/opcodes/pdp11-dis.c
new file mode 100644 (file)
index 0000000..e13c7aa
--- /dev/null
@@ -0,0 +1,323 @@
+/* Print DEC PDP-11 instructions.
+   Copyright 2001 Free Software Foundation, Inc.
+
+This file is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+
+#include "dis-asm.h"
+#include "opcode/pdp11.h"
+
+#define AFTER_INSTRUCTION      "\t"
+#define OPERAND_SEPARATOR      ", "
+
+#define JUMP   0x1000  /* flag that this operand is used in a jump */
+
+#define FPRINTF        (*info->fprintf_func)
+#define F      info->stream
+
+/* sign-extend a 16-bit number in an int */
+#define SIGN_BITS      (8 * sizeof (int) - 16)
+#define sign_extend(x) (((x) << SIGN_BITS) >> SIGN_BITS)
+
+static int read_word PARAMS ((bfd_vma memaddr, int *word,
+                             disassemble_info *info));
+static void print_signed_octal PARAMS ((int n, disassemble_info *info));
+static void print_reg PARAMS ((int reg, disassemble_info *info));
+static void print_freg PARAMS ((int freg, disassemble_info *info));
+static int print_operand PARAMS ((bfd_vma *memaddr, int code,
+                                 disassemble_info *info));
+int print_insn_pdp11 PARAMS ((bfd_vma memaddr, disassemble_info *info));
+
+static int
+read_word (memaddr, word, info)
+     bfd_vma memaddr;
+     int *word;
+     disassemble_info *info;
+{
+  int status;
+  bfd_byte x[2];
+
+  status = (*info->read_memory_func) (memaddr, x, 2, info);
+  if (status != 0)
+    return -1;
+
+  *word = x[1] << 8 | x[0];
+  return 0;
+}
+
+static void
+print_signed_octal (n, info)
+     int n;
+     disassemble_info *info;
+{
+  if (n < 0)
+    FPRINTF (F, "-%o", -n);
+  else
+    FPRINTF (F, "%o", n);
+}
+
+static void
+print_reg (reg, info)
+     int reg;
+     disassemble_info *info;
+{
+  /* mask off the addressing mode, if any */
+  reg &= 7;
+
+  switch (reg)
+    {
+    case 0: case 1: case 2: case 3: case 4: case 5:
+               FPRINTF (F, "r%d", reg); break;
+    case 6:    FPRINTF (F, "sp"); break;
+    case 7:    FPRINTF (F, "pc"); break;
+    default:   /* error */
+    }
+}
+
+static void
+print_freg (freg, info)
+     int freg;
+     disassemble_info *info;
+{
+  FPRINTF (F, "fr%d", freg);
+}
+
+static int
+print_operand (memaddr, code, info)
+     bfd_vma *memaddr;
+     int code;
+     disassemble_info *info;
+{
+  int mode = (code >> 3) & 7;
+  int reg = code & 7;
+  int disp;
+
+  switch (mode)
+    {
+    case 0:
+      print_reg (reg, info);
+      break;
+    case 1:
+      FPRINTF (F, "(");
+      print_reg (reg, info);
+      FPRINTF (F, ")");
+      break;
+    case 2:
+      if (reg == 7)
+       {
+         int data;
+         if (read_word (*memaddr, &data, info) < 0)
+           return -1;
+         FPRINTF (F, "$");
+         print_signed_octal (sign_extend (data), info);
+         *memaddr += 2;
+       }
+      else
+       {
+         FPRINTF (F, "(");
+         print_reg (reg, info);
+         FPRINTF (F, ")+");
+       }
+       break;
+    case 3:
+      if (reg == 7)
+       {
+         int address;
+         if (read_word (*memaddr, &address, info) < 0)
+           return -1;
+         FPRINTF (F, "*$%o", address);
+         *memaddr += 2;
+       }
+      else
+       {
+         FPRINTF (F, "*(");
+         print_reg (reg, info);
+         FPRINTF (F, ")+");
+       }
+       break;
+    case 4:
+      FPRINTF (F, "-(");
+      print_reg (reg, info);
+      FPRINTF (F, ")");
+      break;
+    case 5:
+      FPRINTF (F, "*-(");
+      print_reg (reg, info);
+      FPRINTF (F, ")");
+      break;
+    case 6:
+    case 7:
+      if (read_word (*memaddr, &disp, info) < 0)
+       return -1;
+      *memaddr += 2;
+      if (reg == 7)
+       {
+         bfd_vma address = *memaddr + sign_extend (disp);
+         if (!(code & JUMP))
+           FPRINTF (F, "*$");
+         (*info->print_address_func) (address, info);
+       }
+      else
+       {
+         if (mode == 7)
+           FPRINTF (F, "*");
+         print_signed_octal (sign_extend (disp), info);
+         FPRINTF (F, "(");
+         print_reg (reg, info);
+         FPRINTF (F, ")");
+       }
+      break;
+    }
+
+  return 0;
+}
+
+/* Print the PDP-11 instruction at address MEMADDR in debugged memory,
+   on INFO->STREAM.  Returns length of the instruction, in bytes.  */
+
+int
+print_insn_pdp11 (memaddr, info)
+     bfd_vma memaddr;
+     disassemble_info *info;
+{
+  bfd_vma start_memaddr = memaddr;
+  int opcode;
+  int src, dst;
+  int i;
+
+  info->bytes_per_line = 6;
+  info->bytes_per_chunk = 2;
+  info->display_endian = BFD_ENDIAN_LITTLE;
+
+  if (read_word (memaddr, &opcode, info) != 0)
+    return -1;
+  memaddr += 2;
+
+  src = (opcode >> 6) & 0x3f;
+  dst = opcode & 0x3f;
+
+  for (i = 0; i < pdp11_num_opcodes; i++)
+    {
+#define OP pdp11_opcodes[i]
+      if ((opcode & OP.mask) == OP.opcode)
+       switch (OP.type)
+         {
+         case PDP11_OPCODE_NO_OPS:
+           FPRINTF (F, OP.name);
+           break;
+         case PDP11_OPCODE_REG:
+           FPRINTF (F, OP.name);
+           FPRINTF (F, AFTER_INSTRUCTION);
+           print_reg (dst, info);
+           break;
+         case PDP11_OPCODE_OP:
+           FPRINTF (F, OP.name);
+           FPRINTF (F, AFTER_INSTRUCTION);
+           if (strcmp (OP.name, "jmp") == 0)
+             dst |= JUMP;
+           if (print_operand (&memaddr, dst, info) < 0)
+             return -1;
+           break;
+         case PDP11_OPCODE_REG_OP:
+           FPRINTF (F, OP.name);
+           FPRINTF (F, AFTER_INSTRUCTION);
+           print_reg (src, info);
+           FPRINTF (F, OPERAND_SEPARATOR);
+           if (strcmp (OP.name, "jsr") == 0)
+             dst |= JUMP;
+           if (print_operand (&memaddr, dst, info) < 0)
+             return -1;
+           break;
+         case PDP11_OPCODE_REG_OP_REV:
+           FPRINTF (F, OP.name);
+           FPRINTF (F, AFTER_INSTRUCTION);
+           if (print_operand (&memaddr, dst, info) < 0)
+             return -1;
+           FPRINTF (F, OPERAND_SEPARATOR);
+           print_reg (src, info);
+           break;
+         case PDP11_OPCODE_AC_OP:
+           {
+             int ac = (opcode & 0xe0) >> 6;
+             FPRINTF (F, OP.name);
+             FPRINTF (F, AFTER_INSTRUCTION);
+             print_freg (ac, info);
+             FPRINTF (F, OPERAND_SEPARATOR);
+             if (print_operand (&memaddr, dst, info) < 0)
+               return -1;
+             break;
+           }
+         case PDP11_OPCODE_OP_OP:
+           FPRINTF (F, OP.name);
+           FPRINTF (F, AFTER_INSTRUCTION);
+           if (print_operand (&memaddr, src, info) < 0)
+             return -1;
+           FPRINTF (F, OPERAND_SEPARATOR);
+           if (print_operand (&memaddr, dst, info) < 0)
+             return -1;
+           break;
+         case PDP11_OPCODE_DISPL:
+           {
+             int displ = (opcode & 0xff) << 8;
+             bfd_vma address = memaddr + (sign_extend (displ) >> 7);
+             FPRINTF (F, OP.name);
+             FPRINTF (F, AFTER_INSTRUCTION);
+             (*info->print_address_func) (address, info);
+             break;
+           }
+         case PDP11_OPCODE_REG_DISPL:
+           {
+             int displ = (opcode & 0x3f) << 10;
+             bfd_vma address = memaddr + (sign_extend (displ) >> 9);
+             FPRINTF (F, OP.name);
+             FPRINTF (F, AFTER_INSTRUCTION);
+             print_reg (src, info);
+             FPRINTF (F, OPERAND_SEPARATOR);
+             (*info->print_address_func) (address, info);
+             break;
+           }
+         case PDP11_OPCODE_IMM8:
+           {
+             int code = opcode & 0xff;
+             FPRINTF (F, OP.name);
+             FPRINTF (F, AFTER_INSTRUCTION);
+             FPRINTF (F, "%o", code);
+             break;
+           }
+         case PDP11_OPCODE_IMM6:
+           {
+             int code = opcode & 0x3f;
+             FPRINTF (F, OP.name);
+             FPRINTF (F, AFTER_INSTRUCTION);
+             FPRINTF (F, "%o", code);
+             break;
+           }
+         case PDP11_OPCODE_IMM3:
+           {
+             int code = opcode & 7;
+             FPRINTF (F, OP.name);
+             FPRINTF (F, AFTER_INSTRUCTION);
+             FPRINTF (F, "%o", code);
+             break;
+           }
+         default:
+           /* TODO: is this a proper way of signalling an error? */
+           FPRINTF (F, "<internal error: unrecognized instruction type>");
+           return -1;
+         }
+#undef OP
+    }
+
+  return memaddr - start_memaddr;
+}
diff --git a/opcodes/pdp11-opc.c b/opcodes/pdp11-opc.c
new file mode 100644 (file)
index 0000000..3517dee
--- /dev/null
@@ -0,0 +1,245 @@
+/* Opcode table for PDP-11.
+   Copyright 2001 Free Software Foundation, Inc.
+
+This file is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+
+#include "opcode/pdp11.h"
+
+const struct pdp11_opcode pdp11_opcodes[] =
+{
+  /* name,     pattern, mask,  opcode type,            insn type,    alias */
+  { "halt",    0x0000, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_BASIC },
+  { "wait",    0x0001, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_BASIC },
+  { "rti",     0x0002, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_BASIC },
+  { "bpt",     0x0003, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_BASIC },
+  { "iot",     0x0004, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_BASIC },
+  { "reset",   0x0005, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_BASIC },
+  { "rtt",     0x0006, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_LEIS },
+  { "mfpt",    0x0007, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_MFPT },
+  { "jmp",     0x0040, 0xffc0, PDP11_OPCODE_OP,        PDP11_BASIC },
+  { "rts",     0x0080, 0xfff8, PDP11_OPCODE_REG,       PDP11_BASIC },
+  { "",                0x0088, 0xfff8, PDP11_OPCODE_ILLEGAL,   PDP11_NONE },
+  { "",                0x0090, 0xfff8, PDP11_OPCODE_ILLEGAL,   PDP11_NONE },
+  { "spl",     0x0098, 0xfff8, PDP11_OPCODE_IMM3,      PDP11_SPL },
+  { "nop",     0x00a0, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_BASIC },
+  { "clc",     0x00a1, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_BASIC },
+  { "clv",     0x00a2, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_BASIC },
+  { "cl_3",    0x00a3, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_BASIC },
+  { "clz",     0x00a4, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_BASIC },
+  { "cl_5",    0x00a5, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_BASIC },
+  { "cl_6",    0x00a6, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_BASIC },
+  { "cl_7",    0x00a7, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_BASIC },
+  { "cln",     0x00a8, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_BASIC },
+  { "cl_9",    0x00a9, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_BASIC },
+  { "cl_a",    0x00aa, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_BASIC },
+  { "cl_b",    0x00ab, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_BASIC },
+  { "cl_c",    0x00ac, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_BASIC },
+  { "cl_d",    0x00ad, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_BASIC },
+  { "cl_e",    0x00ae, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_BASIC },
+  { "ccc",     0x00af, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_BASIC },
+  { "se_0",    0x00b0, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_BASIC },
+  { "sec",     0x00a1, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_BASIC },
+  { "sev",     0x00b2, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_BASIC },
+  { "se_3",    0x00b3, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_BASIC },
+  { "sez",     0x00b4, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_BASIC },
+  { "se_5",    0x00b5, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_BASIC },
+  { "se_6",    0x00b6, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_BASIC },
+  { "se_7",    0x00b7, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_BASIC },
+  { "sen",     0x00b8, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_BASIC },
+  { "se_9",    0x00b9, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_BASIC },
+  { "se_a",    0x00ba, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_BASIC },
+  { "se_b",    0x00bb, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_BASIC },
+  { "se_c",    0x00bc, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_BASIC },
+  { "se_d",    0x00bd, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_BASIC },
+  { "se_e",    0x00be, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_BASIC },
+  { "scc",     0x00bf, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_BASIC },
+  { "swab",    0x00c0, 0xffc0, PDP11_OPCODE_OP,        PDP11_BASIC },
+  { "br",      0x0100, 0xff00, PDP11_OPCODE_DISPL,     PDP11_BASIC },
+  { "bne",     0x0200, 0xff00, PDP11_OPCODE_DISPL,     PDP11_BASIC },
+  { "beq",     0x0300, 0xff00, PDP11_OPCODE_DISPL,     PDP11_BASIC },
+  { "bge",     0x0400, 0xff00, PDP11_OPCODE_DISPL,     PDP11_BASIC },
+  { "blt",     0x0500, 0xff00, PDP11_OPCODE_DISPL,     PDP11_BASIC },
+  { "bgt",     0x0600, 0xff00, PDP11_OPCODE_DISPL,     PDP11_BASIC },
+  { "ble",     0x0700, 0xff00, PDP11_OPCODE_DISPL,     PDP11_BASIC },
+  { "jsr",     0x0800, 0xfe00, PDP11_OPCODE_REG_OP,    PDP11_BASIC },
+  { "clr",     0x0a00, 0xffc0, PDP11_OPCODE_OP,        PDP11_BASIC },
+  { "com",     0x0a40, 0xffc0, PDP11_OPCODE_OP,        PDP11_BASIC },
+  { "inc",     0x0a80, 0xffc0, PDP11_OPCODE_OP,        PDP11_BASIC },
+  { "dec",     0x0ac0, 0xffc0, PDP11_OPCODE_OP,        PDP11_BASIC },
+  { "neg",     0x0b00, 0xffc0, PDP11_OPCODE_OP,        PDP11_BASIC },
+  { "adc",     0x0b40, 0xffc0, PDP11_OPCODE_OP,        PDP11_BASIC },
+  { "sbc",     0x0b80, 0xffc0, PDP11_OPCODE_OP,        PDP11_BASIC },
+  { "tst",     0x0bc0, 0xffc0, PDP11_OPCODE_OP,        PDP11_BASIC },
+  { "ror",     0x0c00, 0xffc0, PDP11_OPCODE_OP,        PDP11_BASIC },
+  { "rol",     0x0c40, 0xffc0, PDP11_OPCODE_OP,        PDP11_BASIC },
+  { "asr",     0x0c80, 0xffc0, PDP11_OPCODE_OP,        PDP11_BASIC },
+  { "asl",     0x0cc0, 0xffc0, PDP11_OPCODE_OP,        PDP11_BASIC },
+  { "mark",    0x0d00, 0xffc0, PDP11_OPCODE_OP,        PDP11_LEIS },
+  { "mfpi",    0x0d40, 0xffc0, PDP11_OPCODE_OP,        PDP11_BASIC },
+  { "mtpi",    0x0d80, 0xffc0, PDP11_OPCODE_OP,        PDP11_BASIC },
+  { "sxt",     0x0dc0, 0xffc0, PDP11_OPCODE_OP,        PDP11_LEIS },
+  { "csm",     0x0e00, 0xffc0, PDP11_OPCODE_OP,        PDP11_CSM },
+  { "tstset",  0x0e40, 0xffc0, PDP11_OPCODE_OP,        PDP11_MPROC },
+  { "wrtlck",  0x0e80, 0xffc0, PDP11_OPCODE_OP,        PDP11_MPROC },
+/*{ "",                0x0ec0, 0xffe0, PDP11_OPCODE_ILLEGAL,   PDP11_NONE },*/
+  { "mov",     0x1000, 0xf000, PDP11_OPCODE_OP_OP,     PDP11_BASIC },
+  { "cmp",     0x2000, 0xf000, PDP11_OPCODE_OP_OP,     PDP11_BASIC },
+  { "bit",     0x3000, 0xf000, PDP11_OPCODE_OP_OP,     PDP11_BASIC },
+  { "bic",     0x4000, 0xf000, PDP11_OPCODE_OP_OP,     PDP11_BASIC },
+  { "bis",     0x5000, 0xf000, PDP11_OPCODE_OP_OP,     PDP11_BASIC },
+  { "add",     0x6000, 0xf000, PDP11_OPCODE_OP_OP,     PDP11_BASIC },
+  { "mul",     0x7000, 0xfe00, PDP11_OPCODE_REG_OP_REV,PDP11_EIS },
+  { "div",     0x7200, 0xfe00, PDP11_OPCODE_REG_OP_REV,PDP11_EIS },
+  { "ash",     0x7400, 0xfe00, PDP11_OPCODE_REG_OP_REV,PDP11_EIS },
+  { "ashc",    0x7600, 0xfe00, PDP11_OPCODE_REG_OP_REV,PDP11_EIS },
+  { "xor",     0x7800, 0xfe00, PDP11_OPCODE_REG_OP,    PDP11_LEIS },
+  { "fadd",    0x7a00, 0xfff8, PDP11_OPCODE_REG,       PDP11_FIS },
+  { "fsub",    0x7a08, 0xfff8, PDP11_OPCODE_REG,       PDP11_FIS },
+  { "fmul",    0x7a10, 0xfff8, PDP11_OPCODE_REG,       PDP11_FIS },
+  { "fdiv",    0x7a18, 0xfff8, PDP11_OPCODE_REG,       PDP11_FIS },
+/*{ "",                0x7a20, 0xffe0, PDP11_OPCODE_ILLEGAL,   PDP11_NONE },*/
+/*{ "",                0x7a40, 0xffc0, PDP11_OPCODE_ILLEGAL,   PDP11_NONE },*/
+/*{ "",                0x7a80, 0xff80, PDP11_OPCODE_ILLEGAL,   PDP11_NONE },*/
+/*{ "",                0x7b00, 0xffe0, PDP11_OPCODE_ILLEGAL,   PDP11_NONE },*/
+  { "l2dr",    0x7c10, 0xfff8, PDP11_OPCODE_REG,       PDP11_CIS },/*l2d*/
+  { "movc",    0x7c18, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_CIS },
+  { "movrc",   0x7c19, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_CIS },
+  { "movtc",   0x7c1a, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_CIS },
+  { "locc",    0x7c20, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_CIS },
+  { "skpc",    0x7c21, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_CIS },
+  { "scanc",   0x7c22, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_CIS },
+  { "spanc",   0x7c23, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_CIS },
+  { "cmpc",    0x7c24, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_CIS },
+  { "matc",    0x7c25, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_CIS },
+  { "addn",    0x7c28, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_CIS },
+  { "subn",    0x7c29, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_CIS },
+  { "cmpn",    0x7c2a, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_CIS },
+  { "cvtnl",   0x7c2b, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_CIS },
+  { "cvtpn",   0x7c2c, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_CIS },
+  { "cvtnp",   0x7c2d, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_CIS },
+  { "ashn",    0x7c2e, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_CIS },
+  { "cvtln",   0x7c2f, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_CIS },
+  { "l3dr",    0x7c30, 0xfff8, PDP11_OPCODE_REG,       PDP11_CIS },/*l3d*/
+  { "addp",    0x7c38, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_CIS },
+  { "subp",    0x7c39, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_CIS },
+  { "cmpp",    0x7c3a, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_CIS },
+  { "cvtpl",   0x7c3b, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_CIS },
+  { "mulp",    0x7c3c, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_CIS },
+  { "divp",    0x7c3d, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_CIS },
+  { "ashp",    0x7c3e, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_CIS },
+  { "cvtlp",   0x7c3f, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_CIS },
+  { "movci",   0x7c58, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_CIS },
+  { "movrci",  0x7c59, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_CIS },
+  { "movtci",  0x7c5a, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_CIS },
+  { "locci",   0x7c60, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_CIS },
+  { "skpci",   0x7c61, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_CIS },
+  { "scanci",  0x7c62, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_CIS },
+  { "spanci",  0x7c63, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_CIS },
+  { "cmpci",   0x7c64, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_CIS },
+  { "matci",   0x7c65, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_CIS },
+  { "addni",   0x7c68, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_CIS },
+  { "subni",   0x7c69, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_CIS },
+  { "cmpni",   0x7c6a, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_CIS },
+  { "cvtnli",  0x7c6b, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_CIS },
+  { "cvtpni",  0x7c6c, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_CIS },
+  { "cvtnpi",  0x7c6d, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_CIS },
+  { "ashni",   0x7c6e, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_CIS },
+  { "cvtlni",  0x7c6f, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_CIS },
+  { "addpi",   0x7c78, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_CIS },
+  { "subpi",   0x7c79, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_CIS },
+  { "cmppi",   0x7c7a, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_CIS },
+  { "cvtpli",  0x7c7b, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_CIS },
+  { "mulpi",   0x7c7c, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_CIS },
+  { "divpi",   0x7c7d, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_CIS },
+  { "ashpi",   0x7c7e, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_CIS },
+  { "cvtlpi",  0x7c7f, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_CIS },
+  { "med",     0x7d80, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_UCODE },
+  { "xfc",     0x7dc0, 0xffc0, PDP11_OPCODE_IMM6,      PDP11_UCODE },
+  { "sob",     0x7e00, 0xfe00, PDP11_OPCODE_REG_DISPL, PDP11_LEIS },
+  { "bpl",     0x8000, 0xff00, PDP11_OPCODE_DISPL,     PDP11_BASIC },
+  { "bmi",     0x8100, 0xff00, PDP11_OPCODE_DISPL,     PDP11_BASIC },
+  { "bhi",     0x8200, 0xff00, PDP11_OPCODE_DISPL,     PDP11_BASIC },
+  { "blos",    0x8300, 0xff00, PDP11_OPCODE_DISPL,     PDP11_BASIC },
+  { "bvc",     0x8400, 0xff00, PDP11_OPCODE_DISPL,     PDP11_BASIC },
+  { "bvs",     0x8500, 0xff00, PDP11_OPCODE_DISPL,     PDP11_BASIC },
+  { "bcc",     0x8600, 0xff00, PDP11_OPCODE_DISPL,     PDP11_BASIC },/*bhis*/
+  { "bcs",     0x8700, 0xff00, PDP11_OPCODE_DISPL,     PDP11_BASIC },/*blo*/
+  { "emt",     0x8800, 0xff00, PDP11_OPCODE_IMM8,      PDP11_BASIC },
+  { "sys",     0x8900, 0xff00, PDP11_OPCODE_IMM8,      PDP11_BASIC },/*trap*/
+  { "clrb",    0x8a00, 0xffc0, PDP11_OPCODE_OP,        PDP11_BASIC },
+  { "comb",    0x8a40, 0xffc0, PDP11_OPCODE_OP,        PDP11_BASIC },
+  { "incb",    0x8a80, 0xffc0, PDP11_OPCODE_OP,        PDP11_BASIC },
+  { "decb",    0x8ac0, 0xffc0, PDP11_OPCODE_OP,        PDP11_BASIC },
+  { "negb",    0x8b00, 0xffc0, PDP11_OPCODE_OP,        PDP11_BASIC },
+  { "adcb",    0x8b40, 0xffc0, PDP11_OPCODE_OP,        PDP11_BASIC },
+  { "sbcb",    0x8b80, 0xffc0, PDP11_OPCODE_OP,        PDP11_BASIC },
+  { "tstb",    0x8bc0, 0xffc0, PDP11_OPCODE_OP,        PDP11_BASIC },
+  { "rorb",    0x8c00, 0xffc0, PDP11_OPCODE_OP,        PDP11_BASIC },
+  { "rolb",    0x8c40, 0xffc0, PDP11_OPCODE_OP,        PDP11_BASIC },
+  { "asrb",    0x8c80, 0xffc0, PDP11_OPCODE_OP,        PDP11_BASIC },
+  { "aslb",    0x8cc0, 0xffc0, PDP11_OPCODE_OP,        PDP11_BASIC },
+  { "mtps",    0x8d00, 0xffc0, PDP11_OPCODE_OP,        PDP11_MXPS },
+  { "mfpd",    0x8d40, 0xffc0, PDP11_OPCODE_OP,        PDP11_BASIC },
+  { "mtpd",    0x8d80, 0xffc0, PDP11_OPCODE_OP,        PDP11_BASIC },
+  { "mfps",    0x8dc0, 0xffc0, PDP11_OPCODE_OP,        PDP11_MXPS },
+  { "movb",    0x9000, 0xf000, PDP11_OPCODE_OP_OP,     PDP11_BASIC },
+  { "cmpb",    0xa000, 0xf000, PDP11_OPCODE_OP_OP,     PDP11_BASIC },
+  { "bitb",    0xb000, 0xf000, PDP11_OPCODE_OP_OP,     PDP11_BASIC },
+  { "bicb",    0xc000, 0xf000, PDP11_OPCODE_OP_OP,     PDP11_BASIC },
+  { "bisb",    0xd000, 0xf000, PDP11_OPCODE_OP_OP,     PDP11_BASIC },
+  { "sub",     0xe000, 0xf000, PDP11_OPCODE_OP_OP,     PDP11_BASIC },
+  { "cfcc",    0xf000, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_FPP },
+  { "setf",    0xf001, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_FPP },
+  { "seti",    0xf002, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_FPP },
+  { "ldub",    0xf003, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_UCODE },
+  /* fpp trap  0xf004..0xf008 */
+  { "setd",    0xf009, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_FPP },
+  { "setl",    0xf00a, 0xffff, PDP11_OPCODE_NO_OPS,    PDP11_FPP },
+  /* fpp trap  0xf00b..0xf03f */
+  { "ldfps",   0xf040, 0xffc0, PDP11_OPCODE_OP,        PDP11_FPP },
+  { "stfps",   0xf080, 0xffc0, PDP11_OPCODE_OP,        PDP11_FPP },
+  { "stst",    0xf0c0, 0xffc0, PDP11_OPCODE_OP,        PDP11_FPP },
+  { "clrf",    0xf100, 0xffc0, PDP11_OPCODE_OP,        PDP11_FPP },
+  { "tstf",    0xf140, 0xffc0, PDP11_OPCODE_OP,        PDP11_FPP },
+  { "absf",    0xf180, 0xffc0, PDP11_OPCODE_OP,        PDP11_FPP },
+  { "negf",    0xf1c0, 0xffc0, PDP11_OPCODE_OP,        PDP11_FPP },
+  { "mulf",    0xf200, 0xff00, PDP11_OPCODE_AC_OP,     PDP11_FPP },
+  { "modf",    0xf300, 0xff00, PDP11_OPCODE_AC_OP,     PDP11_FPP },
+  { "addf",    0xf400, 0xff00, PDP11_OPCODE_AC_OP,     PDP11_FPP },
+  { "ldf",     0xf500, 0xff00, PDP11_OPCODE_AC_OP,     PDP11_FPP },/*movif*/
+  { "subf",    0xf600, 0xff00, PDP11_OPCODE_AC_OP,     PDP11_FPP },
+  { "cmpf",    0xf700, 0xff00, PDP11_OPCODE_AC_OP,     PDP11_FPP },
+  { "stf",     0xf800, 0xff00, PDP11_OPCODE_AC_OP,     PDP11_FPP },/*movfi*/
+  { "divf",    0xf900, 0xff00, PDP11_OPCODE_AC_OP,     PDP11_FPP },
+  { "stexp",   0xfa00, 0xff00, PDP11_OPCODE_AC_OP,     PDP11_FPP },
+  { "stcfi",   0xfb00, 0xff00, PDP11_OPCODE_AC_OP,     PDP11_FPP },
+  { "stcff",   0xfc00, 0xff00, PDP11_OPCODE_AC_OP,     PDP11_FPP },/* ? */
+  { "ldexp",   0xfd00, 0xff00, PDP11_OPCODE_AC_OP,     PDP11_FPP },
+  { "ldcif",   0xfe00, 0xff00, PDP11_OPCODE_AC_OP,     PDP11_FPP },
+  { "ldcff",   0xff00, 0xff00, PDP11_OPCODE_AC_OP,     PDP11_FPP },/* ? */
+};
+
+const struct pdp11_opcode pdp11_aliases[] =
+{
+  /* name,     pattern, mask,  opcode type,            insn type */
+  { "l2d",     0x7c10, 0xfff8, PDP11_OPCODE_REG,       PDP11_CIS },
+  { "l3d",     0x7c30, 0xfff8, PDP11_OPCODE_REG,       PDP11_CIS },
+  { "bhis",    0x8600, 0xff00, PDP11_OPCODE_DISPL,     PDP11_BASIC },
+  { "blo",     0x8700, 0xff00, PDP11_OPCODE_DISPL,     PDP11_BASIC },
+  { "trap",    0x8900, 0xff00, PDP11_OPCODE_IMM8,      PDP11_BASIC },
+};
+
+const int pdp11_num_opcodes = sizeof pdp11_opcodes / sizeof pdp11_opcodes[0];
+const int pdp11_num_aliases = sizeof pdp11_aliases / sizeof pdp11_aliases[0];
index 2beea2a76114531c73320237f4a21fcc38d1f02f..766319deacbae3cb7328765cc383d0fea75b8176 100644 (file)
@@ -69,6 +69,8 @@ mips16-opc.c
 mips-dis.c
 mips-opc.c
 ns32k-dis.c
+pdp11-dis.c
+pdp11-opc.c
 pj-dis.c
 pj-opc.c
 ppc-dis.c
index 944647a60926fc16d9198c5a788d3312f64779b9..f7de22b6dc7206e32fd50217aace8b2a72039e8c 100644 (file)
@@ -6,7 +6,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
-"POT-Creation-Date: 2001-02-09 16:04-0800\n"
+"POT-Creation-Date: 2001-02-18 14:44-0800\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -186,7 +186,7 @@ msgstr ""
 msgid "%02x\t\t*unknown*"
 msgstr ""
 
-#: i386-dis.c:2741
+#: i386-dis.c:2742
 msgid "<internal disassembler error>"
 msgstr ""