From e135f41bc2c2080a18ec4458a05757e1dc824876 Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Sun, 18 Feb 2001 23:33:11 +0000 Subject: [PATCH] Add PDP-11 support --- bfd/ChangeLog | 21 + bfd/Makefile.am | 8 + bfd/Makefile.in | 8 + bfd/aout-target.h | 2 +- bfd/archures.c | 3 + bfd/bfd-in2.h | 5 + bfd/config.bfd | 6 + bfd/configure | 25 +- bfd/configure.in | 1 + bfd/cpu-pdp11.c | 39 + bfd/libaout.h | 19 + bfd/libbfd.h | 2 + bfd/pdp11.c | 5022 ++++++++++++++++++++ bfd/po/POTFILES.in | 2 + bfd/po/bfd.pot | 19 +- bfd/reloc.c | 7 + bfd/targets.c | 2 + binutils/NEWS | 2 + binutils/po/binutils.pot | 610 +-- binutils/testsuite/binutils-all/readelf.wi | 2 +- gas/ChangeLog | 11 + gas/Makefile.am | 15 +- gas/Makefile.in | 18 +- gas/config/tc-pdp11.c | 1618 +++++++ gas/config/tc-pdp11.h | 33 + gas/configure | 475 +- gas/configure.in | 6 +- gas/doc/Makefile.am | 1 + gas/doc/Makefile.in | 1 + gas/doc/all.texi | 1 + gas/doc/as.texinfo | 41 + gas/doc/c-pdp11.texi | 354 ++ gas/po/POTFILES.in | 2 + gas/po/gas.pot | 706 +-- gprof/po/gprof.pot | 24 +- include/ChangeLog | 4 + include/dis-asm.h | 1 + include/opcode/ChangeLog | 12 +- include/opcode/pdp11.h | 78 + ld/ChangeLog | 6 + ld/Makefile.am | 4 + ld/Makefile.in | 4 + ld/configure.tgt | 1 + ld/emulparams/pdp11.sh | 5 + ld/po/ld.pot | 16 +- opcodes/ChangeLog | 8 + opcodes/Makefile.am | 8 +- opcodes/Makefile.in | 10 +- opcodes/configure | 1 + opcodes/configure.in | 1 + opcodes/disassemble.c | 6 + opcodes/pdp11-dis.c | 323 ++ opcodes/pdp11-opc.c | 245 + opcodes/po/POTFILES.in | 2 + opcodes/po/opcodes.pot | 4 +- 55 files changed, 8912 insertions(+), 938 deletions(-) create mode 100644 bfd/cpu-pdp11.c create mode 100644 bfd/pdp11.c create mode 100644 gas/config/tc-pdp11.c create mode 100644 gas/config/tc-pdp11.h create mode 100644 gas/doc/c-pdp11.texi create mode 100644 include/opcode/pdp11.h create mode 100644 ld/emulparams/pdp11.sh create mode 100644 opcodes/pdp11-dis.c create mode 100644 opcodes/pdp11-opc.c diff --git a/bfd/ChangeLog b/bfd/ChangeLog index ec272d347c..018d7e8740 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,24 @@ +2001-02-18 lars brinkhoff + + * 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 * irix-core.c (irix_core_core_file_p): Set the architecture (GDB diff --git a/bfd/Makefile.am b/bfd/Makefile.am index 7183954497..9446bc3e2c 100644 --- a/bfd/Makefile.am +++ b/bfd/Makefile.am @@ -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 \ diff --git a/bfd/Makefile.in b/bfd/Makefile.in index 90c79aa135..37bf089d91 100644 --- a/bfd/Makefile.in +++ b/bfd/Makefile.in @@ -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 \ diff --git a/bfd/aout-target.h b/bfd/aout-target.h index 1902cdfa55..a27c11be2d 100644 --- a/bfd/aout-target.h +++ b/bfd/aout-target.h @@ -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; diff --git a/bfd/archures.c b/bfd/archures.c index b15de5227f..7ca1c06926 100644 --- a/bfd/archures.c +++ b/bfd/archures.c @@ -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, diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h index db4576d99d..46240ec1b5 100644 --- a/bfd/bfd-in2.h +++ b/bfd/bfd-in2.h @@ -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, diff --git a/bfd/config.bfd b/bfd/config.bfd index f45e839253..b7e1376c21 100644 --- a/bfd/config.bfd +++ b/bfd/config.bfd @@ -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" diff --git a/bfd/configure b/bfd/configure index 1695981527..4f6ddb3178 100755 --- a/bfd/configure +++ b/bfd/configure @@ -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 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 <&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 <&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 <&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 diff --git a/bfd/configure.in b/bfd/configure.in index 3ced576157..118a7067ed 100644 --- a/bfd/configure.in +++ b/bfd/configure.in @@ -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 index 0000000000..6d8971cb46 --- /dev/null +++ b/bfd/cpu-pdp11.c @@ -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, + }; + diff --git a/bfd/libaout.h b/bfd/libaout.h index 1682428cb1..818b10c95e 100644 --- a/bfd/libaout.h +++ b/bfd/libaout.h @@ -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 diff --git a/bfd/libbfd.h b/bfd/libbfd.h index 7fee07940d..4ed1e76e67 100644 --- a/bfd/libbfd.h +++ b/bfd/libbfd.h @@ -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 index 0000000000..4f7e4609a8 --- /dev/null +++ b/bfd/pdp11.c @@ -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 + <>, <>, 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 "<>") 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 /* For strchr and friends */ +#include +#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 <> for a particular + architecture and machine, or <> 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; +} + +/* 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; +} + +/* 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; +} + +/* 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); +} + +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; +} + + +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); +} + + +/* 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) && + ) + 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; +} + + +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; +} + +/* 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; +} + +/* 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); +} diff --git a/bfd/po/POTFILES.in b/bfd/po/POTFILES.in index 1d2231582d..a0d42e6ac2 100644 --- a/bfd/po/POTFILES.in +++ b/bfd/po/POTFILES.in @@ -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 diff --git a/bfd/po/bfd.pot b/bfd/po/bfd.pot index 8f39e07413..8965d05b86 100644 --- a/bfd/po/bfd.pot +++ b/bfd/po/bfd.pot @@ -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 \n" "Language-Team: LANGUAGE \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 "" diff --git a/bfd/reloc.c b/bfd/reloc.c index 9d4516302d..07cf691f58 100644 --- a/bfd/reloc.c +++ b/bfd/reloc.c @@ -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 diff --git a/bfd/targets.c b/bfd/targets.c index 70b262db74..a712efdbdb 100644 --- a/bfd/targets.c +++ b/bfd/targets.c @@ -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, diff --git a/binutils/NEWS b/binutils/NEWS index 62f858f59b..12369e90a7 100644 --- a/binutils/NEWS +++ b/binutils/NEWS @@ -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. diff --git a/binutils/po/binutils.pot b/binutils/po/binutils.pot index 7508823d0b..d1cc8be1d8 100644 --- a/binutils/po/binutils.pot +++ b/binutils/po/binutils.pot @@ -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 \n" "Language-Team: LANGUAGE \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 "" 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 ": %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 ": %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 or --hex-dump=\n" msgstr "" -#: readelf.c:1963 +#: readelf.c:1966 msgid " Dump the contents of section \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 or --instruction-dump=\n" msgstr "" -#: readelf.c:1968 +#: readelf.c:1971 msgid "" " Disassemble the contents of section \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 "" 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 ": %d" msgstr "" -#: readelf.c:4625 readelf.c:4670 +#: readelf.c:4627 readelf.c:4672 #, c-format msgid ": %d" msgstr "" -#: readelf.c:4627 readelf.c:4673 +#: readelf.c:4629 readelf.c:4675 #, c-format msgid ": %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" diff --git a/binutils/testsuite/binutils-all/readelf.wi b/binutils/testsuite/binutils-all/readelf.wi index 51668a7229..d76e649e22 100644 --- a/binutils/testsuite/binutils-all/readelf.wi +++ b/binutils/testsuite/binutils-all/readelf.wi @@ -1,6 +1,6 @@ The section .debug_info contains: - Compilation Unit: + Compilation Unit @ .*: Length: .* Version: 2 Abbrev Offset: 0 diff --git a/gas/ChangeLog b/gas/ChangeLog index d30ad8ab0a..deb17cb0a1 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,14 @@ +2001-02-18 lars brinkhoff + + * 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 * gas/cgen.c (gas_cgen_md_apply_fix3): Support BFD_RELOC_64. diff --git a/gas/Makefile.am b/gas/Makefile.am index f6702b2ae6..84b4317a1a 100644 --- a/gas/Makefile.am +++ b/gas/Makefile.am @@ -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 \ diff --git a/gas/Makefile.in b/gas/Makefile.in index 493fb0ac53..fd9b1e93ac 100644 --- a/gas/Makefile.in +++ b/gas/Makefile.in @@ -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 index 0000000000..6935bcea9b --- /dev/null +++ b/gas/config/tc-pdp11.c @@ -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; + } +} + +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 index 0000000000..eb2e3603fa --- /dev/null +++ b/gas/config/tc-pdp11.h @@ -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 */ diff --git a/gas/configure b/gas/configure index a4c792b7c8..85504cc44e 100755 --- a/gas/configure +++ b/gas/configure @@ -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 <&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 <&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 <&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 <&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 < 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 < 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 < 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 <&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 <&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 < #include @@ -3640,7 +3653,7 @@ else #include 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 @@ -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 @@ -3696,7 +3709,7 @@ if test "$cross_compiling" = yes; then : else cat > conftest.$ac_ext < #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 <&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 <&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 < #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 < #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 < 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 <&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 <&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 <&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 <&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 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 <&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 <&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 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 <&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 <&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 < 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 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 < 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 <&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 <&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 <&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 <&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 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 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 < 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 <&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 <&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 <&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 <&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 <&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 <&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 <&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 <&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 <&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 <&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 < #include @@ -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 <&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 <&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 <&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 <&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 <&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 <&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 diff --git a/gas/configure.in b/gas/configure.in index 73305cbd71..ed37ed3d7b 100644 --- a/gas/configure.in +++ b/gas/configure.in @@ -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 diff --git a/gas/doc/Makefile.am b/gas/doc/Makefile.am index 60761a4e0b..95b02b79d9 100644 --- a/gas/doc/Makefile.am +++ b/gas/doc/Makefile.am @@ -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 \ diff --git a/gas/doc/Makefile.in b/gas/doc/Makefile.in index 5f9b258ca1..f328d71af1 100644 --- a/gas/doc/Makefile.in +++ b/gas/doc/Makefile.in @@ -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 \ diff --git a/gas/doc/all.texi b/gas/doc/all.texi index 22742b45ee..26658c6fd1 100644 --- a/gas/doc/all.texi +++ b/gas/doc/all.texi @@ -42,6 +42,7 @@ @set M680X0 @set MCORE @set MIPS +@set PDP11 @set PJ @set SH @set SPARC diff --git a/gas/doc/as.texinfo b/gas/doc/as.texinfo index fb80ca5f7e..dc377b1363 100644 --- a/gas/doc/as.texinfo +++ b/gas/doc/as.texinfo @@ -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 index 0000000000..4ddd9e39aa --- /dev/null +++ b/gas/doc/c-pdp11.texi @@ -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. diff --git a/gas/po/POTFILES.in b/gas/po/POTFILES.in index d3d8df9ecc..11518edd20 100644 --- a/gas/po/POTFILES.in +++ b/gas/po/POTFILES.in @@ -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 diff --git a/gas/po/gas.pot b/gas/po/gas.pot index 47a8e96436..ff99b2502e 100644 --- a/gas/po/gas.pot +++ b/gas/po/gas.pot @@ -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 \n" "Language-Team: LANGUAGE \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 "" 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][] 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 "" diff --git a/gprof/po/gprof.pot b/gprof/po/gprof.pot index 06b13ebefb..e159d2a0a9 100644 --- a/gprof/po/gprof.pot +++ b/gprof/po/gprof.pot @@ -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 \n" "Language-Team: LANGUAGE \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 "" 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 "" diff --git a/include/ChangeLog b/include/ChangeLog index fa7af4b5c7..11eacd9b28 100644 --- a/include/ChangeLog +++ b/include/ChangeLog @@ -1,3 +1,7 @@ +2001-02-18 lars brinkhoff + + * dis-asm.h: Add PDP-11 target. + 2001-02-09 Martin Schwidefsky * dis-asm.h: Add linux target for S/390. diff --git a/include/dis-asm.h b/include/dis-asm.h index 6e3e3b5cd6..1cc3fce880 100644 --- a/include/dis-asm.h +++ b/include/dis-asm.h @@ -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*)); diff --git a/include/opcode/ChangeLog b/include/opcode/ChangeLog index 66c3875d74..b4e688844f 100644 --- a/include/opcode/ChangeLog +++ b/include/opcode/ChangeLog @@ -1,4 +1,8 @@ -Mon Feb 12 17:40:54 CET 2001 Jan Hubicka +2001-02-18 lars brinkhoff + + * pdp11.h: New file. + +2001-02-12 Jan Hubicka * 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 (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 +2001-01-13 Jan Hubicka * i386.h (i386_optab): Fix pusha and ret templates. @@ -676,7 +680,7 @@ Mon Feb 1 21:09:14 1999 Catherine Moore * 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 * tic30.h: New file. -Thu Jan 22 17:54:56 1998 Nick Clifton +Jan 22 17:54:56 1998 Nick Clifton * 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 index 0000000000..891b74f9ad --- /dev/null +++ b/include/opcode/pdp11.h @@ -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 */ diff --git a/ld/ChangeLog b/ld/ChangeLog index eeb19901ea..f03253c5df 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,9 @@ +2001-02-18 lars brinkhoff + + * Makefile.am: Add PDP-11 target. + * configure.tgt: Likewise. + * emulparams/pdp11.sh: New file. + 2001-02-17 David O'Brien * configure.host: Add a generic FreeBSD configuration entry such that diff --git a/ld/Makefile.am b/ld/Makefile.am index daa9761be7..a66cefba8e 100644 --- a/ld/Makefile.am +++ b/ld/Makefile.am @@ -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)" diff --git a/ld/Makefile.in b/ld/Makefile.in index 64a910fd8a..2d25ac99c7 100644 --- a/ld/Makefile.in +++ b/ld/Makefile.in @@ -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)" diff --git a/ld/configure.tgt b/ld/configure.tgt index 92b735f110..ea96ab8faa 100644 --- a/ld/configure.tgt +++ b/ld/configure.tgt @@ -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 index 0000000000..aaf955afc8 --- /dev/null +++ b/ld/emulparams/pdp11.sh @@ -0,0 +1,5 @@ +SCRIPT_NAME=aout +OUTPUT_FORMAT="a.out-pdp11" +TEXT_START_ADDR=0 +TARGET_PAGE_SIZE=256 +ARCH=pdp11 diff --git a/ld/po/ld.pot b/ld/po/ld.pot index bdd5798e2e..7d84a72aab 100644 --- a/ld/po/ld.pot +++ b/ld/po/ld.pot @@ -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 \n" "Language-Team: LANGUAGE \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 "" diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog index 1dc9b40d76..3a15815ef0 100644 --- a/opcodes/ChangeLog +++ b/opcodes/ChangeLog @@ -1,3 +1,11 @@ +2001-02-18 lars brinkhoff + + * 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 * ia64-ic.tbl: Update from Intel. Add setf to fr-writers. diff --git a/opcodes/Makefile.am b/opcodes/Makefile.am index 664644eb49..42ff0c3aba 100644 --- a/opcodes/Makefile.am +++ b/opcodes/Makefile.am @@ -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 \ diff --git a/opcodes/Makefile.in b/opcodes/Makefile.in index 3d1a759efa..36c43e45bc 100644 --- a/opcodes/Makefile.in +++ b/opcodes/Makefile.in @@ -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 \ diff --git a/opcodes/configure b/opcodes/configure index 7d63895bf2..6301ad653f 100755 --- a/opcodes/configure +++ b/opcodes/configure @@ -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) ;; diff --git a/opcodes/configure.in b/opcodes/configure.in index 34b947ae61..f8030d91c3 100644 --- a/opcodes/configure.in +++ b/opcodes/configure.in @@ -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) ;; diff --git a/opcodes/disassemble.c b/opcodes/disassemble.c index ce3b6ad89d..b5a1fcaed9 100644 --- a/opcodes/disassemble.c +++ b/opcodes/disassemble.c @@ -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 index 0000000000..e13c7aabdc --- /dev/null +++ b/opcodes/pdp11-dis.c @@ -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, ""); + return -1; + } +#undef OP + } + + return memaddr - start_memaddr; +} diff --git a/opcodes/pdp11-opc.c b/opcodes/pdp11-opc.c new file mode 100644 index 0000000000..3517deecc4 --- /dev/null +++ b/opcodes/pdp11-opc.c @@ -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]; diff --git a/opcodes/po/POTFILES.in b/opcodes/po/POTFILES.in index 2beea2a761..766319deac 100644 --- a/opcodes/po/POTFILES.in +++ b/opcodes/po/POTFILES.in @@ -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 diff --git a/opcodes/po/opcodes.pot b/opcodes/po/opcodes.pot index 944647a609..f7de22b6dc 100644 --- a/opcodes/po/opcodes.pot +++ b/opcodes/po/opcodes.pot @@ -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 \n" "Language-Team: LANGUAGE \n" @@ -186,7 +186,7 @@ msgstr "" msgid "%02x\t\t*unknown*" msgstr "" -#: i386-dis.c:2741 +#: i386-dis.c:2742 msgid "" msgstr "" -- 2.34.1